From d48136cb1a992adc631325ddab1bf4cf879691c8 Mon Sep 17 00:00:00 2001 From: davidscherer Date: Tue, 30 May 2023 18:57:16 +0200 Subject: [PATCH] added testbench for ams slave --- BMS_Testbench/BMS_Software_V1/.cproject | 329 + BMS_Testbench/BMS_Software_V1/.mxproject | 25 + BMS_Testbench/BMS_Software_V1/.project | 32 + .../com.st.stm32cube.ide.mcu.sfrview.prefs | 2 + .../.settings/language.settings.xml | 47 + .../.settings/stm32cubeide.project.prefs | 4 + .../.vscode/c_cpp_properties.json | 20 + .../BMS_Software_V1/.vscode/launch.json | 34 + .../BMS_Software_V1/.vscode/settings.json | 4 + .../BMS_Software_V1/.vscode/tasks.json | 50 + .../BMS_Software_V1/BMS_Software Debug.launch | 78 + .../BMS_Software_V1/BMS_Software.ioc | 199 + .../Core/Inc/ADBMS_Abstraction.h | 82 + .../Core/Inc/ADBMS_CMD_MAKROS.h | 191 + .../Core/Inc/ADBMS_LL_Driver.h | 44 + .../BMS_Software_V1/Core/Inc/AMS_CAN.h | 49 + .../BMS_Software_V1/Core/Inc/AMS_HighLevel.h | 46 + .../BMS_Software_V1/Core/Inc/Testbench.h | 32 + .../BMS_Software_V1/Core/Inc/common_defs.h | 13 + BMS_Testbench/BMS_Software_V1/Core/Inc/main.h | 83 + .../Core/Inc/stm32f3xx_hal_conf.h | 359 + .../BMS_Software_V1/Core/Inc/stm32f3xx_it.h | 67 + .../Core/Src/ADBMS_Abstraction.c | 422 + .../Core/Src/ADBMS_LL_Driver.c | 230 + .../BMS_Software_V1/Core/Src/AMS_CAN.c | 193 + .../BMS_Software_V1/Core/Src/AMS_HighLevel.c | 304 + .../BMS_Software_V1/Core/Src/Testbench.c | 149 + BMS_Testbench/BMS_Software_V1/Core/Src/main.c | 479 + .../Core/Src/stm32f3xx_hal_msp.c | 337 + .../BMS_Software_V1/Core/Src/stm32f3xx_it.c | 217 + .../BMS_Software_V1/Core/Src/syscalls.c | 176 + .../BMS_Software_V1/Core/Src/sysmem.c | 79 + .../Core/Src/system_stm32f3xx.c | 291 + .../Core/Startup/startup_stm32f302cctx.s | 441 + .../BMS_Software_V1/Debug/BMS_Software.elf | Bin 0 -> 1084440 bytes .../BMS_Software_V1/Debug/BMS_Software.list | 16215 +++++++ .../BMS_Software_V1/Debug/BMS_Software.map | 4236 ++ .../Debug/Core/Src/ADBMS_Abstraction.d | 65 + .../Debug/Core/Src/ADBMS_Abstraction.o | Bin 0 -> 911232 bytes .../Debug/Core/Src/ADBMS_Abstraction.su | 26 + .../Debug/Core/Src/ADBMS_LL_Driver.d | 62 + .../Debug/Core/Src/ADBMS_LL_Driver.o | Bin 0 -> 901280 bytes .../Debug/Core/Src/ADBMS_LL_Driver.su | 12 + .../BMS_Software_V1/Debug/Core/Src/AMS_CAN.d | 74 + .../BMS_Software_V1/Debug/Core/Src/AMS_CAN.o | Bin 0 -> 902868 bytes .../BMS_Software_V1/Debug/Core/Src/AMS_CAN.su | 5 + .../Debug/Core/Src/AMS_HighLevel.d | 67 + .../Debug/Core/Src/AMS_HighLevel.o | Bin 0 -> 908092 bytes .../Debug/Core/Src/AMS_HighLevel.su | 11 + .../Debug/Core/Src/Testbench.d | 75 + .../Debug/Core/Src/Testbench.o | Bin 0 -> 903148 bytes .../Debug/Core/Src/Testbench.su | 5 + .../Debug/Core/Src/UART_Console.d | 73 + .../BMS_Software_V1/Debug/Core/Src/main.d | 76 + .../BMS_Software_V1/Debug/Core/Src/main.o | Bin 0 -> 912960 bytes .../BMS_Software_V1/Debug/Core/Src/main.su | 12 + .../Debug/Core/Src/stm32f3xx_hal_msp.d | 60 + .../Debug/Core/Src/stm32f3xx_hal_msp.o | Bin 0 -> 902700 bytes .../Debug/Core/Src/stm32f3xx_hal_msp.su | 7 + .../Debug/Core/Src/stm32f3xx_it.d | 62 + .../Debug/Core/Src/stm32f3xx_it.o | Bin 0 -> 893384 bytes .../Debug/Core/Src/stm32f3xx_it.su | 10 + .../BMS_Software_V1/Debug/Core/Src/subdir.mk | 57 + .../BMS_Software_V1/Debug/Core/Src/syscalls.d | 1 + .../BMS_Software_V1/Debug/Core/Src/syscalls.o | Bin 0 -> 76920 bytes .../Debug/Core/Src/syscalls.su | 18 + .../BMS_Software_V1/Debug/Core/Src/sysmem.d | 1 + .../BMS_Software_V1/Debug/Core/Src/sysmem.o | Bin 0 -> 46592 bytes .../BMS_Software_V1/Debug/Core/Src/sysmem.su | 1 + .../Debug/Core/Src/system_stm32f3xx.d | 59 + .../Debug/Core/Src/system_stm32f3xx.o | Bin 0 -> 889904 bytes .../Debug/Core/Src/system_stm32f3xx.su | 2 + .../Core/Startup/startup_stm32f302cctx.d | 2 + .../Core/Startup/startup_stm32f302cctx.o | Bin 0 -> 6156 bytes .../Debug/Core/Startup/subdir.mk | 27 + .../STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.d | 60 + .../STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o | Bin 0 -> 901500 bytes .../STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.su | 25 + .../Src/stm32f3xx_hal_can.d | 60 + .../Src/stm32f3xx_hal_can.o | Bin 0 -> 911828 bytes .../Src/stm32f3xx_hal_can.su | 36 + .../Src/stm32f3xx_hal_cortex.d | 60 + .../Src/stm32f3xx_hal_cortex.o | Bin 0 -> 906760 bytes .../Src/stm32f3xx_hal_cortex.su | 32 + .../Src/stm32f3xx_hal_dma.d | 60 + .../Src/stm32f3xx_hal_dma.o | Bin 0 -> 898404 bytes .../Src/stm32f3xx_hal_dma.su | 14 + .../Src/stm32f3xx_hal_exti.d | 60 + .../Src/stm32f3xx_hal_exti.o | Bin 0 -> 894772 bytes .../Src/stm32f3xx_hal_exti.su | 9 + .../Src/stm32f3xx_hal_flash.d | 60 + .../Src/stm32f3xx_hal_flash.o | Bin 0 -> 896588 bytes .../Src/stm32f3xx_hal_flash.su | 14 + .../Src/stm32f3xx_hal_flash_ex.d | 60 + .../Src/stm32f3xx_hal_flash_ex.o | Bin 0 -> 900208 bytes .../Src/stm32f3xx_hal_flash_ex.su | 16 + .../Src/stm32f3xx_hal_gpio.d | 60 + .../Src/stm32f3xx_hal_gpio.o | Bin 0 -> 894636 bytes .../Src/stm32f3xx_hal_gpio.su | 8 + .../Src/stm32f3xx_hal_i2c.d | 60 + .../Src/stm32f3xx_hal_i2c.o | Bin 0 -> 960584 bytes .../Src/stm32f3xx_hal_i2c.su | 79 + .../Src/stm32f3xx_hal_i2c_ex.d | 60 + .../Src/stm32f3xx_hal_i2c_ex.o | Bin 0 -> 894732 bytes .../Src/stm32f3xx_hal_i2c_ex.su | 6 + .../Src/stm32f3xx_hal_pwr.d | 60 + .../Src/stm32f3xx_hal_pwr.o | Bin 0 -> 893132 bytes .../Src/stm32f3xx_hal_pwr.su | 12 + .../Src/stm32f3xx_hal_pwr_ex.d | 60 + .../Src/stm32f3xx_hal_pwr_ex.o | Bin 0 -> 889908 bytes .../Src/stm32f3xx_hal_pwr_ex.su | 5 + .../Src/stm32f3xx_hal_rcc.d | 60 + .../Src/stm32f3xx_hal_rcc.o | Bin 0 -> 910656 bytes .../Src/stm32f3xx_hal_rcc.su | 14 + .../Src/stm32f3xx_hal_rcc_ex.d | 60 + .../Src/stm32f3xx_hal_rcc_ex.o | Bin 0 -> 896032 bytes .../Src/stm32f3xx_hal_rcc_ex.su | 4 + .../Src/stm32f3xx_hal_spi.d | 60 + .../Src/stm32f3xx_hal_spi.o | Bin 0 -> 933568 bytes .../Src/stm32f3xx_hal_spi.su | 56 + .../Src/stm32f3xx_hal_spi_ex.d | 60 + .../Src/stm32f3xx_hal_spi_ex.o | Bin 0 -> 890816 bytes .../Src/stm32f3xx_hal_spi_ex.su | 1 + .../Src/stm32f3xx_hal_tim.d | 60 + .../Src/stm32f3xx_hal_tim.o | Bin 0 -> 886436 bytes .../Src/stm32f3xx_hal_tim.su | 0 .../Src/stm32f3xx_hal_tim_ex.d | 60 + .../Src/stm32f3xx_hal_tim_ex.o | Bin 0 -> 886444 bytes .../Src/stm32f3xx_hal_tim_ex.su | 0 .../STM32F3xx_HAL_Driver/Src/subdir.mk | 78 + BMS_Testbench/BMS_Software_V1/Debug/makefile | 94 + .../BMS_Software_V1/Debug/objects.list | 30 + .../BMS_Software_V1/Debug/objects.mk | 9 + .../BMS_Software_V1/Debug/sources.mk | 27 + .../Device/ST/STM32F3xx/Include/stm32f302xc.h | 12735 +++++ .../Device/ST/STM32F3xx/Include/stm32f3xx.h | 286 + .../ST/STM32F3xx/Include/system_stm32f3xx.h | 106 + .../CMSIS/Device/ST/STM32F3xx/License.md | 83 + .../Drivers/CMSIS/Include/cmsis_armcc.h | 865 + .../Drivers/CMSIS/Include/cmsis_armclang.h | 1869 + .../Drivers/CMSIS/Include/cmsis_compiler.h | 266 + .../Drivers/CMSIS/Include/cmsis_gcc.h | 2085 + .../Drivers/CMSIS/Include/cmsis_iccarm.h | 935 + .../Drivers/CMSIS/Include/cmsis_version.h | 39 + .../Drivers/CMSIS/Include/core_armv8mbl.h | 1918 + .../Drivers/CMSIS/Include/core_armv8mml.h | 2927 ++ .../Drivers/CMSIS/Include/core_cm0.h | 949 + .../Drivers/CMSIS/Include/core_cm0plus.h | 1083 + .../Drivers/CMSIS/Include/core_cm1.h | 976 + .../Drivers/CMSIS/Include/core_cm23.h | 1993 + .../Drivers/CMSIS/Include/core_cm3.h | 1941 + .../Drivers/CMSIS/Include/core_cm33.h | 3002 ++ .../Drivers/CMSIS/Include/core_cm4.h | 2129 + .../Drivers/CMSIS/Include/core_cm7.h | 2671 ++ .../Drivers/CMSIS/Include/core_sc000.h | 1022 + .../Drivers/CMSIS/Include/core_sc300.h | 1915 + .../Drivers/CMSIS/Include/mpu_armv7.h | 270 + .../Drivers/CMSIS/Include/mpu_armv8.h | 333 + .../Drivers/CMSIS/Include/tz_context.h | 70 + .../BMS_Software_V1/Drivers/CMSIS/LICENSE.txt | 201 + .../Inc/Legacy/stm32_hal_legacy.h | 3850 ++ .../STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h | 945 + .../Inc/stm32f3xx_hal_can.h | 842 + .../Inc/stm32f3xx_hal_cortex.h | 426 + .../Inc/stm32f3xx_hal_def.h | 177 + .../Inc/stm32f3xx_hal_dma.h | 454 + .../Inc/stm32f3xx_hal_dma_ex.h | 274 + .../Inc/stm32f3xx_hal_exti.h | 404 + .../Inc/stm32f3xx_hal_flash.h | 381 + .../Inc/stm32f3xx_hal_flash_ex.h | 475 + .../Inc/stm32f3xx_hal_gpio.h | 325 + .../Inc/stm32f3xx_hal_gpio_ex.h | 1522 + .../Inc/stm32f3xx_hal_i2c.h | 838 + .../Inc/stm32f3xx_hal_i2c_ex.h | 180 + .../Inc/stm32f3xx_hal_pwr.h | 219 + .../Inc/stm32f3xx_hal_pwr_ex.h | 322 + .../Inc/stm32f3xx_hal_rcc.h | 1740 + .../Inc/stm32f3xx_hal_rcc_ex.h | 3827 ++ .../Inc/stm32f3xx_hal_spi.h | 852 + .../Inc/stm32f3xx_hal_spi_ex.h | 75 + .../Inc/stm32f3xx_hal_tim.h | 2533 + .../Inc/stm32f3xx_hal_tim_ex.h | 343 + .../Inc/stm32f3xx_ll_bus.h | 1063 + .../Inc/stm32f3xx_ll_cortex.h | 640 + .../Inc/stm32f3xx_ll_dma.h | 1996 + .../Inc/stm32f3xx_ll_exti.h | 1383 + .../Inc/stm32f3xx_ll_gpio.h | 980 + .../Inc/stm32f3xx_ll_i2c.h | 2275 + .../Inc/stm32f3xx_ll_pwr.h | 554 + .../Inc/stm32f3xx_ll_rcc.h | 2842 ++ .../Inc/stm32f3xx_ll_system.h | 1724 + .../Inc/stm32f3xx_ll_utils.h | 282 + .../Drivers/STM32F3xx_HAL_Driver/License.md | 3 + .../STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c | 531 + .../Src/stm32f3xx_hal_can.c | 2420 + .../Src/stm32f3xx_hal_cortex.c | 513 + .../Src/stm32f3xx_hal_dma.c | 900 + .../Src/stm32f3xx_hal_exti.c | 621 + .../Src/stm32f3xx_hal_flash.c | 695 + .../Src/stm32f3xx_hal_flash_ex.c | 983 + .../Src/stm32f3xx_hal_gpio.c | 542 + .../Src/stm32f3xx_hal_i2c.c | 6794 +++ .../Src/stm32f3xx_hal_i2c_ex.c | 367 + .../Src/stm32f3xx_hal_pwr.c | 461 + .../Src/stm32f3xx_hal_pwr_ex.c | 272 + .../Src/stm32f3xx_hal_rcc.c | 1224 + .../Src/stm32f3xx_hal_rcc_ex.c | 1584 + .../Src/stm32f3xx_hal_spi.c | 4458 ++ .../Src/stm32f3xx_hal_spi_ex.c | 115 + .../Src/stm32f3xx_hal_tim.c | 7942 +++ .../Src/stm32f3xx_hal_tim_ex.c | 2554 + BMS_Testbench/BMS_Software_V1/Makefile | 193 + .../STM32-for-VSCode.config.yaml | 107 + BMS_Testbench/BMS_Software_V1/STM32F102xx.svd | 9041 ++++ BMS_Testbench/BMS_Software_V1/STM32F302.svd | 39943 ++++++++++++++++ .../BMS_Software_V1/STM32F302CCTX_FLASH.ld | 185 + .../BMS_Software_V1/STM32F302CCTx_FLASH.ld | 189 + BMS_Testbench/BMS_Software_V1/STM32Make.make | 265 + .../BMS_Software_V1/ams-slave-23 Debug.launch | 77 + .../BMS_Software_V1/ams-slave-23.ioc | 199 + .../BMS_Software_V1/build/ADBMS_Abstraction.d | 63 + .../build/ADBMS_Abstraction.lst | 2389 + .../BMS_Software_V1/build/ADBMS_Abstraction.o | Bin 0 -> 24584 bytes .../BMS_Software_V1/build/ADBMS_LL_Driver.d | 60 + .../BMS_Software_V1/build/ADBMS_LL_Driver.lst | 1600 + .../BMS_Software_V1/build/ADBMS_LL_Driver.o | Bin 0 -> 19084 bytes BMS_Testbench/BMS_Software_V1/build/AMS_CAN.d | 71 + .../BMS_Software_V1/build/AMS_CAN.lst | 942 + BMS_Testbench/BMS_Software_V1/build/AMS_CAN.o | Bin 0 -> 14036 bytes .../BMS_Software_V1/build/AMS_HighLevel.d | 64 + .../BMS_Software_V1/build/AMS_HighLevel.lst | 1530 + .../BMS_Software_V1/build/AMS_HighLevel.o | Bin 0 -> 19816 bytes .../BMS_Software_V1/build/Testbench.d | 72 + .../BMS_Software_V1/build/Testbench.lst | 1048 + .../BMS_Software_V1/build/Testbench.o | Bin 0 -> 14460 bytes .../BMS_Software_V1/build/ams-slave-23.bin | Bin 0 -> 15684 bytes .../BMS_Software_V1/build/ams-slave-23.elf | Bin 0 -> 357412 bytes .../BMS_Software_V1/build/ams-slave-23.hex | 986 + .../BMS_Software_V1/build/ams-slave-23.map | 2940 ++ BMS_Testbench/BMS_Software_V1/build/main.d | 73 + BMS_Testbench/BMS_Software_V1/build/main.lst | 2091 + BMS_Testbench/BMS_Software_V1/build/main.o | Bin 0 -> 25076 bytes .../build/startup_stm32f302xc.d | 1 + .../build/startup_stm32f302xc.o | Bin 0 -> 6292 bytes .../BMS_Software_V1/build/stm32f3xx_hal.d | 57 + .../BMS_Software_V1/build/stm32f3xx_hal.lst | 1527 + .../BMS_Software_V1/build/stm32f3xx_hal.o | Bin 0 -> 16968 bytes .../BMS_Software_V1/build/stm32f3xx_hal_can.d | 58 + .../build/stm32f3xx_hal_can.lst | 7264 +++ .../BMS_Software_V1/build/stm32f3xx_hal_can.o | Bin 0 -> 30700 bytes .../build/stm32f3xx_hal_cortex.d | 58 + .../build/stm32f3xx_hal_cortex.lst | 5049 ++ .../build/stm32f3xx_hal_cortex.o | Bin 0 -> 21976 bytes .../BMS_Software_V1/build/stm32f3xx_hal_dma.d | 58 + .../build/stm32f3xx_hal_dma.lst | 3047 ++ .../BMS_Software_V1/build/stm32f3xx_hal_dma.o | Bin 0 -> 16136 bytes .../build/stm32f3xx_hal_exti.d | 58 + .../build/stm32f3xx_hal_exti.lst | 1819 + .../build/stm32f3xx_hal_exti.o | Bin 0 -> 13340 bytes .../build/stm32f3xx_hal_flash.d | 58 + .../build/stm32f3xx_hal_flash.lst | 2165 + .../build/stm32f3xx_hal_flash.o | Bin 0 -> 13736 bytes .../build/stm32f3xx_hal_flash_ex.d | 58 + .../build/stm32f3xx_hal_flash_ex.lst | 4277 ++ .../build/stm32f3xx_hal_flash_ex.o | Bin 0 -> 19112 bytes .../build/stm32f3xx_hal_gpio.d | 58 + .../build/stm32f3xx_hal_gpio.lst | 1676 + .../build/stm32f3xx_hal_gpio.o | Bin 0 -> 10964 bytes .../BMS_Software_V1/build/stm32f3xx_hal_i2c.d | 58 + .../build/stm32f3xx_hal_i2c.lst | 25237 ++++++++++ .../BMS_Software_V1/build/stm32f3xx_hal_i2c.o | Bin 0 -> 101776 bytes .../build/stm32f3xx_hal_i2c_ex.d | 58 + .../build/stm32f3xx_hal_i2c_ex.lst | 916 + .../build/stm32f3xx_hal_i2c_ex.o | Bin 0 -> 11076 bytes .../BMS_Software_V1/build/stm32f3xx_hal_msp.d | 58 + .../build/stm32f3xx_hal_msp.lst | 1276 + .../BMS_Software_V1/build/stm32f3xx_hal_msp.o | Bin 0 -> 18888 bytes .../BMS_Software_V1/build/stm32f3xx_hal_pwr.d | 58 + .../build/stm32f3xx_hal_pwr.lst | 991 + .../BMS_Software_V1/build/stm32f3xx_hal_pwr.o | Bin 0 -> 8752 bytes .../build/stm32f3xx_hal_pwr_ex.d | 58 + .../build/stm32f3xx_hal_pwr_ex.lst | 499 + .../build/stm32f3xx_hal_pwr_ex.o | Bin 0 -> 5500 bytes .../BMS_Software_V1/build/stm32f3xx_hal_rcc.d | 58 + .../build/stm32f3xx_hal_rcc.lst | 6322 +++ .../BMS_Software_V1/build/stm32f3xx_hal_rcc.o | Bin 0 -> 28924 bytes .../build/stm32f3xx_hal_rcc_ex.d | 58 + .../build/stm32f3xx_hal_rcc_ex.lst | 4835 ++ .../build/stm32f3xx_hal_rcc_ex.o | Bin 0 -> 14460 bytes .../BMS_Software_V1/build/stm32f3xx_hal_spi.d | 58 + .../build/stm32f3xx_hal_spi.lst | 15193 ++++++ .../BMS_Software_V1/build/stm32f3xx_hal_spi.o | Bin 0 -> 60336 bytes .../build/stm32f3xx_hal_spi_ex.d | 58 + .../build/stm32f3xx_hal_spi_ex.lst | 236 + .../build/stm32f3xx_hal_spi_ex.o | Bin 0 -> 7056 bytes .../BMS_Software_V1/build/stm32f3xx_hal_tim.d | 58 + .../build/stm32f3xx_hal_tim.lst | 30 + .../BMS_Software_V1/build/stm32f3xx_hal_tim.o | Bin 0 -> 1968 bytes .../build/stm32f3xx_hal_tim_ex.d | 58 + .../build/stm32f3xx_hal_tim_ex.lst | 30 + .../build/stm32f3xx_hal_tim_ex.o | Bin 0 -> 1972 bytes .../BMS_Software_V1/build/stm32f3xx_it.d | 60 + .../BMS_Software_V1/build/stm32f3xx_it.lst | 507 + .../BMS_Software_V1/build/stm32f3xx_it.o | Bin 0 -> 8340 bytes .../BMS_Software_V1/build/syscalls.d | 1 + .../BMS_Software_V1/build/syscalls.lst | 861 + .../BMS_Software_V1/build/syscalls.o | Bin 0 -> 12744 bytes BMS_Testbench/BMS_Software_V1/build/sysmem.d | 1 + .../BMS_Software_V1/build/sysmem.lst | 230 + BMS_Testbench/BMS_Software_V1/build/sysmem.o | Bin 0 -> 4384 bytes .../BMS_Software_V1/build/system_stm32f3xx.d | 57 + .../build/system_stm32f3xx.lst | 575 + .../BMS_Software_V1/build/system_stm32f3xx.o | Bin 0 -> 6200 bytes BMS_Testbench/BMS_Software_V1/openocd.cfg | 10 + .../BMS_Software_V1/startup_stm32f302xc.s | 441 + 315 files changed, 288831 insertions(+) create mode 100644 BMS_Testbench/BMS_Software_V1/.cproject create mode 100644 BMS_Testbench/BMS_Software_V1/.mxproject create mode 100644 BMS_Testbench/BMS_Software_V1/.project create mode 100644 BMS_Testbench/BMS_Software_V1/.settings/com.st.stm32cube.ide.mcu.sfrview.prefs create mode 100644 BMS_Testbench/BMS_Software_V1/.settings/language.settings.xml create mode 100644 BMS_Testbench/BMS_Software_V1/.settings/stm32cubeide.project.prefs create mode 100644 BMS_Testbench/BMS_Software_V1/.vscode/c_cpp_properties.json create mode 100644 BMS_Testbench/BMS_Software_V1/.vscode/launch.json create mode 100644 BMS_Testbench/BMS_Software_V1/.vscode/settings.json create mode 100644 BMS_Testbench/BMS_Software_V1/.vscode/tasks.json create mode 100644 BMS_Testbench/BMS_Software_V1/BMS_Software Debug.launch create mode 100644 BMS_Testbench/BMS_Software_V1/BMS_Software.ioc create mode 100644 BMS_Testbench/BMS_Software_V1/Core/Inc/ADBMS_Abstraction.h create mode 100644 BMS_Testbench/BMS_Software_V1/Core/Inc/ADBMS_CMD_MAKROS.h create mode 100644 BMS_Testbench/BMS_Software_V1/Core/Inc/ADBMS_LL_Driver.h create mode 100644 BMS_Testbench/BMS_Software_V1/Core/Inc/AMS_CAN.h create mode 100644 BMS_Testbench/BMS_Software_V1/Core/Inc/AMS_HighLevel.h create mode 100644 BMS_Testbench/BMS_Software_V1/Core/Inc/Testbench.h create mode 100644 BMS_Testbench/BMS_Software_V1/Core/Inc/common_defs.h create mode 100644 BMS_Testbench/BMS_Software_V1/Core/Inc/main.h create mode 100644 BMS_Testbench/BMS_Software_V1/Core/Inc/stm32f3xx_hal_conf.h create mode 100644 BMS_Testbench/BMS_Software_V1/Core/Inc/stm32f3xx_it.h create mode 100644 BMS_Testbench/BMS_Software_V1/Core/Src/ADBMS_Abstraction.c create mode 100644 BMS_Testbench/BMS_Software_V1/Core/Src/ADBMS_LL_Driver.c create mode 100644 BMS_Testbench/BMS_Software_V1/Core/Src/AMS_CAN.c create mode 100644 BMS_Testbench/BMS_Software_V1/Core/Src/AMS_HighLevel.c create mode 100644 BMS_Testbench/BMS_Software_V1/Core/Src/Testbench.c create mode 100644 BMS_Testbench/BMS_Software_V1/Core/Src/main.c create mode 100644 BMS_Testbench/BMS_Software_V1/Core/Src/stm32f3xx_hal_msp.c create mode 100644 BMS_Testbench/BMS_Software_V1/Core/Src/stm32f3xx_it.c create mode 100644 BMS_Testbench/BMS_Software_V1/Core/Src/syscalls.c create mode 100644 BMS_Testbench/BMS_Software_V1/Core/Src/sysmem.c create mode 100644 BMS_Testbench/BMS_Software_V1/Core/Src/system_stm32f3xx.c create mode 100644 BMS_Testbench/BMS_Software_V1/Core/Startup/startup_stm32f302cctx.s create mode 100755 BMS_Testbench/BMS_Software_V1/Debug/BMS_Software.elf create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/BMS_Software.list create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/BMS_Software.map create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Core/Src/ADBMS_Abstraction.d create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Core/Src/ADBMS_Abstraction.o create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Core/Src/ADBMS_Abstraction.su create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Core/Src/ADBMS_LL_Driver.d create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Core/Src/ADBMS_LL_Driver.o create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Core/Src/ADBMS_LL_Driver.su create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Core/Src/AMS_CAN.d create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Core/Src/AMS_CAN.o create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Core/Src/AMS_CAN.su create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Core/Src/AMS_HighLevel.d create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Core/Src/AMS_HighLevel.o create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Core/Src/AMS_HighLevel.su create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Core/Src/Testbench.d create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Core/Src/Testbench.o create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Core/Src/Testbench.su create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Core/Src/UART_Console.d create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Core/Src/main.d create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Core/Src/main.o create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Core/Src/main.su create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Core/Src/stm32f3xx_hal_msp.d create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Core/Src/stm32f3xx_hal_msp.o create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Core/Src/stm32f3xx_hal_msp.su create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Core/Src/stm32f3xx_it.d create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Core/Src/stm32f3xx_it.o create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Core/Src/stm32f3xx_it.su create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Core/Src/subdir.mk create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Core/Src/syscalls.d create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Core/Src/syscalls.o create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Core/Src/syscalls.su create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Core/Src/sysmem.d create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Core/Src/sysmem.o create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Core/Src/sysmem.su create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Core/Src/system_stm32f3xx.d create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Core/Src/system_stm32f3xx.o create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Core/Src/system_stm32f3xx.su create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Core/Startup/startup_stm32f302cctx.d create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Core/Startup/startup_stm32f302cctx.o create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Core/Startup/subdir.mk create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.d create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.su create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.d create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.su create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.d create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.su create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.d create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.su create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.d create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.su create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.d create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.su create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.d create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.su create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.d create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.su create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.d create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.su create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.d create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.su create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.d create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.su create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.d create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.su create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.d create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.su create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.d create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.su create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.d create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.su create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.d create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.su create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.d create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.su create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.d create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.su create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/subdir.mk create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/makefile create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/objects.list create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/objects.mk create mode 100644 BMS_Testbench/BMS_Software_V1/Debug/sources.mk create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/CMSIS/Device/ST/STM32F3xx/License.md create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/CMSIS/Include/cmsis_armcc.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/CMSIS/Include/cmsis_armclang.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/CMSIS/Include/cmsis_compiler.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/CMSIS/Include/cmsis_gcc.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/CMSIS/Include/cmsis_iccarm.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/CMSIS/Include/cmsis_version.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/CMSIS/Include/core_armv8mbl.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/CMSIS/Include/core_armv8mml.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/CMSIS/Include/core_cm0.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/CMSIS/Include/core_cm0plus.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/CMSIS/Include/core_cm1.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/CMSIS/Include/core_cm23.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/CMSIS/Include/core_cm3.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/CMSIS/Include/core_cm33.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/CMSIS/Include/core_cm4.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/CMSIS/Include/core_cm7.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/CMSIS/Include/core_sc000.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/CMSIS/Include/core_sc300.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/CMSIS/Include/mpu_armv7.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/CMSIS/Include/mpu_armv8.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/CMSIS/Include/tz_context.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/CMSIS/LICENSE.txt create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_tim.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_tim_ex.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_bus.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_cortex.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_dma.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_exti.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_gpio.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_i2c.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_pwr.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_rcc.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_system.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_utils.h create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/License.md create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.c create mode 100644 BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.c create mode 100644 BMS_Testbench/BMS_Software_V1/Makefile create mode 100644 BMS_Testbench/BMS_Software_V1/STM32-for-VSCode.config.yaml create mode 100644 BMS_Testbench/BMS_Software_V1/STM32F102xx.svd create mode 100644 BMS_Testbench/BMS_Software_V1/STM32F302.svd create mode 100644 BMS_Testbench/BMS_Software_V1/STM32F302CCTX_FLASH.ld create mode 100644 BMS_Testbench/BMS_Software_V1/STM32F302CCTx_FLASH.ld create mode 100644 BMS_Testbench/BMS_Software_V1/STM32Make.make create mode 100644 BMS_Testbench/BMS_Software_V1/ams-slave-23 Debug.launch create mode 100644 BMS_Testbench/BMS_Software_V1/ams-slave-23.ioc create mode 100644 BMS_Testbench/BMS_Software_V1/build/ADBMS_Abstraction.d create mode 100644 BMS_Testbench/BMS_Software_V1/build/ADBMS_Abstraction.lst create mode 100644 BMS_Testbench/BMS_Software_V1/build/ADBMS_Abstraction.o create mode 100644 BMS_Testbench/BMS_Software_V1/build/ADBMS_LL_Driver.d create mode 100644 BMS_Testbench/BMS_Software_V1/build/ADBMS_LL_Driver.lst create mode 100644 BMS_Testbench/BMS_Software_V1/build/ADBMS_LL_Driver.o create mode 100644 BMS_Testbench/BMS_Software_V1/build/AMS_CAN.d create mode 100644 BMS_Testbench/BMS_Software_V1/build/AMS_CAN.lst create mode 100644 BMS_Testbench/BMS_Software_V1/build/AMS_CAN.o create mode 100644 BMS_Testbench/BMS_Software_V1/build/AMS_HighLevel.d create mode 100644 BMS_Testbench/BMS_Software_V1/build/AMS_HighLevel.lst create mode 100644 BMS_Testbench/BMS_Software_V1/build/AMS_HighLevel.o create mode 100644 BMS_Testbench/BMS_Software_V1/build/Testbench.d create mode 100644 BMS_Testbench/BMS_Software_V1/build/Testbench.lst create mode 100644 BMS_Testbench/BMS_Software_V1/build/Testbench.o create mode 100755 BMS_Testbench/BMS_Software_V1/build/ams-slave-23.bin create mode 100755 BMS_Testbench/BMS_Software_V1/build/ams-slave-23.elf create mode 100644 BMS_Testbench/BMS_Software_V1/build/ams-slave-23.hex create mode 100644 BMS_Testbench/BMS_Software_V1/build/ams-slave-23.map create mode 100644 BMS_Testbench/BMS_Software_V1/build/main.d create mode 100644 BMS_Testbench/BMS_Software_V1/build/main.lst create mode 100644 BMS_Testbench/BMS_Software_V1/build/main.o create mode 100644 BMS_Testbench/BMS_Software_V1/build/startup_stm32f302xc.d create mode 100644 BMS_Testbench/BMS_Software_V1/build/startup_stm32f302xc.o create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal.d create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal.lst create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal.o create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_can.d create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_can.lst create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_can.o create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_cortex.d create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_cortex.lst create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_cortex.o create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_dma.d create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_dma.lst create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_dma.o create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_exti.d create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_exti.lst create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_exti.o create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_flash.d create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_flash.lst create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_flash.o create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_flash_ex.d create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_flash_ex.lst create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_flash_ex.o create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_gpio.d create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_gpio.lst create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_gpio.o create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_i2c.d create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_i2c.lst create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_i2c.o create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_i2c_ex.d create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_i2c_ex.lst create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_i2c_ex.o create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_msp.d create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_msp.lst create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_msp.o create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_pwr.d create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_pwr.lst create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_pwr.o create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_pwr_ex.d create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_pwr_ex.lst create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_pwr_ex.o create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_rcc.d create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_rcc.lst create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_rcc.o create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_rcc_ex.d create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_rcc_ex.lst create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_rcc_ex.o create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_spi.d create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_spi.lst create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_spi.o create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_spi_ex.d create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_spi_ex.lst create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_spi_ex.o create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_tim.d create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_tim.lst create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_tim.o create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_tim_ex.d create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_tim_ex.lst create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_tim_ex.o create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_it.d create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_it.lst create mode 100644 BMS_Testbench/BMS_Software_V1/build/stm32f3xx_it.o create mode 100644 BMS_Testbench/BMS_Software_V1/build/syscalls.d create mode 100644 BMS_Testbench/BMS_Software_V1/build/syscalls.lst create mode 100644 BMS_Testbench/BMS_Software_V1/build/syscalls.o create mode 100644 BMS_Testbench/BMS_Software_V1/build/sysmem.d create mode 100644 BMS_Testbench/BMS_Software_V1/build/sysmem.lst create mode 100644 BMS_Testbench/BMS_Software_V1/build/sysmem.o create mode 100644 BMS_Testbench/BMS_Software_V1/build/system_stm32f3xx.d create mode 100644 BMS_Testbench/BMS_Software_V1/build/system_stm32f3xx.lst create mode 100644 BMS_Testbench/BMS_Software_V1/build/system_stm32f3xx.o create mode 100644 BMS_Testbench/BMS_Software_V1/openocd.cfg create mode 100644 BMS_Testbench/BMS_Software_V1/startup_stm32f302xc.s diff --git a/BMS_Testbench/BMS_Software_V1/.cproject b/BMS_Testbench/BMS_Software_V1/.cproject new file mode 100644 index 0000000..96da51a --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/.cproject @@ -0,0 +1,329 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/BMS_Testbench/BMS_Software_V1/.mxproject b/BMS_Testbench/BMS_Software_V1/.mxproject new file mode 100644 index 0000000..9d0b942 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/.mxproject @@ -0,0 +1,25 @@ +[PreviousLibFiles] +LibFiles=Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_can.h;Drivers\STM32F3xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_def.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_rcc.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_rcc_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_bus.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_rcc.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_crs.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_system.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_utils.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_gpio.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_gpio_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_gpio.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_dma_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_dma.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_dma.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_cortex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_cortex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_pwr.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_pwr_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_pwr.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_flash.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_flash_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_i2c.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_i2c_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_exti.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_exti.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_i2c.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_spi.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_spi_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_tim.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_tim_ex.h;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_can.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_rcc.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_rcc_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_gpio.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_dma.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_cortex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_pwr.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_pwr_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_flash.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_flash_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_i2c.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_i2c_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_exti.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_spi.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_spi_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_tim.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_tim_ex.c;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_can.h;Drivers\STM32F3xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_def.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_rcc.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_rcc_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_bus.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_rcc.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_crs.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_system.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_utils.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_gpio.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_gpio_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_gpio.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_dma_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_dma.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_dma.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_cortex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_cortex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_pwr.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_pwr_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_pwr.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_flash.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_flash_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_i2c.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_i2c_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_exti.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_exti.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_ll_i2c.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_spi.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_spi_ex.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_tim.h;Drivers\STM32F3xx_HAL_Driver\Inc\stm32f3xx_hal_tim_ex.h;Drivers\CMSIS\Device\ST\STM32F3xx\Include\stm32f302xc.h;Drivers\CMSIS\Device\ST\STM32F3xx\Include\stm32f3xx.h;Drivers\CMSIS\Device\ST\STM32F3xx\Include\system_stm32f3xx.h;Drivers\CMSIS\Device\ST\STM32F3xx\Source\Templates\system_stm32f3xx.c;Drivers\CMSIS\Include\cmsis_armcc.h;Drivers\CMSIS\Include\cmsis_armclang.h;Drivers\CMSIS\Include\cmsis_compiler.h;Drivers\CMSIS\Include\cmsis_gcc.h;Drivers\CMSIS\Include\cmsis_iccarm.h;Drivers\CMSIS\Include\cmsis_version.h;Drivers\CMSIS\Include\core_armv8mbl.h;Drivers\CMSIS\Include\core_armv8mml.h;Drivers\CMSIS\Include\core_cm0.h;Drivers\CMSIS\Include\core_cm0plus.h;Drivers\CMSIS\Include\core_cm1.h;Drivers\CMSIS\Include\core_cm23.h;Drivers\CMSIS\Include\core_cm3.h;Drivers\CMSIS\Include\core_cm33.h;Drivers\CMSIS\Include\core_cm4.h;Drivers\CMSIS\Include\core_cm7.h;Drivers\CMSIS\Include\core_sc000.h;Drivers\CMSIS\Include\core_sc300.h;Drivers\CMSIS\Include\mpu_armv7.h;Drivers\CMSIS\Include\mpu_armv8.h;Drivers\CMSIS\Include\tz_context.h; + +[PreviousUsedCubeIDEFiles] +SourceFiles=Core\Src\main.c;Core\Src\stm32f3xx_it.c;Core\Src\stm32f3xx_hal_msp.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_can.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_rcc.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_rcc_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_gpio.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_dma.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_cortex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_pwr.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_pwr_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_flash.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_flash_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_i2c.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_i2c_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_exti.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_spi.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_spi_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_tim.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_tim_ex.c;Drivers\CMSIS\Device\ST\STM32F3xx\Source\Templates\system_stm32f3xx.c;Core\Src\system_stm32f3xx.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_can.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_rcc.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_rcc_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_gpio.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_dma.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_cortex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_pwr.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_pwr_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_flash.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_flash_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_i2c.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_i2c_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_exti.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_spi.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_spi_ex.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_tim.c;Drivers\STM32F3xx_HAL_Driver\Src\stm32f3xx_hal_tim_ex.c;Drivers\CMSIS\Device\ST\STM32F3xx\Source\Templates\system_stm32f3xx.c;Core\Src\system_stm32f3xx.c;;; +HeaderPath=Drivers\STM32F3xx_HAL_Driver\Inc;Drivers\STM32F3xx_HAL_Driver\Inc\Legacy;Drivers\CMSIS\Device\ST\STM32F3xx\Include;Drivers\CMSIS\Include;Core\Inc; +CDefines=USE_HAL_DRIVER;STM32F302xC;USE_HAL_DRIVER;USE_HAL_DRIVER; + +[PreviousGenFiles] +AdvancedFolderStructure=true +HeaderFileListSize=3 +HeaderFiles#0=..\Core\Inc\stm32f3xx_it.h +HeaderFiles#1=..\Core\Inc\stm32f3xx_hal_conf.h +HeaderFiles#2=..\Core\Inc\main.h +HeaderFolderListSize=1 +HeaderPath#0=..\Core\Inc +HeaderFiles=; +SourceFileListSize=3 +SourceFiles#0=..\Core\Src\stm32f3xx_it.c +SourceFiles#1=..\Core\Src\stm32f3xx_hal_msp.c +SourceFiles#2=..\Core\Src\main.c +SourceFolderListSize=1 +SourcePath#0=..\Core\Src +SourceFiles=; + diff --git a/BMS_Testbench/BMS_Software_V1/.project b/BMS_Testbench/BMS_Software_V1/.project new file mode 100644 index 0000000..5aaff8f --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/.project @@ -0,0 +1,32 @@ + + + BMS_Software + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + com.st.stm32cube.ide.mcu.MCUProjectNature + com.st.stm32cube.ide.mcu.MCUCubeProjectNature + org.eclipse.cdt.core.cnature + com.st.stm32cube.ide.mcu.MCUCubeIdeServicesRevAev2ProjectNature + com.st.stm32cube.ide.mcu.MCUAdvancedStructureProjectNature + com.st.stm32cube.ide.mcu.MCUSingleCpuProjectNature + com.st.stm32cube.ide.mcu.MCURootProjectNature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + diff --git a/BMS_Testbench/BMS_Software_V1/.settings/com.st.stm32cube.ide.mcu.sfrview.prefs b/BMS_Testbench/BMS_Software_V1/.settings/com.st.stm32cube.ide.mcu.sfrview.prefs new file mode 100644 index 0000000..9a16796 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/.settings/com.st.stm32cube.ide.mcu.sfrview.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +sfrviewstate={"fFavorites"\:{"fLists"\:{}},"fProperties"\:{"fNodeProperties"\:{}}} diff --git a/BMS_Testbench/BMS_Software_V1/.settings/language.settings.xml b/BMS_Testbench/BMS_Software_V1/.settings/language.settings.xml new file mode 100644 index 0000000..d7b202f --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/.settings/language.settings.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/BMS_Testbench/BMS_Software_V1/.settings/stm32cubeide.project.prefs b/BMS_Testbench/BMS_Software_V1/.settings/stm32cubeide.project.prefs new file mode 100644 index 0000000..57775d1 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/.settings/stm32cubeide.project.prefs @@ -0,0 +1,4 @@ +66BE74F758C12D739921AEA421D593D3=0 +8DF89ED150041C4CBC7CB9A9CAA90856=0331FDAB209A428E438CDF6850F54DEA +DC22A860405A8BF2F2C095E5B6529F12=0331FDAB209A428E438CDF6850F54DEA +eclipse.preferences.version=1 diff --git a/BMS_Testbench/BMS_Software_V1/.vscode/c_cpp_properties.json b/BMS_Testbench/BMS_Software_V1/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..2e9f878 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/.vscode/c_cpp_properties.json @@ -0,0 +1,20 @@ +{ + "configurations": [ + { + "name": "STM32", + "includePath": [ + "Core/Inc", + "Drivers/CMSIS/Device/ST/STM32F3xx/Include", + "Drivers/CMSIS/Include", + "Drivers/STM32F3xx_HAL_Driver/Inc", + "Drivers/STM32F3xx_HAL_Driver/Inc/Legacy" + ], + "defines": [ + "STM32F302xC", + "USE_HAL_DRIVER" + ], + "compilerPath": "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/arm-none-eabi-gcc" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/BMS_Testbench/BMS_Software_V1/.vscode/launch.json b/BMS_Testbench/BMS_Software_V1/.vscode/launch.json new file mode 100644 index 0000000..57753fd --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/.vscode/launch.json @@ -0,0 +1,34 @@ +{ + "configurations": [ + { + "showDevDebugOutput": "parsed", + "cwd": "${workspaceRoot}", + "executable": "./build/ams-slave-23.elf", + "name": "Debug STM32", + "request": "launch", + "type": "cortex-debug", + "servertype": "openocd", + "preLaunchTask": "Build STM", + "device": "stm32f302xc.s", + "configFiles": [ + "openocd.cfg" + ], + "svdFile": "STM32F102xx.svd" + }, + { + "showDevDebugOutput": "parsed", + "cwd": "${workspaceRoot}", + "executable": "./build/ams-slave-23.elf", + "name": "Attach STM32", + "request": "attach", + "type": "cortex-debug", + "servertype": "openocd", + "preLaunchTask": "Build STM", + "device": "stm32f302xc.s", + "configFiles": [ + "openocd.cfg" + ], + "svdFile": "STM32F102xx.svd" + } + ] +} \ No newline at end of file diff --git a/BMS_Testbench/BMS_Software_V1/.vscode/settings.json b/BMS_Testbench/BMS_Software_V1/.vscode/settings.json new file mode 100644 index 0000000..93579b3 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "cortex-debug.armToolchainPath": "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin", + "cortex-debug.openocdPath": "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/openocd/0.12.0-1.1/.content/bin/openocd" +} \ No newline at end of file diff --git a/BMS_Testbench/BMS_Software_V1/.vscode/tasks.json b/BMS_Testbench/BMS_Software_V1/.vscode/tasks.json new file mode 100644 index 0000000..39d8d34 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/.vscode/tasks.json @@ -0,0 +1,50 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "Build STM", + "type": "process", + "command": "${command:stm32-for-vscode.build}", + "options": { + "cwd": "${workspaceRoot}" + }, + "group": { + "kind": "build", + "isDefault": true + }, + "problemMatcher": [ + "$gcc" + ] + }, + { + "label": "Build Clean STM", + "type": "process", + "command": "${command:stm32-for-vscode.cleanBuild}", + "options": { + "cwd": "${workspaceRoot}" + }, + "group": { + "kind": "build", + "isDefault": true + }, + "problemMatcher": [ + "$gcc" + ] + }, + { + "label": "Flash STM", + "type": "process", + "command": "${command:stm32-for-vscode.flash}", + "options": { + "cwd": "${workspaceRoot}" + }, + "group": { + "kind": "build", + "isDefault": true + }, + "problemMatcher": [ + "$gcc" + ] + } + ] +} \ No newline at end of file diff --git a/BMS_Testbench/BMS_Software_V1/BMS_Software Debug.launch b/BMS_Testbench/BMS_Software_V1/BMS_Software Debug.launch new file mode 100644 index 0000000..336dc5c --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/BMS_Software Debug.launch @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BMS_Testbench/BMS_Software_V1/BMS_Software.ioc b/BMS_Testbench/BMS_Software_V1/BMS_Software.ioc new file mode 100644 index 0000000..fb83f0c --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/BMS_Software.ioc @@ -0,0 +1,199 @@ +#MicroXplorer Configuration settings - do not modify +CAD.formats= +CAD.pinconfig= +CAD.provider= +CAN.ABOM=ENABLE +CAN.BS1=CAN_BS1_13TQ +CAN.BS2=CAN_BS2_2TQ +CAN.CalculateBaudRate=500000 +CAN.CalculateTimeBit=2000 +CAN.CalculateTimeQuantum=125.0 +CAN.IPParameters=CalculateTimeQuantum,CalculateTimeBit,CalculateBaudRate,BS1,BS2,Prescaler,NART,ABOM +CAN.NART=ENABLE +CAN.Prescaler=2 +File.Version=6 +KeepUserPlacement=false +Mcu.CPN=STM32F302CCT6 +Mcu.Family=STM32F3 +Mcu.IP0=CAN +Mcu.IP1=I2C1 +Mcu.IP2=I2C2 +Mcu.IP3=NVIC +Mcu.IP4=RCC +Mcu.IP5=SPI1 +Mcu.IP6=SYS +Mcu.IPNb=7 +Mcu.Name=STM32F302C(B-C)Tx +Mcu.Package=LQFP48 +Mcu.Pin0=PF0-OSC_IN +Mcu.Pin1=PF1-OSC_OUT +Mcu.Pin10=PA9 +Mcu.Pin11=PA10 +Mcu.Pin12=PA11 +Mcu.Pin13=PA12 +Mcu.Pin14=PA13 +Mcu.Pin15=PA14 +Mcu.Pin16=PA15 +Mcu.Pin17=PB3 +Mcu.Pin18=PB7 +Mcu.Pin2=PA4 +Mcu.Pin3=PA5 +Mcu.Pin4=PA6 +Mcu.Pin5=PA7 +Mcu.Pin6=PB13 +Mcu.Pin7=PB14 +Mcu.Pin8=PB15 +Mcu.Pin9=PA8 +Mcu.PinsNb=19 +Mcu.ThirdPartyNb=0 +Mcu.UserConstants= +Mcu.UserName=STM32F302CCTx +MxCube.Version=6.7.0 +MxDb.Version=DB.6.0.70 +NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.ForceEnableDMAVector=true +NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 +NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:false +NVIC.USB_LP_CAN_RX0_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true +NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +PA10.Locked=true +PA10.Mode=I2C +PA10.Signal=I2C2_SDA +PA11.Locked=true +PA11.Mode=CAN_Activate +PA11.Signal=CAN_RX +PA12.Locked=true +PA12.Mode=CAN_Activate +PA12.Signal=CAN_TX +PA13.Locked=true +PA13.Mode=Trace_Asynchronous_SW +PA13.Signal=SYS_JTMS-SWDIO +PA14.Locked=true +PA14.Mode=Trace_Asynchronous_SW +PA14.Signal=SYS_JTCK-SWCLK +PA15.GPIOParameters=GPIO_Label +PA15.GPIO_Label=TMP_SCL +PA15.Locked=true +PA15.Mode=I2C +PA15.Signal=I2C1_SCL +PA4.GPIOParameters=GPIO_Label +PA4.GPIO_Label=CSB +PA4.Locked=true +PA4.Signal=GPIO_Output +PA5.Locked=true +PA5.Mode=Full_Duplex_Master +PA5.Signal=SPI1_SCK +PA6.Locked=true +PA6.Mode=Full_Duplex_Master +PA6.Signal=SPI1_MISO +PA7.Locked=true +PA7.Mode=Full_Duplex_Master +PA7.Signal=SPI1_MOSI +PA8.GPIOParameters=GPIO_Label +PA8.GPIO_Label=Status_3 +PA8.Locked=true +PA8.Signal=GPIO_Output +PA9.Locked=true +PA9.Mode=I2C +PA9.Signal=I2C2_SCL +PB13.GPIOParameters=GPIO_Label +PB13.GPIO_Label=Status_0 +PB13.Locked=true +PB13.Signal=GPIO_Output +PB14.GPIOParameters=GPIO_Label +PB14.GPIO_Label=Status_1 +PB14.Locked=true +PB14.Signal=GPIO_Output +PB15.GPIOParameters=GPIO_Label +PB15.GPIO_Label=Status_2 +PB15.Locked=true +PB15.Signal=GPIO_Output +PB3.Mode=Trace_Asynchronous_SW +PB3.Signal=SYS_JTDO-TRACESWO +PB7.GPIOParameters=GPIO_Label +PB7.GPIO_Label=TMP_SDA +PB7.Locked=true +PB7.Mode=I2C +PB7.Signal=I2C1_SDA +PF0-OSC_IN.Mode=HSE-External-Oscillator +PF0-OSC_IN.Signal=RCC_OSC_IN +PF1-OSC_OUT.Mode=HSE-External-Oscillator +PF1-OSC_OUT.Signal=RCC_OSC_OUT +PinOutPanel.RotationAngle=0 +ProjectManager.AskForMigrate=true +ProjectManager.BackupPrevious=false +ProjectManager.CompilerOptimize=6 +ProjectManager.ComputerToolchain=false +ProjectManager.CoupleFile=false +ProjectManager.CustomerFirmwarePackage= +ProjectManager.DefaultFWLocation=true +ProjectManager.DeletePrevious=true +ProjectManager.DeviceId=STM32F302CCTx +ProjectManager.FirmwarePackage=STM32Cube FW_F3 V1.11.3 +ProjectManager.FreePins=false +ProjectManager.HalAssertFull=false +ProjectManager.HeapSize=0x200 +ProjectManager.KeepUserCode=true +ProjectManager.LastFirmware=false +ProjectManager.LibraryCopy=1 +ProjectManager.MainLocation=Core/Src +ProjectManager.NoMain=false +ProjectManager.PreviousToolchain=STM32CubeIDE +ProjectManager.ProjectBuild=false +ProjectManager.ProjectFileName=BMS_Software.ioc +ProjectManager.ProjectName=BMS_Software +ProjectManager.RegisterCallBack= +ProjectManager.StackSize=0x400 +ProjectManager.TargetToolchain=STM32CubeIDE +ProjectManager.ToolChainLocation= +ProjectManager.UnderRoot=true +ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_CAN_Init-CAN-false-HAL-true,4-MX_I2C1_Init-I2C1-false-HAL-true,5-MX_I2C2_Init-I2C2-false-HAL-true,6-MX_SPI1_Init-SPI1-false-HAL-true +RCC.ADC12outputFreq_Value=32000000 +RCC.AHBFreq_Value=16000000 +RCC.APB1Freq_Value=16000000 +RCC.APB1TimFreq_Value=16000000 +RCC.APB2Freq_Value=16000000 +RCC.APB2TimFreq_Value=16000000 +RCC.CortexFreq_Value=16000000 +RCC.FCLKCortexFreq_Value=16000000 +RCC.FamilyName=M +RCC.HCLKFreq_Value=16000000 +RCC.HSEPLLFreq_Value=16000000 +RCC.HSE_VALUE=16000000 +RCC.HSIPLLFreq_Value=4000000 +RCC.HSI_VALUE=8000000 +RCC.I2C1Freq_Value=8000000 +RCC.I2C2Freq_Value=8000000 +RCC.IPParameters=ADC12outputFreq_Value,AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSEPLLFreq_Value,HSE_VALUE,HSIPLLFreq_Value,HSI_VALUE,I2C1Freq_Value,I2C2Freq_Value,LSE_VALUE,LSI_VALUE,MCOFreq_Value,PLLCLKFreq_Value,PLLMCOFreq_Value,PLLSourceVirtual,RTCFreq_Value,RTCHSEDivFreq_Value,SYSCLKFreq_VALUE,SYSCLKSourceVirtual,TIM1Freq_Value,TIM2Freq_Value,USART1Freq_Value,USART2Freq_Value,USART3Freq_Value,USBFreq_Value,VCOOutput2Freq_Value +RCC.LSE_VALUE=32768 +RCC.LSI_VALUE=40000 +RCC.MCOFreq_Value=16000000 +RCC.PLLCLKFreq_Value=32000000 +RCC.PLLMCOFreq_Value=16000000 +RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE +RCC.RTCFreq_Value=40000 +RCC.RTCHSEDivFreq_Value=500000 +RCC.SYSCLKFreq_VALUE=16000000 +RCC.SYSCLKSourceVirtual=RCC_SYSCLKSOURCE_HSE +RCC.TIM1Freq_Value=16000000 +RCC.TIM2Freq_Value=16000000 +RCC.USART1Freq_Value=16000000 +RCC.USART2Freq_Value=16000000 +RCC.USART3Freq_Value=16000000 +RCC.USBFreq_Value=32000000 +RCC.VCOOutput2Freq_Value=16000000 +SPI1.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_32 +SPI1.CalculateBaudRate=500.0 KBits/s +SPI1.DataSize=SPI_DATASIZE_8BIT +SPI1.Direction=SPI_DIRECTION_2LINES +SPI1.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,BaudRatePrescaler,DataSize +SPI1.Mode=SPI_MODE_MASTER +SPI1.VirtualType=VM_MASTER +board=custom +isbadioc=false diff --git a/BMS_Testbench/BMS_Software_V1/Core/Inc/ADBMS_Abstraction.h b/BMS_Testbench/BMS_Software_V1/Core/Inc/ADBMS_Abstraction.h new file mode 100644 index 0000000..ecbe692 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Core/Inc/ADBMS_Abstraction.h @@ -0,0 +1,82 @@ +/* + * ADBMS_Abstraction.h + * + * Created on: 14.07.2022 + * Author: max + */ + +#ifndef INC_ADBMS_ABSTRACTION_H_ +#define INC_ADBMS_ABSTRACTION_H_ + +#include "ADBMS_LL_Driver.h" +#include "ADBMS_CMD_MAKROS.h" +#include "main.h" + +#define MAXIMUM_CELL_VOLTAGES 18 +#define MAXIMUM_AUX_VOLTAGES 10 +#define MAXIMUM_GPIO 10 + +#define DEFAULT_UV 1562//(VUV + 1)*16*100uV Default Setting 2.5V +#define DEFAULT_OV 2625//(VOV)*16*100uV Default Setting 4.2V + +typedef struct +{ + uint16 cellVoltages[MAXIMUM_CELL_VOLTAGES]; + uint16 auxVoltages[MAXIMUM_AUX_VOLTAGES]; + + uint16 internalDieTemp; + uint16 analogSupplyVoltage; + uint16 digitalSupplyVoltage; + uint16 sumOfCellMeasurements; + uint16 refVoltage; + + uint16 GPIO_Values[MAXIMUM_GPIO]; + + uint32 overVoltage; + uint32 underVoltage; + +} Cell_Module; + + + +uint8 initAMS(SPI_HandleTypeDef* hspi, uint8 numofcells, uint8 numofaux); +uint8 amsWakeUp(); + +uint8 amsCellMeasurement(Cell_Module *module); +uint8 amsConfigCellMeasurement(uint8 numberofChannels); + +uint8 amsAuxMeasurement(Cell_Module *module); +uint8 amsConfigAuxMeasurement(uint16 Channels); + +uint8 amsInternalStatusMeasurement(Cell_Module *module); + +uint8 amsConfigGPIO(uint16 gpios); +uint8 amsSetGPIO(uint16 gpios); +uint8 readGPIO(Cell_Module* module); + +uint8 amsConfigBalancing(uint32 Channels); +uint8 amsStartBalancing(uint8 dutyCycle); +uint8 amsStopBalancing(); + +uint8 amsSelfTest(); + +uint8 amsConfigUnderVoltage(uint16 underVoltage); + +uint8 amsCheckUnderOverVoltage(Cell_Module *module); +uint8 amsConfigOverVoltage(uint16 overVoltage); + +uint8 amscheckOpenCellWire(Cell_Module *module); + +uint8 amsClearStatus(); +uint8 amsClearAux(); +uint8 amsClearCells(); + +uint8 amsSendWarning(); +uint8 amsSendError(); + +uint8 amsClearWarning(); +uint8 amsClearError(); + +uint8 amsReadCellVoltages(Cell_Module *module); + +#endif /* INC_ADBMS_ABSTRACTION_H_ */ diff --git a/BMS_Testbench/BMS_Software_V1/Core/Inc/ADBMS_CMD_MAKROS.h b/BMS_Testbench/BMS_Software_V1/Core/Inc/ADBMS_CMD_MAKROS.h new file mode 100644 index 0000000..9589e5c --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Core/Inc/ADBMS_CMD_MAKROS.h @@ -0,0 +1,191 @@ +/* + * ADBMS_CMD_MAKROS.h + * + * Created on: 14.07.2022 + * Author: max + */ + +#ifndef INC_ADBMS_CMD_MAKROS_H_ +#define INC_ADBMS_CMD_MAKROS_H_ + +#define WRCFGA 0x0001 //Write Configuration Register Group A +#define RDCFGA 0x0002 //Read Configuration Register Group A +#define WRCFGB 0x0024 //Write Configuration Register Group B +#define RDCFGB 0x0026 //Read Configuration Register Group B + +#define RDCVA 0x0004 //Read Cell Voltage Register Group A +#define RDCVB 0x0006 //Read Cell Voltage Register Group B +#define RDCVC 0x0008 //Read Cell Voltage Register Group C +#define RDCVD 0x000A //Read Cell Voltage Register Group D +#define RDCVE 0x0009 //Read Cell Voltage Register Group E +#define RDCVF 0x000B //Read Cell Voltage Register Group F + +#define RDAUXA 0x000C //Read Auxilliary Register Group A +#define RDAUXB 0x000E //Read Auxilliary Register Group B +#define RDAUXC 0x000D //Read Auxilliary Register Group C +#define RDAUXD 0x000F //Read Auxilliary Register Group D + +#define RDSTATA 0x0010//Read Status Register Group A +#define RDSTATB 0x0012//Read Status Register Group B + +#define WRSCTRL 0x0014 //Write S Control Register Group +#define WRPWM 0x0020//Write PWM Register Group +#define WRPSB 0x001A //Write PWM/S Control Register Group +#define RDSCTRL 0x0016 //Read S Control Register Group +#define RDPWM 0x0022//Read PWM Register Group +#define RDPSB 0x001E //Read PWM/S Control Register Group B +#define STSCTRL 0x0019 //Start S Control Pulsing and Poll Status +#define CLRSCTRL 0x0018 //Clear S Control Register Group + +#define ADCV 0x0260 //Start Cell Voltage Conversion +#define ADOW 0x0228 //Start Open Wire ADC Conversion and Poll Status +#define CVST 0x0207//Start Self Test Cell Voltage Conversion and Poll Status +#define ADOL 0x201//Start Overlap Measurement of Cell 7 and 13 Voltages +#define ADAX 0x460 //Start GPIOs ADC Conversion and Poll Status +#define ADAXD 0x400 //Start GPIOs ADC Conversion with Digital Redundancy and Poll Status +#define AXOW 0x410 //Start GPIOs Open Wire ADC Conversion and Poll Status +#define AXST 0x407 //Start Self Test GPIOs Conversion and Poll Status +#define ADSTAT 0x468 //Start Status Group ADC Conversion and Poll Status +#define ADSTATD 0x408//Start Status Group ADC Conversion with Digital Redundany and Poll Status +#define STATST 0x40F //Start Self Test Status Group Conversion and Poll Status +#define ADCVAX 0x46F//Start Combiinden Cell Voltage and GPIO 1, GPIO2, Conversion and Poll Status +#define ADCVSC 0x467//Start Combined Cell Voltage and SC Conversion and Poll Status + +#define CLRCELL 0x711//Clear Cell Voltage Register Groups +#define CLRAUX 0x712//Clear Auxiliary Register Groups +#define CLRSTAT 0x713//Clear Status Register Groups +#define PLADC 0x714//Poll ADC Conversion Status +#define DIAGN 0x715//Diagnos MUX and Poll Status +#define WRCOMM 0x721//Write COMM Register Group +#define RDCOMM 0x722//Read COMM Register Group +#define STCOMM 0x723//Start I2C/SPI Communication +#define MUTE 0x28//Mute Discharge +#define UNMUTE 0x29//Unmute Discharge + + +/*ADC Modes + * ADCOPT(CFGAR0,Bit 0) = 0 ADCOPT(CFGAR0,Bit 0) = 1 + * 00 422Hz mode 1kHz mode + * 01 27kHz mode (fast) 14kHz mode + * 10 7kHz mode (normal) 3kHz mode + * 11 26Hz mode (filtered) 2kHz mode + */ +#define MD00 (0x00<<7) +#define MD01 (0x01<<7) +#define MD10 (0x02<<7) +#define MD11 (0x03<<7) + +//Discharge Permitted if DCP = 1 +#define DCP (0x01<<4) + +/*Cell Selection for ADC Conversion + * 000: All Cells + * 001: Cells 1,7,13 + * 010: Cells 2,8,14 + * 011: Cells 3,9,15 + * 100: Cells 4,10,16 + * 101: Cells 5,11,17 + * 110: Cells 6,12,18 + */ +#define CH000 (0x00) +#define CH001 (0x01) +#define CH010 (0x02) +#define CH011 (0x03) +#define CH100 (0x04) +#define CH101 (0x05) +#define CH110 (0x06) + + +/* Pull-Up/Pull-Down Current for Open Wire Conversion + * 0 Pull down current + * 1 Pull up current + */ +#define PUP (0x01<<6) + + +/*Self Test Mode Selection + * ST01 for Self Test 1 + * ST02 for Self Test 2 + * for value consultate Datasheet + */ +#define ST01 (0x01<<5) +#define ST10 (0x02<<5) + +/* GPIO Selection for ADC Converion + * 000: GPIO1 to 5, 2nd Reference, GPIO 6 to 9 + * 001: GPIO1 and GPIO6 + * 010 GPIO2 and GPIO7 + * 011 GPIO3 and GPIO8 + * 100 GPIO4 and GPIO9 + * 101 GPIO5 + * 110 2nd Reference + */ + +#define CHG000 (0x00) +#define CHG001 (0x01) +#define CHG010 (0x02) +#define CHG011 (0x03) +#define CHG100 (0x04) +#define CHG101 (0x05) +#define CHG110 (0x06) + +/* Status Group Selection + * 000: SC,ITMP,VA,VD + * 001: SC + * 010: ITMP + * 011: VA + * 100: VD + */ + +#define CHST000 (0x00) +#define CHST001 (0x01) +#define CHST010 (0x02) +#define CHST011 (0x03) +#define CHST100 (0x04) + +#define PEC_FIELD_SIZE 2 + +#define CFG_GROUP_A_SIZE 6 +#define CFG_GROUP_B_SIZE 6 +#define CV_GROUP_A_SIZE 6 +#define CV_GROUP_B_SIZE 6 +#define CV_GROUP_C_SIZE 6 +#define CV_GROUP_D_SIZE 6 +#define CV_GROUP_E_SIZE 6 +#define CV_GROUP_F_SIZE 6 + +#define AUX_GROUP_A_SIZE 6 +#define AUX_GROUP_B_SIZE 6 +#define AUX_GROUP_C_SIZE 6 +#define AUX_GROUP_D_SIZE 6 + +#define STATUS_GROUP_A_SIZE 6 +#define STATUS_GROUP_B_SIZE 6 +#define COMM_GROUP_SIZE 6 +#define S_CONTROL_GROUP_SIZE 6 +#define PWM_GROUP_SIZE 6 +#define PWM_S_CONTROL_GROUP_B_SIZE 6 + +#define CFG_GROUP_A_ID 1 +#define CFG_GROUP_B_ID 2 +#define CV_GROUP_A_ID 3 +#define CV_GROUP_B_ID 4 +#define CV_GROUP_C_ID 5 +#define CV_GROUP_D_ID 6 +#define CV_GROUP_E_ID 7 +#define CV_GROUP_F_ID 8 + +#define AUX_GROUP_A_ID 9 +#define AUX_GROUP_B_ID 10 +#define AUX_GROUP_C_ID 11 +#define AUX_GROUP_D_ID 12 + +#define STATUS_GROUP_A_ID 13 +#define STATUS_GROUP_B_ID 14 +#define COMM_GROUP_ID 15 +#define S_CONTROL_GROUP_ID 16 +#define PWM_GROUP_ID 17 +#define PWM_S_CONTROL_GROUP_B_ID 18 + + +#endif /* INC_ADBMS_CMD_MAKROS_H_ */ diff --git a/BMS_Testbench/BMS_Software_V1/Core/Inc/ADBMS_LL_Driver.h b/BMS_Testbench/BMS_Software_V1/Core/Inc/ADBMS_LL_Driver.h new file mode 100644 index 0000000..d8834b3 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Core/Inc/ADBMS_LL_Driver.h @@ -0,0 +1,44 @@ +/* + * ADBMS_LL_Driver.h + * + * Created on: 05.06.2022 + * Author: max + */ + +#ifndef ADBMS_LL_DRIVER_H_ +#define ADBMS_LL_DRIVER_H_ + +#define TARGET_STM32 + + + +#include "main.h" + + +#ifdef TARGET_STM32 + typedef uint8_t uint8; + typedef uint16_t uint16; + typedef uint32_t uint32; +#endif + + +uint8 adbmsDriverInit(); +uint8 calculatePEC(uint8* data, uint8 datalen); +uint16 updatePEC(uint16 currentPEC, uint8 din); +uint8 checkPEC(uint8* data, uint8 datalen); + +uint8 writeCMD(uint16 command, uint8* args, uint8 arglen); +uint8 readCMD(uint16 command, uint8* buffer, uint8 buflen); + +void mcuAdbmsCSLow(); +void mcuAdbmsCSHigh(); + +uint8 mcuSPITransmit(uint8* buffer, uint8 buffersize); +uint8 mcuSPIReceive(uint8* buffer, uint8 buffersize); +uint8 mcuSPITransmitReceive(uint8* rxbuffer, uint8* txbuffer, uint8 buffersize); + +uint8 wakeUpCmd(); +void mcuDelay(uint16 delay); + + +#endif /* ADBMS_LL_DRIVER_H_ */ diff --git a/BMS_Testbench/BMS_Software_V1/Core/Inc/AMS_CAN.h b/BMS_Testbench/BMS_Software_V1/Core/Inc/AMS_CAN.h new file mode 100644 index 0000000..76c2ade --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Core/Inc/AMS_CAN.h @@ -0,0 +1,49 @@ +/* + * AMS_CAN.h + * + * Created on: Mar 19, 2022 + * Author: jasper + */ + +#ifndef INC_AMS_CAN_H_ +#define INC_AMS_CAN_H_ + +#include "main.h" + +#include "stm32f3xx_hal.h" +#include "stm32f3xx_hal_can.h" +#include "stm32f3xx_hal_def.h" + +#include + +#define CAN_ID_SLAVE_ERROR 0x001 +#define CAN_ID_CLOCK_SYNC 0x002 +#define CAN_ID_MASTER_HEARTBEAT 0x010 +#define CAN_ID_AMS_SLAVE_HEARTBEAT_BASE 0x600 +#define CAN_HEARTBEAT_TX_TIMEOUT 10 +/* ms */ +#define BMS_IN_TEST_MODE 1 // set to test the BMS use < sudo ip link set can0 up type can bitrate 500000 > // Use for Test Mode only for reducing weight of the handler +#define BMS_TEST_ID 0 + +extern CAN_HandleTypeDef* ams_can_handle; + +void ams_can_init(CAN_HandleTypeDef* ams, CAN_HandleTypeDef* car); + +void ams_can_handle_ams_msg(CAN_RxHeaderTypeDef* header, uint8_t* data); + +void ams_can_send_heartbeat(); +/** + * @brief Send an AMS Error via CAN. + * + * @param error_code The kind of error + * @param transmission_timeout How long to wait for the transmission to complete + * after starting it (in ms). Set to 0 for no wait. + */ +/*void ams_can_send_error(AMS_ErrorCode error_code, + uint32_t transmission_timeout);*/ + +HAL_StatusTypeDef ams_can_wait_for_free_mailboxes(CAN_HandleTypeDef* handle, + int num_mailboxes, + uint32_t timeout); + +#endif /* INC_AMS_CAN_H_ */ diff --git a/BMS_Testbench/BMS_Software_V1/Core/Inc/AMS_HighLevel.h b/BMS_Testbench/BMS_Software_V1/Core/Inc/AMS_HighLevel.h new file mode 100644 index 0000000..91f6245 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Core/Inc/AMS_HighLevel.h @@ -0,0 +1,46 @@ +/* + * AMS_HighLevel.h + * + * Created on: 20.07.2022 + * Author: max + */ + +#ifndef INC_AMS_HIGHLEVEL_H_ +#define INC_AMS_HIGHLEVEL_H_ + +#include "ADBMS_Abstraction.h" +#include "ADBMS_LL_Driver.h" +#include "ADBMS_CMD_MAKROS.h" + + + +typedef enum {AMSDEACTIVE, AMSIDLE, AMSCHARGING, AMSIDLEBALANCING, AMSDISCHARGING, AMSWARNING, AMSERROR} amsState; + +extern amsState currentAMSState; +extern Cell_Module module; +extern uint32_t balancedCells; +extern uint8_t BalancingActive; +extern uint8_t stateofcharge; + +extern uint8_t amserrorcode; +extern uint8_t amswarningcode; + +extern uint8_t numberofCells; +extern uint8_t numberofAux; + + +void AMS_Init(); +void AMS_Loop(); + +uint8_t AMS_Balancing_Loop(); +uint8_t AMS_Idle_Loop(); +uint8_t AMS_Warning_Loop(); +uint8_t AMS_Error_Loop(); +uint8_t AMS_Charging_Loop(); +uint8_t AMS_Discharging_Loop(); + +uint8_t writeWarningLog(uint8_t warningCode); +uint8_t writeErrorLog(uint8_t errorCode); +uint8_t integrateCurrent(); + +#endif /* INC_AMS_HIGHLEVEL_H_ */ diff --git a/BMS_Testbench/BMS_Software_V1/Core/Inc/Testbench.h b/BMS_Testbench/BMS_Software_V1/Core/Inc/Testbench.h new file mode 100644 index 0000000..a358abc --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Core/Inc/Testbench.h @@ -0,0 +1,32 @@ +/* + * Testbench.h + * + * Created on: 13.03.2023 + * Author: david + */ + +#ifndef SRC_TESTBENCH_H_ +#define SRC_TESTBENCH_H_ + +#include "main.h" + +#include "stm32f3xx_hal.h" +#include "stm32f3xx_hal_can.h" +#include "stm32f3xx_hal_def.h" +#include "ADBMS_Abstraction.h" + +#include + +extern Cell_Module module; + +#define CAN_TEST 0x1 +#define VOLTAGE_TEST 0x2 +#define TEMP_TEST 0x3 +#define EPROM_TEST 0x4 +#define BALANCING_TEST 0x5 + + + +void testLoop(uint8_t* action); + +#endif /* SRC_TESTBENCH_H_ */ diff --git a/BMS_Testbench/BMS_Software_V1/Core/Inc/common_defs.h b/BMS_Testbench/BMS_Software_V1/Core/Inc/common_defs.h new file mode 100644 index 0000000..4e9ac5f --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Core/Inc/common_defs.h @@ -0,0 +1,13 @@ +/* + * common_defs.h + * + * Created on: 23 Mar 2022 + * Author: Jasper + */ + +#ifndef INC_COMMON_DEFS_H_ +#define INC_COMMON_DEFS_H_ + +#define N_CELLS 17 + +#endif /* INC_COMMON_DEFS_H_ */ diff --git a/BMS_Testbench/BMS_Software_V1/Core/Inc/main.h b/BMS_Testbench/BMS_Software_V1/Core/Inc/main.h new file mode 100644 index 0000000..6ea45f8 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Core/Inc/main.h @@ -0,0 +1,83 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.h + * @brief : Header for main.c file. + * This file contains the common defines of the application. + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __MAIN_H +#define __MAIN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f3xx_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 CSB_Pin GPIO_PIN_4 +#define CSB_GPIO_Port GPIOA +#define Status_0_Pin GPIO_PIN_13 +#define Status_0_GPIO_Port GPIOB +#define Status_1_Pin GPIO_PIN_14 +#define Status_1_GPIO_Port GPIOB +#define Status_2_Pin GPIO_PIN_15 +#define Status_2_GPIO_Port GPIOB +#define Status_3_Pin GPIO_PIN_8 +#define Status_3_GPIO_Port GPIOA +#define TMP_SCL_Pin GPIO_PIN_15 +#define TMP_SCL_GPIO_Port GPIOA +#define TMP_SDA_Pin GPIO_PIN_7 +#define TMP_SDA_GPIO_Port GPIOB + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +#ifdef __cplusplus +} +#endif + +#endif /* __MAIN_H */ diff --git a/BMS_Testbench/BMS_Software_V1/Core/Inc/stm32f3xx_hal_conf.h b/BMS_Testbench/BMS_Software_V1/Core/Inc/stm32f3xx_hal_conf.h new file mode 100644 index 0000000..d2b6f92 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Core/Inc/stm32f3xx_hal_conf.h @@ -0,0 +1,359 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32f3xx_hal_conf.h + * @brief HAL configuration file. + ****************************************************************************** + * @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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F3xx_HAL_CONF_H +#define __STM32F3xx_HAL_CONF_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* ########################## Module Selection ############################## */ +/** + * @brief This is the list of modules to be used in the HAL driver + */ + +#define HAL_MODULE_ENABLED + /*#define HAL_ADC_MODULE_ENABLED */ +/*#define HAL_CRYP_MODULE_ENABLED */ +#define HAL_CAN_MODULE_ENABLED +/*#define HAL_CEC_MODULE_ENABLED */ +/*#define HAL_NAND_MODULE_ENABLED */ +/*#define HAL_NOR_MODULE_ENABLED */ +/*#define HAL_PCCARD_MODULE_ENABLED */ +/*#define HAL_SRAM_MODULE_ENABLED */ +/*#define HAL_HRTIM_MODULE_ENABLED */ +/*#define HAL_OPAMP_MODULE_ENABLED */ +/*#define HAL_SDADC_MODULE_ENABLED */ +/*#define HAL_TSC_MODULE_ENABLED */ +/*#define HAL_COMP_MODULE_ENABLED */ +/*#define HAL_CRC_MODULE_ENABLED */ +/*#define HAL_CRYP_MODULE_ENABLED */ +/*#define HAL_DAC_MODULE_ENABLED */ +/*#define HAL_I2S_MODULE_ENABLED */ +/*#define HAL_IWDG_MODULE_ENABLED */ +/*#define HAL_LCD_MODULE_ENABLED */ +/*#define HAL_LPTIM_MODULE_ENABLED */ +/*#define HAL_RNG_MODULE_ENABLED */ +/*#define HAL_RTC_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_GPIO_MODULE_ENABLED +#define HAL_EXTI_MODULE_ENABLED +/* #define HAL_CAN_LEGACY_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 +#define HAL_I2C_MODULE_ENABLED +/* ########################## HSE/HSI Values adaptation ##################### */ +/** + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSE is used as system clock source, directly or through the PLL). + */ +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)16000000) /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +/** + * @brief In the following line adjust the External High Speed oscillator (HSE) Startup + * Timeout value + */ +#if !defined (HSE_STARTUP_TIMEOUT) + #define HSE_STARTUP_TIMEOUT ((uint32_t)100) /*!< 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)8000000) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @brief In the following line adjust the Internal High Speed oscillator (HSI) Startup + * Timeout value + */ +#if !defined (HSI_STARTUP_TIMEOUT) + #define HSI_STARTUP_TIMEOUT ((uint32_t)5000) /*!< Time out for HSI start up */ +#endif /* HSI_STARTUP_TIMEOUT */ + +/** + * @brief Internal Low Speed oscillator (LSI) value. + */ +#if !defined (LSI_VALUE) + #define LSI_VALUE ((uint32_t)40000) +#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz + The real value may vary depending on the variations + in voltage and temperature. */ +/** + * @brief External Low Speed oscillator (LSE) value. + */ +#if !defined (LSE_VALUE) + #define LSE_VALUE ((uint32_t)32768) /*!< Value of the External Low Speed oscillator in Hz */ +#endif /* LSE_VALUE */ + +/** + * @brief Time out for LSE start up value in ms. + */ +#if !defined (LSE_STARTUP_TIMEOUT) + #define LSE_STARTUP_TIMEOUT ((uint32_t)5000) /*!< 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. + * - External clock generated through external PLL component on EVAL 303 (based on MCO or crystal) + * - External clock not generated on EVAL 373 + */ +#if !defined (EXTERNAL_CLOCK_VALUE) + #define EXTERNAL_CLOCK_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz*/ +#endif /* EXTERNAL_CLOCK_VALUE */ + +/* Tip: To avoid modifying this file each time you need to use different HSE, + === you can define the HSE value in your toolchain compiler preprocessor. */ + +/* ########################### System Configuration ######################### */ +/** + * @brief This is the HAL system configuration section + */ + +#define VDD_VALUE ((uint32_t)3300) /*!< Value of VDD in mv */ +#define TICK_INT_PRIORITY ((uint32_t)15) /*!< tick interrupt priority (lowest by default) */ +#define USE_RTOS 0 +#define PREFETCH_ENABLE 1 +#define INSTRUCTION_CACHE_ENABLE 0 +#define DATA_CACHE_ENABLE 0 +#define USE_SPI_CRC 0U + +#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_COMP_REGISTER_CALLBACKS 0U /* COMP register callback disabled */ +#define USE_HAL_CEC_REGISTER_CALLBACKS 0U /* CEC register callback disabled */ +#define USE_HAL_DAC_REGISTER_CALLBACKS 0U /* DAC register callback disabled */ +#define USE_HAL_SRAM_REGISTER_CALLBACKS 0U /* SRAM register callback disabled */ +#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U /* SMBUS 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_HRTIM_REGISTER_CALLBACKS 0U /* HRTIM register callback disabled */ +#define USE_HAL_I2C_REGISTER_CALLBACKS 0U /* I2C 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_IRDA_REGISTER_CALLBACKS 0U /* IRDA register callback disabled */ +#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U /* SMARTCARD register callback disabled */ +#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U /* WWDG register callback disabled */ +#define USE_HAL_OPAMP_REGISTER_CALLBACKS 0U /* OPAMP register callback disabled */ +#define USE_HAL_RTC_REGISTER_CALLBACKS 0U /* RTC register callback disabled */ +#define USE_HAL_SPI_REGISTER_CALLBACKS 0U /* SPI register callback disabled */ +#define USE_HAL_I2S_REGISTER_CALLBACKS 0U /* I2S register callback disabled */ +#define USE_HAL_TIM_REGISTER_CALLBACKS 0U /* TIM register callback disabled */ +#define USE_HAL_TSC_REGISTER_CALLBACKS 0U /* TSC register callback disabled */ +#define USE_HAL_PCD_REGISTER_CALLBACKS 0U /* PCD 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 */ + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include module's header file + */ + +#ifdef HAL_RCC_MODULE_ENABLED + #include "stm32f3xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED + #include "stm32f3xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED + #include "stm32f3xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED + #include "stm32f3xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED + #include "stm32f3xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED + #include "stm32f3xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_CAN_MODULE_ENABLED + #include "stm32f3xx_hal_can.h" +#endif /* HAL_CAN_MODULE_ENABLED */ + +#ifdef HAL_CAN_LEGACY_MODULE_ENABLED + #include "stm32f3xx_hal_can_legacy.h" +#endif /* HAL_CAN_LEGACY_MODULE_ENABLED */ + +#ifdef HAL_CEC_MODULE_ENABLED + #include "stm32f3xx_hal_cec.h" +#endif /* HAL_CEC_MODULE_ENABLED */ + +#ifdef HAL_COMP_MODULE_ENABLED + #include "stm32f3xx_hal_comp.h" +#endif /* HAL_COMP_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED + #include "stm32f3xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED + #include "stm32f3xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED + #include "stm32f3xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_SRAM_MODULE_ENABLED + #include "stm32f3xx_hal_sram.h" +#endif /* HAL_SRAM_MODULE_ENABLED */ + +#ifdef HAL_NOR_MODULE_ENABLED + #include "stm32f3xx_hal_nor.h" +#endif /* HAL_NOR_MODULE_ENABLED */ + +#ifdef HAL_NAND_MODULE_ENABLED + #include "stm32f3xx_hal_nand.h" +#endif /* HAL_NAND_MODULE_ENABLED */ + +#ifdef HAL_PCCARD_MODULE_ENABLED + #include "stm32f3xx_hal_pccard.h" +#endif /* HAL_PCCARD_MODULE_ENABLED */ + +#ifdef HAL_HRTIM_MODULE_ENABLED + #include "stm32f3xx_hal_hrtim.h" +#endif /* HAL_HRTIM_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED + #include "stm32f3xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_I2S_MODULE_ENABLED + #include "stm32f3xx_hal_i2s.h" +#endif /* HAL_I2S_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED + #include "stm32f3xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED + #include "stm32f3xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_OPAMP_MODULE_ENABLED + #include "stm32f3xx_hal_opamp.h" +#endif /* HAL_OPAMP_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED + #include "stm32f3xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED + #include "stm32f3xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED + #include "stm32f3xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SDADC_MODULE_ENABLED + #include "stm32f3xx_hal_sdadc.h" +#endif /* HAL_SDADC_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED + #include "stm32f3xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_SMBUS_MODULE_ENABLED + #include "stm32f3xx_hal_smbus.h" +#endif /* HAL_SMBUS_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED + #include "stm32f3xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED + #include "stm32f3xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_TSC_MODULE_ENABLED + #include "stm32f3xx_hal_tsc.h" +#endif /* HAL_TSC_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED + #include "stm32f3xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED + #include "stm32f3xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED + #include "stm32f3xx_hal_wwdg.h" +#endif /* HAL_WWDG_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 /* __STM32F3xx_HAL_CONF_H */ diff --git a/BMS_Testbench/BMS_Software_V1/Core/Inc/stm32f3xx_it.h b/BMS_Testbench/BMS_Software_V1/Core/Inc/stm32f3xx_it.h new file mode 100644 index 0000000..ba25618 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Core/Inc/stm32f3xx_it.h @@ -0,0 +1,67 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32f3xx_it.h + * @brief This file contains the headers of the interrupt handlers. + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F3xx_IT_H +#define __STM32F3xx_IT_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ +/* USER CODE BEGIN EC */ + +/* USER CODE END EC */ + +/* Exported macro ------------------------------------------------------------*/ +/* USER CODE BEGIN EM */ + +/* USER CODE END EM */ + +/* Exported functions prototypes ---------------------------------------------*/ +void NMI_Handler(void); +void HardFault_Handler(void); +void MemManage_Handler(void); +void BusFault_Handler(void); +void UsageFault_Handler(void); +void SVC_Handler(void); +void DebugMon_Handler(void); +void PendSV_Handler(void); +void SysTick_Handler(void); +void USB_LP_CAN_RX0_IRQHandler(void); +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F3xx_IT_H */ diff --git a/BMS_Testbench/BMS_Software_V1/Core/Src/ADBMS_Abstraction.c b/BMS_Testbench/BMS_Software_V1/Core/Src/ADBMS_Abstraction.c new file mode 100644 index 0000000..607810e --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Core/Src/ADBMS_Abstraction.c @@ -0,0 +1,422 @@ +/* + * ADBMS_Abstraction.c + * + * Created on: 14.07.2022 + * Author: max + */ + +#include "ADBMS_Abstraction.h" + + + +uint8 numberofcells; +uint8 numberofauxchannels; + +uint8 initAMS(SPI_HandleTypeDef* hspi, uint8 numofcells, uint8 numofaux) +{ + adbmsDriverInit(hspi); + numberofcells = numofcells; + numberofauxchannels = numofaux; + + + amsWakeUp(); + amsStopBalancing(); + amsConfigOverVoltage(DEFAULT_OV); + amsConfigUnderVoltage(DEFAULT_UV); + amsConfigAuxMeasurement(0xFFFF); + + return 0; +} + +uint8 amsWakeUp() +{ + uint8 buf[6]; + readCMD(RDCFGA, buf, 6); + return 0; +} + +uint8 amsCellMeasurement(Cell_Module *module) +{ + uint8_t rxbuffer[CV_GROUP_A_SIZE]; + writeCMD((ADCV | CH000 | MD10), rxbuffer, 0); + mcuDelay(5); + amsReadCellVoltages(module); + return 0; +} + +uint8 amsConfigCellMeasurement(uint8 numberofChannels) +{ + numberofcells = numberofChannels; + return 0; +} + +uint8 amsAuxMeasurement(Cell_Module *module) +{ + uint8 args; + uint8 rxbuf[AUX_GROUP_A_SIZE]; + writeCMD(ADAX | MD01 | CHG000, &args, 0); + + mcuDelay(5); + + readCMD(RDAUXA, rxbuf, AUX_GROUP_A_SIZE); + + module->auxVoltages[0] = rxbuf[0] | (rxbuf[1]<<8); + module->auxVoltages[1] = rxbuf[2] | (rxbuf[3]<<8); + module->auxVoltages[2] = rxbuf[4] | (rxbuf[5]<<8); + + readCMD(RDAUXB, rxbuf, AUX_GROUP_A_SIZE); + + module->auxVoltages[3] = rxbuf[0] | (rxbuf[1]<<8); + module->auxVoltages[4] = rxbuf[2] | (rxbuf[3]<<8); + module->refVoltage = rxbuf[4] | (rxbuf[5]<<8); + + readCMD(RDAUXC, rxbuf, AUX_GROUP_A_SIZE); + + module->auxVoltages[5] = rxbuf[0] | (rxbuf[1]<<8); + module->auxVoltages[6] = rxbuf[2] | (rxbuf[3]<<8); + module->auxVoltages[7] = rxbuf[4] | (rxbuf[5]<<8); + + readCMD(RDAUXD, rxbuf, AUX_GROUP_A_SIZE); + + module->auxVoltages[8] = rxbuf[0] | (rxbuf[1]<<8); + + return 0; +} + +uint8 amsInternalStatusMeasurement(Cell_Module *module) +{ + uint8 rxbuffer[STATUS_GROUP_A_SIZE]; + writeCMD(ADSTAT | MD01 | CHST000, rxbuffer, STATUS_GROUP_A_SIZE); + mcuDelay(5); + + readCMD(RDSTATA, rxbuffer, STATUS_GROUP_A_SIZE); + + module->sumOfCellMeasurements = rxbuffer[0] | (rxbuffer[1]<<8); + module->internalDieTemp = rxbuffer[2] | (rxbuffer[3]<<8); + module->analogSupplyVoltage = rxbuffer[4] | (rxbuffer[5]<<8); + + readCMD(RDSTATB, rxbuffer, STATUS_GROUP_B_SIZE); + module->digitalSupplyVoltage = rxbuffer[0] | (rxbuffer[1]<<8); + + + return 0; +} + +uint8 amsConfigAuxMeasurement(uint16 Channels) +{ + uint8 buf[CFG_GROUP_A_SIZE]; + + readCMD(RDCFGA, buf, CFG_GROUP_A_SIZE); + buf[0] |= 0xF8; + writeCMD(WRCFGA, buf, CFG_GROUP_A_SIZE); + + readCMD(RDCFGB, buf, CFG_GROUP_B_SIZE); + buf[0] |= 0x0F; + writeCMD(WRCFGB, buf, CFG_GROUP_B_SIZE); + return 0; +} + +uint8 amsConfigGPIO(uint16 gpios) +{ + return 0; +} + +uint8 amsSetGPIO(uint16 gpios) +{ + return 0; +} + +uint8 readGPIO(Cell_Module* module) +{ + return 0; +} + +uint8 amsConfigBalancing(uint32 Channels) +{ + + uint8 regbuffer[CFG_GROUP_A_SIZE]; + readCMD(RDCFGA, regbuffer, CFG_GROUP_A_SIZE); + + regbuffer[4] = Channels & 0xFF; + regbuffer[5] &= 0xF0; + regbuffer[5] |= (Channels>>8) & 0x0F; + writeCMD(WRCFGA, regbuffer, CFG_GROUP_A_SIZE); + + readCMD(RDCFGB, regbuffer, CFG_GROUP_B_SIZE); + regbuffer[0] &= 0x0F; + regbuffer[0] |= (Channels>>8) & 0xF0; + regbuffer[1] &= 0xFC; + regbuffer[1] |= 0x03 & (Channels>>16); + writeCMD(WRCFGB, regbuffer, CFG_GROUP_B_SIZE); + + return 0; +} + +uint8 amsStartBalancing(uint8 dutyCycle) +{ + writeCMD(UNMUTE, NULL, 0); + return 0; +} + +uint8 amsStopBalancing() +{ + writeCMD(MUTE, NULL, 0); + return 0; +} + +uint8 amsSelfTest() +{ + return 0; +} + + + +uint8 amsConfigUnderVoltage(uint16 underVoltage) +{ + uint8 buffer[CFG_GROUP_A_SIZE]; + readCMD(RDCFGA, buffer, CFG_GROUP_A_SIZE); + + buffer[1] = (uint8) underVoltage & 0xFF; + uint8 ovuv = buffer[2] & 0xF0; + ovuv |= (uint8) (underVoltage >> 8) & 0x0F; + buffer[2] = ovuv; + + writeCMD(WRCFGA, buffer, CFG_GROUP_A_SIZE); + + return 0; +} + +uint8 amsCheckUnderOverVoltage(Cell_Module *module) +{ + uint8 regbuffer[STATUS_GROUP_B_SIZE]; + uint32 overundervoltages = 0; + readCMD(RDSTATB, regbuffer, STATUS_GROUP_B_SIZE); + overundervoltages = regbuffer[2] | (regbuffer[3]<<8) | (regbuffer[4]<<16); + module->overVoltage = 0; + module->underVoltage = 0; + for(uint8 n = 0; n < 12; n++) + { + uint8 overvolt = (overundervoltages>>(2*n+1)) & 0x01; + uint8 undervolt = (overundervoltages>>(2*n))&0x01; + + module->overVoltage |= overvolt<underVoltage |= undervolt<>(2*n+1)) & 0x01; + uint8 undervolt = (overundervoltages>>(2*n))&0x01; + + module->overVoltage |= (uint32) overvolt<<(n+12); + module->underVoltage |= (uint32) undervolt<<(n+12); + } + + + return 0; +} + +uint8 amsConfigOverVoltage(uint16 overVoltage) +{ + uint8 buffer[CFG_GROUP_B_SIZE]; + + readCMD(RDCFGA, buffer, CFG_GROUP_A_SIZE); + buffer[2] &= 0x0F; + buffer[2] |= (uint8) overVoltage << 4; + buffer[3] = (uint8)(overVoltage>>4); + + writeCMD(WRCFGA, buffer, CFG_GROUP_A_SIZE); + + return 0; +} + +/* +void dumpRegister(UART_HandleTypeDef *huart, uint8 RegID, uint8* buffer) +{ + switch(RegID) + { + case CFG_GROUP_A_ID: + readCMD(RDCFGA, buffer, CFG_GROUP_A_SIZE); + break; + case CFG_GROUP_B_ID: + readCMD(RDCFGB, buffer, CFG_GROUP_A_SIZE); + break; + case CV_GROUP_A_ID: + readCMD(RDCVA, buffer, CFG_GROUP_A_SIZE); + break; + case CV_GROUP_B_ID: + readCMD(RDCVB, buffer, CFG_GROUP_A_SIZE); + break; + case CV_GROUP_C_ID: + readCMD(RDCVC, buffer, CFG_GROUP_A_SIZE); + break; + case CV_GROUP_D_ID: + readCMD(RDCVD, buffer, CFG_GROUP_A_SIZE); + break; + case CV_GROUP_E_ID: + readCMD(RDCVE, buffer, CFG_GROUP_A_SIZE); + break; + case CV_GROUP_F_ID: + readCMD(RDCVF, buffer, CFG_GROUP_A_SIZE); + break; + case AUX_GROUP_A_ID: + readCMD(RDAUXA, buffer, CFG_GROUP_A_SIZE); + break; + case AUX_GROUP_B_ID: + readCMD(RDAUXB, buffer, CFG_GROUP_A_SIZE); + break; + case AUX_GROUP_C_ID: + readCMD(RDAUXC, buffer, CFG_GROUP_A_SIZE); + break; + case AUX_GROUP_D_ID: + readCMD(RDAUXD, buffer, CFG_GROUP_A_SIZE); + break; + case STATUS_GROUP_A_ID: + readCMD(RDSTATA, buffer, CFG_GROUP_A_SIZE); + break; + case STATUS_GROUP_B_ID: + readCMD(RDSTATB, buffer, CFG_GROUP_A_SIZE); + break; + case COMM_GROUP_ID: + readCMD(RDCOMM, buffer, CFG_GROUP_A_SIZE); + break; + case S_CONTROL_GROUP_ID: + readCMD(RDSCTRL, buffer, CFG_GROUP_A_SIZE); + break; + case PWM_GROUP_ID: + readCMD(RDPWM, buffer, CFG_GROUP_A_SIZE); + break; + case PWM_S_CONTROL_GROUP_B_ID: + readCMD(RDPSB, buffer, CFG_GROUP_A_SIZE); + break; + } +} +*/ + +uint8 amsClearStatus() +{ + uint8 buffer[6]; + writeCMD(CLRSTAT, buffer, 0); + return 0; +} +uint8 amsClearAux() +{ + uint8 buffer[6]; + writeCMD(CLRAUX, buffer, 0); + return 0; +} +uint8 amsClearCells() +{ + uint8 buffer[6]; + writeCMD(CLRCELL, buffer, 0); + return 0; +} + +uint8 amsSendWarning() +{ + //HAL_GPIO_WritePin(AMS_Warning_GPIO_Port, AMS_Warning_Pin, GPIO_PIN_SET); + return 0; +} + +uint8 amsSendError() +{ + //HAL_GPIO_WritePin(AMS_Error_GPIO_Port, AMS_Error_Pin, GPIO_PIN_SET); + return 0; +} + +uint8 amsClearWarning() +{ + //HAL_GPIO_WritePin(AMS_Warning_GPIO_Port, AMS_Warning_Pin, GPIO_PIN_RESET); + return 0; +} + +uint8 amsClearError() +{ + //HAL_GPIO_WritePin(AMS_Error_GPIO_Port, AMS_Error_Pin, GPIO_PIN_RESET); + return 0; +} + +uint8 amscheckOpenCellWire(Cell_Module *module) +{ + uint8 args; + uint16 cellspu[18]; + + writeCMD(ADOW |MD01|CH000|PUP , &args, 0); //run Pull Up at least Twice + HAL_Delay(5); + writeCMD(ADOW |MD01|CH000|PUP , &args, 0); //run Pull Up at least Twice + HAL_Delay(5); + + amsReadCellVoltages(module); + + for(uint8_t n = 0; n cellVoltages[n]; + } + + + writeCMD(ADOW |MD01|CH000, &args, 0); //run Pull Up at least Twice + HAL_Delay(5); + writeCMD(ADOW |MD01|CH000, &args, 0); //run Pull Up at least Twice + HAL_Delay(5); + + amsReadCellVoltages(module); + + for(uint8 n = 1; n < numberofcells; n++) + { + int dv = cellspu[n]-module->cellVoltages[n]; + if(dv < -4000) + { + return (1+n); + } + } + if((cellspu[0] == 0) || (cellspu[0] == 0xFFFF)) + { + return 1; + } + if(module->cellVoltages[numberofcells-1] == 0) + { + return 19; + } + + return 0; +} + +uint8 amsReadCellVoltages(Cell_Module *module) +{ + uint8 rxbuffer[CV_GROUP_A_SIZE]; + readCMD(RDCVA, rxbuffer, CV_GROUP_A_SIZE); + module->cellVoltages[0] = rxbuffer[0] | (rxbuffer[1]<<8); + module->cellVoltages[1] = rxbuffer[2] | (rxbuffer[3]<<8); + module->cellVoltages[2] = rxbuffer[4] | (rxbuffer[5]<<8); + + readCMD(RDCVB, rxbuffer, CV_GROUP_A_SIZE); + module->cellVoltages[3] = rxbuffer[0] | (rxbuffer[1]<<8); + module->cellVoltages[4] = rxbuffer[2] | (rxbuffer[3]<<8); + module->cellVoltages[5] = rxbuffer[4] | (rxbuffer[5]<<8); + + readCMD(RDCVC, rxbuffer, CV_GROUP_A_SIZE); + module->cellVoltages[6] = rxbuffer[0] | (rxbuffer[1]<<8); + module->cellVoltages[7] = rxbuffer[2] | (rxbuffer[3]<<8); + module->cellVoltages[8] = rxbuffer[4] | (rxbuffer[5]<<8); + + readCMD(RDCVD, rxbuffer, CV_GROUP_A_SIZE); + module->cellVoltages[9] = rxbuffer[0] | (rxbuffer[1]<<8); + module->cellVoltages[10] = rxbuffer[2] | (rxbuffer[3]<<8); + module->cellVoltages[11] = rxbuffer[4] | (rxbuffer[5]<<8); + + readCMD(RDCVE, rxbuffer, CV_GROUP_A_SIZE); + module->cellVoltages[12] = rxbuffer[0] | (rxbuffer[1]<<8); + module->cellVoltages[13] = rxbuffer[2] | (rxbuffer[3]<<8); + module->cellVoltages[14] = rxbuffer[4] | (rxbuffer[5]<<8); + + readCMD(RDCVF, rxbuffer, CV_GROUP_A_SIZE); + module->cellVoltages[15] = rxbuffer[0] | (rxbuffer[1]<<8); + module->cellVoltages[16] = rxbuffer[2] | (rxbuffer[3]<<8); + module->cellVoltages[17] = rxbuffer[4] | (rxbuffer[5]<<8); + + return 0; +} diff --git a/BMS_Testbench/BMS_Software_V1/Core/Src/ADBMS_LL_Driver.c b/BMS_Testbench/BMS_Software_V1/Core/Src/ADBMS_LL_Driver.c new file mode 100644 index 0000000..0c0faeb --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Core/Src/ADBMS_LL_Driver.c @@ -0,0 +1,230 @@ +/* + * ADBMS_LL_Driver.c + * + * Created on: 05.06.2022 + * Author: max + */ +#include "ADBMS_LL_Driver.h" + + +#define INITAL_PEC 0x0010 +#define ADBMS_SPI_TIMEOUT 1000 //Timeout in ms + +SPI_HandleTypeDef* adbmsspi; + +uint8 adbmsDriverInit(SPI_HandleTypeDef* hspi) +{ + mcuAdbmsCSLow(); + HAL_Delay(1); + mcuAdbmsCSHigh(); + adbmsspi = hspi; + return 0; +} + +uint8 calculatePEC(uint8_t* data, uint8_t datalen) +{ + uint16 currentpec = INITAL_PEC; + if(datalen >= 3) + { + for(int i = 0; i < (datalen-2); i++) + { + for(int n = 0; n < 8;n++) + { + uint8 din = data[i] << (n); + currentpec = updatePEC(currentpec, din); + } + } + + data[datalen-2] = (currentpec>>7) & 0xFF; + data[datalen-1] = (currentpec<<1) & 0xFF; + return 0; + } + + else + { + return 1; + } +} + +uint8 checkPEC(uint8* data, uint8 datalen) +{ + if(datalen <= 3) + { + return 255; + } + + uint16 currentpec = INITAL_PEC; + + for(int i = 0; i < (datalen-2); i++) + { + for(int n = 0; n < 8;n++) + { + uint8 din = data[i] << (n); + currentpec = updatePEC(currentpec, din); + } + } + + uint8 pechigh = (currentpec>>7) & 0xFF; + uint8 peclow = (currentpec<<1) & 0xFF; + + if((pechigh == data[datalen-2]) && (peclow == data[datalen-1])) + { + return 0; + } + + return 1; + +} + +uint16 updatePEC(uint16 currentPEC, uint8 din) +{ + din = (din>>7) & 0x01; + uint8 in0 = din ^ ((currentPEC >> 14) &0x01); + uint8 in3 = in0 ^ ((currentPEC >> 2) &0x01); + uint8 in4 = in0 ^ ((currentPEC >> 3) &0x01); + uint8 in7 = in0 ^ ((currentPEC >> 6) &0x01); + uint8 in8 = in0 ^ ((currentPEC >> 7) &0x01); + uint8 in10 = in0 ^ ((currentPEC >> 9) &0x01); + uint8 in14 = in0 ^ ((currentPEC >> 13) &0x01); + + uint16 newPEC = 0; + + newPEC |= in14<<14; + newPEC |= (currentPEC & (0x01<<12))<<1; + newPEC |= (currentPEC & (0x01<<11))<<1; + newPEC |= (currentPEC & (0x01<<10))<<1; + newPEC |= in10<<10; + newPEC |= (currentPEC & (0x01<<8))<<1; + newPEC |= in8<<8; + newPEC |= in7<<7; + newPEC |= (currentPEC & (0x01<<5))<<1; + newPEC |= (currentPEC & (0x01<<4))<<1; + newPEC |= in4<<4; + newPEC |= in3<<3; + newPEC |= (currentPEC & (0x01<<1))<<1; + newPEC |= (currentPEC & (0x01))<<1; + newPEC |= in0; + + + return newPEC; +} + +uint8 writeCMD(uint16 command, uint8* args, uint8 arglen) +{ + if(arglen > 0) + { + uint8 buffer[6+arglen]; + buffer[0] = (command >> 8) & 0xFF; + buffer[1] = (command) & 0xFF; + calculatePEC(buffer, 4); + for(uint8 i = 0; i < arglen; i++) + { + buffer[4+i] = args[i]; + } + + calculatePEC(&buffer[4], arglen+2); //Calculate PEC of Data Part with offset of 4 Bytes for CMD and CMD PEC + + mcuAdbmsCSLow(); + mcuSPITransmit(buffer, 6+arglen); + mcuAdbmsCSHigh(); + + } + else + { + uint8 buffer[4]; + buffer[0] = (command >> 8) & 0xFF; + buffer[1] = (command) & 0xFF; + calculatePEC(buffer, 4); + + mcuAdbmsCSLow(); + + mcuSPITransmit(buffer, 4); + + mcuAdbmsCSHigh(); + } + + return 0; +} + +uint8 readCMD(uint16 command, uint8* buffer, uint8 buflen) +{ + //uint8* txbuffer = (uint8*) malloc(6+buflen); + //uint8* rxbuffer = (uint8*) malloc(6+buflen); + uint8 txbuffer[6+buflen]; + uint8 rxbuffer[6+buflen]; + + txbuffer[0] = (command >> 8) & 0xFF; + txbuffer[1] = (command) & 0xFF; + calculatePEC(txbuffer, 4); + + mcuAdbmsCSLow(); + mcuSPITransmitReceive(rxbuffer, txbuffer, 6+buflen); + mcuAdbmsCSHigh(); + + + for(uint8 i = 0; i 100) { + Error_Handler(); + } else { + return 1; + } + } + +} + +void mcuAdbmsCSLow() +{ + HAL_GPIO_WritePin(CSB_GPIO_Port, CSB_Pin, GPIO_PIN_RESET); +} + +void mcuAdbmsCSHigh() +{ + HAL_GPIO_WritePin(CSB_GPIO_Port, CSB_Pin, GPIO_PIN_SET); +} + +uint8 mcuSPITransmit(uint8* buffer, uint8 buffersize) +{ + HAL_StatusTypeDef status; + //status = HAL_SPI_Transmit(adbmsspi, buffer, buffersize, ADBMS_SPI_TIMEOUT); + //uint8 *rxbuf = (uint8*) malloc(buffersize); + uint8 rxbuf[buffersize]; + status = HAL_SPI_TransmitReceive(adbmsspi, buffer, rxbuf, buffersize, ADBMS_SPI_TIMEOUT); + __HAL_SPI_CLEAR_OVRFLAG(adbmsspi); + //free(rxbuf); + return status; +} + +uint8 mcuSPIReceive(uint8* buffer, uint8 buffersize) +{ + HAL_StatusTypeDef status; + status = HAL_SPI_Receive(adbmsspi, buffer, buffersize, ADBMS_SPI_TIMEOUT); + return status; +} + +uint8 mcuSPITransmitReceive(uint8* rxbuffer, uint8* txbuffer, uint8 buffersize) +{ + HAL_StatusTypeDef status; + status = HAL_SPI_TransmitReceive(adbmsspi, txbuffer, rxbuffer, buffersize, ADBMS_SPI_TIMEOUT); + return status; +} + +inline void mcuDelay(uint16 delay) +{ + HAL_Delay(delay); +} + + diff --git a/BMS_Testbench/BMS_Software_V1/Core/Src/AMS_CAN.c b/BMS_Testbench/BMS_Software_V1/Core/Src/AMS_CAN.c new file mode 100644 index 0000000..0fa145c --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Core/Src/AMS_CAN.c @@ -0,0 +1,193 @@ +/* + * AMS_CAN.c + * + * Created on: Mar 19, 2022 + * Author: jasper + */ + +#include "AMS_CAN.h" + +#include "ADBMS_Abstraction.h" + + +#include "common_defs.h" +#include "main.h" +#include "AMS_HighLevel.h" +#include "stm32f3xx.h" +#include "stm32f3xx_hal.h" +#include "stm32f3xx_hal_can.h" + +#include + +int PENDING_MESSAGE_HANDLE = 0; +uint8_t canTestData[8] = {0,0,0,0,0,0,0,0}; + + +CAN_HandleTypeDef* ams_can_handle; + +void ams_can_init(CAN_HandleTypeDef* ams_handle, + CAN_HandleTypeDef* car_handle) { + ams_can_handle = ams_handle; + + // Start peripheral + if (HAL_CAN_Start(ams_can_handle) != HAL_OK) { + ams_can_handle = car_handle; + if (HAL_CAN_Start(ams_can_handle) != HAL_OK) { + Error_Handler(); + } + } + + // Config filter + CAN_FilterTypeDef can_filter; + can_filter.FilterActivation = CAN_FILTER_ENABLE; + can_filter.FilterBank = 0; + can_filter.FilterFIFOAssignment = CAN_FILTER_FIFO0; + /* Message ID is in the MSBs of the FilterId register */ + can_filter.FilterIdHigh = CAN_ID_CLOCK_SYNC << (16 - 11); + can_filter.FilterIdLow = 0; + /* Filter the 11 MSBs (i.e. a StdId) */ + + if(BMS_IN_TEST_MODE == 1){ + can_filter.FilterMaskIdHigh = BMS_TEST_ID; // alleNachrichtenIds werden akzeptiert + }else{ + can_filter.FilterMaskIdHigh = 0xFFE0; + } + + can_filter.FilterMaskIdLow = 0; + can_filter.FilterMode = CAN_FILTERMODE_IDMASK; + can_filter.FilterScale = CAN_FILTERSCALE_32BIT; + can_filter.SlaveStartFilterBank = 0; + if (HAL_CAN_ConfigFilter(ams_can_handle, &can_filter) != HAL_OK) { + Error_Handler(); + } + can_filter.FilterBank++; + can_filter.FilterIdHigh = CAN_ID_MASTER_HEARTBEAT << (16 - 11); + can_filter.FilterIdLow = 0; + if (HAL_CAN_ConfigFilter(ams_can_handle, &can_filter) != HAL_OK) { + Error_Handler(); + } + + // Activate RX notifications + if (HAL_CAN_ActivateNotification(ams_can_handle, + CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK) { + Error_Handler(); + } +} + +static int cb_triggered = 0; + +void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef* handle) { + static CAN_RxHeaderTypeDef header; + static uint8_t data[8]; + cb_triggered = 1; + + if (HAL_CAN_GetRxMessage(handle, CAN_RX_FIFO0, &header, data) != HAL_OK) { + Error_Handler(); + } + + if (handle == ams_can_handle) { + ams_can_handle_ams_msg(&header, data); + } else { + Error_Handler(); + } +} + +void ams_can_handle_ams_msg(CAN_RxHeaderTypeDef* header, uint8_t* data) { + + if(BMS_IN_TEST_MODE == 1){ + PENDING_MESSAGE_HANDLE = 1; + for(int i = 0; i < 8; i++){ + canTestData[i] = data[i]; + } + return; + } + + + if (header->IDE != CAN_ID_STD) { + return; + } + + switch (header->StdId) { + case CAN_ID_CLOCK_SYNC: +// clock_sync_handle_clock_sync_frame(data[0]); + break; + case CAN_ID_MASTER_HEARTBEAT: +// clock_sync_handle_master_heartbeat(); + break; + } +} + +void ams_can_send_heartbeat() { + static CAN_TxHeaderTypeDef header; + static uint8_t data[8]; + + header.IDE = CAN_ID_STD; + header.DLC = 8; + header.RTR = CAN_RTR_DATA; + header.TransmitGlobalTime = DISABLE; + + // Send voltages + for (int msg_id = 0; msg_id < 5; msg_id++) { + header.StdId = CAN_ID_AMS_SLAVE_HEARTBEAT_BASE | (0 << 4) | msg_id; //TODO: Use slave_id/new format + for (int i = 0; i < 4; i++) { + int cell = msg_id * 4 + i; + uint16_t v = (cell < N_CELLS) ? module.cellVoltages[cell] : 0; + data[2 * i + 0] = v & 0xFF; + data[2 * i + 1] = v >> 8; + } + if (ams_can_wait_for_free_mailboxes(ams_can_handle, 1, + CAN_HEARTBEAT_TX_TIMEOUT) == HAL_OK) { + uint32_t mailbox; + HAL_CAN_AddTxMessage(ams_can_handle, &header, data, &mailbox); + } + } + + // Send temperatures + /*for (int temp_msg_id = 0; temp_msg_id < 8; temp_msg_id++) { + int msg_id = temp_msg_id + 3; + header.StdId = CAN_ID_AMS_SLAVE_HEARTBEAT_BASE | (slave_id << 4) | msg_id; + for (int i = 0; i < 4; i++) { + int sensor = temp_msg_id * 4 + i; + uint16_t temp = temperatures[sensor]; + data[2 * i + 0] = temp & 0xFF; + data[2 * i + 1] = temp >> 8; + } + if (ams_can_wait_for_free_mailboxes(ams_can_handle, 1, + CAN_HEARTBEAT_TX_TIMEOUT) == HAL_OK) { + uint32_t mailbox; + HAL_CAN_AddTxMessage(ams_can_handle, &header, data, &mailbox); + } + }*/ +} + +/*void ams_can_send_error(AMS_ErrorCode error_code, + uint32_t transmission_timeout) { + static CAN_TxHeaderTypeDef header; + header.IDE = CAN_ID_STD; + header.DLC = 8; + header.RTR = CAN_RTR_DATA; + header.TransmitGlobalTime = DISABLE; + header.StdId = CAN_ID_SLAVE_ERROR; + + static uint8_t data[8]; + data[0] = slave_id; + data[1] = error_code; + + HAL_CAN_AbortTxRequest(ams_can_handle, + CAN_TX_MAILBOX0 | CAN_TX_MAILBOX1 | CAN_TX_MAILBOX2); + uint32_t mailbox; + HAL_CAN_AddTxMessage(ams_can_handle, &header, data, &mailbox); + ams_can_wait_for_free_mailboxes(ams_can_handle, 3, transmission_timeout); +}*/ + +HAL_StatusTypeDef ams_can_wait_for_free_mailboxes(CAN_HandleTypeDef* handle, + int num_mailboxes, + uint32_t timeout) { + uint32_t end = HAL_GetTick() + timeout; + while (HAL_GetTick() < end) { + if (HAL_CAN_GetTxMailboxesFreeLevel(handle) >= num_mailboxes) { + return HAL_OK; + } + } + return HAL_TIMEOUT; +} diff --git a/BMS_Testbench/BMS_Software_V1/Core/Src/AMS_HighLevel.c b/BMS_Testbench/BMS_Software_V1/Core/Src/AMS_HighLevel.c new file mode 100644 index 0000000..a1aa56e --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Core/Src/AMS_HighLevel.c @@ -0,0 +1,304 @@ +/* + * AMS_HighLevel.c + * + * Created on: 20.07.2022 + * Author: max + */ + + +#include "AMS_HighLevel.h" + +Cell_Module module; +uint32_t balancedCells = 0; +uint8_t BalancingActive = 0; +uint8_t stateofcharge = 100; +int64_t currentintegrator = 0; +uint32_t lastticks = 0; +uint32_t currenttick = 0; +uint8_t eepromconfigured = 0; + +uint8_t internalbalancingalgo = 1; +uint16_t startbalancingthreshold = 41000; +uint16_t stopbalancingthreshold = 30000; +uint16_t balancingvoltagedelta = 10; + + +uint16_t amsuv = 0; +uint16_t amsov = 0; + +uint8_t amserrorcode = 0; +uint8_t amswarningcode = 0; + +uint8_t numberofCells = 17; +uint8_t numberofAux = 0; + + +amsState currentAMSState = AMSDEACTIVE; +amsState lastAMSState = AMSDEACTIVE; + +void AMS_Init(SPI_HandleTypeDef *hspi) +{ + if(eepromconfigured == 1) + { + /*amsov = eepromcellovervoltage>>4; + amsuv = (eepromcellundervoltage-1)>>4; + numberofCells = eepromnumofcells; + numberofAux = eepromnumofaux; + initAMS(hspi, eepromnumofcells, eepromnumofaux);*/ + amsConfigOverVoltage(amsov); + amsConfigUnderVoltage(amsuv); + } + else + { + initAMS(hspi, numberofCells, numberofAux); + amsov = DEFAULT_OV; + amsuv = DEFAULT_UV; + } + + + currentAMSState = AMSIDLE; + + +} + +void AMS_Loop() +{ + + //On Transition Functions called ones if the State Changed + + if(currentAMSState != lastAMSState) + { + switch(currentAMSState) + { + case AMSIDLE: + break; + case AMSDEACTIVE: + break; + case AMSCHARGING: + break; + case AMSIDLEBALANCING: + break; + case AMSDISCHARGING: + break; + case AMSWARNING: + writeWarningLog(0x01); + break; + case AMSERROR: + writeErrorLog(amserrorcode); + break; + } + lastAMSState = currentAMSState; + } + + //Main Loops for different AMS States + + switch(currentAMSState) + { + case AMSIDLE: + AMS_Idle_Loop(); + break; + case AMSDEACTIVE: + break; + case AMSCHARGING: + break; + case AMSIDLEBALANCING: + AMS_Idle_Loop(); + break; + case AMSDISCHARGING: + break; + case AMSWARNING: + AMS_Warning_Loop(); + break; + case AMSERROR: + break; + } +} + +uint8_t AMS_Idle_Loop() +{ + amsWakeUp(); + amsConfigOverVoltage(amsov); + amsConfigUnderVoltage(amsuv); + amsConfigAuxMeasurement(0xFFFF); + amsClearAux(); + amsCellMeasurement(&module); + amsInternalStatusMeasurement(&module); + amsAuxMeasurement(&module); + amsCheckUnderOverVoltage(&module); + integrateCurrent(); + + static uint32_t channelstobalance = 1; + + channelstobalance = 0x1FFFF; + /* if(channelstobalance & 0x20000){ + channelstobalance = 1; + }*/ + + amsConfigBalancing(channelstobalance); + amsStartBalancing(100); + + if((module.overVoltage | module.underVoltage)) + { + //amsSendWarning(); + // currentAMSState = AMSWARNING; + } + + // AMS_Balancing_Loop(); + + /* if(BalancingActive) + { + amsStartBalancing(100); + } + else + { + amsStopBalancing(); + }*/ + //amsConfigBalancing(balancedCells); + //volatile amscheck = amscheckOpenCellWire(&module); + return 0; +} + +uint8_t AMS_Warning_Loop() +{ + + amsWakeUp(); + amsConfigOverVoltage(amsov); + amsConfigUnderVoltage(amsuv); + amsConfigAuxMeasurement(0xFFFF); + amsClearAux(); + amsCellMeasurement(&module); + amsInternalStatusMeasurement(&module); + amsAuxMeasurement(&module); + amsCheckUnderOverVoltage(&module); + + if(!(module.overVoltage | module.underVoltage)) + { + currentAMSState = AMSIDLE; + amsClearWarning(); + } + amsStopBalancing(); + + return 0; +} + +uint8_t AMS_Error_Loop() +{ + return 0; +} + +uint8_t AMS_Charging_Loop() +{ + return 0; +} + +uint8_t AMS_Discharging_Loop() +{ + return 0; +} + +uint8_t AMS_Balancing_Loop() +{ + uint8_t balancingdone = 1; + if((eepromconfigured == 1) && (internalbalancingalgo == 1) && (module.internalDieTemp<28000/*Thermal Protection 93°C*/)) //If the EEPROM is configured and the internal Balancing Algorithm should be used + { + uint16_t highestcellvoltage = module.cellVoltages[0]; + uint16_t lowestcellvoltage = module.cellVoltages[0]; + uint8_t highestcell = 0; + uint8_t lowestcell = 0; + + for(uint8_t n = 0; n < numberofCells; n++) + { + if(module.cellVoltages[n] > highestcellvoltage) + { + highestcellvoltage = module.cellVoltages[n]; + highestcell = n; + } + if(module.cellVoltages[n] < lowestcellvoltage) + { + lowestcellvoltage = module.cellVoltages[n]; + lowestcell = n; + } + } + + if(currentAMSState == AMSCHARGING) //Balancing is only Active if the BMS is in Charging Mode + { + + uint32_t channelstobalance = 0; + + if(highestcellvoltage > startbalancingthreshold) + { + for(uint8_t n = 0; n < numberofCells; n++) + { + if(module.cellVoltages[n] > stopbalancingthreshold) + { + uint16_t dv = module.cellVoltages[n]-lowestcellvoltage; + if(dv > (balancingvoltagedelta*1000)) + { + balancingdone = 0; + channelstobalance |= 1< balancingvoltagedelta) + { + balancingdone = 0; + channelstobalance |= 1< +#include "ADBMS_Abstraction.h" +#include "main.h" + + +void canTestSendTemperatures(uint16_t* data){ + static CAN_TxHeaderTypeDef header; + + header.IDE = CAN_ID_STD; + header.DLC = 8; + header.RTR = CAN_RTR_DATA; + header.TransmitGlobalTime = DISABLE; + uint8_t buffer[24]; + uint8_t tmp[8]; + + for(int i = 0; i < 12; i++){ + buffer[((i*2)+1)] = data[i] >> 8; + buffer[(i*2)] = data[i]; + } + + for(int i = 0; i < 8; i++){ + tmp[i] = buffer[i]; + } + if (ams_can_wait_for_free_mailboxes(ams_can_handle, 1, CAN_HEARTBEAT_TX_TIMEOUT) == HAL_OK) { + uint32_t mailbox; + HAL_CAN_AddTxMessage(ams_can_handle, &header, tmp, &mailbox); + } + + int m = 0; + for(int i = 8; i < 16; i++){ + tmp[m] = buffer[i]; + m++; + } + + if (ams_can_wait_for_free_mailboxes(ams_can_handle, 1, CAN_HEARTBEAT_TX_TIMEOUT) == HAL_OK) { + uint32_t mailbox; + HAL_CAN_AddTxMessage(ams_can_handle, &header, tmp, &mailbox); + } + m = 0; + for(int i = 16; i < 24; i++){ + tmp[m] = buffer[i]; + m++; + } + + if (ams_can_wait_for_free_mailboxes(ams_can_handle, 1, CAN_HEARTBEAT_TX_TIMEOUT) == HAL_OK) { + uint32_t mailbox; + HAL_CAN_AddTxMessage(ams_can_handle, &header, tmp, &mailbox); + } +} + +void canTestSendAnswer(uint8_t* data){ + static CAN_TxHeaderTypeDef header; + + header.IDE = CAN_ID_STD; + header.DLC = 8; + header.RTR = CAN_RTR_DATA; + header.TransmitGlobalTime = DISABLE; + + if (ams_can_wait_for_free_mailboxes(ams_can_handle, 1, + CAN_HEARTBEAT_TX_TIMEOUT) == HAL_OK) { + uint32_t mailbox; + HAL_CAN_AddTxMessage(ams_can_handle, &header, data, &mailbox); + } +} + +void resetData(uint8_t* data){ + for(int i = 0; i < 8; i++){ + data[0] = 0; + } + +} +void readTemperatures(){ + uint8_t last_error = 0; + int N_SENSORS = 12; + uint16_t temperatures[N_SENSORS]; + for (int i = 0; i < N_SENSORS; i++) { + if (sensor_read(i, &temperatures[i]) != HAL_OK) { + sensor_init(i); + last_error = HAL_GetTick(); + } + } + canTestSendTemperatures(temperatures); +} + +void testLoop(uint8_t* data){ + uint8_t action = data[0]; + switch(action){ + case CAN_TEST: + HAL_Delay(100); + canTestSendAnswer(data); + break; + case VOLTAGE_TEST: + HAL_Delay(100); + amsReadCellVoltages(&module); + ams_can_send_heartbeat(); + break; + case TEMP_TEST: + HAL_Delay(1000); + readTemperatures(); + break; + case EPROM_TEST: + HAL_Delay(1000); + for(uint16_t i = 1; i < 9; i++ ){ + if(i == 4){ + writeeeprom(i*3, 0x42); + }else{ + writeeeprom(i*3, 0x69); + } + } + + HAL_Delay(1000); + for(uint16_t i = 1; i < 9; i++ ){ + data[i-1] = readeeprom(i*3); + } + canTestSendAnswer(data); + break; + case BALANCING_TEST: + HAL_Delay(1000); + for(int i = 0; i < 17; i++){ + amsConfigBalancing(0x00001<CCR1 = 0x01FF; +// HAL_TIM_Base_Start(&htim2); + /* USER CODE END 2 */ + + /* Infinite loop */ + /* USER CODE BEGIN WHILE */ + writeeeprom(1, 69); + uint16_t temperatures[N_SENSORS]; + AMS_Loop(); + while (1){ + if(BMS_IN_TEST_MODE == 1 ){ ////&& PENDING_MESSAGE_HANDLE == 1 + testLoop(&canTestData); + /* USER CODE END WHILE */ + /* USER CODE BEGIN 3 */ + + for (int i = 0; i < N_SENSORS; i++) { + if (sensor_read(i, &temperatures[i]) != HAL_OK) { + sensor_init(i); + last_error = HAL_GetTick(); + } + } + if(BMS_IN_TEST_MODE != 1){ + ams_can_send_heartbeat(); //for testing + } + } + } + + /* USER CODE END 3 */ +} + +/** + * @brief System Clock Configuration + * @retval None + */ +void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; + + /** Initializes the RCC Oscillators according to the specified parameters + * in the RCC_OscInitTypeDef structure. + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; + 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_HSE; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) + { + Error_Handler(); + } + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_I2C1|RCC_PERIPHCLK_I2C2; + PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_HSI; + PeriphClkInit.I2c2ClockSelection = RCC_I2C2CLKSOURCE_HSI; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) + { + Error_Handler(); + } +} + +/** + * @brief CAN Initialization Function + * @param None + * @retval None + */ +static void MX_CAN_Init(void) +{ + + /* USER CODE BEGIN CAN_Init 0 */ + + /* USER CODE END CAN_Init 0 */ + + /* USER CODE BEGIN CAN_Init 1 */ + + /* USER CODE END CAN_Init 1 */ + hcan.Instance = CAN; + hcan.Init.Prescaler = 2; + hcan.Init.Mode = CAN_MODE_NORMAL; + hcan.Init.SyncJumpWidth = CAN_SJW_1TQ; + hcan.Init.TimeSeg1 = CAN_BS1_13TQ; + hcan.Init.TimeSeg2 = CAN_BS2_2TQ; + hcan.Init.TimeTriggeredMode = DISABLE; + hcan.Init.AutoBusOff = ENABLE; + hcan.Init.AutoWakeUp = DISABLE; + hcan.Init.AutoRetransmission = ENABLE; + hcan.Init.ReceiveFifoLocked = DISABLE; + hcan.Init.TransmitFifoPriority = DISABLE; + if (HAL_CAN_Init(&hcan) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN CAN_Init 2 */ + + /* USER CODE END CAN_Init 2 */ + +} + +/** + * @brief I2C1 Initialization Function + * @param None + * @retval None + */ +static void MX_I2C1_Init(void) +{ + + /* USER CODE BEGIN I2C1_Init 0 */ + + /* USER CODE END I2C1_Init 0 */ + + /* USER CODE BEGIN I2C1_Init 1 */ + + /* USER CODE END I2C1_Init 1 */ + hi2c1.Instance = I2C1; + hi2c1.Init.Timing = 0x2000090E; + hi2c1.Init.OwnAddress1 = 0; + hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; + hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; + hi2c1.Init.OwnAddress2 = 0; + hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK; + hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; + hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; + if (HAL_I2C_Init(&hi2c1) != HAL_OK) + { + Error_Handler(); + } + + /** Configure Analogue filter + */ + if (HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK) + { + Error_Handler(); + } + + /** Configure Digital filter + */ + if (HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN I2C1_Init 2 */ + + /* USER CODE END I2C1_Init 2 */ + +} + +/** + * @brief I2C2 Initialization Function + * @param None + * @retval None + */ +static 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.Timing = 0x2000090E; + hi2c2.Init.OwnAddress1 = 0; + hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; + hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; + hi2c2.Init.OwnAddress2 = 0; + hi2c2.Init.OwnAddress2Masks = I2C_OA2_NOMASK; + hi2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; + hi2c2.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; + if (HAL_I2C_Init(&hi2c2) != HAL_OK) + { + Error_Handler(); + } + + /** Configure Analogue filter + */ + if (HAL_I2CEx_ConfigAnalogFilter(&hi2c2, I2C_ANALOGFILTER_ENABLE) != HAL_OK) + { + Error_Handler(); + } + + /** Configure Digital filter + */ + if (HAL_I2CEx_ConfigDigitalFilter(&hi2c2, 0) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN I2C2_Init 2 */ + + /* USER CODE END I2C2_Init 2 */ + +} + +/** + * @brief SPI1 Initialization Function + * @param None + * @retval None + */ +static 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 */ + /* SPI1 parameter configuration*/ + 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_LOW; + hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; + hspi1.Init.NSS = SPI_NSS_SOFT; + hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32; + hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi1.Init.TIMode = SPI_TIMODE_DISABLE; + hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi1.Init.CRCPolynomial = 7; + hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; + hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; + if (HAL_SPI_Init(&hspi1) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN SPI1_Init 2 */ + + /* USER CODE END SPI1_Init 2 */ + +} + +/** + * @brief GPIO Initialization Function + * @param None + * @retval None + */ +static void MX_GPIO_Init(void) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOF_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(GPIOA, CSB_Pin|Status_3_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(GPIOB, Status_0_Pin|Status_1_Pin|Status_2_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pins : CSB_Pin Status_3_Pin */ + GPIO_InitStruct.Pin = CSB_Pin|Status_3_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /*Configure GPIO pins : Status_0_Pin Status_1_Pin Status_2_Pin */ + GPIO_InitStruct.Pin = Status_0_Pin|Status_1_Pin|Status_2_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + +} + +/* USER CODE BEGIN 4 */ +HAL_StatusTypeDef sensor_init(int n) { + uint16_t addr = (0b1000000 | n) << 1; + uint8_t data[] = {0}; + return HAL_I2C_Master_Transmit(&hi2c1, addr, data, sizeof(data), 100); +} + +HAL_StatusTypeDef sensor_read(int n, uint16_t *res) { + uint16_t addr = (0b1000000 | n) << 1; + addr |= 1; // Read + uint8_t result[2]; + HAL_StatusTypeDef status = + HAL_I2C_Master_Receive(&hi2c1, addr, result, sizeof(result), 100); + if (status == HAL_OK) { + *res = (result[0] << 8) | result[1]; + } + return status; +} + +uint8_t readeeprom(uint16_t address){ + uint8_t data = 0; + //uint8_t* address2 = (uint8_t*) &address; + //HAL_I2C_Master_Transmit(&hi2c2, 0xA0, address2, 2, 1000); + //HAL_I2C_Master_Receive(&hi2c2, 0xA0, &data, 1, 1000); + HAL_I2C_Mem_Read(&hi2c2, 0xA0, address, 2, &data, 1 , 1000); + //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) + return data; +} + +void writeeeprom(uint16_t address, uint8_t data){ + HAL_I2C_Mem_Write(&hi2c2, 0xA0, address, 2, &data, 1, 1000); + HAL_Delay(5); +} +/* 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/BMS_Testbench/BMS_Software_V1/Core/Src/stm32f3xx_hal_msp.c b/BMS_Testbench/BMS_Software_V1/Core/Src/stm32f3xx_hal_msp.c new file mode 100644 index 0000000..d1d6933 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Core/Src/stm32f3xx_hal_msp.c @@ -0,0 +1,337 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32f3xx_hal_msp.c + * @brief This file provides code for the MSP Initialization + * and de-Initialization codes. + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN Define */ + +/* USER CODE END Define */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN Macro */ + +/* USER CODE END Macro */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* External functions --------------------------------------------------------*/ +/* USER CODE BEGIN ExternalFunctions */ + +/* USER CODE END ExternalFunctions */ + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ +/** + * Initializes the Global MSP. + */ +void HAL_MspInit(void) +{ + /* USER CODE BEGIN MspInit 0 */ + + /* USER CODE END MspInit 0 */ + + __HAL_RCC_SYSCFG_CLK_ENABLE(); + __HAL_RCC_PWR_CLK_ENABLE(); + + /* System interrupt init*/ + + /* USER CODE BEGIN MspInit 1 */ + + /* USER CODE END MspInit 1 */ +} + +/** +* @brief CAN MSP Initialization +* This function configures the hardware resources used in this example +* @param hcan: CAN handle pointer +* @retval None +*/ +void HAL_CAN_MspInit(CAN_HandleTypeDef* hcan) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(hcan->Instance==CAN) + { + /* USER CODE BEGIN CAN_MspInit 0 */ + + /* USER CODE END CAN_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_CAN1_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**CAN GPIO Configuration + PA11 ------> CAN_RX + PA12 ------> CAN_TX + */ + GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF9_CAN; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* CAN interrupt Init */ + HAL_NVIC_SetPriority(USB_LP_CAN_RX0_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(USB_LP_CAN_RX0_IRQn); + /* USER CODE BEGIN CAN_MspInit 1 */ + + /* USER CODE END CAN_MspInit 1 */ + } + +} + +/** +* @brief CAN MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hcan: CAN handle pointer +* @retval None +*/ +void HAL_CAN_MspDeInit(CAN_HandleTypeDef* hcan) +{ + if(hcan->Instance==CAN) + { + /* USER CODE BEGIN CAN_MspDeInit 0 */ + + /* USER CODE END CAN_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_CAN1_CLK_DISABLE(); + + /**CAN GPIO Configuration + PA11 ------> CAN_RX + PA12 ------> CAN_TX + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11|GPIO_PIN_12); + + /* CAN interrupt DeInit */ + HAL_NVIC_DisableIRQ(USB_LP_CAN_RX0_IRQn); + /* USER CODE BEGIN CAN_MspDeInit 1 */ + + /* USER CODE END CAN_MspDeInit 1 */ + } + +} + +/** +* @brief I2C MSP Initialization +* This function configures the hardware resources used in this example +* @param hi2c: I2C handle pointer +* @retval None +*/ +void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(hi2c->Instance==I2C1) + { + /* USER CODE BEGIN I2C1_MspInit 0 */ + + /* USER CODE END I2C1_MspInit 0 */ + + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + /**I2C1 GPIO Configuration + PA15 ------> I2C1_SCL + PB7 ------> I2C1_SDA + */ + GPIO_InitStruct.Pin = TMP_SCL_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; + HAL_GPIO_Init(TMP_SCL_GPIO_Port, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = TMP_SDA_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; + HAL_GPIO_Init(TMP_SDA_GPIO_Port, &GPIO_InitStruct); + + /* Peripheral clock enable */ + __HAL_RCC_I2C1_CLK_ENABLE(); + /* USER CODE BEGIN I2C1_MspInit 1 */ + + /* USER CODE END I2C1_MspInit 1 */ + } + else if(hi2c->Instance==I2C2) + { + /* USER CODE BEGIN I2C2_MspInit 0 */ + + /* USER CODE END I2C2_MspInit 0 */ + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**I2C2 GPIO Configuration + PA9 ------> I2C2_SCL + PA10 ------> I2C2_SDA + */ + GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10; + GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF4_I2C2; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* Peripheral clock enable */ + __HAL_RCC_I2C2_CLK_ENABLE(); + /* USER CODE BEGIN I2C2_MspInit 1 */ + + /* USER CODE END I2C2_MspInit 1 */ + } + +} + +/** +* @brief I2C MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hi2c: I2C handle pointer +* @retval None +*/ +void HAL_I2C_MspDeInit(I2C_HandleTypeDef* hi2c) +{ + if(hi2c->Instance==I2C1) + { + /* USER CODE BEGIN I2C1_MspDeInit 0 */ + + /* USER CODE END I2C1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_I2C1_CLK_DISABLE(); + + /**I2C1 GPIO Configuration + PA15 ------> I2C1_SCL + PB7 ------> I2C1_SDA + */ + HAL_GPIO_DeInit(TMP_SCL_GPIO_Port, TMP_SCL_Pin); + + HAL_GPIO_DeInit(TMP_SDA_GPIO_Port, TMP_SDA_Pin); + + /* USER CODE BEGIN I2C1_MspDeInit 1 */ + + /* USER CODE END I2C1_MspDeInit 1 */ + } + else if(hi2c->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 + PA9 ------> I2C2_SCL + PA10 ------> I2C2_SDA + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9); + + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_10); + + /* USER CODE BEGIN I2C2_MspDeInit 1 */ + + /* USER CODE END I2C2_MspDeInit 1 */ + } + +} + +/** +* @brief SPI MSP Initialization +* This function configures the hardware resources used in this example +* @param hspi: SPI handle pointer +* @retval None +*/ +void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(hspi->Instance==SPI1) + { + /* USER CODE BEGIN SPI1_MspInit 0 */ + + /* USER CODE END SPI1_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_SPI1_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**SPI1 GPIO Configuration + PA5 ------> SPI1_SCK + PA6 ------> SPI1_MISO + PA7 ------> SPI1_MOSI + */ + GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN SPI1_MspInit 1 */ + + /* USER CODE END SPI1_MspInit 1 */ + } + +} + +/** +* @brief SPI MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hspi: SPI handle pointer +* @retval None +*/ +void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi) +{ + if(hspi->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 + PA5 ------> SPI1_SCK + PA6 ------> SPI1_MISO + PA7 ------> SPI1_MOSI + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7); + + /* USER CODE BEGIN SPI1_MspDeInit 1 */ + + /* USER CODE END SPI1_MspDeInit 1 */ + } + +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/BMS_Testbench/BMS_Software_V1/Core/Src/stm32f3xx_it.c b/BMS_Testbench/BMS_Software_V1/Core/Src/stm32f3xx_it.c new file mode 100644 index 0000000..182abcb --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Core/Src/stm32f3xx_it.c @@ -0,0 +1,217 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32f3xx_it.c + * @brief Interrupt Service Routines. + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "stm32f3xx_it.h" +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/* External variables --------------------------------------------------------*/ +extern CAN_HandleTypeDef hcan; +/* 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 System service call via SWI instruction. + */ +void SVC_Handler(void) +{ + /* USER CODE BEGIN SVCall_IRQn 0 */ + + /* USER CODE END SVCall_IRQn 0 */ + /* USER CODE BEGIN SVCall_IRQn 1 */ + + /* USER CODE END SVCall_IRQn 1 */ +} + +/** + * @brief This function handles Debug monitor. + */ +void DebugMon_Handler(void) +{ + /* USER CODE BEGIN DebugMonitor_IRQn 0 */ + + /* USER CODE END DebugMonitor_IRQn 0 */ + /* USER CODE BEGIN DebugMonitor_IRQn 1 */ + + /* USER CODE END DebugMonitor_IRQn 1 */ +} + +/** + * @brief This function handles Pendable request for system service. + */ +void PendSV_Handler(void) +{ + /* USER CODE BEGIN PendSV_IRQn 0 */ + + /* USER CODE END PendSV_IRQn 0 */ + /* USER CODE BEGIN PendSV_IRQn 1 */ + + /* USER CODE END PendSV_IRQn 1 */ +} + +/** + * @brief This function handles System tick timer. + */ +void SysTick_Handler(void) +{ + /* USER CODE BEGIN SysTick_IRQn 0 */ + + /* USER CODE END SysTick_IRQn 0 */ + HAL_IncTick(); + /* USER CODE BEGIN SysTick_IRQn 1 */ + + /* USER CODE END SysTick_IRQn 1 */ +} + +/******************************************************************************/ +/* STM32F3xx 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_stm32f3xx.s). */ +/******************************************************************************/ + +/** + * @brief This function handles USB low priority or CAN_RX0 interrupts. + */ +void USB_LP_CAN_RX0_IRQHandler(void) +{ + /* USER CODE BEGIN USB_LP_CAN_RX0_IRQn 0 */ + + /* USER CODE END USB_LP_CAN_RX0_IRQn 0 */ + HAL_CAN_IRQHandler(&hcan); + /* USER CODE BEGIN USB_LP_CAN_RX0_IRQn 1 */ + + /* USER CODE END USB_LP_CAN_RX0_IRQn 1 */ +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/BMS_Testbench/BMS_Software_V1/Core/Src/syscalls.c b/BMS_Testbench/BMS_Software_V1/Core/Src/syscalls.c new file mode 100644 index 0000000..f4278b7 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Core/Src/syscalls.c @@ -0,0 +1,176 @@ +/** + ****************************************************************************** + * @file syscalls.c + * @author Auto-generated by STM32CubeIDE + * @brief STM32CubeIDE Minimal System calls file + * + * For more information about which c-functions + * need which of these lowlevel functions + * please consult the Newlib libc-manual + ****************************************************************************** + * @attention + * + * Copyright (c) 2020-2022 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/* Includes */ +#include +#include +#include +#include +#include +#include +#include +#include + + +/* Variables */ +extern int __io_putchar(int ch) __attribute__((weak)); +extern int __io_getchar(void) __attribute__((weak)); + + +char *__env[1] = { 0 }; +char **environ = __env; + + +/* Functions */ +void initialise_monitor_handles() +{ +} + +int _getpid(void) +{ + return 1; +} + +int _kill(int pid, int sig) +{ + (void)pid; + (void)sig; + errno = EINVAL; + return -1; +} + +void _exit (int status) +{ + _kill(status, -1); + while (1) {} /* Make sure we hang here */ +} + +__attribute__((weak)) int _read(int file, char *ptr, int len) +{ + (void)file; + int DataIdx; + + for (DataIdx = 0; DataIdx < len; DataIdx++) + { + *ptr++ = __io_getchar(); + } + + return len; +} + +__attribute__((weak)) int _write(int file, char *ptr, int len) +{ + (void)file; + int DataIdx; + + for (DataIdx = 0; DataIdx < len; DataIdx++) + { + __io_putchar(*ptr++); + } + return len; +} + +int _close(int file) +{ + (void)file; + return -1; +} + + +int _fstat(int file, struct stat *st) +{ + (void)file; + st->st_mode = S_IFCHR; + return 0; +} + +int _isatty(int file) +{ + (void)file; + return 1; +} + +int _lseek(int file, int ptr, int dir) +{ + (void)file; + (void)ptr; + (void)dir; + return 0; +} + +int _open(char *path, int flags, ...) +{ + (void)path; + (void)flags; + /* Pretend like we always fail */ + return -1; +} + +int _wait(int *status) +{ + (void)status; + errno = ECHILD; + return -1; +} + +int _unlink(char *name) +{ + (void)name; + errno = ENOENT; + return -1; +} + +int _times(struct tms *buf) +{ + (void)buf; + return -1; +} + +int _stat(char *file, struct stat *st) +{ + (void)file; + st->st_mode = S_IFCHR; + return 0; +} + +int _link(char *old, char *new) +{ + (void)old; + (void)new; + errno = EMLINK; + return -1; +} + +int _fork(void) +{ + errno = EAGAIN; + return -1; +} + +int _execve(char *name, char **argv, char **env) +{ + (void)name; + (void)argv; + (void)env; + errno = ENOMEM; + return -1; +} diff --git a/BMS_Testbench/BMS_Software_V1/Core/Src/sysmem.c b/BMS_Testbench/BMS_Software_V1/Core/Src/sysmem.c new file mode 100644 index 0000000..54081ac --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Core/Src/sysmem.c @@ -0,0 +1,79 @@ +/** + ****************************************************************************** + * @file sysmem.c + * @author Generated by STM32CubeIDE + * @brief STM32CubeIDE System Memory calls file + * + * For more information about which C functions + * need which of these lowlevel functions + * please consult the newlib libc manual + ****************************************************************************** + * @attention + * + * Copyright (c) 2022 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/* Includes */ +#include +#include + +/** + * Pointer to the current high watermark of the heap usage + */ +static uint8_t *__sbrk_heap_end = NULL; + +/** + * @brief _sbrk() allocates memory to the newlib heap and is used by malloc + * and others from the C library + * + * @verbatim + * ############################################################################ + * # .data # .bss # newlib heap # MSP stack # + * # # # # Reserved by _Min_Stack_Size # + * ############################################################################ + * ^-- RAM start ^-- _end _estack, RAM end --^ + * @endverbatim + * + * This implementation starts allocating at the '_end' linker symbol + * The '_Min_Stack_Size' linker symbol reserves a memory for the MSP stack + * The implementation considers '_estack' linker symbol to be RAM end + * NOTE: If the MSP stack, at any point during execution, grows larger than the + * reserved size, please increase the '_Min_Stack_Size'. + * + * @param incr Memory size + * @return Pointer to allocated memory + */ +void *_sbrk(ptrdiff_t incr) +{ + extern uint8_t _end; /* Symbol defined in the linker script */ + extern uint8_t _estack; /* Symbol defined in the linker script */ + extern uint32_t _Min_Stack_Size; /* Symbol defined in the linker script */ + const uint32_t stack_limit = (uint32_t)&_estack - (uint32_t)&_Min_Stack_Size; + const uint8_t *max_heap = (uint8_t *)stack_limit; + uint8_t *prev_heap_end; + + /* Initialize heap end at first call */ + if (NULL == __sbrk_heap_end) + { + __sbrk_heap_end = &_end; + } + + /* Protect heap from growing into the reserved MSP stack */ + if (__sbrk_heap_end + incr > max_heap) + { + errno = ENOMEM; + return (void *)-1; + } + + prev_heap_end = __sbrk_heap_end; + __sbrk_heap_end += incr; + + return (void *)prev_heap_end; +} diff --git a/BMS_Testbench/BMS_Software_V1/Core/Src/system_stm32f3xx.c b/BMS_Testbench/BMS_Software_V1/Core/Src/system_stm32f3xx.c new file mode 100644 index 0000000..495dd8d --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Core/Src/system_stm32f3xx.c @@ -0,0 +1,291 @@ +/** + ****************************************************************************** + * @file system_stm32f3xx.c + * @author MCD Application Team + * @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File. + * + * 1. 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_stm32f3xx.s" file. + * + * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used + * by the user application to setup the SysTick + * timer or configure other parameters. + * + * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must + * be called whenever the core clock is changed + * during program execution. + * + * 2. After each device reset the HSI (8 MHz) is used as system clock source. + * Then SystemInit() function is called, in "startup_stm32f3xx.s" file, to + * configure the system clock before to branch to main program. + * + * 3. This file configures the system clock as follows: + *============================================================================= + * Supported STM32F3xx device + *----------------------------------------------------------------------------- + * System Clock source | HSI + *----------------------------------------------------------------------------- + * SYSCLK(Hz) | 8000000 + *----------------------------------------------------------------------------- + * HCLK(Hz) | 8000000 + *----------------------------------------------------------------------------- + * AHB Prescaler | 1 + *----------------------------------------------------------------------------- + * APB2 Prescaler | 1 + *----------------------------------------------------------------------------- + * APB1 Prescaler | 1 + *----------------------------------------------------------------------------- + * USB Clock | DISABLE + *----------------------------------------------------------------------------- + *============================================================================= + ****************************************************************************** + * @attention + * + *

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

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f3xx_system + * @{ + */ + +/** @addtogroup STM32F3xx_System_Private_Includes + * @{ + */ + +#include "stm32f3xx.h" + +/** + * @} + */ + +/** @addtogroup STM32F3xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F3xx_System_Private_Defines + * @{ + */ +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)8000000) /*!< Default value of the External oscillator in Hz. + This value can be provided and adapted by the user application. */ +#endif /* HSE_VALUE */ + +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)8000000) /*!< Default value of the Internal oscillator in Hz. + This value can be provided and adapted by the user application. */ +#endif /* HSI_VALUE */ + +/* Note: Following vector table addresses must be defined in line with linker + configuration. */ +/*!< Uncomment the following line if you need to relocate the vector table + anywhere in Flash or Sram, else the vector table is kept at the automatic + remap of boot address selected */ +/* #define USER_VECT_TAB_ADDRESS */ + +#if defined(USER_VECT_TAB_ADDRESS) +/*!< Uncomment the following line if you need to relocate your vector Table + in Sram else user remap will be done in Flash. */ +/* #define VECT_TAB_SRAM */ +#if defined(VECT_TAB_SRAM) +#define VECT_TAB_BASE_ADDRESS SRAM_BASE /*!< Vector Table base address field. + This value must be a multiple of 0x200. */ +#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ +#else +#define VECT_TAB_BASE_ADDRESS FLASH_BASE /*!< Vector Table base address field. + This value must be a multiple of 0x200. */ +#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ +#endif /* VECT_TAB_SRAM */ +#endif /* USER_VECT_TAB_ADDRESS */ + +/******************************************************************************/ +/** + * @} + */ + +/** @addtogroup STM32F3xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F3xx_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 there is no need to + call the 2 first functions listed above, since SystemCoreClock variable is + updated automatically. + */ +uint32_t SystemCoreClock = 8000000; + +const uint8_t AHBPrescTable[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 STM32F3xx_System_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F3xx_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system + * @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 + + /* 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 stm32f3xx_hal.h file (default value + * 8 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (**) HSE_VALUE is a constant defined in stm32f3xx_hal.h file (default value + * 8 MHz), user has to ensure that HSE_VALUE is same as the real + * frequency of the crystal used. Otherwise, this function may + * have wrong result. + * + * - The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @param None + * @retval None + */ +void SystemCoreClockUpdate (void) +{ + uint32_t tmp = 0, pllmull = 0, pllsource = 0, predivfactor = 0; + + /* Get SYSCLK source -------------------------------------------------------*/ + tmp = RCC->CFGR & RCC_CFGR_SWS; + + switch (tmp) + { + case RCC_CFGR_SWS_HSI: /* HSI used as system clock */ + SystemCoreClock = HSI_VALUE; + break; + case RCC_CFGR_SWS_HSE: /* HSE used as system clock */ + SystemCoreClock = HSE_VALUE; + break; + case RCC_CFGR_SWS_PLL: /* PLL used as system clock */ + /* Get PLL clock source and multiplication factor ----------------------*/ + pllmull = RCC->CFGR & RCC_CFGR_PLLMUL; + pllsource = RCC->CFGR & RCC_CFGR_PLLSRC; + pllmull = ( pllmull >> 18) + 2; + +#if defined (STM32F302xE) || defined (STM32F303xE) || defined (STM32F398xx) + predivfactor = (RCC->CFGR2 & RCC_CFGR2_PREDIV) + 1; + if (pllsource == RCC_CFGR_PLLSRC_HSE_PREDIV) + { + /* HSE oscillator clock selected as PREDIV1 clock entry */ + SystemCoreClock = (HSE_VALUE / predivfactor) * pllmull; + } + else + { + /* HSI oscillator clock selected as PREDIV1 clock entry */ + SystemCoreClock = (HSI_VALUE / predivfactor) * pllmull; + } +#else + if (pllsource == RCC_CFGR_PLLSRC_HSI_DIV2) + { + /* HSI oscillator clock divided by 2 selected as PLL clock entry */ + SystemCoreClock = (HSI_VALUE >> 1) * pllmull; + } + else + { + predivfactor = (RCC->CFGR2 & RCC_CFGR2_PREDIV) + 1; + /* HSE oscillator clock selected as PREDIV1 clock entry */ + SystemCoreClock = (HSE_VALUE / predivfactor) * pllmull; + } +#endif /* STM32F302xE || STM32F303xE || STM32F398xx */ + break; + default: /* HSI used as system clock */ + SystemCoreClock = HSI_VALUE; + break; + } + /* Compute HCLK clock frequency ----------------*/ + /* Get HCLK prescaler */ + tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; + /* HCLK clock frequency */ + SystemCoreClock >>= tmp; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/BMS_Testbench/BMS_Software_V1/Core/Startup/startup_stm32f302cctx.s b/BMS_Testbench/BMS_Software_V1/Core/Startup/startup_stm32f302cctx.s new file mode 100644 index 0000000..d946fff --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Core/Startup/startup_stm32f302cctx.s @@ -0,0 +1,441 @@ +/** + ****************************************************************************** + * @file startup_stm32f302xc.s + * @author MCD Application Team + * @brief STM32F302xB/STM32F302xC devices vector table for GCC toolchain. + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR address, + * - Configure the clock system + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M4 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ****************************************************************************** + * @attention + * + *

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

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + + .syntax unified + .cpu cortex-m4 + .fpu softvfp + .thumb + +.global g_pfnVectors +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss + +.equ BootRAM, 0xF1E0F85F +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval : None +*/ + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + ldr sp, =_estack /* Atollic update: set stack pointer */ + +/* Copy the data segment initializers from flash to SRAM */ + ldr r0, =_sdata + ldr r1, =_edata + ldr r2, =_sidata + movs r3, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r4, [r2, r3] + str r4, [r0, r3] + adds r3, r3, #4 + +LoopCopyDataInit: + adds r4, r0, r3 + cmp r4, r1 + bcc CopyDataInit + +/* Zero fill the bss segment. */ + ldr r2, =_sbss + ldr r4, =_ebss + movs r3, #0 + b LoopFillZerobss + +FillZerobss: + str r3, [r2] + adds r2, r2, #4 + +LoopFillZerobss: + cmp r2, r4 + bcc FillZerobss + +/* Call the clock system intitialization function.*/ + bl SystemInit +/* Call static constructors */ + bl __libc_init_array +/* Call the application's entry point.*/ + bl main + +LoopForever: + b LoopForever + +.size Reset_Handler, .-Reset_Handler + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * + * @param None + * @retval : None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler +/****************************************************************************** +* +* The minimal vector table for a Cortex-M4. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +* +******************************************************************************/ + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + .size g_pfnVectors, .-g_pfnVectors + + +g_pfnVectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word MemManage_Handler + .word BusFault_Handler + .word UsageFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word DebugMon_Handler + .word 0 + .word PendSV_Handler + .word SysTick_Handler + .word WWDG_IRQHandler + .word PVD_IRQHandler + .word TAMP_STAMP_IRQHandler + .word RTC_WKUP_IRQHandler + .word FLASH_IRQHandler + .word RCC_IRQHandler + .word EXTI0_IRQHandler + .word EXTI1_IRQHandler + .word EXTI2_TSC_IRQHandler + .word EXTI3_IRQHandler + .word EXTI4_IRQHandler + .word DMA1_Channel1_IRQHandler + .word DMA1_Channel2_IRQHandler + .word DMA1_Channel3_IRQHandler + .word DMA1_Channel4_IRQHandler + .word DMA1_Channel5_IRQHandler + .word DMA1_Channel6_IRQHandler + .word DMA1_Channel7_IRQHandler + .word ADC1_2_IRQHandler + .word USB_HP_CAN_TX_IRQHandler + .word USB_LP_CAN_RX0_IRQHandler + .word CAN_RX1_IRQHandler + .word CAN_SCE_IRQHandler + .word EXTI9_5_IRQHandler + .word TIM1_BRK_TIM15_IRQHandler + .word TIM1_UP_TIM16_IRQHandler + .word TIM1_TRG_COM_TIM17_IRQHandler + .word TIM1_CC_IRQHandler + .word TIM2_IRQHandler + .word TIM3_IRQHandler + .word TIM4_IRQHandler + .word I2C1_EV_IRQHandler + .word I2C1_ER_IRQHandler + .word I2C2_EV_IRQHandler + .word I2C2_ER_IRQHandler + .word SPI1_IRQHandler + .word SPI2_IRQHandler + .word USART1_IRQHandler + .word USART2_IRQHandler + .word USART3_IRQHandler + .word EXTI15_10_IRQHandler + .word RTC_Alarm_IRQHandler + .word USBWakeUp_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word SPI3_IRQHandler + .word UART4_IRQHandler + .word UART5_IRQHandler + .word TIM6_DAC_IRQHandler + .word 0 + .word DMA2_Channel1_IRQHandler + .word DMA2_Channel2_IRQHandler + .word DMA2_Channel3_IRQHandler + .word DMA2_Channel4_IRQHandler + .word DMA2_Channel5_IRQHandler + .word 0 + .word 0 + .word 0 + .word COMP1_2_IRQHandler + .word COMP4_6_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word USB_HP_IRQHandler + .word USB_LP_IRQHandler + .word USBWakeUp_RMP_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word FPU_IRQHandler + +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + .weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler + + .weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak TAMP_STAMP_IRQHandler + .thumb_set TAMP_STAMP_IRQHandler,Default_Handler + + .weak RTC_WKUP_IRQHandler + .thumb_set RTC_WKUP_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler + + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler + + .weak EXTI2_TSC_IRQHandler + .thumb_set EXTI2_TSC_IRQHandler,Default_Handler + + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler + + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler + + .weak DMA1_Channel1_IRQHandler + .thumb_set DMA1_Channel1_IRQHandler,Default_Handler + + .weak DMA1_Channel2_IRQHandler + .thumb_set DMA1_Channel2_IRQHandler,Default_Handler + + .weak DMA1_Channel3_IRQHandler + .thumb_set DMA1_Channel3_IRQHandler,Default_Handler + + .weak DMA1_Channel4_IRQHandler + .thumb_set DMA1_Channel4_IRQHandler,Default_Handler + + .weak DMA1_Channel5_IRQHandler + .thumb_set DMA1_Channel5_IRQHandler,Default_Handler + + .weak DMA1_Channel6_IRQHandler + .thumb_set DMA1_Channel6_IRQHandler,Default_Handler + + .weak DMA1_Channel7_IRQHandler + .thumb_set DMA1_Channel7_IRQHandler,Default_Handler + + .weak ADC1_2_IRQHandler + .thumb_set ADC1_2_IRQHandler,Default_Handler + + .weak USB_HP_CAN_TX_IRQHandler + .thumb_set USB_HP_CAN_TX_IRQHandler,Default_Handler + + .weak USB_LP_CAN_RX0_IRQHandler + .thumb_set USB_LP_CAN_RX0_IRQHandler,Default_Handler + + .weak CAN_RX1_IRQHandler + .thumb_set CAN_RX1_IRQHandler,Default_Handler + + .weak CAN_SCE_IRQHandler + .thumb_set CAN_SCE_IRQHandler,Default_Handler + + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler + + .weak TIM1_BRK_TIM15_IRQHandler + .thumb_set TIM1_BRK_TIM15_IRQHandler,Default_Handler + + .weak TIM1_UP_TIM16_IRQHandler + .thumb_set TIM1_UP_TIM16_IRQHandler,Default_Handler + + .weak TIM1_TRG_COM_TIM17_IRQHandler + .thumb_set TIM1_TRG_COM_TIM17_IRQHandler,Default_Handler + + .weak TIM1_CC_IRQHandler + .thumb_set TIM1_CC_IRQHandler,Default_Handler + + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler + + .weak TIM3_IRQHandler + .thumb_set TIM3_IRQHandler,Default_Handler + + .weak TIM4_IRQHandler + .thumb_set TIM4_IRQHandler,Default_Handler + + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler + + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler + + .weak I2C2_EV_IRQHandler + .thumb_set I2C2_EV_IRQHandler,Default_Handler + + .weak I2C2_ER_IRQHandler + .thumb_set I2C2_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler + + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler + + .weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler + + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler + + .weak RTC_Alarm_IRQHandler + .thumb_set RTC_Alarm_IRQHandler,Default_Handler + + .weak USBWakeUp_IRQHandler + .thumb_set USBWakeUp_IRQHandler,Default_Handler + + .weak SPI3_IRQHandler + .thumb_set SPI3_IRQHandler,Default_Handler + + .weak UART4_IRQHandler + .thumb_set UART4_IRQHandler,Default_Handler + + .weak UART5_IRQHandler + .thumb_set UART5_IRQHandler,Default_Handler + + .weak TIM6_DAC_IRQHandler + .thumb_set TIM6_DAC_IRQHandler,Default_Handler + + .weak DMA2_Channel1_IRQHandler + .thumb_set DMA2_Channel1_IRQHandler,Default_Handler + + .weak DMA2_Channel2_IRQHandler + .thumb_set DMA2_Channel2_IRQHandler,Default_Handler + + .weak DMA2_Channel3_IRQHandler + .thumb_set DMA2_Channel3_IRQHandler,Default_Handler + + .weak DMA2_Channel4_IRQHandler + .thumb_set DMA2_Channel4_IRQHandler,Default_Handler + + .weak DMA2_Channel5_IRQHandler + .thumb_set DMA2_Channel5_IRQHandler,Default_Handler + + .weak COMP1_2_IRQHandler + .thumb_set COMP1_2_IRQHandler,Default_Handler + + .weak COMP4_6_IRQHandler + .thumb_set COMP4_6_IRQHandler,Default_Handler + + .weak USB_HP_IRQHandler + .thumb_set USB_HP_IRQHandler,Default_Handler + + .weak USB_LP_IRQHandler + .thumb_set USB_LP_IRQHandler,Default_Handler + + .weak USBWakeUp_RMP_IRQHandler + .thumb_set USBWakeUp_RMP_IRQHandler,Default_Handler + + .weak FPU_IRQHandler + .thumb_set FPU_IRQHandler,Default_Handler +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/BMS_Testbench/BMS_Software_V1/Debug/BMS_Software.elf b/BMS_Testbench/BMS_Software_V1/Debug/BMS_Software.elf new file mode 100755 index 0000000000000000000000000000000000000000..b53aa1676d96b00cfd03e3b27de98a854f563bd2 GIT binary patch literal 1084440 zcmeFZ3wTu3)jzz?oVlF2F_Xyv$xIR^nTTjm!$m~~Ya|$fV4;GRCfFuibOul(AchQ< z0a1ZheMM|*30kYRwY6S~+Nx2ZYF}*CHW6Df(HeX4UL6FRArr{=TYH~#GJ&A&`}KRi z|MxvR&oeV;t-bczYybA;?6vpWS$E#78bwi<@n>OU7*Us$GHoJ$D>wNWvohO67QxRL zR>%r?IuqX-M6`k>jM2xzl_+|;g{TPlS`ZKPu@eWWq`yFXB4d$G-1!jCO>Y8?kC{%1 zMmovMKZ$@uKq4R!kO)WwBmxoviGV~vA|Mfv2uK7Z0ulj=ya5sxwQp&WB2-9B2=Pi8xiq8l599`0<;2qZaZsaM%=fVH*=Y;>T zzFhl`uFuhQt}H!M`q4atZ{#)74f=S$hTPHlNuGHA$8EEs%@dxq*5?1hI{o1TETu%F zP5x&J7>kh1i;J12J+9V)+bq6IbDna|Xuo|y=p zr{g1Z#%kyOp6{rY1y-J7Y37`nXBb?OkhI)~5|y5U$|bvGEAe9+_^LeusehC)hU zGW+124J^HcBUNf5<%g!f^&N{;=Z(kKFLdJ&Hr;606o95(LulH5iC9TcT+dRwY-oP^yRY z63z9R^&v}tGRRUIWkBL8R>n$CLh2nnRg9a|2i?tZe%d`tDr9qS#q zhAm_T=xa{uZab#r?A64}Ex8RPZ@>J|wQcJ>6BJlzl-+sxlY@AjOWII++cjA3MQ+5#MKN&QSQTxYgXvVAh zEPxsB4xXyF|6^!>*ziovB^hh7>HL9NPmER;$7&#?4zk%dLFJQYS@ptD9e00+L*dNVq$TnLl&O{H5H5PSa1UBS%#}X~^{AuB4jMcaW zeLTCOw!Zs~GhV>j}d)rGfAeogYK(Y@y+~l?4L3!J*?P5devJT2+lwcXmy>|P~?B@JxAhEfirU<=I%!;Rc zkggVOeO80f)~w>2?aOLPYLaWdUtC)fYjoAH=&d#1ubG`@7JSs%AO2RY{&4=v*&n`W zp|oI4v6=P}tNw7_%D*sojblQW*2NzDNcAqOVKj31TeWj%HjdG;iGJ&vtfiTFe^2ER zwAj_I?(DUbFvJh`}nt`mP1<2KVn5B1T44S2Xk37$1Xucp! zo_Rlg9T1uQU%dA}*^ph2-oKJ#kt8gV3#q=78&hjUg=ia*CF^|qQ; z6OGv)z67M|fYk3S#~{*}HA!D~EM|58t6;`hGI*p0*~jWkINkC}jer<0+C%ZlC(m-edx8kQ``( z*29i14=X0`ea@rax%m-`?nzNQ9BOvgD6wSYOFLQF9W`5XkRIrhlvY$T z+)Nv)Pg)*en8E$E1@UZi>(1E+TUM~!CMVX!t?462P^Xnx9W^*nn{d1<-qv8}Ppx=r zi)WKm8>6=v@0U%mGSl#6Lq1lcPSU!@(Apb+5?c3?)~mDE8gBq2pT2@kWj7VnDCx5g zv0eIm3-7m^_&e*YhEw@FZ7ggcnP66}VHKYCF*9R$)19buot&$*v-F`OO0;buMii~^ z8mmwbdc)Csg+-J2#1<;iB&9DbKwgXl3%%u(bV)DiB@O$IWbuB>HqJiCR*Kx-L6S~W z^7$hUq*ySr6nJGu{wI#GU6uSjH_P-}n;VAJDrF&j51YwKo8wB_+Goh$eZ&PVE%EJB ztsV9m_UZ6iGDwN5b9UGyQYUu9H#wX+LTiEQHnZ>WG2IIhd zXQ$s{yV$OvIq$JuRnRpJpVZ^@E*@KpHF?9ywOU!I@gzKV0$ElTx|%Sn>P{xA5AI$R zswu05mkuN&;Iy*IiTr7_BJfvO-z-L%<1_h{4C{&H`dFf#wQTO#SunF>UJ~PS`%dC0 z6FPPV!4a#6SVFDndMgh#caDTG7Vq zAXX4;S2JwC1D{**5jayls1LR@C}~f|QiGMyv}B{!odMbfSxZeD5LWiGs2$k$^&>s8 zZEAX-YOYEK)>MJoaI;e3>VS3Vm;F5@y?*`an}>Ye!;m^`W}vySra6A3XLG++i(QPe zP|8t@U5tgHltwMxWVD^8u!sjA7d{NO`ta+=hsOH}wV~z{pl$oqXnPrc?G@pD$~_lm zqG`74?0lvj{W%G|arlt;^^=UPdnED@at~(Mt^jo5(*#Qg>A4Q_SK&jy*XY03>c1@Q z&k!2kjEe7R8MGdHN$MH0FAtw#x}8UQs``iP2;6Zfs6Xw?&~8nC&l#Eio+l6arXT5v z^$)}M-}*iHp4IQ3-rsWo^X$@$v(_~;)IhT%q50L!;z)nb-TbYSdd9$p+R}f?l%w=h$v^A&;yZwnVN1qUyZv%!ZP(@b)vUtW zA=;zAXZ4}}o>h9OY*%i%ygeSf4*dtS)K&C0^q370M17ePL)$aWOD~OLQ+Ib(TPJ8Y1 zAF$0-{xk1Cavj@c1^x^l!X|@H>hat7xc>$pt@HV4y_k>Ii;U5_xVSsH9HS3?Ka3Rz zcC0`t6JFgpeL`%Sni)IRNDXbGr(8b9+2Z7Kcg3II!Wdud?RM-hvc#6tjN;fI>!*B=ja1C6|qa zUP9ln_dPyeYaI@*SL1qB=pBQxG@Z}hm@k37m|MjDqMzgL-M(9)fp^(xS#D3yN_cHo%$S3bGNOVc0+RK>wg|KUt=Y3F3oStYVN=qE4#{rTu0(7 zOWGR7AGHFlP^v!+t}IiC@2|mLsJ?1-gYREyQ6|*Xv)r|*GNE3pXGzTK$;Ke&bL>m4y8wAv?T{JUe1-YK)QL?qU0ee}^ zv~Q%utQG9Dttn$}J3NwU?gFM2<5Pjp1Nbb)oObqM(l)(6*-g|LhtI*7z853?!M+vU zSfgNvW9;Gno;Cf;bn1k|3Vg;9-PtWx^t|3J`KVj|w5j}U@_MhM+u$TP=l8wYE$C?* zvRkx@zrP{$S)rkAgTMPJJul6scl9bYZCeI>S3FN>+t7wwAH6~LWsX$n<^R2p-iH2e zr7V^pueqS+NYC4cU6CU_>z5P8;^aa3)_S2eac=zO*HuM9G)0!us z@m;Rb(N53Lp|o#8uN8XRptr5D4SL^w>+SdA7R=xHOhf+`>xvz)*|C4RItIIt1vS?6 z^23h(6S3nSYN%`2-q6_)YK+xP)YHCsSdF$Vo_#PiA-fnYvcwKcN4oagfqo>x2jU=>zHKK!Nvb&WLcL#sV_$JecPk=$x0o;z1N zh<}Y8-*wkmv4+cWr$e0QR3@D~o7uA~o|tH$dOu~O%BOS;13tOdsg&gCX&B`=xnT25upV^zbPV%_n- zFaI%9_j!8xADQ)>qL+V)DKkMY{|PF8{;}oHKDc3pfxrmh+r6-pV;^cH?CVf_tie}o zNBtu}VHih&X56}kZhUWF=&W^=buQG1zsQbRxo(kdx|;sXY-6lGfIQx#=$EWg0roVG zXkQpP8jN0ea&3L$q?y$RQ|jEt6Y;F#i9DThJV(K26XrISaz2}o#GF=w=VFqN&TR|} zdGxawX7JeuH(fx-d(CfZ*hOt%t`%&?4o?eo?C9tWUrHo%2(8=O+^wW7XNl0PMj`x)Ag5LMyyu(r?&x;-M5Q z9$F%bHW_)S6!ni#nfZGgO9%@*5f-O*6JBB1by7zG${eZNHC(q#$7Rv+w2Kk)9y|!% zZWx(*yXj-p@U+opnBR=?L37O)wckkCGp1uC`o##sW9~N0x#%N!BAfGIn_stcSdN|D zKr6TPY)7@;?U-%!*1}xF+Y0^i$a|?T_-4C|ok)^8E`@gnOW(q0GkSkm@O~*eEao

&w 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�HSkL3}3nwor8 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Πyy#3kXjHcyQ4bl(%i-azkzGAv88%V|A{H0c@0sAdS%Me9on)0$e&r17 zgK;n&$#S>^EAgz(E#OjENe;MzS6M42!Db$-gl?&P*2JAKUBFsM?b(H_9XDaDi1o*1 z7%OIdLOZ+?)+gfuFJ&#HRlbfjc`0l*u?#Ll*urYx2V>7!2aGWGl65f_WPrt{CYwRl z89(?NV#%nf?k%e&6o6sYAJjSJ!oENk*_F+xfr=a3RR+$Tog@J9VDsGo_hi?fMo3=l zWltgWX1h`W#D_hXTHbuwNhS!;pPkBp%>cIP1PBA!$M*wwlD&$OoE`eQ2 zYt|+9d=I!yWQWfNE}1>K8e=JJ{dSC{vUlwQNn>l@W9%~9l?T`x9#bi2f9`;gD%dvE zuXl@mDhRW^&6cvDd54{R4l0f8!}So}W#4=NVH3NL1>rsRa!PDAvm>b1_<-GW0yZDA zzq$g=N9>aS5PS>!A1cDNvgiB5dmDQW?HV4lw@$%W7yIvnFxJgJrpDMywr(f5SL{K0 z8eg+xD52fMUPF7xUbcw}fIhar3S<53@PiNzuwy6>JIFS@0y4xdvcMePvIozA46_wf zI2mD2#O20^Z^Dm2-m$wjtd&5;-9 z6M7N(a3*v?)0Y!j1kR5mqbumoSw>aK0M6&fH2qAjI>J$?Nx&^!o@$ff85rv|d1VdU zh>1UCg&a(8s9?<5bp8RrJx!Bn8TB=l+yOkw)PQokNv0dWf`{v-`zTX!!?Z0Fnw6$$ z)IQ?CTZY8#|8`gsB^UM<)-f>cjdtGyfnPJA!qQDfb}5WjF!U=CMIGatqcGFJsGyDP z9mZLD{oZ4|a)z}+1NA(pR2iht2B6lUb&08_|$AcKFZ z3UO9*k5Q7nhU?Rcu_msW5hAD1oE^Vk5*NWQNF;>_mP4TBW&d3#``m9O^&Y3DmqZt4|ZLw}V) ze*P;M8{)6&0&bXpkJ7*+{C|G}Zj?W=?f=-j4!|gi?w{GYxyvP&o=bs1E+KTdyMzED zX%q`7fPxUZlu(o=gkq-)QbYl<0D`Dks0xBuz>bQFf{FqnAc_S9DPraSd$YHDJrwc# z@cRej?(LK}+Tit9U=@=vQd|u8+R{eSqE&J&!z;y%1e@3t(=H z{`x^=*cwwt2g)5Wo#@=OD`o+yMjwdb!}0nnCbSViPl=753n+(TZ;eB~qp`2dM%?1K zF&h!LB(81*KtCFH_g=gniyO8BagWEv^+U=h;!YezCHBXiB(tvrac|v$xUb`uS4GN$ zaoHs6`X+7=8Pa?kSL0hJHCF5d--=1bU1G5awIttSN}@H z{S zD{Ffa2JEwLdJ|v!t!*|S$pPzX;>3MzeRBe;bkKT&NXKuiBbp=0A?qF4DB(Nn4kJK+ zZ+(@_%zm&=tcN5&T3;if+F|Q&pQ6u>SXW(xxF-^}97Db*6TWPOuT=>xK0@4@gqdxT z^7VwRq|y6k!Z@0##}dYUiX_JqZoMDC-cNdh)Q&z$N(@8bPf7iA@iifN`yRaRO+NS* z@;#W`^LKnbog7K$`{$Bx`Up_oNIpTXC_YF&@+ca%GxZqwY+VklSs!iRH^G8OGL&_9 zbK=%AnyJ)4q(X0I>zAmsXGPvY5olK`AP?H&TmzMU4M+~%;xfgQ-f z*L1dS0ODq_J8PgKGg%E2Am7g#&^dBGYkoCSKEN7B1ITjL=`xhPmUXxa`Cej+$WG@C zb_3yQE89h!x=-2nbph-%*6u?D?qt`#515~`4s!wX3)YfO$-CHtpW|ycn?D#C_OQVu zpZSvYpw$7ZF)^FJVj)D?>|?)>h+{wN*B9j-V87By^lNrCNt_O{Ih~R68+L@uZoXw( zQjy^hdv_*)9c5p21L&XGF&b7U+2+d;I6;}%8%d@pv!NZRZc6b)Pd0szSX!6mq$6pw zV}&T;^51qLq{g^{)UxtKwCF-TEuadv&|x$kj%vjgZ3DcH}B* z^B_WsA0{QDl1aB9{Wb0AOn2>Fp8!th??)n6DGNn-m&tVe>{{b(l-TX6Ou)asHMOC4 zy;=zGQ#}OFzWWLQtzVa2_+9oZ$?*EWHUZEE)FRUI#_A;h8+`RXJcrb44G2S9UJGc$ zR?)$z`~#91jXDk1ju?HS6GFy}{~YxkoA(JqZr=?SjJRVg$<6KzC067(w(bGECbMx@ z1JV?BE3upIV%PTq#2Ks`_3}(Mk5-Ubtlb|7yoc=tS4PZXCfXz(U`=U^E@GSBK-{D3 zO|txaj4fP<0^SLK@O{PA=i*s}cU!s>S-M+p!n4P&bkwTnt}^8A^)_iiT_1T9K=h6w z{!^bEVtn+q(_HR%7bzi>9Vg|3{_i`GcfjfX$Te_jBw`13dkS!Fu-lO9#>=ZB<=|!1 z=fggPqLnD0aT$J(>JyK)kKJ+&(%&9Q^yeL&UIU!*Y{NtVn!>u1_3AWs`$@d+WwQ?< zZXVl3+|fta@EeeKDZ7!FN6)bODM+%CUET+Q&#_~~=2_3`-iX)Bti~9W^)7piq*Cv( zhiK+)W#fmT8avoZ+NnNa(NppDDRa`<^)uFN8@|3`Tlxa@KK9-b)MY>0@d%(CU``4= z$od=w=x^C-fv+jbTQ+34OUbyvC64Ze_u(-AmZ*-t{ydld&! zFZU@wrQvIi!f!{z<|_AE@b#e5xgp{fDOn#O!($2?fi}PB9~?9{<9| zlW6ud8`umfe`PZsLf~)gZCaatXDdm~?GN_Gn|S@n_GhC?f3f7%NOFdSk3zBIl)Db0 zDdUyfNys@t`QlXsPE_U=BjqIJk*`qDWaZXh@ij%ct}jZzOS!HPwVtZnaRk;J&8bD7dhiHLWp>#NklrJei63cdra)89yI}}rM#O+pY zt;JpQ@=OGZZ2GYQl`0(gJizp5wHq}X-o6>ar?LI{2zr2BQw0ZB;(gEO9Ue!-gS>AE zUJJQ_n0<@+ZExUfDS!SM)M^<&O_H%^_{`b(TFLhpx!A1<(|<%j*OeB;c3<-(TGeyr zDTG{~H62~qC$1^NZ!F$`nhd^$Wa*>KBq1Gr8<~TSN&gVBV_#f@>WpKN#7`K{?v6(8 zY3#XskoazP7f}fJF=qifVGe8Z6;eLTeh5Y20v7rNl03#1keuXkc7!<9D_9)KURJUz zXoXnCZfS?F^~^jBWo}>tNYL>Dd%r2#wUIU61DG$ea65p##EefM$;)iUZAkJ8c%Ud~ z6YD?+pv`Q=Hl%!&T~GRaudzSw#MkTWi~Y#(2K!J!$~W23)p)(d7Q_J9+bnGqirvDD z522uU*h54Bzst_h0{>i>*#`fYUZa^-X}zE&s=uSJrT%A5}9z2}s}W03MCr8DskUseWw zhS!_QuE|L9mQuDGFyB^Ml7wZ8(kuiTZ+KlN|W8l zzDKD-Cb3^CcML?ny~-*JQhuczsfJ4IQ`UDt+yyf>%TV4a zrD{65?ib}TB4k?uA}%`#`l(^^i_O3&CAt%`AWPtaN``5@B-%~rhSzk zpcD6NybX!OU*~IYN3mP^+7LAJeLndxfPKIpq3z^D-i-9sxADU>0Qw`o@ku24m`{BV zZP?DYEJ8s$`1Az;_6gsXizJ`&E9N8nXT00f0KJo!5jFHV|6~cO`vpI^9>8|-k9s0- zH(wEtz&*S(ZC_vUH#Pz0K7NQ~E&KV#jtD%!_Yvdz8{U=pOW*SLA0o*iK9;ntzvF$0 z{{5c!&&TU9Z@w9UNBFmmk?$vNn1PhP^6A9T|AY6VZTnCD{t~?Y;x?K*XZUzJc8oLZ zs)>~24L8id*CfO2L8$y>!!|lEPBrXYh`LNO>?R$nyA9W61K4!KyesjVVfc=ej~+L) zB97TA!+@>Gu)$FG1_W+4Ypt5JB4^)VEa_v&UerRCLhSZba24XSwMdkKJcb*B`hFLY+0xZ)_% z=k2(WNX*h>#OoQ{jrORw7~6nsAFu^<)cBAcq_5p@;Gt3rYY~oqV0DpT}cOLy7E^lDltR(j5>CvGHe}Qvy`k>0CtZu zcotr>mBhZtcdt_CDx|zm>Hi5p&ruTSKsr}>yf%P6qm;aal*^SY+Ba4!#)pt{jq+wa zCf@? ziZVYO88#`;bqDCTm5+W!9k(cTq7b)D84(81A1RYMpuCTjp|l=tSE6aN*r6m{i6oyW z&z!*PQ>Aw|B>7A^PF32g?C**;e5HId5rK!4W;8axQ}&Rw`Iut)93}j$bh6^>H)YC~ zDE4<{!hBR|A}^=jo5T;%B%I9GBp}~Re&klXX7Ny(y!Y^&B}g)xb0X~@=A*wsc?U7#&!=uKc^k@05*?2w2=NBO5THY)gaqIZ04-oh~Pt8Lm z*7Gj!Am0Xl`CioXW1daY-vj&}I{zK#b!n_jGgm zcpVe9rXte`QAVWVFJd$y52_1`(V63njT$0ws$o`b^ zlP@$L&fXCS&-{5Ra%LU-9nVI+??95~bB3duIY(%vYrR-OJFciU0l!P$`U}6?PNO4Z zrx@aabiR}5nbLR2(?gfYTaoML0Y4+lC4lxTC7EDZ z&y`5izxi=gY(RrSh#lB)FrI_%p*?x1m8g<=Y&LO`9%co^-dn;-!x6ZQDNRtr73?G( z9-m`M6zcE-`*IJmZDI$mL*Scic{hN4k6o*t58j%J?4Pkbk{|40O9_?7*|@I(yxz)ck3!b>*}Rd+`T@I=n4}-Fv8NHZjVTTB`iNa!4Mpx| zuMkbQhZ!G7%7d)qCVYLv_8mjxzh!+U;p->X=UEhal&!fNppUURq#N=xd$S(`kFyL? z3OT`^$VW3yvfNt$`V@P54wC%BzP%YRPqVkWBFV38;WhaBjqPrPe802RvrxiBWlTIu zn51;BkFOcZh&a4vD$NC6^OU+of5DwGajEAk53R%N5oO3}09&l|{1{N4R1Vcc%BPgN z#MXXVdGZXBJcC^vam$r)YtZNwO87OX(n{sa`FO2T4%S56dgVu2cs3{ws?ug9`ASsx zRpsEXsLMM_TcTj!RT8d4hEJ7GuSDQyO6xC>VW)Bf9gYtw@fm>fjZ*Car2JMn_7lE- zQXbj~U`Lgt@knw^*-N~xUzI;!z}Ig|YCDwhyYlWl0Q*DPM6BySl@~`M`(H{`V!EAC zo}dvmju(-nYdkL}qv#2|&V6XZbiV#_1kT`RGEvY>-i3T;%;MYWz&D?dxf@>(@I#Lw z!-M=vI>0={_a4Vix(t*U+saUW*OuZUB^Jh5>ZMUvIcO9(4#%BgG6KyzP*iGBk4~FV5 zAn>?hEt&rRZn(S(K#vz$zoDRMV%=T%S|E0kXzVd@&q#bN7vIrwZJqe5H(oD`tDeT| zJ<){NmfOXtpHccQvF9y-J|H432>el$)4F^@Jb$BW*=w-12g>R&j&w{q-SjRZJGUi; ziqZj5$kx9m4eo)pAI9^BY9x3a`~;B%L!GxHcK8k=utuETjOQvgmS*l7tj`!!>}~c} z6M*`hO`ws#U3qIQ0DPw0Vg`g=$~}J~Zm%*6N`TnPHZ=#R*}OSviQmgx5X?uM7?uApL{F6R`Tfnc&*|owA($$qiJ%i;mH|aM@03B zsP$iBMKoYOZ2Xc^E;3qai+|Pl?Ez%}()dCn7waKsKPAqsO&p25{f&_{fA|ylUC?VY za<};FWjtFhpq^^=D!Hg^JvIxmSG1!O-IX;@AmpmCq_BSV*9>{v9G+%YcUbe!q~jd^ z&K5wo^f`=l5g859j>tJrA%Aq}muO*3@#hGS-CrBexQ?{7#czBLPpji{JQJ4^J&-h{ zE$W?o84=c1=Dd$*N?{YUvf33ygr$B%h61+FHshIg3k`?#`^r&bjXI+PjIrT#MF9yj>?MwHUZAM&kG7Pqf1C=G)@&%z2CU(A>wq zLn(RJkytt3yc@sUj3CKj;qgiMUGz0=(8ZlU2K;t>2zsOI?|bmO+mzSw?0$L$YSLpD z@tS)si$(fg_s&K5^$W%!WWZu#ybT+hhEj&VN-%GWAeP4MT^OEsRBwimJ5Le~HjYjD z35mwDk{x(KKt>GX8Eist#LZ;c#NC+1EF>enhb0krb~f8VXY>2m{(}HDm&KhzYv-{{ znpyX=bfWU+vte{@e}H|`7;z7>b;I!W5UWZ|qlZ~n0=AH~q5W+Ud$1>peT1DPPRnAp znv`@OWfsyoUCKJy@Oq5xBpv<789$5+Pq164kC(BW-FQ94>d;Z=X=dn!x;(?)BW=g! z>{*)gD_8^(vnyGbj`&)|P7v2%H7g|Q@mbdGJ@nFZY{_kiTg#5pLa>gFT#c{wY!;aa zZ(!SZpe`@4(Ik!7$d=4Sh8Nj^XV9XT*d82_B*_?c&CLKC{o2i_Moa_=h~qj!o*?3X zX)5V8<$cU#(_f%7cnISrvuU&iKcm7$q5=UouO226@4)KCt6NM{DCTVzAreMkjgV?W zB-%!s5fy3L10Z|?Gnm4mkjxi=H?g?*5n-}gj*D0TsYGd!b4+4LUtQu zOo=l!LVAPgI{7?6PaY9($_AI*z$3Y-DcEoZ(-L}$h=u@S;Q3b5I4GlhCW6Xy9p02$#C8pdMCekhOAP#zx$<<^Q(p5Tr0L=ELhJ}6K2LwS{eD7O&G zt7<4u354=$Zj@KoP@d{WxlKoTnuhXpAC%Y7QEt*vo}r<Jq%rY)F>;h}P78@Q!`DIF&zgX#Dqlpvy^skclS8DXGl zZ!Z3x27}pPps|A0VjBjBh+l(HVf~GMC#2Cc(Q*XOut^`Tee z;tf5MHuUOMH1sgO>U)kaIf|5|dLH9|R-83ISFSido6Ns{#o^IsS!+xypQIJX9B$es ze}rjEkHxO83}$ZY6}Qf36*j&Ysd}LkPD(lJtz4S%@z&05!@W9Ay+>qf$Ub#Nzs9j z8>1mN@Hr{g8@X{Ba^roFYxP4eRyky}MWF34={oRp$3Ak{SF zR`*#zQg!4Sb>!N#1tiVAfTU~4t>J@QAX`OlO*e9DofC3-0*+DN|B0zC4@nb>JBz0FBR5q;uFZ|yG!41w zKF9^KRpe&4ky}$kZmqyGSH))Sjvm;|(C2EH)*<0qhv*BjMZ>th5TkQdo`&aK)i?Wd zoU4I1`wO3|p#d>2=W2q6&cs0IOmd?$SwkndAlh85s-rVSLuWM~bejJg=oHNkDq&z% zR%LiL|Nad2=bSbalA92MXUpI5l=JuI9v&F~gqgKD;E(bO=(~W+^FNDnU-~ZIZ<1RB zq8tZyp88LtytFhKA!L;lk<-Lv^fjKBNMqf}`MC*tB`9^CnrKc`P)d{T%19 zF(A<%Y#v|INDbAI`k!2uiIf_Di;hjkZ_roeP;FHIX1In;3pYpj?Ze<6 zsrztLpnW*H;(a*AdmoO~_Tf06efV6b==rV6I;Z(xu*t&9%J*TeDVjam1F3H)70gk6 zul-lk#d6`jNOZ9-Kk(ga-3xE3zVHU3i$gCa=>%c;SCQCMcPh&g@cLZ&m0n*c(Xiix zg#1J_Ub~f#BJkRy^r4hrD$y}`?N!E8lCP9^C~&`0i@pvhGb!cQ%GU(tTP4AQ*AGhd zIJ^!k!iv{XWhJFNu0#^(Q_8q-yna<$Md9^_(j^J63A`4SFp1Y8&{KE_#ZBYG3FdU( zIUcVWdk>AfzT@@3xgQW_d9iOJ(J!U22*)uE!&t5AK zE-^lBy9dUT{Uy>m#w#G@FG-ApcnQF1krL^OF&^qZz5S~W<3#m6z1IVq?=l^o;TqXz z(a63E2!w#>)R*IPoWOw@XTc`0)rag$@H?5AgQN3OArQ`sai%L61mUf~kWHl09DRq> zKSJJux}L&*kBkUm_!klqg8!M_?r1e^M46+*h`u3?VZ+NEBk6BQqpZH8`jidoSJo@j zp6Rq_I))D(HDJ)tk&eE@hS*1zZ|Xn@5JAcUzAbG`eiWNJp!Z4sAL(T9=I;)EB+o z5q~9(vaW12cC4d~+BVO`dStJwTNL+FK~OqMBhlsh?G0Q5bV=cH@Sr}90e$=W;FHDz zM%5r!(=VwS2ON3lf*nV3*?``Cp~=;vb<2_ty;}4cSw5n7-||7jhT8kmWb4(htbgxO zgUfrB-#ol*q?5AXA~?y~-%BXWM1WfZ>CN1q%<71m!P4Nmk1?4H z_R^s|70L31c>u*2w3y2%rWRs~C*}%su2&oi3E>VVqPw_a%vvs(LWT0i$W<~aPuNC_ z26o}Fi42=aE)+ILMW2fEEa_7mqK;kEw+Wj~SPQAfe-pmh>D8#&9991`M7B6j)Eh0D z*+q^`*im4isO=CN&h(QTMu|#ASBT+$I{@L~5ZhXL`ZTFaY*<1iPCs zj}l6k(dvtyo}Df`_7|ixccE~j)~z!9k09aWflG6dSNcg*-V}r@B_e8cZWmD%t+0zI zbX)Fd5jDykfVgyK ziB>jorA;)oiFg|n`$S@{uwbCuMZFNkz|%zodf7!Sdf7xKy>f(E{i;u|Tv3}|7^7Zs ziS(5x($zTmRVb3^D_3Nwf%2W#j8^lwRl-y z3`X@!*3hoiu&Np;n~UM7e#!dUg^Y98SD1NNju*l|HKMck5{kMB3x-LQUDU7(i%mp! z5f+S|bYJYqk-1z!2CN|7gV}BZtY-s8$y^(PM{PosIz9ElBeT5eA6`tQyyqV-(|;5s z{4<0rZ71eV%oCA$Ldj9lnhrsY91bodN77f0s6($#f_j;is+hL7mw7ERZ(O>lKS7vE zVLBpk2?7l%rGv0~CKnOc3WH6KC}vk7Vb~+BQzYjILyic;u*Z@?dD0YMliA~h8i7JI6!%@*EX3>8*eNBhRw$oIsYZFxqh0iDIQ*%^B3I1k!_fq~B zNFW|Ezw$8mpFDR~9_Hv+@A&_Fm~$VW{>h_Uu!BOs3pwI>9UN2|yz(s9>tdYc^z(^V z7bCRt%m$)F9=jTtv9Z(XtjLio!a+dG^Oe5umr`^R6P5wO{nXh^7*A)M})u#PFTMsFqK)LHX6x zFG(NU1=J05L`snemF+Q({I-kQGCWrPj>T^+q_#}yAD%(sUAhtdtRK`y zSWw@isITE(9JSE5)KrU7Gj0HIEi6UUlSCN;hvD?fQNM8fqAwiM=+(e=oM?BSW0bJ8 z$Dt^9pmU(>OsNyZlOj;mJjP~=*i0%VR;d$5??|O)Je5}Lm?$inMBFB;1Gkc%9*&l-@aohJ1mO#c!m;@siqdDw zQHt6}h2nHtBnR<>U_J4W!<7_ZB?b5&7t8#=qyWLpZ`Gph-)7>22GiKe#AR0bxq*55 zI?MKanD;GQ^;8-B__%t|fPuwjqss=Xd{ZxKN3+hGb5AXZHI!q{KLOWHEDKhcq? z*&^8?YB)qyr>No(wk%P-5ryD40+GNtTe7g6A_+Vkgy*^gO`r$Lg#gFgsS-P_P}&YE z?E?@y(Ivu^ClfeCWG2yx0t9VaA*xe)3$e4>Abp(}r2i7>Q@V+WTp?WiNKkV`pt!iH zorS;`%gGmvN86zskIbpaTuzyZH6B@zn=7h;)tfIszvQQh*g_HMAZW>HBHRvf2jw^B z;Hi}20lr%-y^LTG)7wsuB0CuWg6EJc4C#V*5z!EvwiCE9lNb%WmV9R5$w%9;0Y}>0tb@660Cf_e3=T(^E?}wQ zpGW}M7F|R*kCzfoNrX_jq47vea%+QAODv-DM220Y*o6_Q1x_Mf43Ni3^?-1#zLGyd zyS$H3TZT*Vw70NZh7&s^Pkv^+ zB6g~P2UjQ><`IDwQzWW5>9au|G{r@9k&8+htqOucrAT7ME)sZT4pB!DnKFZ&_=)&T zNhiGq@Qdm=MKst!xuT{`n9D_iQ&b1-S1P6F3Ll#zd42#V$uc{z6qy4dJMWYus&Xhh zgh|NBs0ygQJQ3$WToJfY9Lf?1s*~=54i;uYo(nVyr4C5?Xy1XCJS)jvQ=OSa z95DIewUw*1#Rbb1E7?euY$U02E6KtNl|lniu@}Hb3UKm(i&l_LHY+yJcqSrBKwG8c zim(C_Wl4Q97yqVI6Ddilpi9hUQ?=3{DZ@?=iDeAETw=sdE-@FeM*xdBF_2u!8Fy;#}foMeI91#Ypz&AAva}0cdDxJJs&(y+|$#7pqnPeOMGqL+{bp*(?T4?+O z326MQATYJohvo?r>I03fNh%py9jSh#RNIg$Op5uWd@oIHNOP@DtU#4rB_Vy4M5Kqp zX(83lh*mj7xJ?SjAjC@(5wnHGA(BBQ=19dcrJ4&!dy;ess#`Tc*+NhbxJm`#8tTl= zP0!7Bq!&5TiAV&2X-X5u-20?#QMp4ri`UyMty%P(AIsrdz~Tob=w)%L zcUQQqfDrCM$^j92p9i<^0XEKJ--8ss_B{aYXWxS`PlFyR-QS=`L$xF{ z&P@r-%_H;eT%cL1dijOxk~_Z`U2^9aqcOt*M+6yBs#%R+7M+6fi_u9X!~|l>656HN znp@LR8fpdLgCVJ^DEWc_tV%b&0fXb1qN?D=FfE&StertpxBLMR4@^`RJm?kT~-|tZ*pc(z<=9vyB)ay;Qsf1df;2@xM zLJfITGOIOhTlt`}TD&OOt8Qvx28DkD@+-bbgiVCVtK~}~c@qc_C_q6O3K~O>F;E(A z>CPcVc4TD>1`d)B9z?OasdPpv;E^q?4(~-@cp`Z;w5iHdYgAp>soxa$H8r?^Pher!Hd(}X&Tiq>?@Yf@~ z3V(=Ty=3I=a#O$eY@2%JK7BELwN%>7{lB%DbFaaJ%Ks5rSKysk-8X}5s^{Ub#G7O| z?~S$6aY+D&A3?OobcTuF4(UlJxyKXv!MV^KIuKcPaX0QjC3x=V?si~axU`yyxv`D* zxi_&d%d==Bc@UKw=BE^~LyO3AN9?8u5{k$i9ufN~;^zPnhbTgN(xCIMM~)*DF`Kc* zZa)@(P|!lJps+LqJ?#~gL_zDZoAWHPpVIB5GAMkjE4)BLO_m$*&6OMQe_hi=6FL2R z85sYM1RlZsy#?cW=pM-Y7~too80@jtk*p**7hQK!=DBQZtDnoE878}a3dQt4n`bX1 zsnD~RE)4MS?4^gPCr^BO3IeDJo?HOb&(CR>>sSr>tyfZ)h{rFvx9hLqhgaG5fX>1E zK)QGk0mIcJqFb=lDeUBLU ziRtu=uR$(@;BG7i$|1S*JB;JeAfGJFO(X+IsY<%G32@8g6io`r{SBlYYUY#-auJh& z5HRG^1skQr;%Gbxwc{aqcm`)Vm-ik~J_t@)Y^xb~3y(0}ia z^1sFsSAC5J*y#h}4(Yu1nM;Zb^8aYFcW>Tao0iX>CM0rHpx&6|6u(kc-)SWv} zu(}cZ#axJ5LZIg9J2y&Dckb1+Q{7F6%FG+`^F^3+KPhzt=>Sc;pVSWE&Z0d0rzOzE z{4&8thGVLCo;SUMc2gll2AGP;`JAboEQ~EsBgi7lk7)RdX(cT61e*@n)nmkrwP z59c;2_W;5n?FTVqgrY?;Z`&eC6vA(0?+q>Npk)eh}#GHgx>>!dTfC3 zhY+q>0O|SyDmD-f6O^hXWp}F*$f)J+DBqr0hbXuU^7EVWN|5lkgM@EGI5ZRBzQw!8 zJ`WPUKS=lwLBdZ23IEe8{BSf;RQF*J2cqoGpQ6&X^h;`s{@)c{K3;9B31C>sAIKraWl8e~^{}Xg^vCVV=Yjl^&c~ z^zSFBG}r2W^v=JXs(OQ{1ro3u+Y0#l4d)GEA`BfzsByLsQImxkR71K*0<{3$$V?G8 zNJJJxTn`i6WLQhUoEH2MVt<@l(ilogR#BLJ^D(F-eikM8QZ_H#7o-Zsl zL=|{#0U9%fb&!ZIhWhI$Ftp%*5&rAYHh88X|1&yJ@6MhbssY7FIX8%cAR?)yBpA@Q z0Te{5M_(6c?Sh(#N4q4xzCmgj|5zL%32MD={2~hj*4JpQxjd|B&w|l z&5=G2nL`b0PA2ZPnhSdYIin8)zfe{$EsM0I;ouO+XzdimcF_u!Q4K{O>5RYijjoVB z4Mi*X$7~?lz%hTS2=6Ic+Q}b(>>$brOMX*mM(CQ*$3^5xk=RH?4iwgG-|-+D`e+zx z+(j7MX*EqKpqgR;)5!AvVVUCYF5Lm-j5=udc0j49yP}=&V&v{U|4&%Nd3L6(+Ft~; zi^PFmI~7Vpo2YIV9fDv&W?mGoX2xMn%M3MN17CL=yl(P{LMZws^4H*i(wZX@YKUCB zxURp5g4z*emmXL>MXlQmSV^O3O>|*1v@IRQs>s=)PMYX}**@Q*b|Y~WQk05VxM-4Y zF&jEX394O69N+u`(aSE% z3dB1JF4ivS!^gFAhnO<26>%-;8xjl*4eY_R{WNg}USKx3jg`&SU%W)68RvTh=6HAjS8N)q#;9yyJ&`5VK_UK zxET5lwZjgKKON1kb?=0SDCkA6pg$;Rt5;C813`Pdf-)%Rh*!{M6m-TbNRG(aF`gwB zQ>rCiLDy5zvtB{v6!f}R&{PWA5#vdWETEvTy;7~Fpp#yy)EO9yN#wbQdalCoj}n(p z<`gy1!*(E(q*b1ap9JwTK!C^t2S#7=W%xS?xBBdm)&k6mfgWpUoP`)3^UlKXI6wJB zrEKZHdgUGtcIR@|t`s5t!*?H^3lemOhX-c>l414uu8KYI>CH`W33K|Y;uxv3;1V;D z9;2^4ElFc^tqx6Q;<_^p=>vie=rzReD1BCLhc|2w)7-O)kWkOFh>(y%?Iib2b9%pd z=$jzSlkGu$>Cg7iy5Zl?_K^3+`623G&-0+Y^H(BOi$#1fQP2_a58F-TH58Ezg|Qoj zc*-9vPNbg!3KDK)aWsZOp)TmCLs1VP%GgC*Q%pomEbc(E(-mp;;grqkV|npXkd)FM zan;Sp0dq=TPQ}9_aj((C1DxD~KUDKq!)ez>x3ys(@0KG5;94=e2#0tm-KV_$LCO;> z&qpkB?3`0hh?K28mpb&5y+i2-2q$_6Y$BU*+JzmR*ityF6Xj~dbx%3MiCgFp=yZ$E zWP4Xq-mao*F>xhuCMqZtRSM{4w99jd@GX#CtoyIqK*ha{EVxu6wJkXnX;37FkTYCn zq$hmNN%y#Lfk$@&7;1=X=`}(9a)|!)H6CiW6z4?g3e_pD;Dbaw?@`!%MQdhdau zT>WxL55Oo(LiZ)D=0vF`sk_FY6M%YQ<4?l7ZXK``8q&Eb$}UI9&N1r9P#x9rm7z9w zEp3@-{5QC8BNEgf7#(>eA;r~fI92jAGLyx?goKiwQgTW|*ubTZaX-rX6iHUw(cmUJ z+7)vP#cVHD$YR<9E3!lGrxf2;cWC<%^pzJ= zdtNmDzkM;aHwi7Zl+H~t+?COFFu)lUCKQJiA49cm>wZfja#{jIUJjwO`5Fp&)QXkm{=HWqw(7 z#c;ov3o)h+)NozB3?+m}BIpp&AEX!#0R--hg($3ss0)G>4uqY;+Ll}=gMKB~#n72* ztG*=n5-j*eqG_(E2M#w#58Nw}OEhi`goCk+d#3V529(8dg9AL76sqL; zB$)!($ZU}X@5CAeIAekKIdsSY0gC4FEnLYm8dFHEF2a!`{Ugibkhm!*;~ct{6tO4* z87i|w?KuMFA`p&+g6dUVUb9KBV@QFmQZ8K?Hw}~ z;>qbD=wYIVnI2(8PlwV&Qq~4ZUZVsA#Dl!1%X{IJny!@v2^y)s=>9MGk0BZvfiezN zp|27x3HeUMeI7CcnyzLb&wKGW->5H0lAzBPhYOJ*VUiA%)lLFe6K6AbY-Z5dcw6wC zs8~c6grD=^l9@1$0|q}FlA~Bbm&suwX|ENa*W@q(>T19o0AmDhq1%zK8q}d~k*EeP zIetToa6#Qj7kf}Q64M;rSeIU)+tn91xDYVM+2NvyUNndxPK?L5e2Kc?@Pe0)9xf8~ zas31KzUpV`V5}c0UT?dXA(UoJo5+vl)E#|OhNU-ILeB4Bh580rI zd=bw(Lda2wZn5XMeO1d|IYYfNm<}8ev_?4#BuVQbS=*hB8MXwpBKYO zh?X?5H?Mg;l9`5x#C%aBhi(MM(8a_d>e=_`M0$QPxJ0m(h$_yLcOApDBD@Aw!+?3< zgmlkWa(o_=}N$k?YL~j(2K_x{(o-_ zK^_eM5q|CY=jMut0@8@URUysb6A?C@P`t|#&EP{4)WzHyf;4I1XEKx2lEQ67D}v^L zLST3vr2`KWzoAqIb&2{^Ea*h_1rfXj*V#HrvjgfRxZeb2foQZXC4D?NZXzO<_nJ+_ zqnX#meZo-sfreie6!#{HS4eg(6X00qb(cm0`;Q*BCEv5Dr zQF|}Er9E9O#px+nOTG2<-hqx-_+&yTXl}ap7dn~HFN#9nWYU)}g6ZNtC669O`h!M- zLXTM;P?%rXg<799SAu8pnE)PfD3(aNKMWX(QSojB+RIa zUt#7f!kAg&Ehf)%^ys=Wa^7r*y4$7FrvV${-)lIESV~2`Ofsj&0Ro*~6>R(()L!%q zrV=h}3^r_O!1BJXp2fM?r)O2%2CT=qcId|tE~?WJYbb7fio|_HSr|q7=p;FmVl1X- zz+p)dScB;0TAbusgn^aPR!%tRU%~gkeKMTsYAb>+2a`B`5CXmbauxPa6`(~)>f~ri z@Wxj-31wHQGgdm`N59A*dHW?X8W14pCDX|Mps%jptEB9cdm=Bf3cW!UdX##|3^e~U z;{-DWixgCkv0Px?0Y3mwY%F+UxMzo7(Pnj<>k2jsB0(4iqz!*J(lGA}PI!X7F0 z!<#oI`XG6-u;IFOtSTk#aaV+U%}Z{lr-b5hvjS|Cb2%6VmJ&jQzFSE=d_o*-v*FA5A8z)y(P;LVvu|A$EDk|ufag*nx1?I~SzA7_xx%CpzhS}ADTkDWv5Pmr zWw8xKDB(F##j{BocVMl>2B&Uwru_CIyqo*m!oeLxYCCYPrnWRD{)&F}oJ8-3F_%C) zuK-U}Z71AQU;K7n4x;NNC`5*T5D=eUi~U(?O&HmPZX^wS$nL>@^rAZ-^`JZN*T~Kw z^upgGJ7ebw0iqM-2O&9i7G0ejwEoSwf1>q`yj$-{b37s`v7+Zg?}i~kAo6za2h3QhVpoT#atT)a()LVN!2aQb3*&={bn3aFkrH1z%+$v zx)&YbO)oFE{hqYfVy{VO{38>|^KvU^I+Ltu>J54CxbD^A=_GLYVYCLH2tny2b!rt$ zB`XE;mliY~rSwXfASFizT>L=SU_mAjN3RSiWHRIly0y!IlRv%Ev@e=`(Brb;dZ}WO z3W1n@g(+;ds+EX{L8Lesjrq4oM5oa+f)7@;%CHE8bJ$D5Gz1iude+C9Y6TfpLg(ZN zSm{XyfEh>ngtlbG0}4$)I?}nu6)j@g(%o1BLN1uhl?X9Nqx8K`ZyS;!cUkP}A8$%q z9)3NK87k@QasEX^wS$K1pzF8TMBn68y(2O6;ABLKSEK4XRj)@)9equlg@Ry)y;F{%YEJmRuRoaIFQRE&IQ=9(2J!5Tb_Gqz@^3( z4B0G_pt~R*KR8?HZgQwKo1vffiwPRa|2=J_(?z~=2R^bF| zGSoCGXfyy-ynUVZD3qA(+Qt*GdehMdoru#TK5Kq}E91v$4!yZ-scMJxdmH`hw;Cb<)4TjItK;1z}8wUAK5eKd;2Dv&V zb+ZC_j6O!`VEGB1cZg{UNuejLkksBW#o<>8cYJ$g_9hDMOGoAba-;R)y{XF$n8mK; z#wn`e-g=NFSbF5|nARB5b7%+8_Sc-)2B=ApHfa{KU`VTSA_2YiVySQJ){;3uiKSh< zYF-~eN3;AH^rQVW0>xavT4Knl1J;|3Ngy?A)zE21&g4f`kL01_B_xSgo$DusxE)z3Oe< zBQQR%t!UQ5>+l&aPPq}ZA1Bu1Ps!8zrl_{8_N5YqEj(90(I(BbzEcDi^r*U ztnb)$FDf2m7y7Ddz2QqS6gNZDheNbh!$95=+3OS*XfQxeQ*M4x3-AwwHwpVls{i77aHprLYcRGF_SQW*mw(AhBJmTb&#X|<&<`-XhL{MiL_&fkLRO?51( z2fB|OTd1d(WT!~PRppSmsZR)n@Vk%{G(cQ8K)pZ`LnYTi!#XCHR$p5t91MZ)#W>VV z6L}}>5}DoTvwDAwz8h@vcLZ+htO_qqzB~80`f}$BZ%fN*va<;M4;2=4SCjcLn;zid z??G;X>yQyQTcUjI9dw5z&@PWhs`wjt$58hS32!Bf$Rq+x*0w5%g$GHbChMWCe2AJe zD8|y2F1!F+4`qP*NG>A24xp>Qd26u$pa763qv3A|DjPS@Z|MR9eMW<>P*lw%eQ#(m zL#;xj37!FOOQ2^8)p+R8=A*~9hCt1PufJ1P3e+NsqEk&Fv08|=$apibU3jt0^#z;L zXx=q=YDm6g(TQs6);`9fvl^lYaSJCTVIbI`b%Rr$R9*p%g)?jy5nimeLHjnLr5K@- z7U21lNmIzD*VQ8!Hf|^rW9x-KDIX;GB#`dY0RuWr0SOJr(dkGBEgd|i<_QtV(iuzS zAo2zU^&1eRw8Ma^l&5LN8v`D1i%yZ93SAKlQ*@+&Y>V-9>aji^J*Ec7f|TGRv1qu` z<@@y23OjsZbR`{rs40OWL(yvMGcp6vNB-5u9?Wm-Mi|U<8xzZM{1qU>3r=ENjC4#g z7(B{#HU|@-0BacP(@sR-+$~2?G7OmEBnSS<;HFAl2Cu;jhOV$WfR>l)x(c15GoXp| zfg(v3Ndv)az#vxDQP80cr8hTh5{TiTu|oM!>IG6{*VUIgU0mpb2r>qw@-{XO6&S{o zZ9XQz+Z-OJB@G>P7Kd;eGl!7qu@o$)W$_fU&mzG3~o#zr2xu*y_V6J`h+vBiP| zaIG*^6RgB%^>|q=j}Vrpx|YJ40)KiQRLk8$_e=y%luS!Ovw z==>B}%o7EiPk}7MA`Mc&wQ(os3F`p58jx7)xFC>*ZrzQ9i!dI8(d40MSY7}~CkfJk z8ZH4R&Z89qg!UdEj7pOGFw7-SXeS8T!&#otFr{E5fz?S;;ZhP9H-P-YVI+do2;)Ot zpfJ-sK@DyJP_KA_A`xtg;yRr2&3RJXKE~Ndk z39#Zox%y_`x+Ti}6Xlw~CBRIPB1@n}Un#;1L>O#aU{fvK3y@7asHUp83}b*uz)A~p z3Y-8w0tm#N+C1J~QUZ5@lgJnYxR8p9z7`f zh7Bh!2`3q}hhLxrfjInt-+}EMgV*E9u>{@gv#@*v_~9}Oh$F^f?iEc&;aEtq|FHHl z^=9~!Kf9}>N}K45Y(o*)TXm&Pbmd)@(t_4yd-_jWMgQ|gCAx7o%quEwr7LYre9iUM z>$3bzU;M42XV8wl50^=X_aIu(Te~2J4g+AON$p#gDaB+j-FY0KC=DnOdIiz4m)UVD zqa>3wU_=2ZsuF?D^GI)v%FKizZg{V=RwkD6!`U#sq;WFT^XWJCZ5iZKBUuL+Wl&s& zb&zMYkEjlkLvg_!a?XvG1)ly-7x;n#BCXxaUG*6GJ5vgAb zAf>40(SBK6q_sb`d;N2_hRN-7C$>-Uv%p-6x`FP&GN+R(4Cv`bLb0MA@lrWFA>*0O@ZIp2H>xKfLW1rx1ps4o#c z^Aa{x@qn<57Rjy1Uk5ZP%q@ip;yHMbFO(h%A>3*U!h{t{sCS8Sg4*8z8iXIYg@_ww zTtrbsycqdpQBG0x!GFKyXIF#;;iwHlEv~%sC-O^5$g)uu5djldghMzJohM8!@sk;6 z!G#}`tif7wmAA*Uy!-si+vicQZ;(;HEh2!8lhaBw%e!e?vYCVm>>fdL-lvt`cdw<%5);7RTQ z@Gl7v;}Gm`waN*Qo6t~%G%OU%`h5J97xX~X=}}n`QICY=0{Jj>n2{#2@+lr3)0x7I zTST()C3FHwoxIvxEL-u4TA9!-vXX0VBZUfszV6`alh@SxBUtcPZj(*N?{I{p74nzb zHS#C&%Y#_>MiEETIY5D{y$amqU*KAg0=Ie;xHeFM$gdS>LRS=v>O)9qE_;n+{;t`w zfG^T;W#;>k$2D6d7aXgjYpI#ab(BW&Z)MfI*5Da@kv zoh|^NjYtzNNRr+CrxNN>li%Dm@mXYlf?>LA&_(faw-Z*pYI0n0*JS4H9yK{m8GUO4 z0Ir(IN+7ca+{~vVF7Vp%rDq-P^{>Nzh3161b}aI&!~Q^Z006Bw(l}fsV1L1Cm)wXn zzamy6+YvR<&*=zE&K%K zlE3KM8TkXbwUr#Lsh$NfyDZ>{yMU>8_!aPjM*;IZ3i!dl0OWQTAVGfzEdvY<)PUdX z4|+c<)$6|K4vl`W@cop_yY9&C22EORF>^@J4(k~83MptmSn7%VLeUnoAXuvqwdCE! zH~Mxl)FK`gt#d??+6&L>RTVw?t0)dyQ2B5pCmo!DY$JEJX-b4fIH^1lT+S8C&HWt? zD7f>?m&TBkN9PsEBoCR?h4fXZQK&ru)t2X=O@WoVRsdgOOI_(N^GNH>ys{x4SHzQD4Qv7mdq5T)SxOM&Ytj?4Idn;!SC>qNvlF_7*7r_Td0SVW zXaWZ#YJa!UMzy$>*RzRsIb=kT1_7aO&IRN?B~LWY5jkqkm+#cGUc=#-t*!LkZ3~d~ zDP*mQcELJ`rWY-;QC&%pjtwj=ue+$7FKS|_WogmQwxW4HYAgF1I(bOyd{c{0EiKeS_*Mjlb=$@YO~7^ za1OvEfB^YkgkVqv!%M$+>ae<9=Z*Gxb*Xzs(#A!b(xy zAN#UWToPy|V2D(@3he^g z<_F09EV#lH-gvDoN#7lNYbb|5TzTGn(et>8eO*12;4(^R0?XrOJRMW9O`395b?idX z5i}(jS?THvE@q?Eo&GhP!d$eOi9dIY02aT?VF*WwlhaL(W_mOO2#%AWZmCY=nk zL0ZJC=hM{?Pa=yv?eI-E6DjR=JY8#C?mC1BzV&9wN<)%xzLxUIUy|COQ%X4HmuC8;72OG6ZT`qRv23 zt5DzyN<3>*>$F6ATy1Vu(=+}-h~0B|S#hzc z)O2=fGDB4yv|5S01qD>T)Q;1_$Xzr}GSVCXVNk?$ifG(j3bL+1SiynhVADqN5jIUZ zKbtbh+$K85Me#AX&J*e2{5M5SgS&ZMX%L(zqH9TLP)s9e&>D3^bEkwZwHq2L;f7Y~ z1Fg0jnlU&uqbD?DU}(_)jK*E9XsJ)#T%92`9DQ4=)lH@;Rka|IMs2A_-P|p`U}##u zNqps~ns{n;Z~=3Qz^#~`y<2fA4zJ>BOW`mNCbN`Z);YX3nZ(4>T0ly5i2&MKBvm6~ zAD6U}DKy6oN0b$co`gWK10pyW>0oFj=F630&+Yp1QNr(s>%PK5G0ZM+XU1U(kU4aq z)xstJt57o_0z6#1Yr-upDQXY$jm*Y>1_L$S&S9-)c40iaR09>B z`nLq?mlRE4J`}#7gV)UDX>y0P*TyPFZFjd0zr(P>$NFC6a?K`TmFQ< zFKCqJDX8~63;2=B`V}i4a`j8@PL&H4v-|ae>nss4Ts?&OMP0&Prvu?xm$UmdwTi04jOcK39XH7Ren0{Y2Z}CaU0ldtwhSTa67_5rjv<>%Nuoq=8YO|oRBs=uRz2W z&@X8boTHhTq~;6WlGjk`GaeJVT*SeOE|3B04|IKlbb0OLE;@*#==laeEBs~tLF>Uz zhV=rMb`F{oVJWkKu74tEO1MdqLUou7(3dn%6%JvnA!A`00h@GuTQiDsb93`^i(tP+ z4hnE`%AW{32{^R|yE4TlL%_zILO~2l5iZl!&ZrkJBuWY19;5k9I52?=O*Ax6<0?cooOepU z)jGJUUBqQm1emy0!NohuaBC#|z#+@ca{lgL!l`R&0HGTOaQ(_UOO=rboQ3)^!EOH3` zBp&Cv&?YfDB>+Cd^Ch-gWP)8z-B2I)NIJqW8E&kwKZc_}3OQLgm5OFg(MtL>CJ-1B zD$dUef^be|{<}i7J`E?L*{d^QDCOOm6MA4u?*sojiAR;g^0Q^2UXxQmIu0wMjw7RZ z1*4x{aPmeua8XMUxtEpFIA9Oc0d{V1$*e{a`3=KFH8>n*&C>sgwQVj<6-*cib1)iE zQ`ccaVRtI;aZt+Qk5Ol+TB4p!qq`0{(A_} z-=AhZ&PxpXM40&MSatZAM9zbIZR;q(C0@1ZEr%lZ1sbUOY7AHP7-sVks>n$rU9Gu+r5d3CCsEZ)MN@6`&ZE06SC;A$#X9v}iM&lIYKRyDcexV=uO)d{$9 z$R$VLH$==tGWU&{=uu58syWST>7i;uPAIGC?V_+b;Z(nL&iX+I3H<^bA-1Y8nic(t2PnLNdXE$>0K z30|==s$=2j(yrNk%K4)Xs`eLYP)!7SA|?cFGF&-guD~4u#vbZHt1#T2U@r@W+W_!W zCXr(Z%xu{1rcD%8VZVHXNS`R0!X6zPPs_l)3`ceO=wjJNJ)j`~o+Emy&AIoKw-Le@ z(da3RYfYz#v|g~V|1%@IgvPVFhXx!Yt`4h7K1zK%3|f>RjNH8iZIwBc(AvxxB$aLb@>^sQ?r- zk*`36PZD9XwcnFP*hcvqy(hh~2F`+H%PAQdJge!!e4YXeXGy)o)1tM7;06E3+}p%R zmSt%|-b%&vRL?X;(?1285m;xd3y-SI8aFd{56`Ke9&`I~w+u5k3w!1s5hbLjs7TMu zn2wA{d3aQ1O?TG_v;t;?uPz_AKDWd#ptot``qy#?n z*M4&E-kK(ONZc`4SrYd@N6G7V78z0I#xq`mS>%PPFqNK)|MSms)4zwZ)xU`~IObQw zgMgwHpuxy3w|U50-WlHe`oGhZX*Jw`gomKK9W*5sD(ioX%`HGy00s%7C#sV9XIAGZZV*fY) z@OOFr%Ruq3{mHq$%U&3)5 z4Zqdj`$lUR{|M!-Q6d4gB1**hC*IzyYWF{(9Tf;rQWQ>uOsW3c_rCVG9Z`NAk^JJ? z-}qCOdqJHCULqFgoqvZ`j7)~LuA`*BARezT{{W~}b1jHU; z`=YSe%|K+-z<@aMn@54jB7uMu_Fo21Uqe{?nCFZB)m~$n{_bC~;Um!bkHcH=8{GAKKs$_P%>?|30c0 ze{10fy(%BEmqe)+dq9ulDd905y!B#m!C zKf(|AIsXqU6yLuGqyT24^xI#0=ZCNrz$SFdwqK$95u70um)`gW6jFy`~t@M^>CAEAQrFMoRPFZ_Lf63ak^r}B4bx5|3)UJdcT!o6R=xQ7ZxBwk4SL14=}zkz%K zStY^Ru`;N$`Af9c{U&PK*#+VYe*K-dz&t=s8+7@Pf19F{9;ZQk{Zl*;6Yps zy0%+4{@1v%F%-xFm=lcY>wl_B!uXB2cPc6OP;@FQhox`%U-{;XdnbQ<@85u+@I9W$ z`1L=LItQWTS8&P!!l&UY$2^y$6p9U4a#_OvKYsU@?wu^}eh|#DEy_>&j4DB}d;du$ z@$;lLD?RiNSVZt^e}ku*;75A%cyv+Ejy8jOcKV=~U)0MtzrT03p0DcB?5M8R^I>m) z|Lu!cw+Z9D{pSAOwi?&-)ua!#K8unT(dd+2ZT2I%9 zo8CTuosOz$@7q1R-~fZ4KH1Le^`>6WXZ^!oyxQ~+_cRavK0a!8+8;KC)c|TdtMzEP zuE*7;-j0{ki^d&IsNHh4si#-di){}RSFgg=9>Sb&&5S? zJ*S&`RG-%4`b%!vn?IhM)ekrI!|Bsr_FEsNk3Q7u3~Ee6Z-0RG)HKe3$*b9{nr;X6 zfOB_naF`}Id=zwbZMvKkzbW@*Sw!Sn$^n!v^%?D%b`X&Jjtr7h;v;KzN`i3)HRvXd! zF(}Fv@SfBKXjpIN)%@bDo=(oD^>#BqJDYBL9bIi<^WMS}%^qkfXbQ%PnbM0!+tqRo z0y=(FZ>EdhA-jTDkp2*<>LqBYx_^M~{&^hGcyp+Mfu^lTwmS~=pPoA1o-aq^^%jH- z6J0H)({=4Mz(>sKzN43s)W!T_T3?*@hR1IgdzaNz3pHMWK5nLG^J)vsACDG`)6w{0 z)jPPvyj@mc07uzdZ8EZ#l0&pR?2-ITfqR!{z4TLS1f;0PBar~J#e1Q z6g$c}_jI|bmz(~9A-Xs^7Y3|zfImky#1&BglSKR@L^CrvJzI`1C4ltF%UI5Ztw4JrlU!HI^Ws? z5^sj@NpRCo-B>-ofB!xR0k&`r3Iwc$(AXGt6Y9uYO(1@P!c8H#;a@C%Mibh=>?Myc z?|6rRap_1v#^e5(Ba%oV7(TvlGQC(qdRopexa+=ic+ekwaB_HjI2;_F^dI!E-# z4F`J^dFK=r#@p$9HtaR7wPN*pRn4D3?y*@k_T4|Q-S14K-^aU6j+J2BhhTf?f^BNh znAK`4B9kKfMqc%Nz7yqR(cs1#_D$#);*Sd>@Oy=-2$B znl6HTMFw(6zQj#Co`d}@7C_~eWYYp`SfX^tqMiK*z61~Ou)IC3j9M{mR96m-riLpG zUsPyADzx1U`bLK0rFsP7KdE?08Zk2xkpVO?sXmJ_L{R)W44qvyX#nGwEGaNPnXNUn zaH01a4J4^JyS^R2{_OK-H`k8LYQ!$%)Q&b&lRYK4NP>0wRT7+9^){!e)8%MAy%?`1 z;Hr4e0NeAU*S$Y5p8x(2xW4_~H^1Ne*?uAAgj*n0PVax$m9^0Q55He(Z+YkX;Jdv) z`pKs+US3NS(RvuC9GuuP4NkCn5Z3rr!vRG7)#U|wK5%ABm0&;oAlXm9LESliiczys z1s1YLo?&{!<7Yp5=EF2)M|S+Gr4h>IJ2Y2-gqMx zE27g_`~sxK(B8t*V^ElJN7o^@1m$Y*sf$b7E#+FWIpNx9cF0NVKPWW@Y9stm7c3Xo zKfZoBe*Nm>7oX_+*=(1PI<*BCpp{U8TH+laLegZy)jkpEVgi+-=0apw@Bd)_>do!5 zSI@735aUe`=)l|X6Sso-Ql0{8&o@w{B|P?_VrjotA3m=8+eeKz+nzOZ`m^_SJ zj=^&p*EV%#QTssL5ehWTYaiIlfE(-SX1?a)Qfib|V`w~ZofneWdR*04;I93>$!J_Z z9$ih(rWex<_RH#`zE}aldjVjVL7^#>-y=LH(5M04;dGkv6f6U$vmQS^UTJ)jkKcUs z+4$w_=f7WFzr22a`{MPhp4$3lqkZOyi8F3b>XU+x)_D34MY4v_c_pXJrNIncgF&+q zdam|#vsqD+sKGfmGSqM``ZidaGRGHSD}XJXSwK;vRn|Xeby`2(tfAwdO{?KxyBeA@ zWKZCGgi%h7!txHW>ut*y(1e_QS6?xIqP(;K&o8#duPG(>_TR6;=VQz03FPMYdwqYO zPfI_%Fvso)%TS60L-gA?_*c{yaYsX4eD>L!>h{^q?dh|Z;A$^keFDK?G{Igugr+ur zI$lh%dw2=XrprAsRcxEbmrc<+hh#IO1^0R3v~Yh{%QY|@e~${@-vH?${LY-`vud&&fQXo$Mg4vt&eH^t84M&Z(G3B!gT&{S>7Fao=n&tv9IyKR zn)7OI{Ee1SwAW|=mQm!=6HJ+p=1Z5-!QJPpUQnicx1W7}bNvaVap(e3r8X;w>C|o! z0S5I4!13?;9X%RGay9(UdoC|vlbh_@%kYdp>LqcWxC!lW0J^V#&ds_++T#|cb`MQQ z4RPfHGSUhbf|jD*1ev@NRI7fkP^Ls3_CUR$3Bgk^x_AiB5`LccjHor64beXkDt7YZ z0P=Arn^()o*aYoetrlC5&>Gen{2lbLMPW*5v<6*AqK%`&bi1Ku1&Ol@+gn->gcS)T zp|>Oupg6W-XZvtR`(fDkpwtvt-Jut*wDZMzs>c*e^tbO?a?zxou)D*L0ZCM=I=`S@ z7a05O_V(t*kKW#1*Y*DXvzI@4_R}}@i&rm^a0(k8^oH9P&wF+)DoA^@q0?}DUVmVG z7i=oo<;osfCSk<-at)%azx@M4lA=k26qz%7K;Pwxa3wfqv0sCgVnyVZY+T1@Y@XD! z`D~Sm9S5|=h*&>@)f~>aMCY7MmOu^Mj0j`M?&Hgai6z18Dqj?Lk^~O&aA>Al4H?WI zj~-4h*FCmFB_+&SQWwK?GZ_usWHjI)Ny#B{)te_RIkNz1gqkq3w@CEjg5-=ifKq2i zAH1@Z1NEc?ObbWU2NmSsIA`uQ)4~>T-DZ@M^U3e1@Z|C8LN?H%!I=UcJ{}J*Am2y~ z;S`wta14R=F{DtnOKjBpBBg24hbB~GNlS9v+t&rVf#d2oIB_4pq4^%abv9^w&7H4) zA-t;V$K&%67z?BzQ=1{Q!a4*zgLpRIPT|1W&abA@qYn);r0Q>I)uGNUY?bnTek>(i zkfM2SyPkt#<8MvlZtq+7d;Bd|w+)bHsLgBv>6z0-tAzQZ*JmTl@&z2W_0{sA7aL)* zvDW#;)f67yi?jK~`VzL=)q%;a!q@)MowGB;>}0z4A?|M4&{|+kf8nhf3j06ka#o48 zLQc080>`BM1T#ijKG`*zE!0E9UHT6Asi9cN5r4n;d!TRO!49Ask0x+E{(kSTW3IpS znYMGWc+~#r;xC_EfLqT`BcSIQPvCPviQzvhzm-y+`_2Y;`p#&1Z}%`RoKsZaH$ad~ zi2}`cGY<)u2;zqm5X29qdAhX$mIg&^a0h2lEvQS(i}j@HWxpfkg&s&=wS&9_m>#92 z$@a!j_N;MpZ^UMacazh#rf>xmhOB%!rOk*skY>|#u>Qbycesj!+s+TLdB8igcSvc7 zJ?=lQ+UBYR(SQxbW0Xp;^B?0mq@GiV?2G9*(A5V?`w9>}IIU!w$hh&aehT z1?^8D<<(|7gB}krj$4h$HN-7F77UJwCZh4Ro5?x$3n_!^!o&@+bv%?Bg(4Hmd2NC7 znI&Zy_Ip0hcBPSm@X^pf&mcW@OPLxDzWCVxyIdHhg3lK&)hFAe*SR3Vw|I$}_OU0S2)$?1N*Q&%|9clV*)5h=?qXprAB;KMvG|#i*oUQIbf{2#hR62%!GBLt-0j)|vRQ==z| zrr?$Qx=nm&LNy`!H23PBa9x|?b%d$AY%n7XZ#5b$tA`?;t8~o=WE8Ehh^y?0!W1LM z+Hb*Xf(OD|gO3jDpijgOoM2}vU$if8Z1&Ck)w$y!FsIPPb>4;fNfL8 zqVZOe3DE*$!QRIP9WNXuja@N$9Z+pXw_u5B#rZd}M|Ls=06{JQPb2n* zpgO`ZqUH;;$RV@g#n2%)>G2+M$KQ^zLqvCA20R~%5*^ky`Op@l1Y3YLiWHu*IGx-P zSYl8gxOU8Xg9sJ~EmaRb(tuyENQ?)Fwh0JmuWmy1m_%jH5T=}VbQ#xsi9p`@*#&}4 z`zCw1`8DVMCX1et=%1a$;0G5<8bH08X7lTpA8)VU+!`TG(wdP_zqdmtA^C1^ zo;|-lefwrU(bx5l-B)E?CX#ty`iuc7cE^Wk&K#)iVIb;o^H9RoIrfAX!+opm90)`m18@jjiJr}@QoYu4LGbjNkIh{d?(z!jD z!lG_^e>Qu*M>zgG=KOfeUDkXUiS1-U%b41@v46Q@^9Ik8(Mn6t6yl^ zTqyW(G^r2{taYSYO9*JX3v|ii%4S<>8H^M;JAuW=C6ED8K%HF_?39cmOsk-j5U?eq zycuH>z*$p?}D@ieLji7`TluuxlKQd%9 zX=QL^pXM~Gq*z9M;#L<3^)@}1(;T{d7%h3oYh zX-F7LRi%&$$UH&15q0ZnI2I-*Hta13%sz!X5_Tq<6lu3SfQGWHM_U+DoI(shAxK{l zA~M*>wx(Y~2Y0g$UVW6iSqB#rce9eY(XIwBcW!tON+XRDA3j=Lg~$cY)eI(&*_s%( zJ(tr<3+Lph1=P|-E9`_yEmBf?k{+S_4HPIGmcF#=8%z%%HYku|vuPRFOPIQI?4 zal5zyjgap!_JYZ_xWBfJvuE7|Mi5n8Iv++)dayh;+Yr751Ty1ovA!TivX?=0>VUef z12cSDJ$1*HUD!sR!+AZePhZ?#Am$v_5~2lYsT#p}-P$5=KXq>f57)hyuU~y)e-I$N z$3~BY7$_}QgAub*Ehz*PqY2iZ@&R{<4kt1QI$75XRBMRxHs9==? zbA1{jx6>yu$6QSp*vh$WNJdi{`=p2CxxgVrwo?-~iI5^l|Ck#@M9jPka1`nazKGfU ztmS>_58rycF`hcK1j6cZvBVNf3#b-2C@~gcQ_X(}f*cIoieg6ea?@TMvdgrqVa4hp zKEn4nuI5mZxTvQSFq6}Vt&N?7Gz5<99AQ<-Ch>vxSJP7Qfy8c%2PPFtyKeYwM}BM= za=k)qrg2M2I`AaYHlyD{GZ6vELBKr(0Kle=aS20Zz$FqwEMy3#(?i#ZGk^wf0u>T3 zpu_YLm!U`a1YucIP#TgLYFlB2Ed}kW)kjYSrx=efks1=EdTnjfbcfF9WLhoI*Ze~# zAzYalLmwdjEqVO58Wd_dpH2qPb{_x{gA7Ue4%?9Jz>Q~7vhRu50c|eVP&^d!n1J`2 zL9@tVDfuVhgUBlByiy5}=4hZ-U0=y7@G&n@`!OmXQUC*2fS>ftThbqh7T}{9wCrRSj~^f6~@So#M&%7@hxcNIyF4>}wD$ zm!hJRdl!^)L6fVQbl^8jdOUMPnm&Oh)KT&bgu+w(=tu@jfdLe8x3IKMr@cYjk9)ED zayRZp(i3IWl8h?jS%!*z3(gGsmJrCzPOevmE61j@i%UdsZl=r}t@l5B_TFbN?n45} zn%USxtJu0SG_aQ<;<^OK7bRG>Gf6WoRDYL{6L>NrCyFk6c`)SQV7o$INTB#|x<|Pz zYAtACYVzEASkWs}}ODw?$5CUl+*eaZeu`FNGA81Mv7vO{SfO zJkqkt1}QNW0^gbLvB%g3>${PpPZgOI3(6CST>ND>B%jTc!5mAB+%vR$xY34b%p-St zVkX}aN|sm>Vy|q zQX+}Sd=$!t^#yV;qg-Z}X({M|V&o{WP@8*5xmcT92otp&L&JEf2f$Gnd?S{goHt;3 zCZ{MM0KPbVvIbe$f4_e)2tnCq^=W#R^vVG8*-^G=rgvl$(*#9L2#QdX*Ga6mMRSt{qz!y#!<9Ze$UyK5WL62sWq0&;_t7T>2^mCvy}|?)-ns@b>;m^6 zA)%rwv<;v}4)Q5mKRiF(?vFNS{rB)^z(0uH+y}8T70JjI;fS5Q5ATI(B4(e2Xw>eA zEEEb(eC7~8c?Ww7Qx@mbK~Lr2GJrZ(^RpmZx@D=_PH1lejX;3% zmi8v_Nn^t_y2`bp9MwyP1w&WpY&GtTEMR!xVgK?RV)zj}fFuNCX5Im@8z+Bx?w%+` zX43DZBn4bwW@a|a#FYFd!uCI8MW_#20Y24nmr^1qN?LicVu(yW<0}9*iD&Hs1RYA zvYfPedZiOO(Ig*{B@kE5lxuIEZbQyB5o3a_22M!{C;Zm-*PG1i5y@SquOMEAGL}bR zgpcKpfhi%&3UJO}Http9Q&e3rtIXMKbh*G*M@Aock-ww6hvp#Tr6Bgjl|~-oxpw3+ zf#eb57>Jq&$A?IpW5ol7Q}w^|;DZOp9}N4$!;|B|uz&R6`rE^UliBg1aTyb~I-NNI zlvc{+X0iO%w85 z#CzoUD%mT9A;EAU-ZURDItd;Zr|C@9b7O1?*IQ-zVBR#0d1x?tAS7Ob?axlZHcQ@6 z!t@N0De4;IDI$UNloUc}YDBQe`;`#RsGG8@=>RO!t<|7jNw!*?ju%lP9@M;44~s7` zjj&74MqFcZmzkCe>WRr)pPkW8rPa<`iub}1j4bFd3S9|KMuf@3lRb|IJWLV_f<71q zJm$Kf4YUP@jrt0eolqaGcVM{aWe}p5IVTYjrpX0m<*O(!gjdm^rur(;w3seEcRKG* z2jCrK% zxwu%sb(@#m!KBM&s$3GT5VxG)+1W)mYxEwY)f5>@n7T`a2j;M}(;eZd5v-el00_94 zl$IuEbX?jFs52zZh$uDkPC?{QI;WYmK5@s$iR<> ziK=EXAr8^t>=C97?+6QyK>wO*0<<#iq(#13Fxj{f0V)ampu>G;OGRxAwUf+i$O-q2 z*Mw>akq0asutSK<*iQw3Myls; zX+nKo=wzXxRyc5Xbv$1hpJXfv@qWU1y7oZhU}M!^Gw`;Ui2_hy4W2>~;R zzb9j{YB8;)>jF!H8?P_Hoi|gm1enwCPFA+#&SOC&Oszrz#7pu9e=7!axRaE$fqQ{- zF`r@4RP-7^eLm$5pgIwVzs{dR^X_QVaKioM#*ep$=Bme+n+=^E91V6HQZA>XhnTk_OZg|)&wf9MHJ*9nrm=9P3CP?b9oC&D zR6_~840g^SCuu?!(8iIQ_=@rKr*A(-A;9YT)tlEh_4u=o_Mdh-#045 z6hTr)+&BHg@ANdB?e%A$+wH)bzn=B-0R4_`9!ue+&qCf;ywvB4L}#JtA>$(GW;9mG zf$Vb?FLk%5_!#LS*fcC<5Mo))w>x6`U$_YYVxO1GLh zlP={$Ve_KEN`%nT=B)>zP7(bQuH~3(L8apRFp{ZO;rp_Q}>VGQ;9cV7i6b zw*}TRyTBeR)btt+FbSH_Y;+Ad0K`W#IYHuLdWSK0q!j0|F^w#fz*{rsUfRY*FN1t; zkx<3EB&j&bZTa0AKz*2&2c|b5uM%X8LuCzGYqM#H0-)z~HBLovx*BaN%mk2S{Glt! z7my*+kaF%jI@loL7xTo*pwWu%@ZDwcfIt$Hdfe`#N7@&SQS1^?OF$@~(nIon4>#gQ z^j3-k)$6x6&#$e@nz8#CzGAr?Z7dE_ug$3bxCHBs9LQvj!qkW|v44OIGWR3uC_1Sz$0Et*i> z0(+>14|!6+urE!8eHmvCMF5e9m=si~dWtFuqM!-rt@N=o9-pqpEZ&%{9&W4+WZrsI z%_y!kw}IAq6*}8XK$K9G4rpRqBP8%NXpf#4VR1QUK@;yZ+a#cF5K&*j_QU*qp%+Y4 zqK8DlBC{n}ixpOds*CW6WJVS6Q0@YLQv+h(;M~BnpfZA`k4V7u73OU9U?jiLwDC0% z0aQHk+2^-!Z?4Cmzq~aoEb1wyCVTM!Bnau5d9*=h?STpd&qT99@8LUGpStMr*z?5qi>g{< zXY-$Ee+n0nd%X*4vA{X)G3wF!w6mYf<>c59lu>_)(UFLqYf{SuNyy@9riZr6!j-1a z5X>Z#5ZB;Wf+r0H^-xemq;Z{|;pMdtZ9q|-_FX8+M@H$uZ_Uox9ZBGE7G_~E-Pr=$ z$4=#AZl4}+yb-}4&4#pf)q(H?cGgm52%?7xW9wLz2&kobKy7L0&Ci~cw{^blPpnka2 z>LpxP9rK(DG(bWwQU;UA^s5~N(a}LSnv^UjCOxb{S5FNQmonOykETHu^-$7NhAXr7 zT+8mz0P2QJBeS0OCFoO449G$OlBU5O zi5gHAmW<5)vlaN7*l8z((wndcehDskCXwV2eTR_Gi+cGila_?BqH-xb=^kjz0*<^C z6464!vpvZ1t+0=u*WscTi99V|P0c!$QpnvNnd*%WY5hI;GdETXtHr~wmYLMxPisQ; zC^&myvq#m}RDh04mWXrn@q%<0pN(U1XAuz^(`A8e$=Gd7CY(qMLh=d|HTnps zRY^)mC16stV$3YA!9{1k(4-)F3yx&Q1aFbmhK<3gCCj4HYR5I$Ke9K4pYA2}esxw) zc}I`v80^>pUUDSc0o>i37MAO{ME#8QQ_1q_QbT7Ch_m^j8L$N1b!rB{@z@Me4>#WR z@{5EkE~Z3}V~~c4M-e6@MM{!}-~ZnC4htD);PR(+H`h;YKzfkzKG~_&kcMDlUbn;; zVH!f1jc0GJ89A&8s+o(flgbp0{PKz_vX%v4nDNDQbdkyZE_ zG@*KpGXzUn@f}9SOll3TJl&wi0nbmela$O26p*jkN1TH-aEfjiDbh5cQr_j_+0g^{ zavo&$gy9iSp!1e8elJ0C0U>n&nPD){io6W6IwXg)`UG+X8!7J)aAN$>gTjeHoa7v3 z1IXqocxG+)!!zr%N7cAN9(9z-6O10JD{|>B5ckEp33i8?MNJ zCk7k2V;~SvU+%GIgQmT>0Zf=|+NDeBexdQg(xSsgf%=6H6#I05Tx}>uZ68|;<`^7&1{sg! z#*xe=TO7>CK*SG&8^bMhXrW=bP_5Qy>XhqLOegmJ#I1v3erX?Fn!}%OB4ed#xR0tL zLy@cO9H<-^*GmDvr<+I7kDcwk1XK4UjZ-=InPKe3w_rla>p7#04*78i9)b{gdWx8i zU>ETTvyB~+^!!Q-AUP>G=1pn}SAvu3lLAp5oykZ8Nrb-*Wy85QUfVEU>RyxZ6{tm~ z6>^?ZgL-K$@lc*l8PAlXDoQ?~=iO}V@P`OI=y#J63NTqk^w zJ_W=F0NS~!;)5{RMZ$@#mLF&4`o7K#&|OZ2`Ish4 z2q4W}q!*wbe*T(0a&S@#0_Jl^wHw{xMJ(L+rz2COPPkbB5%Exx^XU0DRIi8Zso9}= z`u}mw>+Txa{Uf(fhT(*w+R992;9Lvv0H#Vg+~J4Z;_$CAf>06KWD_Nuzz{}tP1|IS zlee~6TKWLL!MBEQJ3Sw6tn-}yRHJB*W{G5*MTyepba!^pj0-!AvD{(8bPML|A79_R zef81x4Z;m>pM7%uMk*b>EJ)Bh*YLtc-1t@=k-4v0{}5Y4nvg&mikq!xOE>OD$t44* zqXa)}*7Gf;h~g^k6GQ86$3lb|(m53Zd6K$LiX>76M~faF4`uTJrgWWN2VaF83SB!a z!t^?$nG*D&qu%8@Hn46AwK+(msv(y5iP@;M>ek>Yg{)`TJ}ZxkG1(fzg0t))4xk&H z42Flt$HSAO!O6)n!m&?gdmvx)C35FSmrp`%`l<&{gb>7y)|~=gglV8$SNM(WL>bxY zAS*dlFJS&z*zPc#CabB-!9fGfLAHY=FJ`tLu{Sbm2-WaDH|D{!c3nJG z8OhSnBTVm>fZr5%PbBSoIvVr@&r3_?A7*A`%rawP8Y|0pWvJVLNV~}eM%x(Kw#b2L zu`C|6C`l7ShPyK;`E8TDs!Q0u(ubQ`hj73(LWFLxP@*;2dp)a<_|`dR*<57F2g)tJ zVt&LJJ`E^$uxA}zGJT%)Lh4ui%R@NQmCz5Vmt>}_ALsSw`8%sWAN<$BV_}{tJNJp` zBoTHybw?S!)yeV|it*-wf^LLTtr=8rEW_50uyYmuhvN`-)WGZlE8&QEQ2%bu$Nz6A-C8j%$`qp!m2Eb6TYBE6WMtjLdPNF_+Ux zCHKi!NhcZ(zDNvWK67+DV zx_pa-d}4%8aEA>nRa-sW{n$y6BFy$&%G?Q?2f-v^??A-X^Qt~Hg9_Pw9U^>$r9Esk zZ%5(+B^6OnauV8GSOh^kQu9L9taHa77i?xn7mY#UUGiFm`Ofs`rqhao0MD!>qLyA= z9O!B_WKD8v9FUl)Gi|uWV!YNfJuWX;^#rDF2$j^ft=Y=g&3%1!wzImuKWP1q% z!M+m|xR__|q$cy2bM-*4>1Aa`sK6NAIZoOu3ta<$ka>(sz4ST4`xNyFXxysEDq8vMM(+!pxTT@KC~a~ zS_7qQWJl#K5Fvx{UW}NzWFk|)K101-Lsmm@lt{_8!oULli|K3HNg6;KSc==@NvDqf zP9~`ucu-$F1~q&gH0<%=EL32nM@ZND5{=7PU);kTTUa7}QKAyHY%l_&OfZ9Wo8Lrr z8V1zqVkU!WnCAhFS&-@w%m`XHI0|umkd{wLlE~AN?K`puml>MSI8$2%XHJkhAaXH3U@2W|vKY8Cns1;QUP0YO;C6Ut z3b1T<(Yr}T5N%fELt+4!o`QWpXt2TuZroE^(%IIndw!)M3DL}I;aiwnN_P46gG~e)5eQ^Uu{QP?U>hrg^ zVQTtBaC$}X_~A|=qzx>Xg=4O>2g6)WDZ?oS{0m0dxYq3C1Zm4E+A&QapkGF@yo0_e zJ4%FBES6(SRdrZBmc|WCX3TlGSk93FIN6!>kiqo=?OTrt?)1q;SnBS!G_>G;1(h z(HJ&{?@GC6{q8s@1kW4CpSbAW-P&iMDdpaL&OGC;&gWEy}G2Ut9-O&U0l5<+>J`Yjnajff`>o?Dz z@jRCT>WTND(l|^E4yH&1WV$UUE|7s>)ink!KjCt6RL@?#dhzB{F=-{bq&9ta6;Fq2 zS;-PelPBdKHI3lYMg10J;8;3AqE;l#$X0^1Na+8Y2e-mvuO4PkztMB})#56EN?q3x+dWUCpPcP!#kL5#VlhM4xDGs}yGA#IA(J zLBRb_ncv9@WoDT=&Zn%bXQzna(`yub)JC^jkMQlVktKH+1Ro&Zl(wNOZhw^IL3G94 z9e$4od?JrWK_|9GD1$JdCbk_NhUqNw`!jI*3Nr|WQxC(H)|GM{)^-YmGKdB6C4^on z);lbb)IUxw16#Pl`+a&9gHZVRk}2NS9!fGN{u7C&yHiVUbhO;g>hHP}NOzH@y%P@H8uB;BT2F>oIgOt!Zde{ef{D>p5@?n&n zN>A8T&BM-0D%SvN_;y;z?$lGOwO-g!umULmgWZFjT=!53q`8=(p%=GntzP*(aejI&*e7d4B$rQ-7geq#%-{%EY+~tqs*` zM6wQj+Kagu188OyJcyznqZ8NS+gKOiISk94&iW?ERAG;4IPU4q;i}jXh;dn7gjjPZ z5xP{5y51m;CHZPyqckqeFYE#nd!V_TWcRhrZ994x+V|b+>2B0`sWEA%ds9$hUrJtz--XnJN4-6y*UsuqIpL?&=*hxU5bt`(JO z5?o^nQrcwVB~0BpYuY9$e9voyL>V`W7PN989xwsbOeEJ-th(0IV?cW^tx5^V@L;wL zNau*)SXU@1WcB>EPzvs#Ao_tep(aE2p~`X()zwUuYI!jiRl>MrnyS7FjS;tSqsNCl!E^ zq46{#7XGrj9{Z~9q0mtO1=*$OXXQT*oXFnUDV$+_XQx1x@9Y##x4yGeJnH%Y`Y>#w zJ?(wJ&{ogMsfSZJIkj*qk19j?_FlqR6y-N&M3zsF_+m5i1)~U*c}rBX3kvzgXbo!& zG-fOh-6cT|5@{~&4Goai)3_bTs-k#vE>S|%*?4WNh!9w9YS4#UuT+DHjkNu^P}~CR z(dO)fX`w=#4nJj|@ndY=*n!17ZlgM1EhhCNi#1{(%xv>yd%lMm*wjC?*Z51kNsrdb zSiB1=xtD_}VX3=mDczB?5vK0kCDb=0%tCZ!B>|DkW~1gtz0Y~5367|tcolm$8r7SQ zp9|LNdOU)-Gnp+>_Jn|ehZ#6UAXIv*wTd7J>8-{6#RJpl=mUBP$MQ5$WT#@YLH7GH~d1;_`vFL=f`>@DmJqmqQ za7I&ELxl}t^~u9iyp&3w8?594M7_(xTZ zw*BK&6Bg_72R%&95S6RJr?JW2!#^wu%kobu4f|a-pj62IyKmk+Lw$wb?;gC@``teN zKX?~<J6GDg5W=(EH#pjL-z zwa~+X3$NiybCs|Z5WN&`#FU^XBxAHr3Y>b${c2BJq(1Y)RbB``@hQPl6E6FhahHOa7ka-cI z95KVx1;ab~SRBD<^3{4ihHx6H6*eDwu`;)p-b+LBLgx*ut~qO(AAIL%v9Z6l2lB(H zUFyhDZ6^;ouQPG zG}5|yIDKq)`h6W>-KI?fH(-aiP_5Pp!;$fQ^+ttRiLEK(nn+uhlxgLF_xFccshr{GEB^hryFIA zC5LFNMp-W}s5OC2hVy)QWaA%@Z^nlAf3Sc@0c@9FXZ@!WaLb>3s`^}9YH}^PRB_N1 zV%#jfNIuNYyik2tivQOarOQZ-s}CR7hh-Hc(k7ii_~B#Xdi5wAjfA+)QgYf^^C6S2 zVjoRN#sK=cZ%yqX;;P9?8$h2~5}EUchzThp$e&$ceoaw(9CpNmFCO^8?SSfLupFae z(+lR;gWNpssFc|%N5j;{aH}G=M~LCZVH{j7R@h2UcK~y_5=rAbC_}aD+_WBSxn9s5 z!Q?w0Ux2$`lE&g}k`Kd%LPU7Sr{5=M|Mc0bSJyA+2;}~PiY5hfs9qx;G|223=4j9e z(A6$vQ>I@1@v}Fo(v{`wX?0ykbD2Pnz4i6Yi_bruzk1G7qH$#WhB6C&j{EqnL!ujP zdJUHVr9KW_{Ncu-iVX?)SbroJ$1B~UFLujQ^no}PEMW)hsR-+GBaaSQDL!n*n zOAl8G?xw-wcrmhB5aStK1@T`y3fDYi(w-sPO;;nRZ^e}!%=?p*Bz{S!lSF$@ygw`$ zPLorfO-X;V6%8FU3EU|BbT~?IqV6ezAFSZdfmzKIl8K?>UnqYZ9VJo5CTPA)`b4Zt z`LYtG_lR9&l|x*prBv(3&pv^u@Z;AnKDz&e@`Tol!2!&4oFWYqL{@Fuk#eUs8nC<6 zf%%(hOC~{(iZOBq$900V)q7Cy4>4!8WdrjkBm>(N= zR$P~OUmQ~7K9%M!-Y6kA-j{~oxbd|0!c)D_e7}uyrj8*N*wWyyz$s-KS|Op+(d9(s zI+`c3_VIVDEmX8%@hO#tTN5l;3mZ?^*`Ei~Sw-yh3}D;N{wF_Y|Cl-SRR=WudB5QJ z=lz8K;OG4a#H)dm6apz|^Dx@Mf+@`#i4;aJJW@7PeK&HNh1m~eh%GYaMgAoWs8P*kNu( z{uO9LxD1CJrWOVGR#_LzM#&qL$4~LV1qw*b6qL>2N6W#Eyi{5!>}*kHrCN65qcaLU}8NphGgI6rY`&pdz< zXDkl4@1;LtAc+j)S)*8+6id|k=o_btdgh*Lc&xV@*m`FwwV!aTK9dzuHb!Vsg&?F!7hF@*s| z12nB$IHWWPV(D6g?RL3-Kv!ai%N4c|Ef$c$EPWjd8DZH%LYl14jm;XQMm-muWSJI zLfhODPf<{3f#tRJH>Y3Ggwy~k5mXIQ78&?75mc4~MH+7tHpjXc-ML9#5+eheg~`SB zrU_o?9$^|ht60P7pGsQWMW9$gV{;>5*O>^v7)>vG!T(EYUgHg4rsL(^LBYRhd(yl~ z(->^#erS&w`)s?o%cB!>LCv|BkmI7Kn89#{vwseI>34l-i<+IMSgkeEl|#Vuoq+bj?wG`QI66>#uF+i6f*+he1uXx2o&Aq z2imHJ$~8Fk%FYzw;PbH1Wra{dQyzUz=o(9*q2!9;@JjPyz$2y^2v-_!5{BsYV^)9} z5#<1l0jDr^1CbHTX6_ZT{P$#~li`#W$<0)j7k<4=yq5v?TE8;;6Lt|V(non{SuXS{2t#3Sqh9t~_n4fa;0qpY z6$FpepkCtGG}56OO|Z|I)y^B#%Q*h#5vAt73hgmybs6pq>08=ost~+`-MdDmkrw=!e zoF2t%%@<8yEZZ`fE=H7MnUBQ(kavgBb*sOQ>Mcyg)OHH~lqN9W8Fb+US&rLBB~*o7 zcBD1pDA0OZ4fgSWS%dU1%nROL_qUJSq|k&6c0z_bA@B(7c-qlU$nj3dgPo8QK!Vim zZsSgB;+Z2UtfJ+AllyIxE26UnYJFvB2U76S>)sy#3-Urqx1W7}bN$J885f^uF&oT9>Q*8(~v z2;LUa-5qfQf%3Lb1WTlsW2zqETdGIL?V2wUqPOau)8%MQs;Hd|v5Aq}=f`$-Fm!Yj zq-a30y-hloZS6qzY(`z|%cB#LPQwiA?FKbM+fAYkVtuwG$V)D+1b44dZt-&3g+HkZUpXYxlylxKeFXc5X-~^ z^E=y712TZ(ySMWLkp1m^qIHW``d*?xUIqCD5molRG~B`AfT9$e365ljA8xU)zar26 z3j{jvP=|2V9bg>Ay%(gn%@e#UCc!X>Ipl5Nt<-9aspav%6zXOTk0@<2Fb$wA`uVe0 zA2C^t4X{K$6kpCEpO=H;V$Qt6ekV7HFm*SKTQBS@VM0dVlw&IoW~Knrd*83bYM8`a7R zC8)vj0%LY`JIDY>O)OYC)OA~yzo1pmBrLL$qo(nw=#gga)y!ek9Aqte^T8+_@F zFSu=1`|jdH=>OA+#gYrzP{c87lC23V`WS^lgP2Yel$>Ly*vB3tifLt(84-*@SBvcc z$KoApIXJu-cx@a&nN3rU_y-oyVK?f&Jl^OZ;#Ypv8`y&4R$z#^5ZBBWpHPH`c%% z!6YjF3#)fJ1Pf7RTqMzRbJb+o@}#8U)C3ohqq0%LG~ay4l=}mRC+GVOab&|Jrf{l0e6+ek(nO1Qx8WL{ zs7GeZYWgMGaNXuiIG<@~h=^#8TB$T>(+=RF0x7Oh8UP$~_IS0K?1vv@N$L0Zcuv5F+~^2x&}=( zC4+_DHC=jl%r#cgH&)?Dw)k~c1YKwpis5zo>k?3tCPUtQ%wS4X=9To}_KXsu&R}_< zP;i0Ntn&jG-rHAiUVOqr(uj-RL$aqL7T>-h%|wZ5$>e40F_0SxC|mFwbO;5Y?L{95#{<(KEBAvxG^$HKLh4);3`ke4G}BinW;^ zu&*k|3;+$wjVSaOrs_PX0BOQ#c>rpRmhyGzmxw}A&ru?wELg|yXWfKQqfW>!Aro^j ze5>@e*hYLIYk?R91Hev3*9A6;V`^k~wnv2NB^iMNK}D0t6KD@Zw6=1DJa6&?triw5 zJj{E6cUE0) zfHd7!>(6ITIdPiRkmFpMYcb1d+A`WHS`;#tTb(qwzyzTYPO}|doS}M9yvAq|Tv@Bx zFd*n9O(JWQ#FZAYBoH^=%=kW3YsPxf3K_P_k+CsiLyXJUYQ-zf8Q}UoiY3rKsTaSFjg|C!hnYD2yl{@FV!#*Ej}=Rkt`i88GEz z)9th5fk#N3Y$d84JjFV1L!?}4W~(G2TK8w8OH}zp#gs^P5wBemt#C#}R~T=W6six? z99v0*;{2dk9OmK@q=04#vow1+d<&c&W=yyUl*>dGok@}lEAfyLS4J_JYlL+*MGcej zBT%oS`8NdDj}Y-3iEt%^GBFK4 z|Fdaze6U>|Yu>>O^&gf-GO~_;LjcO-`DA-;>G0yC4Z0fJjINR-#Ts7uS=1`(MWYWs z4liKD8q$8i%r3StbzWY~XLE?#tle)MQ?G|}q>F1RCP1n(0jiko9Q4pXL8sjIOVS(Civs0Ooy!5IBM~R?U5&xafnqtNs9pGsLc&Y79 z?^=YV?o}TTsc-;1nouGK_>%3(BC4jqT$G2;goFK1A0`&GGLo}#D#vQ_-|7uPD0<&E zcZzKdmS(^XKSj09Z}p&XMdPmN0sS(93!^b~Td=YQtD@nwBh(8Mo(XeDIPe`yjfAW` zhmS&UEVY@*^t~j6c%jVZh-se|q!!)r-G{bFg2(g2X5Rue%qZ zN}Q}w|EGP}T+z4(h72)`&Qm-~OeI)rc0uq#XBU?|-Vv-w<{{03Fc^jg2(p`Dlc6<$ z5eHDx1xUb>F6N!gt~KFeX%iGk`;dK*?clO#;#jD&7@&G8jZ&)-gpbuInkj}Mqon|< zJ73^7+uWnYc@3%0IK`@@qYa>*V?^ML`{L{ft}{i~giC!2}62?Oq;@aPb?=XVD&|%6 zMR0IF3kabh2F?Nt!jyLyEfZw4oUU%dMv9E#?p? zewwv5^#ZFl4XH#|kXHKm4L!d9mOC>m(lWHD9~xHMN{U)FMv*9wa&nz5S_Mj2>h5A* zcfef&#v8V9^J4n46!Szbux{|bb-Rsatk2!XX1(Vv<~HV{l_T(acnwbd|!_4^=$NRD}zQx;gLQX@tfSjd}Wa_=UcMYA2TDD=Ooo z3*!8%>+6r|pFBq>e|>BFlNBF$=BQ@H%0C>ZBrb-X%qtpI8CexGxMFj#VDey0%!i*j z>RWYlUb9-J^LPcpZzkibQ&adXST&Ts4tcoYux2q4n*iHz#ZqY_!0It&s4K*Dr9y`i zGu$K@%$I3~`tR_IfiBr8CB%M2d9MC06Hp_gu!EVepof-t zmjQgzQSY3o2$q774zr}l*tj>NMIs(4SRf?wAwF+$WkxA%280msS__n<$S8*f36LL` zgMD1|+y?5VH;0hZT+IU2w)5&33CCXV|A0I7J<&zoCD8*E5;G3V0n+#=M)4PnH8e?w z{b1s2cb~Y}8+v)CPhchY+aSi~pON747JM1*p{N{5Kz>IK_7C^;aIaK1?C*tSY97`L z&mhfczfupVps z4hoXrgvB|*xuD#wu-0q*;Yu%}Jj5j$AFgJShr)#oBNeXqIz}vB2_t+ZJ~u?o2e+52 zs4m=KQcoU4^M_vO@p9di6M71U<{`(SjwedxP#>e?ucDs>HrEB~J5*W(1PT$#Bp3x0 z$E&?Y?BZfNU56NZieQXqWShQC=osqPzmay&R^3RZ=<+OL4QHs-@_ekR!+%-OFR4p&=xkiafn@7O&S1 zJLrIl*wYj~UY|FMOq0+@kVa%$qe2Rg5&G36i7l{h3SYJa$v0|<#pZ?KFzDUPnKw!@ z7)F|*5@I$tBNjHQb~s;{kE4XoNK6#{Dlh#8Y#SVCzSHB;1;%U4%UeWVIaU!vI-o`; z+)C8BKoO>ypfyj4){~fgZI~VHqUPG7m3WAggbP=c?_{?U6Rc+@`6RGcug*l##3|em z^X)cbQfT~V^gV&~sEm9@wv+`>%#3=vwLi%r90B-im-67XslMO)nZ*fPbt>H;-61$# zJejG};ez-9tPS+H@ffFL&8=eTiO>MP0)!9CS1`26Dvr7;!1_Ybj5WyZdINO`O`wOE zCW_rWiaXFgj+2fKcSruLRc(7WEXuw!)PUfP9YY za9)85r%I=CJ|i^z!%I~7A+QBQgaW>MK6^?A&3%WWXdxX!2ahrc<-IJWb=PCyFKc_s z;uC0)HWX$sB;wTai((EaLUgMlnYLiWijkHK4YZidc$Gaa_c=n74^$31_W5POP)XdZ zHKDHYm4VwS!j+z$PucYBJ;~ABMeiY+StY@HMx8jPNH;k{SvHgcP~5Vn87+#s`q_TG z6*B~^+Yb-Gd}-CQ*cF_-=h*GLsH1~Mj|dxj`ncg+0r(AwF{L7p#moEK0+FMa^-IlY z1mY*}Z#ke6rm+wyRs9B`7fh@DO70HbV5GY3@CXlTdpwl!a6~bGO4q-Vw=%VAxg&Q@ip&;&yhpnkGFY_Lj%&_6MFup*oz9DPn#|Y7qLMqB#!W>RzA*Bnst2 zMrMGI@1ng1_4U8~^zCOq8px61PQfLzLtSeRmdtQQgWM1ZA&74C0Ei2y!x^#y#mJhl z*tjNu)n`3A?%V{bT}7dSAF!(%IC#n-*!6%NJq)3}(w#AFdew~?Qv72;5LEVx(N*({ z%he^y()KBB=YqKJaB~Y1prW zjt!;uMh~ruaSS7GpbNs;J_E}$FEN~aa3QnMQeZ@vVEe%?MR`37NOgb?rf`m@(~Xyi zTP#sd{4c@`M^X?xW1n){B?+rX#K*8GJ^?lO;1$4@4BmbgcElyLS32F02{9`q+6E|1 zf@|qs@F!epn+2;8qCBSxSf}lt7lLXdn|XN9lweC(dYR!>XE0mYMm!j2J?W+1S-`Z+rirI2454SAB&G50aB9bO3hZ*#WN{>&kaYY#vV zu(imI!C<=@3}aADs&5+3&~ZNx?E@N&o3VrGCSD3j)WelX05*-6)l_9N*+YMwIR)itVvW>U-X3IP1ee};m zO4&Y{OSh6N^<stFb$wjS2y=WcDN_%xiBWBs5YK~^-bbem;{(uQdTuDG@2Aq z1q~YNW)|;i4eCXGm5X9!?BJvyEvjwcVSIi3>=3ukOb4!xswgnhl}PVqM)P8^P`<{7F*dMz>Unt@f2L8<9q*2xS9!Po5-3WLX( zQ*MM($#Y8-HQGF7==yfLl=kFY!SQBCCn*J~%!YPCLK&5|BJIIK!Osm>)_8%41<|0g zNlT%<;Zbv;N_D(c566+dhb^7xRjBBZGzOqZfNI{8_6v3QJy;=_2thrV_04$+zhR!| z$kDD(PqaBo(PC#ey~m;4^r*BhhKrm#!xIzxvAjo8w07wc-5o48---Zm4*1Dt3=KR` z!lif6SP~T}EU{)-Fxrw*5@4b{1rc#dz@ZkOg3M2R5+s$p;FU`G(6EcLj8K9>-9w5M znS_?nnTHF*;Yy1L#Q=t4n~S!wzXgM)5b8eXr^il&MOHjDZ#OkH4y+l2B{G*mHDMaD zNt9m9!!I;mi=OJ&uMh_lxG`sd)F&P zJFv}0Bug-TBuS|i)q0Hh%8y^)d^Udl_SNn6O?CVF^AK6t(ZRu8h&PBRZ*T3uO&P@P z)I_uT7$skCR%g_D5t0Ig^I`#}g+Af_S-+371~)=h7Ih=nN`y;9pKIpzI!`ZWGZX^m zp~bB*R5|v>s7G{tyZvJJV)j}Ar0eknIs36qNSu+p^Ck^E7pe&nLll51CE-eNZuOKe z7$?Wkt_jtmkYqwy96)r@Kj-nxg@Uz~U36zMjKW-q{ECtsHlZyvR}3(s1@o}o2TmRu zkpjK_D6W|_G|0Wv;lQNF&u(75c=gHN_`KS}VPdpj+prmv1Q1^2+zq=)V~rsxPID#< z7Bf3DYi}r8EY*c!teD+Kj}NPO%7_=K8#Tq28PqAC!!#pmGFP>^J0VHaz@T=e>q(rP zPZsb=X9%dQJ`ld>2EpO3c%aP`=?hNC#l9T(U4}C!a};2o-|szdnQe=cr4zCs#}6^q zdU%k-wqT+Q_+!<`xuk5;E|CiUO90ggoSTKRNF-g^`MBJz5FvwTDQ~{D+4sAf(L=(+ zl`uV%o-Ib4bK`hk!ZghVT^NXGf&0$VgdXuLD3r}t@&f}K?(zd0SdT_b=yJr$AQuX^ zNS6|3m2I;~RjI=+iOxz&ysb`puu#D89d-;&b)OrAlrhsHtv8Y8>o5b+c~ugor*Vr( zZnm;OpukeqU`BFNoUe-t2NY1P3zv(P!p|6cV4l5jr2(c5&s_89 z5boq1nirdsWL=52wjg+NN^-DexdExNT>h^2e=vXb=JwgE=cpnMMz-ULNM0zOIQVlvaoBj`@X!53oV!p}H#zsc?>+w`j#Ac9<`5 z;6macXi=dcYNu)2i>3PXnYJdoe~5Uo3%!JFFV?S(woeF-G;<)pPz9Ym3W8BMny1cI z({rC-@wQK-Qd1DX&v2c86TJ(;*JX|^Lmx@9QSj;S7JM=(#e@803$U08;gQ@p=FEwX z)x5H40T-TWUFct6@QiuQDL~KOVjf((@`UF%pT54iEsKS49yzU}4GM{LNEQL)7;QVb z6Q!FV7b`fMuD(LF%6NQRrn*a_f(-C8+zf9AY$ca#oTbjFDA%DFmLMq|N(reWbAZZk zxuc`LEN&-@d&xJHS<}zY4&1yyG$C^d>392N=KDiNNYu)#6dlfLyww#?#KFTQ;Zx^? zUkOKDkcw*ck8H0;mBWsnuB^C}ENllEb?J=%b}y~YuxY1AkiB%KNEGTeBJCu# zvXlk>!+z$ZSj`Sg5%AyInLe|dCy0y7ehWt2BXR>}g0+`~s7c5QRd##@qXvv{gM$aa zU~CU?t}Ms0XUYNx+=4k@@nAQvlHdW?79}A%k*bN%8`_b_Ty_vz1nmj#SA-&!?57FS z4N=!zk1IqkAt=^X7io8Uuuj3sM~sl-&TNcfO3WAvMeSQmU33GpUub5-f(=+YH`eyT z;VMDjIOvbKa&B_NUKuZ2xmXRL#;vspVu)8Th?jb`c8Ifz+%pu;D}tva9;Dk}h5`Z3 z9BC~gRs`dLELkO~Xn{2@(PpVshv5@h+`_R599RR-VuEzdDmt#G`<@O7t*R}>YF>FM zFH{%TZM0#a0AyakVTfbwunT6c;BzK84i|(9kj*3NYb;^M+488$<-C$uv>qX^#5e@? zL0BHlQDDIzhbY@|Xf{ghbHQ!0m`leKJ;pPcfYYU+0;LQVtwUA{@|v3dn+&9Z1U9lQk zcv`dpHjn@Cep zN=vjhVA=Em0qil0vFr7{A*?5Fkl{Onxc zADTy~<%NKFrHN-txTQnJu|+j~gM+5Q6Io%aox9K|!KJYnHE`o=G}tmV`sXmzDjh$b zkef%E!W#yECgiHIp>&9)@En79siihaA)`nQIU$4SY49cu%!3z&{M zASQXeM4q=$%I48R~nP1I$Fj&T5QJfhm{x1?%VQMGs z;N7jaJHB2PComs;2SFek8QM*4xU9}p*euFwI4Q*zhf%#y{uLxdn&1jy1E{x1fXH<6 zPCHKl*KJgrxGiaD?{v~en7WGsXR0Xt5ACLemoBck*DPEKuJOX^5BysWy+*MvSvp7* zkJ_DR8w0$|7ZT|juD;aU)J3DA%7DFS@nWbY;T31?09;>1nU3sJjFmd<&?T zl!(--;Z0;JvB{$qQg$kitSDj?M28q*KPDv-^UCy`CRBs)08Lg^aOWtsyhIyUs2ZuCQSyteNbP-DQxEJ zb0rm_UZGXRrCxryaIcRPJ|2HQY?^M9TIFDUtXj$93;T3xRVR9LAj}MJKB~u0;UfTH z=OxNa=u%^3IDd+X&-Nz~Gy|q7Mpda9wHsS9B8g_+C>;zP#Z|)I7_NXPA$pm{JK<-w zo}#cPvdSLSO9Yc61uZE`)Eqeu28k{fG*u&nVW@3_ri^l<_%I=`2Pv(~CVHQ!*ERD) zhs-T0`dyR*%=qd8TYCxPBJ^8F`ek&0gbnISbgnoWNh{ zn)l#NUsEVi((Q=iZsZZ|3t->+=K9U`t6L5gc!4c$@m^R;*v{~mQ7gh3qMA^qRXO0$ zB-VDjz8|iWYFbGnC*mp_)RB~?`R*g_%s6MnmVyT4g1g+JUEox#^XA3tn-{k~J-d1R z_H)D#LZQ64nj@?jbvzp&VH8;7>9aT2P!oVzJuWd@n98e`y)7IKthJ4rxm#33)5I|> z+sI=BDoo<%B3J(aT2Yy4Xk4E(cZo90aBM6_DBIn*&Q$;D>eOkqioS_>dcB!}3nl|? z48^)->AqUQKA8e)ba}{omp8QqE9{!bNNVd3RNz`xPgC1CTuS?h%SS$IV8T%}Yk@T- zq?I9p_%ZlJ<64-*X#=5y;f2$E0G|&%Ryd*|1<$Ap7~f2#6KP~cs>K$uMy%$uKA+>< zl63`JYois7+GHChkZxux7~C{NoS^W?=^E7-MNV0{MOPZtvo~+9Z*J?)pWQtBZ2$U; z&u=K2{rL5ZkM4^YBR&Mb#rw2QO?hkh1*1TBSI?ez z?ceX)-P_d<=oS1DFVr-Mcp8MG0;VO228<_d1IBxP3?AWj*|H6(9ma#wg z;C3!b|M<%vzWe3}U*%@s+9uNtJQpuqiAXseCxhUTz5EwOyynRlG$wp=SC@@%&LR3(O`N%ATEXijOx@k~&R7c_Tj(S#M0y}n zgQ~j0kp4sGT)}}rwPOc{lEw?gb(9u1#M82@RoSVqtdUu_vOy>py071Zia+RSsl$~f z-a`gv+r?F^f8^HH0;I3TsOd08QByMzF=84GHkmRRftAx68bS_AL@Qx>Vut{ct5c=8 zL2ge`XtAa2(j^ErAn04;M4?ujZATY`9S{5LeuymbPybZ4!rO z*b-Yzzl+^qYe1Hy@=wDJ;N{JSu@_aoeoY^Pu-bDqn?~{y7C#r~^U;h4%Urpz>KYSz2v z|BnxWVceC8&c!+ijkC^;Dtg&V8hht7AY9>CJUb33ezsHNc1UcncN zSt^F!OSVas?=65@e0o6{8RU2g1muo~)Gf8Z{#8g(*(Br^YB41=p&*%8mN|r^bi$*{ z!tl)xadd-6xY8pnSPy5$jUbC3hcik#LiU7hMydzS1{5L2$N@VQu}3S$pv#JZxIokg zzQ5NxRIJB3d|WZ)X)=t%|6%R?gD+HeKiSdBE;)vP762>4k}+q|)k{Ml2d6v8U1Lxy zC=e;OwDp+n;`*T!M`GRd$58t{uN1Xfg^4)D6opvLWREuA*`C1LtovnKI|4NpDSOzh zrp_Y3Cp1hh;W~msq?^2wiF;qemDY|m@?_r9pQu}N0>TuOUG&-wD%>!Klcv4?!QNvq zQH%j6?ts_D3oyhzCnhlH;68XXF-v(2g3cUwPmjeQsKv3$tT^Ds-G#lnz&?W>g&2-M z372|qA*y-u_#pVf$Yx_oxx89B$Hb!*onWcFo}X-il}(3O`58!9kJWm++u&tDO(gd% zLwBqB52y7pOij@oh!{dlR-i;mONz910 z{V$n1DouBNJ@g*i-pC5;o3G5Hi71gYogs%scv~AP(rVdxyYr%1Hg|M#dw_s8nU=Ouw%SIl8JqQuz6jyLmLWj5#VH&eB%NRt1{rJI` zmLK}Sd?OU6L6|#6Br@Ri)z&B{JuJ?(2a zRXn0XgGkv9bV{=6{U0Dt6k+A;rY^B!d!VjmCQ2rk8}ZG+`Zju;XP3zAq`eHz5~Seb ze7&28z`UMe>+0A+a088zIibt05T(B)}m~r1%mSkphAsTxF7H(`fDCCJ;^$jvrDVd$*r`jsPcUy-2?V_lg<* z?LbvyyFYiRYIfUQ!K#!Xll)&jMznpiMMNj_fib~sI?Fv^)}nq!3GEcMj&Lj!!a7Yj z?t}HH2p2Xem%}1F1+jrzWwH=g$7$fWs#X?a0?|Pi8U*y^MN!c@MBR8aog1RUmF@}p z4HcfrxI7dU*L#F}HG`wI4aD-`iLb$T4Z@Oq*RfiJ$^57mQ4$7CRfIWB4g;UAtN8*% zh2<#w>-UHK#p0o3nOD{X#neeylA)3V}rdwo;3lA8aQxuDt~vG+ zg`S9I@$Y?}7ZrUCL1HgpdN{3A)Va@a@VPRX!-XRn+>SU!xXUopfaG4}_1PIt@Gc@H zvi;>yy*^;&+nYDHi|bdP+dh+zFR@zf0bDXnvSH z6*A1Lq=fL(h1|R+^8H*!xT6ydKwqg>V2*b`E3m=4dj*DfcdsCd-`y*U++Wh|tBs$A zf5{JbKW+Hco_74zrUQvWU+JxbqadF1U@$t~VVnjg!BjwkO8VAOoXM&;sisi}l%<=D z^qDEW+m#<-!dr3}6p3*gLkPOh%EmC{o+Jxfl&s0UnNbZjm$R5@5;b`VCkKre#%CKK z?b(zI#=v+#XI`NwJY*Sb))g7AePv$|iqeHEZL*Ag4c8(Z&di32y)^cQ=|*;vLG8Eh z4f#8#v-24aU_SH17Mww}p>h6XRa-Mx4AXO!Qg-< zUD%KU{>-4{Jei?k^iF$9n5Bddp~X}3^20lLD_71u0I*jr!m9NVEdZcaMJZ@F?!`O^ zAt7xK@o=;`^lZkgywPEIM2`jrn7)8DZgKh!f(DtgYvZAP{(kRg5rngg7nA>ows&oA zBRSHA^;2-Xu@jU%V-o-`()zLi;zD9X5)c5AlD{B05@$xo8fikJZ0$LF_P4*!^JHdS zx*Ht%@;bsJR%M~Px+*Ix?}=0*)`3sZU_*NDyG-h&;6n7Or|;?^x&0m&5h}Suds(a6 z*i{HQ4WQ;t!Hm`oX0?};77aa4;ko#X@t$%yft1T*WqoymlsxkV<3jf050diy_aDgE zaIx)1a9*ra&7Pwk3>R>SisD))=c7xMWjfV?>ge}*D(wx0DX2_) zCPWy`_7P!*XuVZ^eA1@5KA{Zwm*2f|AQ`U8PY5+x;gNPJq_qS|2DEM=z-kUn47?^& zwX@@3$@oDTDg@B+G#vzJU24GzYTsRuR`6fs|Fv?QFXu%}hVmZ;V-S-aCmv+l?NH?O z0zC^ng%BRSvO|@_5F>EY^IL8AAahsz#bJ!9`o%$TEPAQ1I|j@D-qVvK_ui*5!f`v>TwjkmvBL;~gffCP*@Glm_Wej8Z~11)XDsFb7x9 z1?Pe2O8D06>eNJu^t?!rN_Ctn1F#{e?o#HD+Pp{s`S?@JOtuClm1IK+Z*rb^JnB*K z*$3SMRRdxdM{K5%x@c)ys(*Dc-khS!JOq04rrz%#jIW9d9B?K}Pl9hNcD)EBc0WDUff?%E931VyjBS|`(M8o5!B#LV3_ z8$-|5<_Nu1SA}%G*u;kmgdct?97z!Bn2QafTIt}RW6#*1*u`Z{HN z4$qe?`{ViSIH?)Ha?M1N+&s2G`pS1o0pvEc+@U>_Xn@<`+bK%MQFf@8r3Kc^q)C$- z5~sGlkqZTp#mcP1m`zG$l+!HGGTis}IPaoz(yn~brcQ){q#9rkv|Fg}6{Di17p{>i z8tKqs@V{hMSJU%PdY#>R7|T^CDSG3pIr9wDC+lM(slMw1Q?vM7w-|RkFqIvssDp%6 zf1Zo3vOGRYmH2RbvX0JbaefZrfR`y4SF!a-4etaBL8fMwht_4_Da4hu9f^*L$d&@C zkK*o9@p1;8j7eIB&MW{L865r16%sKdmR>D=JROvjL@Z;Flk5_rNAaZ1HwvMnq? zR*K$KJU*m-o2wNz;Edl2oLr(5;1&4?vy)Gs(lf!3%Orp*S%%JQ;m22~EWJ=Ij#8AY zWg?E=uOIiKt*Dy%;oWAj5HI`+(rjGe+387;V73Hc2v{&2c-{=uz=6sj4TjfB!fPa6 zwCEvuF%+0x18V1pClKLFjMmwwSs6(NOP#+9rhFzFw59Va?#YSz-!3aI-Mw< zLLjCe)Bz;D#P&&jLb{JytOs7I6@EFF(h)ZLMA?J#^GdaQ! z(R%HC3w#!l43?mfHvmSWv9f2uaB(grJ{lxubiS+tXH4g4?4H;Xd^clqQjIxNb2fV= zQHYTR;qdRwO?{#$N+|1$qC`vZliN?PSKzQ2P4?>c?cE2zef+L>T4t$w!~)y3WR@(H zdZfErmoEU+(EHBnyOjl;5PGMqSalquVKVFPlDDmDSWUlHy~BuKoS zK*{aHW?9^i+)ei>0E;0Fb$`EflR`ESe2Nxd$`bfeiD$I@!IbSY5vw)Q!ioDMu(MO2GZ*#;I;3AU`sR2$u*$ReO7p|f9>E9pA>ZMd{SXGo)m+6VL1^RwG` zuYm}XxY%3tX?=1&oECM@Ak9bm5;*csk%4D1xjLUFzSXeIM4%)H`@wUDgBMoGf>^kN zvy;}hyPROs(=3UNAZ^~VGm3NTCwEC-r!>G8c~VORrq&{ z2AX$3MfWI1kRwv2CV3(Yg_FFZ1H?Vcf4lDw2Rb}hp=3_;Uv-SM^8iw8OJORDPK97(zcqn| zOJUhSlym^uKZtq7WzjLfPh{{@sL^+}zB;FXP*ygz8I@cdjU8UlZ|88YreV>F`>qGE zOL0UmiF$Iv#saFDIWq8+S+uU#?G*(CJ*K-+r^K9KdJI3D1%)inEYH*vEp8E@Sx<)V zEr9tU60yT!9G9%&nv|+k&>6j3J%^b1VzzqT_{1huk1g&cdIL96z6CDU#kG{ppV*=$ zpngDI#WI&q!+y_h7Axc}%fYT3LUkd0Sm2$D{UTEM-G?|?UVK-xG0JjuT!(}Bbdvg; zE11Lz^_1FNibq>=%;qtTxQVQ|oUl~zxQ|*E#{AN~#hj3-EV-T_FdZ2<<|rFq=upaT zJ>7l*4-o`Xt(HDAn)ZHq+7KJWYzLBultSsD79Uz^P^Od~ijpn5u`hwnr!!StiDRB5 z^wH%ESXUB5&(dkM&~jG@ow4*tNHcm_aiTTE@X)0-tPJXV>vnU|CFD4R7#M|Ni=?H}8le4%pJPPrr=c;2PFYq!xmuYTLuby~iIs&Lj5tTbQs@ z@?qpkth0z6Uy1qldMwEPQHmtx-uf3QB_0+o5x`@Q;>ZAfc^vEsC?Gm4iIDBC1n$b? z&lx~VhrWx|5FzUrf)(R3*RE_k68#|?mltV~C*F4UXZ~(m=lN4|j6#u6uscoAqtVq1 zSLZ_(ob>t@*c8lOzwNA$L0Tr8JBfo;-S!*M@4jE44f=^_!~d$wIho=D{J9o9S_L)g z@P3}2!ZpPU=w=C?D_aeAvK8fXEtm7}?K3(DdWBvU*xf^VwEx%p+mCPF-tB?bb9S3K zQXR5jS^F+bAgxroeRSP^vQrISFYMamgsW>bXt@Qr~N|XZJs7iQ42J3!r_LGZyC7Ujz_x5lStRr#BP_ zhLA6)dAtS~(9ebo8d)| z3vPwdl^Ki-gcv#SU@-7maauYFCVrpdZ*a|`Y?Tw54xp=nJya@MI*!~j#<@{g4+%es z>TY`PWVI4ZYo*tuM1kmnl7T|I`pwkoDU-cX(1Mz9;`{qYq&wEFT2=$pvZ^U3cw?iS z8V<9>V(Fp-l9TR7q>LZw(m$gFXJjVhOb2gsE8*S+oXDYuxH^aB01_$k4TT9&)Qdlf5{WK3 zJCQCSIM)uHwLXWgRplWwfmekTnHg2OqVmhK8Oy-=>pWjX3SjqjD=+~*j~cEI^z63H z7t}BfH^GvkF}&)^hE_v&dQOx%f{MG{Wi%6W~mA68(Hf?te(}T2& z?uy>I!wIJ0+%RZ!CNR%Ig{@45^b%xum`f(B>uvwh#TDw#BhcRTN66diH>~S)Wr8pa zrbv5wK#h(^eCG}!LoteoT#ZtPM(I0@O&Ngck!6A0gk3+B{ftOBuIFxj7D4(Jo{1aTK<@oI##n*z2AMHS9R)u-`t?dg3WB!oWa-<$ zM=uaYGyU-4{fF`G+qd7{zM@N>;s;DWZj7@}j62wZxo!#5z{!BBDjjJx^{J++BRezR ztX-GoEx~n4su%*exqxd2;Vt3{cr7p{k{|p`0PUcRPFdW<*{YIWkmbX?t#&CT1rZ2- zNeWrxPXGbMpuFCxU3qeKw$iCtrR2hvh`MO&Q-}x<+atMyW?==O`dkPr6y{ z;s0W6^e|p0x9ZJR3NT=S|s_IST1X6e&o?=zLE#P46lf0!fm~I z;g@+47DttF-xOVzu7Z!jMxSm^u**`<@u6(!^3E=gb?i7-r-bRtb)`Vfh~h7h>{Dyi zKkQ1Ii8s?-vZyi3?<(#zXZy=+njOEl>+S;YiPr*@S8R;*Q*yD1RJ5LDxMcCYupL{d3(Z`g}I8f$E zIXZ!X&gDak9J#FHVXWM0+DZ8xKW))FPTE0Q3LzV`VwNK}U4~9fn^674jxDi*LN=&f zHh;5fq1L7oqPcCL9>+~-d40=Zy#VMPS{u{KdX9r6hnh)o;3?&!r5(_(j8Aj%)*FIS z(h&MzBMcaR3}90&M*(&^ce$e4?dtxRXyv!qz7>*=-fiQmADOF@U3Ch>XOK(WWBe$m zvpDf6Q$Bs5@|1(MKIB}t&3v#=s$|JKhU8tBA%~|dCH^te)9%-2>v<_ zoBPX8KYa%?IB^w6kbMwiEPx7k!+8|47`bE7VDl;?_V(we`52;PS95lTQmMy}xRZTwGOXEVU_X zlc3+fsVs^xS!_`EW@5gCj-4ns;SwdYLE(sjLx}ivw{b^cy-Pq(?GEUN#|oT~ka2p3 z^in8Wip&@-$JFKk&8*`R!$KZNAw>*&_`b_S^)Rg~6gqOw6*s}6I%*|sJV8pjC!6P` z2@@$wQUO9t`@i+eC_>n8wD-Y#=va?ttFtZt@p~rDKTZAQ3HV+TtMG1IcnB z+!YRkY?f8-T<((Zibv^c(OoIoDKjNl-Xl+@=MFE?N_&KGIAg?Y52GbGw%mepF4m^& zRfG;2`PZ&SZA$c-Xo6`n*cWHC!4E>W=P1pfQJTNV>VdL3KgeD1IFr>WY}z@@WPG4f zdvw=_0)B(AE!icI!kz^@sqGd>jxZ)?gvnnP$(2hA5y^&4C28l(DvM=@yH;zAJ_{1p z5~)>dQ&b_^bU+^wLExSNlY|-0pdj}yv^_E!K$1DoLoZ{nBMn_-N-4NIm@7&#vWCQ7 zK>3dn3qa5{ya>UtF(W;grRxLZkF1=Bql{2%82^wV&2qqx1sZgFwHFG19M;4ZQ#u1rLS6 z_MQIgL?E>EHBe7`_vxqi-`{@vY`RZ5CC@g9Q{%y?p#L~Ogfx8jZ0jD#&suzc=2{JB?q!%CDbQ#vg zP{8v1z04Vk*q{%j)`~6A%qI$XcRzmn{?%V5Z~pq`gRRtwR`y29 z7msOxg3Yvn2XAl1m6@MeOe2%0jN!TG7 zG>*JsK<>kUtTf#n{5pSB*pFHG$_)7Rs&ZI{>FqQRVDt^@i}Wk@paN(pcAXI|-28$) zWv}z6g$=-yD*5YuhuUyGSA^fVTI@%A#;CikfVk?TNF3o~qQ7M_w2Z3F zuCI*i5Gl0;f$)8zG4oSY8E8D?tKR>l=Ub8#dQ#diD5nyGbr_z5dpj4a2p<~!Y2~}b zu|k)So&QNyU@bjmIGm_Y3FQq!q*z&jmpxW_k&@c}2radje{n5!7pxCKQM3vOlq>`V zaj#)oW4cF=5kqtH>}uKDQ?3|f)3CPNS3OZkrye80^e`?7*ytIH*Tuh+cFLMj&S9DscZ;8H8d_C;hU#YZ!m!b8R_^x}Egc8aFXp|L z6BM`bm_AVTiR~Vv_hMU_E657n@KyrBMOum|bOSeh%}8FlT?2imI|ngaMtY*GD>7`7 z_l5p!_}hd1!IQ!8;OJ=hIhv6>KGf$Y7Z6J8W`2Sjl%wWzsK|lVPT7dk;}uBkCDGN2 z;(?sN31qyuy4=9EAe#g^PF3@&0sd3lW53Q^fip;XD}5fgjch?|B4DjK6S7ZSi;Ii3 z2b{Z!uL5YHRgnU><+gCFWszrO(K<4YtjO?w^5O3GFILU0O!BTOz9x;%JoAJvV6-$V zQjwGvyx)fgo79!+vi*@%W?DMjSKw$tDrR;M=C&SU&f*g~j;wN6yG!UTpgvKLrOakB z%k~6CVc2I)7{3|=ct@4$*XNw6xf$1~_MMguvsVRacs)ilur0EK(J7>1ov8KHE{C;* z8;GbP4M1+=9k|>N|;V`XFoioI1N(AzzNSnjofo!LWVWjznNJVxz)5S zyfe_W2t{V_Dg!ZKZb5u3X0YAf-rs+C^WCTWyX|&w?`QZ2+`ay~cl-9u4=AXzhs&Jn zXtfuSE*M(+t~f}lOP32!m&JLn_*uf$y^;{sdFcDsEu`^?^;JibZetb z*!9qPZ`kpabCVoJ7^B}bvzW9~fQ3VO?BV9;}=6!$#OSW$gngV(D}!`EQ)j|np;xfP`eJQ2mG$D zelA^x=@WOV!+Qw9EyoOxS zeX->C!3U_In)xiUt_lh%eL|#(P0iKj;UYx+Pk|mS&&3+1?^l-_Kn9&0V+QI6!U@+7 z4vkHBjoi@Q?FyWMyCSEi79)@V_U-9t<9o~)YHiJYp9(N9SF;yivtjq<#p-!44Pr~r zvj^#I1;7>J*C@Rr z(>wDM9$jq~HzQDc@#45L`rGKDim0W$Hxn@us3m1lYlz+x7YxpA_Gdpxx8MH$L???{ z*8iw1Eo3y11SJ-+9AdOt#2!{^sL7vK4Fd5h+G?kXyJ}CxuCPNfZ!$ zlZmxP9HDT%zFMzZzKGuMBw~a+8}6{v%kfM1#VUHVrTO)XYh3^7m1qf`X&`ccI>HCD zI;`z-kl`S>gXDSaCJDBz%LR3XW@rI!CR1Z|=uMvQ1GZ6Ad}a#x@a1IbG-Zm13hci3 z*W0(hS2Z>Mg~VVm#UtSN#TjGAJfpnE{rd4&(i1@_F(1$rm4i!=Bvn7cGrr#S!^b^J z-B;~!9wIyfKb4Sj>{(An+V@0YhfAgRLpA5d&G?-2s*8!+Q9?51iO5X*1imGn$n7oK?5>0phPA&+82SCW4(VD_yAX){8pGPs!LHOwXZpAU{^ zIFAyQzCXFE~(Rw0-%9$ zpN_}Naj$G>^LXqP9JvM|S|=4deOl~;ngjGqyUawpUbrQn{>10Y^XtjF@Sur~(tQR~ z7=Y`6cF^>oEpu7-0J~znNI+9o)?J=pnj-JV#R$yXVl<#4Z9l0H4(-D_2Iz;ttQDq! zW8N7(*9OX<2_tsYuJ5ir=FTmdsDiOoi=^m5P^ zi>gts^7YioFDRpflU7VR$>U>~Sb=rUd0=N;m$#4lEzJL%gV(vL)WpsZdX8|$;{HZ8 zEu1RK*>vTw3%u^L?FxysA)uPcnGtO~tlg!#S}>gt0_${(jx;w`RV z(1oX(tGM<*fA9Y@r?hmC`{GK>A0RTCC!jtcLrL&MiXHt%r=r?L7c@^Oa&<4hxnecWCGMd=xW* zJ;zp5)(5E8!GUyIq-ww;5)Z561hY49++IF5yxp9vUx5SRP*as5h|qS;w3LxPHCmdN zoKuDmkw?(?HvExlmx^OBJmmQ{mP9&DTocX(g3O~qJwBHJdVU!Az{;Zl`*>PZ(uT%2 zdZiJ-V5;m33u7IuK&CsH7*o6g-k^+t^+V*=0swdU*Z7BnS+9!!f-6G@{G0ZE_3`8Feed7*zwZ4zf^`3V@T=Z` z^nUfn55Hm!LHzJBn{%}EmaluiGKikh(^D`AyrH=>p|s8dzDXN6spzkg5(YK{GQj^0 z`-5+J0e``krnlg046dV968NSfqK0X>$V=!ROIL^W_#M5=VZ4An1gj0(^UcYXg-ZA7 zZ3XWPI#ofdG@GB6E*iPl35W^O&6~*H957ABX(_4Y-7W0ee?{)F#a}^6KfL*?<$S1U zX#$CEQ@?V3LUF{8(Ba;^03pVIXk5hSgTKOo;)GA0E!`CuSt{&NW?71S zOwrN@@FGBVJ9qQREfuyT39=%f16-n_NU52K6z%5l93A&(Hl%244A+9+OeG%4a9ZKe zEzDe1;<;s`r61!QO)EtqP8RoB53M2kRH=|&ES|aMi_WcuK*v-&t}NrrJ?jO?i@m}a zy*lBM(xTOHy{KeMF4iC((@Q3ZEzcxzL)^*5QtXLvWsS=kNv@mhehtfK%WM+;@@UyH zM8S#m*?a~~^wB3NQ$RMyh}}+ptN1<=cCo)J&X$T9&@I3|U!dD@jy6YOMZ z4Xgu->g#-1SRkXNGejDIgXPJx=xwpXFQXU{m1`^Ci~>$(FL|=b^v4!(jm~XwVUvRj zTQ)l{S=iKLX<7-ERx{PJ$}*EIWhZN3;mO*Z0*!@6CIIKQAS+5#xz_DY@z9zxkx1Ou zFE^D37%yw}bTq;Cu^?$mGlG*RKH&Y=yuE z4x)*z`k))Dc1_ew)vn=K2)AG4ykg2?oiL}VndUV?zV?QLRXxE1|B7fgdy*;13h9L= z{H{);?<_aZJf2v^9>Q6G6$nKKH8W+joI9?TOXm7S<~z4AQ%O&0@AP7P1>pxfHDV^t z1;Y5dI<@>M-koYhaAIZ=8X~J;@QKWqy?z!K5dB%H4S_e)5dVROx@zf}tJ=SpukU^6<)+W^7@MZc9D&U_K9PvzhWbRa7HhWc?sKs!a9B1C|S zmEfLmqN7^%lLNHRPUysB4wYg=t;2oJ8<`z?P zw>AzWsmf)I-&vV0LmgXq1;T^qR`0p?l>Znp$5$f-C($NU(W~JdiC^ zIg<$Y=}`B;o0YE7I8kz_(0@Kb??x{kD&6#W^17C;t>$U@>I~Ck<4CRH*pbc`8#-Rv z8|owxBzSBN6Kt&_g^e?YD0EW4sN@>03W^io!jo!Xbhqr$J2}bPCk!_pZfMqBD@=6t z5PeIb$Y9um`|rr|2&Rl$7OP5OyjxwFqM(?lMm0SzNvJv!xhWHcXj7#La}GX7X{%7+ zo+=n$%&~6@-KMd()%6ExMY&-4xBDKGn|mTkH}?#1iE5eMiMaFfPB2@a@TuRf;g+^o ztzDseykg%JduuJv}km~C$0 zeNC$!0=1exfIGl02uMU6G?fc>oB~!(mEO^VHn%iX+ zOIm7yR;h-LAzi7f#I=IVm$kZ0=#`?3($&-`>!;)>?iy}HW+Y>j{9oK5rs&BVVCusG zJ4C_^>m1FrTY2GTmUp0&jR}yJgV+Wco;U5TM55gTB!*$fPjF@9Nz%};34J)4w*5t1 z@sSbevL}C8Q2scoa(E+;6#lfI;<$CG#4GfST%ly>qE0mE&Wf(GvYFp7k?}ko*$63rM9Jq6#L3kart#?Y) z!jfJg_c?1zZ&q5`-q3_@ax8ABKKaYl&#Sv1^fGj33$_E2ZW`&SlWv-+s(DaF0=q-W zEe(-$RFa8tPNb&3?uWr}JjUhth2}yltsbMpj2N}loBc!gRciJh;HtX)>Eq4qU+%7c zel%Kw`SGMeuB!Ad?Sxcp3PVJCTQEAplyIlKz)$CwBST*qbhH%7;;tg&9VYoY&w$>O z6}HHL&^)0HpniZG?Zpf1^*l6_y*>(X;-b4;KrCcwIIz-{ll6A{4jF{+KYf5r)J0zU zA~R@KU&VWp1WzeWZYE|wi-tBjMU@D;oa?PBVLZ1R`igio}8g#B;@u~`>cL;ZYQ4g1x z45)sR5ram6bYFBD0sO*%KfnkHPj-39w1L2zgZF`9u) z!WvuSSjx8q&vM=0z3O7qp(ReUtcs;i^RS%U))@QMP|v6=L*;=0DLe|EnlC14EVIEB z$X$U9Q*RK)e|2d=>T=yz0TbVP4*+WW_iKf5^&b^+2JlUef4Pv)#KXp z)IiRwib&x?7{9%{{V=|J`}U({|6%sM&6w59?ji{olFx_GB168av)D;)1Hz-3k~d5( zR+20}*fG5d-t-{}-OF?!#o}_a5=es!?@75gc)MY@jz>KpzZ)Nq2+rUmk_^Jg~XTrzNhFq-l0}(f^fpAaZN?h3w z)}jEUwVv7Gt-J=L01)?zuq6Zw$JY6CTHyRJWAY0l4emf5neExl44e2R%$D#8`b1?o zuh=I+IvFlOhB#q{j4Uy9HlgOC(bmEmVFsTRUddFZh^C~(vmP^=(tJVBv2TK0QZ2-F z!2?l(9k)=u3i&4#6TJWV*c~R%O|mtgnxVUqMoV+cga*}Oz3w-p=qor&lF$@xdCDQ7 z@B-$6GE1WiYsm#}MUJh5D7L}P+!I1jEn7WMHNbyMG=?`A^SIc=zB z5lT&s;I~69pNnbk$XQnn(A#yJDozAplYLYBMc8EcUYS`4C#YiyAsfolE!oh%J!=8d zqL;{2f;EM>^A#xFq0)FUHa$M`;<5+}(_R8)z>t@2z3RZ#-OavBCs9>+Ul?aDTPb)Fx@BOe?6| zg2CET(^s-SbVP}a@y=3Mm!6RkbhA3D@Ke}@iz_8wXZ-{>%O3pp>B0Wd;nBh2lY{=? z;OOuGX4%035*2*Ttksl(n!NixyoER zkd9X*^s6i5&^&KLm>61KSUk;1%tdB1SBPh>IRQ0E4iB?B;tDt%ZViYH1(b6%KyXRrznbfa*@{$<}>>x3BNMhd}xo@`6?o)SHppIdh9w zhzEV`E6kcRt`lv;7=bUcsN(cd^$>j+$+w8-#b|Q(_V&M)pWc4F8~^M~KUIQUdfYt~nX`I}yh%=Lv5LvO=4>UvN}d z4wxJX`pi-}tF0|yS_5hrhP8V6wrwF3DJQZWJy}sBtix`Mj1(+}P z?Hyjk)@gpUwBy7;kf)bdo!(tnMpixOEtg3uoKvKO@T)=zk%{OPZ}ZgYK_+n(*mscR zfSYRqZKXSD({7~$tBALLW~Y#|h5OJo%0VFok;h%RIf8LwwvTfZ=Va^_e3C-BOhRn` zlW%RVFm^@)!(gh-T(%<-4lv_!ErOOnI)(`&UyDUoTIXcV!h-lLz+Az=C5wzvBLd9f zgn?VAP*RC@G$Ol%UB&tA9dh3OOy(Vy{=-w;rluxh_Xad@>RHQZXVs*7XS@r8Am}4J0miUy_i11?gh9e4#RtucK z$>K(wd>D?p`>91IQb2R+A_@qDWEC7<2rF>)$W1tURAb4myO8$_!x+>nN)RasI!zcE zm}!BTd_4hxH?%3DKd9WSlVU=Oy7bZd{mBH#O-El#l&-m_zQ~@=4>HmT;>tAftcRAd zIwOctp{xV(?YFN=z%=p1eD^pawKVl)R#_v#3erO}mVkiT*O_*ga)2IPU|T;5uu)~s zn*lHoIGnoi`I$YA6@QF`wBUML>pnStkO-KkxZ5Bjwqo}iV$VLqaRh7)GngrQ(3>9 zO`QsoSShQn${08_{47q!7hsk;L-Cs+;RUEE!sSN&AgyZHn=&1s>xIX#aXai*aX0#I zZ?pu|XF)}P>@nT5YCxR#p!yp*(KcI)`6dUVxNo7ql{naq4z31o3@AhIK#UfUvGs+d z+o$SCWQWvkeLi~Dx31kSB>jLSypBjiF|#3`N{`8X#9P3#!OT!L z^qPbiFjRMA3<18jq(^SMM!vr3pHa6N1d=?q^?pgwR#_54;Ef1@PFHaY9*B2a^bpDc3 zTa?6Pm*&oWsj|UAWdUjiq5&*7S3&{Alct6f@-vEj$k3ZBVlUTC2k2y0=HujIE$pl>uMRA62}dgY*$%KUyC86~65l(%P-c ztZI{RhN*iR38*I#|H-N#P0aY{!uYXlrfxv>3!cN;DOE};EGcWDrsNQF6p*3Qh5peG z#Zlwjt=9;%Ll3xGhGufgVz~|7#st%JK%)?XBE`Ei5%!Oy zoA?uwO$?&@3p7(^yXt_Oz^n~$uHRiKqa~aaJkm*f=^d^DSvf1@=T&<4owY_SneFVM z(pUoOi}-A2=0=*#=N%ZBKxwes2Sa}?Nml|`$*5YabdAsjADcp{bw4nVccpJA7(|}T z8Yo6N+kYG>v>LA1z8FD!WaUH;k;#jh1m>(>dJT@sk|$|mJZF9ajb?R+IVPA^ppZ_G z?6Cg88m8gYWXm*+OkSsq6!l+(B-MiJR}g&MATv$GhdDR!k+z6(uv9HuzZ7$a5GK#$ z2I`fPqSg?-jb{`7FGKe_aRu{1aV`s}e!&~ev>=d=E5`+J4)|hF&Nb4i^pLATs2ifV zJDpp01khPjkNAb)*{CD2xFn`{9xla^?R~TVqQC4PK8t^SEB(B>gc2>S3JxV@;O#s8 z7hmE9nk?M}I6==lK^C<4>&LzI7|EWP_K5H1H1X0iz1mywDdj11)w$USB_Thnp*(0Ux_`r@DTfyP}38> zg+S+FEM_Ru>s?nFFDUP(0O=JPY(F;_sOC+UU>Z)GgAy|585^I;9^L5EXYw>qM-Nv- zcc`U7OgtE=6Kzj%s_ZJMKzbcj6D;p@xqwj#_LwuL8g!cD;zV8!gkQ?>w`gk$`Z`O5 zG;r-vv;;RcbFe*w_o57BWd)NBNF)K8i9V(Xlt(A7G=7jpNQH-RANDV}D|B_{8M*Or zhoN~O(rkVl#9#&GUR|!?dy6FI{Tb{D9wIY*ppp{?u{peu&J7BE-lGI!*1HQOLKTN^^Ty`Z!V zmRyMRX_CqOTNTP>MqH~8v;qHd)XzoT8@zA<8KqV<~FA=Y0rf21) zhN{W947oO2rWjL5+Ey^u3S%Tn@=PtKWBNk+{`u+VX(@nOUVY`{%$;6#`6(oD`VAcS zsfY7}8?MT;bzcT6zYr*-!Yh+m`9W|mk$;7Mj>tuIbemE-4$9|zP_lcy`m{8aixod? zd2*z(1=?pZ?Zh#z(e_*BXB8RBO+7?X%#tVqvBiE!_DkK0TSP>k8f3r0bn0(h_zX;f zKJdvWznh$5mM)(bm@%wboPz%WEyD?}xFf%exas&HC^D4=3A%N*hyd?DeRzdL){lEY z^!e;1evQI1;S@B?N-YS{(o%n2X7_48rsYIsOOW=`?3=JUJC&5)Ro=gThJ^WK`9g%x z9a>&6)vnS3<3K8P3c>5jl6*9DKJ5YSBo4aaS(SM4xSrbXJqHOTjcZ|kX_|a|BTRI| zH2^B$@g7c-Ngx$2A_^H933Kl~l0=2V%JrwyixE=JyT%Fx5ZWds?WDP`z0Pg4Eq$)*oM;%fHJN+fYA6Dk|=i zhc+Qg&8#1xO=`sY^A-TA!C3`(B>ETzn`l6&$%DXMOP!tUHQl4^%PD2SjARkl`U_5k zl=E~`x+_Wd2<;gWou_?;bi*>cL_?G3Wj}3}6_AFeRaHPbMl(zTL68g5SMNxiwYh9x zk|Uihjo^B8jf*z1`*Ue}Q(3JINb5HOj>E6%^h{#!j z0k_|qX6L}x&Momq6uhC|>8Zw>G(!X`P@Y0E(4(ujH{^=x<)X+gYe5|}w@g%~2i-{U>+`>LlQ zy?^_+9@pS;?@xa!dh(Z+?0u7gPO$2$kN|dkV6{;Bk=D%X?2?ynU$g|LkV2%G-druk zoc8v3sflK$pq0&9{P3pe(2rdj%8^;?39ix6yW6+#JHoaEG_;7lG`xtGo{1dfQ#g|{ zFQ=961GhOaX&;1{nJgv9MhSH8Ymwp-9K_88akDc7cuY<=C)GAKKw3c_Ivhx;1a)Ac z6y!XLb?+QvKb9FHLVE_S{D@6(-eR{9`HnLd3**m6BM9lKPQv zAvtN@h$WG2--mjod!#xNNH(;~j7z*mvB~#8{e1i3&bbnG!jwje4K~g1UpOB?xNIyR zS3#AiC3ZR!=o0>AFgj`hh;>>9J1>P^m?$+LbQhjTOpSFyo1br3qM3#6zbizPv(k95uhZ?6t8L<&e8>c%WIqin&m&!Vaz#SQLh9*xJg9YS`0Ji-CUxdh%^3o~$^#)^2 zD2XG>4%{;47g)zB98u^cIz7EY3SpDhCA?HUHV3k2IH3G*QgWAth%2~W$pu11V;3fY zDdN1))6ZS{fRhOb&B?Pa9ZUl0iD~7=^I5e=2neWQ{>^lWMP$u=;S#$gf4*LgfafW| zyCppD8Y1=&n6S8BWkj$u1?+*0nnF2B+Ui%7LykB804cGt}?1p-~{kerj1B%kv1+Shw1 zyr5b;QJhe5QSJttZ!;4DQ3+9bWkN?;u{&J@@*Z-YtLNjTCPGW)J{%I$&Zx3E#1!9| zXliHhT*{32ILoBmW?kR zXIE~-as*UAak9;W0K2ufc)=eXSSB>vYOjM>ua@lQ6oSXBgC!Al`rBhgUWBJYT*)v;9*8&3n>Y3=38JMSGiDi%rQ6r)yOu&&cPk#5y z#gDK(q|Mxe5CD&|sN}|LQYWD>HGtq)Dr;E<&@@EIz+hc~IDw(s_MX_M*!pyn=mgUf zI2{j~S=Mi>A^EF=y?4!TYU;bK&@}F^P9GvXa!|o+wr&%pAb~ zVOjO&Nc);2ci7W<7b)gLabrT`F@w8EGQ5?R zw+gJ!5E>?Dw;FY7n1=Hmm^Tw~4va-FL#GoYkB#W-VT+8UJW4`;KM=`*7Ef?qO0SH^ zJP|{mekzC9M+!X01q2_5=@_g(64O4SiR%I`n-}vrh}d{Kzouxn*eu2{@-KU@4 zfB#B}4Ok@;h$1;rB{QQTtl@sFQo<~|dWv>2X0xy8k97U(^yyBuXC%1h3yx6bL~ssp zq@dYvmIjGVrS#!Y->t&njm^ShDM36F2(Ph@aftmCS1?;A-9xKGWZOGzrSLaWmw@^K zH7s@?>#qlj5_XNUZ}siWhVL5ZV?#6C-t106qmzYIM5Cdd4J~>;@|$sW;@M2w5(d&( z7^msnkp$AqaD&mY6NYDS_9o4h&cbcrBPuSiZ>tUL(^xnQJI`8Ia8%f_Yd2s+?3nb1 zkH`!0cPKN(Kk+?iA&I=`Xd(Z0TniOcQBVo@@=*R*k4Gz7$?+TTBD_#} zx}|i5GGcdjOR6eTZc95}@_IFQ!+Hl>U`=pGZloh~U8|q)@K`<0>0tIHb^Dm{etm?+ zpiaqD1|kv^ZUktQFet$YeodlXj`w^^)xByThkfvV$n?aG{0Aat8T-=N@ z!SSd-!F5Ej4N7qQR31yu8? zzWv;PZJ4E*h~nQlxmhDV+uqdZ)SH46hJu=B+tmlTSBu4cV`T-Z>Ov0nmL6hopc9gQ zcB_;EW^2z&po;9F&}`Xsr9kN)6YXu`<*>l0ipqmQ9eTG8B$K<`%qQT)wmpd3Bp#tf zZdz?>nC8>Ghr}kDlQ^j?l7Gu71#S!H2y$(AwYQ9Sdw9Fl_*m_1IV>-Cw>N`#8hx4&SUb9uNZt7LSZqGyC@@i}V^+>}OladaQnudJMBAWS; z@)<&&dvh8x|DBfGQ2*eQ^PNz)2&)|>vR6Ri1J+av2T0RO49}don+|oxT0xj*5rb3hyr*O$u7IBQ3^(HR-E90GNzdx- zRe^U}U<0f<=rS~0VWbPm(mQUa3S^fzXo{BCB~uA5mZ2F6z|P6?tX44KF;}g7bOXYd z!W2Yu6%Ix4HD;5yW*nrl5W$m9&ZQdBT??sRuqvNjQ7$R;_Yua{Sm(^nDyU7XELv+> znV|AQ7dDyft@@2PR2ow43bIBQs*_%|Ej0|wiLFZMh&v((yTFfljeA*A@<>H9<&N+; z7T2Uj%T6XmXvjIZ%|cY}qj0f(lV_mvlpWF1@4z(PEH4nHz}?@Kb9mPfyFfh;h6hNw z`R1vNscWS^U`+S=8gjhtjoYVaY;D4|J>rsB3$iIXGjjjBgd=9-{Gn}X!D%rFu|B0_Jj-=&sTlk^A-43#>W%@+e&+y2^z zyEOYb)Yx`=dTSjnhbf{$!_l002$L4zIf<&yCZQ(ssy3|{nTJi3^mSPCV` z!5{u`Y$Quz>y&vip6bC(eeix|rr$9{-^;Iw=u!*efzw508Y&|dr2fdRMynE$ z2Nxoccctu}O5bcVSFvpmnrn^GL$w9wY18yzs6ZMFoT0YLvuvTz>I@b3z>e)v!kSuW zoBahR(9V$&;MO&Yc$c3EuMO#=K`zC4ouYtUC7!jRX_XL$Jkw2)=NE=*T5m2T@&19w!2?#Mxk2XLM1Vg_eGfAP9e zuur2;n4J_9kv=r)t;fG`W-gtynx^%vRe>jx?T5z~wlED!Iy$5hww1k-TxdQ{10XTw~*4|jQTL3DQ^dskKD zPPvbm85@2_W%a%%X5os|L-y&?m2sKrECcm|a9V88fwKJ)uT>Qp_MEE|BpmhcrPG4l z-K`P&3@T8ta;u##ty_Y>%P_smZXVgcoP@&wI7jrK-Tu9u5a;-9a~m!KP`9!KQQkc&VA)}ZqIso6 z3>9s_7n6PCY4#I0<_H&omcH#~`xMf-J|r^w*~M-d{nnez+#Q0sBbBAFO%p>YZHxMr z@-}f%t_%%+-2$gVKdP7=4vh}`4Y*SfFiH@(VdxezK40y@;QlrK7W;(1ANRiM?XfMZ zA}N~*#fUB3d7}cWP|KkK7f)=OOFtrkYL29sUIo^^hsF^>w8;b1PkjYS2s!g2PQJ>~ zN;qfse9w!`&mpoU_AAa-;R%*tdPS+g9G~IN$P_>3Ll@hl>>A3J-Y&R8Xjz=Z2BfA& znDCmCAmD|tS8>G=TQES-#xDnKz$Z0FY;eNZz1)EXZ|P}pzL6@>osZ18)U(6pmZqey zDMt!Ji;_JsJtHtm6Q*V1_QMY!?cjwEkwoTMwDh$`>17~fkX_S9y9L(zv!)5rYlqIN z4dnhJhYs153)oQEiiTa?xFyCd+a6vacLGB6UXdgaY~-VD@@y4IgKg@jKOH7|9G6w0 zTm{g-%A8%uSK+T0RCju{I`LYmFPnX}*!!Psl}%#8hv8}NJ=Q7ZAp)r6h<1(9oQivL z(EQ{Y=AS@1LK=f3(un-b?nds7S=W}3kj!5hJ<`LIvzV){a$C3q+M>zB2NKc?Js~ab zuZUqv-Cy-$D6Ej{XODaTi{4J;ZhBvVwv};D#c%$n@gs*?+W0Mo6DO4|lv{Z6uk$&BfHdIU4$4F;Io&zO^MC1B!id4G~??2aHX2e+573 zE$IFhnPbhR!6VJ7uU;(SifiVEXlibDxtXyACMkzpfnpi^a~MEsLJ(9iEH9;~Jx-IY3GdA=z$5qasM5=(zDO_YC0fVGObn3+C5jV|`TBkD|Mnv6w1=qE z-}lsozj}Yf&YdIw(2E-;;6;LhH15}rzv3gnl77|uA2FxD@BP2t-+p}a_73!%-Z1(V z9`g0BU)n8j^*H@-kG@yfe^c=3FRej&Uv|N@#MCmu1|w{+6)Px06ZFUsl88@L!xgw; zR=JYCoj2vLTXWWtkjl<8_nu&J>^v0O3{;7%Eay{S`;n89ltLN@4KU4v|%GEj3`=Kpwxz!O|nUK zBrG?3kybly>-Qh-CU@U``T+@S$uiNGayr%VLx3t$c6|D{#dT4J|MWwZmNJuoxex=I zJ8Vr^Fa@>}P)&O2sUTc`@Z_Sdw%BKMC+UFQ`p&C`{wez~`-$V7MZSxOW_;K5reM3^ zuMNv!vNfjUW#A%Ah45sD5C@D$4UEDm!R~((q&)eevP^E2qC^D(P&gUDrTY>ma=GdF9a~3ACluGJ+0+o*xQ}8?$atyN~anON> z{=QNE%M`(IFw*bLr;mC{mjpV~U?-TZAjnHHCVWng;(A{AWo#zrVA_kcH$*$#C!Ud& z2u>Q|$EX6?Th2~lI2IW}84~V}T+)~|3D){XyC4K4V~qGdMW$owUKwQf0+%z)UK6aY zNu0ryJSO9jAm99H{_f-b?Ymb52a`>`71jmtjwOVi)%Cp!yLy1Z{Blku|anAm1lkNVcn+RxlBZgpgP{Nq5FcVc{V} zL0CC!^T@O=8briJ0`MZ`5toyqj5Ah8knezMVIN{NbgU9xb5pctjN~zyQ$QSAlu5~* z$*MV8gD;>GYc0j0`*Dkcwc^oQX$Qmd7yo)Z8f{T?@*5D@>90i(*pe;jf*V=o@;O7< z_NKFtXgF8b)LCnuV0upF-4@_k!EE#r;Q*Vn zDRP>wdtFd3AUp#CVL580N7J5IX+UIPaz?_v%uw4#ADx<-6GYo~R@hHK3l82uOR-vm8YDbL$zhT<_Mo zvk9h+p|(fo5=Oq1ivWL9A%+3~P$|OlNC)Ur4sF8pBrWo2hCrgh+OJ5rGm_!T@&+?J zggmUYG*aB|5>s{rernht}+VY=ueJA>T1O0OFWwcuWrlK~w>Bv)$iyJn~S&ZpSYg)60<2QwgWCH(v_xv(k^-pYK1se)IkJ$aeE1qInVMwza65 zrm?mHIhF;@;GBMHH-V+i(~M7iaK6i{J-XCPe_B7Z^H>q?L znKEacILInfO+w;<$Lvlb*#;JR+}Y-^A})uf!AT_}p*k}4P1)lI#fr3T8AaL! zcJkmxzsQjn&3G;p;0n8gSh)ZB`|s^X7PuXWD59mGWY6gc|14c>+R$PXqu|cyoH?2= zm_og*!=rBYRvK<5Ck}0eX}Hy+xg_fgxE&Mj9PtZ)AwGDJT(mkJ&TxF;fiA)N4KT_D zK+rtwOr!1VM@f7(MWi08XWWGGcdjeP8Y?>Li1hTeYZ z9{NQYdXem`ouRjSjC*&MbyQrvBR<^Bhq&%dO;Py47{milv^p{1E2X9@DB zucR3S6#|EgEaK$X5i!u)0YxJH$=&yLo%@{S)|fFe9(pxZ15kg>MK+BPF|dqMgi>go zc_6jSkO|qo<#pVt7}9+lVC@$*LP!~_c^qo zng$-uJ2E{CsqtWxLOQBiRMe1Dd(fBOYms*2X&2z1xeoec5PR;_6Dvk z$z5Nl>bY1uS@#6fqcz+~#2^l3N}X+*zfSfkKza(LwmRcJx|zRa0Vkft<;hD(Ht-(sZw z<_iYePr@(4!&*DHHNo_0mXR^;wUZg5-B?`)q8P>EGvu$GkBzEXem-X|ypb2v91c2P z7$AS&y!TfGdEe7C`|3S(qUID*`-If!o|V$2(}?Bhl%fKaFg6Q0Pw0mQ(P)4*1;$%W zrq^?1Izh%170+v&udWgLsr$tcpO|!p|3b|_NrZl19?K zQEHarh+Gm)GVKIM#6iB3nfoNkL_-g~{plkjOTT~f!^!PiD4E~9`$7B(>e3`vK78oa zw8tJrvgM2;xHd=wpY3FIJD`RV&S7>Q`vlX%arWWFOm)@1JKoZW%(?$~_v$ZK?_S@1 zSp4~ zBP(hZO_=`U;!?^zUR(_vX~Q*zl1#$W9DNWcXt{6>g_jjgD`xAo%PUI1IfuY20_wbU z;l!0={DVXD%S?1FtW7C*8R7secNsF59S9%9Nkl!kLQ+EQGUrdE;gk}=&8vE=di6@f zl?gpT3R%7sP>3xpIB*PX30%?nBeP<*c$4k{3LYIdT;tQ)m_(Y`gW7vO%>T(@6`M17 z*nGL7XFM9zj%1?kqd=5S$cg4t}nc#bk&m1I?l81QG2 z3M-?X6DN^@XIDzTBFQ*QX*O36pW{J zXp}z4E~&6aIw?S^F6<|&OpM5I1cw}FAJFNg6CU%77<%dm*J~TQ;3G`A>FPL69*-Hi zvVoo%T_rAtW9m_g-9r}PCIL;mCzzHjv3$!@BPx7d<@?+^PlfBV!BQ+V(6#BM8sfY_ zdSl7XqH0%eB50!w{1Z(fQp_(|lqgHjxz7X)P~8h8bPLrr=C55cN0m<7aDX%)6GbV& zXe#oMGIjixdVBD_^Hb!%=;d)Yqi0iGa~f_d02QVb`1(b%3(<4Ov6@%I4AIhO&>G6U zm*U$I_)`gcjNOI*1=4Vt{T9s9{bS}xm?tem z3D)4A2X{2P=1Y>;ev zC5BHeeIMvgcl+_<-G}=vsw~|8vuX*Ze%(=rZDEB@jY27yuMC|B`mur-^S^M`DbHR9 zxH$iY8#`F>1k?{4Y3yKF#yiIB!f#3RlFE6z!LBwbmt&bd zOKwLU&oS74|2L+PAGzx(#}7OOurGYdlLwvx*cU$K=>t!Biu01V_#|-zt7&A7^ws(N z=7^@>_xc8U-TNu1BLU#qV;$$VsQh(_u!QIg`eIU&cxns5RBWa(- zd_CL@GNifq0dsd$T5Ld!wmSzrv~@cFS^S6_4+SxeW*EW6uz9n}zK*>hBm~1Xy|9h9FBK zU*L^r^V1@)8?_}Q{2L0z1y3aX>lOaT`QeY)V1Hug z5It9d!4ipsFqirCyqiVml?pW!G(;nsTJS@hEZS|vZ1K!3p&}aKY-Sqtm=cc%WQXvR8U>c) z!e|uz5>sDyX=2GVcs9Gdm;>4DWBvTJp_)KRFk1MD_c<*w5HM5hH&7QK6rrv1g8fpS z0sh3odU+V3=Hii^JF|;=xol013KdiWIVMGlsxE!6AL#*(^gx>Brd-%Dz;-xCS4`<1 zcnvoZ+85lzAV}EGQF@3ddn%cAY|)Rotr;eLEQ6AJgWnDYhx^CFCx=h)&tSiQaQDq{ z|H%xAR`sy;atd=a0#2SoPkfVaSJ5DFg<9K^)3#>b%#LwntI_J#{D1}$ZWi-(^Eg%@%}1}L{SLl-M}`Py z%{wY^aWX?(o#~d)YPw?C1gMdaTEkY!O{0F@<|40YJ>*RH zNv?E`*b6A3;DW52J>ZpbG)5pp_`fa!|2rQWFONFBFfI~0Cj3v%BwUoaQi!CoewZw8 zd>(e8Na1e-TcBV?8vPOeKgwxB}E_SMWfQn7uj8K3Csv$(!Bds&dv$!hQ z3B5^|_U}04Z*Fa<1f?*=L|`5`*mWKoAep^ny{0)n-0-o8J(Om!Z}zlXonlOaY1vKw z!1V(!300R!ifds_#78vr;B&+@B^@}fpGUdA0wl*j(~xEiz z3ZJCg4y!9^Q3+1JnUxc43fBpy;W`c=6X$T#1@Gelh9V7_HreUSE_Th++L69dCot2i ze1;otcI`)1_UP+n;_L@fW~f8!E=p_^4aW%|<4Ledqg(?f8dYe+Y%eXM!w)#of*uYi z5rJY&Ho%3aGRy{wF5Uf$i<9}~bTV8b+2nM2gIum(nAOlI@Mey^oW6jSMtc{n0*|;K zcoP(vRniW|+5=<}-xNZttTb6HJv9EcwRLV2Hx^^Ur{%|iacABvzL_Gf%Iebi0R|0O z3y^?DG5;RNSa7+)?^Ip>DIPE~T_W)yOqq1+?JvJ!sE94GDLs*eujc!-rwNwv*=wnF z4o@%*H!_~H^_AKjCb5)+C#P(ZdSrk2a~S<7Nc*LS%N0kxY{X}=Oj!OXGR*r22S@t{ zPr*13`@{a-H~k|kixH`scZhTzd?Fn4+c~0hJHIjm^_k0a5DXdUO!K^%4-B#FAjr8S zl?h(L{J2`c+{igp|uQc^*$Qml&&8w1zZ=8ye?6GT7NoBFQX2Sdaes5lU^SkqbWmjaC= zei{E>A2T1f9_Zl~?wuPg?SFw=tPj$yED-7$*glZQ*&@VuIG1$7?XH4Z9dzL|%%IDv(&LJeBF z0-86-%l5b;B3hb??taR02s?Az3v*^;DuNWIptRIG3M$Lg9I9MX%utu>7U+J?2jWBy z7??$mlD4Y;Dl%qN6$a^nQP&1>WJ}9UZi*sC=BY^T?ZQQ+TAkZb|X#C96l>@3jNR>w%8j*R>Q4J&AjhJFzuKFir516_Bwo|dU& z;EKt;#@X6YQDO(B4t6q}J2Crw_B?@G9h$%TVO?#<$||F={Z!P!(W3D-(^)i$pVM zJh}b!*3wctlU{BjtZ)NlJnrn#~)h$x=WbAqe$bY zB?Z|>BAlQc`%gtV5Sg+*k!a9&RUI=gOuBGp@u%NGsDICgd78vvEQ z#yrN9sSdg)Lx|weD_GtYPq(VqMkZFhR@>+dx(kfa61+H8)JHd!6D_b_sgoLpYWFx# z&El~}8JNr~Ja-!RO!~Y~Kw^nz&Vk!)uKBxjzI$y%OD{6Mlrk*@Ud^lWl{!TpFZXqD zeNZ9({*ud--tEV}RijQvzs?Ybqv;wq{nGcu6-?2x<)K1QF{F#};KFj4QLo{b6}cc! z0v+@t!8BYKVUF1Mct^h6EI<6NMvzGv$P%Vs<>gaU&gEkKa?Aww z^{bWHo>4mqo@YA{32CxpTC@OZ@D?G`XNVA8z34tT9Z)KiP|8ptkd!^Tyb=fQmFR*y zu_g)?`ZkkeaHw6l^jZeHoAbmZo&x%BtL2>tsGDcC&;?Xq)S#5XrT87*fchGQ7LyDE z{F|~Qh7OmYbwlNZ>Mp$UCMq~g<`ZwOc?<0CTw827D?)F3d*AH;_V8?F|HZ=m*T>D9 zSAW4ZbUr^JUv1Tf8Q4;-=s@QY@<`J|OvluTsK*XD5q)ZWT45d@*acqp=mg=c@$;GE z;tK?35c$q@|L8}Kj-*DRpt9Vr*eY&Gs^sgsX7rIi0GnwwJ_>(%205fluQjN#p^9Tp z3<#LUzavQ-Z5=5|n+zX#+Arj2+x?q|Qnc|{G8rojG@<4t@*C!)G_d$ID|?3v3iXIi zUgF$uab3F(&eIj>YL3Xj<%Occ6eWll29S^Bq{<|pYvlR_7G6vXZ`GR-D$|9tDg*z4 zbHP?Il`7LPgWf3SpzM!M$w22D?&bIFo&Rm&dx#3 z5lZe1muYM0Gwk9pNpBFohSAiB^#nz_C&-%!1<8^zD)1$4^`TCt^yB%akoqY%^ULhv zE)sb|P~tC17)`D%3A_OmdfMEL$xHgd@_Kd#&>ijh2uO4A=;?2*R644pr^xw$=*dOc z{`vH}sH;9EK6#=JFd>!Vx(v1u&)6DZ4yW`fYUKh2*J$CV;K+$}2sJ?_!T2k$o-2H+ zTwYtKd=Zz4uo4i!z1QzQefRe6asRi+PmhnDLN9ah$sIETAEq)n{nur=;$CD>kz!t2)FKJeo8~D%Ms?$GdM6tFj{(E zD88+(6qJFZiE*_&MmR?Zc7fC~M?Rjz!>7uma6W~{w!Ul%1cH~3r^ZRHRh(i1<&QFv zyva%mu>zC_``Q=$6*ma9b#kSx(qFb!GcS7JWoU4Klv=_nA>__LrQPWagh&l=E(>lv zoa78Fi=77@Zdc#ZIZeHG&N>fCfbw^`lFBy58~QB7^8mpZ)x+3Nn)Ud%I2gZ~p2J|Z zeh#+;%i`vTktc7RK>0=Rk7>;>i?I>O#pb=|& zwMJxbWq>jUTc~5w0Ce*Dp}ew;uOpFU;Wp!uEa1J)$E0u$Fblspo`E8JkAJ^=Tp1sN zfrivhGhE9tpupx>0?V8Ss;8YRA!)@z{%pEB6dxXb+aw?~QCn_gh~73?kv^qMo^NtU z+9CSw;T)zpn22n7jQWGk!qNnZ%I)KF!lBwME|4cB{L=qr>6qbG4D~@ys*LT2 z8T22_##~#s-L@n|F^c341HoNHQ<$kVFsFC-qgVHD{(6T+tvf{0@qBZ^TJ^Uu*2Ls7@j|vk7b`lBT^nx4XW&_62j1plt_Jih3TC}uEU^Ey7qrmnrkRgowaF6X6 zFSl$#I^_$yXgYs`HzS!J?kZHVLOCxo8i*ON5LU1h+Jl_@(`zE6WS~-EfD~IMbR6lAP93BciadU%_KXPiK|0Iog{Hc>g_Ln-V0Gs^!9A|0$ z{J`C0@fhxL}>~nqEw6jJp!v#u`aKsG*B=MKaf-W zfuB4iu4>_=jGS%4VMsrr!*4LL|)t9skzoqXfg+t2qh4AXx5aG_$ar&Yt@qR z-IiLvk?Eb4MVM~i99Je|qjO-WqXW zo%uO3P(S4@#DEksiJ(bE>t&E2S8-r-MUkSZxn^YBtiYewhp7S7`*gr6Wfr=7d(?|? z9nyk)W&nghDapoa-UlZNv{g4zPY)X*9NsP<=Qdr{LR$)D>gU@zOBKLhqSnr#!VOq< zkkuTeW;x`v!oXpa84M=SZkg{^P{|C?2Q4LnX&?2*lJ%SU`uYUYh*I~gWjl_x;(kbg^Ntj8j|1l3M zbFebPwmO6s<`6NGbyLJf)G55PjS7(cWw$hZkb?U~_N=UjuE07H*bRFDY;#@iX3;73 zmS0xYf2PJ3+2h1l!f*-lX+4^y<`BlADG*EAczZi)n-Z? zgwH;d(*_gf2dWP9rWI{ofiw|kgJD*CM;o&=*hMzN+!;GjDHo81t%q%B_GzrGv*LvY zmsP+Jni?U6WU^x~S9uTJH>G1hF=^>PZJ2dfdyebQP95l;&BpKFCx&xO`Qd5sA%zi8ahw^OLJ8^(m zlwt2-aQOtTZ(&wUlmm(gUiVZK&A{ZHuNO04YIjub7kZ*#S6uwzt?!6dS)YbZmU5Mt zZt+KZ;O^38sXE&mljR0YKBfT_E`hTEsf64*-h1`9_p0}A|JGwUYto{s_D9##IPWV{yVWQtO3dfSi%%p&|>2nkQSyf*<{;dU11uB z==Gv5mJAu0jjEQu4mS`9drAigzDS2G*so}S^{U2g2jsuju2RWA+A$7Q_!gJvFMoM> zpN|C#fO*j`RR+izPCgUmDHV=U3A;E4b-jd0eHxF$MnAej&@HzqWe>%BVn} zfc3JW)sx{xC~#+Y|!oFoM2jhit8p7K;lf*1zQm?Opn3{ zn5}A2w(7Atcgu&hV1BslKn+4tkh&NbFNI)4yA3asNUWB&omgLdxU<>7fHCgnOOdqXlNQncIdXcnz~z}H3UuO$il6&SPo-MOP|k2!tv5` zz4W0K&^=+}?saR)5GJ;!uB*OVTi~=bSzbhG2hO|D<%j@;5$7}E_A{tCP_mvreDM7d zor{(}Tr{Pr@v!#g5{cnFzzw?k|L&zMGV?VQ1K}ymOOIJ#8uN+ucAzHHT(hQ9xeeFP zjPBtEG=rF__IXN(smWnbTs^tDdR@B5=(%LH-0x~)hT_!H+5{X0P}XLh^l~U`WMY8( zf=Nn5J2B+*%Wo0Rr0^a3>G+{0r}z*YoB_4cxcqRNpv1Q0W@_tALTwNx^8Bv1@YZ}9 z_g)-L+hmySZj-FiQ{U&U_1l}^>Pdkj$J-Tl@tYj&!(4SvW}|DoLgGL zgpqg!r$w$)n#1d!_ne_Ec1xIsb3&zB!Ypg&-7>GbrY$E_EQTP_(y#Cq%4R25GhTw+ z%{~4{7oPnA?_#Qr-M`rS{=hDtMmZN(`Yfi9v89g7EVv!FV5O$sUz`CTzWq|BJ1)|5 z>9ezRSxCAGrqxTd%yF%Qdnzzd%cE;J{BbS3!WAP0^~VV?huvy`B+iowG;|AQKeMkT zRT335UI-azYHC!&G;2x*6Q%~}?eR}}0W%?8yI7<_ zt+*}lxeb(`SXquj2a^kKIvv%CV$z1BUyHPTqW^#V?8JxSdpP&_pq2d2~`A9GN1N;1lFim+z69iEyBhOGlWR)R&jYP>0e6I0JAmDYr5L zmwhi$6d4SZ%%ol^JdCGg-=e=L6s|c*I#uP6n%0Zg$H_NGHk;BV1eFPMs?dx0V)SeU z@3u3jl|;TVmSyWe@S53}T3|mtM31m`>$}1jglhG`HFhCm=Y`v-IZ~r!3WK*Am;xP3 ziHW1xb^%+e{|zY-dkDc1osMaq)-&HhdX}5)>u925eGt+BqvE>gGPVJ&#idbW-F73? zV59u(4Iu)_Qn*R?;X7L|XcMYMFd;i->&S>w(Z62}( zBg&u}h!TbGseXY@x&H;_lKHh&iNu{x>mK8j!B-txZpr+vsZm(7I1E?lyUTF2w2UH- z4Xaj792-Ep?p==@sdMz+fiC~rs%Du|;rR=6@kFWn`xLASIeT(dg=5qZ?SZf-4xXb= zY8p03y^@2`(v=cE1ueK9Y|=cBjHHpqCBbt6nDQrBjIR>;a(LE2h?&MY!~x-{x4RMY z`i^wz2OgM&ROgIQsPZ)w>)r-FGKx96MDqUA+5CJ1X~0o#(%TJtGzXc0u?rbZtmr#& ztl4LKYIxCkJp@RLR$tGa6)RolatSpeRmL$7x&Kju!5L8Csqzt#Ot|&Yv|S@e{pXcf zVGeFmbs11UA(dj^^yX?g>{Tscg|pXGiZq3?3Z#c!Qd>KE{rUq+E|TAQefNE@*~gk$ zCbv?ku~_&*vFO3^-YXsksP7$C15pRrq5epTbJ)57NIb(zXhWp242}yI| zSqzh{L>OLl2rZi+l_1`QitMDN z^6uShq)mn01Ba)pyA-i@cq@};O4@)y85|kwDZ@*1b75o@dL!)9|Hs;!Hn)*o+k*Nj z2uHMox~_5)0H=D_ac^KGVG#rbfTZLv2vrrUtiCF#T0>cW?dRYA)>?b-Gh`+x`Sx>! zOFU;EWS%_3o(FAunSiuqS+UEX1wMFEW;i|3%FAk#$1S1i!Gj9YG)%S_djyTX8K6F3@N_!6e+Vnl&!eT6jb>Xbw2H_|q^Fx~UV=_iTcb8EK6j2+6uSq_3hrG} ziIfSEx?D2(3wdPbWJs03Tsa<8$|+l65f4hHTW zzg%yxMi3(^^HBq6Pj}jkWHc&A)BH&jtRLY_l1IjirnBqO%W6_hSo}bQTl$Pli5w;J zh?A@bwEArL?<}{^3^#kOWBM>PBF4sPC_OE%%+jsf~%kOh!@ zRA&DE?;jt2c=ze;$5@+C={WIdj?yD^^t@D^tHYyZ2a#HDqRw-25vsB8DU-bzadmO909U0f17Ju8d`vXDIbH@m$p=au!O4b3a-IgL79mJ+Nv9R6k67LUoaM8|$!ar_u^ z#&|MrMu>pkr450e9)Jc?02>l0qXQ~Vg3)6o9w~l8V?Yh8#i@aWaztVzk6uqFfp_iy zynPOuv3))?Vk1C@#uFJ-mWWzRtdGJ3b-9

5$l^ywW?p{x%P;TVmKs2I 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�YDtw% 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 UQctugfnResb_^I2A@=kC0D?}91poj5 literal 0 HcmV?d00001 diff --git a/BMS_Testbench/BMS_Software_V1/Debug/BMS_Software.list b/BMS_Testbench/BMS_Software_V1/Debug/BMS_Software.list new file mode 100644 index 0000000..49fca06 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Debug/BMS_Software.list @@ -0,0 +1,16215 @@ + +BMS_Software.elf: file format elf32-littlearm + +Sections: +Idx Name Size VMA LMA File off Algn + 0 .isr_vector 00000188 08000000 08000000 00010000 2**0 + CONTENTS, ALLOC, LOAD, READONLY, DATA + 1 .text 00006358 08000188 08000188 00010188 2**2 + CONTENTS, ALLOC, LOAD, READONLY, CODE + 2 .rodata 00000030 080064e0 080064e0 000164e0 2**2 + CONTENTS, ALLOC, LOAD, READONLY, DATA + 3 .ARM.extab 00000000 08006510 08006510 00020014 2**0 + CONTENTS + 4 .ARM 00000000 08006510 08006510 00020014 2**0 + CONTENTS + 5 .preinit_array 00000000 08006510 08006510 00020014 2**0 + CONTENTS, ALLOC, LOAD, DATA + 6 .init_array 00000004 08006510 08006510 00016510 2**2 + CONTENTS, ALLOC, LOAD, DATA + 7 .fini_array 00000004 08006514 08006514 00016514 2**2 + CONTENTS, ALLOC, LOAD, DATA + 8 .data 00000014 20000000 08006518 00020000 2**2 + CONTENTS, ALLOC, LOAD, DATA + 9 .bss 00000258 20000018 0800652c 00020018 2**3 + ALLOC + 10 ._user_heap_stack 00000600 20000270 0800652c 00020270 2**0 + ALLOC + 11 .ARM.attributes 00000030 00000000 00000000 00020014 2**0 + CONTENTS, READONLY + 12 .debug_info 0000f54c 00000000 00000000 00020044 2**0 + CONTENTS, READONLY, DEBUGGING, OCTETS + 13 .debug_abbrev 00002965 00000000 00000000 0002f590 2**0 + CONTENTS, READONLY, DEBUGGING, OCTETS + 14 .debug_aranges 00000cc8 00000000 00000000 00031ef8 2**3 + CONTENTS, READONLY, DEBUGGING, OCTETS + 15 .debug_ranges 00000bf0 00000000 00000000 00032bc0 2**3 + CONTENTS, READONLY, DEBUGGING, OCTETS + 16 .debug_macro 0001c25c 00000000 00000000 000337b0 2**0 + CONTENTS, READONLY, DEBUGGING, OCTETS + 17 .debug_line 0000feb9 00000000 00000000 0004fa0c 2**0 + CONTENTS, READONLY, DEBUGGING, OCTETS + 18 .debug_str 000a2242 00000000 00000000 0005f8c5 2**0 + CONTENTS, READONLY, DEBUGGING, OCTETS + 19 .comment 00000050 00000000 00000000 00101b07 2**0 + CONTENTS, READONLY + 20 .debug_frame 000033cc 00000000 00000000 00101b58 2**2 + CONTENTS, READONLY, DEBUGGING, OCTETS + +Disassembly of section .text: + +08000188 <__do_global_dtors_aux>: + 8000188: b510 push {r4, lr} + 800018a: 4c05 ldr r4, [pc, #20] ; (80001a0 <__do_global_dtors_aux+0x18>) + 800018c: 7823 ldrb r3, [r4, #0] + 800018e: b933 cbnz r3, 800019e <__do_global_dtors_aux+0x16> + 8000190: 4b04 ldr r3, [pc, #16] ; (80001a4 <__do_global_dtors_aux+0x1c>) + 8000192: b113 cbz r3, 800019a <__do_global_dtors_aux+0x12> + 8000194: 4804 ldr r0, [pc, #16] ; (80001a8 <__do_global_dtors_aux+0x20>) + 8000196: f3af 8000 nop.w + 800019a: 2301 movs r3, #1 + 800019c: 7023 strb r3, [r4, #0] + 800019e: bd10 pop {r4, pc} + 80001a0: 20000018 .word 0x20000018 + 80001a4: 00000000 .word 0x00000000 + 80001a8: 080064c8 .word 0x080064c8 + +080001ac : + 80001ac: b508 push {r3, lr} + 80001ae: 4b03 ldr r3, [pc, #12] ; (80001bc ) + 80001b0: b11b cbz r3, 80001ba + 80001b2: 4903 ldr r1, [pc, #12] ; (80001c0 ) + 80001b4: 4803 ldr r0, [pc, #12] ; (80001c4 ) + 80001b6: f3af 8000 nop.w + 80001ba: bd08 pop {r3, pc} + 80001bc: 00000000 .word 0x00000000 + 80001c0: 2000001c .word 0x2000001c + 80001c4: 080064c8 .word 0x080064c8 + +080001c8 : + +uint8 numberofcells; +uint8 numberofauxchannels; + +uint8 initAMS(SPI_HandleTypeDef* hspi, uint8 numofcells, uint8 numofaux) +{ + 80001c8: b580 push {r7, lr} + 80001ca: b082 sub sp, #8 + 80001cc: af00 add r7, sp, #0 + 80001ce: 6078 str r0, [r7, #4] + 80001d0: 460b mov r3, r1 + 80001d2: 70fb strb r3, [r7, #3] + 80001d4: 4613 mov r3, r2 + 80001d6: 70bb strb r3, [r7, #2] + adbmsDriverInit(hspi); + 80001d8: 6878 ldr r0, [r7, #4] + 80001da: f000 fba7 bl 800092c + numberofcells = numofcells; + 80001de: 4a0d ldr r2, [pc, #52] ; (8000214 ) + 80001e0: 78fb ldrb r3, [r7, #3] + 80001e2: 7013 strb r3, [r2, #0] + numberofauxchannels = numofaux; + 80001e4: 4a0c ldr r2, [pc, #48] ; (8000218 ) + 80001e6: 78bb ldrb r3, [r7, #2] + 80001e8: 7013 strb r3, [r2, #0] + + + amsWakeUp(); + 80001ea: f000 f817 bl 800021c + amsStopBalancing(); + 80001ee: f000 f9ad bl 800054c + amsConfigOverVoltage(DEFAULT_OV); + 80001f2: f640 2041 movw r0, #2625 ; 0xa41 + 80001f6: f000 fa6e bl 80006d6 + amsConfigUnderVoltage(DEFAULT_UV); + 80001fa: f240 601a movw r0, #1562 ; 0x61a + 80001fe: f000 f9af bl 8000560 + amsConfigAuxMeasurement(0xFFFF); + 8000202: f64f 70ff movw r0, #65535 ; 0xffff + 8000206: f000 f90d bl 8000424 + + return 0; + 800020a: 2300 movs r3, #0 +} + 800020c: 4618 mov r0, r3 + 800020e: 3708 adds r7, #8 + 8000210: 46bd mov sp, r7 + 8000212: bd80 pop {r7, pc} + 8000214: 20000034 .word 0x20000034 + 8000218: 20000035 .word 0x20000035 + +0800021c : + +uint8 amsWakeUp() +{ + 800021c: b580 push {r7, lr} + 800021e: b082 sub sp, #8 + 8000220: af00 add r7, sp, #0 + uint8 buf[6]; + readCMD(RDCFGA, buf, 6); + 8000222: 463b mov r3, r7 + 8000224: 2206 movs r2, #6 + 8000226: 4619 mov r1, r3 + 8000228: 2002 movs r0, #2 + 800022a: f000 fdab bl 8000d84 + return 0; + 800022e: 2300 movs r3, #0 +} + 8000230: 4618 mov r0, r3 + 8000232: 3708 adds r7, #8 + 8000234: 46bd mov sp, r7 + 8000236: bd80 pop {r7, pc} + +08000238 : + +uint8 amsCellMeasurement(Cell_Module *module) +{ + 8000238: b580 push {r7, lr} + 800023a: b084 sub sp, #16 + 800023c: af00 add r7, sp, #0 + 800023e: 6078 str r0, [r7, #4] + uint8_t rxbuffer[CV_GROUP_A_SIZE]; + writeCMD((ADCV | CH000 | MD10), rxbuffer, 0); + 8000240: f107 0308 add.w r3, r7, #8 + 8000244: 2200 movs r2, #0 + 8000246: 4619 mov r1, r3 + 8000248: f44f 7058 mov.w r0, #864 ; 0x360 + 800024c: f000 fd11 bl 8000c72 + mcuDelay(5); + 8000250: 2005 movs r0, #5 + 8000252: f000 fecd bl 8000ff0 + amsReadCellVoltages(module); + 8000256: 6878 ldr r0, [r7, #4] + 8000258: f000 fa80 bl 800075c + return 0; + 800025c: 2300 movs r3, #0 +} + 800025e: 4618 mov r0, r3 + 8000260: 3710 adds r7, #16 + 8000262: 46bd mov sp, r7 + 8000264: bd80 pop {r7, pc} + +08000266 : + numberofcells = numberofChannels; + return 0; +} + +uint8 amsAuxMeasurement(Cell_Module *module) +{ + 8000266: b580 push {r7, lr} + 8000268: b084 sub sp, #16 + 800026a: af00 add r7, sp, #0 + 800026c: 6078 str r0, [r7, #4] + uint8 args; + uint8 rxbuf[AUX_GROUP_A_SIZE]; + writeCMD(ADAX | MD01 | CHG000, &args, 0); + 800026e: f107 030f add.w r3, r7, #15 + 8000272: 2200 movs r2, #0 + 8000274: 4619 mov r1, r3 + 8000276: f44f 609c mov.w r0, #1248 ; 0x4e0 + 800027a: f000 fcfa bl 8000c72 + + mcuDelay(5); + 800027e: 2005 movs r0, #5 + 8000280: f000 feb6 bl 8000ff0 + + readCMD(RDAUXA, rxbuf, AUX_GROUP_A_SIZE); + 8000284: f107 0308 add.w r3, r7, #8 + 8000288: 2206 movs r2, #6 + 800028a: 4619 mov r1, r3 + 800028c: 200c movs r0, #12 + 800028e: f000 fd79 bl 8000d84 + + module->auxVoltages[0] = rxbuf[0] | (rxbuf[1]<<8); + 8000292: 7a3b ldrb r3, [r7, #8] + 8000294: b21a sxth r2, r3 + 8000296: 7a7b ldrb r3, [r7, #9] + 8000298: 021b lsls r3, r3, #8 + 800029a: b21b sxth r3, r3 + 800029c: 4313 orrs r3, r2 + 800029e: b21b sxth r3, r3 + 80002a0: b29a uxth r2, r3 + 80002a2: 687b ldr r3, [r7, #4] + 80002a4: 849a strh r2, [r3, #36] ; 0x24 + module->auxVoltages[1] = rxbuf[2] | (rxbuf[3]<<8); + 80002a6: 7abb ldrb r3, [r7, #10] + 80002a8: b21a sxth r2, r3 + 80002aa: 7afb ldrb r3, [r7, #11] + 80002ac: 021b lsls r3, r3, #8 + 80002ae: b21b sxth r3, r3 + 80002b0: 4313 orrs r3, r2 + 80002b2: b21b sxth r3, r3 + 80002b4: b29a uxth r2, r3 + 80002b6: 687b ldr r3, [r7, #4] + 80002b8: 84da strh r2, [r3, #38] ; 0x26 + module->auxVoltages[2] = rxbuf[4] | (rxbuf[5]<<8); + 80002ba: 7b3b ldrb r3, [r7, #12] + 80002bc: b21a sxth r2, r3 + 80002be: 7b7b ldrb r3, [r7, #13] + 80002c0: 021b lsls r3, r3, #8 + 80002c2: b21b sxth r3, r3 + 80002c4: 4313 orrs r3, r2 + 80002c6: b21b sxth r3, r3 + 80002c8: b29a uxth r2, r3 + 80002ca: 687b ldr r3, [r7, #4] + 80002cc: 851a strh r2, [r3, #40] ; 0x28 + + readCMD(RDAUXB, rxbuf, AUX_GROUP_A_SIZE); + 80002ce: f107 0308 add.w r3, r7, #8 + 80002d2: 2206 movs r2, #6 + 80002d4: 4619 mov r1, r3 + 80002d6: 200e movs r0, #14 + 80002d8: f000 fd54 bl 8000d84 + + module->auxVoltages[3] = rxbuf[0] | (rxbuf[1]<<8); + 80002dc: 7a3b ldrb r3, [r7, #8] + 80002de: b21a sxth r2, r3 + 80002e0: 7a7b ldrb r3, [r7, #9] + 80002e2: 021b lsls r3, r3, #8 + 80002e4: b21b sxth r3, r3 + 80002e6: 4313 orrs r3, r2 + 80002e8: b21b sxth r3, r3 + 80002ea: b29a uxth r2, r3 + 80002ec: 687b ldr r3, [r7, #4] + 80002ee: 855a strh r2, [r3, #42] ; 0x2a + module->auxVoltages[4] = rxbuf[2] | (rxbuf[3]<<8); + 80002f0: 7abb ldrb r3, [r7, #10] + 80002f2: b21a sxth r2, r3 + 80002f4: 7afb ldrb r3, [r7, #11] + 80002f6: 021b lsls r3, r3, #8 + 80002f8: b21b sxth r3, r3 + 80002fa: 4313 orrs r3, r2 + 80002fc: b21b sxth r3, r3 + 80002fe: b29a uxth r2, r3 + 8000300: 687b ldr r3, [r7, #4] + 8000302: 859a strh r2, [r3, #44] ; 0x2c + module->refVoltage = rxbuf[4] | (rxbuf[5]<<8); + 8000304: 7b3b ldrb r3, [r7, #12] + 8000306: b21a sxth r2, r3 + 8000308: 7b7b ldrb r3, [r7, #13] + 800030a: 021b lsls r3, r3, #8 + 800030c: b21b sxth r3, r3 + 800030e: 4313 orrs r3, r2 + 8000310: b21b sxth r3, r3 + 8000312: b29a uxth r2, r3 + 8000314: 687b ldr r3, [r7, #4] + 8000316: f8a3 2040 strh.w r2, [r3, #64] ; 0x40 + + readCMD(RDAUXC, rxbuf, AUX_GROUP_A_SIZE); + 800031a: f107 0308 add.w r3, r7, #8 + 800031e: 2206 movs r2, #6 + 8000320: 4619 mov r1, r3 + 8000322: 200d movs r0, #13 + 8000324: f000 fd2e bl 8000d84 + + module->auxVoltages[5] = rxbuf[0] | (rxbuf[1]<<8); + 8000328: 7a3b ldrb r3, [r7, #8] + 800032a: b21a sxth r2, r3 + 800032c: 7a7b ldrb r3, [r7, #9] + 800032e: 021b lsls r3, r3, #8 + 8000330: b21b sxth r3, r3 + 8000332: 4313 orrs r3, r2 + 8000334: b21b sxth r3, r3 + 8000336: b29a uxth r2, r3 + 8000338: 687b ldr r3, [r7, #4] + 800033a: 85da strh r2, [r3, #46] ; 0x2e + module->auxVoltages[6] = rxbuf[2] | (rxbuf[3]<<8); + 800033c: 7abb ldrb r3, [r7, #10] + 800033e: b21a sxth r2, r3 + 8000340: 7afb ldrb r3, [r7, #11] + 8000342: 021b lsls r3, r3, #8 + 8000344: b21b sxth r3, r3 + 8000346: 4313 orrs r3, r2 + 8000348: b21b sxth r3, r3 + 800034a: b29a uxth r2, r3 + 800034c: 687b ldr r3, [r7, #4] + 800034e: 861a strh r2, [r3, #48] ; 0x30 + module->auxVoltages[7] = rxbuf[4] | (rxbuf[5]<<8); + 8000350: 7b3b ldrb r3, [r7, #12] + 8000352: b21a sxth r2, r3 + 8000354: 7b7b ldrb r3, [r7, #13] + 8000356: 021b lsls r3, r3, #8 + 8000358: b21b sxth r3, r3 + 800035a: 4313 orrs r3, r2 + 800035c: b21b sxth r3, r3 + 800035e: b29a uxth r2, r3 + 8000360: 687b ldr r3, [r7, #4] + 8000362: 865a strh r2, [r3, #50] ; 0x32 + + readCMD(RDAUXD, rxbuf, AUX_GROUP_A_SIZE); + 8000364: f107 0308 add.w r3, r7, #8 + 8000368: 2206 movs r2, #6 + 800036a: 4619 mov r1, r3 + 800036c: 200f movs r0, #15 + 800036e: f000 fd09 bl 8000d84 + + module->auxVoltages[8] = rxbuf[0] | (rxbuf[1]<<8); + 8000372: 7a3b ldrb r3, [r7, #8] + 8000374: b21a sxth r2, r3 + 8000376: 7a7b ldrb r3, [r7, #9] + 8000378: 021b lsls r3, r3, #8 + 800037a: b21b sxth r3, r3 + 800037c: 4313 orrs r3, r2 + 800037e: b21b sxth r3, r3 + 8000380: b29a uxth r2, r3 + 8000382: 687b ldr r3, [r7, #4] + 8000384: 869a strh r2, [r3, #52] ; 0x34 + + return 0; + 8000386: 2300 movs r3, #0 +} + 8000388: 4618 mov r0, r3 + 800038a: 3710 adds r7, #16 + 800038c: 46bd mov sp, r7 + 800038e: bd80 pop {r7, pc} + +08000390 : + +uint8 amsInternalStatusMeasurement(Cell_Module *module) +{ + 8000390: b580 push {r7, lr} + 8000392: b084 sub sp, #16 + 8000394: af00 add r7, sp, #0 + 8000396: 6078 str r0, [r7, #4] + uint8 rxbuffer[STATUS_GROUP_A_SIZE]; + writeCMD(ADSTAT | MD01 | CHST000, rxbuffer, STATUS_GROUP_A_SIZE); + 8000398: f107 0308 add.w r3, r7, #8 + 800039c: 2206 movs r2, #6 + 800039e: 4619 mov r1, r3 + 80003a0: f44f 609d mov.w r0, #1256 ; 0x4e8 + 80003a4: f000 fc65 bl 8000c72 + mcuDelay(5); + 80003a8: 2005 movs r0, #5 + 80003aa: f000 fe21 bl 8000ff0 + + readCMD(RDSTATA, rxbuffer, STATUS_GROUP_A_SIZE); + 80003ae: f107 0308 add.w r3, r7, #8 + 80003b2: 2206 movs r2, #6 + 80003b4: 4619 mov r1, r3 + 80003b6: 2010 movs r0, #16 + 80003b8: f000 fce4 bl 8000d84 + + module->sumOfCellMeasurements = rxbuffer[0] | (rxbuffer[1]<<8); + 80003bc: 7a3b ldrb r3, [r7, #8] + 80003be: b21a sxth r2, r3 + 80003c0: 7a7b ldrb r3, [r7, #9] + 80003c2: 021b lsls r3, r3, #8 + 80003c4: b21b sxth r3, r3 + 80003c6: 4313 orrs r3, r2 + 80003c8: b21b sxth r3, r3 + 80003ca: b29a uxth r2, r3 + 80003cc: 687b ldr r3, [r7, #4] + 80003ce: 87da strh r2, [r3, #62] ; 0x3e + module->internalDieTemp = rxbuffer[2] | (rxbuffer[3]<<8); + 80003d0: 7abb ldrb r3, [r7, #10] + 80003d2: b21a sxth r2, r3 + 80003d4: 7afb ldrb r3, [r7, #11] + 80003d6: 021b lsls r3, r3, #8 + 80003d8: b21b sxth r3, r3 + 80003da: 4313 orrs r3, r2 + 80003dc: b21b sxth r3, r3 + 80003de: b29a uxth r2, r3 + 80003e0: 687b ldr r3, [r7, #4] + 80003e2: 871a strh r2, [r3, #56] ; 0x38 + module->analogSupplyVoltage = rxbuffer[4] | (rxbuffer[5]<<8); + 80003e4: 7b3b ldrb r3, [r7, #12] + 80003e6: b21a sxth r2, r3 + 80003e8: 7b7b ldrb r3, [r7, #13] + 80003ea: 021b lsls r3, r3, #8 + 80003ec: b21b sxth r3, r3 + 80003ee: 4313 orrs r3, r2 + 80003f0: b21b sxth r3, r3 + 80003f2: b29a uxth r2, r3 + 80003f4: 687b ldr r3, [r7, #4] + 80003f6: 875a strh r2, [r3, #58] ; 0x3a + + readCMD(RDSTATB, rxbuffer, STATUS_GROUP_B_SIZE); + 80003f8: f107 0308 add.w r3, r7, #8 + 80003fc: 2206 movs r2, #6 + 80003fe: 4619 mov r1, r3 + 8000400: 2012 movs r0, #18 + 8000402: f000 fcbf bl 8000d84 + module->digitalSupplyVoltage = rxbuffer[0] | (rxbuffer[1]<<8); + 8000406: 7a3b ldrb r3, [r7, #8] + 8000408: b21a sxth r2, r3 + 800040a: 7a7b ldrb r3, [r7, #9] + 800040c: 021b lsls r3, r3, #8 + 800040e: b21b sxth r3, r3 + 8000410: 4313 orrs r3, r2 + 8000412: b21b sxth r3, r3 + 8000414: b29a uxth r2, r3 + 8000416: 687b ldr r3, [r7, #4] + 8000418: 879a strh r2, [r3, #60] ; 0x3c + + + return 0; + 800041a: 2300 movs r3, #0 +} + 800041c: 4618 mov r0, r3 + 800041e: 3710 adds r7, #16 + 8000420: 46bd mov sp, r7 + 8000422: bd80 pop {r7, pc} + +08000424 : + +uint8 amsConfigAuxMeasurement(uint16 Channels) +{ + 8000424: b580 push {r7, lr} + 8000426: b084 sub sp, #16 + 8000428: af00 add r7, sp, #0 + 800042a: 4603 mov r3, r0 + 800042c: 80fb strh r3, [r7, #6] + uint8 buf[CFG_GROUP_A_SIZE]; + + readCMD(RDCFGA, buf, CFG_GROUP_A_SIZE); + 800042e: f107 0308 add.w r3, r7, #8 + 8000432: 2206 movs r2, #6 + 8000434: 4619 mov r1, r3 + 8000436: 2002 movs r0, #2 + 8000438: f000 fca4 bl 8000d84 + buf[0] |= 0xF8; + 800043c: 7a3b ldrb r3, [r7, #8] + 800043e: f063 0307 orn r3, r3, #7 + 8000442: b2db uxtb r3, r3 + 8000444: 723b strb r3, [r7, #8] + writeCMD(WRCFGA, buf, CFG_GROUP_A_SIZE); + 8000446: f107 0308 add.w r3, r7, #8 + 800044a: 2206 movs r2, #6 + 800044c: 4619 mov r1, r3 + 800044e: 2001 movs r0, #1 + 8000450: f000 fc0f bl 8000c72 + + readCMD(RDCFGB, buf, CFG_GROUP_B_SIZE); + 8000454: f107 0308 add.w r3, r7, #8 + 8000458: 2206 movs r2, #6 + 800045a: 4619 mov r1, r3 + 800045c: 2026 movs r0, #38 ; 0x26 + 800045e: f000 fc91 bl 8000d84 + buf[0] |= 0x0F; + 8000462: 7a3b ldrb r3, [r7, #8] + 8000464: f043 030f orr.w r3, r3, #15 + 8000468: b2db uxtb r3, r3 + 800046a: 723b strb r3, [r7, #8] + writeCMD(WRCFGB, buf, CFG_GROUP_B_SIZE); + 800046c: f107 0308 add.w r3, r7, #8 + 8000470: 2206 movs r2, #6 + 8000472: 4619 mov r1, r3 + 8000474: 2024 movs r0, #36 ; 0x24 + 8000476: f000 fbfc bl 8000c72 + return 0; + 800047a: 2300 movs r3, #0 +} + 800047c: 4618 mov r0, r3 + 800047e: 3710 adds r7, #16 + 8000480: 46bd mov sp, r7 + 8000482: bd80 pop {r7, pc} + +08000484 : +{ + return 0; +} + +uint8 amsConfigBalancing(uint32 Channels) +{ + 8000484: b580 push {r7, lr} + 8000486: b084 sub sp, #16 + 8000488: af00 add r7, sp, #0 + 800048a: 6078 str r0, [r7, #4] + + uint8 regbuffer[CFG_GROUP_A_SIZE]; + readCMD(RDCFGA, regbuffer, CFG_GROUP_A_SIZE); + 800048c: f107 0308 add.w r3, r7, #8 + 8000490: 2206 movs r2, #6 + 8000492: 4619 mov r1, r3 + 8000494: 2002 movs r0, #2 + 8000496: f000 fc75 bl 8000d84 + + regbuffer[4] = Channels & 0xFF; + 800049a: 687b ldr r3, [r7, #4] + 800049c: b2db uxtb r3, r3 + 800049e: 733b strb r3, [r7, #12] + regbuffer[5] &= 0xF0; + 80004a0: 7b7b ldrb r3, [r7, #13] + 80004a2: f023 030f bic.w r3, r3, #15 + 80004a6: b2db uxtb r3, r3 + 80004a8: 737b strb r3, [r7, #13] + regbuffer[5] |= (Channels>>8) & 0x0F; + 80004aa: 7b7a ldrb r2, [r7, #13] + 80004ac: 687b ldr r3, [r7, #4] + 80004ae: 0a1b lsrs r3, r3, #8 + 80004b0: b2db uxtb r3, r3 + 80004b2: f003 030f and.w r3, r3, #15 + 80004b6: b2db uxtb r3, r3 + 80004b8: 4313 orrs r3, r2 + 80004ba: b2db uxtb r3, r3 + 80004bc: 737b strb r3, [r7, #13] + writeCMD(WRCFGA, regbuffer, CFG_GROUP_A_SIZE); + 80004be: f107 0308 add.w r3, r7, #8 + 80004c2: 2206 movs r2, #6 + 80004c4: 4619 mov r1, r3 + 80004c6: 2001 movs r0, #1 + 80004c8: f000 fbd3 bl 8000c72 + + readCMD(RDCFGB, regbuffer, CFG_GROUP_B_SIZE); + 80004cc: f107 0308 add.w r3, r7, #8 + 80004d0: 2206 movs r2, #6 + 80004d2: 4619 mov r1, r3 + 80004d4: 2026 movs r0, #38 ; 0x26 + 80004d6: f000 fc55 bl 8000d84 + regbuffer[0] &= 0x0F; + 80004da: 7a3b ldrb r3, [r7, #8] + 80004dc: f003 030f and.w r3, r3, #15 + 80004e0: b2db uxtb r3, r3 + 80004e2: 723b strb r3, [r7, #8] + regbuffer[0] |= (Channels>>8) & 0xF0; + 80004e4: 7a3a ldrb r2, [r7, #8] + 80004e6: 687b ldr r3, [r7, #4] + 80004e8: 0a1b lsrs r3, r3, #8 + 80004ea: b2db uxtb r3, r3 + 80004ec: f023 030f bic.w r3, r3, #15 + 80004f0: b2db uxtb r3, r3 + 80004f2: 4313 orrs r3, r2 + 80004f4: b2db uxtb r3, r3 + 80004f6: 723b strb r3, [r7, #8] + regbuffer[1] &= 0xFC; + 80004f8: 7a7b ldrb r3, [r7, #9] + 80004fa: f023 0303 bic.w r3, r3, #3 + 80004fe: b2db uxtb r3, r3 + 8000500: 727b strb r3, [r7, #9] + regbuffer[1] |= 0x03 & (Channels>>16); + 8000502: 7a7a ldrb r2, [r7, #9] + 8000504: 687b ldr r3, [r7, #4] + 8000506: 0c1b lsrs r3, r3, #16 + 8000508: b2db uxtb r3, r3 + 800050a: f003 0303 and.w r3, r3, #3 + 800050e: b2db uxtb r3, r3 + 8000510: 4313 orrs r3, r2 + 8000512: b2db uxtb r3, r3 + 8000514: 727b strb r3, [r7, #9] + writeCMD(WRCFGB, regbuffer, CFG_GROUP_B_SIZE); + 8000516: f107 0308 add.w r3, r7, #8 + 800051a: 2206 movs r2, #6 + 800051c: 4619 mov r1, r3 + 800051e: 2024 movs r0, #36 ; 0x24 + 8000520: f000 fba7 bl 8000c72 + + return 0; + 8000524: 2300 movs r3, #0 +} + 8000526: 4618 mov r0, r3 + 8000528: 3710 adds r7, #16 + 800052a: 46bd mov sp, r7 + 800052c: bd80 pop {r7, pc} + +0800052e : + +uint8 amsStartBalancing(uint8 dutyCycle) +{ + 800052e: b580 push {r7, lr} + 8000530: b082 sub sp, #8 + 8000532: af00 add r7, sp, #0 + 8000534: 4603 mov r3, r0 + 8000536: 71fb strb r3, [r7, #7] + writeCMD(UNMUTE, NULL, 0); + 8000538: 2200 movs r2, #0 + 800053a: 2100 movs r1, #0 + 800053c: 2029 movs r0, #41 ; 0x29 + 800053e: f000 fb98 bl 8000c72 + return 0; + 8000542: 2300 movs r3, #0 +} + 8000544: 4618 mov r0, r3 + 8000546: 3708 adds r7, #8 + 8000548: 46bd mov sp, r7 + 800054a: bd80 pop {r7, pc} + +0800054c : + +uint8 amsStopBalancing() +{ + 800054c: b580 push {r7, lr} + 800054e: af00 add r7, sp, #0 + writeCMD(MUTE, NULL, 0); + 8000550: 2200 movs r2, #0 + 8000552: 2100 movs r1, #0 + 8000554: 2028 movs r0, #40 ; 0x28 + 8000556: f000 fb8c bl 8000c72 + return 0; + 800055a: 2300 movs r3, #0 +} + 800055c: 4618 mov r0, r3 + 800055e: bd80 pop {r7, pc} + +08000560 : +} + + + +uint8 amsConfigUnderVoltage(uint16 underVoltage) +{ + 8000560: b580 push {r7, lr} + 8000562: b084 sub sp, #16 + 8000564: af00 add r7, sp, #0 + 8000566: 4603 mov r3, r0 + 8000568: 80fb strh r3, [r7, #6] + uint8 buffer[CFG_GROUP_A_SIZE]; + readCMD(RDCFGA, buffer, CFG_GROUP_A_SIZE); + 800056a: f107 0308 add.w r3, r7, #8 + 800056e: 2206 movs r2, #6 + 8000570: 4619 mov r1, r3 + 8000572: 2002 movs r0, #2 + 8000574: f000 fc06 bl 8000d84 + + buffer[1] = (uint8) underVoltage & 0xFF; + 8000578: 88fb ldrh r3, [r7, #6] + 800057a: b2db uxtb r3, r3 + 800057c: 727b strb r3, [r7, #9] + uint8 ovuv = buffer[2] & 0xF0; + 800057e: 7abb ldrb r3, [r7, #10] + 8000580: f023 030f bic.w r3, r3, #15 + 8000584: 73fb strb r3, [r7, #15] + ovuv |= (uint8) (underVoltage >> 8) & 0x0F; + 8000586: 88fb ldrh r3, [r7, #6] + 8000588: 0a1b lsrs r3, r3, #8 + 800058a: b29b uxth r3, r3 + 800058c: b25b sxtb r3, r3 + 800058e: f003 030f and.w r3, r3, #15 + 8000592: b25a sxtb r2, r3 + 8000594: f997 300f ldrsb.w r3, [r7, #15] + 8000598: 4313 orrs r3, r2 + 800059a: b25b sxtb r3, r3 + 800059c: 73fb strb r3, [r7, #15] + buffer[2] = ovuv; + 800059e: 7bfb ldrb r3, [r7, #15] + 80005a0: 72bb strb r3, [r7, #10] + + writeCMD(WRCFGA, buffer, CFG_GROUP_A_SIZE); + 80005a2: f107 0308 add.w r3, r7, #8 + 80005a6: 2206 movs r2, #6 + 80005a8: 4619 mov r1, r3 + 80005aa: 2001 movs r0, #1 + 80005ac: f000 fb61 bl 8000c72 + + return 0; + 80005b0: 2300 movs r3, #0 +} + 80005b2: 4618 mov r0, r3 + 80005b4: 3710 adds r7, #16 + 80005b6: 46bd mov sp, r7 + 80005b8: bd80 pop {r7, pc} + +080005ba : + +uint8 amsCheckUnderOverVoltage(Cell_Module *module) +{ + 80005ba: b580 push {r7, lr} + 80005bc: b088 sub sp, #32 + 80005be: af00 add r7, sp, #0 + 80005c0: 6078 str r0, [r7, #4] + uint8 regbuffer[STATUS_GROUP_B_SIZE]; + uint32 overundervoltages = 0; + 80005c2: 2300 movs r3, #0 + 80005c4: 61bb str r3, [r7, #24] + readCMD(RDSTATB, regbuffer, STATUS_GROUP_B_SIZE); + 80005c6: f107 030c add.w r3, r7, #12 + 80005ca: 2206 movs r2, #6 + 80005cc: 4619 mov r1, r3 + 80005ce: 2012 movs r0, #18 + 80005d0: f000 fbd8 bl 8000d84 + overundervoltages = regbuffer[2] | (regbuffer[3]<<8) | (regbuffer[4]<<16); + 80005d4: 7bbb ldrb r3, [r7, #14] + 80005d6: 461a mov r2, r3 + 80005d8: 7bfb ldrb r3, [r7, #15] + 80005da: 021b lsls r3, r3, #8 + 80005dc: 431a orrs r2, r3 + 80005de: 7c3b ldrb r3, [r7, #16] + 80005e0: 041b lsls r3, r3, #16 + 80005e2: 4313 orrs r3, r2 + 80005e4: 61bb str r3, [r7, #24] + module->overVoltage = 0; + 80005e6: 687b ldr r3, [r7, #4] + 80005e8: 2200 movs r2, #0 + 80005ea: 659a str r2, [r3, #88] ; 0x58 + module->underVoltage = 0; + 80005ec: 687b ldr r3, [r7, #4] + 80005ee: 2200 movs r2, #0 + 80005f0: 65da str r2, [r3, #92] ; 0x5c + for(uint8 n = 0; n < 12; n++) + 80005f2: 2300 movs r3, #0 + 80005f4: 77fb strb r3, [r7, #31] + 80005f6: e027 b.n 8000648 + { + uint8 overvolt = (overundervoltages>>(2*n+1)) & 0x01; + 80005f8: 7ffb ldrb r3, [r7, #31] + 80005fa: 005b lsls r3, r3, #1 + 80005fc: 3301 adds r3, #1 + 80005fe: 69ba ldr r2, [r7, #24] + 8000600: fa22 f303 lsr.w r3, r2, r3 + 8000604: b2db uxtb r3, r3 + 8000606: f003 0301 and.w r3, r3, #1 + 800060a: 757b strb r3, [r7, #21] + uint8 undervolt = (overundervoltages>>(2*n))&0x01; + 800060c: 7ffb ldrb r3, [r7, #31] + 800060e: 005b lsls r3, r3, #1 + 8000610: 69ba ldr r2, [r7, #24] + 8000612: fa22 f303 lsr.w r3, r2, r3 + 8000616: b2db uxtb r3, r3 + 8000618: f003 0301 and.w r3, r3, #1 + 800061c: 753b strb r3, [r7, #20] + + module->overVoltage |= overvolt<underVoltage |= undervolt< + } + + readCMD(RDAUXD,regbuffer,AUX_GROUP_D_SIZE); + 800064e: f107 030c add.w r3, r7, #12 + 8000652: 2206 movs r2, #6 + 8000654: 4619 mov r1, r3 + 8000656: 200f movs r0, #15 + 8000658: f000 fb94 bl 8000d84 + overundervoltages = 0; + 800065c: 2300 movs r3, #0 + 800065e: 61bb str r3, [r7, #24] + overundervoltages = regbuffer[4] | (regbuffer[5]<<8); + 8000660: 7c3b ldrb r3, [r7, #16] + 8000662: 461a mov r2, r3 + 8000664: 7c7b ldrb r3, [r7, #17] + 8000666: 021b lsls r3, r3, #8 + 8000668: 4313 orrs r3, r2 + 800066a: 61bb str r3, [r7, #24] + + for(uint8 n = 0; n < 6; n++) + 800066c: 2300 movs r3, #0 + 800066e: 77bb strb r3, [r7, #30] + 8000670: e029 b.n 80006c6 + { + uint8 overvolt = (overundervoltages>>(2*n+1)) & 0x01; + 8000672: 7fbb ldrb r3, [r7, #30] + 8000674: 005b lsls r3, r3, #1 + 8000676: 3301 adds r3, #1 + 8000678: 69ba ldr r2, [r7, #24] + 800067a: fa22 f303 lsr.w r3, r2, r3 + 800067e: b2db uxtb r3, r3 + 8000680: f003 0301 and.w r3, r3, #1 + 8000684: 75fb strb r3, [r7, #23] + uint8 undervolt = (overundervoltages>>(2*n))&0x01; + 8000686: 7fbb ldrb r3, [r7, #30] + 8000688: 005b lsls r3, r3, #1 + 800068a: 69ba ldr r2, [r7, #24] + 800068c: fa22 f303 lsr.w r3, r2, r3 + 8000690: b2db uxtb r3, r3 + 8000692: f003 0301 and.w r3, r3, #1 + 8000696: 75bb strb r3, [r7, #22] + + module->overVoltage |= (uint32) overvolt<<(n+12); + 8000698: 687b ldr r3, [r7, #4] + 800069a: 6d9a ldr r2, [r3, #88] ; 0x58 + 800069c: 7df9 ldrb r1, [r7, #23] + 800069e: 7fbb ldrb r3, [r7, #30] + 80006a0: 330c adds r3, #12 + 80006a2: fa01 f303 lsl.w r3, r1, r3 + 80006a6: 431a orrs r2, r3 + 80006a8: 687b ldr r3, [r7, #4] + 80006aa: 659a str r2, [r3, #88] ; 0x58 + module->underVoltage |= (uint32) undervolt<<(n+12); + 80006ac: 687b ldr r3, [r7, #4] + 80006ae: 6dda ldr r2, [r3, #92] ; 0x5c + 80006b0: 7db9 ldrb r1, [r7, #22] + 80006b2: 7fbb ldrb r3, [r7, #30] + 80006b4: 330c adds r3, #12 + 80006b6: fa01 f303 lsl.w r3, r1, r3 + 80006ba: 431a orrs r2, r3 + 80006bc: 687b ldr r3, [r7, #4] + 80006be: 65da str r2, [r3, #92] ; 0x5c + for(uint8 n = 0; n < 6; n++) + 80006c0: 7fbb ldrb r3, [r7, #30] + 80006c2: 3301 adds r3, #1 + 80006c4: 77bb strb r3, [r7, #30] + 80006c6: 7fbb ldrb r3, [r7, #30] + 80006c8: 2b05 cmp r3, #5 + 80006ca: d9d2 bls.n 8000672 + } + + + return 0; + 80006cc: 2300 movs r3, #0 +} + 80006ce: 4618 mov r0, r3 + 80006d0: 3720 adds r7, #32 + 80006d2: 46bd mov sp, r7 + 80006d4: bd80 pop {r7, pc} + +080006d6 : + +uint8 amsConfigOverVoltage(uint16 overVoltage) +{ + 80006d6: b580 push {r7, lr} + 80006d8: b084 sub sp, #16 + 80006da: af00 add r7, sp, #0 + 80006dc: 4603 mov r3, r0 + 80006de: 80fb strh r3, [r7, #6] + uint8 buffer[CFG_GROUP_B_SIZE]; + + readCMD(RDCFGA, buffer, CFG_GROUP_A_SIZE); + 80006e0: f107 0308 add.w r3, r7, #8 + 80006e4: 2206 movs r2, #6 + 80006e6: 4619 mov r1, r3 + 80006e8: 2002 movs r0, #2 + 80006ea: f000 fb4b bl 8000d84 + buffer[2] &= 0x0F; + 80006ee: 7abb ldrb r3, [r7, #10] + 80006f0: f003 030f and.w r3, r3, #15 + 80006f4: b2db uxtb r3, r3 + 80006f6: 72bb strb r3, [r7, #10] + buffer[2] |= (uint8) overVoltage << 4; + 80006f8: 7abb ldrb r3, [r7, #10] + 80006fa: b25a sxtb r2, r3 + 80006fc: 88fb ldrh r3, [r7, #6] + 80006fe: b2db uxtb r3, r3 + 8000700: 011b lsls r3, r3, #4 + 8000702: b25b sxtb r3, r3 + 8000704: 4313 orrs r3, r2 + 8000706: b25b sxtb r3, r3 + 8000708: b2db uxtb r3, r3 + 800070a: 72bb strb r3, [r7, #10] + buffer[3] = (uint8)(overVoltage>>4); + 800070c: 88fb ldrh r3, [r7, #6] + 800070e: 091b lsrs r3, r3, #4 + 8000710: b29b uxth r3, r3 + 8000712: b2db uxtb r3, r3 + 8000714: 72fb strb r3, [r7, #11] + + writeCMD(WRCFGA, buffer, CFG_GROUP_A_SIZE); + 8000716: f107 0308 add.w r3, r7, #8 + 800071a: 2206 movs r2, #6 + 800071c: 4619 mov r1, r3 + 800071e: 2001 movs r0, #1 + 8000720: f000 faa7 bl 8000c72 + + return 0; + 8000724: 2300 movs r3, #0 +} + 8000726: 4618 mov r0, r3 + 8000728: 3710 adds r7, #16 + 800072a: 46bd mov sp, r7 + 800072c: bd80 pop {r7, pc} + +0800072e : + uint8 buffer[6]; + writeCMD(CLRSTAT, buffer, 0); + return 0; +} +uint8 amsClearAux() +{ + 800072e: b580 push {r7, lr} + 8000730: b082 sub sp, #8 + 8000732: af00 add r7, sp, #0 + uint8 buffer[6]; + writeCMD(CLRAUX, buffer, 0); + 8000734: 463b mov r3, r7 + 8000736: 2200 movs r2, #0 + 8000738: 4619 mov r1, r3 + 800073a: f240 7012 movw r0, #1810 ; 0x712 + 800073e: f000 fa98 bl 8000c72 + return 0; + 8000742: 2300 movs r3, #0 +} + 8000744: 4618 mov r0, r3 + 8000746: 3708 adds r7, #8 + 8000748: 46bd mov sp, r7 + 800074a: bd80 pop {r7, pc} + +0800074c : + //HAL_GPIO_WritePin(AMS_Error_GPIO_Port, AMS_Error_Pin, GPIO_PIN_SET); + return 0; +} + +uint8 amsClearWarning() +{ + 800074c: b480 push {r7} + 800074e: af00 add r7, sp, #0 + //HAL_GPIO_WritePin(AMS_Warning_GPIO_Port, AMS_Warning_Pin, GPIO_PIN_RESET); + return 0; + 8000750: 2300 movs r3, #0 +} + 8000752: 4618 mov r0, r3 + 8000754: 46bd mov sp, r7 + 8000756: f85d 7b04 ldr.w r7, [sp], #4 + 800075a: 4770 bx lr + +0800075c : + + return 0; +} + +uint8 amsReadCellVoltages(Cell_Module *module) +{ + 800075c: b580 push {r7, lr} + 800075e: b084 sub sp, #16 + 8000760: af00 add r7, sp, #0 + 8000762: 6078 str r0, [r7, #4] + uint8 rxbuffer[CV_GROUP_A_SIZE]; + readCMD(RDCVA, rxbuffer, CV_GROUP_A_SIZE); + 8000764: f107 0308 add.w r3, r7, #8 + 8000768: 2206 movs r2, #6 + 800076a: 4619 mov r1, r3 + 800076c: 2004 movs r0, #4 + 800076e: f000 fb09 bl 8000d84 + module->cellVoltages[0] = rxbuffer[0] | (rxbuffer[1]<<8); + 8000772: 7a3b ldrb r3, [r7, #8] + 8000774: b21a sxth r2, r3 + 8000776: 7a7b ldrb r3, [r7, #9] + 8000778: 021b lsls r3, r3, #8 + 800077a: b21b sxth r3, r3 + 800077c: 4313 orrs r3, r2 + 800077e: b21b sxth r3, r3 + 8000780: b29a uxth r2, r3 + 8000782: 687b ldr r3, [r7, #4] + 8000784: 801a strh r2, [r3, #0] + module->cellVoltages[1] = rxbuffer[2] | (rxbuffer[3]<<8); + 8000786: 7abb ldrb r3, [r7, #10] + 8000788: b21a sxth r2, r3 + 800078a: 7afb ldrb r3, [r7, #11] + 800078c: 021b lsls r3, r3, #8 + 800078e: b21b sxth r3, r3 + 8000790: 4313 orrs r3, r2 + 8000792: b21b sxth r3, r3 + 8000794: b29a uxth r2, r3 + 8000796: 687b ldr r3, [r7, #4] + 8000798: 805a strh r2, [r3, #2] + module->cellVoltages[2] = rxbuffer[4] | (rxbuffer[5]<<8); + 800079a: 7b3b ldrb r3, [r7, #12] + 800079c: b21a sxth r2, r3 + 800079e: 7b7b ldrb r3, [r7, #13] + 80007a0: 021b lsls r3, r3, #8 + 80007a2: b21b sxth r3, r3 + 80007a4: 4313 orrs r3, r2 + 80007a6: b21b sxth r3, r3 + 80007a8: b29a uxth r2, r3 + 80007aa: 687b ldr r3, [r7, #4] + 80007ac: 809a strh r2, [r3, #4] + + readCMD(RDCVB, rxbuffer, CV_GROUP_A_SIZE); + 80007ae: f107 0308 add.w r3, r7, #8 + 80007b2: 2206 movs r2, #6 + 80007b4: 4619 mov r1, r3 + 80007b6: 2006 movs r0, #6 + 80007b8: f000 fae4 bl 8000d84 + module->cellVoltages[3] = rxbuffer[0] | (rxbuffer[1]<<8); + 80007bc: 7a3b ldrb r3, [r7, #8] + 80007be: b21a sxth r2, r3 + 80007c0: 7a7b ldrb r3, [r7, #9] + 80007c2: 021b lsls r3, r3, #8 + 80007c4: b21b sxth r3, r3 + 80007c6: 4313 orrs r3, r2 + 80007c8: b21b sxth r3, r3 + 80007ca: b29a uxth r2, r3 + 80007cc: 687b ldr r3, [r7, #4] + 80007ce: 80da strh r2, [r3, #6] + module->cellVoltages[4] = rxbuffer[2] | (rxbuffer[3]<<8); + 80007d0: 7abb ldrb r3, [r7, #10] + 80007d2: b21a sxth r2, r3 + 80007d4: 7afb ldrb r3, [r7, #11] + 80007d6: 021b lsls r3, r3, #8 + 80007d8: b21b sxth r3, r3 + 80007da: 4313 orrs r3, r2 + 80007dc: b21b sxth r3, r3 + 80007de: b29a uxth r2, r3 + 80007e0: 687b ldr r3, [r7, #4] + 80007e2: 811a strh r2, [r3, #8] + module->cellVoltages[5] = rxbuffer[4] | (rxbuffer[5]<<8); + 80007e4: 7b3b ldrb r3, [r7, #12] + 80007e6: b21a sxth r2, r3 + 80007e8: 7b7b ldrb r3, [r7, #13] + 80007ea: 021b lsls r3, r3, #8 + 80007ec: b21b sxth r3, r3 + 80007ee: 4313 orrs r3, r2 + 80007f0: b21b sxth r3, r3 + 80007f2: b29a uxth r2, r3 + 80007f4: 687b ldr r3, [r7, #4] + 80007f6: 815a strh r2, [r3, #10] + + readCMD(RDCVC, rxbuffer, CV_GROUP_A_SIZE); + 80007f8: f107 0308 add.w r3, r7, #8 + 80007fc: 2206 movs r2, #6 + 80007fe: 4619 mov r1, r3 + 8000800: 2008 movs r0, #8 + 8000802: f000 fabf bl 8000d84 + module->cellVoltages[6] = rxbuffer[0] | (rxbuffer[1]<<8); + 8000806: 7a3b ldrb r3, [r7, #8] + 8000808: b21a sxth r2, r3 + 800080a: 7a7b ldrb r3, [r7, #9] + 800080c: 021b lsls r3, r3, #8 + 800080e: b21b sxth r3, r3 + 8000810: 4313 orrs r3, r2 + 8000812: b21b sxth r3, r3 + 8000814: b29a uxth r2, r3 + 8000816: 687b ldr r3, [r7, #4] + 8000818: 819a strh r2, [r3, #12] + module->cellVoltages[7] = rxbuffer[2] | (rxbuffer[3]<<8); + 800081a: 7abb ldrb r3, [r7, #10] + 800081c: b21a sxth r2, r3 + 800081e: 7afb ldrb r3, [r7, #11] + 8000820: 021b lsls r3, r3, #8 + 8000822: b21b sxth r3, r3 + 8000824: 4313 orrs r3, r2 + 8000826: b21b sxth r3, r3 + 8000828: b29a uxth r2, r3 + 800082a: 687b ldr r3, [r7, #4] + 800082c: 81da strh r2, [r3, #14] + module->cellVoltages[8] = rxbuffer[4] | (rxbuffer[5]<<8); + 800082e: 7b3b ldrb r3, [r7, #12] + 8000830: b21a sxth r2, r3 + 8000832: 7b7b ldrb r3, [r7, #13] + 8000834: 021b lsls r3, r3, #8 + 8000836: b21b sxth r3, r3 + 8000838: 4313 orrs r3, r2 + 800083a: b21b sxth r3, r3 + 800083c: b29a uxth r2, r3 + 800083e: 687b ldr r3, [r7, #4] + 8000840: 821a strh r2, [r3, #16] + + readCMD(RDCVD, rxbuffer, CV_GROUP_A_SIZE); + 8000842: f107 0308 add.w r3, r7, #8 + 8000846: 2206 movs r2, #6 + 8000848: 4619 mov r1, r3 + 800084a: 200a movs r0, #10 + 800084c: f000 fa9a bl 8000d84 + module->cellVoltages[9] = rxbuffer[0] | (rxbuffer[1]<<8); + 8000850: 7a3b ldrb r3, [r7, #8] + 8000852: b21a sxth r2, r3 + 8000854: 7a7b ldrb r3, [r7, #9] + 8000856: 021b lsls r3, r3, #8 + 8000858: b21b sxth r3, r3 + 800085a: 4313 orrs r3, r2 + 800085c: b21b sxth r3, r3 + 800085e: b29a uxth r2, r3 + 8000860: 687b ldr r3, [r7, #4] + 8000862: 825a strh r2, [r3, #18] + module->cellVoltages[10] = rxbuffer[2] | (rxbuffer[3]<<8); + 8000864: 7abb ldrb r3, [r7, #10] + 8000866: b21a sxth r2, r3 + 8000868: 7afb ldrb r3, [r7, #11] + 800086a: 021b lsls r3, r3, #8 + 800086c: b21b sxth r3, r3 + 800086e: 4313 orrs r3, r2 + 8000870: b21b sxth r3, r3 + 8000872: b29a uxth r2, r3 + 8000874: 687b ldr r3, [r7, #4] + 8000876: 829a strh r2, [r3, #20] + module->cellVoltages[11] = rxbuffer[4] | (rxbuffer[5]<<8); + 8000878: 7b3b ldrb r3, [r7, #12] + 800087a: b21a sxth r2, r3 + 800087c: 7b7b ldrb r3, [r7, #13] + 800087e: 021b lsls r3, r3, #8 + 8000880: b21b sxth r3, r3 + 8000882: 4313 orrs r3, r2 + 8000884: b21b sxth r3, r3 + 8000886: b29a uxth r2, r3 + 8000888: 687b ldr r3, [r7, #4] + 800088a: 82da strh r2, [r3, #22] + + readCMD(RDCVE, rxbuffer, CV_GROUP_A_SIZE); + 800088c: f107 0308 add.w r3, r7, #8 + 8000890: 2206 movs r2, #6 + 8000892: 4619 mov r1, r3 + 8000894: 2009 movs r0, #9 + 8000896: f000 fa75 bl 8000d84 + module->cellVoltages[12] = rxbuffer[0] | (rxbuffer[1]<<8); + 800089a: 7a3b ldrb r3, [r7, #8] + 800089c: b21a sxth r2, r3 + 800089e: 7a7b ldrb r3, [r7, #9] + 80008a0: 021b lsls r3, r3, #8 + 80008a2: b21b sxth r3, r3 + 80008a4: 4313 orrs r3, r2 + 80008a6: b21b sxth r3, r3 + 80008a8: b29a uxth r2, r3 + 80008aa: 687b ldr r3, [r7, #4] + 80008ac: 831a strh r2, [r3, #24] + module->cellVoltages[13] = rxbuffer[2] | (rxbuffer[3]<<8); + 80008ae: 7abb ldrb r3, [r7, #10] + 80008b0: b21a sxth r2, r3 + 80008b2: 7afb ldrb r3, [r7, #11] + 80008b4: 021b lsls r3, r3, #8 + 80008b6: b21b sxth r3, r3 + 80008b8: 4313 orrs r3, r2 + 80008ba: b21b sxth r3, r3 + 80008bc: b29a uxth r2, r3 + 80008be: 687b ldr r3, [r7, #4] + 80008c0: 835a strh r2, [r3, #26] + module->cellVoltages[14] = rxbuffer[4] | (rxbuffer[5]<<8); + 80008c2: 7b3b ldrb r3, [r7, #12] + 80008c4: b21a sxth r2, r3 + 80008c6: 7b7b ldrb r3, [r7, #13] + 80008c8: 021b lsls r3, r3, #8 + 80008ca: b21b sxth r3, r3 + 80008cc: 4313 orrs r3, r2 + 80008ce: b21b sxth r3, r3 + 80008d0: b29a uxth r2, r3 + 80008d2: 687b ldr r3, [r7, #4] + 80008d4: 839a strh r2, [r3, #28] + + readCMD(RDCVF, rxbuffer, CV_GROUP_A_SIZE); + 80008d6: f107 0308 add.w r3, r7, #8 + 80008da: 2206 movs r2, #6 + 80008dc: 4619 mov r1, r3 + 80008de: 200b movs r0, #11 + 80008e0: f000 fa50 bl 8000d84 + module->cellVoltages[15] = rxbuffer[0] | (rxbuffer[1]<<8); + 80008e4: 7a3b ldrb r3, [r7, #8] + 80008e6: b21a sxth r2, r3 + 80008e8: 7a7b ldrb r3, [r7, #9] + 80008ea: 021b lsls r3, r3, #8 + 80008ec: b21b sxth r3, r3 + 80008ee: 4313 orrs r3, r2 + 80008f0: b21b sxth r3, r3 + 80008f2: b29a uxth r2, r3 + 80008f4: 687b ldr r3, [r7, #4] + 80008f6: 83da strh r2, [r3, #30] + module->cellVoltages[16] = rxbuffer[2] | (rxbuffer[3]<<8); + 80008f8: 7abb ldrb r3, [r7, #10] + 80008fa: b21a sxth r2, r3 + 80008fc: 7afb ldrb r3, [r7, #11] + 80008fe: 021b lsls r3, r3, #8 + 8000900: b21b sxth r3, r3 + 8000902: 4313 orrs r3, r2 + 8000904: b21b sxth r3, r3 + 8000906: b29a uxth r2, r3 + 8000908: 687b ldr r3, [r7, #4] + 800090a: 841a strh r2, [r3, #32] + module->cellVoltages[17] = rxbuffer[4] | (rxbuffer[5]<<8); + 800090c: 7b3b ldrb r3, [r7, #12] + 800090e: b21a sxth r2, r3 + 8000910: 7b7b ldrb r3, [r7, #13] + 8000912: 021b lsls r3, r3, #8 + 8000914: b21b sxth r3, r3 + 8000916: 4313 orrs r3, r2 + 8000918: b21b sxth r3, r3 + 800091a: b29a uxth r2, r3 + 800091c: 687b ldr r3, [r7, #4] + 800091e: 845a strh r2, [r3, #34] ; 0x22 + + return 0; + 8000920: 2300 movs r3, #0 +} + 8000922: 4618 mov r0, r3 + 8000924: 3710 adds r7, #16 + 8000926: 46bd mov sp, r7 + 8000928: bd80 pop {r7, pc} + ... + +0800092c : +#define ADBMS_SPI_TIMEOUT 1000 //Timeout in ms + +SPI_HandleTypeDef* adbmsspi; + +uint8 adbmsDriverInit(SPI_HandleTypeDef* hspi) +{ + 800092c: b580 push {r7, lr} + 800092e: b082 sub sp, #8 + 8000930: af00 add r7, sp, #0 + 8000932: 6078 str r0, [r7, #4] + mcuAdbmsCSLow(); + 8000934: f000 fad8 bl 8000ee8 + HAL_Delay(1); + 8000938: 2001 movs r0, #1 + 800093a: f001 fc9f bl 800227c + mcuAdbmsCSHigh(); + 800093e: f000 fadd bl 8000efc + adbmsspi = hspi; + 8000942: 4a04 ldr r2, [pc, #16] ; (8000954 ) + 8000944: 687b ldr r3, [r7, #4] + 8000946: 6013 str r3, [r2, #0] + return 0; + 8000948: 2300 movs r3, #0 +} + 800094a: 4618 mov r0, r3 + 800094c: 3708 adds r7, #8 + 800094e: 46bd mov sp, r7 + 8000950: bd80 pop {r7, pc} + 8000952: bf00 nop + 8000954: 20000038 .word 0x20000038 + +08000958 : + +uint8 calculatePEC(uint8_t* data, uint8_t datalen) +{ + 8000958: b580 push {r7, lr} + 800095a: b086 sub sp, #24 + 800095c: af00 add r7, sp, #0 + 800095e: 6078 str r0, [r7, #4] + 8000960: 460b mov r3, r1 + 8000962: 70fb strb r3, [r7, #3] + uint16 currentpec = INITAL_PEC; + 8000964: 2310 movs r3, #16 + 8000966: 82fb strh r3, [r7, #22] + if(datalen >= 3) + 8000968: 78fb ldrb r3, [r7, #3] + 800096a: 2b02 cmp r3, #2 + 800096c: d937 bls.n 80009de + { + for(int i = 0; i < (datalen-2); i++) + 800096e: 2300 movs r3, #0 + 8000970: 613b str r3, [r7, #16] + 8000972: e01c b.n 80009ae + { + for(int n = 0; n < 8;n++) + 8000974: 2300 movs r3, #0 + 8000976: 60fb str r3, [r7, #12] + 8000978: e013 b.n 80009a2 + { + uint8 din = data[i] << (n); + 800097a: 693b ldr r3, [r7, #16] + 800097c: 687a ldr r2, [r7, #4] + 800097e: 4413 add r3, r2 + 8000980: 781b ldrb r3, [r3, #0] + 8000982: 461a mov r2, r3 + 8000984: 68fb ldr r3, [r7, #12] + 8000986: fa02 f303 lsl.w r3, r2, r3 + 800098a: 72fb strb r3, [r7, #11] + currentpec = updatePEC(currentpec, din); + 800098c: 7afa ldrb r2, [r7, #11] + 800098e: 8afb ldrh r3, [r7, #22] + 8000990: 4611 mov r1, r2 + 8000992: 4618 mov r0, r3 + 8000994: f000 f878 bl 8000a88 + 8000998: 4603 mov r3, r0 + 800099a: 82fb strh r3, [r7, #22] + for(int n = 0; n < 8;n++) + 800099c: 68fb ldr r3, [r7, #12] + 800099e: 3301 adds r3, #1 + 80009a0: 60fb str r3, [r7, #12] + 80009a2: 68fb ldr r3, [r7, #12] + 80009a4: 2b07 cmp r3, #7 + 80009a6: dde8 ble.n 800097a + for(int i = 0; i < (datalen-2); i++) + 80009a8: 693b ldr r3, [r7, #16] + 80009aa: 3301 adds r3, #1 + 80009ac: 613b str r3, [r7, #16] + 80009ae: 78fb ldrb r3, [r7, #3] + 80009b0: 3b02 subs r3, #2 + 80009b2: 693a ldr r2, [r7, #16] + 80009b4: 429a cmp r2, r3 + 80009b6: dbdd blt.n 8000974 + } + } + + data[datalen-2] = (currentpec>>7) & 0xFF; + 80009b8: 8afb ldrh r3, [r7, #22] + 80009ba: 09db lsrs r3, r3, #7 + 80009bc: b299 uxth r1, r3 + 80009be: 78fb ldrb r3, [r7, #3] + 80009c0: 3b02 subs r3, #2 + 80009c2: 687a ldr r2, [r7, #4] + 80009c4: 4413 add r3, r2 + 80009c6: b2ca uxtb r2, r1 + 80009c8: 701a strb r2, [r3, #0] + data[datalen-1] = (currentpec<<1) & 0xFF; + 80009ca: 8afb ldrh r3, [r7, #22] + 80009cc: 0059 lsls r1, r3, #1 + 80009ce: 78fb ldrb r3, [r7, #3] + 80009d0: 3b01 subs r3, #1 + 80009d2: 687a ldr r2, [r7, #4] + 80009d4: 4413 add r3, r2 + 80009d6: b2ca uxtb r2, r1 + 80009d8: 701a strb r2, [r3, #0] + return 0; + 80009da: 2300 movs r3, #0 + 80009dc: e000 b.n 80009e0 + } + + else + { + return 1; + 80009de: 2301 movs r3, #1 + } +} + 80009e0: 4618 mov r0, r3 + 80009e2: 3718 adds r7, #24 + 80009e4: 46bd mov sp, r7 + 80009e6: bd80 pop {r7, pc} + +080009e8 : + +uint8 checkPEC(uint8* data, uint8 datalen) +{ + 80009e8: b580 push {r7, lr} + 80009ea: b086 sub sp, #24 + 80009ec: af00 add r7, sp, #0 + 80009ee: 6078 str r0, [r7, #4] + 80009f0: 460b mov r3, r1 + 80009f2: 70fb strb r3, [r7, #3] + if(datalen <= 3) + 80009f4: 78fb ldrb r3, [r7, #3] + 80009f6: 2b03 cmp r3, #3 + 80009f8: d801 bhi.n 80009fe + { + return 255; + 80009fa: 23ff movs r3, #255 ; 0xff + 80009fc: e040 b.n 8000a80 + } + + uint16 currentpec = INITAL_PEC; + 80009fe: 2310 movs r3, #16 + 8000a00: 82fb strh r3, [r7, #22] + + for(int i = 0; i < (datalen-2); i++) + 8000a02: 2300 movs r3, #0 + 8000a04: 613b str r3, [r7, #16] + 8000a06: e01c b.n 8000a42 + { + for(int n = 0; n < 8;n++) + 8000a08: 2300 movs r3, #0 + 8000a0a: 60fb str r3, [r7, #12] + 8000a0c: e013 b.n 8000a36 + { + uint8 din = data[i] << (n); + 8000a0e: 693b ldr r3, [r7, #16] + 8000a10: 687a ldr r2, [r7, #4] + 8000a12: 4413 add r3, r2 + 8000a14: 781b ldrb r3, [r3, #0] + 8000a16: 461a mov r2, r3 + 8000a18: 68fb ldr r3, [r7, #12] + 8000a1a: fa02 f303 lsl.w r3, r2, r3 + 8000a1e: 727b strb r3, [r7, #9] + currentpec = updatePEC(currentpec, din); + 8000a20: 7a7a ldrb r2, [r7, #9] + 8000a22: 8afb ldrh r3, [r7, #22] + 8000a24: 4611 mov r1, r2 + 8000a26: 4618 mov r0, r3 + 8000a28: f000 f82e bl 8000a88 + 8000a2c: 4603 mov r3, r0 + 8000a2e: 82fb strh r3, [r7, #22] + for(int n = 0; n < 8;n++) + 8000a30: 68fb ldr r3, [r7, #12] + 8000a32: 3301 adds r3, #1 + 8000a34: 60fb str r3, [r7, #12] + 8000a36: 68fb ldr r3, [r7, #12] + 8000a38: 2b07 cmp r3, #7 + 8000a3a: dde8 ble.n 8000a0e + for(int i = 0; i < (datalen-2); i++) + 8000a3c: 693b ldr r3, [r7, #16] + 8000a3e: 3301 adds r3, #1 + 8000a40: 613b str r3, [r7, #16] + 8000a42: 78fb ldrb r3, [r7, #3] + 8000a44: 3b02 subs r3, #2 + 8000a46: 693a ldr r2, [r7, #16] + 8000a48: 429a cmp r2, r3 + 8000a4a: dbdd blt.n 8000a08 + } + } + + uint8 pechigh = (currentpec>>7) & 0xFF; + 8000a4c: 8afb ldrh r3, [r7, #22] + 8000a4e: 09db lsrs r3, r3, #7 + 8000a50: b29b uxth r3, r3 + 8000a52: 72fb strb r3, [r7, #11] + uint8 peclow = (currentpec<<1) & 0xFF; + 8000a54: 8afb ldrh r3, [r7, #22] + 8000a56: 005b lsls r3, r3, #1 + 8000a58: 72bb strb r3, [r7, #10] + + if((pechigh == data[datalen-2]) && (peclow == data[datalen-1])) + 8000a5a: 78fb ldrb r3, [r7, #3] + 8000a5c: 3b02 subs r3, #2 + 8000a5e: 687a ldr r2, [r7, #4] + 8000a60: 4413 add r3, r2 + 8000a62: 781b ldrb r3, [r3, #0] + 8000a64: 7afa ldrb r2, [r7, #11] + 8000a66: 429a cmp r2, r3 + 8000a68: d109 bne.n 8000a7e + 8000a6a: 78fb ldrb r3, [r7, #3] + 8000a6c: 3b01 subs r3, #1 + 8000a6e: 687a ldr r2, [r7, #4] + 8000a70: 4413 add r3, r2 + 8000a72: 781b ldrb r3, [r3, #0] + 8000a74: 7aba ldrb r2, [r7, #10] + 8000a76: 429a cmp r2, r3 + 8000a78: d101 bne.n 8000a7e + { + return 0; + 8000a7a: 2300 movs r3, #0 + 8000a7c: e000 b.n 8000a80 + } + + return 1; + 8000a7e: 2301 movs r3, #1 + +} + 8000a80: 4618 mov r0, r3 + 8000a82: 3718 adds r7, #24 + 8000a84: 46bd mov sp, r7 + 8000a86: bd80 pop {r7, pc} + +08000a88 : + +uint16 updatePEC(uint16 currentPEC, uint8 din) +{ + 8000a88: b480 push {r7} + 8000a8a: b087 sub sp, #28 + 8000a8c: af00 add r7, sp, #0 + 8000a8e: 4603 mov r3, r0 + 8000a90: 460a mov r2, r1 + 8000a92: 80fb strh r3, [r7, #6] + 8000a94: 4613 mov r3, r2 + 8000a96: 717b strb r3, [r7, #5] + din = (din>>7) & 0x01; + 8000a98: 797b ldrb r3, [r7, #5] + 8000a9a: 09db lsrs r3, r3, #7 + 8000a9c: 717b strb r3, [r7, #5] + uint8 in0 = din ^ ((currentPEC >> 14) &0x01); + 8000a9e: 88fb ldrh r3, [r7, #6] + 8000aa0: 0b9b lsrs r3, r3, #14 + 8000aa2: b29b uxth r3, r3 + 8000aa4: b25b sxtb r3, r3 + 8000aa6: f003 0301 and.w r3, r3, #1 + 8000aaa: b25a sxtb r2, r3 + 8000aac: f997 3005 ldrsb.w r3, [r7, #5] + 8000ab0: 4053 eors r3, r2 + 8000ab2: b25b sxtb r3, r3 + 8000ab4: 75fb strb r3, [r7, #23] + uint8 in3 = in0 ^ ((currentPEC >> 2) &0x01); + 8000ab6: 88fb ldrh r3, [r7, #6] + 8000ab8: 089b lsrs r3, r3, #2 + 8000aba: b29b uxth r3, r3 + 8000abc: b25b sxtb r3, r3 + 8000abe: f003 0301 and.w r3, r3, #1 + 8000ac2: b25a sxtb r2, r3 + 8000ac4: f997 3017 ldrsb.w r3, [r7, #23] + 8000ac8: 4053 eors r3, r2 + 8000aca: b25b sxtb r3, r3 + 8000acc: 75bb strb r3, [r7, #22] + uint8 in4 = in0 ^ ((currentPEC >> 3) &0x01); + 8000ace: 88fb ldrh r3, [r7, #6] + 8000ad0: 08db lsrs r3, r3, #3 + 8000ad2: b29b uxth r3, r3 + 8000ad4: b25b sxtb r3, r3 + 8000ad6: f003 0301 and.w r3, r3, #1 + 8000ada: b25a sxtb r2, r3 + 8000adc: f997 3017 ldrsb.w r3, [r7, #23] + 8000ae0: 4053 eors r3, r2 + 8000ae2: b25b sxtb r3, r3 + 8000ae4: 757b strb r3, [r7, #21] + uint8 in7 = in0 ^ ((currentPEC >> 6) &0x01); + 8000ae6: 88fb ldrh r3, [r7, #6] + 8000ae8: 099b lsrs r3, r3, #6 + 8000aea: b29b uxth r3, r3 + 8000aec: b25b sxtb r3, r3 + 8000aee: f003 0301 and.w r3, r3, #1 + 8000af2: b25a sxtb r2, r3 + 8000af4: f997 3017 ldrsb.w r3, [r7, #23] + 8000af8: 4053 eors r3, r2 + 8000afa: b25b sxtb r3, r3 + 8000afc: 753b strb r3, [r7, #20] + uint8 in8 = in0 ^ ((currentPEC >> 7) &0x01); + 8000afe: 88fb ldrh r3, [r7, #6] + 8000b00: 09db lsrs r3, r3, #7 + 8000b02: b29b uxth r3, r3 + 8000b04: b25b sxtb r3, r3 + 8000b06: f003 0301 and.w r3, r3, #1 + 8000b0a: b25a sxtb r2, r3 + 8000b0c: f997 3017 ldrsb.w r3, [r7, #23] + 8000b10: 4053 eors r3, r2 + 8000b12: b25b sxtb r3, r3 + 8000b14: 74fb strb r3, [r7, #19] + uint8 in10 = in0 ^ ((currentPEC >> 9) &0x01); + 8000b16: 88fb ldrh r3, [r7, #6] + 8000b18: 0a5b lsrs r3, r3, #9 + 8000b1a: b29b uxth r3, r3 + 8000b1c: b25b sxtb r3, r3 + 8000b1e: f003 0301 and.w r3, r3, #1 + 8000b22: b25a sxtb r2, r3 + 8000b24: f997 3017 ldrsb.w r3, [r7, #23] + 8000b28: 4053 eors r3, r2 + 8000b2a: b25b sxtb r3, r3 + 8000b2c: 74bb strb r3, [r7, #18] + uint8 in14 = in0 ^ ((currentPEC >> 13) &0x01); + 8000b2e: 88fb ldrh r3, [r7, #6] + 8000b30: 0b5b lsrs r3, r3, #13 + 8000b32: b29b uxth r3, r3 + 8000b34: b25b sxtb r3, r3 + 8000b36: f003 0301 and.w r3, r3, #1 + 8000b3a: b25a sxtb r2, r3 + 8000b3c: f997 3017 ldrsb.w r3, [r7, #23] + 8000b40: 4053 eors r3, r2 + 8000b42: b25b sxtb r3, r3 + 8000b44: 747b strb r3, [r7, #17] + + uint16 newPEC = 0; + 8000b46: 2300 movs r3, #0 + 8000b48: 81fb strh r3, [r7, #14] + + newPEC |= in14<<14; + 8000b4a: 7c7b ldrb r3, [r7, #17] + 8000b4c: 039b lsls r3, r3, #14 + 8000b4e: b21a sxth r2, r3 + 8000b50: f9b7 300e ldrsh.w r3, [r7, #14] + 8000b54: 4313 orrs r3, r2 + 8000b56: b21b sxth r3, r3 + 8000b58: 81fb strh r3, [r7, #14] + newPEC |= (currentPEC & (0x01<<12))<<1; + 8000b5a: 88fb ldrh r3, [r7, #6] + 8000b5c: 005b lsls r3, r3, #1 + 8000b5e: b21b sxth r3, r3 + 8000b60: f403 5300 and.w r3, r3, #8192 ; 0x2000 + 8000b64: b21a sxth r2, r3 + 8000b66: f9b7 300e ldrsh.w r3, [r7, #14] + 8000b6a: 4313 orrs r3, r2 + 8000b6c: b21b sxth r3, r3 + 8000b6e: 81fb strh r3, [r7, #14] + newPEC |= (currentPEC & (0x01<<11))<<1; + 8000b70: 88fb ldrh r3, [r7, #6] + 8000b72: 005b lsls r3, r3, #1 + 8000b74: b21b sxth r3, r3 + 8000b76: f403 5380 and.w r3, r3, #4096 ; 0x1000 + 8000b7a: b21a sxth r2, r3 + 8000b7c: f9b7 300e ldrsh.w r3, [r7, #14] + 8000b80: 4313 orrs r3, r2 + 8000b82: b21b sxth r3, r3 + 8000b84: 81fb strh r3, [r7, #14] + newPEC |= (currentPEC & (0x01<<10))<<1; + 8000b86: 88fb ldrh r3, [r7, #6] + 8000b88: 005b lsls r3, r3, #1 + 8000b8a: b21b sxth r3, r3 + 8000b8c: f403 6300 and.w r3, r3, #2048 ; 0x800 + 8000b90: b21a sxth r2, r3 + 8000b92: f9b7 300e ldrsh.w r3, [r7, #14] + 8000b96: 4313 orrs r3, r2 + 8000b98: b21b sxth r3, r3 + 8000b9a: 81fb strh r3, [r7, #14] + newPEC |= in10<<10; + 8000b9c: 7cbb ldrb r3, [r7, #18] + 8000b9e: 029b lsls r3, r3, #10 + 8000ba0: b21a sxth r2, r3 + 8000ba2: f9b7 300e ldrsh.w r3, [r7, #14] + 8000ba6: 4313 orrs r3, r2 + 8000ba8: b21b sxth r3, r3 + 8000baa: 81fb strh r3, [r7, #14] + newPEC |= (currentPEC & (0x01<<8))<<1; + 8000bac: 88fb ldrh r3, [r7, #6] + 8000bae: 005b lsls r3, r3, #1 + 8000bb0: b21b sxth r3, r3 + 8000bb2: f403 7300 and.w r3, r3, #512 ; 0x200 + 8000bb6: b21a sxth r2, r3 + 8000bb8: f9b7 300e ldrsh.w r3, [r7, #14] + 8000bbc: 4313 orrs r3, r2 + 8000bbe: b21b sxth r3, r3 + 8000bc0: 81fb strh r3, [r7, #14] + newPEC |= in8<<8; + 8000bc2: 7cfb ldrb r3, [r7, #19] + 8000bc4: 021b lsls r3, r3, #8 + 8000bc6: b21a sxth r2, r3 + 8000bc8: f9b7 300e ldrsh.w r3, [r7, #14] + 8000bcc: 4313 orrs r3, r2 + 8000bce: b21b sxth r3, r3 + 8000bd0: 81fb strh r3, [r7, #14] + newPEC |= in7<<7; + 8000bd2: 7d3b ldrb r3, [r7, #20] + 8000bd4: 01db lsls r3, r3, #7 + 8000bd6: b21a sxth r2, r3 + 8000bd8: f9b7 300e ldrsh.w r3, [r7, #14] + 8000bdc: 4313 orrs r3, r2 + 8000bde: b21b sxth r3, r3 + 8000be0: 81fb strh r3, [r7, #14] + newPEC |= (currentPEC & (0x01<<5))<<1; + 8000be2: 88fb ldrh r3, [r7, #6] + 8000be4: 005b lsls r3, r3, #1 + 8000be6: b21b sxth r3, r3 + 8000be8: f003 0340 and.w r3, r3, #64 ; 0x40 + 8000bec: b21a sxth r2, r3 + 8000bee: f9b7 300e ldrsh.w r3, [r7, #14] + 8000bf2: 4313 orrs r3, r2 + 8000bf4: b21b sxth r3, r3 + 8000bf6: 81fb strh r3, [r7, #14] + newPEC |= (currentPEC & (0x01<<4))<<1; + 8000bf8: 88fb ldrh r3, [r7, #6] + 8000bfa: 005b lsls r3, r3, #1 + 8000bfc: b21b sxth r3, r3 + 8000bfe: f003 0320 and.w r3, r3, #32 + 8000c02: b21a sxth r2, r3 + 8000c04: f9b7 300e ldrsh.w r3, [r7, #14] + 8000c08: 4313 orrs r3, r2 + 8000c0a: b21b sxth r3, r3 + 8000c0c: 81fb strh r3, [r7, #14] + newPEC |= in4<<4; + 8000c0e: 7d7b ldrb r3, [r7, #21] + 8000c10: 011b lsls r3, r3, #4 + 8000c12: b21a sxth r2, r3 + 8000c14: f9b7 300e ldrsh.w r3, [r7, #14] + 8000c18: 4313 orrs r3, r2 + 8000c1a: b21b sxth r3, r3 + 8000c1c: 81fb strh r3, [r7, #14] + newPEC |= in3<<3; + 8000c1e: 7dbb ldrb r3, [r7, #22] + 8000c20: 00db lsls r3, r3, #3 + 8000c22: b21a sxth r2, r3 + 8000c24: f9b7 300e ldrsh.w r3, [r7, #14] + 8000c28: 4313 orrs r3, r2 + 8000c2a: b21b sxth r3, r3 + 8000c2c: 81fb strh r3, [r7, #14] + newPEC |= (currentPEC & (0x01<<1))<<1; + 8000c2e: 88fb ldrh r3, [r7, #6] + 8000c30: 005b lsls r3, r3, #1 + 8000c32: b21b sxth r3, r3 + 8000c34: f003 0304 and.w r3, r3, #4 + 8000c38: b21a sxth r2, r3 + 8000c3a: f9b7 300e ldrsh.w r3, [r7, #14] + 8000c3e: 4313 orrs r3, r2 + 8000c40: b21b sxth r3, r3 + 8000c42: 81fb strh r3, [r7, #14] + newPEC |= (currentPEC & (0x01))<<1; + 8000c44: 88fb ldrh r3, [r7, #6] + 8000c46: 005b lsls r3, r3, #1 + 8000c48: b21b sxth r3, r3 + 8000c4a: f003 0302 and.w r3, r3, #2 + 8000c4e: b21a sxth r2, r3 + 8000c50: f9b7 300e ldrsh.w r3, [r7, #14] + 8000c54: 4313 orrs r3, r2 + 8000c56: b21b sxth r3, r3 + 8000c58: 81fb strh r3, [r7, #14] + newPEC |= in0; + 8000c5a: 7dfb ldrb r3, [r7, #23] + 8000c5c: b29a uxth r2, r3 + 8000c5e: 89fb ldrh r3, [r7, #14] + 8000c60: 4313 orrs r3, r2 + 8000c62: 81fb strh r3, [r7, #14] + + + return newPEC; + 8000c64: 89fb ldrh r3, [r7, #14] +} + 8000c66: 4618 mov r0, r3 + 8000c68: 371c adds r7, #28 + 8000c6a: 46bd mov sp, r7 + 8000c6c: f85d 7b04 ldr.w r7, [sp], #4 + 8000c70: 4770 bx lr + +08000c72 : + +uint8 writeCMD(uint16 command, uint8* args, uint8 arglen) +{ + 8000c72: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr} + 8000c76: b087 sub sp, #28 + 8000c78: af00 add r7, sp, #0 + 8000c7a: 4603 mov r3, r0 + 8000c7c: 6039 str r1, [r7, #0] + 8000c7e: 80fb strh r3, [r7, #6] + 8000c80: 4613 mov r3, r2 + 8000c82: 717b strb r3, [r7, #5] + if(arglen > 0) + 8000c84: 797b ldrb r3, [r7, #5] + 8000c86: 2b00 cmp r3, #0 + 8000c88: d05e beq.n 8000d48 + { + 8000c8a: 466b mov r3, sp + 8000c8c: 461e mov r6, r3 + uint8 buffer[6+arglen]; + 8000c8e: 797b ldrb r3, [r7, #5] + 8000c90: 1d99 adds r1, r3, #6 + 8000c92: 1e4b subs r3, r1, #1 + 8000c94: 613b str r3, [r7, #16] + 8000c96: 460a mov r2, r1 + 8000c98: 2300 movs r3, #0 + 8000c9a: 4690 mov r8, r2 + 8000c9c: 4699 mov r9, r3 + 8000c9e: f04f 0200 mov.w r2, #0 + 8000ca2: f04f 0300 mov.w r3, #0 + 8000ca6: ea4f 03c9 mov.w r3, r9, lsl #3 + 8000caa: ea43 7358 orr.w r3, r3, r8, lsr #29 + 8000cae: ea4f 02c8 mov.w r2, r8, lsl #3 + 8000cb2: 460a mov r2, r1 + 8000cb4: 2300 movs r3, #0 + 8000cb6: 4614 mov r4, r2 + 8000cb8: 461d mov r5, r3 + 8000cba: f04f 0200 mov.w r2, #0 + 8000cbe: f04f 0300 mov.w r3, #0 + 8000cc2: 00eb lsls r3, r5, #3 + 8000cc4: ea43 7354 orr.w r3, r3, r4, lsr #29 + 8000cc8: 00e2 lsls r2, r4, #3 + 8000cca: 460b mov r3, r1 + 8000ccc: 3307 adds r3, #7 + 8000cce: 08db lsrs r3, r3, #3 + 8000cd0: 00db lsls r3, r3, #3 + 8000cd2: ebad 0d03 sub.w sp, sp, r3 + 8000cd6: 466b mov r3, sp + 8000cd8: 3300 adds r3, #0 + 8000cda: 60fb str r3, [r7, #12] + buffer[0] = (command >> 8) & 0xFF; + 8000cdc: 88fb ldrh r3, [r7, #6] + 8000cde: 0a1b lsrs r3, r3, #8 + 8000ce0: b29b uxth r3, r3 + 8000ce2: b2da uxtb r2, r3 + 8000ce4: 68fb ldr r3, [r7, #12] + 8000ce6: 701a strb r2, [r3, #0] + buffer[1] = (command) & 0xFF; + 8000ce8: 88fb ldrh r3, [r7, #6] + 8000cea: b2da uxtb r2, r3 + 8000cec: 68fb ldr r3, [r7, #12] + 8000cee: 705a strb r2, [r3, #1] + calculatePEC(buffer, 4); + 8000cf0: 2104 movs r1, #4 + 8000cf2: 68f8 ldr r0, [r7, #12] + 8000cf4: f7ff fe30 bl 8000958 + for(uint8 i = 0; i < arglen; i++) + 8000cf8: 2300 movs r3, #0 + 8000cfa: 75fb strb r3, [r7, #23] + 8000cfc: e00a b.n 8000d14 + { + buffer[4+i] = args[i]; + 8000cfe: 7dfb ldrb r3, [r7, #23] + 8000d00: 683a ldr r2, [r7, #0] + 8000d02: 441a add r2, r3 + 8000d04: 7dfb ldrb r3, [r7, #23] + 8000d06: 3304 adds r3, #4 + 8000d08: 7811 ldrb r1, [r2, #0] + 8000d0a: 68fa ldr r2, [r7, #12] + 8000d0c: 54d1 strb r1, [r2, r3] + for(uint8 i = 0; i < arglen; i++) + 8000d0e: 7dfb ldrb r3, [r7, #23] + 8000d10: 3301 adds r3, #1 + 8000d12: 75fb strb r3, [r7, #23] + 8000d14: 7dfa ldrb r2, [r7, #23] + 8000d16: 797b ldrb r3, [r7, #5] + 8000d18: 429a cmp r2, r3 + 8000d1a: d3f0 bcc.n 8000cfe + } + + calculatePEC(&buffer[4], arglen+2); //Calculate PEC of Data Part with offset of 4 Bytes for CMD and CMD PEC + 8000d1c: 68fb ldr r3, [r7, #12] + 8000d1e: 1d1a adds r2, r3, #4 + 8000d20: 797b ldrb r3, [r7, #5] + 8000d22: 3302 adds r3, #2 + 8000d24: b2db uxtb r3, r3 + 8000d26: 4619 mov r1, r3 + 8000d28: 4610 mov r0, r2 + 8000d2a: f7ff fe15 bl 8000958 + + mcuAdbmsCSLow(); + 8000d2e: f000 f8db bl 8000ee8 + mcuSPITransmit(buffer, 6+arglen); + 8000d32: 797b ldrb r3, [r7, #5] + 8000d34: 3306 adds r3, #6 + 8000d36: b2db uxtb r3, r3 + 8000d38: 4619 mov r1, r3 + 8000d3a: 68f8 ldr r0, [r7, #12] + 8000d3c: f000 f8e8 bl 8000f10 + mcuAdbmsCSHigh(); + 8000d40: f000 f8dc bl 8000efc + 8000d44: 46b5 mov sp, r6 + 8000d46: e017 b.n 8000d78 + + } + else + { + uint8 buffer[4]; + buffer[0] = (command >> 8) & 0xFF; + 8000d48: 88fb ldrh r3, [r7, #6] + 8000d4a: 0a1b lsrs r3, r3, #8 + 8000d4c: b29b uxth r3, r3 + 8000d4e: b2db uxtb r3, r3 + 8000d50: 723b strb r3, [r7, #8] + buffer[1] = (command) & 0xFF; + 8000d52: 88fb ldrh r3, [r7, #6] + 8000d54: b2db uxtb r3, r3 + 8000d56: 727b strb r3, [r7, #9] + calculatePEC(buffer, 4); + 8000d58: f107 0308 add.w r3, r7, #8 + 8000d5c: 2104 movs r1, #4 + 8000d5e: 4618 mov r0, r3 + 8000d60: f7ff fdfa bl 8000958 + + mcuAdbmsCSLow(); + 8000d64: f000 f8c0 bl 8000ee8 + + mcuSPITransmit(buffer, 4); + 8000d68: f107 0308 add.w r3, r7, #8 + 8000d6c: 2104 movs r1, #4 + 8000d6e: 4618 mov r0, r3 + 8000d70: f000 f8ce bl 8000f10 + + mcuAdbmsCSHigh(); + 8000d74: f000 f8c2 bl 8000efc + } + + return 0; + 8000d78: 2300 movs r3, #0 +} + 8000d7a: 4618 mov r0, r3 + 8000d7c: 371c adds r7, #28 + 8000d7e: 46bd mov sp, r7 + 8000d80: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc} + +08000d84 : + +uint8 readCMD(uint16 command, uint8* buffer, uint8 buflen) +{ + 8000d84: e92d 4ff0 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} + 8000d88: b08b sub sp, #44 ; 0x2c + 8000d8a: af00 add r7, sp, #0 + 8000d8c: 4603 mov r3, r0 + 8000d8e: 60b9 str r1, [r7, #8] + 8000d90: 81fb strh r3, [r7, #14] + 8000d92: 4613 mov r3, r2 + 8000d94: 737b strb r3, [r7, #13] + 8000d96: 466b mov r3, sp + 8000d98: 461e mov r6, r3 + //uint8* txbuffer = (uint8*) malloc(6+buflen); + //uint8* rxbuffer = (uint8*) malloc(6+buflen); + uint8 txbuffer[6+buflen]; + 8000d9a: 7b7b ldrb r3, [r7, #13] + 8000d9c: 1d99 adds r1, r3, #6 + 8000d9e: 1e4b subs r3, r1, #1 + 8000da0: 627b str r3, [r7, #36] ; 0x24 + 8000da2: 460a mov r2, r1 + 8000da4: 2300 movs r3, #0 + 8000da6: 603a str r2, [r7, #0] + 8000da8: 607b str r3, [r7, #4] + 8000daa: f04f 0200 mov.w r2, #0 + 8000dae: f04f 0300 mov.w r3, #0 + 8000db2: 6878 ldr r0, [r7, #4] + 8000db4: 00c3 lsls r3, r0, #3 + 8000db6: 6838 ldr r0, [r7, #0] + 8000db8: ea43 7350 orr.w r3, r3, r0, lsr #29 + 8000dbc: 6838 ldr r0, [r7, #0] + 8000dbe: 00c2 lsls r2, r0, #3 + 8000dc0: 460a mov r2, r1 + 8000dc2: 2300 movs r3, #0 + 8000dc4: 4692 mov sl, r2 + 8000dc6: 469b mov fp, r3 + 8000dc8: f04f 0200 mov.w r2, #0 + 8000dcc: f04f 0300 mov.w r3, #0 + 8000dd0: ea4f 03cb mov.w r3, fp, lsl #3 + 8000dd4: ea43 735a orr.w r3, r3, sl, lsr #29 + 8000dd8: ea4f 02ca mov.w r2, sl, lsl #3 + 8000ddc: 460b mov r3, r1 + 8000dde: 3307 adds r3, #7 + 8000de0: 08db lsrs r3, r3, #3 + 8000de2: 00db lsls r3, r3, #3 + 8000de4: ebad 0d03 sub.w sp, sp, r3 + 8000de8: 466b mov r3, sp + 8000dea: 3300 adds r3, #0 + 8000dec: 61fb str r3, [r7, #28] + uint8 rxbuffer[6+buflen]; + 8000dee: 7b7b ldrb r3, [r7, #13] + 8000df0: 1d99 adds r1, r3, #6 + 8000df2: 1e4b subs r3, r1, #1 + 8000df4: 61bb str r3, [r7, #24] + 8000df6: 460a mov r2, r1 + 8000df8: 2300 movs r3, #0 + 8000dfa: 4690 mov r8, r2 + 8000dfc: 4699 mov r9, r3 + 8000dfe: f04f 0200 mov.w r2, #0 + 8000e02: f04f 0300 mov.w r3, #0 + 8000e06: ea4f 03c9 mov.w r3, r9, lsl #3 + 8000e0a: ea43 7358 orr.w r3, r3, r8, lsr #29 + 8000e0e: ea4f 02c8 mov.w r2, r8, lsl #3 + 8000e12: 460a mov r2, r1 + 8000e14: 2300 movs r3, #0 + 8000e16: 4614 mov r4, r2 + 8000e18: 461d mov r5, r3 + 8000e1a: f04f 0200 mov.w r2, #0 + 8000e1e: f04f 0300 mov.w r3, #0 + 8000e22: 00eb lsls r3, r5, #3 + 8000e24: ea43 7354 orr.w r3, r3, r4, lsr #29 + 8000e28: 00e2 lsls r2, r4, #3 + 8000e2a: 460b mov r3, r1 + 8000e2c: 3307 adds r3, #7 + 8000e2e: 08db lsrs r3, r3, #3 + 8000e30: 00db lsls r3, r3, #3 + 8000e32: ebad 0d03 sub.w sp, sp, r3 + 8000e36: 466b mov r3, sp + 8000e38: 3300 adds r3, #0 + 8000e3a: 617b str r3, [r7, #20] + + txbuffer[0] = (command >> 8) & 0xFF; + 8000e3c: 89fb ldrh r3, [r7, #14] + 8000e3e: 0a1b lsrs r3, r3, #8 + 8000e40: b29b uxth r3, r3 + 8000e42: b2da uxtb r2, r3 + 8000e44: 69fb ldr r3, [r7, #28] + 8000e46: 701a strb r2, [r3, #0] + txbuffer[1] = (command) & 0xFF; + 8000e48: 89fb ldrh r3, [r7, #14] + 8000e4a: b2da uxtb r2, r3 + 8000e4c: 69fb ldr r3, [r7, #28] + 8000e4e: 705a strb r2, [r3, #1] + calculatePEC(txbuffer, 4); + 8000e50: 2104 movs r1, #4 + 8000e52: 69f8 ldr r0, [r7, #28] + 8000e54: f7ff fd80 bl 8000958 + + mcuAdbmsCSLow(); + 8000e58: f000 f846 bl 8000ee8 + mcuSPITransmitReceive(rxbuffer, txbuffer, 6+buflen); + 8000e5c: 7b7b ldrb r3, [r7, #13] + 8000e5e: 3306 adds r3, #6 + 8000e60: b2db uxtb r3, r3 + 8000e62: 461a mov r2, r3 + 8000e64: 69f9 ldr r1, [r7, #28] + 8000e66: 6978 ldr r0, [r7, #20] + 8000e68: f000 f8a6 bl 8000fb8 + mcuAdbmsCSHigh(); + 8000e6c: f000 f846 bl 8000efc + + + for(uint8 i = 0; i + { + buffer[i] = rxbuffer[i+4]; + 8000e78: f897 3023 ldrb.w r3, [r7, #35] ; 0x23 + 8000e7c: 1d1a adds r2, r3, #4 + 8000e7e: f897 3023 ldrb.w r3, [r7, #35] ; 0x23 + 8000e82: 68b9 ldr r1, [r7, #8] + 8000e84: 440b add r3, r1 + 8000e86: 6979 ldr r1, [r7, #20] + 8000e88: 5c8a ldrb r2, [r1, r2] + 8000e8a: 701a strb r2, [r3, #0] + for(uint8 i = 0; i + } + + uint8 peccheck = checkPEC(&rxbuffer[4], buflen+2); + 8000ea0: 697b ldr r3, [r7, #20] + 8000ea2: 1d1a adds r2, r3, #4 + 8000ea4: 7b7b ldrb r3, [r7, #13] + 8000ea6: 3302 adds r3, #2 + 8000ea8: b2db uxtb r3, r3 + 8000eaa: 4619 mov r1, r3 + 8000eac: 4610 mov r0, r2 + 8000eae: f7ff fd9b bl 80009e8 + 8000eb2: 4603 mov r3, r0 + 8000eb4: 74fb strb r3, [r7, #19] + + //free(txbuffer); + //free(rxbuffer); + + if(peccheck == 0) + 8000eb6: 7cfb ldrb r3, [r7, #19] + 8000eb8: 2b00 cmp r3, #0 + 8000eba: d101 bne.n 8000ec0 + return 0; + 8000ebc: 2300 movs r3, #0 + 8000ebe: e00b b.n 8000ed8 + else + { + static int err_cnt = 0; + if (err_cnt++ > 100) { + 8000ec0: 4b08 ldr r3, [pc, #32] ; (8000ee4 ) + 8000ec2: 681b ldr r3, [r3, #0] + 8000ec4: 1c5a adds r2, r3, #1 + 8000ec6: 4907 ldr r1, [pc, #28] ; (8000ee4 ) + 8000ec8: 600a str r2, [r1, #0] + 8000eca: 2b64 cmp r3, #100 ; 0x64 + 8000ecc: dd03 ble.n 8000ed6 + Error_Handler(); + 8000ece: f000 ffb3 bl 8001e38 + 8000ed2: 46b5 mov sp, r6 + } else { + return 1; + } + } + +} + 8000ed4: e001 b.n 8000eda + return 1; + 8000ed6: 2301 movs r3, #1 + 8000ed8: 46b5 mov sp, r6 +} + 8000eda: 4618 mov r0, r3 + 8000edc: 372c adds r7, #44 ; 0x2c + 8000ede: 46bd mov sp, r7 + 8000ee0: e8bd 8ff0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, sl, fp, pc} + 8000ee4: 2000003c .word 0x2000003c + +08000ee8 : + +void mcuAdbmsCSLow() +{ + 8000ee8: b580 push {r7, lr} + 8000eea: af00 add r7, sp, #0 + HAL_GPIO_WritePin(CSB_GPIO_Port, CSB_Pin, GPIO_PIN_RESET); + 8000eec: 2200 movs r2, #0 + 8000eee: 2110 movs r1, #16 + 8000ef0: f04f 4090 mov.w r0, #1207959552 ; 0x48000000 + 8000ef4: f002 faf2 bl 80034dc +} + 8000ef8: bf00 nop + 8000efa: bd80 pop {r7, pc} + +08000efc : + +void mcuAdbmsCSHigh() +{ + 8000efc: b580 push {r7, lr} + 8000efe: af00 add r7, sp, #0 + HAL_GPIO_WritePin(CSB_GPIO_Port, CSB_Pin, GPIO_PIN_SET); + 8000f00: 2201 movs r2, #1 + 8000f02: 2110 movs r1, #16 + 8000f04: f04f 4090 mov.w r0, #1207959552 ; 0x48000000 + 8000f08: f002 fae8 bl 80034dc +} + 8000f0c: bf00 nop + 8000f0e: bd80 pop {r7, pc} + +08000f10 : + +uint8 mcuSPITransmit(uint8* buffer, uint8 buffersize) +{ + 8000f10: e92d 43f0 stmdb sp!, {r4, r5, r6, r7, r8, r9, lr} + 8000f14: b089 sub sp, #36 ; 0x24 + 8000f16: af02 add r7, sp, #8 + 8000f18: 6078 str r0, [r7, #4] + 8000f1a: 460b mov r3, r1 + 8000f1c: 70fb strb r3, [r7, #3] + 8000f1e: 466b mov r3, sp + 8000f20: 461e mov r6, r3 + HAL_StatusTypeDef status; + //status = HAL_SPI_Transmit(adbmsspi, buffer, buffersize, ADBMS_SPI_TIMEOUT); + //uint8 *rxbuf = (uint8*) malloc(buffersize); + uint8 rxbuf[buffersize]; + 8000f22: 78f9 ldrb r1, [r7, #3] + 8000f24: 460b mov r3, r1 + 8000f26: 3b01 subs r3, #1 + 8000f28: 617b str r3, [r7, #20] + 8000f2a: b2cb uxtb r3, r1 + 8000f2c: 2200 movs r2, #0 + 8000f2e: 4698 mov r8, r3 + 8000f30: 4691 mov r9, r2 + 8000f32: f04f 0200 mov.w r2, #0 + 8000f36: f04f 0300 mov.w r3, #0 + 8000f3a: ea4f 03c9 mov.w r3, r9, lsl #3 + 8000f3e: ea43 7358 orr.w r3, r3, r8, lsr #29 + 8000f42: ea4f 02c8 mov.w r2, r8, lsl #3 + 8000f46: b2cb uxtb r3, r1 + 8000f48: 2200 movs r2, #0 + 8000f4a: 461c mov r4, r3 + 8000f4c: 4615 mov r5, r2 + 8000f4e: f04f 0200 mov.w r2, #0 + 8000f52: f04f 0300 mov.w r3, #0 + 8000f56: 00eb lsls r3, r5, #3 + 8000f58: ea43 7354 orr.w r3, r3, r4, lsr #29 + 8000f5c: 00e2 lsls r2, r4, #3 + 8000f5e: 460b mov r3, r1 + 8000f60: 3307 adds r3, #7 + 8000f62: 08db lsrs r3, r3, #3 + 8000f64: 00db lsls r3, r3, #3 + 8000f66: ebad 0d03 sub.w sp, sp, r3 + 8000f6a: ab02 add r3, sp, #8 + 8000f6c: 3300 adds r3, #0 + 8000f6e: 613b str r3, [r7, #16] + status = HAL_SPI_TransmitReceive(adbmsspi, buffer, rxbuf, buffersize, ADBMS_SPI_TIMEOUT); + 8000f70: 4b10 ldr r3, [pc, #64] ; (8000fb4 ) + 8000f72: 6818 ldr r0, [r3, #0] + 8000f74: 78fb ldrb r3, [r7, #3] + 8000f76: b29b uxth r3, r3 + 8000f78: f44f 727a mov.w r2, #1000 ; 0x3e8 + 8000f7c: 9200 str r2, [sp, #0] + 8000f7e: 693a ldr r2, [r7, #16] + 8000f80: 6879 ldr r1, [r7, #4] + 8000f82: f004 fefe bl 8005d82 + 8000f86: 4603 mov r3, r0 + 8000f88: 73fb strb r3, [r7, #15] + __HAL_SPI_CLEAR_OVRFLAG(adbmsspi); + 8000f8a: 2300 movs r3, #0 + 8000f8c: 60bb str r3, [r7, #8] + 8000f8e: 4b09 ldr r3, [pc, #36] ; (8000fb4 ) + 8000f90: 681b ldr r3, [r3, #0] + 8000f92: 681b ldr r3, [r3, #0] + 8000f94: 68db ldr r3, [r3, #12] + 8000f96: 60bb str r3, [r7, #8] + 8000f98: 4b06 ldr r3, [pc, #24] ; (8000fb4 ) + 8000f9a: 681b ldr r3, [r3, #0] + 8000f9c: 681b ldr r3, [r3, #0] + 8000f9e: 689b ldr r3, [r3, #8] + 8000fa0: 60bb str r3, [r7, #8] + 8000fa2: 68bb ldr r3, [r7, #8] + //free(rxbuf); + return status; + 8000fa4: 7bfb ldrb r3, [r7, #15] + 8000fa6: 46b5 mov sp, r6 +} + 8000fa8: 4618 mov r0, r3 + 8000faa: 371c adds r7, #28 + 8000fac: 46bd mov sp, r7 + 8000fae: e8bd 83f0 ldmia.w sp!, {r4, r5, r6, r7, r8, r9, pc} + 8000fb2: bf00 nop + 8000fb4: 20000038 .word 0x20000038 + +08000fb8 : + status = HAL_SPI_Receive(adbmsspi, buffer, buffersize, ADBMS_SPI_TIMEOUT); + return status; +} + +uint8 mcuSPITransmitReceive(uint8* rxbuffer, uint8* txbuffer, uint8 buffersize) +{ + 8000fb8: b580 push {r7, lr} + 8000fba: b088 sub sp, #32 + 8000fbc: af02 add r7, sp, #8 + 8000fbe: 60f8 str r0, [r7, #12] + 8000fc0: 60b9 str r1, [r7, #8] + 8000fc2: 4613 mov r3, r2 + 8000fc4: 71fb strb r3, [r7, #7] + HAL_StatusTypeDef status; + status = HAL_SPI_TransmitReceive(adbmsspi, txbuffer, rxbuffer, buffersize, ADBMS_SPI_TIMEOUT); + 8000fc6: 4b09 ldr r3, [pc, #36] ; (8000fec ) + 8000fc8: 6818 ldr r0, [r3, #0] + 8000fca: 79fb ldrb r3, [r7, #7] + 8000fcc: b29b uxth r3, r3 + 8000fce: f44f 727a mov.w r2, #1000 ; 0x3e8 + 8000fd2: 9200 str r2, [sp, #0] + 8000fd4: 68fa ldr r2, [r7, #12] + 8000fd6: 68b9 ldr r1, [r7, #8] + 8000fd8: f004 fed3 bl 8005d82 + 8000fdc: 4603 mov r3, r0 + 8000fde: 75fb strb r3, [r7, #23] + return status; + 8000fe0: 7dfb ldrb r3, [r7, #23] +} + 8000fe2: 4618 mov r0, r3 + 8000fe4: 3718 adds r7, #24 + 8000fe6: 46bd mov sp, r7 + 8000fe8: bd80 pop {r7, pc} + 8000fea: bf00 nop + 8000fec: 20000038 .word 0x20000038 + +08000ff0 : + +inline void mcuDelay(uint16 delay) +{ + 8000ff0: b580 push {r7, lr} + 8000ff2: b082 sub sp, #8 + 8000ff4: af00 add r7, sp, #0 + 8000ff6: 4603 mov r3, r0 + 8000ff8: 80fb strh r3, [r7, #6] + HAL_Delay(delay); + 8000ffa: 88fb ldrh r3, [r7, #6] + 8000ffc: 4618 mov r0, r3 + 8000ffe: f001 f93d bl 800227c +} + 8001002: bf00 nop + 8001004: 3708 adds r7, #8 + 8001006: 46bd mov sp, r7 + 8001008: bd80 pop {r7, pc} + ... + +0800100c : + + +CAN_HandleTypeDef* ams_can_handle; + +void ams_can_init(CAN_HandleTypeDef* ams_handle, + CAN_HandleTypeDef* car_handle) { + 800100c: b580 push {r7, lr} + 800100e: b08c sub sp, #48 ; 0x30 + 8001010: af00 add r7, sp, #0 + 8001012: 6078 str r0, [r7, #4] + 8001014: 6039 str r1, [r7, #0] + ams_can_handle = ams_handle; + 8001016: 4a2e ldr r2, [pc, #184] ; (80010d0 ) + 8001018: 687b ldr r3, [r7, #4] + 800101a: 6013 str r3, [r2, #0] + + // Start peripheral + if (HAL_CAN_Start(ams_can_handle) != HAL_OK) { + 800101c: 4b2c ldr r3, [pc, #176] ; (80010d0 ) + 800101e: 681b ldr r3, [r3, #0] + 8001020: 4618 mov r0, r3 + 8001022: f001 fb14 bl 800264e + 8001026: 4603 mov r3, r0 + 8001028: 2b00 cmp r3, #0 + 800102a: d00c beq.n 8001046 + ams_can_handle = car_handle; + 800102c: 4a28 ldr r2, [pc, #160] ; (80010d0 ) + 800102e: 683b ldr r3, [r7, #0] + 8001030: 6013 str r3, [r2, #0] + if (HAL_CAN_Start(ams_can_handle) != HAL_OK) { + 8001032: 4b27 ldr r3, [pc, #156] ; (80010d0 ) + 8001034: 681b ldr r3, [r3, #0] + 8001036: 4618 mov r0, r3 + 8001038: f001 fb09 bl 800264e + 800103c: 4603 mov r3, r0 + 800103e: 2b00 cmp r3, #0 + 8001040: d001 beq.n 8001046 + Error_Handler(); + 8001042: f000 fef9 bl 8001e38 + } + } + + // Config filter + CAN_FilterTypeDef can_filter; + can_filter.FilterActivation = CAN_FILTER_ENABLE; + 8001046: 2301 movs r3, #1 + 8001048: 62bb str r3, [r7, #40] ; 0x28 + can_filter.FilterBank = 0; + 800104a: 2300 movs r3, #0 + 800104c: 61fb str r3, [r7, #28] + can_filter.FilterFIFOAssignment = CAN_FILTER_FIFO0; + 800104e: 2300 movs r3, #0 + 8001050: 61bb str r3, [r7, #24] + /* Message ID is in the MSBs of the FilterId register */ + can_filter.FilterIdHigh = CAN_ID_CLOCK_SYNC << (16 - 11); + 8001052: 2340 movs r3, #64 ; 0x40 + 8001054: 60bb str r3, [r7, #8] + can_filter.FilterIdLow = 0; + 8001056: 2300 movs r3, #0 + 8001058: 60fb str r3, [r7, #12] + /* Filter the 11 MSBs (i.e. a StdId) */ + + if(BMS_IN_TEST_MODE == 1){ + can_filter.FilterMaskIdHigh = BMS_TEST_ID; // alleNachrichtenIds werden akzeptiert + 800105a: 2300 movs r3, #0 + 800105c: 613b str r3, [r7, #16] + }else{ + can_filter.FilterMaskIdHigh = 0xFFE0; + } + + can_filter.FilterMaskIdLow = 0; + 800105e: 2300 movs r3, #0 + 8001060: 617b str r3, [r7, #20] + can_filter.FilterMode = CAN_FILTERMODE_IDMASK; + 8001062: 2300 movs r3, #0 + 8001064: 623b str r3, [r7, #32] + can_filter.FilterScale = CAN_FILTERSCALE_32BIT; + 8001066: 2301 movs r3, #1 + 8001068: 627b str r3, [r7, #36] ; 0x24 + can_filter.SlaveStartFilterBank = 0; + 800106a: 2300 movs r3, #0 + 800106c: 62fb str r3, [r7, #44] ; 0x2c + if (HAL_CAN_ConfigFilter(ams_can_handle, &can_filter) != HAL_OK) { + 800106e: 4b18 ldr r3, [pc, #96] ; (80010d0 ) + 8001070: 681b ldr r3, [r3, #0] + 8001072: f107 0208 add.w r2, r7, #8 + 8001076: 4611 mov r1, r2 + 8001078: 4618 mov r0, r3 + 800107a: f001 fa1e bl 80024ba + 800107e: 4603 mov r3, r0 + 8001080: 2b00 cmp r3, #0 + 8001082: d001 beq.n 8001088 + Error_Handler(); + 8001084: f000 fed8 bl 8001e38 + } + can_filter.FilterBank++; + 8001088: 69fb ldr r3, [r7, #28] + 800108a: 3301 adds r3, #1 + 800108c: 61fb str r3, [r7, #28] + can_filter.FilterIdHigh = CAN_ID_MASTER_HEARTBEAT << (16 - 11); + 800108e: f44f 7300 mov.w r3, #512 ; 0x200 + 8001092: 60bb str r3, [r7, #8] + can_filter.FilterIdLow = 0; + 8001094: 2300 movs r3, #0 + 8001096: 60fb str r3, [r7, #12] + if (HAL_CAN_ConfigFilter(ams_can_handle, &can_filter) != HAL_OK) { + 8001098: 4b0d ldr r3, [pc, #52] ; (80010d0 ) + 800109a: 681b ldr r3, [r3, #0] + 800109c: f107 0208 add.w r2, r7, #8 + 80010a0: 4611 mov r1, r2 + 80010a2: 4618 mov r0, r3 + 80010a4: f001 fa09 bl 80024ba + 80010a8: 4603 mov r3, r0 + 80010aa: 2b00 cmp r3, #0 + 80010ac: d001 beq.n 80010b2 + Error_Handler(); + 80010ae: f000 fec3 bl 8001e38 + } + + // Activate RX notifications + if (HAL_CAN_ActivateNotification(ams_can_handle, + 80010b2: 4b07 ldr r3, [pc, #28] ; (80010d0 ) + 80010b4: 681b ldr r3, [r3, #0] + 80010b6: 2102 movs r1, #2 + 80010b8: 4618 mov r0, r3 + 80010ba: f001 fd2e bl 8002b1a + 80010be: 4603 mov r3, r0 + 80010c0: 2b00 cmp r3, #0 + 80010c2: d001 beq.n 80010c8 + CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK) { + Error_Handler(); + 80010c4: f000 feb8 bl 8001e38 + } +} + 80010c8: bf00 nop + 80010ca: 3730 adds r7, #48 ; 0x30 + 80010cc: 46bd mov sp, r7 + 80010ce: bd80 pop {r7, pc} + 80010d0: 2000004c .word 0x2000004c + +080010d4 : + +static int cb_triggered = 0; + +void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef* handle) { + 80010d4: b580 push {r7, lr} + 80010d6: b082 sub sp, #8 + 80010d8: af00 add r7, sp, #0 + 80010da: 6078 str r0, [r7, #4] + static CAN_RxHeaderTypeDef header; + static uint8_t data[8]; + cb_triggered = 1; + 80010dc: 4b0e ldr r3, [pc, #56] ; (8001118 ) + 80010de: 2201 movs r2, #1 + 80010e0: 601a str r2, [r3, #0] + + if (HAL_CAN_GetRxMessage(handle, CAN_RX_FIFO0, &header, data) != HAL_OK) { + 80010e2: 4b0e ldr r3, [pc, #56] ; (800111c ) + 80010e4: 4a0e ldr r2, [pc, #56] ; (8001120 ) + 80010e6: 2100 movs r1, #0 + 80010e8: 6878 ldr r0, [r7, #4] + 80010ea: f001 fc04 bl 80028f6 + 80010ee: 4603 mov r3, r0 + 80010f0: 2b00 cmp r3, #0 + 80010f2: d001 beq.n 80010f8 + Error_Handler(); + 80010f4: f000 fea0 bl 8001e38 + } + + if (handle == ams_can_handle) { + 80010f8: 4b0a ldr r3, [pc, #40] ; (8001124 ) + 80010fa: 681b ldr r3, [r3, #0] + 80010fc: 687a ldr r2, [r7, #4] + 80010fe: 429a cmp r2, r3 + 8001100: d104 bne.n 800110c + ams_can_handle_ams_msg(&header, data); + 8001102: 4906 ldr r1, [pc, #24] ; (800111c ) + 8001104: 4806 ldr r0, [pc, #24] ; (8001120 ) + 8001106: f000 f80f bl 8001128 + } else { + Error_Handler(); + } +} + 800110a: e001 b.n 8001110 + Error_Handler(); + 800110c: f000 fe94 bl 8001e38 +} + 8001110: bf00 nop + 8001112: 3708 adds r7, #8 + 8001114: 46bd mov sp, r7 + 8001116: bd80 pop {r7, pc} + 8001118: 20000050 .word 0x20000050 + 800111c: 20000070 .word 0x20000070 + 8001120: 20000054 .word 0x20000054 + 8001124: 2000004c .word 0x2000004c + +08001128 : + +void ams_can_handle_ams_msg(CAN_RxHeaderTypeDef* header, uint8_t* data) { + 8001128: b480 push {r7} + 800112a: b085 sub sp, #20 + 800112c: af00 add r7, sp, #0 + 800112e: 6078 str r0, [r7, #4] + 8001130: 6039 str r1, [r7, #0] + + if(BMS_IN_TEST_MODE == 1){ + PENDING_MESSAGE_HANDLE = 1; + 8001132: 4b0e ldr r3, [pc, #56] ; (800116c ) + 8001134: 2201 movs r2, #1 + 8001136: 601a str r2, [r3, #0] + for(int i = 0; i < 8; i++){ + 8001138: 2300 movs r3, #0 + 800113a: 60fb str r3, [r7, #12] + 800113c: e00b b.n 8001156 + canTestData[i] = data[i]; + 800113e: 68fb ldr r3, [r7, #12] + 8001140: 683a ldr r2, [r7, #0] + 8001142: 4413 add r3, r2 + 8001144: 7819 ldrb r1, [r3, #0] + 8001146: 4a0a ldr r2, [pc, #40] ; (8001170 ) + 8001148: 68fb ldr r3, [r7, #12] + 800114a: 4413 add r3, r2 + 800114c: 460a mov r2, r1 + 800114e: 701a strb r2, [r3, #0] + for(int i = 0; i < 8; i++){ + 8001150: 68fb ldr r3, [r7, #12] + 8001152: 3301 adds r3, #1 + 8001154: 60fb str r3, [r7, #12] + 8001156: 68fb ldr r3, [r7, #12] + 8001158: 2b07 cmp r3, #7 + 800115a: ddf0 ble.n 800113e + } + return; + 800115c: bf00 nop + 800115e: bf00 nop + break; + case CAN_ID_MASTER_HEARTBEAT: +// clock_sync_handle_master_heartbeat(); + break; + } +} + 8001160: 3714 adds r7, #20 + 8001162: 46bd mov sp, r7 + 8001164: f85d 7b04 ldr.w r7, [sp], #4 + 8001168: 4770 bx lr + 800116a: bf00 nop + 800116c: 20000040 .word 0x20000040 + 8001170: 20000044 .word 0x20000044 + +08001174 : + +void ams_can_send_heartbeat() { + 8001174: b580 push {r7, lr} + 8001176: b086 sub sp, #24 + 8001178: af00 add r7, sp, #0 + static CAN_TxHeaderTypeDef header; + static uint8_t data[8]; + + header.IDE = CAN_ID_STD; + 800117a: 4b2c ldr r3, [pc, #176] ; (800122c ) + 800117c: 2200 movs r2, #0 + 800117e: 609a str r2, [r3, #8] + header.DLC = 8; + 8001180: 4b2a ldr r3, [pc, #168] ; (800122c ) + 8001182: 2208 movs r2, #8 + 8001184: 611a str r2, [r3, #16] + header.RTR = CAN_RTR_DATA; + 8001186: 4b29 ldr r3, [pc, #164] ; (800122c ) + 8001188: 2200 movs r2, #0 + 800118a: 60da str r2, [r3, #12] + header.TransmitGlobalTime = DISABLE; + 800118c: 4b27 ldr r3, [pc, #156] ; (800122c ) + 800118e: 2200 movs r2, #0 + 8001190: 751a strb r2, [r3, #20] + + // Send voltages + for (int msg_id = 0; msg_id < 5; msg_id++) { + 8001192: 2300 movs r3, #0 + 8001194: 617b str r3, [r7, #20] + 8001196: e040 b.n 800121a + header.StdId = CAN_ID_AMS_SLAVE_HEARTBEAT_BASE | (0 << 4) | msg_id; //TODO: Use slave_id/new format + 8001198: 697b ldr r3, [r7, #20] + 800119a: f443 63c0 orr.w r3, r3, #1536 ; 0x600 + 800119e: 461a mov r2, r3 + 80011a0: 4b22 ldr r3, [pc, #136] ; (800122c ) + 80011a2: 601a str r2, [r3, #0] + for (int i = 0; i < 4; i++) { + 80011a4: 2300 movs r3, #0 + 80011a6: 613b str r3, [r7, #16] + 80011a8: e020 b.n 80011ec + int cell = msg_id * 4 + i; + 80011aa: 697b ldr r3, [r7, #20] + 80011ac: 009b lsls r3, r3, #2 + 80011ae: 693a ldr r2, [r7, #16] + 80011b0: 4413 add r3, r2 + 80011b2: 60fb str r3, [r7, #12] + uint16_t v = (cell < N_CELLS) ? module.cellVoltages[cell] : 0; + 80011b4: 68fb ldr r3, [r7, #12] + 80011b6: 2b10 cmp r3, #16 + 80011b8: dc04 bgt.n 80011c4 + 80011ba: 4a1d ldr r2, [pc, #116] ; (8001230 ) + 80011bc: 68fb ldr r3, [r7, #12] + 80011be: f832 3013 ldrh.w r3, [r2, r3, lsl #1] + 80011c2: e000 b.n 80011c6 + 80011c4: 2300 movs r3, #0 + 80011c6: 817b strh r3, [r7, #10] + data[2 * i + 0] = v & 0xFF; + 80011c8: 693b ldr r3, [r7, #16] + 80011ca: 005b lsls r3, r3, #1 + 80011cc: 897a ldrh r2, [r7, #10] + 80011ce: b2d1 uxtb r1, r2 + 80011d0: 4a18 ldr r2, [pc, #96] ; (8001234 ) + 80011d2: 54d1 strb r1, [r2, r3] + data[2 * i + 1] = v >> 8; + 80011d4: 897b ldrh r3, [r7, #10] + 80011d6: 0a1b lsrs r3, r3, #8 + 80011d8: b29a uxth r2, r3 + 80011da: 693b ldr r3, [r7, #16] + 80011dc: 005b lsls r3, r3, #1 + 80011de: 3301 adds r3, #1 + 80011e0: b2d1 uxtb r1, r2 + 80011e2: 4a14 ldr r2, [pc, #80] ; (8001234 ) + 80011e4: 54d1 strb r1, [r2, r3] + for (int i = 0; i < 4; i++) { + 80011e6: 693b ldr r3, [r7, #16] + 80011e8: 3301 adds r3, #1 + 80011ea: 613b str r3, [r7, #16] + 80011ec: 693b ldr r3, [r7, #16] + 80011ee: 2b03 cmp r3, #3 + 80011f0: dddb ble.n 80011aa + } + if (ams_can_wait_for_free_mailboxes(ams_can_handle, 1, + 80011f2: 4b11 ldr r3, [pc, #68] ; (8001238 ) + 80011f4: 681b ldr r3, [r3, #0] + 80011f6: 220a movs r2, #10 + 80011f8: 2101 movs r1, #1 + 80011fa: 4618 mov r0, r3 + 80011fc: f000 f81e bl 800123c + 8001200: 4603 mov r3, r0 + 8001202: 2b00 cmp r3, #0 + 8001204: d106 bne.n 8001214 + CAN_HEARTBEAT_TX_TIMEOUT) == HAL_OK) { + uint32_t mailbox; + HAL_CAN_AddTxMessage(ams_can_handle, &header, data, &mailbox); + 8001206: 4b0c ldr r3, [pc, #48] ; (8001238 ) + 8001208: 6818 ldr r0, [r3, #0] + 800120a: 1d3b adds r3, r7, #4 + 800120c: 4a09 ldr r2, [pc, #36] ; (8001234 ) + 800120e: 4907 ldr r1, [pc, #28] ; (800122c ) + 8001210: f001 fa61 bl 80026d6 + for (int msg_id = 0; msg_id < 5; msg_id++) { + 8001214: 697b ldr r3, [r7, #20] + 8001216: 3301 adds r3, #1 + 8001218: 617b str r3, [r7, #20] + 800121a: 697b ldr r3, [r7, #20] + 800121c: 2b04 cmp r3, #4 + 800121e: ddbb ble.n 8001198 + CAN_HEARTBEAT_TX_TIMEOUT) == HAL_OK) { + uint32_t mailbox; + HAL_CAN_AddTxMessage(ams_can_handle, &header, data, &mailbox); + } + }*/ +} + 8001220: bf00 nop + 8001222: bf00 nop + 8001224: 3718 adds r7, #24 + 8001226: 46bd mov sp, r7 + 8001228: bd80 pop {r7, pc} + 800122a: bf00 nop + 800122c: 20000078 .word 0x20000078 + 8001230: 20000098 .word 0x20000098 + 8001234: 20000090 .word 0x20000090 + 8001238: 2000004c .word 0x2000004c + +0800123c : + ams_can_wait_for_free_mailboxes(ams_can_handle, 3, transmission_timeout); +}*/ + +HAL_StatusTypeDef ams_can_wait_for_free_mailboxes(CAN_HandleTypeDef* handle, + int num_mailboxes, + uint32_t timeout) { + 800123c: b580 push {r7, lr} + 800123e: b086 sub sp, #24 + 8001240: af00 add r7, sp, #0 + 8001242: 60f8 str r0, [r7, #12] + 8001244: 60b9 str r1, [r7, #8] + 8001246: 607a str r2, [r7, #4] + uint32_t end = HAL_GetTick() + timeout; + 8001248: f001 f80c bl 8002264 + 800124c: 4602 mov r2, r0 + 800124e: 687b ldr r3, [r7, #4] + 8001250: 4413 add r3, r2 + 8001252: 617b str r3, [r7, #20] + while (HAL_GetTick() < end) { + 8001254: e008 b.n 8001268 + if (HAL_CAN_GetTxMailboxesFreeLevel(handle) >= num_mailboxes) { + 8001256: 68f8 ldr r0, [r7, #12] + 8001258: f001 fb18 bl 800288c + 800125c: 4602 mov r2, r0 + 800125e: 68bb ldr r3, [r7, #8] + 8001260: 429a cmp r2, r3 + 8001262: d301 bcc.n 8001268 + return HAL_OK; + 8001264: 2300 movs r3, #0 + 8001266: e006 b.n 8001276 + while (HAL_GetTick() < end) { + 8001268: f000 fffc bl 8002264 + 800126c: 4602 mov r2, r0 + 800126e: 697b ldr r3, [r7, #20] + 8001270: 4293 cmp r3, r2 + 8001272: d8f0 bhi.n 8001256 + } + } + return HAL_TIMEOUT; + 8001274: 2303 movs r3, #3 +} + 8001276: 4618 mov r0, r3 + 8001278: 3718 adds r7, #24 + 800127a: 46bd mov sp, r7 + 800127c: bd80 pop {r7, pc} + ... + +08001280 : + +amsState currentAMSState = AMSDEACTIVE; +amsState lastAMSState = AMSDEACTIVE; + +void AMS_Init(SPI_HandleTypeDef *hspi) +{ + 8001280: b580 push {r7, lr} + 8001282: b082 sub sp, #8 + 8001284: af00 add r7, sp, #0 + 8001286: 6078 str r0, [r7, #4] + if(eepromconfigured == 1) + 8001288: 4b12 ldr r3, [pc, #72] ; (80012d4 ) + 800128a: 781b ldrb r3, [r3, #0] + 800128c: 2b01 cmp r3, #1 + 800128e: d10a bne.n 80012a6 + /*amsov = eepromcellovervoltage>>4; + amsuv = (eepromcellundervoltage-1)>>4; + numberofCells = eepromnumofcells; + numberofAux = eepromnumofaux; + initAMS(hspi, eepromnumofcells, eepromnumofaux);*/ + amsConfigOverVoltage(amsov); + 8001290: 4b11 ldr r3, [pc, #68] ; (80012d8 ) + 8001292: 881b ldrh r3, [r3, #0] + 8001294: 4618 mov r0, r3 + 8001296: f7ff fa1e bl 80006d6 + amsConfigUnderVoltage(amsuv); + 800129a: 4b10 ldr r3, [pc, #64] ; (80012dc ) + 800129c: 881b ldrh r3, [r3, #0] + 800129e: 4618 mov r0, r3 + 80012a0: f7ff f95e bl 8000560 + 80012a4: e00f b.n 80012c6 + } + else + { + initAMS(hspi, numberofCells, numberofAux); + 80012a6: 4b0e ldr r3, [pc, #56] ; (80012e0 ) + 80012a8: 781b ldrb r3, [r3, #0] + 80012aa: 4a0e ldr r2, [pc, #56] ; (80012e4 ) + 80012ac: 7812 ldrb r2, [r2, #0] + 80012ae: 4619 mov r1, r3 + 80012b0: 6878 ldr r0, [r7, #4] + 80012b2: f7fe ff89 bl 80001c8 + amsov = DEFAULT_OV; + 80012b6: 4b08 ldr r3, [pc, #32] ; (80012d8 ) + 80012b8: f640 2241 movw r2, #2625 ; 0xa41 + 80012bc: 801a strh r2, [r3, #0] + amsuv = DEFAULT_UV; + 80012be: 4b07 ldr r3, [pc, #28] ; (80012dc ) + 80012c0: f240 621a movw r2, #1562 ; 0x61a + 80012c4: 801a strh r2, [r3, #0] + } + + + currentAMSState = AMSIDLE; + 80012c6: 4b08 ldr r3, [pc, #32] ; (80012e8 ) + 80012c8: 2201 movs r2, #1 + 80012ca: 701a strb r2, [r3, #0] + + +} + 80012cc: bf00 nop + 80012ce: 3708 adds r7, #8 + 80012d0: 46bd mov sp, r7 + 80012d2: bd80 pop {r7, pc} + 80012d4: 20000108 .word 0x20000108 + 80012d8: 2000010c .word 0x2000010c + 80012dc: 2000010a .word 0x2000010a + 80012e0: 20000000 .word 0x20000000 + 80012e4: 2000010f .word 0x2000010f + 80012e8: 20000110 .word 0x20000110 + +080012ec : + +void AMS_Loop() +{ + 80012ec: b580 push {r7, lr} + 80012ee: af00 add r7, sp, #0 + + //On Transition Functions called ones if the State Changed + + if(currentAMSState != lastAMSState) + 80012f0: 4b25 ldr r3, [pc, #148] ; (8001388 ) + 80012f2: 781a ldrb r2, [r3, #0] + 80012f4: 4b25 ldr r3, [pc, #148] ; (800138c ) + 80012f6: 781b ldrb r3, [r3, #0] + 80012f8: 429a cmp r2, r3 + 80012fa: d023 beq.n 8001344 + { + switch(currentAMSState) + 80012fc: 4b22 ldr r3, [pc, #136] ; (8001388 ) + 80012fe: 781b ldrb r3, [r3, #0] + 8001300: 2b06 cmp r3, #6 + 8001302: d81b bhi.n 800133c + 8001304: a201 add r2, pc, #4 ; (adr r2, 800130c ) + 8001306: f852 f023 ldr.w pc, [r2, r3, lsl #2] + 800130a: bf00 nop + 800130c: 0800133d .word 0x0800133d + 8001310: 0800133d .word 0x0800133d + 8001314: 0800133d .word 0x0800133d + 8001318: 0800133d .word 0x0800133d + 800131c: 0800133d .word 0x0800133d + 8001320: 08001329 .word 0x08001329 + 8001324: 08001331 .word 0x08001331 + case AMSIDLEBALANCING: + break; + case AMSDISCHARGING: + break; + case AMSWARNING: + writeWarningLog(0x01); + 8001328: 2001 movs r0, #1 + 800132a: f000 f8a7 bl 800147c + break; + 800132e: e005 b.n 800133c + case AMSERROR: + writeErrorLog(amserrorcode); + 8001330: 4b17 ldr r3, [pc, #92] ; (8001390 ) + 8001332: 781b ldrb r3, [r3, #0] + 8001334: 4618 mov r0, r3 + 8001336: f000 f8ad bl 8001494 + break; + 800133a: bf00 nop + } + lastAMSState = currentAMSState; + 800133c: 4b12 ldr r3, [pc, #72] ; (8001388 ) + 800133e: 781a ldrb r2, [r3, #0] + 8001340: 4b12 ldr r3, [pc, #72] ; (800138c ) + 8001342: 701a strb r2, [r3, #0] + } + + //Main Loops for different AMS States + + switch(currentAMSState) + 8001344: 4b10 ldr r3, [pc, #64] ; (8001388 ) + 8001346: 781b ldrb r3, [r3, #0] + 8001348: 2b06 cmp r3, #6 + 800134a: d81b bhi.n 8001384 + 800134c: a201 add r2, pc, #4 ; (adr r2, 8001354 ) + 800134e: f852 f023 ldr.w pc, [r2, r3, lsl #2] + 8001352: bf00 nop + 8001354: 08001383 .word 0x08001383 + 8001358: 08001371 .word 0x08001371 + 800135c: 08001383 .word 0x08001383 + 8001360: 08001377 .word 0x08001377 + 8001364: 08001383 .word 0x08001383 + 8001368: 0800137d .word 0x0800137d + 800136c: 08001383 .word 0x08001383 + { + case AMSIDLE: + AMS_Idle_Loop(); + 8001370: f000 f810 bl 8001394 + break; + 8001374: e006 b.n 8001384 + case AMSDEACTIVE: + break; + case AMSCHARGING: + break; + case AMSIDLEBALANCING: + AMS_Idle_Loop(); + 8001376: f000 f80d bl 8001394 + break; + 800137a: e003 b.n 8001384 + case AMSDISCHARGING: + break; + case AMSWARNING: + AMS_Warning_Loop(); + 800137c: f000 f844 bl 8001408 + break; + 8001380: e000 b.n 8001384 + break; + 8001382: bf00 nop + case AMSERROR: + break; + } +} + 8001384: bf00 nop + 8001386: bd80 pop {r7, pc} + 8001388: 20000110 .word 0x20000110 + 800138c: 20000111 .word 0x20000111 + 8001390: 2000010e .word 0x2000010e + +08001394 : + +uint8_t AMS_Idle_Loop() +{ + 8001394: b580 push {r7, lr} + 8001396: af00 add r7, sp, #0 + amsWakeUp(); + 8001398: f7fe ff40 bl 800021c + amsConfigOverVoltage(amsov); + 800139c: 4b15 ldr r3, [pc, #84] ; (80013f4 ) + 800139e: 881b ldrh r3, [r3, #0] + 80013a0: 4618 mov r0, r3 + 80013a2: f7ff f998 bl 80006d6 + amsConfigUnderVoltage(amsuv); + 80013a6: 4b14 ldr r3, [pc, #80] ; (80013f8 ) + 80013a8: 881b ldrh r3, [r3, #0] + 80013aa: 4618 mov r0, r3 + 80013ac: f7ff f8d8 bl 8000560 + amsConfigAuxMeasurement(0xFFFF); + 80013b0: f64f 70ff movw r0, #65535 ; 0xffff + 80013b4: f7ff f836 bl 8000424 + amsClearAux(); + 80013b8: f7ff f9b9 bl 800072e + amsCellMeasurement(&module); + 80013bc: 480f ldr r0, [pc, #60] ; (80013fc ) + 80013be: f7fe ff3b bl 8000238 + amsInternalStatusMeasurement(&module); + 80013c2: 480e ldr r0, [pc, #56] ; (80013fc ) + 80013c4: f7fe ffe4 bl 8000390 + amsAuxMeasurement(&module); + 80013c8: 480c ldr r0, [pc, #48] ; (80013fc ) + 80013ca: f7fe ff4c bl 8000266 + amsCheckUnderOverVoltage(&module); + 80013ce: 480b ldr r0, [pc, #44] ; (80013fc ) + 80013d0: f7ff f8f3 bl 80005ba + integrateCurrent(); + 80013d4: f000 f86a bl 80014ac + + static uint32_t channelstobalance = 1; + + channelstobalance = 0x1FFFF; + 80013d8: 4b09 ldr r3, [pc, #36] ; (8001400 ) + 80013da: 4a0a ldr r2, [pc, #40] ; (8001404 ) + 80013dc: 601a str r2, [r3, #0] + /* if(channelstobalance & 0x20000){ + channelstobalance = 1; + }*/ + + amsConfigBalancing(channelstobalance); + 80013de: 4b08 ldr r3, [pc, #32] ; (8001400 ) + 80013e0: 681b ldr r3, [r3, #0] + 80013e2: 4618 mov r0, r3 + 80013e4: f7ff f84e bl 8000484 + amsStartBalancing(100); + 80013e8: 2064 movs r0, #100 ; 0x64 + 80013ea: f7ff f8a0 bl 800052e + { + amsStopBalancing(); + }*/ + //amsConfigBalancing(balancedCells); + //volatile amscheck = amscheckOpenCellWire(&module); + return 0; + 80013ee: 2300 movs r3, #0 +} + 80013f0: 4618 mov r0, r3 + 80013f2: bd80 pop {r7, pc} + 80013f4: 2000010c .word 0x2000010c + 80013f8: 2000010a .word 0x2000010a + 80013fc: 20000098 .word 0x20000098 + 8001400: 20000004 .word 0x20000004 + 8001404: 0001ffff .word 0x0001ffff + +08001408 : + +uint8_t AMS_Warning_Loop() +{ + 8001408: b580 push {r7, lr} + 800140a: af00 add r7, sp, #0 + + amsWakeUp(); + 800140c: f7fe ff06 bl 800021c + amsConfigOverVoltage(amsov); + 8001410: 4b16 ldr r3, [pc, #88] ; (800146c ) + 8001412: 881b ldrh r3, [r3, #0] + 8001414: 4618 mov r0, r3 + 8001416: f7ff f95e bl 80006d6 + amsConfigUnderVoltage(amsuv); + 800141a: 4b15 ldr r3, [pc, #84] ; (8001470 ) + 800141c: 881b ldrh r3, [r3, #0] + 800141e: 4618 mov r0, r3 + 8001420: f7ff f89e bl 8000560 + amsConfigAuxMeasurement(0xFFFF); + 8001424: f64f 70ff movw r0, #65535 ; 0xffff + 8001428: f7fe fffc bl 8000424 + amsClearAux(); + 800142c: f7ff f97f bl 800072e + amsCellMeasurement(&module); + 8001430: 4810 ldr r0, [pc, #64] ; (8001474 ) + 8001432: f7fe ff01 bl 8000238 + amsInternalStatusMeasurement(&module); + 8001436: 480f ldr r0, [pc, #60] ; (8001474 ) + 8001438: f7fe ffaa bl 8000390 + amsAuxMeasurement(&module); + 800143c: 480d ldr r0, [pc, #52] ; (8001474 ) + 800143e: f7fe ff12 bl 8000266 + amsCheckUnderOverVoltage(&module); + 8001442: 480c ldr r0, [pc, #48] ; (8001474 ) + 8001444: f7ff f8b9 bl 80005ba + + if(!(module.overVoltage | module.underVoltage)) + 8001448: 4b0a ldr r3, [pc, #40] ; (8001474 ) + 800144a: 6d9a ldr r2, [r3, #88] ; 0x58 + 800144c: 4b09 ldr r3, [pc, #36] ; (8001474 ) + 800144e: 6ddb ldr r3, [r3, #92] ; 0x5c + 8001450: 4313 orrs r3, r2 + 8001452: 2b00 cmp r3, #0 + 8001454: d104 bne.n 8001460 + { + currentAMSState = AMSIDLE; + 8001456: 4b08 ldr r3, [pc, #32] ; (8001478 ) + 8001458: 2201 movs r2, #1 + 800145a: 701a strb r2, [r3, #0] + amsClearWarning(); + 800145c: f7ff f976 bl 800074c + } + amsStopBalancing(); + 8001460: f7ff f874 bl 800054c + + return 0; + 8001464: 2300 movs r3, #0 +} + 8001466: 4618 mov r0, r3 + 8001468: bd80 pop {r7, pc} + 800146a: bf00 nop + 800146c: 2000010c .word 0x2000010c + 8001470: 2000010a .word 0x2000010a + 8001474: 20000098 .word 0x20000098 + 8001478: 20000110 .word 0x20000110 + +0800147c : + } + return balancingdone; +} + +uint8_t writeWarningLog(uint8_t warningCode) +{ + 800147c: b480 push {r7} + 800147e: b083 sub sp, #12 + 8001480: af00 add r7, sp, #0 + 8001482: 4603 mov r3, r0 + 8001484: 71fb strb r3, [r7, #7] + //eepromWriteWarningLog(warningCode); + return 0; + 8001486: 2300 movs r3, #0 +} + 8001488: 4618 mov r0, r3 + 800148a: 370c adds r7, #12 + 800148c: 46bd mov sp, r7 + 800148e: f85d 7b04 ldr.w r7, [sp], #4 + 8001492: 4770 bx lr + +08001494 : +uint8_t writeErrorLog(uint8_t errorCode) +{ + 8001494: b480 push {r7} + 8001496: b083 sub sp, #12 + 8001498: af00 add r7, sp, #0 + 800149a: 4603 mov r3, r0 + 800149c: 71fb strb r3, [r7, #7] + //eepromWriteErrorLog(errorCode); + return 0; + 800149e: 2300 movs r3, #0 +} + 80014a0: 4618 mov r0, r3 + 80014a2: 370c adds r7, #12 + 80014a4: 46bd mov sp, r7 + 80014a6: f85d 7b04 ldr.w r7, [sp], #4 + 80014aa: 4770 bx lr + +080014ac : + +uint8_t integrateCurrent() +{ + 80014ac: e92d 43b0 stmdb sp!, {r4, r5, r7, r8, r9, lr} + 80014b0: af00 add r7, sp, #0 + lastticks = currenttick; + 80014b2: 4b17 ldr r3, [pc, #92] ; (8001510 ) + 80014b4: 681b ldr r3, [r3, #0] + 80014b6: 4a17 ldr r2, [pc, #92] ; (8001514 ) + 80014b8: 6013 str r3, [r2, #0] + currenttick = HAL_GetTick(); + 80014ba: f000 fed3 bl 8002264 + 80014be: 4603 mov r3, r0 + 80014c0: 4a13 ldr r2, [pc, #76] ; (8001510 ) + 80014c2: 6013 str r3, [r2, #0] + if(currenttick < lastticks) + 80014c4: 4b12 ldr r3, [pc, #72] ; (8001510 ) + 80014c6: 681a ldr r2, [r3, #0] + 80014c8: 4b12 ldr r3, [pc, #72] ; (8001514 ) + 80014ca: 681b ldr r3, [r3, #0] + 80014cc: 429a cmp r2, r3 + 80014ce: d21a bcs.n 8001506 + { + currentintegrator += (module.auxVoltages[0] - module.auxVoltages[2])*(currenttick-lastticks); + 80014d0: 4b11 ldr r3, [pc, #68] ; (8001518 ) + 80014d2: 8c9b ldrh r3, [r3, #36] ; 0x24 + 80014d4: 461a mov r2, r3 + 80014d6: 4b10 ldr r3, [pc, #64] ; (8001518 ) + 80014d8: 8d1b ldrh r3, [r3, #40] ; 0x28 + 80014da: 1ad3 subs r3, r2, r3 + 80014dc: 4619 mov r1, r3 + 80014de: 4b0c ldr r3, [pc, #48] ; (8001510 ) + 80014e0: 681a ldr r2, [r3, #0] + 80014e2: 4b0c ldr r3, [pc, #48] ; (8001514 ) + 80014e4: 681b ldr r3, [r3, #0] + 80014e6: 1ad3 subs r3, r2, r3 + 80014e8: fb01 f303 mul.w r3, r1, r3 + 80014ec: 2200 movs r2, #0 + 80014ee: 461c mov r4, r3 + 80014f0: 4615 mov r5, r2 + 80014f2: 4b0a ldr r3, [pc, #40] ; (800151c ) + 80014f4: e9d3 2300 ldrd r2, r3, [r3] + 80014f8: eb14 0802 adds.w r8, r4, r2 + 80014fc: eb45 0903 adc.w r9, r5, r3 + 8001500: 4b06 ldr r3, [pc, #24] ; (800151c ) + 8001502: e9c3 8900 strd r8, r9, [r3] + } + return 0; + 8001506: 2300 movs r3, #0 +} + 8001508: 4618 mov r0, r3 + 800150a: e8bd 83b0 ldmia.w sp!, {r4, r5, r7, r8, r9, pc} + 800150e: bf00 nop + 8001510: 20000104 .word 0x20000104 + 8001514: 20000100 .word 0x20000100 + 8001518: 20000098 .word 0x20000098 + 800151c: 200000f8 .word 0x200000f8 + +08001520 : +#include +#include "ADBMS_Abstraction.h" +#include "main.h" + + +void canTestSendTemperatures(uint16_t* data){ + 8001520: b580 push {r7, lr} + 8001522: b092 sub sp, #72 ; 0x48 + 8001524: af00 add r7, sp, #0 + 8001526: 6078 str r0, [r7, #4] + static CAN_TxHeaderTypeDef header; + + header.IDE = CAN_ID_STD; + 8001528: 4b59 ldr r3, [pc, #356] ; (8001690 ) + 800152a: 2200 movs r2, #0 + 800152c: 609a str r2, [r3, #8] + header.DLC = 8; + 800152e: 4b58 ldr r3, [pc, #352] ; (8001690 ) + 8001530: 2208 movs r2, #8 + 8001532: 611a str r2, [r3, #16] + header.RTR = CAN_RTR_DATA; + 8001534: 4b56 ldr r3, [pc, #344] ; (8001690 ) + 8001536: 2200 movs r2, #0 + 8001538: 60da str r2, [r3, #12] + header.TransmitGlobalTime = DISABLE; + 800153a: 4b55 ldr r3, [pc, #340] ; (8001690 ) + 800153c: 2200 movs r2, #0 + 800153e: 751a strb r2, [r3, #20] + uint8_t buffer[24]; + uint8_t tmp[8]; + + for(int i = 0; i < 12; i++){ + 8001540: 2300 movs r3, #0 + 8001542: 647b str r3, [r7, #68] ; 0x44 + 8001544: e01d b.n 8001582 + buffer[((i*2)+1)] = data[i] >> 8; + 8001546: 6c7b ldr r3, [r7, #68] ; 0x44 + 8001548: 005b lsls r3, r3, #1 + 800154a: 687a ldr r2, [r7, #4] + 800154c: 4413 add r3, r2 + 800154e: 881b ldrh r3, [r3, #0] + 8001550: 0a1b lsrs r3, r3, #8 + 8001552: b29a uxth r2, r3 + 8001554: 6c7b ldr r3, [r7, #68] ; 0x44 + 8001556: 005b lsls r3, r3, #1 + 8001558: 3301 adds r3, #1 + 800155a: b2d2 uxtb r2, r2 + 800155c: 3348 adds r3, #72 ; 0x48 + 800155e: 443b add r3, r7 + 8001560: f803 2c2c strb.w r2, [r3, #-44] + buffer[(i*2)] = data[i]; + 8001564: 6c7b ldr r3, [r7, #68] ; 0x44 + 8001566: 005b lsls r3, r3, #1 + 8001568: 687a ldr r2, [r7, #4] + 800156a: 4413 add r3, r2 + 800156c: 881a ldrh r2, [r3, #0] + 800156e: 6c7b ldr r3, [r7, #68] ; 0x44 + 8001570: 005b lsls r3, r3, #1 + 8001572: b2d2 uxtb r2, r2 + 8001574: 3348 adds r3, #72 ; 0x48 + 8001576: 443b add r3, r7 + 8001578: f803 2c2c strb.w r2, [r3, #-44] + for(int i = 0; i < 12; i++){ + 800157c: 6c7b ldr r3, [r7, #68] ; 0x44 + 800157e: 3301 adds r3, #1 + 8001580: 647b str r3, [r7, #68] ; 0x44 + 8001582: 6c7b ldr r3, [r7, #68] ; 0x44 + 8001584: 2b0b cmp r3, #11 + 8001586: ddde ble.n 8001546 + } + + for(int i = 0; i < 8; i++){ + 8001588: 2300 movs r3, #0 + 800158a: 643b str r3, [r7, #64] ; 0x40 + 800158c: e00d b.n 80015aa + tmp[i] = buffer[i]; + 800158e: f107 021c add.w r2, r7, #28 + 8001592: 6c3b ldr r3, [r7, #64] ; 0x40 + 8001594: 4413 add r3, r2 + 8001596: 7819 ldrb r1, [r3, #0] + 8001598: f107 0214 add.w r2, r7, #20 + 800159c: 6c3b ldr r3, [r7, #64] ; 0x40 + 800159e: 4413 add r3, r2 + 80015a0: 460a mov r2, r1 + 80015a2: 701a strb r2, [r3, #0] + for(int i = 0; i < 8; i++){ + 80015a4: 6c3b ldr r3, [r7, #64] ; 0x40 + 80015a6: 3301 adds r3, #1 + 80015a8: 643b str r3, [r7, #64] ; 0x40 + 80015aa: 6c3b ldr r3, [r7, #64] ; 0x40 + 80015ac: 2b07 cmp r3, #7 + 80015ae: ddee ble.n 800158e + } + if (ams_can_wait_for_free_mailboxes(ams_can_handle, 1, CAN_HEARTBEAT_TX_TIMEOUT) == HAL_OK) { + 80015b0: 4b38 ldr r3, [pc, #224] ; (8001694 ) + 80015b2: 681b ldr r3, [r3, #0] + 80015b4: 220a movs r2, #10 + 80015b6: 2101 movs r1, #1 + 80015b8: 4618 mov r0, r3 + 80015ba: f7ff fe3f bl 800123c + 80015be: 4603 mov r3, r0 + 80015c0: 2b00 cmp r3, #0 + 80015c2: d108 bne.n 80015d6 + uint32_t mailbox; + HAL_CAN_AddTxMessage(ams_can_handle, &header, tmp, &mailbox); + 80015c4: 4b33 ldr r3, [pc, #204] ; (8001694 ) + 80015c6: 6818 ldr r0, [r3, #0] + 80015c8: f107 0310 add.w r3, r7, #16 + 80015cc: f107 0214 add.w r2, r7, #20 + 80015d0: 492f ldr r1, [pc, #188] ; (8001690 ) + 80015d2: f001 f880 bl 80026d6 + } + + int m = 0; + 80015d6: 2300 movs r3, #0 + 80015d8: 63fb str r3, [r7, #60] ; 0x3c + for(int i = 8; i < 16; i++){ + 80015da: 2308 movs r3, #8 + 80015dc: 63bb str r3, [r7, #56] ; 0x38 + 80015de: e010 b.n 8001602 + tmp[m] = buffer[i]; + 80015e0: f107 021c add.w r2, r7, #28 + 80015e4: 6bbb ldr r3, [r7, #56] ; 0x38 + 80015e6: 4413 add r3, r2 + 80015e8: 7819 ldrb r1, [r3, #0] + 80015ea: f107 0214 add.w r2, r7, #20 + 80015ee: 6bfb ldr r3, [r7, #60] ; 0x3c + 80015f0: 4413 add r3, r2 + 80015f2: 460a mov r2, r1 + 80015f4: 701a strb r2, [r3, #0] + m++; + 80015f6: 6bfb ldr r3, [r7, #60] ; 0x3c + 80015f8: 3301 adds r3, #1 + 80015fa: 63fb str r3, [r7, #60] ; 0x3c + for(int i = 8; i < 16; i++){ + 80015fc: 6bbb ldr r3, [r7, #56] ; 0x38 + 80015fe: 3301 adds r3, #1 + 8001600: 63bb str r3, [r7, #56] ; 0x38 + 8001602: 6bbb ldr r3, [r7, #56] ; 0x38 + 8001604: 2b0f cmp r3, #15 + 8001606: ddeb ble.n 80015e0 + } + + if (ams_can_wait_for_free_mailboxes(ams_can_handle, 1, CAN_HEARTBEAT_TX_TIMEOUT) == HAL_OK) { + 8001608: 4b22 ldr r3, [pc, #136] ; (8001694 ) + 800160a: 681b ldr r3, [r3, #0] + 800160c: 220a movs r2, #10 + 800160e: 2101 movs r1, #1 + 8001610: 4618 mov r0, r3 + 8001612: f7ff fe13 bl 800123c + 8001616: 4603 mov r3, r0 + 8001618: 2b00 cmp r3, #0 + 800161a: d108 bne.n 800162e + uint32_t mailbox; + HAL_CAN_AddTxMessage(ams_can_handle, &header, tmp, &mailbox); + 800161c: 4b1d ldr r3, [pc, #116] ; (8001694 ) + 800161e: 6818 ldr r0, [r3, #0] + 8001620: f107 030c add.w r3, r7, #12 + 8001624: f107 0214 add.w r2, r7, #20 + 8001628: 4919 ldr r1, [pc, #100] ; (8001690 ) + 800162a: f001 f854 bl 80026d6 + } + m = 0; + 800162e: 2300 movs r3, #0 + 8001630: 63fb str r3, [r7, #60] ; 0x3c + for(int i = 16; i < 24; i++){ + 8001632: 2310 movs r3, #16 + 8001634: 637b str r3, [r7, #52] ; 0x34 + 8001636: e010 b.n 800165a + tmp[m] = buffer[i]; + 8001638: f107 021c add.w r2, r7, #28 + 800163c: 6b7b ldr r3, [r7, #52] ; 0x34 + 800163e: 4413 add r3, r2 + 8001640: 7819 ldrb r1, [r3, #0] + 8001642: f107 0214 add.w r2, r7, #20 + 8001646: 6bfb ldr r3, [r7, #60] ; 0x3c + 8001648: 4413 add r3, r2 + 800164a: 460a mov r2, r1 + 800164c: 701a strb r2, [r3, #0] + m++; + 800164e: 6bfb ldr r3, [r7, #60] ; 0x3c + 8001650: 3301 adds r3, #1 + 8001652: 63fb str r3, [r7, #60] ; 0x3c + for(int i = 16; i < 24; i++){ + 8001654: 6b7b ldr r3, [r7, #52] ; 0x34 + 8001656: 3301 adds r3, #1 + 8001658: 637b str r3, [r7, #52] ; 0x34 + 800165a: 6b7b ldr r3, [r7, #52] ; 0x34 + 800165c: 2b17 cmp r3, #23 + 800165e: ddeb ble.n 8001638 + } + + if (ams_can_wait_for_free_mailboxes(ams_can_handle, 1, CAN_HEARTBEAT_TX_TIMEOUT) == HAL_OK) { + 8001660: 4b0c ldr r3, [pc, #48] ; (8001694 ) + 8001662: 681b ldr r3, [r3, #0] + 8001664: 220a movs r2, #10 + 8001666: 2101 movs r1, #1 + 8001668: 4618 mov r0, r3 + 800166a: f7ff fde7 bl 800123c + 800166e: 4603 mov r3, r0 + 8001670: 2b00 cmp r3, #0 + 8001672: d108 bne.n 8001686 + uint32_t mailbox; + HAL_CAN_AddTxMessage(ams_can_handle, &header, tmp, &mailbox); + 8001674: 4b07 ldr r3, [pc, #28] ; (8001694 ) + 8001676: 6818 ldr r0, [r3, #0] + 8001678: f107 0308 add.w r3, r7, #8 + 800167c: f107 0214 add.w r2, r7, #20 + 8001680: 4903 ldr r1, [pc, #12] ; (8001690 ) + 8001682: f001 f828 bl 80026d6 + } +} + 8001686: bf00 nop + 8001688: 3748 adds r7, #72 ; 0x48 + 800168a: 46bd mov sp, r7 + 800168c: bd80 pop {r7, pc} + 800168e: bf00 nop + 8001690: 20000114 .word 0x20000114 + 8001694: 2000004c .word 0x2000004c + +08001698 : + +void canTestSendAnswer(uint8_t* data){ + 8001698: b580 push {r7, lr} + 800169a: b084 sub sp, #16 + 800169c: af00 add r7, sp, #0 + 800169e: 6078 str r0, [r7, #4] + static CAN_TxHeaderTypeDef header; + + header.IDE = CAN_ID_STD; + 80016a0: 4b10 ldr r3, [pc, #64] ; (80016e4 ) + 80016a2: 2200 movs r2, #0 + 80016a4: 609a str r2, [r3, #8] + header.DLC = 8; + 80016a6: 4b0f ldr r3, [pc, #60] ; (80016e4 ) + 80016a8: 2208 movs r2, #8 + 80016aa: 611a str r2, [r3, #16] + header.RTR = CAN_RTR_DATA; + 80016ac: 4b0d ldr r3, [pc, #52] ; (80016e4 ) + 80016ae: 2200 movs r2, #0 + 80016b0: 60da str r2, [r3, #12] + header.TransmitGlobalTime = DISABLE; + 80016b2: 4b0c ldr r3, [pc, #48] ; (80016e4 ) + 80016b4: 2200 movs r2, #0 + 80016b6: 751a strb r2, [r3, #20] + + if (ams_can_wait_for_free_mailboxes(ams_can_handle, 1, + 80016b8: 4b0b ldr r3, [pc, #44] ; (80016e8 ) + 80016ba: 681b ldr r3, [r3, #0] + 80016bc: 220a movs r2, #10 + 80016be: 2101 movs r1, #1 + 80016c0: 4618 mov r0, r3 + 80016c2: f7ff fdbb bl 800123c + 80016c6: 4603 mov r3, r0 + 80016c8: 2b00 cmp r3, #0 + 80016ca: d107 bne.n 80016dc + CAN_HEARTBEAT_TX_TIMEOUT) == HAL_OK) { + uint32_t mailbox; + HAL_CAN_AddTxMessage(ams_can_handle, &header, data, &mailbox); + 80016cc: 4b06 ldr r3, [pc, #24] ; (80016e8 ) + 80016ce: 6818 ldr r0, [r3, #0] + 80016d0: f107 030c add.w r3, r7, #12 + 80016d4: 687a ldr r2, [r7, #4] + 80016d6: 4903 ldr r1, [pc, #12] ; (80016e4 ) + 80016d8: f000 fffd bl 80026d6 + } +} + 80016dc: bf00 nop + 80016de: 3710 adds r7, #16 + 80016e0: 46bd mov sp, r7 + 80016e2: bd80 pop {r7, pc} + 80016e4: 2000012c .word 0x2000012c + 80016e8: 2000004c .word 0x2000004c + +080016ec : + +void resetData(uint8_t* data){ + 80016ec: b480 push {r7} + 80016ee: b085 sub sp, #20 + 80016f0: af00 add r7, sp, #0 + 80016f2: 6078 str r0, [r7, #4] + for(int i = 0; i < 8; i++){ + 80016f4: 2300 movs r3, #0 + 80016f6: 60fb str r3, [r7, #12] + 80016f8: e005 b.n 8001706 + data[0] = 0; + 80016fa: 687b ldr r3, [r7, #4] + 80016fc: 2200 movs r2, #0 + 80016fe: 701a strb r2, [r3, #0] + for(int i = 0; i < 8; i++){ + 8001700: 68fb ldr r3, [r7, #12] + 8001702: 3301 adds r3, #1 + 8001704: 60fb str r3, [r7, #12] + 8001706: 68fb ldr r3, [r7, #12] + 8001708: 2b07 cmp r3, #7 + 800170a: ddf6 ble.n 80016fa + } + +} + 800170c: bf00 nop + 800170e: bf00 nop + 8001710: 3714 adds r7, #20 + 8001712: 46bd mov sp, r7 + 8001714: f85d 7b04 ldr.w r7, [sp], #4 + 8001718: 4770 bx lr + +0800171a : +void readTemperatures(){ + 800171a: e92d 41f0 stmdb sp!, {r4, r5, r6, r7, r8, lr} + 800171e: b086 sub sp, #24 + 8001720: af00 add r7, sp, #0 + 8001722: 466b mov r3, sp + 8001724: 4698 mov r8, r3 + uint8_t last_error = 0; + 8001726: 2300 movs r3, #0 + 8001728: 74fb strb r3, [r7, #19] + int N_SENSORS = 12; + 800172a: 230c movs r3, #12 + 800172c: 60fb str r3, [r7, #12] + uint16_t temperatures[N_SENSORS]; + 800172e: 68fe ldr r6, [r7, #12] + 8001730: 1e73 subs r3, r6, #1 + 8001732: 60bb str r3, [r7, #8] + 8001734: 4632 mov r2, r6 + 8001736: 2300 movs r3, #0 + 8001738: 4614 mov r4, r2 + 800173a: 461d mov r5, r3 + 800173c: f04f 0200 mov.w r2, #0 + 8001740: f04f 0300 mov.w r3, #0 + 8001744: 012b lsls r3, r5, #4 + 8001746: ea43 7314 orr.w r3, r3, r4, lsr #28 + 800174a: 0122 lsls r2, r4, #4 + 800174c: 4632 mov r2, r6 + 800174e: 2300 movs r3, #0 + 8001750: 4610 mov r0, r2 + 8001752: 4619 mov r1, r3 + 8001754: f04f 0200 mov.w r2, #0 + 8001758: f04f 0300 mov.w r3, #0 + 800175c: 010b lsls r3, r1, #4 + 800175e: ea43 7310 orr.w r3, r3, r0, lsr #28 + 8001762: 0102 lsls r2, r0, #4 + 8001764: 4633 mov r3, r6 + 8001766: 005b lsls r3, r3, #1 + 8001768: 3307 adds r3, #7 + 800176a: 08db lsrs r3, r3, #3 + 800176c: 00db lsls r3, r3, #3 + 800176e: ebad 0d03 sub.w sp, sp, r3 + 8001772: 466b mov r3, sp + 8001774: 3301 adds r3, #1 + 8001776: 085b lsrs r3, r3, #1 + 8001778: 005b lsls r3, r3, #1 + 800177a: 607b str r3, [r7, #4] + for (int i = 0; i < N_SENSORS; i++) { + 800177c: 2300 movs r3, #0 + 800177e: 617b str r3, [r7, #20] + 8001780: e014 b.n 80017ac + if (sensor_read(i, &temperatures[i]) != HAL_OK) { + 8001782: 697b ldr r3, [r7, #20] + 8001784: 005b lsls r3, r3, #1 + 8001786: 687a ldr r2, [r7, #4] + 8001788: 4413 add r3, r2 + 800178a: 4619 mov r1, r3 + 800178c: 6978 ldr r0, [r7, #20] + 800178e: f000 fae9 bl 8001d64 + 8001792: 4603 mov r3, r0 + 8001794: 2b00 cmp r3, #0 + 8001796: d006 beq.n 80017a6 + sensor_init(i); + 8001798: 6978 ldr r0, [r7, #20] + 800179a: f000 fac5 bl 8001d28 + last_error = HAL_GetTick(); + 800179e: f000 fd61 bl 8002264 + 80017a2: 4603 mov r3, r0 + 80017a4: 74fb strb r3, [r7, #19] + for (int i = 0; i < N_SENSORS; i++) { + 80017a6: 697b ldr r3, [r7, #20] + 80017a8: 3301 adds r3, #1 + 80017aa: 617b str r3, [r7, #20] + 80017ac: 697a ldr r2, [r7, #20] + 80017ae: 68fb ldr r3, [r7, #12] + 80017b0: 429a cmp r2, r3 + 80017b2: dbe6 blt.n 8001782 + } + } + canTestSendTemperatures(temperatures); + 80017b4: 6878 ldr r0, [r7, #4] + 80017b6: f7ff feb3 bl 8001520 + 80017ba: 46c5 mov sp, r8 +} + 80017bc: bf00 nop + 80017be: 3718 adds r7, #24 + 80017c0: 46bd mov sp, r7 + 80017c2: e8bd 81f0 ldmia.w sp!, {r4, r5, r6, r7, r8, pc} + ... + +080017c8 : + +void testLoop(uint8_t* data){ + 80017c8: b580 push {r7, lr} + 80017ca: b086 sub sp, #24 + 80017cc: af00 add r7, sp, #0 + 80017ce: 6078 str r0, [r7, #4] + uint8_t action = data[0]; + 80017d0: 687b ldr r3, [r7, #4] + 80017d2: 781b ldrb r3, [r3, #0] + 80017d4: 73fb strb r3, [r7, #15] + switch(action){ + 80017d6: 7bfb ldrb r3, [r7, #15] + 80017d8: 3b01 subs r3, #1 + 80017da: 2b04 cmp r3, #4 + 80017dc: f200 8091 bhi.w 8001902 + 80017e0: a201 add r2, pc, #4 ; (adr r2, 80017e8 ) + 80017e2: f852 f023 ldr.w pc, [r2, r3, lsl #2] + 80017e6: bf00 nop + 80017e8: 080017fd .word 0x080017fd + 80017ec: 0800180b .word 0x0800180b + 80017f0: 0800181d .word 0x0800181d + 80017f4: 0800182b .word 0x0800182b + 80017f8: 080018ab .word 0x080018ab + case CAN_TEST: + HAL_Delay(100); + 80017fc: 2064 movs r0, #100 ; 0x64 + 80017fe: f000 fd3d bl 800227c + canTestSendAnswer(data); + 8001802: 6878 ldr r0, [r7, #4] + 8001804: f7ff ff48 bl 8001698 + break; + 8001808: e07b b.n 8001902 + case VOLTAGE_TEST: + HAL_Delay(100); + 800180a: 2064 movs r0, #100 ; 0x64 + 800180c: f000 fd36 bl 800227c + amsReadCellVoltages(&module); + 8001810: 483f ldr r0, [pc, #252] ; (8001910 ) + 8001812: f7fe ffa3 bl 800075c + ams_can_send_heartbeat(); + 8001816: f7ff fcad bl 8001174 + break; + 800181a: e072 b.n 8001902 + case TEMP_TEST: + HAL_Delay(1000); + 800181c: f44f 707a mov.w r0, #1000 ; 0x3e8 + 8001820: f000 fd2c bl 800227c + readTemperatures(); + 8001824: f7ff ff79 bl 800171a + break; + 8001828: e06b b.n 8001902 + case EPROM_TEST: + HAL_Delay(1000); + 800182a: f44f 707a mov.w r0, #1000 ; 0x3e8 + 800182e: f000 fd25 bl 800227c + for(uint16_t i = 1; i < 9; i++ ){ + 8001832: 2301 movs r3, #1 + 8001834: 82fb strh r3, [r7, #22] + 8001836: e016 b.n 8001866 + if(i == 4){ + 8001838: 8afb ldrh r3, [r7, #22] + 800183a: 2b04 cmp r3, #4 + 800183c: d108 bne.n 8001850 + writeeeprom(i*3, 0x42); + 800183e: 8afa ldrh r2, [r7, #22] + 8001840: 4613 mov r3, r2 + 8001842: 005b lsls r3, r3, #1 + 8001844: 4413 add r3, r2 + 8001846: 2142 movs r1, #66 ; 0x42 + 8001848: 4618 mov r0, r3 + 800184a: f000 fad7 bl 8001dfc + 800184e: e007 b.n 8001860 + }else{ + writeeeprom(i*3, 0x69); + 8001850: 8afa ldrh r2, [r7, #22] + 8001852: 4613 mov r3, r2 + 8001854: 005b lsls r3, r3, #1 + 8001856: 4413 add r3, r2 + 8001858: 2169 movs r1, #105 ; 0x69 + 800185a: 4618 mov r0, r3 + 800185c: f000 face bl 8001dfc + for(uint16_t i = 1; i < 9; i++ ){ + 8001860: 8afb ldrh r3, [r7, #22] + 8001862: 3301 adds r3, #1 + 8001864: 82fb strh r3, [r7, #22] + 8001866: 8afb ldrh r3, [r7, #22] + 8001868: 2b08 cmp r3, #8 + 800186a: d9e5 bls.n 8001838 + } + } + + HAL_Delay(1000); + 800186c: f44f 707a mov.w r0, #1000 ; 0x3e8 + 8001870: f000 fd04 bl 800227c + for(uint16_t i = 1; i < 9; i++ ){ + 8001874: 2301 movs r3, #1 + 8001876: 82bb strh r3, [r7, #20] + 8001878: e010 b.n 800189c + data[i-1] = readeeprom(i*3); + 800187a: 8aba ldrh r2, [r7, #20] + 800187c: 4613 mov r3, r2 + 800187e: 005b lsls r3, r3, #1 + 8001880: 4413 add r3, r2 + 8001882: 4618 mov r0, r3 + 8001884: f000 fa9e bl 8001dc4 + 8001888: 4601 mov r1, r0 + 800188a: 8abb ldrh r3, [r7, #20] + 800188c: 3b01 subs r3, #1 + 800188e: 687a ldr r2, [r7, #4] + 8001890: 4413 add r3, r2 + 8001892: b2ca uxtb r2, r1 + 8001894: 701a strb r2, [r3, #0] + for(uint16_t i = 1; i < 9; i++ ){ + 8001896: 8abb ldrh r3, [r7, #20] + 8001898: 3301 adds r3, #1 + 800189a: 82bb strh r3, [r7, #20] + 800189c: 8abb ldrh r3, [r7, #20] + 800189e: 2b08 cmp r3, #8 + 80018a0: d9eb bls.n 800187a + } + canTestSendAnswer(data); + 80018a2: 6878 ldr r0, [r7, #4] + 80018a4: f7ff fef8 bl 8001698 + break; + 80018a8: e02b b.n 8001902 + case BALANCING_TEST: + HAL_Delay(1000); + 80018aa: f44f 707a mov.w r0, #1000 ; 0x3e8 + 80018ae: f000 fce5 bl 800227c + for(int i = 0; i < 17; i++){ + 80018b2: 2300 movs r3, #0 + 80018b4: 613b str r3, [r7, #16] + 80018b6: e010 b.n 80018da + amsConfigBalancing(0x00001< + amsStartBalancing(10); + 80018c6: 200a movs r0, #10 + 80018c8: f7fe fe31 bl 800052e + HAL_Delay(1000); + 80018cc: f44f 707a mov.w r0, #1000 ; 0x3e8 + 80018d0: f000 fcd4 bl 800227c + for(int i = 0; i < 17; i++){ + 80018d4: 693b ldr r3, [r7, #16] + 80018d6: 3301 adds r3, #1 + 80018d8: 613b str r3, [r7, #16] + 80018da: 693b ldr r3, [r7, #16] + 80018dc: 2b10 cmp r3, #16 + 80018de: ddeb ble.n 80018b8 + } + HAL_Delay(1000); + 80018e0: f44f 707a mov.w r0, #1000 ; 0x3e8 + 80018e4: f000 fcca bl 800227c + amsConfigBalancing(0x1FFFF); + 80018e8: 480a ldr r0, [pc, #40] ; (8001914 ) + 80018ea: f7fe fdcb bl 8000484 + amsStartBalancing(10); + 80018ee: 200a movs r0, #10 + 80018f0: f7fe fe1d bl 800052e + HAL_Delay(1000); + 80018f4: f44f 707a mov.w r0, #1000 ; 0x3e8 + 80018f8: f000 fcc0 bl 800227c + amsStopBalancing(); + 80018fc: f7fe fe26 bl 800054c + break; + 8001900: bf00 nop + + } + resetData(data); + 8001902: 6878 ldr r0, [r7, #4] + 8001904: f7ff fef2 bl 80016ec +} + 8001908: bf00 nop + 800190a: 3718 adds r7, #24 + 800190c: 46bd mov sp, r7 + 800190e: bd80 pop {r7, pc} + 8001910: 20000098 .word 0x20000098 + 8001914: 0001ffff .word 0x0001ffff + +08001918

: +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + 8001918: b580 push {r7, lr} + 800191a: b088 sub sp, #32 + 800191c: af00 add r7, sp, #0 + /* USER CODE END 1 */ + + /* MCU Configuration--------------------------------------------------------*/ + + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + 800191e: f000 fc47 bl 80021b0 + /* USER CODE BEGIN Init */ + + /* USER CODE END Init */ + + /* Configure the system clock */ + SystemClock_Config(); + 8001922: f000 f853 bl 80019cc + /* USER CODE BEGIN SysInit */ + + /* USER CODE END SysInit */ + + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + 8001926: f000 f99b bl 8001c60 + MX_CAN_Init(); + 800192a: f000 f8a5 bl 8001a78 + MX_I2C1_Init(); + 800192e: f000 f8d9 bl 8001ae4 + MX_I2C2_Init(); + 8001932: f000 f917 bl 8001b64 + MX_SPI1_Init(); + 8001936: f000 f955 bl 8001be4 + /* USER CODE BEGIN 2 */ + // eepromInitParameters(); + for (int i = 0; i < N_SENSORS; i++) { + 800193a: 2300 movs r3, #0 + 800193c: 61fb str r3, [r7, #28] + 800193e: e00d b.n 800195c + if (sensor_init(i) != HAL_OK) { + 8001940: 69f8 ldr r0, [r7, #28] + 8001942: f000 f9f1 bl 8001d28 + 8001946: 4603 mov r3, r0 + 8001948: 2b00 cmp r3, #0 + 800194a: d004 beq.n 8001956 + last_error = HAL_GetTick(); + 800194c: f000 fc8a bl 8002264 + 8001950: 4603 mov r3, r0 + 8001952: 4a1a ldr r2, [pc, #104] ; (80019bc ) + 8001954: 6013 str r3, [r2, #0] + for (int i = 0; i < N_SENSORS; i++) { + 8001956: 69fb ldr r3, [r7, #28] + 8001958: 3301 adds r3, #1 + 800195a: 61fb str r3, [r7, #28] + 800195c: 69fb ldr r3, [r7, #28] + 800195e: 2b0b cmp r3, #11 + 8001960: ddee ble.n 8001940 + } + } + + AMS_Init(&hspi1); + 8001962: 4817 ldr r0, [pc, #92] ; (80019c0 ) + 8001964: f7ff fc8c bl 8001280 + ams_can_init(&hcan, &hcan); + 8001968: 4916 ldr r1, [pc, #88] ; (80019c4 ) + 800196a: 4816 ldr r0, [pc, #88] ; (80019c4 ) + 800196c: f7ff fb4e bl 800100c +// HAL_TIM_Base_Start(&htim2); + /* USER CODE END 2 */ + + /* Infinite loop */ + /* USER CODE BEGIN WHILE */ + writeeeprom(1, 69); + 8001970: 2145 movs r1, #69 ; 0x45 + 8001972: 2001 movs r0, #1 + 8001974: f000 fa42 bl 8001dfc + uint16_t temperatures[N_SENSORS]; + AMS_Loop(); + 8001978: f7ff fcb8 bl 80012ec + while (1){ + if(BMS_IN_TEST_MODE == 1 ){ ////&& PENDING_MESSAGE_HANDLE == 1 + testLoop(&canTestData); + 800197c: 4812 ldr r0, [pc, #72] ; (80019c8 ) + 800197e: f7ff ff23 bl 80017c8 + /* USER CODE END WHILE */ + /* USER CODE BEGIN 3 */ + + for (int i = 0; i < N_SENSORS; i++) { + 8001982: 2300 movs r3, #0 + 8001984: 61bb str r3, [r7, #24] + 8001986: e015 b.n 80019b4 + if (sensor_read(i, &temperatures[i]) != HAL_OK) { + 8001988: 463a mov r2, r7 + 800198a: 69bb ldr r3, [r7, #24] + 800198c: 005b lsls r3, r3, #1 + 800198e: 4413 add r3, r2 + 8001990: 4619 mov r1, r3 + 8001992: 69b8 ldr r0, [r7, #24] + 8001994: f000 f9e6 bl 8001d64 + 8001998: 4603 mov r3, r0 + 800199a: 2b00 cmp r3, #0 + 800199c: d007 beq.n 80019ae + sensor_init(i); + 800199e: 69b8 ldr r0, [r7, #24] + 80019a0: f000 f9c2 bl 8001d28 + last_error = HAL_GetTick(); + 80019a4: f000 fc5e bl 8002264 + 80019a8: 4603 mov r3, r0 + 80019aa: 4a04 ldr r2, [pc, #16] ; (80019bc ) + 80019ac: 6013 str r3, [r2, #0] + for (int i = 0; i < N_SENSORS; i++) { + 80019ae: 69bb ldr r3, [r7, #24] + 80019b0: 3301 adds r3, #1 + 80019b2: 61bb str r3, [r7, #24] + 80019b4: 69bb ldr r3, [r7, #24] + 80019b6: 2b0b cmp r3, #11 + 80019b8: dde6 ble.n 8001988 + if(BMS_IN_TEST_MODE == 1 ){ ////&& PENDING_MESSAGE_HANDLE == 1 + 80019ba: e7df b.n 800197c + 80019bc: 20000268 .word 0x20000268 + 80019c0: 20000204 .word 0x20000204 + 80019c4: 20000144 .word 0x20000144 + 80019c8: 20000044 .word 0x20000044 + +080019cc : +/** + * @brief System Clock Configuration + * @retval None + */ +void SystemClock_Config(void) +{ + 80019cc: b580 push {r7, lr} + 80019ce: b09c sub sp, #112 ; 0x70 + 80019d0: af00 add r7, sp, #0 + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + 80019d2: f107 0348 add.w r3, r7, #72 ; 0x48 + 80019d6: 2228 movs r2, #40 ; 0x28 + 80019d8: 2100 movs r1, #0 + 80019da: 4618 mov r0, r3 + 80019dc: f004 fd6c bl 80064b8 + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + 80019e0: f107 0334 add.w r3, r7, #52 ; 0x34 + 80019e4: 2200 movs r2, #0 + 80019e6: 601a str r2, [r3, #0] + 80019e8: 605a str r2, [r3, #4] + 80019ea: 609a str r2, [r3, #8] + 80019ec: 60da str r2, [r3, #12] + 80019ee: 611a str r2, [r3, #16] + RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; + 80019f0: 463b mov r3, r7 + 80019f2: 2234 movs r2, #52 ; 0x34 + 80019f4: 2100 movs r1, #0 + 80019f6: 4618 mov r0, r3 + 80019f8: f004 fd5e bl 80064b8 + + /** Initializes the RCC Oscillators according to the specified parameters + * in the RCC_OscInitTypeDef structure. + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE; + 80019fc: 2303 movs r3, #3 + 80019fe: 64bb str r3, [r7, #72] ; 0x48 + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + 8001a00: f44f 3380 mov.w r3, #65536 ; 0x10000 + 8001a04: 64fb str r3, [r7, #76] ; 0x4c + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + 8001a06: 2301 movs r3, #1 + 8001a08: 65bb str r3, [r7, #88] ; 0x58 + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + 8001a0a: 2310 movs r3, #16 + 8001a0c: 65fb str r3, [r7, #92] ; 0x5c + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; + 8001a0e: 2300 movs r3, #0 + 8001a10: 667b str r3, [r7, #100] ; 0x64 + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + 8001a12: f107 0348 add.w r3, r7, #72 ; 0x48 + 8001a16: 4618 mov r0, r3 + 8001a18: f002 fd50 bl 80044bc + 8001a1c: 4603 mov r3, r0 + 8001a1e: 2b00 cmp r3, #0 + 8001a20: d001 beq.n 8001a26 + { + Error_Handler(); + 8001a22: f000 fa09 bl 8001e38 + } + + /** Initializes the CPU, AHB and APB buses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + 8001a26: 230f movs r3, #15 + 8001a28: 637b str r3, [r7, #52] ; 0x34 + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE; + 8001a2a: 2301 movs r3, #1 + 8001a2c: 63bb str r3, [r7, #56] ; 0x38 + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + 8001a2e: 2300 movs r3, #0 + 8001a30: 63fb str r3, [r7, #60] ; 0x3c + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; + 8001a32: 2300 movs r3, #0 + 8001a34: 643b str r3, [r7, #64] ; 0x40 + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + 8001a36: 2300 movs r3, #0 + 8001a38: 647b str r3, [r7, #68] ; 0x44 + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) + 8001a3a: f107 0334 add.w r3, r7, #52 ; 0x34 + 8001a3e: 2100 movs r1, #0 + 8001a40: 4618 mov r0, r3 + 8001a42: f003 fd79 bl 8005538 + 8001a46: 4603 mov r3, r0 + 8001a48: 2b00 cmp r3, #0 + 8001a4a: d001 beq.n 8001a50 + { + Error_Handler(); + 8001a4c: f000 f9f4 bl 8001e38 + } + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_I2C1|RCC_PERIPHCLK_I2C2; + 8001a50: 2360 movs r3, #96 ; 0x60 + 8001a52: 603b str r3, [r7, #0] + PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_HSI; + 8001a54: 2300 movs r3, #0 + 8001a56: 61fb str r3, [r7, #28] + PeriphClkInit.I2c2ClockSelection = RCC_I2C2CLKSOURCE_HSI; + 8001a58: 2300 movs r3, #0 + 8001a5a: 623b str r3, [r7, #32] + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) + 8001a5c: 463b mov r3, r7 + 8001a5e: 4618 mov r0, r3 + 8001a60: f003 ff52 bl 8005908 + 8001a64: 4603 mov r3, r0 + 8001a66: 2b00 cmp r3, #0 + 8001a68: d001 beq.n 8001a6e + { + Error_Handler(); + 8001a6a: f000 f9e5 bl 8001e38 + } +} + 8001a6e: bf00 nop + 8001a70: 3770 adds r7, #112 ; 0x70 + 8001a72: 46bd mov sp, r7 + 8001a74: bd80 pop {r7, pc} + ... + +08001a78 : + * @brief CAN Initialization Function + * @param None + * @retval None + */ +static void MX_CAN_Init(void) +{ + 8001a78: b580 push {r7, lr} + 8001a7a: af00 add r7, sp, #0 + /* USER CODE END CAN_Init 0 */ + + /* USER CODE BEGIN CAN_Init 1 */ + + /* USER CODE END CAN_Init 1 */ + hcan.Instance = CAN; + 8001a7c: 4b17 ldr r3, [pc, #92] ; (8001adc ) + 8001a7e: 4a18 ldr r2, [pc, #96] ; (8001ae0 ) + 8001a80: 601a str r2, [r3, #0] + hcan.Init.Prescaler = 2; + 8001a82: 4b16 ldr r3, [pc, #88] ; (8001adc ) + 8001a84: 2202 movs r2, #2 + 8001a86: 605a str r2, [r3, #4] + hcan.Init.Mode = CAN_MODE_NORMAL; + 8001a88: 4b14 ldr r3, [pc, #80] ; (8001adc ) + 8001a8a: 2200 movs r2, #0 + 8001a8c: 609a str r2, [r3, #8] + hcan.Init.SyncJumpWidth = CAN_SJW_1TQ; + 8001a8e: 4b13 ldr r3, [pc, #76] ; (8001adc ) + 8001a90: 2200 movs r2, #0 + 8001a92: 60da str r2, [r3, #12] + hcan.Init.TimeSeg1 = CAN_BS1_13TQ; + 8001a94: 4b11 ldr r3, [pc, #68] ; (8001adc ) + 8001a96: f44f 2240 mov.w r2, #786432 ; 0xc0000 + 8001a9a: 611a str r2, [r3, #16] + hcan.Init.TimeSeg2 = CAN_BS2_2TQ; + 8001a9c: 4b0f ldr r3, [pc, #60] ; (8001adc ) + 8001a9e: f44f 1280 mov.w r2, #1048576 ; 0x100000 + 8001aa2: 615a str r2, [r3, #20] + hcan.Init.TimeTriggeredMode = DISABLE; + 8001aa4: 4b0d ldr r3, [pc, #52] ; (8001adc ) + 8001aa6: 2200 movs r2, #0 + 8001aa8: 761a strb r2, [r3, #24] + hcan.Init.AutoBusOff = ENABLE; + 8001aaa: 4b0c ldr r3, [pc, #48] ; (8001adc ) + 8001aac: 2201 movs r2, #1 + 8001aae: 765a strb r2, [r3, #25] + hcan.Init.AutoWakeUp = DISABLE; + 8001ab0: 4b0a ldr r3, [pc, #40] ; (8001adc ) + 8001ab2: 2200 movs r2, #0 + 8001ab4: 769a strb r2, [r3, #26] + hcan.Init.AutoRetransmission = ENABLE; + 8001ab6: 4b09 ldr r3, [pc, #36] ; (8001adc ) + 8001ab8: 2201 movs r2, #1 + 8001aba: 76da strb r2, [r3, #27] + hcan.Init.ReceiveFifoLocked = DISABLE; + 8001abc: 4b07 ldr r3, [pc, #28] ; (8001adc ) + 8001abe: 2200 movs r2, #0 + 8001ac0: 771a strb r2, [r3, #28] + hcan.Init.TransmitFifoPriority = DISABLE; + 8001ac2: 4b06 ldr r3, [pc, #24] ; (8001adc ) + 8001ac4: 2200 movs r2, #0 + 8001ac6: 775a strb r2, [r3, #29] + if (HAL_CAN_Init(&hcan) != HAL_OK) + 8001ac8: 4804 ldr r0, [pc, #16] ; (8001adc ) + 8001aca: f000 fbfb bl 80022c4 + 8001ace: 4603 mov r3, r0 + 8001ad0: 2b00 cmp r3, #0 + 8001ad2: d001 beq.n 8001ad8 + { + Error_Handler(); + 8001ad4: f000 f9b0 bl 8001e38 + } + /* USER CODE BEGIN CAN_Init 2 */ + + /* USER CODE END CAN_Init 2 */ + +} + 8001ad8: bf00 nop + 8001ada: bd80 pop {r7, pc} + 8001adc: 20000144 .word 0x20000144 + 8001ae0: 40006400 .word 0x40006400 + +08001ae4 : + * @brief I2C1 Initialization Function + * @param None + * @retval None + */ +static void MX_I2C1_Init(void) +{ + 8001ae4: b580 push {r7, lr} + 8001ae6: af00 add r7, sp, #0 + /* USER CODE END I2C1_Init 0 */ + + /* USER CODE BEGIN I2C1_Init 1 */ + + /* USER CODE END I2C1_Init 1 */ + hi2c1.Instance = I2C1; + 8001ae8: 4b1b ldr r3, [pc, #108] ; (8001b58 ) + 8001aea: 4a1c ldr r2, [pc, #112] ; (8001b5c ) + 8001aec: 601a str r2, [r3, #0] + hi2c1.Init.Timing = 0x2000090E; + 8001aee: 4b1a ldr r3, [pc, #104] ; (8001b58 ) + 8001af0: 4a1b ldr r2, [pc, #108] ; (8001b60 ) + 8001af2: 605a str r2, [r3, #4] + hi2c1.Init.OwnAddress1 = 0; + 8001af4: 4b18 ldr r3, [pc, #96] ; (8001b58 ) + 8001af6: 2200 movs r2, #0 + 8001af8: 609a str r2, [r3, #8] + hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; + 8001afa: 4b17 ldr r3, [pc, #92] ; (8001b58 ) + 8001afc: 2201 movs r2, #1 + 8001afe: 60da str r2, [r3, #12] + hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; + 8001b00: 4b15 ldr r3, [pc, #84] ; (8001b58 ) + 8001b02: 2200 movs r2, #0 + 8001b04: 611a str r2, [r3, #16] + hi2c1.Init.OwnAddress2 = 0; + 8001b06: 4b14 ldr r3, [pc, #80] ; (8001b58 ) + 8001b08: 2200 movs r2, #0 + 8001b0a: 615a str r2, [r3, #20] + hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK; + 8001b0c: 4b12 ldr r3, [pc, #72] ; (8001b58 ) + 8001b0e: 2200 movs r2, #0 + 8001b10: 619a str r2, [r3, #24] + hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; + 8001b12: 4b11 ldr r3, [pc, #68] ; (8001b58 ) + 8001b14: 2200 movs r2, #0 + 8001b16: 61da str r2, [r3, #28] + hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; + 8001b18: 4b0f ldr r3, [pc, #60] ; (8001b58 ) + 8001b1a: 2200 movs r2, #0 + 8001b1c: 621a str r2, [r3, #32] + if (HAL_I2C_Init(&hi2c1) != HAL_OK) + 8001b1e: 480e ldr r0, [pc, #56] ; (8001b58 ) + 8001b20: f001 fcf4 bl 800350c + 8001b24: 4603 mov r3, r0 + 8001b26: 2b00 cmp r3, #0 + 8001b28: d001 beq.n 8001b2e + { + Error_Handler(); + 8001b2a: f000 f985 bl 8001e38 + } + + /** Configure Analogue filter + */ + if (HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK) + 8001b2e: 2100 movs r1, #0 + 8001b30: 4809 ldr r0, [pc, #36] ; (8001b58 ) + 8001b32: f002 fc2b bl 800438c + 8001b36: 4603 mov r3, r0 + 8001b38: 2b00 cmp r3, #0 + 8001b3a: d001 beq.n 8001b40 + { + Error_Handler(); + 8001b3c: f000 f97c bl 8001e38 + } + + /** Configure Digital filter + */ + if (HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0) != HAL_OK) + 8001b40: 2100 movs r1, #0 + 8001b42: 4805 ldr r0, [pc, #20] ; (8001b58 ) + 8001b44: f002 fc6d bl 8004422 + 8001b48: 4603 mov r3, r0 + 8001b4a: 2b00 cmp r3, #0 + 8001b4c: d001 beq.n 8001b52 + { + Error_Handler(); + 8001b4e: f000 f973 bl 8001e38 + } + /* USER CODE BEGIN I2C1_Init 2 */ + + /* USER CODE END I2C1_Init 2 */ + +} + 8001b52: bf00 nop + 8001b54: bd80 pop {r7, pc} + 8001b56: bf00 nop + 8001b58: 2000016c .word 0x2000016c + 8001b5c: 40005400 .word 0x40005400 + 8001b60: 2000090e .word 0x2000090e + +08001b64 : + * @brief I2C2 Initialization Function + * @param None + * @retval None + */ +static void MX_I2C2_Init(void) +{ + 8001b64: b580 push {r7, lr} + 8001b66: af00 add r7, sp, #0 + /* USER CODE END I2C2_Init 0 */ + + /* USER CODE BEGIN I2C2_Init 1 */ + + /* USER CODE END I2C2_Init 1 */ + hi2c2.Instance = I2C2; + 8001b68: 4b1b ldr r3, [pc, #108] ; (8001bd8 ) + 8001b6a: 4a1c ldr r2, [pc, #112] ; (8001bdc ) + 8001b6c: 601a str r2, [r3, #0] + hi2c2.Init.Timing = 0x2000090E; + 8001b6e: 4b1a ldr r3, [pc, #104] ; (8001bd8 ) + 8001b70: 4a1b ldr r2, [pc, #108] ; (8001be0 ) + 8001b72: 605a str r2, [r3, #4] + hi2c2.Init.OwnAddress1 = 0; + 8001b74: 4b18 ldr r3, [pc, #96] ; (8001bd8 ) + 8001b76: 2200 movs r2, #0 + 8001b78: 609a str r2, [r3, #8] + hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; + 8001b7a: 4b17 ldr r3, [pc, #92] ; (8001bd8 ) + 8001b7c: 2201 movs r2, #1 + 8001b7e: 60da str r2, [r3, #12] + hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; + 8001b80: 4b15 ldr r3, [pc, #84] ; (8001bd8 ) + 8001b82: 2200 movs r2, #0 + 8001b84: 611a str r2, [r3, #16] + hi2c2.Init.OwnAddress2 = 0; + 8001b86: 4b14 ldr r3, [pc, #80] ; (8001bd8 ) + 8001b88: 2200 movs r2, #0 + 8001b8a: 615a str r2, [r3, #20] + hi2c2.Init.OwnAddress2Masks = I2C_OA2_NOMASK; + 8001b8c: 4b12 ldr r3, [pc, #72] ; (8001bd8 ) + 8001b8e: 2200 movs r2, #0 + 8001b90: 619a str r2, [r3, #24] + hi2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; + 8001b92: 4b11 ldr r3, [pc, #68] ; (8001bd8 ) + 8001b94: 2200 movs r2, #0 + 8001b96: 61da str r2, [r3, #28] + hi2c2.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; + 8001b98: 4b0f ldr r3, [pc, #60] ; (8001bd8 ) + 8001b9a: 2200 movs r2, #0 + 8001b9c: 621a str r2, [r3, #32] + if (HAL_I2C_Init(&hi2c2) != HAL_OK) + 8001b9e: 480e ldr r0, [pc, #56] ; (8001bd8 ) + 8001ba0: f001 fcb4 bl 800350c + 8001ba4: 4603 mov r3, r0 + 8001ba6: 2b00 cmp r3, #0 + 8001ba8: d001 beq.n 8001bae + { + Error_Handler(); + 8001baa: f000 f945 bl 8001e38 + } + + /** Configure Analogue filter + */ + if (HAL_I2CEx_ConfigAnalogFilter(&hi2c2, I2C_ANALOGFILTER_ENABLE) != HAL_OK) + 8001bae: 2100 movs r1, #0 + 8001bb0: 4809 ldr r0, [pc, #36] ; (8001bd8 ) + 8001bb2: f002 fbeb bl 800438c + 8001bb6: 4603 mov r3, r0 + 8001bb8: 2b00 cmp r3, #0 + 8001bba: d001 beq.n 8001bc0 + { + Error_Handler(); + 8001bbc: f000 f93c bl 8001e38 + } + + /** Configure Digital filter + */ + if (HAL_I2CEx_ConfigDigitalFilter(&hi2c2, 0) != HAL_OK) + 8001bc0: 2100 movs r1, #0 + 8001bc2: 4805 ldr r0, [pc, #20] ; (8001bd8 ) + 8001bc4: f002 fc2d bl 8004422 + 8001bc8: 4603 mov r3, r0 + 8001bca: 2b00 cmp r3, #0 + 8001bcc: d001 beq.n 8001bd2 + { + Error_Handler(); + 8001bce: f000 f933 bl 8001e38 + } + /* USER CODE BEGIN I2C2_Init 2 */ + + /* USER CODE END I2C2_Init 2 */ + +} + 8001bd2: bf00 nop + 8001bd4: bd80 pop {r7, pc} + 8001bd6: bf00 nop + 8001bd8: 200001b8 .word 0x200001b8 + 8001bdc: 40005800 .word 0x40005800 + 8001be0: 2000090e .word 0x2000090e + +08001be4 : + * @brief SPI1 Initialization Function + * @param None + * @retval None + */ +static void MX_SPI1_Init(void) +{ + 8001be4: b580 push {r7, lr} + 8001be6: af00 add r7, sp, #0 + + /* USER CODE BEGIN SPI1_Init 1 */ + + /* USER CODE END SPI1_Init 1 */ + /* SPI1 parameter configuration*/ + hspi1.Instance = SPI1; + 8001be8: 4b1b ldr r3, [pc, #108] ; (8001c58 ) + 8001bea: 4a1c ldr r2, [pc, #112] ; (8001c5c ) + 8001bec: 601a str r2, [r3, #0] + hspi1.Init.Mode = SPI_MODE_MASTER; + 8001bee: 4b1a ldr r3, [pc, #104] ; (8001c58 ) + 8001bf0: f44f 7282 mov.w r2, #260 ; 0x104 + 8001bf4: 605a str r2, [r3, #4] + hspi1.Init.Direction = SPI_DIRECTION_2LINES; + 8001bf6: 4b18 ldr r3, [pc, #96] ; (8001c58 ) + 8001bf8: 2200 movs r2, #0 + 8001bfa: 609a str r2, [r3, #8] + hspi1.Init.DataSize = SPI_DATASIZE_8BIT; + 8001bfc: 4b16 ldr r3, [pc, #88] ; (8001c58 ) + 8001bfe: f44f 62e0 mov.w r2, #1792 ; 0x700 + 8001c02: 60da str r2, [r3, #12] + hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; + 8001c04: 4b14 ldr r3, [pc, #80] ; (8001c58 ) + 8001c06: 2200 movs r2, #0 + 8001c08: 611a str r2, [r3, #16] + hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; + 8001c0a: 4b13 ldr r3, [pc, #76] ; (8001c58 ) + 8001c0c: 2200 movs r2, #0 + 8001c0e: 615a str r2, [r3, #20] + hspi1.Init.NSS = SPI_NSS_SOFT; + 8001c10: 4b11 ldr r3, [pc, #68] ; (8001c58 ) + 8001c12: f44f 7200 mov.w r2, #512 ; 0x200 + 8001c16: 619a str r2, [r3, #24] + hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32; + 8001c18: 4b0f ldr r3, [pc, #60] ; (8001c58 ) + 8001c1a: 2220 movs r2, #32 + 8001c1c: 61da str r2, [r3, #28] + hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; + 8001c1e: 4b0e ldr r3, [pc, #56] ; (8001c58 ) + 8001c20: 2200 movs r2, #0 + 8001c22: 621a str r2, [r3, #32] + hspi1.Init.TIMode = SPI_TIMODE_DISABLE; + 8001c24: 4b0c ldr r3, [pc, #48] ; (8001c58 ) + 8001c26: 2200 movs r2, #0 + 8001c28: 625a str r2, [r3, #36] ; 0x24 + hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + 8001c2a: 4b0b ldr r3, [pc, #44] ; (8001c58 ) + 8001c2c: 2200 movs r2, #0 + 8001c2e: 629a str r2, [r3, #40] ; 0x28 + hspi1.Init.CRCPolynomial = 7; + 8001c30: 4b09 ldr r3, [pc, #36] ; (8001c58 ) + 8001c32: 2207 movs r2, #7 + 8001c34: 62da str r2, [r3, #44] ; 0x2c + hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; + 8001c36: 4b08 ldr r3, [pc, #32] ; (8001c58 ) + 8001c38: 2200 movs r2, #0 + 8001c3a: 631a str r2, [r3, #48] ; 0x30 + hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; + 8001c3c: 4b06 ldr r3, [pc, #24] ; (8001c58 ) + 8001c3e: 2208 movs r2, #8 + 8001c40: 635a str r2, [r3, #52] ; 0x34 + if (HAL_SPI_Init(&hspi1) != HAL_OK) + 8001c42: 4805 ldr r0, [pc, #20] ; (8001c58 ) + 8001c44: f003 fff2 bl 8005c2c + 8001c48: 4603 mov r3, r0 + 8001c4a: 2b00 cmp r3, #0 + 8001c4c: d001 beq.n 8001c52 + { + Error_Handler(); + 8001c4e: f000 f8f3 bl 8001e38 + } + /* USER CODE BEGIN SPI1_Init 2 */ + + /* USER CODE END SPI1_Init 2 */ + +} + 8001c52: bf00 nop + 8001c54: bd80 pop {r7, pc} + 8001c56: bf00 nop + 8001c58: 20000204 .word 0x20000204 + 8001c5c: 40013000 .word 0x40013000 + +08001c60 : + * @brief GPIO Initialization Function + * @param None + * @retval None + */ +static void MX_GPIO_Init(void) +{ + 8001c60: b580 push {r7, lr} + 8001c62: b088 sub sp, #32 + 8001c64: af00 add r7, sp, #0 + GPIO_InitTypeDef GPIO_InitStruct = {0}; + 8001c66: f107 030c add.w r3, r7, #12 + 8001c6a: 2200 movs r2, #0 + 8001c6c: 601a str r2, [r3, #0] + 8001c6e: 605a str r2, [r3, #4] + 8001c70: 609a str r2, [r3, #8] + 8001c72: 60da str r2, [r3, #12] + 8001c74: 611a str r2, [r3, #16] + + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOF_CLK_ENABLE(); + 8001c76: 4b2a ldr r3, [pc, #168] ; (8001d20 ) + 8001c78: 695b ldr r3, [r3, #20] + 8001c7a: 4a29 ldr r2, [pc, #164] ; (8001d20 ) + 8001c7c: f443 0380 orr.w r3, r3, #4194304 ; 0x400000 + 8001c80: 6153 str r3, [r2, #20] + 8001c82: 4b27 ldr r3, [pc, #156] ; (8001d20 ) + 8001c84: 695b ldr r3, [r3, #20] + 8001c86: f403 0380 and.w r3, r3, #4194304 ; 0x400000 + 8001c8a: 60bb str r3, [r7, #8] + 8001c8c: 68bb ldr r3, [r7, #8] + __HAL_RCC_GPIOA_CLK_ENABLE(); + 8001c8e: 4b24 ldr r3, [pc, #144] ; (8001d20 ) + 8001c90: 695b ldr r3, [r3, #20] + 8001c92: 4a23 ldr r2, [pc, #140] ; (8001d20 ) + 8001c94: f443 3300 orr.w r3, r3, #131072 ; 0x20000 + 8001c98: 6153 str r3, [r2, #20] + 8001c9a: 4b21 ldr r3, [pc, #132] ; (8001d20 ) + 8001c9c: 695b ldr r3, [r3, #20] + 8001c9e: f403 3300 and.w r3, r3, #131072 ; 0x20000 + 8001ca2: 607b str r3, [r7, #4] + 8001ca4: 687b ldr r3, [r7, #4] + __HAL_RCC_GPIOB_CLK_ENABLE(); + 8001ca6: 4b1e ldr r3, [pc, #120] ; (8001d20 ) + 8001ca8: 695b ldr r3, [r3, #20] + 8001caa: 4a1d ldr r2, [pc, #116] ; (8001d20 ) + 8001cac: f443 2380 orr.w r3, r3, #262144 ; 0x40000 + 8001cb0: 6153 str r3, [r2, #20] + 8001cb2: 4b1b ldr r3, [pc, #108] ; (8001d20 ) + 8001cb4: 695b ldr r3, [r3, #20] + 8001cb6: f403 2380 and.w r3, r3, #262144 ; 0x40000 + 8001cba: 603b str r3, [r7, #0] + 8001cbc: 683b ldr r3, [r7, #0] + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(GPIOA, CSB_Pin|Status_3_Pin, GPIO_PIN_RESET); + 8001cbe: 2200 movs r2, #0 + 8001cc0: f44f 7188 mov.w r1, #272 ; 0x110 + 8001cc4: f04f 4090 mov.w r0, #1207959552 ; 0x48000000 + 8001cc8: f001 fc08 bl 80034dc + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(GPIOB, Status_0_Pin|Status_1_Pin|Status_2_Pin, GPIO_PIN_RESET); + 8001ccc: 2200 movs r2, #0 + 8001cce: f44f 4160 mov.w r1, #57344 ; 0xe000 + 8001cd2: 4814 ldr r0, [pc, #80] ; (8001d24 ) + 8001cd4: f001 fc02 bl 80034dc + + /*Configure GPIO pins : CSB_Pin Status_3_Pin */ + GPIO_InitStruct.Pin = CSB_Pin|Status_3_Pin; + 8001cd8: f44f 7388 mov.w r3, #272 ; 0x110 + 8001cdc: 60fb str r3, [r7, #12] + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + 8001cde: 2301 movs r3, #1 + 8001ce0: 613b str r3, [r7, #16] + GPIO_InitStruct.Pull = GPIO_NOPULL; + 8001ce2: 2300 movs r3, #0 + 8001ce4: 617b str r3, [r7, #20] + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + 8001ce6: 2300 movs r3, #0 + 8001ce8: 61bb str r3, [r7, #24] + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + 8001cea: f107 030c add.w r3, r7, #12 + 8001cee: 4619 mov r1, r3 + 8001cf0: f04f 4090 mov.w r0, #1207959552 ; 0x48000000 + 8001cf4: f001 fa78 bl 80031e8 + + /*Configure GPIO pins : Status_0_Pin Status_1_Pin Status_2_Pin */ + GPIO_InitStruct.Pin = Status_0_Pin|Status_1_Pin|Status_2_Pin; + 8001cf8: f44f 4360 mov.w r3, #57344 ; 0xe000 + 8001cfc: 60fb str r3, [r7, #12] + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + 8001cfe: 2301 movs r3, #1 + 8001d00: 613b str r3, [r7, #16] + GPIO_InitStruct.Pull = GPIO_NOPULL; + 8001d02: 2300 movs r3, #0 + 8001d04: 617b str r3, [r7, #20] + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + 8001d06: 2300 movs r3, #0 + 8001d08: 61bb str r3, [r7, #24] + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + 8001d0a: f107 030c add.w r3, r7, #12 + 8001d0e: 4619 mov r1, r3 + 8001d10: 4804 ldr r0, [pc, #16] ; (8001d24 ) + 8001d12: f001 fa69 bl 80031e8 + +} + 8001d16: bf00 nop + 8001d18: 3720 adds r7, #32 + 8001d1a: 46bd mov sp, r7 + 8001d1c: bd80 pop {r7, pc} + 8001d1e: bf00 nop + 8001d20: 40021000 .word 0x40021000 + 8001d24: 48000400 .word 0x48000400 + +08001d28 : + +/* USER CODE BEGIN 4 */ +HAL_StatusTypeDef sensor_init(int n) { + 8001d28: b580 push {r7, lr} + 8001d2a: b086 sub sp, #24 + 8001d2c: af02 add r7, sp, #8 + 8001d2e: 6078 str r0, [r7, #4] + uint16_t addr = (0b1000000 | n) << 1; + 8001d30: 687b ldr r3, [r7, #4] + 8001d32: 005b lsls r3, r3, #1 + 8001d34: b21b sxth r3, r3 + 8001d36: f043 0380 orr.w r3, r3, #128 ; 0x80 + 8001d3a: b21b sxth r3, r3 + 8001d3c: 81fb strh r3, [r7, #14] + uint8_t data[] = {0}; + 8001d3e: 2300 movs r3, #0 + 8001d40: 733b strb r3, [r7, #12] + return HAL_I2C_Master_Transmit(&hi2c1, addr, data, sizeof(data), 100); + 8001d42: f107 020c add.w r2, r7, #12 + 8001d46: 89f9 ldrh r1, [r7, #14] + 8001d48: 2364 movs r3, #100 ; 0x64 + 8001d4a: 9300 str r3, [sp, #0] + 8001d4c: 2301 movs r3, #1 + 8001d4e: 4804 ldr r0, [pc, #16] ; (8001d60 ) + 8001d50: f001 fc6c bl 800362c + 8001d54: 4603 mov r3, r0 +} + 8001d56: 4618 mov r0, r3 + 8001d58: 3710 adds r7, #16 + 8001d5a: 46bd mov sp, r7 + 8001d5c: bd80 pop {r7, pc} + 8001d5e: bf00 nop + 8001d60: 2000016c .word 0x2000016c + +08001d64 : + +HAL_StatusTypeDef sensor_read(int n, uint16_t *res) { + 8001d64: b580 push {r7, lr} + 8001d66: b086 sub sp, #24 + 8001d68: af02 add r7, sp, #8 + 8001d6a: 6078 str r0, [r7, #4] + 8001d6c: 6039 str r1, [r7, #0] + uint16_t addr = (0b1000000 | n) << 1; + 8001d6e: 687b ldr r3, [r7, #4] + 8001d70: 005b lsls r3, r3, #1 + 8001d72: b21b sxth r3, r3 + 8001d74: f043 0380 orr.w r3, r3, #128 ; 0x80 + 8001d78: b21b sxth r3, r3 + 8001d7a: 81fb strh r3, [r7, #14] + addr |= 1; // Read + 8001d7c: 89fb ldrh r3, [r7, #14] + 8001d7e: f043 0301 orr.w r3, r3, #1 + 8001d82: 81fb strh r3, [r7, #14] + uint8_t result[2]; + HAL_StatusTypeDef status = + HAL_I2C_Master_Receive(&hi2c1, addr, result, sizeof(result), 100); + 8001d84: f107 0208 add.w r2, r7, #8 + 8001d88: 89f9 ldrh r1, [r7, #14] + 8001d8a: 2364 movs r3, #100 ; 0x64 + 8001d8c: 9300 str r3, [sp, #0] + 8001d8e: 2302 movs r3, #2 + 8001d90: 480b ldr r0, [pc, #44] ; (8001dc0 ) + 8001d92: f001 fd3f bl 8003814 + 8001d96: 4603 mov r3, r0 + 8001d98: 737b strb r3, [r7, #13] + if (status == HAL_OK) { + 8001d9a: 7b7b ldrb r3, [r7, #13] + 8001d9c: 2b00 cmp r3, #0 + 8001d9e: d109 bne.n 8001db4 + *res = (result[0] << 8) | result[1]; + 8001da0: 7a3b ldrb r3, [r7, #8] + 8001da2: 021b lsls r3, r3, #8 + 8001da4: b21a sxth r2, r3 + 8001da6: 7a7b ldrb r3, [r7, #9] + 8001da8: b21b sxth r3, r3 + 8001daa: 4313 orrs r3, r2 + 8001dac: b21b sxth r3, r3 + 8001dae: b29a uxth r2, r3 + 8001db0: 683b ldr r3, [r7, #0] + 8001db2: 801a strh r2, [r3, #0] + } + return status; + 8001db4: 7b7b ldrb r3, [r7, #13] +} + 8001db6: 4618 mov r0, r3 + 8001db8: 3710 adds r7, #16 + 8001dba: 46bd mov sp, r7 + 8001dbc: bd80 pop {r7, pc} + 8001dbe: bf00 nop + 8001dc0: 2000016c .word 0x2000016c + +08001dc4 : + +uint8_t readeeprom(uint16_t address){ + 8001dc4: b580 push {r7, lr} + 8001dc6: b088 sub sp, #32 + 8001dc8: af04 add r7, sp, #16 + 8001dca: 4603 mov r3, r0 + 8001dcc: 80fb strh r3, [r7, #6] + uint8_t data = 0; + 8001dce: 2300 movs r3, #0 + 8001dd0: 73fb strb r3, [r7, #15] + //uint8_t* address2 = (uint8_t*) &address; + //HAL_I2C_Master_Transmit(&hi2c2, 0xA0, address2, 2, 1000); + //HAL_I2C_Master_Receive(&hi2c2, 0xA0, &data, 1, 1000); + HAL_I2C_Mem_Read(&hi2c2, 0xA0, address, 2, &data, 1 , 1000); + 8001dd2: 88fa ldrh r2, [r7, #6] + 8001dd4: f44f 737a mov.w r3, #1000 ; 0x3e8 + 8001dd8: 9302 str r3, [sp, #8] + 8001dda: 2301 movs r3, #1 + 8001ddc: 9301 str r3, [sp, #4] + 8001dde: f107 030f add.w r3, r7, #15 + 8001de2: 9300 str r3, [sp, #0] + 8001de4: 2302 movs r3, #2 + 8001de6: 21a0 movs r1, #160 ; 0xa0 + 8001de8: 4803 ldr r0, [pc, #12] ; (8001df8 ) + 8001dea: f001 ff1d bl 8003c28 + //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) + return data; + 8001dee: 7bfb ldrb r3, [r7, #15] +} + 8001df0: 4618 mov r0, r3 + 8001df2: 3710 adds r7, #16 + 8001df4: 46bd mov sp, r7 + 8001df6: bd80 pop {r7, pc} + 8001df8: 200001b8 .word 0x200001b8 + +08001dfc : + +void writeeeprom(uint16_t address, uint8_t data){ + 8001dfc: b580 push {r7, lr} + 8001dfe: b086 sub sp, #24 + 8001e00: af04 add r7, sp, #16 + 8001e02: 4603 mov r3, r0 + 8001e04: 460a mov r2, r1 + 8001e06: 80fb strh r3, [r7, #6] + 8001e08: 4613 mov r3, r2 + 8001e0a: 717b strb r3, [r7, #5] + HAL_I2C_Mem_Write(&hi2c2, 0xA0, address, 2, &data, 1, 1000); + 8001e0c: 88fa ldrh r2, [r7, #6] + 8001e0e: f44f 737a mov.w r3, #1000 ; 0x3e8 + 8001e12: 9302 str r3, [sp, #8] + 8001e14: 2301 movs r3, #1 + 8001e16: 9301 str r3, [sp, #4] + 8001e18: 1d7b adds r3, r7, #5 + 8001e1a: 9300 str r3, [sp, #0] + 8001e1c: 2302 movs r3, #2 + 8001e1e: 21a0 movs r1, #160 ; 0xa0 + 8001e20: 4804 ldr r0, [pc, #16] ; (8001e34 ) + 8001e22: f001 fded bl 8003a00 + HAL_Delay(5); + 8001e26: 2005 movs r0, #5 + 8001e28: f000 fa28 bl 800227c +} + 8001e2c: bf00 nop + 8001e2e: 3708 adds r7, #8 + 8001e30: 46bd mov sp, r7 + 8001e32: bd80 pop {r7, pc} + 8001e34: 200001b8 .word 0x200001b8 + +08001e38 : +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + 8001e38: b480 push {r7} + 8001e3a: af00 add r7, sp, #0 + \details Disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __disable_irq(void) +{ + __ASM volatile ("cpsid i" : : : "memory"); + 8001e3c: b672 cpsid i +} + 8001e3e: bf00 nop + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + __disable_irq(); + while (1) + 8001e40: e7fe b.n 8001e40 + ... + +08001e44 : +/* USER CODE END 0 */ +/** + * Initializes the Global MSP. + */ +void HAL_MspInit(void) +{ + 8001e44: b480 push {r7} + 8001e46: b083 sub sp, #12 + 8001e48: af00 add r7, sp, #0 + /* USER CODE BEGIN MspInit 0 */ + + /* USER CODE END MspInit 0 */ + + __HAL_RCC_SYSCFG_CLK_ENABLE(); + 8001e4a: 4b0f ldr r3, [pc, #60] ; (8001e88 ) + 8001e4c: 699b ldr r3, [r3, #24] + 8001e4e: 4a0e ldr r2, [pc, #56] ; (8001e88 ) + 8001e50: f043 0301 orr.w r3, r3, #1 + 8001e54: 6193 str r3, [r2, #24] + 8001e56: 4b0c ldr r3, [pc, #48] ; (8001e88 ) + 8001e58: 699b ldr r3, [r3, #24] + 8001e5a: f003 0301 and.w r3, r3, #1 + 8001e5e: 607b str r3, [r7, #4] + 8001e60: 687b ldr r3, [r7, #4] + __HAL_RCC_PWR_CLK_ENABLE(); + 8001e62: 4b09 ldr r3, [pc, #36] ; (8001e88 ) + 8001e64: 69db ldr r3, [r3, #28] + 8001e66: 4a08 ldr r2, [pc, #32] ; (8001e88 ) + 8001e68: f043 5380 orr.w r3, r3, #268435456 ; 0x10000000 + 8001e6c: 61d3 str r3, [r2, #28] + 8001e6e: 4b06 ldr r3, [pc, #24] ; (8001e88 ) + 8001e70: 69db ldr r3, [r3, #28] + 8001e72: f003 5380 and.w r3, r3, #268435456 ; 0x10000000 + 8001e76: 603b str r3, [r7, #0] + 8001e78: 683b ldr r3, [r7, #0] + /* System interrupt init*/ + + /* USER CODE BEGIN MspInit 1 */ + + /* USER CODE END MspInit 1 */ +} + 8001e7a: bf00 nop + 8001e7c: 370c adds r7, #12 + 8001e7e: 46bd mov sp, r7 + 8001e80: f85d 7b04 ldr.w r7, [sp], #4 + 8001e84: 4770 bx lr + 8001e86: bf00 nop + 8001e88: 40021000 .word 0x40021000 + +08001e8c : +* This function configures the hardware resources used in this example +* @param hcan: CAN handle pointer +* @retval None +*/ +void HAL_CAN_MspInit(CAN_HandleTypeDef* hcan) +{ + 8001e8c: b580 push {r7, lr} + 8001e8e: b08a sub sp, #40 ; 0x28 + 8001e90: af00 add r7, sp, #0 + 8001e92: 6078 str r0, [r7, #4] + GPIO_InitTypeDef GPIO_InitStruct = {0}; + 8001e94: f107 0314 add.w r3, r7, #20 + 8001e98: 2200 movs r2, #0 + 8001e9a: 601a str r2, [r3, #0] + 8001e9c: 605a str r2, [r3, #4] + 8001e9e: 609a str r2, [r3, #8] + 8001ea0: 60da str r2, [r3, #12] + 8001ea2: 611a str r2, [r3, #16] + if(hcan->Instance==CAN) + 8001ea4: 687b ldr r3, [r7, #4] + 8001ea6: 681b ldr r3, [r3, #0] + 8001ea8: 4a1c ldr r2, [pc, #112] ; (8001f1c ) + 8001eaa: 4293 cmp r3, r2 + 8001eac: d131 bne.n 8001f12 + { + /* USER CODE BEGIN CAN_MspInit 0 */ + + /* USER CODE END CAN_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_CAN1_CLK_ENABLE(); + 8001eae: 4b1c ldr r3, [pc, #112] ; (8001f20 ) + 8001eb0: 69db ldr r3, [r3, #28] + 8001eb2: 4a1b ldr r2, [pc, #108] ; (8001f20 ) + 8001eb4: f043 7300 orr.w r3, r3, #33554432 ; 0x2000000 + 8001eb8: 61d3 str r3, [r2, #28] + 8001eba: 4b19 ldr r3, [pc, #100] ; (8001f20 ) + 8001ebc: 69db ldr r3, [r3, #28] + 8001ebe: f003 7300 and.w r3, r3, #33554432 ; 0x2000000 + 8001ec2: 613b str r3, [r7, #16] + 8001ec4: 693b ldr r3, [r7, #16] + + __HAL_RCC_GPIOA_CLK_ENABLE(); + 8001ec6: 4b16 ldr r3, [pc, #88] ; (8001f20 ) + 8001ec8: 695b ldr r3, [r3, #20] + 8001eca: 4a15 ldr r2, [pc, #84] ; (8001f20 ) + 8001ecc: f443 3300 orr.w r3, r3, #131072 ; 0x20000 + 8001ed0: 6153 str r3, [r2, #20] + 8001ed2: 4b13 ldr r3, [pc, #76] ; (8001f20 ) + 8001ed4: 695b ldr r3, [r3, #20] + 8001ed6: f403 3300 and.w r3, r3, #131072 ; 0x20000 + 8001eda: 60fb str r3, [r7, #12] + 8001edc: 68fb ldr r3, [r7, #12] + /**CAN GPIO Configuration + PA11 ------> CAN_RX + PA12 ------> CAN_TX + */ + GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12; + 8001ede: f44f 53c0 mov.w r3, #6144 ; 0x1800 + 8001ee2: 617b str r3, [r7, #20] + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + 8001ee4: 2302 movs r3, #2 + 8001ee6: 61bb str r3, [r7, #24] + GPIO_InitStruct.Pull = GPIO_NOPULL; + 8001ee8: 2300 movs r3, #0 + 8001eea: 61fb str r3, [r7, #28] + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + 8001eec: 2303 movs r3, #3 + 8001eee: 623b str r3, [r7, #32] + GPIO_InitStruct.Alternate = GPIO_AF9_CAN; + 8001ef0: 2309 movs r3, #9 + 8001ef2: 627b str r3, [r7, #36] ; 0x24 + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + 8001ef4: f107 0314 add.w r3, r7, #20 + 8001ef8: 4619 mov r1, r3 + 8001efa: f04f 4090 mov.w r0, #1207959552 ; 0x48000000 + 8001efe: f001 f973 bl 80031e8 + + /* CAN interrupt Init */ + HAL_NVIC_SetPriority(USB_LP_CAN_RX0_IRQn, 0, 0); + 8001f02: 2200 movs r2, #0 + 8001f04: 2100 movs r1, #0 + 8001f06: 2014 movs r0, #20 + 8001f08: f001 f937 bl 800317a + HAL_NVIC_EnableIRQ(USB_LP_CAN_RX0_IRQn); + 8001f0c: 2014 movs r0, #20 + 8001f0e: f001 f950 bl 80031b2 + /* USER CODE BEGIN CAN_MspInit 1 */ + + /* USER CODE END CAN_MspInit 1 */ + } + +} + 8001f12: bf00 nop + 8001f14: 3728 adds r7, #40 ; 0x28 + 8001f16: 46bd mov sp, r7 + 8001f18: bd80 pop {r7, pc} + 8001f1a: bf00 nop + 8001f1c: 40006400 .word 0x40006400 + 8001f20: 40021000 .word 0x40021000 + +08001f24 : +* This function configures the hardware resources used in this example +* @param hi2c: I2C handle pointer +* @retval None +*/ +void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c) +{ + 8001f24: b580 push {r7, lr} + 8001f26: b08c sub sp, #48 ; 0x30 + 8001f28: af00 add r7, sp, #0 + 8001f2a: 6078 str r0, [r7, #4] + GPIO_InitTypeDef GPIO_InitStruct = {0}; + 8001f2c: f107 031c add.w r3, r7, #28 + 8001f30: 2200 movs r2, #0 + 8001f32: 601a str r2, [r3, #0] + 8001f34: 605a str r2, [r3, #4] + 8001f36: 609a str r2, [r3, #8] + 8001f38: 60da str r2, [r3, #12] + 8001f3a: 611a str r2, [r3, #16] + if(hi2c->Instance==I2C1) + 8001f3c: 687b ldr r3, [r7, #4] + 8001f3e: 681b ldr r3, [r3, #0] + 8001f40: 4a3e ldr r2, [pc, #248] ; (800203c ) + 8001f42: 4293 cmp r3, r2 + 8001f44: d146 bne.n 8001fd4 + { + /* USER CODE BEGIN I2C1_MspInit 0 */ + + /* USER CODE END I2C1_MspInit 0 */ + + __HAL_RCC_GPIOA_CLK_ENABLE(); + 8001f46: 4b3e ldr r3, [pc, #248] ; (8002040 ) + 8001f48: 695b ldr r3, [r3, #20] + 8001f4a: 4a3d ldr r2, [pc, #244] ; (8002040 ) + 8001f4c: f443 3300 orr.w r3, r3, #131072 ; 0x20000 + 8001f50: 6153 str r3, [r2, #20] + 8001f52: 4b3b ldr r3, [pc, #236] ; (8002040 ) + 8001f54: 695b ldr r3, [r3, #20] + 8001f56: f403 3300 and.w r3, r3, #131072 ; 0x20000 + 8001f5a: 61bb str r3, [r7, #24] + 8001f5c: 69bb ldr r3, [r7, #24] + __HAL_RCC_GPIOB_CLK_ENABLE(); + 8001f5e: 4b38 ldr r3, [pc, #224] ; (8002040 ) + 8001f60: 695b ldr r3, [r3, #20] + 8001f62: 4a37 ldr r2, [pc, #220] ; (8002040 ) + 8001f64: f443 2380 orr.w r3, r3, #262144 ; 0x40000 + 8001f68: 6153 str r3, [r2, #20] + 8001f6a: 4b35 ldr r3, [pc, #212] ; (8002040 ) + 8001f6c: 695b ldr r3, [r3, #20] + 8001f6e: f403 2380 and.w r3, r3, #262144 ; 0x40000 + 8001f72: 617b str r3, [r7, #20] + 8001f74: 697b ldr r3, [r7, #20] + /**I2C1 GPIO Configuration + PA15 ------> I2C1_SCL + PB7 ------> I2C1_SDA + */ + GPIO_InitStruct.Pin = TMP_SCL_Pin; + 8001f76: f44f 4300 mov.w r3, #32768 ; 0x8000 + 8001f7a: 61fb str r3, [r7, #28] + GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + 8001f7c: 2312 movs r3, #18 + 8001f7e: 623b str r3, [r7, #32] + GPIO_InitStruct.Pull = GPIO_NOPULL; + 8001f80: 2300 movs r3, #0 + 8001f82: 627b str r3, [r7, #36] ; 0x24 + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + 8001f84: 2303 movs r3, #3 + 8001f86: 62bb str r3, [r7, #40] ; 0x28 + GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; + 8001f88: 2304 movs r3, #4 + 8001f8a: 62fb str r3, [r7, #44] ; 0x2c + HAL_GPIO_Init(TMP_SCL_GPIO_Port, &GPIO_InitStruct); + 8001f8c: f107 031c add.w r3, r7, #28 + 8001f90: 4619 mov r1, r3 + 8001f92: f04f 4090 mov.w r0, #1207959552 ; 0x48000000 + 8001f96: f001 f927 bl 80031e8 + + GPIO_InitStruct.Pin = TMP_SDA_Pin; + 8001f9a: 2380 movs r3, #128 ; 0x80 + 8001f9c: 61fb str r3, [r7, #28] + GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + 8001f9e: 2312 movs r3, #18 + 8001fa0: 623b str r3, [r7, #32] + GPIO_InitStruct.Pull = GPIO_NOPULL; + 8001fa2: 2300 movs r3, #0 + 8001fa4: 627b str r3, [r7, #36] ; 0x24 + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + 8001fa6: 2303 movs r3, #3 + 8001fa8: 62bb str r3, [r7, #40] ; 0x28 + GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; + 8001faa: 2304 movs r3, #4 + 8001fac: 62fb str r3, [r7, #44] ; 0x2c + HAL_GPIO_Init(TMP_SDA_GPIO_Port, &GPIO_InitStruct); + 8001fae: f107 031c add.w r3, r7, #28 + 8001fb2: 4619 mov r1, r3 + 8001fb4: 4823 ldr r0, [pc, #140] ; (8002044 ) + 8001fb6: f001 f917 bl 80031e8 + + /* Peripheral clock enable */ + __HAL_RCC_I2C1_CLK_ENABLE(); + 8001fba: 4b21 ldr r3, [pc, #132] ; (8002040 ) + 8001fbc: 69db ldr r3, [r3, #28] + 8001fbe: 4a20 ldr r2, [pc, #128] ; (8002040 ) + 8001fc0: f443 1300 orr.w r3, r3, #2097152 ; 0x200000 + 8001fc4: 61d3 str r3, [r2, #28] + 8001fc6: 4b1e ldr r3, [pc, #120] ; (8002040 ) + 8001fc8: 69db ldr r3, [r3, #28] + 8001fca: f403 1300 and.w r3, r3, #2097152 ; 0x200000 + 8001fce: 613b str r3, [r7, #16] + 8001fd0: 693b ldr r3, [r7, #16] + /* USER CODE BEGIN I2C2_MspInit 1 */ + + /* USER CODE END I2C2_MspInit 1 */ + } + +} + 8001fd2: e02e b.n 8002032 + else if(hi2c->Instance==I2C2) + 8001fd4: 687b ldr r3, [r7, #4] + 8001fd6: 681b ldr r3, [r3, #0] + 8001fd8: 4a1b ldr r2, [pc, #108] ; (8002048 ) + 8001fda: 4293 cmp r3, r2 + 8001fdc: d129 bne.n 8002032 + __HAL_RCC_GPIOA_CLK_ENABLE(); + 8001fde: 4b18 ldr r3, [pc, #96] ; (8002040 ) + 8001fe0: 695b ldr r3, [r3, #20] + 8001fe2: 4a17 ldr r2, [pc, #92] ; (8002040 ) + 8001fe4: f443 3300 orr.w r3, r3, #131072 ; 0x20000 + 8001fe8: 6153 str r3, [r2, #20] + 8001fea: 4b15 ldr r3, [pc, #84] ; (8002040 ) + 8001fec: 695b ldr r3, [r3, #20] + 8001fee: f403 3300 and.w r3, r3, #131072 ; 0x20000 + 8001ff2: 60fb str r3, [r7, #12] + 8001ff4: 68fb ldr r3, [r7, #12] + GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10; + 8001ff6: f44f 63c0 mov.w r3, #1536 ; 0x600 + 8001ffa: 61fb str r3, [r7, #28] + GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + 8001ffc: 2312 movs r3, #18 + 8001ffe: 623b str r3, [r7, #32] + GPIO_InitStruct.Pull = GPIO_NOPULL; + 8002000: 2300 movs r3, #0 + 8002002: 627b str r3, [r7, #36] ; 0x24 + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + 8002004: 2303 movs r3, #3 + 8002006: 62bb str r3, [r7, #40] ; 0x28 + GPIO_InitStruct.Alternate = GPIO_AF4_I2C2; + 8002008: 2304 movs r3, #4 + 800200a: 62fb str r3, [r7, #44] ; 0x2c + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + 800200c: f107 031c add.w r3, r7, #28 + 8002010: 4619 mov r1, r3 + 8002012: f04f 4090 mov.w r0, #1207959552 ; 0x48000000 + 8002016: f001 f8e7 bl 80031e8 + __HAL_RCC_I2C2_CLK_ENABLE(); + 800201a: 4b09 ldr r3, [pc, #36] ; (8002040 ) + 800201c: 69db ldr r3, [r3, #28] + 800201e: 4a08 ldr r2, [pc, #32] ; (8002040 ) + 8002020: f443 0380 orr.w r3, r3, #4194304 ; 0x400000 + 8002024: 61d3 str r3, [r2, #28] + 8002026: 4b06 ldr r3, [pc, #24] ; (8002040 ) + 8002028: 69db ldr r3, [r3, #28] + 800202a: f403 0380 and.w r3, r3, #4194304 ; 0x400000 + 800202e: 60bb str r3, [r7, #8] + 8002030: 68bb ldr r3, [r7, #8] +} + 8002032: bf00 nop + 8002034: 3730 adds r7, #48 ; 0x30 + 8002036: 46bd mov sp, r7 + 8002038: bd80 pop {r7, pc} + 800203a: bf00 nop + 800203c: 40005400 .word 0x40005400 + 8002040: 40021000 .word 0x40021000 + 8002044: 48000400 .word 0x48000400 + 8002048: 40005800 .word 0x40005800 + +0800204c : +* This function configures the hardware resources used in this example +* @param hspi: SPI handle pointer +* @retval None +*/ +void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi) +{ + 800204c: b580 push {r7, lr} + 800204e: b08a sub sp, #40 ; 0x28 + 8002050: af00 add r7, sp, #0 + 8002052: 6078 str r0, [r7, #4] + GPIO_InitTypeDef GPIO_InitStruct = {0}; + 8002054: f107 0314 add.w r3, r7, #20 + 8002058: 2200 movs r2, #0 + 800205a: 601a str r2, [r3, #0] + 800205c: 605a str r2, [r3, #4] + 800205e: 609a str r2, [r3, #8] + 8002060: 60da str r2, [r3, #12] + 8002062: 611a str r2, [r3, #16] + if(hspi->Instance==SPI1) + 8002064: 687b ldr r3, [r7, #4] + 8002066: 681b ldr r3, [r3, #0] + 8002068: 4a17 ldr r2, [pc, #92] ; (80020c8 ) + 800206a: 4293 cmp r3, r2 + 800206c: d128 bne.n 80020c0 + { + /* USER CODE BEGIN SPI1_MspInit 0 */ + + /* USER CODE END SPI1_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_SPI1_CLK_ENABLE(); + 800206e: 4b17 ldr r3, [pc, #92] ; (80020cc ) + 8002070: 699b ldr r3, [r3, #24] + 8002072: 4a16 ldr r2, [pc, #88] ; (80020cc ) + 8002074: f443 5380 orr.w r3, r3, #4096 ; 0x1000 + 8002078: 6193 str r3, [r2, #24] + 800207a: 4b14 ldr r3, [pc, #80] ; (80020cc ) + 800207c: 699b ldr r3, [r3, #24] + 800207e: f403 5380 and.w r3, r3, #4096 ; 0x1000 + 8002082: 613b str r3, [r7, #16] + 8002084: 693b ldr r3, [r7, #16] + + __HAL_RCC_GPIOA_CLK_ENABLE(); + 8002086: 4b11 ldr r3, [pc, #68] ; (80020cc ) + 8002088: 695b ldr r3, [r3, #20] + 800208a: 4a10 ldr r2, [pc, #64] ; (80020cc ) + 800208c: f443 3300 orr.w r3, r3, #131072 ; 0x20000 + 8002090: 6153 str r3, [r2, #20] + 8002092: 4b0e ldr r3, [pc, #56] ; (80020cc ) + 8002094: 695b ldr r3, [r3, #20] + 8002096: f403 3300 and.w r3, r3, #131072 ; 0x20000 + 800209a: 60fb str r3, [r7, #12] + 800209c: 68fb ldr r3, [r7, #12] + /**SPI1 GPIO Configuration + PA5 ------> SPI1_SCK + PA6 ------> SPI1_MISO + PA7 ------> SPI1_MOSI + */ + GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; + 800209e: 23e0 movs r3, #224 ; 0xe0 + 80020a0: 617b str r3, [r7, #20] + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + 80020a2: 2302 movs r3, #2 + 80020a4: 61bb str r3, [r7, #24] + GPIO_InitStruct.Pull = GPIO_NOPULL; + 80020a6: 2300 movs r3, #0 + 80020a8: 61fb str r3, [r7, #28] + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + 80020aa: 2303 movs r3, #3 + 80020ac: 623b str r3, [r7, #32] + GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; + 80020ae: 2305 movs r3, #5 + 80020b0: 627b str r3, [r7, #36] ; 0x24 + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + 80020b2: f107 0314 add.w r3, r7, #20 + 80020b6: 4619 mov r1, r3 + 80020b8: f04f 4090 mov.w r0, #1207959552 ; 0x48000000 + 80020bc: f001 f894 bl 80031e8 + /* USER CODE BEGIN SPI1_MspInit 1 */ + + /* USER CODE END SPI1_MspInit 1 */ + } + +} + 80020c0: bf00 nop + 80020c2: 3728 adds r7, #40 ; 0x28 + 80020c4: 46bd mov sp, r7 + 80020c6: bd80 pop {r7, pc} + 80020c8: 40013000 .word 0x40013000 + 80020cc: 40021000 .word 0x40021000 + +080020d0 : +/******************************************************************************/ +/** + * @brief This function handles Non maskable interrupt. + */ +void NMI_Handler(void) +{ + 80020d0: b480 push {r7} + 80020d2: af00 add r7, sp, #0 + /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ + + /* USER CODE END NonMaskableInt_IRQn 0 */ + /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ + while (1) + 80020d4: e7fe b.n 80020d4 + +080020d6 : + +/** + * @brief This function handles Hard fault interrupt. + */ +void HardFault_Handler(void) +{ + 80020d6: b480 push {r7} + 80020d8: af00 add r7, sp, #0 + /* USER CODE BEGIN HardFault_IRQn 0 */ + + /* USER CODE END HardFault_IRQn 0 */ + while (1) + 80020da: e7fe b.n 80020da + +080020dc : + +/** + * @brief This function handles Memory management fault. + */ +void MemManage_Handler(void) +{ + 80020dc: b480 push {r7} + 80020de: af00 add r7, sp, #0 + /* USER CODE BEGIN MemoryManagement_IRQn 0 */ + + /* USER CODE END MemoryManagement_IRQn 0 */ + while (1) + 80020e0: e7fe b.n 80020e0 + +080020e2 : + +/** + * @brief This function handles Pre-fetch fault, memory access fault. + */ +void BusFault_Handler(void) +{ + 80020e2: b480 push {r7} + 80020e4: af00 add r7, sp, #0 + /* USER CODE BEGIN BusFault_IRQn 0 */ + + /* USER CODE END BusFault_IRQn 0 */ + while (1) + 80020e6: e7fe b.n 80020e6 + +080020e8 : + +/** + * @brief This function handles Undefined instruction or illegal state. + */ +void UsageFault_Handler(void) +{ + 80020e8: b480 push {r7} + 80020ea: af00 add r7, sp, #0 + /* USER CODE BEGIN UsageFault_IRQn 0 */ + + /* USER CODE END UsageFault_IRQn 0 */ + while (1) + 80020ec: e7fe b.n 80020ec + +080020ee : + +/** + * @brief This function handles System service call via SWI instruction. + */ +void SVC_Handler(void) +{ + 80020ee: b480 push {r7} + 80020f0: af00 add r7, sp, #0 + + /* USER CODE END SVCall_IRQn 0 */ + /* USER CODE BEGIN SVCall_IRQn 1 */ + + /* USER CODE END SVCall_IRQn 1 */ +} + 80020f2: bf00 nop + 80020f4: 46bd mov sp, r7 + 80020f6: f85d 7b04 ldr.w r7, [sp], #4 + 80020fa: 4770 bx lr + +080020fc : + +/** + * @brief This function handles Debug monitor. + */ +void DebugMon_Handler(void) +{ + 80020fc: b480 push {r7} + 80020fe: af00 add r7, sp, #0 + + /* USER CODE END DebugMonitor_IRQn 0 */ + /* USER CODE BEGIN DebugMonitor_IRQn 1 */ + + /* USER CODE END DebugMonitor_IRQn 1 */ +} + 8002100: bf00 nop + 8002102: 46bd mov sp, r7 + 8002104: f85d 7b04 ldr.w r7, [sp], #4 + 8002108: 4770 bx lr + +0800210a : + +/** + * @brief This function handles Pendable request for system service. + */ +void PendSV_Handler(void) +{ + 800210a: b480 push {r7} + 800210c: af00 add r7, sp, #0 + + /* USER CODE END PendSV_IRQn 0 */ + /* USER CODE BEGIN PendSV_IRQn 1 */ + + /* USER CODE END PendSV_IRQn 1 */ +} + 800210e: bf00 nop + 8002110: 46bd mov sp, r7 + 8002112: f85d 7b04 ldr.w r7, [sp], #4 + 8002116: 4770 bx lr + +08002118 : + +/** + * @brief This function handles System tick timer. + */ +void SysTick_Handler(void) +{ + 8002118: b580 push {r7, lr} + 800211a: af00 add r7, sp, #0 + /* USER CODE BEGIN SysTick_IRQn 0 */ + + /* USER CODE END SysTick_IRQn 0 */ + HAL_IncTick(); + 800211c: f000 f88e bl 800223c + /* USER CODE BEGIN SysTick_IRQn 1 */ + + /* USER CODE END SysTick_IRQn 1 */ +} + 8002120: bf00 nop + 8002122: bd80 pop {r7, pc} + +08002124 : + +/** + * @brief This function handles USB low priority or CAN_RX0 interrupts. + */ +void USB_LP_CAN_RX0_IRQHandler(void) +{ + 8002124: b580 push {r7, lr} + 8002126: af00 add r7, sp, #0 + /* USER CODE BEGIN USB_LP_CAN_RX0_IRQn 0 */ + + /* USER CODE END USB_LP_CAN_RX0_IRQn 0 */ + HAL_CAN_IRQHandler(&hcan); + 8002128: 4802 ldr r0, [pc, #8] ; (8002134 ) + 800212a: f000 fd1c bl 8002b66 + /* USER CODE BEGIN USB_LP_CAN_RX0_IRQn 1 */ + + /* USER CODE END USB_LP_CAN_RX0_IRQn 1 */ +} + 800212e: bf00 nop + 8002130: bd80 pop {r7, pc} + 8002132: bf00 nop + 8002134: 20000144 .word 0x20000144 + +08002138 : + * @brief Setup the microcontroller system + * @param None + * @retval None + */ +void SystemInit(void) +{ + 8002138: b480 push {r7} + 800213a: af00 add r7, sp, #0 +/* FPU settings --------------------------------------------------------------*/ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ + 800213c: 4b06 ldr r3, [pc, #24] ; (8002158 ) + 800213e: f8d3 3088 ldr.w r3, [r3, #136] ; 0x88 + 8002142: 4a05 ldr r2, [pc, #20] ; (8002158 ) + 8002144: f443 0370 orr.w r3, r3, #15728640 ; 0xf00000 + 8002148: f8c2 3088 str.w r3, [r2, #136] ; 0x88 + + /* Configure the Vector Table location -------------------------------------*/ +#if defined(USER_VECT_TAB_ADDRESS) + SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ +#endif /* USER_VECT_TAB_ADDRESS */ +} + 800214c: bf00 nop + 800214e: 46bd mov sp, r7 + 8002150: f85d 7b04 ldr.w r7, [sp], #4 + 8002154: 4770 bx lr + 8002156: bf00 nop + 8002158: e000ed00 .word 0xe000ed00 + +0800215c : + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + ldr sp, =_estack /* Atollic update: set stack pointer */ + 800215c: f8df d034 ldr.w sp, [pc, #52] ; 8002194 + +/* Copy the data segment initializers from flash to SRAM */ + ldr r0, =_sdata + 8002160: 480d ldr r0, [pc, #52] ; (8002198 ) + ldr r1, =_edata + 8002162: 490e ldr r1, [pc, #56] ; (800219c ) + ldr r2, =_sidata + 8002164: 4a0e ldr r2, [pc, #56] ; (80021a0 ) + movs r3, #0 + 8002166: 2300 movs r3, #0 + b LoopCopyDataInit + 8002168: e002 b.n 8002170 + +0800216a : + +CopyDataInit: + ldr r4, [r2, r3] + 800216a: 58d4 ldr r4, [r2, r3] + str r4, [r0, r3] + 800216c: 50c4 str r4, [r0, r3] + adds r3, r3, #4 + 800216e: 3304 adds r3, #4 + +08002170 : + +LoopCopyDataInit: + adds r4, r0, r3 + 8002170: 18c4 adds r4, r0, r3 + cmp r4, r1 + 8002172: 428c cmp r4, r1 + bcc CopyDataInit + 8002174: d3f9 bcc.n 800216a + +/* Zero fill the bss segment. */ + ldr r2, =_sbss + 8002176: 4a0b ldr r2, [pc, #44] ; (80021a4 ) + ldr r4, =_ebss + 8002178: 4c0b ldr r4, [pc, #44] ; (80021a8 ) + movs r3, #0 + 800217a: 2300 movs r3, #0 + b LoopFillZerobss + 800217c: e001 b.n 8002182 + +0800217e : + +FillZerobss: + str r3, [r2] + 800217e: 6013 str r3, [r2, #0] + adds r2, r2, #4 + 8002180: 3204 adds r2, #4 + +08002182 : + +LoopFillZerobss: + cmp r2, r4 + 8002182: 42a2 cmp r2, r4 + bcc FillZerobss + 8002184: d3fb bcc.n 800217e + +/* Call the clock system intitialization function.*/ + bl SystemInit + 8002186: f7ff ffd7 bl 8002138 +/* Call static constructors */ + bl __libc_init_array + 800218a: f004 f971 bl 8006470 <__libc_init_array> +/* Call the application's entry point.*/ + bl main + 800218e: f7ff fbc3 bl 8001918
+ +08002192 : + +LoopForever: + b LoopForever + 8002192: e7fe b.n 8002192 + ldr sp, =_estack /* Atollic update: set stack pointer */ + 8002194: 2000a000 .word 0x2000a000 + ldr r0, =_sdata + 8002198: 20000000 .word 0x20000000 + ldr r1, =_edata + 800219c: 20000014 .word 0x20000014 + ldr r2, =_sidata + 80021a0: 08006518 .word 0x08006518 + ldr r2, =_sbss + 80021a4: 20000018 .word 0x20000018 + ldr r4, =_ebss + 80021a8: 20000270 .word 0x20000270 + +080021ac : + * @retval : None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + 80021ac: e7fe b.n 80021ac + ... + +080021b0 : + * In the default implementation,Systick is used as source of time base. + * The tick variable is incremented each 1ms in its ISR. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_Init(void) +{ + 80021b0: b580 push {r7, lr} + 80021b2: af00 add r7, sp, #0 + /* Configure Flash prefetch */ +#if (PREFETCH_ENABLE != 0U) + __HAL_FLASH_PREFETCH_BUFFER_ENABLE(); + 80021b4: 4b08 ldr r3, [pc, #32] ; (80021d8 ) + 80021b6: 681b ldr r3, [r3, #0] + 80021b8: 4a07 ldr r2, [pc, #28] ; (80021d8 ) + 80021ba: f043 0310 orr.w r3, r3, #16 + 80021be: 6013 str r3, [r2, #0] +#endif /* PREFETCH_ENABLE */ + + /* Set Interrupt Group Priority */ + HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4); + 80021c0: 2003 movs r0, #3 + 80021c2: f000 ffcf bl 8003164 + + /* Enable systick and configure 1ms tick (default clock after Reset is HSI) */ + HAL_InitTick(TICK_INT_PRIORITY); + 80021c6: 200f movs r0, #15 + 80021c8: f000 f808 bl 80021dc + + /* Init the low level hardware */ + HAL_MspInit(); + 80021cc: f7ff fe3a bl 8001e44 + + /* Return function status */ + return HAL_OK; + 80021d0: 2300 movs r3, #0 +} + 80021d2: 4618 mov r0, r3 + 80021d4: bd80 pop {r7, pc} + 80021d6: bf00 nop + 80021d8: 40022000 .word 0x40022000 + +080021dc : + * implementation in user file. + * @param TickPriority Tick interrupt priority. + * @retval HAL status + */ +__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) +{ + 80021dc: b580 push {r7, lr} + 80021de: b082 sub sp, #8 + 80021e0: af00 add r7, sp, #0 + 80021e2: 6078 str r0, [r7, #4] + /* Configure the SysTick to have interrupt in 1ms time basis*/ + if (HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq)) > 0U) + 80021e4: 4b12 ldr r3, [pc, #72] ; (8002230 ) + 80021e6: 681a ldr r2, [r3, #0] + 80021e8: 4b12 ldr r3, [pc, #72] ; (8002234 ) + 80021ea: 781b ldrb r3, [r3, #0] + 80021ec: 4619 mov r1, r3 + 80021ee: f44f 737a mov.w r3, #1000 ; 0x3e8 + 80021f2: fbb3 f3f1 udiv r3, r3, r1 + 80021f6: fbb2 f3f3 udiv r3, r2, r3 + 80021fa: 4618 mov r0, r3 + 80021fc: f000 ffe7 bl 80031ce + 8002200: 4603 mov r3, r0 + 8002202: 2b00 cmp r3, #0 + 8002204: d001 beq.n 800220a + { + return HAL_ERROR; + 8002206: 2301 movs r3, #1 + 8002208: e00e b.n 8002228 + } + + /* Configure the SysTick IRQ priority */ + if (TickPriority < (1UL << __NVIC_PRIO_BITS)) + 800220a: 687b ldr r3, [r7, #4] + 800220c: 2b0f cmp r3, #15 + 800220e: d80a bhi.n 8002226 + { + HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0U); + 8002210: 2200 movs r2, #0 + 8002212: 6879 ldr r1, [r7, #4] + 8002214: f04f 30ff mov.w r0, #4294967295 ; 0xffffffff + 8002218: f000 ffaf bl 800317a + uwTickPrio = TickPriority; + 800221c: 4a06 ldr r2, [pc, #24] ; (8002238 ) + 800221e: 687b ldr r3, [r7, #4] + 8002220: 6013 str r3, [r2, #0] + else + { + return HAL_ERROR; + } + /* Return function status */ + return HAL_OK; + 8002222: 2300 movs r3, #0 + 8002224: e000 b.n 8002228 + return HAL_ERROR; + 8002226: 2301 movs r3, #1 +} + 8002228: 4618 mov r0, r3 + 800222a: 3708 adds r7, #8 + 800222c: 46bd mov sp, r7 + 800222e: bd80 pop {r7, pc} + 8002230: 20000008 .word 0x20000008 + 8002234: 20000010 .word 0x20000010 + 8002238: 2000000c .word 0x2000000c + +0800223c : + * @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) +{ + 800223c: b480 push {r7} + 800223e: af00 add r7, sp, #0 + uwTick += uwTickFreq; + 8002240: 4b06 ldr r3, [pc, #24] ; (800225c ) + 8002242: 781b ldrb r3, [r3, #0] + 8002244: 461a mov r2, r3 + 8002246: 4b06 ldr r3, [pc, #24] ; (8002260 ) + 8002248: 681b ldr r3, [r3, #0] + 800224a: 4413 add r3, r2 + 800224c: 4a04 ldr r2, [pc, #16] ; (8002260 ) + 800224e: 6013 str r3, [r2, #0] +} + 8002250: bf00 nop + 8002252: 46bd mov sp, r7 + 8002254: f85d 7b04 ldr.w r7, [sp], #4 + 8002258: 4770 bx lr + 800225a: bf00 nop + 800225c: 20000010 .word 0x20000010 + 8002260: 2000026c .word 0x2000026c + +08002264 : + * @note The 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) +{ + 8002264: b480 push {r7} + 8002266: af00 add r7, sp, #0 + return uwTick; + 8002268: 4b03 ldr r3, [pc, #12] ; (8002278 ) + 800226a: 681b ldr r3, [r3, #0] +} + 800226c: 4618 mov r0, r3 + 800226e: 46bd mov sp, r7 + 8002270: f85d 7b04 ldr.w r7, [sp], #4 + 8002274: 4770 bx lr + 8002276: bf00 nop + 8002278: 2000026c .word 0x2000026c + +0800227c : + * implementations in user file. + * @param Delay specifies the delay time length, in milliseconds. + * @retval None + */ +__weak void HAL_Delay(uint32_t Delay) +{ + 800227c: b580 push {r7, lr} + 800227e: b084 sub sp, #16 + 8002280: af00 add r7, sp, #0 + 8002282: 6078 str r0, [r7, #4] + uint32_t tickstart = HAL_GetTick(); + 8002284: f7ff ffee bl 8002264 + 8002288: 60b8 str r0, [r7, #8] + uint32_t wait = Delay; + 800228a: 687b ldr r3, [r7, #4] + 800228c: 60fb str r3, [r7, #12] + + /* Add freq to guarantee minimum wait */ + if (wait < HAL_MAX_DELAY) + 800228e: 68fb ldr r3, [r7, #12] + 8002290: f1b3 3fff cmp.w r3, #4294967295 ; 0xffffffff + 8002294: d005 beq.n 80022a2 + { + wait += (uint32_t)(uwTickFreq); + 8002296: 4b0a ldr r3, [pc, #40] ; (80022c0 ) + 8002298: 781b ldrb r3, [r3, #0] + 800229a: 461a mov r2, r3 + 800229c: 68fb ldr r3, [r7, #12] + 800229e: 4413 add r3, r2 + 80022a0: 60fb str r3, [r7, #12] + } + + while((HAL_GetTick() - tickstart) < wait) + 80022a2: bf00 nop + 80022a4: f7ff ffde bl 8002264 + 80022a8: 4602 mov r2, r0 + 80022aa: 68bb ldr r3, [r7, #8] + 80022ac: 1ad3 subs r3, r2, r3 + 80022ae: 68fa ldr r2, [r7, #12] + 80022b0: 429a cmp r2, r3 + 80022b2: d8f7 bhi.n 80022a4 + { + } +} + 80022b4: bf00 nop + 80022b6: bf00 nop + 80022b8: 3710 adds r7, #16 + 80022ba: 46bd mov sp, r7 + 80022bc: bd80 pop {r7, pc} + 80022be: bf00 nop + 80022c0: 20000010 .word 0x20000010 + +080022c4 : + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_CAN_Init(CAN_HandleTypeDef *hcan) +{ + 80022c4: b580 push {r7, lr} + 80022c6: b084 sub sp, #16 + 80022c8: af00 add r7, sp, #0 + 80022ca: 6078 str r0, [r7, #4] + uint32_t tickstart; + + /* Check CAN handle */ + if (hcan == NULL) + 80022cc: 687b ldr r3, [r7, #4] + 80022ce: 2b00 cmp r3, #0 + 80022d0: d101 bne.n 80022d6 + { + return HAL_ERROR; + 80022d2: 2301 movs r3, #1 + 80022d4: e0ed b.n 80024b2 + /* Init the low level hardware: CLOCK, NVIC */ + hcan->MspInitCallback(hcan); + } + +#else + if (hcan->State == HAL_CAN_STATE_RESET) + 80022d6: 687b ldr r3, [r7, #4] + 80022d8: f893 3020 ldrb.w r3, [r3, #32] + 80022dc: b2db uxtb r3, r3 + 80022de: 2b00 cmp r3, #0 + 80022e0: d102 bne.n 80022e8 + { + /* Init the low level hardware: CLOCK, NVIC */ + HAL_CAN_MspInit(hcan); + 80022e2: 6878 ldr r0, [r7, #4] + 80022e4: f7ff fdd2 bl 8001e8c + } +#endif /* (USE_HAL_CAN_REGISTER_CALLBACKS) */ + + /* Request initialisation */ + SET_BIT(hcan->Instance->MCR, CAN_MCR_INRQ); + 80022e8: 687b ldr r3, [r7, #4] + 80022ea: 681b ldr r3, [r3, #0] + 80022ec: 681a ldr r2, [r3, #0] + 80022ee: 687b ldr r3, [r7, #4] + 80022f0: 681b ldr r3, [r3, #0] + 80022f2: f042 0201 orr.w r2, r2, #1 + 80022f6: 601a str r2, [r3, #0] + + /* Get tick */ + tickstart = HAL_GetTick(); + 80022f8: f7ff ffb4 bl 8002264 + 80022fc: 60f8 str r0, [r7, #12] + + /* Wait initialisation acknowledge */ + while ((hcan->Instance->MSR & CAN_MSR_INAK) == 0U) + 80022fe: e012 b.n 8002326 + { + if ((HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE) + 8002300: f7ff ffb0 bl 8002264 + 8002304: 4602 mov r2, r0 + 8002306: 68fb ldr r3, [r7, #12] + 8002308: 1ad3 subs r3, r2, r3 + 800230a: 2b0a cmp r3, #10 + 800230c: d90b bls.n 8002326 + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_TIMEOUT; + 800230e: 687b ldr r3, [r7, #4] + 8002310: 6a5b ldr r3, [r3, #36] ; 0x24 + 8002312: f443 3200 orr.w r2, r3, #131072 ; 0x20000 + 8002316: 687b ldr r3, [r7, #4] + 8002318: 625a str r2, [r3, #36] ; 0x24 + + /* Change CAN state */ + hcan->State = HAL_CAN_STATE_ERROR; + 800231a: 687b ldr r3, [r7, #4] + 800231c: 2205 movs r2, #5 + 800231e: f883 2020 strb.w r2, [r3, #32] + + return HAL_ERROR; + 8002322: 2301 movs r3, #1 + 8002324: e0c5 b.n 80024b2 + while ((hcan->Instance->MSR & CAN_MSR_INAK) == 0U) + 8002326: 687b ldr r3, [r7, #4] + 8002328: 681b ldr r3, [r3, #0] + 800232a: 685b ldr r3, [r3, #4] + 800232c: f003 0301 and.w r3, r3, #1 + 8002330: 2b00 cmp r3, #0 + 8002332: d0e5 beq.n 8002300 + } + } + + /* Exit from sleep mode */ + CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_SLEEP); + 8002334: 687b ldr r3, [r7, #4] + 8002336: 681b ldr r3, [r3, #0] + 8002338: 681a ldr r2, [r3, #0] + 800233a: 687b ldr r3, [r7, #4] + 800233c: 681b ldr r3, [r3, #0] + 800233e: f022 0202 bic.w r2, r2, #2 + 8002342: 601a str r2, [r3, #0] + + /* Get tick */ + tickstart = HAL_GetTick(); + 8002344: f7ff ff8e bl 8002264 + 8002348: 60f8 str r0, [r7, #12] + + /* Check Sleep mode leave acknowledge */ + while ((hcan->Instance->MSR & CAN_MSR_SLAK) != 0U) + 800234a: e012 b.n 8002372 + { + if ((HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE) + 800234c: f7ff ff8a bl 8002264 + 8002350: 4602 mov r2, r0 + 8002352: 68fb ldr r3, [r7, #12] + 8002354: 1ad3 subs r3, r2, r3 + 8002356: 2b0a cmp r3, #10 + 8002358: d90b bls.n 8002372 + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_TIMEOUT; + 800235a: 687b ldr r3, [r7, #4] + 800235c: 6a5b ldr r3, [r3, #36] ; 0x24 + 800235e: f443 3200 orr.w r2, r3, #131072 ; 0x20000 + 8002362: 687b ldr r3, [r7, #4] + 8002364: 625a str r2, [r3, #36] ; 0x24 + + /* Change CAN state */ + hcan->State = HAL_CAN_STATE_ERROR; + 8002366: 687b ldr r3, [r7, #4] + 8002368: 2205 movs r2, #5 + 800236a: f883 2020 strb.w r2, [r3, #32] + + return HAL_ERROR; + 800236e: 2301 movs r3, #1 + 8002370: e09f b.n 80024b2 + while ((hcan->Instance->MSR & CAN_MSR_SLAK) != 0U) + 8002372: 687b ldr r3, [r7, #4] + 8002374: 681b ldr r3, [r3, #0] + 8002376: 685b ldr r3, [r3, #4] + 8002378: f003 0302 and.w r3, r3, #2 + 800237c: 2b00 cmp r3, #0 + 800237e: d1e5 bne.n 800234c + } + } + + /* Set the time triggered communication mode */ + if (hcan->Init.TimeTriggeredMode == ENABLE) + 8002380: 687b ldr r3, [r7, #4] + 8002382: 7e1b ldrb r3, [r3, #24] + 8002384: 2b01 cmp r3, #1 + 8002386: d108 bne.n 800239a + { + SET_BIT(hcan->Instance->MCR, CAN_MCR_TTCM); + 8002388: 687b ldr r3, [r7, #4] + 800238a: 681b ldr r3, [r3, #0] + 800238c: 681a ldr r2, [r3, #0] + 800238e: 687b ldr r3, [r7, #4] + 8002390: 681b ldr r3, [r3, #0] + 8002392: f042 0280 orr.w r2, r2, #128 ; 0x80 + 8002396: 601a str r2, [r3, #0] + 8002398: e007 b.n 80023aa + } + else + { + CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_TTCM); + 800239a: 687b ldr r3, [r7, #4] + 800239c: 681b ldr r3, [r3, #0] + 800239e: 681a ldr r2, [r3, #0] + 80023a0: 687b ldr r3, [r7, #4] + 80023a2: 681b ldr r3, [r3, #0] + 80023a4: f022 0280 bic.w r2, r2, #128 ; 0x80 + 80023a8: 601a str r2, [r3, #0] + } + + /* Set the automatic bus-off management */ + if (hcan->Init.AutoBusOff == ENABLE) + 80023aa: 687b ldr r3, [r7, #4] + 80023ac: 7e5b ldrb r3, [r3, #25] + 80023ae: 2b01 cmp r3, #1 + 80023b0: d108 bne.n 80023c4 + { + SET_BIT(hcan->Instance->MCR, CAN_MCR_ABOM); + 80023b2: 687b ldr r3, [r7, #4] + 80023b4: 681b ldr r3, [r3, #0] + 80023b6: 681a ldr r2, [r3, #0] + 80023b8: 687b ldr r3, [r7, #4] + 80023ba: 681b ldr r3, [r3, #0] + 80023bc: f042 0240 orr.w r2, r2, #64 ; 0x40 + 80023c0: 601a str r2, [r3, #0] + 80023c2: e007 b.n 80023d4 + } + else + { + CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_ABOM); + 80023c4: 687b ldr r3, [r7, #4] + 80023c6: 681b ldr r3, [r3, #0] + 80023c8: 681a ldr r2, [r3, #0] + 80023ca: 687b ldr r3, [r7, #4] + 80023cc: 681b ldr r3, [r3, #0] + 80023ce: f022 0240 bic.w r2, r2, #64 ; 0x40 + 80023d2: 601a str r2, [r3, #0] + } + + /* Set the automatic wake-up mode */ + if (hcan->Init.AutoWakeUp == ENABLE) + 80023d4: 687b ldr r3, [r7, #4] + 80023d6: 7e9b ldrb r3, [r3, #26] + 80023d8: 2b01 cmp r3, #1 + 80023da: d108 bne.n 80023ee + { + SET_BIT(hcan->Instance->MCR, CAN_MCR_AWUM); + 80023dc: 687b ldr r3, [r7, #4] + 80023de: 681b ldr r3, [r3, #0] + 80023e0: 681a ldr r2, [r3, #0] + 80023e2: 687b ldr r3, [r7, #4] + 80023e4: 681b ldr r3, [r3, #0] + 80023e6: f042 0220 orr.w r2, r2, #32 + 80023ea: 601a str r2, [r3, #0] + 80023ec: e007 b.n 80023fe + } + else + { + CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_AWUM); + 80023ee: 687b ldr r3, [r7, #4] + 80023f0: 681b ldr r3, [r3, #0] + 80023f2: 681a ldr r2, [r3, #0] + 80023f4: 687b ldr r3, [r7, #4] + 80023f6: 681b ldr r3, [r3, #0] + 80023f8: f022 0220 bic.w r2, r2, #32 + 80023fc: 601a str r2, [r3, #0] + } + + /* Set the automatic retransmission */ + if (hcan->Init.AutoRetransmission == ENABLE) + 80023fe: 687b ldr r3, [r7, #4] + 8002400: 7edb ldrb r3, [r3, #27] + 8002402: 2b01 cmp r3, #1 + 8002404: d108 bne.n 8002418 + { + CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_NART); + 8002406: 687b ldr r3, [r7, #4] + 8002408: 681b ldr r3, [r3, #0] + 800240a: 681a ldr r2, [r3, #0] + 800240c: 687b ldr r3, [r7, #4] + 800240e: 681b ldr r3, [r3, #0] + 8002410: f022 0210 bic.w r2, r2, #16 + 8002414: 601a str r2, [r3, #0] + 8002416: e007 b.n 8002428 + } + else + { + SET_BIT(hcan->Instance->MCR, CAN_MCR_NART); + 8002418: 687b ldr r3, [r7, #4] + 800241a: 681b ldr r3, [r3, #0] + 800241c: 681a ldr r2, [r3, #0] + 800241e: 687b ldr r3, [r7, #4] + 8002420: 681b ldr r3, [r3, #0] + 8002422: f042 0210 orr.w r2, r2, #16 + 8002426: 601a str r2, [r3, #0] + } + + /* Set the receive FIFO locked mode */ + if (hcan->Init.ReceiveFifoLocked == ENABLE) + 8002428: 687b ldr r3, [r7, #4] + 800242a: 7f1b ldrb r3, [r3, #28] + 800242c: 2b01 cmp r3, #1 + 800242e: d108 bne.n 8002442 + { + SET_BIT(hcan->Instance->MCR, CAN_MCR_RFLM); + 8002430: 687b ldr r3, [r7, #4] + 8002432: 681b ldr r3, [r3, #0] + 8002434: 681a ldr r2, [r3, #0] + 8002436: 687b ldr r3, [r7, #4] + 8002438: 681b ldr r3, [r3, #0] + 800243a: f042 0208 orr.w r2, r2, #8 + 800243e: 601a str r2, [r3, #0] + 8002440: e007 b.n 8002452 + } + else + { + CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_RFLM); + 8002442: 687b ldr r3, [r7, #4] + 8002444: 681b ldr r3, [r3, #0] + 8002446: 681a ldr r2, [r3, #0] + 8002448: 687b ldr r3, [r7, #4] + 800244a: 681b ldr r3, [r3, #0] + 800244c: f022 0208 bic.w r2, r2, #8 + 8002450: 601a str r2, [r3, #0] + } + + /* Set the transmit FIFO priority */ + if (hcan->Init.TransmitFifoPriority == ENABLE) + 8002452: 687b ldr r3, [r7, #4] + 8002454: 7f5b ldrb r3, [r3, #29] + 8002456: 2b01 cmp r3, #1 + 8002458: d108 bne.n 800246c + { + SET_BIT(hcan->Instance->MCR, CAN_MCR_TXFP); + 800245a: 687b ldr r3, [r7, #4] + 800245c: 681b ldr r3, [r3, #0] + 800245e: 681a ldr r2, [r3, #0] + 8002460: 687b ldr r3, [r7, #4] + 8002462: 681b ldr r3, [r3, #0] + 8002464: f042 0204 orr.w r2, r2, #4 + 8002468: 601a str r2, [r3, #0] + 800246a: e007 b.n 800247c + } + else + { + CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_TXFP); + 800246c: 687b ldr r3, [r7, #4] + 800246e: 681b ldr r3, [r3, #0] + 8002470: 681a ldr r2, [r3, #0] + 8002472: 687b ldr r3, [r7, #4] + 8002474: 681b ldr r3, [r3, #0] + 8002476: f022 0204 bic.w r2, r2, #4 + 800247a: 601a str r2, [r3, #0] + } + + /* Set the bit timing register */ + WRITE_REG(hcan->Instance->BTR, (uint32_t)(hcan->Init.Mode | + 800247c: 687b ldr r3, [r7, #4] + 800247e: 689a ldr r2, [r3, #8] + 8002480: 687b ldr r3, [r7, #4] + 8002482: 68db ldr r3, [r3, #12] + 8002484: 431a orrs r2, r3 + 8002486: 687b ldr r3, [r7, #4] + 8002488: 691b ldr r3, [r3, #16] + 800248a: 431a orrs r2, r3 + 800248c: 687b ldr r3, [r7, #4] + 800248e: 695b ldr r3, [r3, #20] + 8002490: ea42 0103 orr.w r1, r2, r3 + 8002494: 687b ldr r3, [r7, #4] + 8002496: 685b ldr r3, [r3, #4] + 8002498: 1e5a subs r2, r3, #1 + 800249a: 687b ldr r3, [r7, #4] + 800249c: 681b ldr r3, [r3, #0] + 800249e: 430a orrs r2, r1 + 80024a0: 61da str r2, [r3, #28] + hcan->Init.TimeSeg1 | + hcan->Init.TimeSeg2 | + (hcan->Init.Prescaler - 1U))); + + /* Initialize the error code */ + hcan->ErrorCode = HAL_CAN_ERROR_NONE; + 80024a2: 687b ldr r3, [r7, #4] + 80024a4: 2200 movs r2, #0 + 80024a6: 625a str r2, [r3, #36] ; 0x24 + + /* Initialize the CAN state */ + hcan->State = HAL_CAN_STATE_READY; + 80024a8: 687b ldr r3, [r7, #4] + 80024aa: 2201 movs r2, #1 + 80024ac: f883 2020 strb.w r2, [r3, #32] + + /* Return function status */ + return HAL_OK; + 80024b0: 2300 movs r3, #0 +} + 80024b2: 4618 mov r0, r3 + 80024b4: 3710 adds r7, #16 + 80024b6: 46bd mov sp, r7 + 80024b8: bd80 pop {r7, pc} + +080024ba : + * @param sFilterConfig pointer to a CAN_FilterTypeDef structure that + * contains the filter configuration information. + * @retval None + */ +HAL_StatusTypeDef HAL_CAN_ConfigFilter(CAN_HandleTypeDef *hcan, CAN_FilterTypeDef *sFilterConfig) +{ + 80024ba: b480 push {r7} + 80024bc: b087 sub sp, #28 + 80024be: af00 add r7, sp, #0 + 80024c0: 6078 str r0, [r7, #4] + 80024c2: 6039 str r1, [r7, #0] + uint32_t filternbrbitpos; + CAN_TypeDef *can_ip = hcan->Instance; + 80024c4: 687b ldr r3, [r7, #4] + 80024c6: 681b ldr r3, [r3, #0] + 80024c8: 617b str r3, [r7, #20] + HAL_CAN_StateTypeDef state = hcan->State; + 80024ca: 687b ldr r3, [r7, #4] + 80024cc: f893 3020 ldrb.w r3, [r3, #32] + 80024d0: 74fb strb r3, [r7, #19] + + if ((state == HAL_CAN_STATE_READY) || + 80024d2: 7cfb ldrb r3, [r7, #19] + 80024d4: 2b01 cmp r3, #1 + 80024d6: d003 beq.n 80024e0 + 80024d8: 7cfb ldrb r3, [r7, #19] + 80024da: 2b02 cmp r3, #2 + 80024dc: f040 80aa bne.w 8002634 + + /* Check the parameters */ + assert_param(IS_CAN_FILTER_BANK_SINGLE(sFilterConfig->FilterBank)); + + /* Initialisation mode for the filter */ + SET_BIT(can_ip->FMR, CAN_FMR_FINIT); + 80024e0: 697b ldr r3, [r7, #20] + 80024e2: f8d3 3200 ldr.w r3, [r3, #512] ; 0x200 + 80024e6: f043 0201 orr.w r2, r3, #1 + 80024ea: 697b ldr r3, [r7, #20] + 80024ec: f8c3 2200 str.w r2, [r3, #512] ; 0x200 + + /* Convert filter number into bit position */ + filternbrbitpos = (uint32_t)1 << (sFilterConfig->FilterBank & 0x1FU); + 80024f0: 683b ldr r3, [r7, #0] + 80024f2: 695b ldr r3, [r3, #20] + 80024f4: f003 031f and.w r3, r3, #31 + 80024f8: 2201 movs r2, #1 + 80024fa: fa02 f303 lsl.w r3, r2, r3 + 80024fe: 60fb str r3, [r7, #12] + + /* Filter Deactivation */ + CLEAR_BIT(can_ip->FA1R, filternbrbitpos); + 8002500: 697b ldr r3, [r7, #20] + 8002502: f8d3 221c ldr.w r2, [r3, #540] ; 0x21c + 8002506: 68fb ldr r3, [r7, #12] + 8002508: 43db mvns r3, r3 + 800250a: 401a ands r2, r3 + 800250c: 697b ldr r3, [r7, #20] + 800250e: f8c3 221c str.w r2, [r3, #540] ; 0x21c + + /* Filter Scale */ + if (sFilterConfig->FilterScale == CAN_FILTERSCALE_16BIT) + 8002512: 683b ldr r3, [r7, #0] + 8002514: 69db ldr r3, [r3, #28] + 8002516: 2b00 cmp r3, #0 + 8002518: d123 bne.n 8002562 + { + /* 16-bit scale for the filter */ + CLEAR_BIT(can_ip->FS1R, filternbrbitpos); + 800251a: 697b ldr r3, [r7, #20] + 800251c: f8d3 220c ldr.w r2, [r3, #524] ; 0x20c + 8002520: 68fb ldr r3, [r7, #12] + 8002522: 43db mvns r3, r3 + 8002524: 401a ands r2, r3 + 8002526: 697b ldr r3, [r7, #20] + 8002528: f8c3 220c str.w r2, [r3, #524] ; 0x20c + + /* First 16-bit identifier and First 16-bit mask */ + /* Or First 16-bit identifier and Second 16-bit identifier */ + can_ip->sFilterRegister[sFilterConfig->FilterBank].FR1 = + ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdLow) << 16U) | + 800252c: 683b ldr r3, [r7, #0] + 800252e: 68db ldr r3, [r3, #12] + 8002530: 0419 lsls r1, r3, #16 + (0x0000FFFFU & (uint32_t)sFilterConfig->FilterIdLow); + 8002532: 683b ldr r3, [r7, #0] + 8002534: 685b ldr r3, [r3, #4] + 8002536: b29b uxth r3, r3 + can_ip->sFilterRegister[sFilterConfig->FilterBank].FR1 = + 8002538: 683a ldr r2, [r7, #0] + 800253a: 6952 ldr r2, [r2, #20] + ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdLow) << 16U) | + 800253c: 4319 orrs r1, r3 + can_ip->sFilterRegister[sFilterConfig->FilterBank].FR1 = + 800253e: 697b ldr r3, [r7, #20] + 8002540: 3248 adds r2, #72 ; 0x48 + 8002542: f843 1032 str.w r1, [r3, r2, lsl #3] + + /* Second 16-bit identifier and Second 16-bit mask */ + /* Or Third 16-bit identifier and Fourth 16-bit identifier */ + can_ip->sFilterRegister[sFilterConfig->FilterBank].FR2 = + ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdHigh) << 16U) | + 8002546: 683b ldr r3, [r7, #0] + 8002548: 689b ldr r3, [r3, #8] + 800254a: 0419 lsls r1, r3, #16 + (0x0000FFFFU & (uint32_t)sFilterConfig->FilterIdHigh); + 800254c: 683b ldr r3, [r7, #0] + 800254e: 681b ldr r3, [r3, #0] + 8002550: b29a uxth r2, r3 + can_ip->sFilterRegister[sFilterConfig->FilterBank].FR2 = + 8002552: 683b ldr r3, [r7, #0] + 8002554: 695b ldr r3, [r3, #20] + ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdHigh) << 16U) | + 8002556: 430a orrs r2, r1 + can_ip->sFilterRegister[sFilterConfig->FilterBank].FR2 = + 8002558: 6979 ldr r1, [r7, #20] + 800255a: 3348 adds r3, #72 ; 0x48 + 800255c: 00db lsls r3, r3, #3 + 800255e: 440b add r3, r1 + 8002560: 605a str r2, [r3, #4] + } + + if (sFilterConfig->FilterScale == CAN_FILTERSCALE_32BIT) + 8002562: 683b ldr r3, [r7, #0] + 8002564: 69db ldr r3, [r3, #28] + 8002566: 2b01 cmp r3, #1 + 8002568: d122 bne.n 80025b0 + { + /* 32-bit scale for the filter */ + SET_BIT(can_ip->FS1R, filternbrbitpos); + 800256a: 697b ldr r3, [r7, #20] + 800256c: f8d3 220c ldr.w r2, [r3, #524] ; 0x20c + 8002570: 68fb ldr r3, [r7, #12] + 8002572: 431a orrs r2, r3 + 8002574: 697b ldr r3, [r7, #20] + 8002576: f8c3 220c str.w r2, [r3, #524] ; 0x20c + + /* 32-bit identifier or First 32-bit identifier */ + can_ip->sFilterRegister[sFilterConfig->FilterBank].FR1 = + ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterIdHigh) << 16U) | + 800257a: 683b ldr r3, [r7, #0] + 800257c: 681b ldr r3, [r3, #0] + 800257e: 0419 lsls r1, r3, #16 + (0x0000FFFFU & (uint32_t)sFilterConfig->FilterIdLow); + 8002580: 683b ldr r3, [r7, #0] + 8002582: 685b ldr r3, [r3, #4] + 8002584: b29b uxth r3, r3 + can_ip->sFilterRegister[sFilterConfig->FilterBank].FR1 = + 8002586: 683a ldr r2, [r7, #0] + 8002588: 6952 ldr r2, [r2, #20] + ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterIdHigh) << 16U) | + 800258a: 4319 orrs r1, r3 + can_ip->sFilterRegister[sFilterConfig->FilterBank].FR1 = + 800258c: 697b ldr r3, [r7, #20] + 800258e: 3248 adds r2, #72 ; 0x48 + 8002590: f843 1032 str.w r1, [r3, r2, lsl #3] + + /* 32-bit mask or Second 32-bit identifier */ + can_ip->sFilterRegister[sFilterConfig->FilterBank].FR2 = + ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdHigh) << 16U) | + 8002594: 683b ldr r3, [r7, #0] + 8002596: 689b ldr r3, [r3, #8] + 8002598: 0419 lsls r1, r3, #16 + (0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdLow); + 800259a: 683b ldr r3, [r7, #0] + 800259c: 68db ldr r3, [r3, #12] + 800259e: b29a uxth r2, r3 + can_ip->sFilterRegister[sFilterConfig->FilterBank].FR2 = + 80025a0: 683b ldr r3, [r7, #0] + 80025a2: 695b ldr r3, [r3, #20] + ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdHigh) << 16U) | + 80025a4: 430a orrs r2, r1 + can_ip->sFilterRegister[sFilterConfig->FilterBank].FR2 = + 80025a6: 6979 ldr r1, [r7, #20] + 80025a8: 3348 adds r3, #72 ; 0x48 + 80025aa: 00db lsls r3, r3, #3 + 80025ac: 440b add r3, r1 + 80025ae: 605a str r2, [r3, #4] + } + + /* Filter Mode */ + if (sFilterConfig->FilterMode == CAN_FILTERMODE_IDMASK) + 80025b0: 683b ldr r3, [r7, #0] + 80025b2: 699b ldr r3, [r3, #24] + 80025b4: 2b00 cmp r3, #0 + 80025b6: d109 bne.n 80025cc + { + /* Id/Mask mode for the filter*/ + CLEAR_BIT(can_ip->FM1R, filternbrbitpos); + 80025b8: 697b ldr r3, [r7, #20] + 80025ba: f8d3 2204 ldr.w r2, [r3, #516] ; 0x204 + 80025be: 68fb ldr r3, [r7, #12] + 80025c0: 43db mvns r3, r3 + 80025c2: 401a ands r2, r3 + 80025c4: 697b ldr r3, [r7, #20] + 80025c6: f8c3 2204 str.w r2, [r3, #516] ; 0x204 + 80025ca: e007 b.n 80025dc + } + else /* CAN_FilterInitStruct->CAN_FilterMode == CAN_FilterMode_IdList */ + { + /* Identifier list mode for the filter*/ + SET_BIT(can_ip->FM1R, filternbrbitpos); + 80025cc: 697b ldr r3, [r7, #20] + 80025ce: f8d3 2204 ldr.w r2, [r3, #516] ; 0x204 + 80025d2: 68fb ldr r3, [r7, #12] + 80025d4: 431a orrs r2, r3 + 80025d6: 697b ldr r3, [r7, #20] + 80025d8: f8c3 2204 str.w r2, [r3, #516] ; 0x204 + } + + /* Filter FIFO assignment */ + if (sFilterConfig->FilterFIFOAssignment == CAN_FILTER_FIFO0) + 80025dc: 683b ldr r3, [r7, #0] + 80025de: 691b ldr r3, [r3, #16] + 80025e0: 2b00 cmp r3, #0 + 80025e2: d109 bne.n 80025f8 + { + /* FIFO 0 assignation for the filter */ + CLEAR_BIT(can_ip->FFA1R, filternbrbitpos); + 80025e4: 697b ldr r3, [r7, #20] + 80025e6: f8d3 2214 ldr.w r2, [r3, #532] ; 0x214 + 80025ea: 68fb ldr r3, [r7, #12] + 80025ec: 43db mvns r3, r3 + 80025ee: 401a ands r2, r3 + 80025f0: 697b ldr r3, [r7, #20] + 80025f2: f8c3 2214 str.w r2, [r3, #532] ; 0x214 + 80025f6: e007 b.n 8002608 + } + else + { + /* FIFO 1 assignation for the filter */ + SET_BIT(can_ip->FFA1R, filternbrbitpos); + 80025f8: 697b ldr r3, [r7, #20] + 80025fa: f8d3 2214 ldr.w r2, [r3, #532] ; 0x214 + 80025fe: 68fb ldr r3, [r7, #12] + 8002600: 431a orrs r2, r3 + 8002602: 697b ldr r3, [r7, #20] + 8002604: f8c3 2214 str.w r2, [r3, #532] ; 0x214 + } + + /* Filter activation */ + if (sFilterConfig->FilterActivation == CAN_FILTER_ENABLE) + 8002608: 683b ldr r3, [r7, #0] + 800260a: 6a1b ldr r3, [r3, #32] + 800260c: 2b01 cmp r3, #1 + 800260e: d107 bne.n 8002620 + { + SET_BIT(can_ip->FA1R, filternbrbitpos); + 8002610: 697b ldr r3, [r7, #20] + 8002612: f8d3 221c ldr.w r2, [r3, #540] ; 0x21c + 8002616: 68fb ldr r3, [r7, #12] + 8002618: 431a orrs r2, r3 + 800261a: 697b ldr r3, [r7, #20] + 800261c: f8c3 221c str.w r2, [r3, #540] ; 0x21c + } + + /* Leave the initialisation mode for the filter */ + CLEAR_BIT(can_ip->FMR, CAN_FMR_FINIT); + 8002620: 697b ldr r3, [r7, #20] + 8002622: f8d3 3200 ldr.w r3, [r3, #512] ; 0x200 + 8002626: f023 0201 bic.w r2, r3, #1 + 800262a: 697b ldr r3, [r7, #20] + 800262c: f8c3 2200 str.w r2, [r3, #512] ; 0x200 + + /* Return function status */ + return HAL_OK; + 8002630: 2300 movs r3, #0 + 8002632: e006 b.n 8002642 + } + else + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED; + 8002634: 687b ldr r3, [r7, #4] + 8002636: 6a5b ldr r3, [r3, #36] ; 0x24 + 8002638: f443 2280 orr.w r2, r3, #262144 ; 0x40000 + 800263c: 687b ldr r3, [r7, #4] + 800263e: 625a str r2, [r3, #36] ; 0x24 + + return HAL_ERROR; + 8002640: 2301 movs r3, #1 + } +} + 8002642: 4618 mov r0, r3 + 8002644: 371c adds r7, #28 + 8002646: 46bd mov sp, r7 + 8002648: f85d 7b04 ldr.w r7, [sp], #4 + 800264c: 4770 bx lr + +0800264e : + * @param hcan pointer to an CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_CAN_Start(CAN_HandleTypeDef *hcan) +{ + 800264e: b580 push {r7, lr} + 8002650: b084 sub sp, #16 + 8002652: af00 add r7, sp, #0 + 8002654: 6078 str r0, [r7, #4] + uint32_t tickstart; + + if (hcan->State == HAL_CAN_STATE_READY) + 8002656: 687b ldr r3, [r7, #4] + 8002658: f893 3020 ldrb.w r3, [r3, #32] + 800265c: b2db uxtb r3, r3 + 800265e: 2b01 cmp r3, #1 + 8002660: d12e bne.n 80026c0 + { + /* Change CAN peripheral state */ + hcan->State = HAL_CAN_STATE_LISTENING; + 8002662: 687b ldr r3, [r7, #4] + 8002664: 2202 movs r2, #2 + 8002666: f883 2020 strb.w r2, [r3, #32] + + /* Request leave initialisation */ + CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_INRQ); + 800266a: 687b ldr r3, [r7, #4] + 800266c: 681b ldr r3, [r3, #0] + 800266e: 681a ldr r2, [r3, #0] + 8002670: 687b ldr r3, [r7, #4] + 8002672: 681b ldr r3, [r3, #0] + 8002674: f022 0201 bic.w r2, r2, #1 + 8002678: 601a str r2, [r3, #0] + + /* Get tick */ + tickstart = HAL_GetTick(); + 800267a: f7ff fdf3 bl 8002264 + 800267e: 60f8 str r0, [r7, #12] + + /* Wait the acknowledge */ + while ((hcan->Instance->MSR & CAN_MSR_INAK) != 0U) + 8002680: e012 b.n 80026a8 + { + /* Check for the Timeout */ + if ((HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE) + 8002682: f7ff fdef bl 8002264 + 8002686: 4602 mov r2, r0 + 8002688: 68fb ldr r3, [r7, #12] + 800268a: 1ad3 subs r3, r2, r3 + 800268c: 2b0a cmp r3, #10 + 800268e: d90b bls.n 80026a8 + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_TIMEOUT; + 8002690: 687b ldr r3, [r7, #4] + 8002692: 6a5b ldr r3, [r3, #36] ; 0x24 + 8002694: f443 3200 orr.w r2, r3, #131072 ; 0x20000 + 8002698: 687b ldr r3, [r7, #4] + 800269a: 625a str r2, [r3, #36] ; 0x24 + + /* Change CAN state */ + hcan->State = HAL_CAN_STATE_ERROR; + 800269c: 687b ldr r3, [r7, #4] + 800269e: 2205 movs r2, #5 + 80026a0: f883 2020 strb.w r2, [r3, #32] + + return HAL_ERROR; + 80026a4: 2301 movs r3, #1 + 80026a6: e012 b.n 80026ce + while ((hcan->Instance->MSR & CAN_MSR_INAK) != 0U) + 80026a8: 687b ldr r3, [r7, #4] + 80026aa: 681b ldr r3, [r3, #0] + 80026ac: 685b ldr r3, [r3, #4] + 80026ae: f003 0301 and.w r3, r3, #1 + 80026b2: 2b00 cmp r3, #0 + 80026b4: d1e5 bne.n 8002682 + } + } + + /* Reset the CAN ErrorCode */ + hcan->ErrorCode = HAL_CAN_ERROR_NONE; + 80026b6: 687b ldr r3, [r7, #4] + 80026b8: 2200 movs r2, #0 + 80026ba: 625a str r2, [r3, #36] ; 0x24 + + /* Return function status */ + return HAL_OK; + 80026bc: 2300 movs r3, #0 + 80026be: e006 b.n 80026ce + } + else + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_NOT_READY; + 80026c0: 687b ldr r3, [r7, #4] + 80026c2: 6a5b ldr r3, [r3, #36] ; 0x24 + 80026c4: f443 2200 orr.w r2, r3, #524288 ; 0x80000 + 80026c8: 687b ldr r3, [r7, #4] + 80026ca: 625a str r2, [r3, #36] ; 0x24 + + return HAL_ERROR; + 80026cc: 2301 movs r3, #1 + } +} + 80026ce: 4618 mov r0, r3 + 80026d0: 3710 adds r7, #16 + 80026d2: 46bd mov sp, r7 + 80026d4: bd80 pop {r7, pc} + +080026d6 : + * the TxMailbox used to store the Tx message. + * This parameter can be a value of @arg CAN_Tx_Mailboxes. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_CAN_AddTxMessage(CAN_HandleTypeDef *hcan, CAN_TxHeaderTypeDef *pHeader, uint8_t aData[], uint32_t *pTxMailbox) +{ + 80026d6: b480 push {r7} + 80026d8: b089 sub sp, #36 ; 0x24 + 80026da: af00 add r7, sp, #0 + 80026dc: 60f8 str r0, [r7, #12] + 80026de: 60b9 str r1, [r7, #8] + 80026e0: 607a str r2, [r7, #4] + 80026e2: 603b str r3, [r7, #0] + uint32_t transmitmailbox; + HAL_CAN_StateTypeDef state = hcan->State; + 80026e4: 68fb ldr r3, [r7, #12] + 80026e6: f893 3020 ldrb.w r3, [r3, #32] + 80026ea: 77fb strb r3, [r7, #31] + uint32_t tsr = READ_REG(hcan->Instance->TSR); + 80026ec: 68fb ldr r3, [r7, #12] + 80026ee: 681b ldr r3, [r3, #0] + 80026f0: 689b ldr r3, [r3, #8] + 80026f2: 61bb str r3, [r7, #24] + { + assert_param(IS_CAN_EXTID(pHeader->ExtId)); + } + assert_param(IS_FUNCTIONAL_STATE(pHeader->TransmitGlobalTime)); + + if ((state == HAL_CAN_STATE_READY) || + 80026f4: 7ffb ldrb r3, [r7, #31] + 80026f6: 2b01 cmp r3, #1 + 80026f8: d003 beq.n 8002702 + 80026fa: 7ffb ldrb r3, [r7, #31] + 80026fc: 2b02 cmp r3, #2 + 80026fe: f040 80b8 bne.w 8002872 + (state == HAL_CAN_STATE_LISTENING)) + { + /* Check that all the Tx mailboxes are not full */ + if (((tsr & CAN_TSR_TME0) != 0U) || + 8002702: 69bb ldr r3, [r7, #24] + 8002704: f003 6380 and.w r3, r3, #67108864 ; 0x4000000 + 8002708: 2b00 cmp r3, #0 + 800270a: d10a bne.n 8002722 + ((tsr & CAN_TSR_TME1) != 0U) || + 800270c: 69bb ldr r3, [r7, #24] + 800270e: f003 6300 and.w r3, r3, #134217728 ; 0x8000000 + if (((tsr & CAN_TSR_TME0) != 0U) || + 8002712: 2b00 cmp r3, #0 + 8002714: d105 bne.n 8002722 + ((tsr & CAN_TSR_TME2) != 0U)) + 8002716: 69bb ldr r3, [r7, #24] + 8002718: f003 5380 and.w r3, r3, #268435456 ; 0x10000000 + ((tsr & CAN_TSR_TME1) != 0U) || + 800271c: 2b00 cmp r3, #0 + 800271e: f000 80a0 beq.w 8002862 + { + /* Select an empty transmit mailbox */ + transmitmailbox = (tsr & CAN_TSR_CODE) >> CAN_TSR_CODE_Pos; + 8002722: 69bb ldr r3, [r7, #24] + 8002724: 0e1b lsrs r3, r3, #24 + 8002726: f003 0303 and.w r3, r3, #3 + 800272a: 617b str r3, [r7, #20] + + /* Check transmit mailbox value */ + if (transmitmailbox > 2U) + 800272c: 697b ldr r3, [r7, #20] + 800272e: 2b02 cmp r3, #2 + 8002730: d907 bls.n 8002742 + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_INTERNAL; + 8002732: 68fb ldr r3, [r7, #12] + 8002734: 6a5b ldr r3, [r3, #36] ; 0x24 + 8002736: f443 0200 orr.w r2, r3, #8388608 ; 0x800000 + 800273a: 68fb ldr r3, [r7, #12] + 800273c: 625a str r2, [r3, #36] ; 0x24 + + return HAL_ERROR; + 800273e: 2301 movs r3, #1 + 8002740: e09e b.n 8002880 + } + + /* Store the Tx mailbox */ + *pTxMailbox = (uint32_t)1 << transmitmailbox; + 8002742: 2201 movs r2, #1 + 8002744: 697b ldr r3, [r7, #20] + 8002746: 409a lsls r2, r3 + 8002748: 683b ldr r3, [r7, #0] + 800274a: 601a str r2, [r3, #0] + + /* Set up the Id */ + if (pHeader->IDE == CAN_ID_STD) + 800274c: 68bb ldr r3, [r7, #8] + 800274e: 689b ldr r3, [r3, #8] + 8002750: 2b00 cmp r3, #0 + 8002752: d10d bne.n 8002770 + { + hcan->Instance->sTxMailBox[transmitmailbox].TIR = ((pHeader->StdId << CAN_TI0R_STID_Pos) | + 8002754: 68bb ldr r3, [r7, #8] + 8002756: 681b ldr r3, [r3, #0] + 8002758: 055a lsls r2, r3, #21 + pHeader->RTR); + 800275a: 68bb ldr r3, [r7, #8] + 800275c: 68db ldr r3, [r3, #12] + hcan->Instance->sTxMailBox[transmitmailbox].TIR = ((pHeader->StdId << CAN_TI0R_STID_Pos) | + 800275e: 68f9 ldr r1, [r7, #12] + 8002760: 6809 ldr r1, [r1, #0] + 8002762: 431a orrs r2, r3 + 8002764: 697b ldr r3, [r7, #20] + 8002766: 3318 adds r3, #24 + 8002768: 011b lsls r3, r3, #4 + 800276a: 440b add r3, r1 + 800276c: 601a str r2, [r3, #0] + 800276e: e00f b.n 8002790 + } + else + { + hcan->Instance->sTxMailBox[transmitmailbox].TIR = ((pHeader->ExtId << CAN_TI0R_EXID_Pos) | + 8002770: 68bb ldr r3, [r7, #8] + 8002772: 685b ldr r3, [r3, #4] + 8002774: 00da lsls r2, r3, #3 + pHeader->IDE | + 8002776: 68bb ldr r3, [r7, #8] + 8002778: 689b ldr r3, [r3, #8] + hcan->Instance->sTxMailBox[transmitmailbox].TIR = ((pHeader->ExtId << CAN_TI0R_EXID_Pos) | + 800277a: 431a orrs r2, r3 + pHeader->RTR); + 800277c: 68bb ldr r3, [r7, #8] + 800277e: 68db ldr r3, [r3, #12] + hcan->Instance->sTxMailBox[transmitmailbox].TIR = ((pHeader->ExtId << CAN_TI0R_EXID_Pos) | + 8002780: 68f9 ldr r1, [r7, #12] + 8002782: 6809 ldr r1, [r1, #0] + pHeader->IDE | + 8002784: 431a orrs r2, r3 + hcan->Instance->sTxMailBox[transmitmailbox].TIR = ((pHeader->ExtId << CAN_TI0R_EXID_Pos) | + 8002786: 697b ldr r3, [r7, #20] + 8002788: 3318 adds r3, #24 + 800278a: 011b lsls r3, r3, #4 + 800278c: 440b add r3, r1 + 800278e: 601a str r2, [r3, #0] + } + + /* Set up the DLC */ + hcan->Instance->sTxMailBox[transmitmailbox].TDTR = (pHeader->DLC); + 8002790: 68fb ldr r3, [r7, #12] + 8002792: 6819 ldr r1, [r3, #0] + 8002794: 68bb ldr r3, [r7, #8] + 8002796: 691a ldr r2, [r3, #16] + 8002798: 697b ldr r3, [r7, #20] + 800279a: 3318 adds r3, #24 + 800279c: 011b lsls r3, r3, #4 + 800279e: 440b add r3, r1 + 80027a0: 3304 adds r3, #4 + 80027a2: 601a str r2, [r3, #0] + + /* Set up the Transmit Global Time mode */ + if (pHeader->TransmitGlobalTime == ENABLE) + 80027a4: 68bb ldr r3, [r7, #8] + 80027a6: 7d1b ldrb r3, [r3, #20] + 80027a8: 2b01 cmp r3, #1 + 80027aa: d111 bne.n 80027d0 + { + SET_BIT(hcan->Instance->sTxMailBox[transmitmailbox].TDTR, CAN_TDT0R_TGT); + 80027ac: 68fb ldr r3, [r7, #12] + 80027ae: 681a ldr r2, [r3, #0] + 80027b0: 697b ldr r3, [r7, #20] + 80027b2: 3318 adds r3, #24 + 80027b4: 011b lsls r3, r3, #4 + 80027b6: 4413 add r3, r2 + 80027b8: 3304 adds r3, #4 + 80027ba: 681b ldr r3, [r3, #0] + 80027bc: 68fa ldr r2, [r7, #12] + 80027be: 6811 ldr r1, [r2, #0] + 80027c0: f443 7280 orr.w r2, r3, #256 ; 0x100 + 80027c4: 697b ldr r3, [r7, #20] + 80027c6: 3318 adds r3, #24 + 80027c8: 011b lsls r3, r3, #4 + 80027ca: 440b add r3, r1 + 80027cc: 3304 adds r3, #4 + 80027ce: 601a str r2, [r3, #0] + } + + /* Set up the data field */ + WRITE_REG(hcan->Instance->sTxMailBox[transmitmailbox].TDHR, + 80027d0: 687b ldr r3, [r7, #4] + 80027d2: 3307 adds r3, #7 + 80027d4: 781b ldrb r3, [r3, #0] + 80027d6: 061a lsls r2, r3, #24 + 80027d8: 687b ldr r3, [r7, #4] + 80027da: 3306 adds r3, #6 + 80027dc: 781b ldrb r3, [r3, #0] + 80027de: 041b lsls r3, r3, #16 + 80027e0: 431a orrs r2, r3 + 80027e2: 687b ldr r3, [r7, #4] + 80027e4: 3305 adds r3, #5 + 80027e6: 781b ldrb r3, [r3, #0] + 80027e8: 021b lsls r3, r3, #8 + 80027ea: 4313 orrs r3, r2 + 80027ec: 687a ldr r2, [r7, #4] + 80027ee: 3204 adds r2, #4 + 80027f0: 7812 ldrb r2, [r2, #0] + 80027f2: 4610 mov r0, r2 + 80027f4: 68fa ldr r2, [r7, #12] + 80027f6: 6811 ldr r1, [r2, #0] + 80027f8: ea43 0200 orr.w r2, r3, r0 + 80027fc: 697b ldr r3, [r7, #20] + 80027fe: 011b lsls r3, r3, #4 + 8002800: 440b add r3, r1 + 8002802: f503 73c6 add.w r3, r3, #396 ; 0x18c + 8002806: 601a str r2, [r3, #0] + ((uint32_t)aData[7] << CAN_TDH0R_DATA7_Pos) | + ((uint32_t)aData[6] << CAN_TDH0R_DATA6_Pos) | + ((uint32_t)aData[5] << CAN_TDH0R_DATA5_Pos) | + ((uint32_t)aData[4] << CAN_TDH0R_DATA4_Pos)); + WRITE_REG(hcan->Instance->sTxMailBox[transmitmailbox].TDLR, + 8002808: 687b ldr r3, [r7, #4] + 800280a: 3303 adds r3, #3 + 800280c: 781b ldrb r3, [r3, #0] + 800280e: 061a lsls r2, r3, #24 + 8002810: 687b ldr r3, [r7, #4] + 8002812: 3302 adds r3, #2 + 8002814: 781b ldrb r3, [r3, #0] + 8002816: 041b lsls r3, r3, #16 + 8002818: 431a orrs r2, r3 + 800281a: 687b ldr r3, [r7, #4] + 800281c: 3301 adds r3, #1 + 800281e: 781b ldrb r3, [r3, #0] + 8002820: 021b lsls r3, r3, #8 + 8002822: 4313 orrs r3, r2 + 8002824: 687a ldr r2, [r7, #4] + 8002826: 7812 ldrb r2, [r2, #0] + 8002828: 4610 mov r0, r2 + 800282a: 68fa ldr r2, [r7, #12] + 800282c: 6811 ldr r1, [r2, #0] + 800282e: ea43 0200 orr.w r2, r3, r0 + 8002832: 697b ldr r3, [r7, #20] + 8002834: 011b lsls r3, r3, #4 + 8002836: 440b add r3, r1 + 8002838: f503 73c4 add.w r3, r3, #392 ; 0x188 + 800283c: 601a str r2, [r3, #0] + ((uint32_t)aData[2] << CAN_TDL0R_DATA2_Pos) | + ((uint32_t)aData[1] << CAN_TDL0R_DATA1_Pos) | + ((uint32_t)aData[0] << CAN_TDL0R_DATA0_Pos)); + + /* Request transmission */ + SET_BIT(hcan->Instance->sTxMailBox[transmitmailbox].TIR, CAN_TI0R_TXRQ); + 800283e: 68fb ldr r3, [r7, #12] + 8002840: 681a ldr r2, [r3, #0] + 8002842: 697b ldr r3, [r7, #20] + 8002844: 3318 adds r3, #24 + 8002846: 011b lsls r3, r3, #4 + 8002848: 4413 add r3, r2 + 800284a: 681b ldr r3, [r3, #0] + 800284c: 68fa ldr r2, [r7, #12] + 800284e: 6811 ldr r1, [r2, #0] + 8002850: f043 0201 orr.w r2, r3, #1 + 8002854: 697b ldr r3, [r7, #20] + 8002856: 3318 adds r3, #24 + 8002858: 011b lsls r3, r3, #4 + 800285a: 440b add r3, r1 + 800285c: 601a str r2, [r3, #0] + + /* Return function status */ + return HAL_OK; + 800285e: 2300 movs r3, #0 + 8002860: e00e b.n 8002880 + } + else + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_PARAM; + 8002862: 68fb ldr r3, [r7, #12] + 8002864: 6a5b ldr r3, [r3, #36] ; 0x24 + 8002866: f443 1200 orr.w r2, r3, #2097152 ; 0x200000 + 800286a: 68fb ldr r3, [r7, #12] + 800286c: 625a str r2, [r3, #36] ; 0x24 + + return HAL_ERROR; + 800286e: 2301 movs r3, #1 + 8002870: e006 b.n 8002880 + } + } + else + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED; + 8002872: 68fb ldr r3, [r7, #12] + 8002874: 6a5b ldr r3, [r3, #36] ; 0x24 + 8002876: f443 2280 orr.w r2, r3, #262144 ; 0x40000 + 800287a: 68fb ldr r3, [r7, #12] + 800287c: 625a str r2, [r3, #36] ; 0x24 + + return HAL_ERROR; + 800287e: 2301 movs r3, #1 + } +} + 8002880: 4618 mov r0, r3 + 8002882: 3724 adds r7, #36 ; 0x24 + 8002884: 46bd mov sp, r7 + 8002886: f85d 7b04 ldr.w r7, [sp], #4 + 800288a: 4770 bx lr + +0800288c : + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval Number of free Tx Mailboxes. + */ +uint32_t HAL_CAN_GetTxMailboxesFreeLevel(CAN_HandleTypeDef *hcan) +{ + 800288c: b480 push {r7} + 800288e: b085 sub sp, #20 + 8002890: af00 add r7, sp, #0 + 8002892: 6078 str r0, [r7, #4] + uint32_t freelevel = 0U; + 8002894: 2300 movs r3, #0 + 8002896: 60fb str r3, [r7, #12] + HAL_CAN_StateTypeDef state = hcan->State; + 8002898: 687b ldr r3, [r7, #4] + 800289a: f893 3020 ldrb.w r3, [r3, #32] + 800289e: 72fb strb r3, [r7, #11] + + if ((state == HAL_CAN_STATE_READY) || + 80028a0: 7afb ldrb r3, [r7, #11] + 80028a2: 2b01 cmp r3, #1 + 80028a4: d002 beq.n 80028ac + 80028a6: 7afb ldrb r3, [r7, #11] + 80028a8: 2b02 cmp r3, #2 + 80028aa: d11d bne.n 80028e8 + (state == HAL_CAN_STATE_LISTENING)) + { + /* Check Tx Mailbox 0 status */ + if ((hcan->Instance->TSR & CAN_TSR_TME0) != 0U) + 80028ac: 687b ldr r3, [r7, #4] + 80028ae: 681b ldr r3, [r3, #0] + 80028b0: 689b ldr r3, [r3, #8] + 80028b2: f003 6380 and.w r3, r3, #67108864 ; 0x4000000 + 80028b6: 2b00 cmp r3, #0 + 80028b8: d002 beq.n 80028c0 + { + freelevel++; + 80028ba: 68fb ldr r3, [r7, #12] + 80028bc: 3301 adds r3, #1 + 80028be: 60fb str r3, [r7, #12] + } + + /* Check Tx Mailbox 1 status */ + if ((hcan->Instance->TSR & CAN_TSR_TME1) != 0U) + 80028c0: 687b ldr r3, [r7, #4] + 80028c2: 681b ldr r3, [r3, #0] + 80028c4: 689b ldr r3, [r3, #8] + 80028c6: f003 6300 and.w r3, r3, #134217728 ; 0x8000000 + 80028ca: 2b00 cmp r3, #0 + 80028cc: d002 beq.n 80028d4 + { + freelevel++; + 80028ce: 68fb ldr r3, [r7, #12] + 80028d0: 3301 adds r3, #1 + 80028d2: 60fb str r3, [r7, #12] + } + + /* Check Tx Mailbox 2 status */ + if ((hcan->Instance->TSR & CAN_TSR_TME2) != 0U) + 80028d4: 687b ldr r3, [r7, #4] + 80028d6: 681b ldr r3, [r3, #0] + 80028d8: 689b ldr r3, [r3, #8] + 80028da: f003 5380 and.w r3, r3, #268435456 ; 0x10000000 + 80028de: 2b00 cmp r3, #0 + 80028e0: d002 beq.n 80028e8 + { + freelevel++; + 80028e2: 68fb ldr r3, [r7, #12] + 80028e4: 3301 adds r3, #1 + 80028e6: 60fb str r3, [r7, #12] + } + } + + /* Return Tx Mailboxes free level */ + return freelevel; + 80028e8: 68fb ldr r3, [r7, #12] +} + 80028ea: 4618 mov r0, r3 + 80028ec: 3714 adds r7, #20 + 80028ee: 46bd mov sp, r7 + 80028f0: f85d 7b04 ldr.w r7, [sp], #4 + 80028f4: 4770 bx lr + +080028f6 : + * of the Rx frame will be stored. + * @param aData array where the payload of the Rx frame will be stored. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_CAN_GetRxMessage(CAN_HandleTypeDef *hcan, uint32_t RxFifo, CAN_RxHeaderTypeDef *pHeader, uint8_t aData[]) +{ + 80028f6: b480 push {r7} + 80028f8: b087 sub sp, #28 + 80028fa: af00 add r7, sp, #0 + 80028fc: 60f8 str r0, [r7, #12] + 80028fe: 60b9 str r1, [r7, #8] + 8002900: 607a str r2, [r7, #4] + 8002902: 603b str r3, [r7, #0] + HAL_CAN_StateTypeDef state = hcan->State; + 8002904: 68fb ldr r3, [r7, #12] + 8002906: f893 3020 ldrb.w r3, [r3, #32] + 800290a: 75fb strb r3, [r7, #23] + + assert_param(IS_CAN_RX_FIFO(RxFifo)); + + if ((state == HAL_CAN_STATE_READY) || + 800290c: 7dfb ldrb r3, [r7, #23] + 800290e: 2b01 cmp r3, #1 + 8002910: d003 beq.n 800291a + 8002912: 7dfb ldrb r3, [r7, #23] + 8002914: 2b02 cmp r3, #2 + 8002916: f040 80f3 bne.w 8002b00 + (state == HAL_CAN_STATE_LISTENING)) + { + /* Check the Rx FIFO */ + if (RxFifo == CAN_RX_FIFO0) /* Rx element is assigned to Rx FIFO 0 */ + 800291a: 68bb ldr r3, [r7, #8] + 800291c: 2b00 cmp r3, #0 + 800291e: d10e bne.n 800293e + { + /* Check that the Rx FIFO 0 is not empty */ + if ((hcan->Instance->RF0R & CAN_RF0R_FMP0) == 0U) + 8002920: 68fb ldr r3, [r7, #12] + 8002922: 681b ldr r3, [r3, #0] + 8002924: 68db ldr r3, [r3, #12] + 8002926: f003 0303 and.w r3, r3, #3 + 800292a: 2b00 cmp r3, #0 + 800292c: d116 bne.n 800295c + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_PARAM; + 800292e: 68fb ldr r3, [r7, #12] + 8002930: 6a5b ldr r3, [r3, #36] ; 0x24 + 8002932: f443 1200 orr.w r2, r3, #2097152 ; 0x200000 + 8002936: 68fb ldr r3, [r7, #12] + 8002938: 625a str r2, [r3, #36] ; 0x24 + + return HAL_ERROR; + 800293a: 2301 movs r3, #1 + 800293c: e0e7 b.n 8002b0e + } + } + else /* Rx element is assigned to Rx FIFO 1 */ + { + /* Check that the Rx FIFO 1 is not empty */ + if ((hcan->Instance->RF1R & CAN_RF1R_FMP1) == 0U) + 800293e: 68fb ldr r3, [r7, #12] + 8002940: 681b ldr r3, [r3, #0] + 8002942: 691b ldr r3, [r3, #16] + 8002944: f003 0303 and.w r3, r3, #3 + 8002948: 2b00 cmp r3, #0 + 800294a: d107 bne.n 800295c + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_PARAM; + 800294c: 68fb ldr r3, [r7, #12] + 800294e: 6a5b ldr r3, [r3, #36] ; 0x24 + 8002950: f443 1200 orr.w r2, r3, #2097152 ; 0x200000 + 8002954: 68fb ldr r3, [r7, #12] + 8002956: 625a str r2, [r3, #36] ; 0x24 + + return HAL_ERROR; + 8002958: 2301 movs r3, #1 + 800295a: e0d8 b.n 8002b0e + } + } + + /* Get the header */ + pHeader->IDE = CAN_RI0R_IDE & hcan->Instance->sFIFOMailBox[RxFifo].RIR; + 800295c: 68fb ldr r3, [r7, #12] + 800295e: 681a ldr r2, [r3, #0] + 8002960: 68bb ldr r3, [r7, #8] + 8002962: 331b adds r3, #27 + 8002964: 011b lsls r3, r3, #4 + 8002966: 4413 add r3, r2 + 8002968: 681b ldr r3, [r3, #0] + 800296a: f003 0204 and.w r2, r3, #4 + 800296e: 687b ldr r3, [r7, #4] + 8002970: 609a str r2, [r3, #8] + if (pHeader->IDE == CAN_ID_STD) + 8002972: 687b ldr r3, [r7, #4] + 8002974: 689b ldr r3, [r3, #8] + 8002976: 2b00 cmp r3, #0 + 8002978: d10c bne.n 8002994 + { + pHeader->StdId = (CAN_RI0R_STID & hcan->Instance->sFIFOMailBox[RxFifo].RIR) >> CAN_TI0R_STID_Pos; + 800297a: 68fb ldr r3, [r7, #12] + 800297c: 681a ldr r2, [r3, #0] + 800297e: 68bb ldr r3, [r7, #8] + 8002980: 331b adds r3, #27 + 8002982: 011b lsls r3, r3, #4 + 8002984: 4413 add r3, r2 + 8002986: 681b ldr r3, [r3, #0] + 8002988: 0d5b lsrs r3, r3, #21 + 800298a: f3c3 020a ubfx r2, r3, #0, #11 + 800298e: 687b ldr r3, [r7, #4] + 8002990: 601a str r2, [r3, #0] + 8002992: e00b b.n 80029ac + } + else + { + pHeader->ExtId = ((CAN_RI0R_EXID | CAN_RI0R_STID) & hcan->Instance->sFIFOMailBox[RxFifo].RIR) >> CAN_RI0R_EXID_Pos; + 8002994: 68fb ldr r3, [r7, #12] + 8002996: 681a ldr r2, [r3, #0] + 8002998: 68bb ldr r3, [r7, #8] + 800299a: 331b adds r3, #27 + 800299c: 011b lsls r3, r3, #4 + 800299e: 4413 add r3, r2 + 80029a0: 681b ldr r3, [r3, #0] + 80029a2: 08db lsrs r3, r3, #3 + 80029a4: f023 4260 bic.w r2, r3, #3758096384 ; 0xe0000000 + 80029a8: 687b ldr r3, [r7, #4] + 80029aa: 605a str r2, [r3, #4] + } + pHeader->RTR = (CAN_RI0R_RTR & hcan->Instance->sFIFOMailBox[RxFifo].RIR); + 80029ac: 68fb ldr r3, [r7, #12] + 80029ae: 681a ldr r2, [r3, #0] + 80029b0: 68bb ldr r3, [r7, #8] + 80029b2: 331b adds r3, #27 + 80029b4: 011b lsls r3, r3, #4 + 80029b6: 4413 add r3, r2 + 80029b8: 681b ldr r3, [r3, #0] + 80029ba: f003 0202 and.w r2, r3, #2 + 80029be: 687b ldr r3, [r7, #4] + 80029c0: 60da str r2, [r3, #12] + pHeader->DLC = (CAN_RDT0R_DLC & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_DLC_Pos; + 80029c2: 68fb ldr r3, [r7, #12] + 80029c4: 681a ldr r2, [r3, #0] + 80029c6: 68bb ldr r3, [r7, #8] + 80029c8: 331b adds r3, #27 + 80029ca: 011b lsls r3, r3, #4 + 80029cc: 4413 add r3, r2 + 80029ce: 3304 adds r3, #4 + 80029d0: 681b ldr r3, [r3, #0] + 80029d2: f003 020f and.w r2, r3, #15 + 80029d6: 687b ldr r3, [r7, #4] + 80029d8: 611a str r2, [r3, #16] + pHeader->FilterMatchIndex = (CAN_RDT0R_FMI & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_FMI_Pos; + 80029da: 68fb ldr r3, [r7, #12] + 80029dc: 681a ldr r2, [r3, #0] + 80029de: 68bb ldr r3, [r7, #8] + 80029e0: 331b adds r3, #27 + 80029e2: 011b lsls r3, r3, #4 + 80029e4: 4413 add r3, r2 + 80029e6: 3304 adds r3, #4 + 80029e8: 681b ldr r3, [r3, #0] + 80029ea: 0a1b lsrs r3, r3, #8 + 80029ec: b2da uxtb r2, r3 + 80029ee: 687b ldr r3, [r7, #4] + 80029f0: 619a str r2, [r3, #24] + pHeader->Timestamp = (CAN_RDT0R_TIME & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_TIME_Pos; + 80029f2: 68fb ldr r3, [r7, #12] + 80029f4: 681a ldr r2, [r3, #0] + 80029f6: 68bb ldr r3, [r7, #8] + 80029f8: 331b adds r3, #27 + 80029fa: 011b lsls r3, r3, #4 + 80029fc: 4413 add r3, r2 + 80029fe: 3304 adds r3, #4 + 8002a00: 681b ldr r3, [r3, #0] + 8002a02: 0c1b lsrs r3, r3, #16 + 8002a04: b29a uxth r2, r3 + 8002a06: 687b ldr r3, [r7, #4] + 8002a08: 615a str r2, [r3, #20] + + /* Get the data */ + aData[0] = (uint8_t)((CAN_RDL0R_DATA0 & hcan->Instance->sFIFOMailBox[RxFifo].RDLR) >> CAN_RDL0R_DATA0_Pos); + 8002a0a: 68fb ldr r3, [r7, #12] + 8002a0c: 681a ldr r2, [r3, #0] + 8002a0e: 68bb ldr r3, [r7, #8] + 8002a10: 011b lsls r3, r3, #4 + 8002a12: 4413 add r3, r2 + 8002a14: f503 73dc add.w r3, r3, #440 ; 0x1b8 + 8002a18: 681b ldr r3, [r3, #0] + 8002a1a: b2da uxtb r2, r3 + 8002a1c: 683b ldr r3, [r7, #0] + 8002a1e: 701a strb r2, [r3, #0] + aData[1] = (uint8_t)((CAN_RDL0R_DATA1 & hcan->Instance->sFIFOMailBox[RxFifo].RDLR) >> CAN_RDL0R_DATA1_Pos); + 8002a20: 68fb ldr r3, [r7, #12] + 8002a22: 681a ldr r2, [r3, #0] + 8002a24: 68bb ldr r3, [r7, #8] + 8002a26: 011b lsls r3, r3, #4 + 8002a28: 4413 add r3, r2 + 8002a2a: f503 73dc add.w r3, r3, #440 ; 0x1b8 + 8002a2e: 681b ldr r3, [r3, #0] + 8002a30: 0a1a lsrs r2, r3, #8 + 8002a32: 683b ldr r3, [r7, #0] + 8002a34: 3301 adds r3, #1 + 8002a36: b2d2 uxtb r2, r2 + 8002a38: 701a strb r2, [r3, #0] + aData[2] = (uint8_t)((CAN_RDL0R_DATA2 & hcan->Instance->sFIFOMailBox[RxFifo].RDLR) >> CAN_RDL0R_DATA2_Pos); + 8002a3a: 68fb ldr r3, [r7, #12] + 8002a3c: 681a ldr r2, [r3, #0] + 8002a3e: 68bb ldr r3, [r7, #8] + 8002a40: 011b lsls r3, r3, #4 + 8002a42: 4413 add r3, r2 + 8002a44: f503 73dc add.w r3, r3, #440 ; 0x1b8 + 8002a48: 681b ldr r3, [r3, #0] + 8002a4a: 0c1a lsrs r2, r3, #16 + 8002a4c: 683b ldr r3, [r7, #0] + 8002a4e: 3302 adds r3, #2 + 8002a50: b2d2 uxtb r2, r2 + 8002a52: 701a strb r2, [r3, #0] + aData[3] = (uint8_t)((CAN_RDL0R_DATA3 & hcan->Instance->sFIFOMailBox[RxFifo].RDLR) >> CAN_RDL0R_DATA3_Pos); + 8002a54: 68fb ldr r3, [r7, #12] + 8002a56: 681a ldr r2, [r3, #0] + 8002a58: 68bb ldr r3, [r7, #8] + 8002a5a: 011b lsls r3, r3, #4 + 8002a5c: 4413 add r3, r2 + 8002a5e: f503 73dc add.w r3, r3, #440 ; 0x1b8 + 8002a62: 681b ldr r3, [r3, #0] + 8002a64: 0e1a lsrs r2, r3, #24 + 8002a66: 683b ldr r3, [r7, #0] + 8002a68: 3303 adds r3, #3 + 8002a6a: b2d2 uxtb r2, r2 + 8002a6c: 701a strb r2, [r3, #0] + aData[4] = (uint8_t)((CAN_RDH0R_DATA4 & hcan->Instance->sFIFOMailBox[RxFifo].RDHR) >> CAN_RDH0R_DATA4_Pos); + 8002a6e: 68fb ldr r3, [r7, #12] + 8002a70: 681a ldr r2, [r3, #0] + 8002a72: 68bb ldr r3, [r7, #8] + 8002a74: 011b lsls r3, r3, #4 + 8002a76: 4413 add r3, r2 + 8002a78: f503 73de add.w r3, r3, #444 ; 0x1bc + 8002a7c: 681a ldr r2, [r3, #0] + 8002a7e: 683b ldr r3, [r7, #0] + 8002a80: 3304 adds r3, #4 + 8002a82: b2d2 uxtb r2, r2 + 8002a84: 701a strb r2, [r3, #0] + aData[5] = (uint8_t)((CAN_RDH0R_DATA5 & hcan->Instance->sFIFOMailBox[RxFifo].RDHR) >> CAN_RDH0R_DATA5_Pos); + 8002a86: 68fb ldr r3, [r7, #12] + 8002a88: 681a ldr r2, [r3, #0] + 8002a8a: 68bb ldr r3, [r7, #8] + 8002a8c: 011b lsls r3, r3, #4 + 8002a8e: 4413 add r3, r2 + 8002a90: f503 73de add.w r3, r3, #444 ; 0x1bc + 8002a94: 681b ldr r3, [r3, #0] + 8002a96: 0a1a lsrs r2, r3, #8 + 8002a98: 683b ldr r3, [r7, #0] + 8002a9a: 3305 adds r3, #5 + 8002a9c: b2d2 uxtb r2, r2 + 8002a9e: 701a strb r2, [r3, #0] + aData[6] = (uint8_t)((CAN_RDH0R_DATA6 & hcan->Instance->sFIFOMailBox[RxFifo].RDHR) >> CAN_RDH0R_DATA6_Pos); + 8002aa0: 68fb ldr r3, [r7, #12] + 8002aa2: 681a ldr r2, [r3, #0] + 8002aa4: 68bb ldr r3, [r7, #8] + 8002aa6: 011b lsls r3, r3, #4 + 8002aa8: 4413 add r3, r2 + 8002aaa: f503 73de add.w r3, r3, #444 ; 0x1bc + 8002aae: 681b ldr r3, [r3, #0] + 8002ab0: 0c1a lsrs r2, r3, #16 + 8002ab2: 683b ldr r3, [r7, #0] + 8002ab4: 3306 adds r3, #6 + 8002ab6: b2d2 uxtb r2, r2 + 8002ab8: 701a strb r2, [r3, #0] + aData[7] = (uint8_t)((CAN_RDH0R_DATA7 & hcan->Instance->sFIFOMailBox[RxFifo].RDHR) >> CAN_RDH0R_DATA7_Pos); + 8002aba: 68fb ldr r3, [r7, #12] + 8002abc: 681a ldr r2, [r3, #0] + 8002abe: 68bb ldr r3, [r7, #8] + 8002ac0: 011b lsls r3, r3, #4 + 8002ac2: 4413 add r3, r2 + 8002ac4: f503 73de add.w r3, r3, #444 ; 0x1bc + 8002ac8: 681b ldr r3, [r3, #0] + 8002aca: 0e1a lsrs r2, r3, #24 + 8002acc: 683b ldr r3, [r7, #0] + 8002ace: 3307 adds r3, #7 + 8002ad0: b2d2 uxtb r2, r2 + 8002ad2: 701a strb r2, [r3, #0] + + /* Release the FIFO */ + if (RxFifo == CAN_RX_FIFO0) /* Rx element is assigned to Rx FIFO 0 */ + 8002ad4: 68bb ldr r3, [r7, #8] + 8002ad6: 2b00 cmp r3, #0 + 8002ad8: d108 bne.n 8002aec + { + /* Release RX FIFO 0 */ + SET_BIT(hcan->Instance->RF0R, CAN_RF0R_RFOM0); + 8002ada: 68fb ldr r3, [r7, #12] + 8002adc: 681b ldr r3, [r3, #0] + 8002ade: 68da ldr r2, [r3, #12] + 8002ae0: 68fb ldr r3, [r7, #12] + 8002ae2: 681b ldr r3, [r3, #0] + 8002ae4: f042 0220 orr.w r2, r2, #32 + 8002ae8: 60da str r2, [r3, #12] + 8002aea: e007 b.n 8002afc + } + else /* Rx element is assigned to Rx FIFO 1 */ + { + /* Release RX FIFO 1 */ + SET_BIT(hcan->Instance->RF1R, CAN_RF1R_RFOM1); + 8002aec: 68fb ldr r3, [r7, #12] + 8002aee: 681b ldr r3, [r3, #0] + 8002af0: 691a ldr r2, [r3, #16] + 8002af2: 68fb ldr r3, [r7, #12] + 8002af4: 681b ldr r3, [r3, #0] + 8002af6: f042 0220 orr.w r2, r2, #32 + 8002afa: 611a str r2, [r3, #16] + } + + /* Return function status */ + return HAL_OK; + 8002afc: 2300 movs r3, #0 + 8002afe: e006 b.n 8002b0e + } + else + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED; + 8002b00: 68fb ldr r3, [r7, #12] + 8002b02: 6a5b ldr r3, [r3, #36] ; 0x24 + 8002b04: f443 2280 orr.w r2, r3, #262144 ; 0x40000 + 8002b08: 68fb ldr r3, [r7, #12] + 8002b0a: 625a str r2, [r3, #36] ; 0x24 + + return HAL_ERROR; + 8002b0c: 2301 movs r3, #1 + } +} + 8002b0e: 4618 mov r0, r3 + 8002b10: 371c adds r7, #28 + 8002b12: 46bd mov sp, r7 + 8002b14: f85d 7b04 ldr.w r7, [sp], #4 + 8002b18: 4770 bx lr + +08002b1a : + * @param ActiveITs indicates which interrupts will be enabled. + * This parameter can be any combination of @arg CAN_Interrupts. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_CAN_ActivateNotification(CAN_HandleTypeDef *hcan, uint32_t ActiveITs) +{ + 8002b1a: b480 push {r7} + 8002b1c: b085 sub sp, #20 + 8002b1e: af00 add r7, sp, #0 + 8002b20: 6078 str r0, [r7, #4] + 8002b22: 6039 str r1, [r7, #0] + HAL_CAN_StateTypeDef state = hcan->State; + 8002b24: 687b ldr r3, [r7, #4] + 8002b26: f893 3020 ldrb.w r3, [r3, #32] + 8002b2a: 73fb strb r3, [r7, #15] + + /* Check function parameters */ + assert_param(IS_CAN_IT(ActiveITs)); + + if ((state == HAL_CAN_STATE_READY) || + 8002b2c: 7bfb ldrb r3, [r7, #15] + 8002b2e: 2b01 cmp r3, #1 + 8002b30: d002 beq.n 8002b38 + 8002b32: 7bfb ldrb r3, [r7, #15] + 8002b34: 2b02 cmp r3, #2 + 8002b36: d109 bne.n 8002b4c + (state == HAL_CAN_STATE_LISTENING)) + { + /* Enable the selected interrupts */ + __HAL_CAN_ENABLE_IT(hcan, ActiveITs); + 8002b38: 687b ldr r3, [r7, #4] + 8002b3a: 681b ldr r3, [r3, #0] + 8002b3c: 6959 ldr r1, [r3, #20] + 8002b3e: 687b ldr r3, [r7, #4] + 8002b40: 681b ldr r3, [r3, #0] + 8002b42: 683a ldr r2, [r7, #0] + 8002b44: 430a orrs r2, r1 + 8002b46: 615a str r2, [r3, #20] + + /* Return function status */ + return HAL_OK; + 8002b48: 2300 movs r3, #0 + 8002b4a: e006 b.n 8002b5a + } + else + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED; + 8002b4c: 687b ldr r3, [r7, #4] + 8002b4e: 6a5b ldr r3, [r3, #36] ; 0x24 + 8002b50: f443 2280 orr.w r2, r3, #262144 ; 0x40000 + 8002b54: 687b ldr r3, [r7, #4] + 8002b56: 625a str r2, [r3, #36] ; 0x24 + + return HAL_ERROR; + 8002b58: 2301 movs r3, #1 + } +} + 8002b5a: 4618 mov r0, r3 + 8002b5c: 3714 adds r7, #20 + 8002b5e: 46bd mov sp, r7 + 8002b60: f85d 7b04 ldr.w r7, [sp], #4 + 8002b64: 4770 bx lr + +08002b66 : + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +void HAL_CAN_IRQHandler(CAN_HandleTypeDef *hcan) +{ + 8002b66: b580 push {r7, lr} + 8002b68: b08a sub sp, #40 ; 0x28 + 8002b6a: af00 add r7, sp, #0 + 8002b6c: 6078 str r0, [r7, #4] + uint32_t errorcode = HAL_CAN_ERROR_NONE; + 8002b6e: 2300 movs r3, #0 + 8002b70: 627b str r3, [r7, #36] ; 0x24 + uint32_t interrupts = READ_REG(hcan->Instance->IER); + 8002b72: 687b ldr r3, [r7, #4] + 8002b74: 681b ldr r3, [r3, #0] + 8002b76: 695b ldr r3, [r3, #20] + 8002b78: 623b str r3, [r7, #32] + uint32_t msrflags = READ_REG(hcan->Instance->MSR); + 8002b7a: 687b ldr r3, [r7, #4] + 8002b7c: 681b ldr r3, [r3, #0] + 8002b7e: 685b ldr r3, [r3, #4] + 8002b80: 61fb str r3, [r7, #28] + uint32_t tsrflags = READ_REG(hcan->Instance->TSR); + 8002b82: 687b ldr r3, [r7, #4] + 8002b84: 681b ldr r3, [r3, #0] + 8002b86: 689b ldr r3, [r3, #8] + 8002b88: 61bb str r3, [r7, #24] + uint32_t rf0rflags = READ_REG(hcan->Instance->RF0R); + 8002b8a: 687b ldr r3, [r7, #4] + 8002b8c: 681b ldr r3, [r3, #0] + 8002b8e: 68db ldr r3, [r3, #12] + 8002b90: 617b str r3, [r7, #20] + uint32_t rf1rflags = READ_REG(hcan->Instance->RF1R); + 8002b92: 687b ldr r3, [r7, #4] + 8002b94: 681b ldr r3, [r3, #0] + 8002b96: 691b ldr r3, [r3, #16] + 8002b98: 613b str r3, [r7, #16] + uint32_t esrflags = READ_REG(hcan->Instance->ESR); + 8002b9a: 687b ldr r3, [r7, #4] + 8002b9c: 681b ldr r3, [r3, #0] + 8002b9e: 699b ldr r3, [r3, #24] + 8002ba0: 60fb str r3, [r7, #12] + + /* Transmit Mailbox empty interrupt management *****************************/ + if ((interrupts & CAN_IT_TX_MAILBOX_EMPTY) != 0U) + 8002ba2: 6a3b ldr r3, [r7, #32] + 8002ba4: f003 0301 and.w r3, r3, #1 + 8002ba8: 2b00 cmp r3, #0 + 8002baa: d07c beq.n 8002ca6 + { + /* Transmit Mailbox 0 management *****************************************/ + if ((tsrflags & CAN_TSR_RQCP0) != 0U) + 8002bac: 69bb ldr r3, [r7, #24] + 8002bae: f003 0301 and.w r3, r3, #1 + 8002bb2: 2b00 cmp r3, #0 + 8002bb4: d023 beq.n 8002bfe + { + /* Clear the Transmission Complete flag (and TXOK0,ALST0,TERR0 bits) */ + __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_RQCP0); + 8002bb6: 687b ldr r3, [r7, #4] + 8002bb8: 681b ldr r3, [r3, #0] + 8002bba: 2201 movs r2, #1 + 8002bbc: 609a str r2, [r3, #8] + + if ((tsrflags & CAN_TSR_TXOK0) != 0U) + 8002bbe: 69bb ldr r3, [r7, #24] + 8002bc0: f003 0302 and.w r3, r3, #2 + 8002bc4: 2b00 cmp r3, #0 + 8002bc6: d003 beq.n 8002bd0 +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + /* Call registered callback*/ + hcan->TxMailbox0CompleteCallback(hcan); +#else + /* Call weak (surcharged) callback */ + HAL_CAN_TxMailbox0CompleteCallback(hcan); + 8002bc8: 6878 ldr r0, [r7, #4] + 8002bca: f000 f983 bl 8002ed4 + 8002bce: e016 b.n 8002bfe +#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + } + else + { + if ((tsrflags & CAN_TSR_ALST0) != 0U) + 8002bd0: 69bb ldr r3, [r7, #24] + 8002bd2: f003 0304 and.w r3, r3, #4 + 8002bd6: 2b00 cmp r3, #0 + 8002bd8: d004 beq.n 8002be4 + { + /* Update error code */ + errorcode |= HAL_CAN_ERROR_TX_ALST0; + 8002bda: 6a7b ldr r3, [r7, #36] ; 0x24 + 8002bdc: f443 6300 orr.w r3, r3, #2048 ; 0x800 + 8002be0: 627b str r3, [r7, #36] ; 0x24 + 8002be2: e00c b.n 8002bfe + } + else if ((tsrflags & CAN_TSR_TERR0) != 0U) + 8002be4: 69bb ldr r3, [r7, #24] + 8002be6: f003 0308 and.w r3, r3, #8 + 8002bea: 2b00 cmp r3, #0 + 8002bec: d004 beq.n 8002bf8 + { + /* Update error code */ + errorcode |= HAL_CAN_ERROR_TX_TERR0; + 8002bee: 6a7b ldr r3, [r7, #36] ; 0x24 + 8002bf0: f443 5380 orr.w r3, r3, #4096 ; 0x1000 + 8002bf4: 627b str r3, [r7, #36] ; 0x24 + 8002bf6: e002 b.n 8002bfe +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + /* Call registered callback*/ + hcan->TxMailbox0AbortCallback(hcan); +#else + /* Call weak (surcharged) callback */ + HAL_CAN_TxMailbox0AbortCallback(hcan); + 8002bf8: 6878 ldr r0, [r7, #4] + 8002bfa: f000 f989 bl 8002f10 + } + } + } + + /* Transmit Mailbox 1 management *****************************************/ + if ((tsrflags & CAN_TSR_RQCP1) != 0U) + 8002bfe: 69bb ldr r3, [r7, #24] + 8002c00: f403 7380 and.w r3, r3, #256 ; 0x100 + 8002c04: 2b00 cmp r3, #0 + 8002c06: d024 beq.n 8002c52 + { + /* Clear the Transmission Complete flag (and TXOK1,ALST1,TERR1 bits) */ + __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_RQCP1); + 8002c08: 687b ldr r3, [r7, #4] + 8002c0a: 681b ldr r3, [r3, #0] + 8002c0c: f44f 7280 mov.w r2, #256 ; 0x100 + 8002c10: 609a str r2, [r3, #8] + + if ((tsrflags & CAN_TSR_TXOK1) != 0U) + 8002c12: 69bb ldr r3, [r7, #24] + 8002c14: f403 7300 and.w r3, r3, #512 ; 0x200 + 8002c18: 2b00 cmp r3, #0 + 8002c1a: d003 beq.n 8002c24 +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + /* Call registered callback*/ + hcan->TxMailbox1CompleteCallback(hcan); +#else + /* Call weak (surcharged) callback */ + HAL_CAN_TxMailbox1CompleteCallback(hcan); + 8002c1c: 6878 ldr r0, [r7, #4] + 8002c1e: f000 f963 bl 8002ee8 + 8002c22: e016 b.n 8002c52 +#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + } + else + { + if ((tsrflags & CAN_TSR_ALST1) != 0U) + 8002c24: 69bb ldr r3, [r7, #24] + 8002c26: f403 6380 and.w r3, r3, #1024 ; 0x400 + 8002c2a: 2b00 cmp r3, #0 + 8002c2c: d004 beq.n 8002c38 + { + /* Update error code */ + errorcode |= HAL_CAN_ERROR_TX_ALST1; + 8002c2e: 6a7b ldr r3, [r7, #36] ; 0x24 + 8002c30: f443 5300 orr.w r3, r3, #8192 ; 0x2000 + 8002c34: 627b str r3, [r7, #36] ; 0x24 + 8002c36: e00c b.n 8002c52 + } + else if ((tsrflags & CAN_TSR_TERR1) != 0U) + 8002c38: 69bb ldr r3, [r7, #24] + 8002c3a: f403 6300 and.w r3, r3, #2048 ; 0x800 + 8002c3e: 2b00 cmp r3, #0 + 8002c40: d004 beq.n 8002c4c + { + /* Update error code */ + errorcode |= HAL_CAN_ERROR_TX_TERR1; + 8002c42: 6a7b ldr r3, [r7, #36] ; 0x24 + 8002c44: f443 4380 orr.w r3, r3, #16384 ; 0x4000 + 8002c48: 627b str r3, [r7, #36] ; 0x24 + 8002c4a: e002 b.n 8002c52 +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + /* Call registered callback*/ + hcan->TxMailbox1AbortCallback(hcan); +#else + /* Call weak (surcharged) callback */ + HAL_CAN_TxMailbox1AbortCallback(hcan); + 8002c4c: 6878 ldr r0, [r7, #4] + 8002c4e: f000 f969 bl 8002f24 + } + } + } + + /* Transmit Mailbox 2 management *****************************************/ + if ((tsrflags & CAN_TSR_RQCP2) != 0U) + 8002c52: 69bb ldr r3, [r7, #24] + 8002c54: f403 3380 and.w r3, r3, #65536 ; 0x10000 + 8002c58: 2b00 cmp r3, #0 + 8002c5a: d024 beq.n 8002ca6 + { + /* Clear the Transmission Complete flag (and TXOK2,ALST2,TERR2 bits) */ + __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_RQCP2); + 8002c5c: 687b ldr r3, [r7, #4] + 8002c5e: 681b ldr r3, [r3, #0] + 8002c60: f44f 3280 mov.w r2, #65536 ; 0x10000 + 8002c64: 609a str r2, [r3, #8] + + if ((tsrflags & CAN_TSR_TXOK2) != 0U) + 8002c66: 69bb ldr r3, [r7, #24] + 8002c68: f403 3300 and.w r3, r3, #131072 ; 0x20000 + 8002c6c: 2b00 cmp r3, #0 + 8002c6e: d003 beq.n 8002c78 +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + /* Call registered callback*/ + hcan->TxMailbox2CompleteCallback(hcan); +#else + /* Call weak (surcharged) callback */ + HAL_CAN_TxMailbox2CompleteCallback(hcan); + 8002c70: 6878 ldr r0, [r7, #4] + 8002c72: f000 f943 bl 8002efc + 8002c76: e016 b.n 8002ca6 +#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + } + else + { + if ((tsrflags & CAN_TSR_ALST2) != 0U) + 8002c78: 69bb ldr r3, [r7, #24] + 8002c7a: f403 2380 and.w r3, r3, #262144 ; 0x40000 + 8002c7e: 2b00 cmp r3, #0 + 8002c80: d004 beq.n 8002c8c + { + /* Update error code */ + errorcode |= HAL_CAN_ERROR_TX_ALST2; + 8002c82: 6a7b ldr r3, [r7, #36] ; 0x24 + 8002c84: f443 4300 orr.w r3, r3, #32768 ; 0x8000 + 8002c88: 627b str r3, [r7, #36] ; 0x24 + 8002c8a: e00c b.n 8002ca6 + } + else if ((tsrflags & CAN_TSR_TERR2) != 0U) + 8002c8c: 69bb ldr r3, [r7, #24] + 8002c8e: f403 2300 and.w r3, r3, #524288 ; 0x80000 + 8002c92: 2b00 cmp r3, #0 + 8002c94: d004 beq.n 8002ca0 + { + /* Update error code */ + errorcode |= HAL_CAN_ERROR_TX_TERR2; + 8002c96: 6a7b ldr r3, [r7, #36] ; 0x24 + 8002c98: f443 3380 orr.w r3, r3, #65536 ; 0x10000 + 8002c9c: 627b str r3, [r7, #36] ; 0x24 + 8002c9e: e002 b.n 8002ca6 +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + /* Call registered callback*/ + hcan->TxMailbox2AbortCallback(hcan); +#else + /* Call weak (surcharged) callback */ + HAL_CAN_TxMailbox2AbortCallback(hcan); + 8002ca0: 6878 ldr r0, [r7, #4] + 8002ca2: f000 f949 bl 8002f38 + } + } + } + + /* Receive FIFO 0 overrun interrupt management *****************************/ + if ((interrupts & CAN_IT_RX_FIFO0_OVERRUN) != 0U) + 8002ca6: 6a3b ldr r3, [r7, #32] + 8002ca8: f003 0308 and.w r3, r3, #8 + 8002cac: 2b00 cmp r3, #0 + 8002cae: d00c beq.n 8002cca + { + if ((rf0rflags & CAN_RF0R_FOVR0) != 0U) + 8002cb0: 697b ldr r3, [r7, #20] + 8002cb2: f003 0310 and.w r3, r3, #16 + 8002cb6: 2b00 cmp r3, #0 + 8002cb8: d007 beq.n 8002cca + { + /* Set CAN error code to Rx Fifo 0 overrun error */ + errorcode |= HAL_CAN_ERROR_RX_FOV0; + 8002cba: 6a7b ldr r3, [r7, #36] ; 0x24 + 8002cbc: f443 7300 orr.w r3, r3, #512 ; 0x200 + 8002cc0: 627b str r3, [r7, #36] ; 0x24 + + /* Clear FIFO0 Overrun Flag */ + __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FOV0); + 8002cc2: 687b ldr r3, [r7, #4] + 8002cc4: 681b ldr r3, [r3, #0] + 8002cc6: 2210 movs r2, #16 + 8002cc8: 60da str r2, [r3, #12] + } + } + + /* Receive FIFO 0 full interrupt management ********************************/ + if ((interrupts & CAN_IT_RX_FIFO0_FULL) != 0U) + 8002cca: 6a3b ldr r3, [r7, #32] + 8002ccc: f003 0304 and.w r3, r3, #4 + 8002cd0: 2b00 cmp r3, #0 + 8002cd2: d00b beq.n 8002cec + { + if ((rf0rflags & CAN_RF0R_FULL0) != 0U) + 8002cd4: 697b ldr r3, [r7, #20] + 8002cd6: f003 0308 and.w r3, r3, #8 + 8002cda: 2b00 cmp r3, #0 + 8002cdc: d006 beq.n 8002cec + { + /* Clear FIFO 0 full Flag */ + __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FF0); + 8002cde: 687b ldr r3, [r7, #4] + 8002ce0: 681b ldr r3, [r3, #0] + 8002ce2: 2208 movs r2, #8 + 8002ce4: 60da str r2, [r3, #12] +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + /* Call registered callback*/ + hcan->RxFifo0FullCallback(hcan); +#else + /* Call weak (surcharged) callback */ + HAL_CAN_RxFifo0FullCallback(hcan); + 8002ce6: 6878 ldr r0, [r7, #4] + 8002ce8: f000 f930 bl 8002f4c +#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + } + } + + /* Receive FIFO 0 message pending interrupt management *********************/ + if ((interrupts & CAN_IT_RX_FIFO0_MSG_PENDING) != 0U) + 8002cec: 6a3b ldr r3, [r7, #32] + 8002cee: f003 0302 and.w r3, r3, #2 + 8002cf2: 2b00 cmp r3, #0 + 8002cf4: d009 beq.n 8002d0a + { + /* Check if message is still pending */ + if ((hcan->Instance->RF0R & CAN_RF0R_FMP0) != 0U) + 8002cf6: 687b ldr r3, [r7, #4] + 8002cf8: 681b ldr r3, [r3, #0] + 8002cfa: 68db ldr r3, [r3, #12] + 8002cfc: f003 0303 and.w r3, r3, #3 + 8002d00: 2b00 cmp r3, #0 + 8002d02: d002 beq.n 8002d0a +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + /* Call registered callback*/ + hcan->RxFifo0MsgPendingCallback(hcan); +#else + /* Call weak (surcharged) callback */ + HAL_CAN_RxFifo0MsgPendingCallback(hcan); + 8002d04: 6878 ldr r0, [r7, #4] + 8002d06: f7fe f9e5 bl 80010d4 +#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + } + } + + /* Receive FIFO 1 overrun interrupt management *****************************/ + if ((interrupts & CAN_IT_RX_FIFO1_OVERRUN) != 0U) + 8002d0a: 6a3b ldr r3, [r7, #32] + 8002d0c: f003 0340 and.w r3, r3, #64 ; 0x40 + 8002d10: 2b00 cmp r3, #0 + 8002d12: d00c beq.n 8002d2e + { + if ((rf1rflags & CAN_RF1R_FOVR1) != 0U) + 8002d14: 693b ldr r3, [r7, #16] + 8002d16: f003 0310 and.w r3, r3, #16 + 8002d1a: 2b00 cmp r3, #0 + 8002d1c: d007 beq.n 8002d2e + { + /* Set CAN error code to Rx Fifo 1 overrun error */ + errorcode |= HAL_CAN_ERROR_RX_FOV1; + 8002d1e: 6a7b ldr r3, [r7, #36] ; 0x24 + 8002d20: f443 6380 orr.w r3, r3, #1024 ; 0x400 + 8002d24: 627b str r3, [r7, #36] ; 0x24 + + /* Clear FIFO1 Overrun Flag */ + __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FOV1); + 8002d26: 687b ldr r3, [r7, #4] + 8002d28: 681b ldr r3, [r3, #0] + 8002d2a: 2210 movs r2, #16 + 8002d2c: 611a str r2, [r3, #16] + } + } + + /* Receive FIFO 1 full interrupt management ********************************/ + if ((interrupts & CAN_IT_RX_FIFO1_FULL) != 0U) + 8002d2e: 6a3b ldr r3, [r7, #32] + 8002d30: f003 0320 and.w r3, r3, #32 + 8002d34: 2b00 cmp r3, #0 + 8002d36: d00b beq.n 8002d50 + { + if ((rf1rflags & CAN_RF1R_FULL1) != 0U) + 8002d38: 693b ldr r3, [r7, #16] + 8002d3a: f003 0308 and.w r3, r3, #8 + 8002d3e: 2b00 cmp r3, #0 + 8002d40: d006 beq.n 8002d50 + { + /* Clear FIFO 1 full Flag */ + __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FF1); + 8002d42: 687b ldr r3, [r7, #4] + 8002d44: 681b ldr r3, [r3, #0] + 8002d46: 2208 movs r2, #8 + 8002d48: 611a str r2, [r3, #16] +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + /* Call registered callback*/ + hcan->RxFifo1FullCallback(hcan); +#else + /* Call weak (surcharged) callback */ + HAL_CAN_RxFifo1FullCallback(hcan); + 8002d4a: 6878 ldr r0, [r7, #4] + 8002d4c: f000 f912 bl 8002f74 +#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + } + } + + /* Receive FIFO 1 message pending interrupt management *********************/ + if ((interrupts & CAN_IT_RX_FIFO1_MSG_PENDING) != 0U) + 8002d50: 6a3b ldr r3, [r7, #32] + 8002d52: f003 0310 and.w r3, r3, #16 + 8002d56: 2b00 cmp r3, #0 + 8002d58: d009 beq.n 8002d6e + { + /* Check if message is still pending */ + if ((hcan->Instance->RF1R & CAN_RF1R_FMP1) != 0U) + 8002d5a: 687b ldr r3, [r7, #4] + 8002d5c: 681b ldr r3, [r3, #0] + 8002d5e: 691b ldr r3, [r3, #16] + 8002d60: f003 0303 and.w r3, r3, #3 + 8002d64: 2b00 cmp r3, #0 + 8002d66: d002 beq.n 8002d6e +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + /* Call registered callback*/ + hcan->RxFifo1MsgPendingCallback(hcan); +#else + /* Call weak (surcharged) callback */ + HAL_CAN_RxFifo1MsgPendingCallback(hcan); + 8002d68: 6878 ldr r0, [r7, #4] + 8002d6a: f000 f8f9 bl 8002f60 +#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + } + } + + /* Sleep interrupt management *********************************************/ + if ((interrupts & CAN_IT_SLEEP_ACK) != 0U) + 8002d6e: 6a3b ldr r3, [r7, #32] + 8002d70: f403 3300 and.w r3, r3, #131072 ; 0x20000 + 8002d74: 2b00 cmp r3, #0 + 8002d76: d00b beq.n 8002d90 + { + if ((msrflags & CAN_MSR_SLAKI) != 0U) + 8002d78: 69fb ldr r3, [r7, #28] + 8002d7a: f003 0310 and.w r3, r3, #16 + 8002d7e: 2b00 cmp r3, #0 + 8002d80: d006 beq.n 8002d90 + { + /* Clear Sleep interrupt Flag */ + __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_SLAKI); + 8002d82: 687b ldr r3, [r7, #4] + 8002d84: 681b ldr r3, [r3, #0] + 8002d86: 2210 movs r2, #16 + 8002d88: 605a str r2, [r3, #4] +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + /* Call registered callback*/ + hcan->SleepCallback(hcan); +#else + /* Call weak (surcharged) callback */ + HAL_CAN_SleepCallback(hcan); + 8002d8a: 6878 ldr r0, [r7, #4] + 8002d8c: f000 f8fc bl 8002f88 +#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + } + } + + /* WakeUp interrupt management *********************************************/ + if ((interrupts & CAN_IT_WAKEUP) != 0U) + 8002d90: 6a3b ldr r3, [r7, #32] + 8002d92: f403 3380 and.w r3, r3, #65536 ; 0x10000 + 8002d96: 2b00 cmp r3, #0 + 8002d98: d00b beq.n 8002db2 + { + if ((msrflags & CAN_MSR_WKUI) != 0U) + 8002d9a: 69fb ldr r3, [r7, #28] + 8002d9c: f003 0308 and.w r3, r3, #8 + 8002da0: 2b00 cmp r3, #0 + 8002da2: d006 beq.n 8002db2 + { + /* Clear WakeUp Flag */ + __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_WKU); + 8002da4: 687b ldr r3, [r7, #4] + 8002da6: 681b ldr r3, [r3, #0] + 8002da8: 2208 movs r2, #8 + 8002daa: 605a str r2, [r3, #4] +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + /* Call registered callback*/ + hcan->WakeUpFromRxMsgCallback(hcan); +#else + /* Call weak (surcharged) callback */ + HAL_CAN_WakeUpFromRxMsgCallback(hcan); + 8002dac: 6878 ldr r0, [r7, #4] + 8002dae: f000 f8f5 bl 8002f9c +#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + } + } + + /* Error interrupts management *********************************************/ + if ((interrupts & CAN_IT_ERROR) != 0U) + 8002db2: 6a3b ldr r3, [r7, #32] + 8002db4: f403 4300 and.w r3, r3, #32768 ; 0x8000 + 8002db8: 2b00 cmp r3, #0 + 8002dba: d07b beq.n 8002eb4 + { + if ((msrflags & CAN_MSR_ERRI) != 0U) + 8002dbc: 69fb ldr r3, [r7, #28] + 8002dbe: f003 0304 and.w r3, r3, #4 + 8002dc2: 2b00 cmp r3, #0 + 8002dc4: d072 beq.n 8002eac + { + /* Check Error Warning Flag */ + if (((interrupts & CAN_IT_ERROR_WARNING) != 0U) && + 8002dc6: 6a3b ldr r3, [r7, #32] + 8002dc8: f403 7380 and.w r3, r3, #256 ; 0x100 + 8002dcc: 2b00 cmp r3, #0 + 8002dce: d008 beq.n 8002de2 + ((esrflags & CAN_ESR_EWGF) != 0U)) + 8002dd0: 68fb ldr r3, [r7, #12] + 8002dd2: f003 0301 and.w r3, r3, #1 + if (((interrupts & CAN_IT_ERROR_WARNING) != 0U) && + 8002dd6: 2b00 cmp r3, #0 + 8002dd8: d003 beq.n 8002de2 + { + /* Set CAN error code to Error Warning */ + errorcode |= HAL_CAN_ERROR_EWG; + 8002dda: 6a7b ldr r3, [r7, #36] ; 0x24 + 8002ddc: f043 0301 orr.w r3, r3, #1 + 8002de0: 627b str r3, [r7, #36] ; 0x24 + + /* No need for clear of Error Warning Flag as read-only */ + } + + /* Check Error Passive Flag */ + if (((interrupts & CAN_IT_ERROR_PASSIVE) != 0U) && + 8002de2: 6a3b ldr r3, [r7, #32] + 8002de4: f403 7300 and.w r3, r3, #512 ; 0x200 + 8002de8: 2b00 cmp r3, #0 + 8002dea: d008 beq.n 8002dfe + ((esrflags & CAN_ESR_EPVF) != 0U)) + 8002dec: 68fb ldr r3, [r7, #12] + 8002dee: f003 0302 and.w r3, r3, #2 + if (((interrupts & CAN_IT_ERROR_PASSIVE) != 0U) && + 8002df2: 2b00 cmp r3, #0 + 8002df4: d003 beq.n 8002dfe + { + /* Set CAN error code to Error Passive */ + errorcode |= HAL_CAN_ERROR_EPV; + 8002df6: 6a7b ldr r3, [r7, #36] ; 0x24 + 8002df8: f043 0302 orr.w r3, r3, #2 + 8002dfc: 627b str r3, [r7, #36] ; 0x24 + + /* No need for clear of Error Passive Flag as read-only */ + } + + /* Check Bus-off Flag */ + if (((interrupts & CAN_IT_BUSOFF) != 0U) && + 8002dfe: 6a3b ldr r3, [r7, #32] + 8002e00: f403 6380 and.w r3, r3, #1024 ; 0x400 + 8002e04: 2b00 cmp r3, #0 + 8002e06: d008 beq.n 8002e1a + ((esrflags & CAN_ESR_BOFF) != 0U)) + 8002e08: 68fb ldr r3, [r7, #12] + 8002e0a: f003 0304 and.w r3, r3, #4 + if (((interrupts & CAN_IT_BUSOFF) != 0U) && + 8002e0e: 2b00 cmp r3, #0 + 8002e10: d003 beq.n 8002e1a + { + /* Set CAN error code to Bus-Off */ + errorcode |= HAL_CAN_ERROR_BOF; + 8002e12: 6a7b ldr r3, [r7, #36] ; 0x24 + 8002e14: f043 0304 orr.w r3, r3, #4 + 8002e18: 627b str r3, [r7, #36] ; 0x24 + + /* No need for clear of Error Bus-Off as read-only */ + } + + /* Check Last Error Code Flag */ + if (((interrupts & CAN_IT_LAST_ERROR_CODE) != 0U) && + 8002e1a: 6a3b ldr r3, [r7, #32] + 8002e1c: f403 6300 and.w r3, r3, #2048 ; 0x800 + 8002e20: 2b00 cmp r3, #0 + 8002e22: d043 beq.n 8002eac + ((esrflags & CAN_ESR_LEC) != 0U)) + 8002e24: 68fb ldr r3, [r7, #12] + 8002e26: f003 0370 and.w r3, r3, #112 ; 0x70 + if (((interrupts & CAN_IT_LAST_ERROR_CODE) != 0U) && + 8002e2a: 2b00 cmp r3, #0 + 8002e2c: d03e beq.n 8002eac + { + switch (esrflags & CAN_ESR_LEC) + 8002e2e: 68fb ldr r3, [r7, #12] + 8002e30: f003 0370 and.w r3, r3, #112 ; 0x70 + 8002e34: 2b60 cmp r3, #96 ; 0x60 + 8002e36: d02b beq.n 8002e90 + 8002e38: 2b60 cmp r3, #96 ; 0x60 + 8002e3a: d82e bhi.n 8002e9a + 8002e3c: 2b50 cmp r3, #80 ; 0x50 + 8002e3e: d022 beq.n 8002e86 + 8002e40: 2b50 cmp r3, #80 ; 0x50 + 8002e42: d82a bhi.n 8002e9a + 8002e44: 2b40 cmp r3, #64 ; 0x40 + 8002e46: d019 beq.n 8002e7c + 8002e48: 2b40 cmp r3, #64 ; 0x40 + 8002e4a: d826 bhi.n 8002e9a + 8002e4c: 2b30 cmp r3, #48 ; 0x30 + 8002e4e: d010 beq.n 8002e72 + 8002e50: 2b30 cmp r3, #48 ; 0x30 + 8002e52: d822 bhi.n 8002e9a + 8002e54: 2b10 cmp r3, #16 + 8002e56: d002 beq.n 8002e5e + 8002e58: 2b20 cmp r3, #32 + 8002e5a: d005 beq.n 8002e68 + case (CAN_ESR_LEC_2 | CAN_ESR_LEC_1): + /* Set CAN error code to CRC error */ + errorcode |= HAL_CAN_ERROR_CRC; + break; + default: + break; + 8002e5c: e01d b.n 8002e9a + errorcode |= HAL_CAN_ERROR_STF; + 8002e5e: 6a7b ldr r3, [r7, #36] ; 0x24 + 8002e60: f043 0308 orr.w r3, r3, #8 + 8002e64: 627b str r3, [r7, #36] ; 0x24 + break; + 8002e66: e019 b.n 8002e9c + errorcode |= HAL_CAN_ERROR_FOR; + 8002e68: 6a7b ldr r3, [r7, #36] ; 0x24 + 8002e6a: f043 0310 orr.w r3, r3, #16 + 8002e6e: 627b str r3, [r7, #36] ; 0x24 + break; + 8002e70: e014 b.n 8002e9c + errorcode |= HAL_CAN_ERROR_ACK; + 8002e72: 6a7b ldr r3, [r7, #36] ; 0x24 + 8002e74: f043 0320 orr.w r3, r3, #32 + 8002e78: 627b str r3, [r7, #36] ; 0x24 + break; + 8002e7a: e00f b.n 8002e9c + errorcode |= HAL_CAN_ERROR_BR; + 8002e7c: 6a7b ldr r3, [r7, #36] ; 0x24 + 8002e7e: f043 0340 orr.w r3, r3, #64 ; 0x40 + 8002e82: 627b str r3, [r7, #36] ; 0x24 + break; + 8002e84: e00a b.n 8002e9c + errorcode |= HAL_CAN_ERROR_BD; + 8002e86: 6a7b ldr r3, [r7, #36] ; 0x24 + 8002e88: f043 0380 orr.w r3, r3, #128 ; 0x80 + 8002e8c: 627b str r3, [r7, #36] ; 0x24 + break; + 8002e8e: e005 b.n 8002e9c + errorcode |= HAL_CAN_ERROR_CRC; + 8002e90: 6a7b ldr r3, [r7, #36] ; 0x24 + 8002e92: f443 7380 orr.w r3, r3, #256 ; 0x100 + 8002e96: 627b str r3, [r7, #36] ; 0x24 + break; + 8002e98: e000 b.n 8002e9c + break; + 8002e9a: bf00 nop + } + + /* Clear Last error code Flag */ + CLEAR_BIT(hcan->Instance->ESR, CAN_ESR_LEC); + 8002e9c: 687b ldr r3, [r7, #4] + 8002e9e: 681b ldr r3, [r3, #0] + 8002ea0: 699a ldr r2, [r3, #24] + 8002ea2: 687b ldr r3, [r7, #4] + 8002ea4: 681b ldr r3, [r3, #0] + 8002ea6: f022 0270 bic.w r2, r2, #112 ; 0x70 + 8002eaa: 619a str r2, [r3, #24] + } + } + + /* Clear ERRI Flag */ + __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_ERRI); + 8002eac: 687b ldr r3, [r7, #4] + 8002eae: 681b ldr r3, [r3, #0] + 8002eb0: 2204 movs r2, #4 + 8002eb2: 605a str r2, [r3, #4] + } + + /* Call the Error call Back in case of Errors */ + if (errorcode != HAL_CAN_ERROR_NONE) + 8002eb4: 6a7b ldr r3, [r7, #36] ; 0x24 + 8002eb6: 2b00 cmp r3, #0 + 8002eb8: d008 beq.n 8002ecc + { + /* Update error code in handle */ + hcan->ErrorCode |= errorcode; + 8002eba: 687b ldr r3, [r7, #4] + 8002ebc: 6a5a ldr r2, [r3, #36] ; 0x24 + 8002ebe: 6a7b ldr r3, [r7, #36] ; 0x24 + 8002ec0: 431a orrs r2, r3 + 8002ec2: 687b ldr r3, [r7, #4] + 8002ec4: 625a str r2, [r3, #36] ; 0x24 +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + /* Call registered callback*/ + hcan->ErrorCallback(hcan); +#else + /* Call weak (surcharged) callback */ + HAL_CAN_ErrorCallback(hcan); + 8002ec6: 6878 ldr r0, [r7, #4] + 8002ec8: f000 f872 bl 8002fb0 +#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + } +} + 8002ecc: bf00 nop + 8002ece: 3728 adds r7, #40 ; 0x28 + 8002ed0: 46bd mov sp, r7 + 8002ed2: bd80 pop {r7, pc} + +08002ed4 : + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +__weak void HAL_CAN_TxMailbox0CompleteCallback(CAN_HandleTypeDef *hcan) +{ + 8002ed4: b480 push {r7} + 8002ed6: b083 sub sp, #12 + 8002ed8: af00 add r7, sp, #0 + 8002eda: 6078 str r0, [r7, #4] + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_CAN_TxMailbox0CompleteCallback could be implemented in the + user file + */ +} + 8002edc: bf00 nop + 8002ede: 370c adds r7, #12 + 8002ee0: 46bd mov sp, r7 + 8002ee2: f85d 7b04 ldr.w r7, [sp], #4 + 8002ee6: 4770 bx lr + +08002ee8 : + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +__weak void HAL_CAN_TxMailbox1CompleteCallback(CAN_HandleTypeDef *hcan) +{ + 8002ee8: b480 push {r7} + 8002eea: b083 sub sp, #12 + 8002eec: af00 add r7, sp, #0 + 8002eee: 6078 str r0, [r7, #4] + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_CAN_TxMailbox1CompleteCallback could be implemented in the + user file + */ +} + 8002ef0: bf00 nop + 8002ef2: 370c adds r7, #12 + 8002ef4: 46bd mov sp, r7 + 8002ef6: f85d 7b04 ldr.w r7, [sp], #4 + 8002efa: 4770 bx lr + +08002efc : + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +__weak void HAL_CAN_TxMailbox2CompleteCallback(CAN_HandleTypeDef *hcan) +{ + 8002efc: b480 push {r7} + 8002efe: b083 sub sp, #12 + 8002f00: af00 add r7, sp, #0 + 8002f02: 6078 str r0, [r7, #4] + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_CAN_TxMailbox2CompleteCallback could be implemented in the + user file + */ +} + 8002f04: bf00 nop + 8002f06: 370c adds r7, #12 + 8002f08: 46bd mov sp, r7 + 8002f0a: f85d 7b04 ldr.w r7, [sp], #4 + 8002f0e: 4770 bx lr + +08002f10 : + * @param hcan pointer to an CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +__weak void HAL_CAN_TxMailbox0AbortCallback(CAN_HandleTypeDef *hcan) +{ + 8002f10: b480 push {r7} + 8002f12: b083 sub sp, #12 + 8002f14: af00 add r7, sp, #0 + 8002f16: 6078 str r0, [r7, #4] + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_CAN_TxMailbox0AbortCallback could be implemented in the + user file + */ +} + 8002f18: bf00 nop + 8002f1a: 370c adds r7, #12 + 8002f1c: 46bd mov sp, r7 + 8002f1e: f85d 7b04 ldr.w r7, [sp], #4 + 8002f22: 4770 bx lr + +08002f24 : + * @param hcan pointer to an CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +__weak void HAL_CAN_TxMailbox1AbortCallback(CAN_HandleTypeDef *hcan) +{ + 8002f24: b480 push {r7} + 8002f26: b083 sub sp, #12 + 8002f28: af00 add r7, sp, #0 + 8002f2a: 6078 str r0, [r7, #4] + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_CAN_TxMailbox1AbortCallback could be implemented in the + user file + */ +} + 8002f2c: bf00 nop + 8002f2e: 370c adds r7, #12 + 8002f30: 46bd mov sp, r7 + 8002f32: f85d 7b04 ldr.w r7, [sp], #4 + 8002f36: 4770 bx lr + +08002f38 : + * @param hcan pointer to an CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +__weak void HAL_CAN_TxMailbox2AbortCallback(CAN_HandleTypeDef *hcan) +{ + 8002f38: b480 push {r7} + 8002f3a: b083 sub sp, #12 + 8002f3c: af00 add r7, sp, #0 + 8002f3e: 6078 str r0, [r7, #4] + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_CAN_TxMailbox2AbortCallback could be implemented in the + user file + */ +} + 8002f40: bf00 nop + 8002f42: 370c adds r7, #12 + 8002f44: 46bd mov sp, r7 + 8002f46: f85d 7b04 ldr.w r7, [sp], #4 + 8002f4a: 4770 bx lr + +08002f4c : + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +__weak void HAL_CAN_RxFifo0FullCallback(CAN_HandleTypeDef *hcan) +{ + 8002f4c: b480 push {r7} + 8002f4e: b083 sub sp, #12 + 8002f50: af00 add r7, sp, #0 + 8002f52: 6078 str r0, [r7, #4] + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_CAN_RxFifo0FullCallback could be implemented in the user + file + */ +} + 8002f54: bf00 nop + 8002f56: 370c adds r7, #12 + 8002f58: 46bd mov sp, r7 + 8002f5a: f85d 7b04 ldr.w r7, [sp], #4 + 8002f5e: 4770 bx lr + +08002f60 : + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +__weak void HAL_CAN_RxFifo1MsgPendingCallback(CAN_HandleTypeDef *hcan) +{ + 8002f60: b480 push {r7} + 8002f62: b083 sub sp, #12 + 8002f64: af00 add r7, sp, #0 + 8002f66: 6078 str r0, [r7, #4] + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_CAN_RxFifo1MsgPendingCallback could be implemented in the + user file + */ +} + 8002f68: bf00 nop + 8002f6a: 370c adds r7, #12 + 8002f6c: 46bd mov sp, r7 + 8002f6e: f85d 7b04 ldr.w r7, [sp], #4 + 8002f72: 4770 bx lr + +08002f74 : + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +__weak void HAL_CAN_RxFifo1FullCallback(CAN_HandleTypeDef *hcan) +{ + 8002f74: b480 push {r7} + 8002f76: b083 sub sp, #12 + 8002f78: af00 add r7, sp, #0 + 8002f7a: 6078 str r0, [r7, #4] + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_CAN_RxFifo1FullCallback could be implemented in the user + file + */ +} + 8002f7c: bf00 nop + 8002f7e: 370c adds r7, #12 + 8002f80: 46bd mov sp, r7 + 8002f82: f85d 7b04 ldr.w r7, [sp], #4 + 8002f86: 4770 bx lr + +08002f88 : + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +__weak void HAL_CAN_SleepCallback(CAN_HandleTypeDef *hcan) +{ + 8002f88: b480 push {r7} + 8002f8a: b083 sub sp, #12 + 8002f8c: af00 add r7, sp, #0 + 8002f8e: 6078 str r0, [r7, #4] + UNUSED(hcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_CAN_SleepCallback could be implemented in the user file + */ +} + 8002f90: bf00 nop + 8002f92: 370c adds r7, #12 + 8002f94: 46bd mov sp, r7 + 8002f96: f85d 7b04 ldr.w r7, [sp], #4 + 8002f9a: 4770 bx lr + +08002f9c : + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +__weak void HAL_CAN_WakeUpFromRxMsgCallback(CAN_HandleTypeDef *hcan) +{ + 8002f9c: b480 push {r7} + 8002f9e: b083 sub sp, #12 + 8002fa0: af00 add r7, sp, #0 + 8002fa2: 6078 str r0, [r7, #4] + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_CAN_WakeUpFromRxMsgCallback could be implemented in the + user file + */ +} + 8002fa4: bf00 nop + 8002fa6: 370c adds r7, #12 + 8002fa8: 46bd mov sp, r7 + 8002faa: f85d 7b04 ldr.w r7, [sp], #4 + 8002fae: 4770 bx lr + +08002fb0 : + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +__weak void HAL_CAN_ErrorCallback(CAN_HandleTypeDef *hcan) +{ + 8002fb0: b480 push {r7} + 8002fb2: b083 sub sp, #12 + 8002fb4: af00 add r7, sp, #0 + 8002fb6: 6078 str r0, [r7, #4] + UNUSED(hcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_CAN_ErrorCallback could be implemented in the user file + */ +} + 8002fb8: bf00 nop + 8002fba: 370c adds r7, #12 + 8002fbc: 46bd mov sp, r7 + 8002fbe: f85d 7b04 ldr.w r7, [sp], #4 + 8002fc2: 4770 bx lr + +08002fc4 <__NVIC_SetPriorityGrouping>: + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + 8002fc4: b480 push {r7} + 8002fc6: b085 sub sp, #20 + 8002fc8: af00 add r7, sp, #0 + 8002fca: 6078 str r0, [r7, #4] + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + 8002fcc: 687b ldr r3, [r7, #4] + 8002fce: f003 0307 and.w r3, r3, #7 + 8002fd2: 60fb str r3, [r7, #12] + + reg_value = SCB->AIRCR; /* read old register configuration */ + 8002fd4: 4b0c ldr r3, [pc, #48] ; (8003008 <__NVIC_SetPriorityGrouping+0x44>) + 8002fd6: 68db ldr r3, [r3, #12] + 8002fd8: 60bb str r3, [r7, #8] + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + 8002fda: 68ba ldr r2, [r7, #8] + 8002fdc: f64f 03ff movw r3, #63743 ; 0xf8ff + 8002fe0: 4013 ands r3, r2 + 8002fe2: 60bb str r3, [r7, #8] + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ + 8002fe4: 68fb ldr r3, [r7, #12] + 8002fe6: 021a lsls r2, r3, #8 + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + 8002fe8: 68bb ldr r3, [r7, #8] + 8002fea: 4313 orrs r3, r2 + reg_value = (reg_value | + 8002fec: f043 63bf orr.w r3, r3, #100139008 ; 0x5f80000 + 8002ff0: f443 3300 orr.w r3, r3, #131072 ; 0x20000 + 8002ff4: 60bb str r3, [r7, #8] + SCB->AIRCR = reg_value; + 8002ff6: 4a04 ldr r2, [pc, #16] ; (8003008 <__NVIC_SetPriorityGrouping+0x44>) + 8002ff8: 68bb ldr r3, [r7, #8] + 8002ffa: 60d3 str r3, [r2, #12] +} + 8002ffc: bf00 nop + 8002ffe: 3714 adds r7, #20 + 8003000: 46bd mov sp, r7 + 8003002: f85d 7b04 ldr.w r7, [sp], #4 + 8003006: 4770 bx lr + 8003008: e000ed00 .word 0xe000ed00 + +0800300c <__NVIC_GetPriorityGrouping>: + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + 800300c: b480 push {r7} + 800300e: af00 add r7, sp, #0 + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); + 8003010: 4b04 ldr r3, [pc, #16] ; (8003024 <__NVIC_GetPriorityGrouping+0x18>) + 8003012: 68db ldr r3, [r3, #12] + 8003014: 0a1b lsrs r3, r3, #8 + 8003016: f003 0307 and.w r3, r3, #7 +} + 800301a: 4618 mov r0, r3 + 800301c: 46bd mov sp, r7 + 800301e: f85d 7b04 ldr.w r7, [sp], #4 + 8003022: 4770 bx lr + 8003024: e000ed00 .word 0xe000ed00 + +08003028 <__NVIC_EnableIRQ>: + \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) +{ + 8003028: b480 push {r7} + 800302a: b083 sub sp, #12 + 800302c: af00 add r7, sp, #0 + 800302e: 4603 mov r3, r0 + 8003030: 71fb strb r3, [r7, #7] + if ((int32_t)(IRQn) >= 0) + 8003032: f997 3007 ldrsb.w r3, [r7, #7] + 8003036: 2b00 cmp r3, #0 + 8003038: db0b blt.n 8003052 <__NVIC_EnableIRQ+0x2a> + { + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + 800303a: 79fb ldrb r3, [r7, #7] + 800303c: f003 021f and.w r2, r3, #31 + 8003040: 4907 ldr r1, [pc, #28] ; (8003060 <__NVIC_EnableIRQ+0x38>) + 8003042: f997 3007 ldrsb.w r3, [r7, #7] + 8003046: 095b lsrs r3, r3, #5 + 8003048: 2001 movs r0, #1 + 800304a: fa00 f202 lsl.w r2, r0, r2 + 800304e: f841 2023 str.w r2, [r1, r3, lsl #2] + } +} + 8003052: bf00 nop + 8003054: 370c adds r7, #12 + 8003056: 46bd mov sp, r7 + 8003058: f85d 7b04 ldr.w r7, [sp], #4 + 800305c: 4770 bx lr + 800305e: bf00 nop + 8003060: e000e100 .word 0xe000e100 + +08003064 <__NVIC_SetPriority>: + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + 8003064: b480 push {r7} + 8003066: b083 sub sp, #12 + 8003068: af00 add r7, sp, #0 + 800306a: 4603 mov r3, r0 + 800306c: 6039 str r1, [r7, #0] + 800306e: 71fb strb r3, [r7, #7] + if ((int32_t)(IRQn) >= 0) + 8003070: f997 3007 ldrsb.w r3, [r7, #7] + 8003074: 2b00 cmp r3, #0 + 8003076: db0a blt.n 800308e <__NVIC_SetPriority+0x2a> + { + NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + 8003078: 683b ldr r3, [r7, #0] + 800307a: b2da uxtb r2, r3 + 800307c: 490c ldr r1, [pc, #48] ; (80030b0 <__NVIC_SetPriority+0x4c>) + 800307e: f997 3007 ldrsb.w r3, [r7, #7] + 8003082: 0112 lsls r2, r2, #4 + 8003084: b2d2 uxtb r2, r2 + 8003086: 440b add r3, r1 + 8003088: f883 2300 strb.w r2, [r3, #768] ; 0x300 + } + else + { + SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + 800308c: e00a b.n 80030a4 <__NVIC_SetPriority+0x40> + SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + 800308e: 683b ldr r3, [r7, #0] + 8003090: b2da uxtb r2, r3 + 8003092: 4908 ldr r1, [pc, #32] ; (80030b4 <__NVIC_SetPriority+0x50>) + 8003094: 79fb ldrb r3, [r7, #7] + 8003096: f003 030f and.w r3, r3, #15 + 800309a: 3b04 subs r3, #4 + 800309c: 0112 lsls r2, r2, #4 + 800309e: b2d2 uxtb r2, r2 + 80030a0: 440b add r3, r1 + 80030a2: 761a strb r2, [r3, #24] +} + 80030a4: bf00 nop + 80030a6: 370c adds r7, #12 + 80030a8: 46bd mov sp, r7 + 80030aa: f85d 7b04 ldr.w r7, [sp], #4 + 80030ae: 4770 bx lr + 80030b0: e000e100 .word 0xe000e100 + 80030b4: e000ed00 .word 0xe000ed00 + +080030b8 : + \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) +{ + 80030b8: b480 push {r7} + 80030ba: b089 sub sp, #36 ; 0x24 + 80030bc: af00 add r7, sp, #0 + 80030be: 60f8 str r0, [r7, #12] + 80030c0: 60b9 str r1, [r7, #8] + 80030c2: 607a str r2, [r7, #4] + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + 80030c4: 68fb ldr r3, [r7, #12] + 80030c6: f003 0307 and.w r3, r3, #7 + 80030ca: 61fb str r3, [r7, #28] + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + 80030cc: 69fb ldr r3, [r7, #28] + 80030ce: f1c3 0307 rsb r3, r3, #7 + 80030d2: 2b04 cmp r3, #4 + 80030d4: bf28 it cs + 80030d6: 2304 movcs r3, #4 + 80030d8: 61bb str r3, [r7, #24] + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + 80030da: 69fb ldr r3, [r7, #28] + 80030dc: 3304 adds r3, #4 + 80030de: 2b06 cmp r3, #6 + 80030e0: d902 bls.n 80030e8 + 80030e2: 69fb ldr r3, [r7, #28] + 80030e4: 3b03 subs r3, #3 + 80030e6: e000 b.n 80030ea + 80030e8: 2300 movs r3, #0 + 80030ea: 617b str r3, [r7, #20] + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + 80030ec: f04f 32ff mov.w r2, #4294967295 ; 0xffffffff + 80030f0: 69bb ldr r3, [r7, #24] + 80030f2: fa02 f303 lsl.w r3, r2, r3 + 80030f6: 43da mvns r2, r3 + 80030f8: 68bb ldr r3, [r7, #8] + 80030fa: 401a ands r2, r3 + 80030fc: 697b ldr r3, [r7, #20] + 80030fe: 409a lsls r2, r3 + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + 8003100: f04f 31ff mov.w r1, #4294967295 ; 0xffffffff + 8003104: 697b ldr r3, [r7, #20] + 8003106: fa01 f303 lsl.w r3, r1, r3 + 800310a: 43d9 mvns r1, r3 + 800310c: 687b ldr r3, [r7, #4] + 800310e: 400b ands r3, r1 + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + 8003110: 4313 orrs r3, r2 + ); +} + 8003112: 4618 mov r0, r3 + 8003114: 3724 adds r7, #36 ; 0x24 + 8003116: 46bd mov sp, r7 + 8003118: f85d 7b04 ldr.w r7, [sp], #4 + 800311c: 4770 bx lr + ... + +08003120 : + \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) +{ + 8003120: b580 push {r7, lr} + 8003122: b082 sub sp, #8 + 8003124: af00 add r7, sp, #0 + 8003126: 6078 str r0, [r7, #4] + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + 8003128: 687b ldr r3, [r7, #4] + 800312a: 3b01 subs r3, #1 + 800312c: f1b3 7f80 cmp.w r3, #16777216 ; 0x1000000 + 8003130: d301 bcc.n 8003136 + { + return (1UL); /* Reload value impossible */ + 8003132: 2301 movs r3, #1 + 8003134: e00f b.n 8003156 + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + 8003136: 4a0a ldr r2, [pc, #40] ; (8003160 ) + 8003138: 687b ldr r3, [r7, #4] + 800313a: 3b01 subs r3, #1 + 800313c: 6053 str r3, [r2, #4] + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + 800313e: 210f movs r1, #15 + 8003140: f04f 30ff mov.w r0, #4294967295 ; 0xffffffff + 8003144: f7ff ff8e bl 8003064 <__NVIC_SetPriority> + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + 8003148: 4b05 ldr r3, [pc, #20] ; (8003160 ) + 800314a: 2200 movs r2, #0 + 800314c: 609a str r2, [r3, #8] + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + 800314e: 4b04 ldr r3, [pc, #16] ; (8003160 ) + 8003150: 2207 movs r2, #7 + 8003152: 601a str r2, [r3, #0] + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ + 8003154: 2300 movs r3, #0 +} + 8003156: 4618 mov r0, r3 + 8003158: 3708 adds r7, #8 + 800315a: 46bd mov sp, r7 + 800315c: bd80 pop {r7, pc} + 800315e: bf00 nop + 8003160: e000e010 .word 0xe000e010 + +08003164 : + * @note When the NVIC_PriorityGroup_0 is selected, IRQ pre-emption is no more possible. + * The pending IRQ priority will be managed only by the subpriority. + * @retval None + */ +void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + 8003164: b580 push {r7, lr} + 8003166: b082 sub sp, #8 + 8003168: af00 add r7, sp, #0 + 800316a: 6078 str r0, [r7, #4] + /* Check the parameters */ + assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup)); + + /* Set the PRIGROUP[10:8] bits according to the PriorityGroup parameter value */ + NVIC_SetPriorityGrouping(PriorityGroup); + 800316c: 6878 ldr r0, [r7, #4] + 800316e: f7ff ff29 bl 8002fc4 <__NVIC_SetPriorityGrouping> +} + 8003172: bf00 nop + 8003174: 3708 adds r7, #8 + 8003176: 46bd mov sp, r7 + 8003178: bd80 pop {r7, pc} + +0800317a : + * This parameter can be a value between 0 and 15 as described in the table CORTEX_NVIC_Priority_Table + * A lower priority value indicates a higher priority. + * @retval None + */ +void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority) +{ + 800317a: b580 push {r7, lr} + 800317c: b086 sub sp, #24 + 800317e: af00 add r7, sp, #0 + 8003180: 4603 mov r3, r0 + 8003182: 60b9 str r1, [r7, #8] + 8003184: 607a str r2, [r7, #4] + 8003186: 73fb strb r3, [r7, #15] + uint32_t prioritygroup = 0x00U; + 8003188: 2300 movs r3, #0 + 800318a: 617b str r3, [r7, #20] + + /* Check the parameters */ + assert_param(IS_NVIC_SUB_PRIORITY(SubPriority)); + assert_param(IS_NVIC_PREEMPTION_PRIORITY(PreemptPriority)); + + prioritygroup = NVIC_GetPriorityGrouping(); + 800318c: f7ff ff3e bl 800300c <__NVIC_GetPriorityGrouping> + 8003190: 6178 str r0, [r7, #20] + + NVIC_SetPriority(IRQn, NVIC_EncodePriority(prioritygroup, PreemptPriority, SubPriority)); + 8003192: 687a ldr r2, [r7, #4] + 8003194: 68b9 ldr r1, [r7, #8] + 8003196: 6978 ldr r0, [r7, #20] + 8003198: f7ff ff8e bl 80030b8 + 800319c: 4602 mov r2, r0 + 800319e: f997 300f ldrsb.w r3, [r7, #15] + 80031a2: 4611 mov r1, r2 + 80031a4: 4618 mov r0, r3 + 80031a6: f7ff ff5d bl 8003064 <__NVIC_SetPriority> +} + 80031aa: bf00 nop + 80031ac: 3718 adds r7, #24 + 80031ae: 46bd mov sp, r7 + 80031b0: bd80 pop {r7, pc} + +080031b2 : + * 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 (stm32f3xxxx.h)) + * @retval None + */ +void HAL_NVIC_EnableIRQ(IRQn_Type IRQn) +{ + 80031b2: b580 push {r7, lr} + 80031b4: b082 sub sp, #8 + 80031b6: af00 add r7, sp, #0 + 80031b8: 4603 mov r3, r0 + 80031ba: 71fb strb r3, [r7, #7] + /* Check the parameters */ + assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); + + /* Enable interrupt */ + NVIC_EnableIRQ(IRQn); + 80031bc: f997 3007 ldrsb.w r3, [r7, #7] + 80031c0: 4618 mov r0, r3 + 80031c2: f7ff ff31 bl 8003028 <__NVIC_EnableIRQ> +} + 80031c6: bf00 nop + 80031c8: 3708 adds r7, #8 + 80031ca: 46bd mov sp, r7 + 80031cc: bd80 pop {r7, pc} + +080031ce : + * @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) +{ + 80031ce: b580 push {r7, lr} + 80031d0: b082 sub sp, #8 + 80031d2: af00 add r7, sp, #0 + 80031d4: 6078 str r0, [r7, #4] + return SysTick_Config(TicksNumb); + 80031d6: 6878 ldr r0, [r7, #4] + 80031d8: f7ff ffa2 bl 8003120 + 80031dc: 4603 mov r3, r0 +} + 80031de: 4618 mov r0, r3 + 80031e0: 3708 adds r7, #8 + 80031e2: 46bd mov sp, r7 + 80031e4: bd80 pop {r7, pc} + ... + +080031e8 : + * @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) +{ + 80031e8: b480 push {r7} + 80031ea: b087 sub sp, #28 + 80031ec: af00 add r7, sp, #0 + 80031ee: 6078 str r0, [r7, #4] + 80031f0: 6039 str r1, [r7, #0] + uint32_t position = 0x00u; + 80031f2: 2300 movs r3, #0 + 80031f4: 617b str r3, [r7, #20] + assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); + assert_param(IS_GPIO_PIN(GPIO_Init->Pin)); + assert_param(IS_GPIO_MODE(GPIO_Init->Mode)); + + /* Configure the port pins */ + while (((GPIO_Init->Pin) >> position) != 0x00u) + 80031f6: e154 b.n 80034a2 + { + /* Get current io position */ + iocurrent = (GPIO_Init->Pin) & (1uL << position); + 80031f8: 683b ldr r3, [r7, #0] + 80031fa: 681a ldr r2, [r3, #0] + 80031fc: 2101 movs r1, #1 + 80031fe: 697b ldr r3, [r7, #20] + 8003200: fa01 f303 lsl.w r3, r1, r3 + 8003204: 4013 ands r3, r2 + 8003206: 60fb str r3, [r7, #12] + + if (iocurrent != 0x00u) + 8003208: 68fb ldr r3, [r7, #12] + 800320a: 2b00 cmp r3, #0 + 800320c: f000 8146 beq.w 800349c + { + /*--------------------- 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)) + 8003210: 683b ldr r3, [r7, #0] + 8003212: 685b ldr r3, [r3, #4] + 8003214: f003 0303 and.w r3, r3, #3 + 8003218: 2b01 cmp r3, #1 + 800321a: d005 beq.n 8003228 + 800321c: 683b ldr r3, [r7, #0] + 800321e: 685b ldr r3, [r3, #4] + 8003220: f003 0303 and.w r3, r3, #3 + 8003224: 2b02 cmp r3, #2 + 8003226: d130 bne.n 800328a + { + /* Check the Speed parameter */ + assert_param(IS_GPIO_SPEED(GPIO_Init->Speed)); + /* Configure the IO Speed */ + temp = GPIOx->OSPEEDR; + 8003228: 687b ldr r3, [r7, #4] + 800322a: 689b ldr r3, [r3, #8] + 800322c: 613b str r3, [r7, #16] + temp &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2u)); + 800322e: 697b ldr r3, [r7, #20] + 8003230: 005b lsls r3, r3, #1 + 8003232: 2203 movs r2, #3 + 8003234: fa02 f303 lsl.w r3, r2, r3 + 8003238: 43db mvns r3, r3 + 800323a: 693a ldr r2, [r7, #16] + 800323c: 4013 ands r3, r2 + 800323e: 613b str r3, [r7, #16] + temp |= (GPIO_Init->Speed << (position * 2u)); + 8003240: 683b ldr r3, [r7, #0] + 8003242: 68da ldr r2, [r3, #12] + 8003244: 697b ldr r3, [r7, #20] + 8003246: 005b lsls r3, r3, #1 + 8003248: fa02 f303 lsl.w r3, r2, r3 + 800324c: 693a ldr r2, [r7, #16] + 800324e: 4313 orrs r3, r2 + 8003250: 613b str r3, [r7, #16] + GPIOx->OSPEEDR = temp; + 8003252: 687b ldr r3, [r7, #4] + 8003254: 693a ldr r2, [r7, #16] + 8003256: 609a str r2, [r3, #8] + + /* Configure the IO Output Type */ + temp = GPIOx->OTYPER; + 8003258: 687b ldr r3, [r7, #4] + 800325a: 685b ldr r3, [r3, #4] + 800325c: 613b str r3, [r7, #16] + temp &= ~(GPIO_OTYPER_OT_0 << position) ; + 800325e: 2201 movs r2, #1 + 8003260: 697b ldr r3, [r7, #20] + 8003262: fa02 f303 lsl.w r3, r2, r3 + 8003266: 43db mvns r3, r3 + 8003268: 693a ldr r2, [r7, #16] + 800326a: 4013 ands r3, r2 + 800326c: 613b str r3, [r7, #16] + temp |= (((GPIO_Init->Mode & OUTPUT_TYPE) >> OUTPUT_TYPE_Pos) << position); + 800326e: 683b ldr r3, [r7, #0] + 8003270: 685b ldr r3, [r3, #4] + 8003272: 091b lsrs r3, r3, #4 + 8003274: f003 0201 and.w r2, r3, #1 + 8003278: 697b ldr r3, [r7, #20] + 800327a: fa02 f303 lsl.w r3, r2, r3 + 800327e: 693a ldr r2, [r7, #16] + 8003280: 4313 orrs r3, r2 + 8003282: 613b str r3, [r7, #16] + GPIOx->OTYPER = temp; + 8003284: 687b ldr r3, [r7, #4] + 8003286: 693a ldr r2, [r7, #16] + 8003288: 605a str r2, [r3, #4] + } + + if((GPIO_Init->Mode & GPIO_MODE) != MODE_ANALOG) + 800328a: 683b ldr r3, [r7, #0] + 800328c: 685b ldr r3, [r3, #4] + 800328e: f003 0303 and.w r3, r3, #3 + 8003292: 2b03 cmp r3, #3 + 8003294: d017 beq.n 80032c6 + { + /* Check the Pull parameter */ + assert_param(IS_GPIO_PULL(GPIO_Init->Pull)); + + /* Activate the Pull-up or Pull down resistor for the current IO */ + temp = GPIOx->PUPDR; + 8003296: 687b ldr r3, [r7, #4] + 8003298: 68db ldr r3, [r3, #12] + 800329a: 613b str r3, [r7, #16] + temp &= ~(GPIO_PUPDR_PUPDR0 << (position * 2u)); + 800329c: 697b ldr r3, [r7, #20] + 800329e: 005b lsls r3, r3, #1 + 80032a0: 2203 movs r2, #3 + 80032a2: fa02 f303 lsl.w r3, r2, r3 + 80032a6: 43db mvns r3, r3 + 80032a8: 693a ldr r2, [r7, #16] + 80032aa: 4013 ands r3, r2 + 80032ac: 613b str r3, [r7, #16] + temp |= ((GPIO_Init->Pull) << (position * 2u)); + 80032ae: 683b ldr r3, [r7, #0] + 80032b0: 689a ldr r2, [r3, #8] + 80032b2: 697b ldr r3, [r7, #20] + 80032b4: 005b lsls r3, r3, #1 + 80032b6: fa02 f303 lsl.w r3, r2, r3 + 80032ba: 693a ldr r2, [r7, #16] + 80032bc: 4313 orrs r3, r2 + 80032be: 613b str r3, [r7, #16] + GPIOx->PUPDR = temp; + 80032c0: 687b ldr r3, [r7, #4] + 80032c2: 693a ldr r2, [r7, #16] + 80032c4: 60da str r2, [r3, #12] + } + + /*--------------------- GPIO Mode Configuration ------------------------*/ + /* In case of Alternate function mode selection */ + if((GPIO_Init->Mode & GPIO_MODE) == MODE_AF) + 80032c6: 683b ldr r3, [r7, #0] + 80032c8: 685b ldr r3, [r3, #4] + 80032ca: f003 0303 and.w r3, r3, #3 + 80032ce: 2b02 cmp r3, #2 + 80032d0: d123 bne.n 800331a + /* Check the Alternate function parameters */ + assert_param(IS_GPIO_AF_INSTANCE(GPIOx)); + assert_param(IS_GPIO_AF(GPIO_Init->Alternate)); + + /* Configure Alternate function mapped with the current IO */ + temp = GPIOx->AFR[position >> 3u]; + 80032d2: 697b ldr r3, [r7, #20] + 80032d4: 08da lsrs r2, r3, #3 + 80032d6: 687b ldr r3, [r7, #4] + 80032d8: 3208 adds r2, #8 + 80032da: f853 3022 ldr.w r3, [r3, r2, lsl #2] + 80032de: 613b str r3, [r7, #16] + temp &= ~(0xFu << ((position & 0x07u) * 4u)); + 80032e0: 697b ldr r3, [r7, #20] + 80032e2: f003 0307 and.w r3, r3, #7 + 80032e6: 009b lsls r3, r3, #2 + 80032e8: 220f movs r2, #15 + 80032ea: fa02 f303 lsl.w r3, r2, r3 + 80032ee: 43db mvns r3, r3 + 80032f0: 693a ldr r2, [r7, #16] + 80032f2: 4013 ands r3, r2 + 80032f4: 613b str r3, [r7, #16] + temp |= ((GPIO_Init->Alternate) << ((position & 0x07u) * 4u)); + 80032f6: 683b ldr r3, [r7, #0] + 80032f8: 691a ldr r2, [r3, #16] + 80032fa: 697b ldr r3, [r7, #20] + 80032fc: f003 0307 and.w r3, r3, #7 + 8003300: 009b lsls r3, r3, #2 + 8003302: fa02 f303 lsl.w r3, r2, r3 + 8003306: 693a ldr r2, [r7, #16] + 8003308: 4313 orrs r3, r2 + 800330a: 613b str r3, [r7, #16] + GPIOx->AFR[position >> 3u] = temp; + 800330c: 697b ldr r3, [r7, #20] + 800330e: 08da lsrs r2, r3, #3 + 8003310: 687b ldr r3, [r7, #4] + 8003312: 3208 adds r2, #8 + 8003314: 6939 ldr r1, [r7, #16] + 8003316: f843 1022 str.w r1, [r3, r2, lsl #2] + } + + /* Configure IO Direction mode (Input, Output, Alternate or Analog) */ + temp = GPIOx->MODER; + 800331a: 687b ldr r3, [r7, #4] + 800331c: 681b ldr r3, [r3, #0] + 800331e: 613b str r3, [r7, #16] + temp &= ~(GPIO_MODER_MODER0 << (position * 2u)); + 8003320: 697b ldr r3, [r7, #20] + 8003322: 005b lsls r3, r3, #1 + 8003324: 2203 movs r2, #3 + 8003326: fa02 f303 lsl.w r3, r2, r3 + 800332a: 43db mvns r3, r3 + 800332c: 693a ldr r2, [r7, #16] + 800332e: 4013 ands r3, r2 + 8003330: 613b str r3, [r7, #16] + temp |= ((GPIO_Init->Mode & GPIO_MODE) << (position * 2u)); + 8003332: 683b ldr r3, [r7, #0] + 8003334: 685b ldr r3, [r3, #4] + 8003336: f003 0203 and.w r2, r3, #3 + 800333a: 697b ldr r3, [r7, #20] + 800333c: 005b lsls r3, r3, #1 + 800333e: fa02 f303 lsl.w r3, r2, r3 + 8003342: 693a ldr r2, [r7, #16] + 8003344: 4313 orrs r3, r2 + 8003346: 613b str r3, [r7, #16] + GPIOx->MODER = temp; + 8003348: 687b ldr r3, [r7, #4] + 800334a: 693a ldr r2, [r7, #16] + 800334c: 601a str r2, [r3, #0] + + /*--------------------- EXTI Mode Configuration ------------------------*/ + /* Configure the External Interrupt or event for the current IO */ + if((GPIO_Init->Mode & EXTI_MODE) != 0x00u) + 800334e: 683b ldr r3, [r7, #0] + 8003350: 685b ldr r3, [r3, #4] + 8003352: f403 3340 and.w r3, r3, #196608 ; 0x30000 + 8003356: 2b00 cmp r3, #0 + 8003358: f000 80a0 beq.w 800349c + { + /* Enable SYSCFG Clock */ + __HAL_RCC_SYSCFG_CLK_ENABLE(); + 800335c: 4b58 ldr r3, [pc, #352] ; (80034c0 ) + 800335e: 699b ldr r3, [r3, #24] + 8003360: 4a57 ldr r2, [pc, #348] ; (80034c0 ) + 8003362: f043 0301 orr.w r3, r3, #1 + 8003366: 6193 str r3, [r2, #24] + 8003368: 4b55 ldr r3, [pc, #340] ; (80034c0 ) + 800336a: 699b ldr r3, [r3, #24] + 800336c: f003 0301 and.w r3, r3, #1 + 8003370: 60bb str r3, [r7, #8] + 8003372: 68bb ldr r3, [r7, #8] + + temp = SYSCFG->EXTICR[position >> 2u]; + 8003374: 4a53 ldr r2, [pc, #332] ; (80034c4 ) + 8003376: 697b ldr r3, [r7, #20] + 8003378: 089b lsrs r3, r3, #2 + 800337a: 3302 adds r3, #2 + 800337c: f852 3023 ldr.w r3, [r2, r3, lsl #2] + 8003380: 613b str r3, [r7, #16] + temp &= ~(0x0FuL << (4u * (position & 0x03u))); + 8003382: 697b ldr r3, [r7, #20] + 8003384: f003 0303 and.w r3, r3, #3 + 8003388: 009b lsls r3, r3, #2 + 800338a: 220f movs r2, #15 + 800338c: fa02 f303 lsl.w r3, r2, r3 + 8003390: 43db mvns r3, r3 + 8003392: 693a ldr r2, [r7, #16] + 8003394: 4013 ands r3, r2 + 8003396: 613b str r3, [r7, #16] + temp |= (GPIO_GET_INDEX(GPIOx) << (4u * (position & 0x03u))); + 8003398: 687b ldr r3, [r7, #4] + 800339a: f1b3 4f90 cmp.w r3, #1207959552 ; 0x48000000 + 800339e: d019 beq.n 80033d4 + 80033a0: 687b ldr r3, [r7, #4] + 80033a2: 4a49 ldr r2, [pc, #292] ; (80034c8 ) + 80033a4: 4293 cmp r3, r2 + 80033a6: d013 beq.n 80033d0 + 80033a8: 687b ldr r3, [r7, #4] + 80033aa: 4a48 ldr r2, [pc, #288] ; (80034cc ) + 80033ac: 4293 cmp r3, r2 + 80033ae: d00d beq.n 80033cc + 80033b0: 687b ldr r3, [r7, #4] + 80033b2: 4a47 ldr r2, [pc, #284] ; (80034d0 ) + 80033b4: 4293 cmp r3, r2 + 80033b6: d007 beq.n 80033c8 + 80033b8: 687b ldr r3, [r7, #4] + 80033ba: 4a46 ldr r2, [pc, #280] ; (80034d4 ) + 80033bc: 4293 cmp r3, r2 + 80033be: d101 bne.n 80033c4 + 80033c0: 2304 movs r3, #4 + 80033c2: e008 b.n 80033d6 + 80033c4: 2305 movs r3, #5 + 80033c6: e006 b.n 80033d6 + 80033c8: 2303 movs r3, #3 + 80033ca: e004 b.n 80033d6 + 80033cc: 2302 movs r3, #2 + 80033ce: e002 b.n 80033d6 + 80033d0: 2301 movs r3, #1 + 80033d2: e000 b.n 80033d6 + 80033d4: 2300 movs r3, #0 + 80033d6: 697a ldr r2, [r7, #20] + 80033d8: f002 0203 and.w r2, r2, #3 + 80033dc: 0092 lsls r2, r2, #2 + 80033de: 4093 lsls r3, r2 + 80033e0: 693a ldr r2, [r7, #16] + 80033e2: 4313 orrs r3, r2 + 80033e4: 613b str r3, [r7, #16] + SYSCFG->EXTICR[position >> 2u] = temp; + 80033e6: 4937 ldr r1, [pc, #220] ; (80034c4 ) + 80033e8: 697b ldr r3, [r7, #20] + 80033ea: 089b lsrs r3, r3, #2 + 80033ec: 3302 adds r3, #2 + 80033ee: 693a ldr r2, [r7, #16] + 80033f0: f841 2023 str.w r2, [r1, r3, lsl #2] + + /* Clear EXTI line configuration */ + temp = EXTI->IMR; + 80033f4: 4b38 ldr r3, [pc, #224] ; (80034d8 ) + 80033f6: 681b ldr r3, [r3, #0] + 80033f8: 613b str r3, [r7, #16] + temp &= ~(iocurrent); + 80033fa: 68fb ldr r3, [r7, #12] + 80033fc: 43db mvns r3, r3 + 80033fe: 693a ldr r2, [r7, #16] + 8003400: 4013 ands r3, r2 + 8003402: 613b str r3, [r7, #16] + if((GPIO_Init->Mode & EXTI_IT) != 0x00u) + 8003404: 683b ldr r3, [r7, #0] + 8003406: 685b ldr r3, [r3, #4] + 8003408: f403 3380 and.w r3, r3, #65536 ; 0x10000 + 800340c: 2b00 cmp r3, #0 + 800340e: d003 beq.n 8003418 + { + temp |= iocurrent; + 8003410: 693a ldr r2, [r7, #16] + 8003412: 68fb ldr r3, [r7, #12] + 8003414: 4313 orrs r3, r2 + 8003416: 613b str r3, [r7, #16] + } + EXTI->IMR = temp; + 8003418: 4a2f ldr r2, [pc, #188] ; (80034d8 ) + 800341a: 693b ldr r3, [r7, #16] + 800341c: 6013 str r3, [r2, #0] + + temp = EXTI->EMR; + 800341e: 4b2e ldr r3, [pc, #184] ; (80034d8 ) + 8003420: 685b ldr r3, [r3, #4] + 8003422: 613b str r3, [r7, #16] + temp &= ~(iocurrent); + 8003424: 68fb ldr r3, [r7, #12] + 8003426: 43db mvns r3, r3 + 8003428: 693a ldr r2, [r7, #16] + 800342a: 4013 ands r3, r2 + 800342c: 613b str r3, [r7, #16] + if((GPIO_Init->Mode & EXTI_EVT) != 0x00u) + 800342e: 683b ldr r3, [r7, #0] + 8003430: 685b ldr r3, [r3, #4] + 8003432: f403 3300 and.w r3, r3, #131072 ; 0x20000 + 8003436: 2b00 cmp r3, #0 + 8003438: d003 beq.n 8003442 + { + temp |= iocurrent; + 800343a: 693a ldr r2, [r7, #16] + 800343c: 68fb ldr r3, [r7, #12] + 800343e: 4313 orrs r3, r2 + 8003440: 613b str r3, [r7, #16] + } + EXTI->EMR = temp; + 8003442: 4a25 ldr r2, [pc, #148] ; (80034d8 ) + 8003444: 693b ldr r3, [r7, #16] + 8003446: 6053 str r3, [r2, #4] + + /* Clear Rising Falling edge configuration */ + temp = EXTI->RTSR; + 8003448: 4b23 ldr r3, [pc, #140] ; (80034d8 ) + 800344a: 689b ldr r3, [r3, #8] + 800344c: 613b str r3, [r7, #16] + temp &= ~(iocurrent); + 800344e: 68fb ldr r3, [r7, #12] + 8003450: 43db mvns r3, r3 + 8003452: 693a ldr r2, [r7, #16] + 8003454: 4013 ands r3, r2 + 8003456: 613b str r3, [r7, #16] + if((GPIO_Init->Mode & TRIGGER_RISING) != 0x00u) + 8003458: 683b ldr r3, [r7, #0] + 800345a: 685b ldr r3, [r3, #4] + 800345c: f403 1380 and.w r3, r3, #1048576 ; 0x100000 + 8003460: 2b00 cmp r3, #0 + 8003462: d003 beq.n 800346c + { + temp |= iocurrent; + 8003464: 693a ldr r2, [r7, #16] + 8003466: 68fb ldr r3, [r7, #12] + 8003468: 4313 orrs r3, r2 + 800346a: 613b str r3, [r7, #16] + } + EXTI->RTSR = temp; + 800346c: 4a1a ldr r2, [pc, #104] ; (80034d8 ) + 800346e: 693b ldr r3, [r7, #16] + 8003470: 6093 str r3, [r2, #8] + + temp = EXTI->FTSR; + 8003472: 4b19 ldr r3, [pc, #100] ; (80034d8 ) + 8003474: 68db ldr r3, [r3, #12] + 8003476: 613b str r3, [r7, #16] + temp &= ~(iocurrent); + 8003478: 68fb ldr r3, [r7, #12] + 800347a: 43db mvns r3, r3 + 800347c: 693a ldr r2, [r7, #16] + 800347e: 4013 ands r3, r2 + 8003480: 613b str r3, [r7, #16] + if((GPIO_Init->Mode & TRIGGER_FALLING) != 0x00u) + 8003482: 683b ldr r3, [r7, #0] + 8003484: 685b ldr r3, [r3, #4] + 8003486: f403 1300 and.w r3, r3, #2097152 ; 0x200000 + 800348a: 2b00 cmp r3, #0 + 800348c: d003 beq.n 8003496 + { + temp |= iocurrent; + 800348e: 693a ldr r2, [r7, #16] + 8003490: 68fb ldr r3, [r7, #12] + 8003492: 4313 orrs r3, r2 + 8003494: 613b str r3, [r7, #16] + } + EXTI->FTSR = temp; + 8003496: 4a10 ldr r2, [pc, #64] ; (80034d8 ) + 8003498: 693b ldr r3, [r7, #16] + 800349a: 60d3 str r3, [r2, #12] + } + } + + position++; + 800349c: 697b ldr r3, [r7, #20] + 800349e: 3301 adds r3, #1 + 80034a0: 617b str r3, [r7, #20] + while (((GPIO_Init->Pin) >> position) != 0x00u) + 80034a2: 683b ldr r3, [r7, #0] + 80034a4: 681a ldr r2, [r3, #0] + 80034a6: 697b ldr r3, [r7, #20] + 80034a8: fa22 f303 lsr.w r3, r2, r3 + 80034ac: 2b00 cmp r3, #0 + 80034ae: f47f aea3 bne.w 80031f8 + } +} + 80034b2: bf00 nop + 80034b4: bf00 nop + 80034b6: 371c adds r7, #28 + 80034b8: 46bd mov sp, r7 + 80034ba: f85d 7b04 ldr.w r7, [sp], #4 + 80034be: 4770 bx lr + 80034c0: 40021000 .word 0x40021000 + 80034c4: 40010000 .word 0x40010000 + 80034c8: 48000400 .word 0x48000400 + 80034cc: 48000800 .word 0x48000800 + 80034d0: 48000c00 .word 0x48000c00 + 80034d4: 48001000 .word 0x48001000 + 80034d8: 40010400 .word 0x40010400 + +080034dc : + * @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) +{ + 80034dc: b480 push {r7} + 80034de: b083 sub sp, #12 + 80034e0: af00 add r7, sp, #0 + 80034e2: 6078 str r0, [r7, #4] + 80034e4: 460b mov r3, r1 + 80034e6: 807b strh r3, [r7, #2] + 80034e8: 4613 mov r3, r2 + 80034ea: 707b strb r3, [r7, #1] + /* Check the parameters */ + assert_param(IS_GPIO_PIN(GPIO_Pin)); + assert_param(IS_GPIO_PIN_ACTION(PinState)); + + if(PinState != GPIO_PIN_RESET) + 80034ec: 787b ldrb r3, [r7, #1] + 80034ee: 2b00 cmp r3, #0 + 80034f0: d003 beq.n 80034fa + { + GPIOx->BSRR = (uint32_t)GPIO_Pin; + 80034f2: 887a ldrh r2, [r7, #2] + 80034f4: 687b ldr r3, [r7, #4] + 80034f6: 619a str r2, [r3, #24] + } + else + { + GPIOx->BRR = (uint32_t)GPIO_Pin; + } +} + 80034f8: e002 b.n 8003500 + GPIOx->BRR = (uint32_t)GPIO_Pin; + 80034fa: 887a ldrh r2, [r7, #2] + 80034fc: 687b ldr r3, [r7, #4] + 80034fe: 629a str r2, [r3, #40] ; 0x28 +} + 8003500: bf00 nop + 8003502: 370c adds r7, #12 + 8003504: 46bd mov sp, r7 + 8003506: f85d 7b04 ldr.w r7, [sp], #4 + 800350a: 4770 bx lr + +0800350c : + * @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) +{ + 800350c: b580 push {r7, lr} + 800350e: b082 sub sp, #8 + 8003510: af00 add r7, sp, #0 + 8003512: 6078 str r0, [r7, #4] + /* Check the I2C handle allocation */ + if (hi2c == NULL) + 8003514: 687b ldr r3, [r7, #4] + 8003516: 2b00 cmp r3, #0 + 8003518: d101 bne.n 800351e + { + return HAL_ERROR; + 800351a: 2301 movs r3, #1 + 800351c: e081 b.n 8003622 + assert_param(IS_I2C_OWN_ADDRESS2(hi2c->Init.OwnAddress2)); + assert_param(IS_I2C_OWN_ADDRESS2_MASK(hi2c->Init.OwnAddress2Masks)); + 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) + 800351e: 687b ldr r3, [r7, #4] + 8003520: f893 3041 ldrb.w r3, [r3, #65] ; 0x41 + 8003524: b2db uxtb r3, r3 + 8003526: 2b00 cmp r3, #0 + 8003528: d106 bne.n 8003538 + { + /* Allocate lock resource and initialize it */ + hi2c->Lock = HAL_UNLOCKED; + 800352a: 687b ldr r3, [r7, #4] + 800352c: 2200 movs r2, #0 + 800352e: f883 2040 strb.w r2, [r3, #64] ; 0x40 + + /* Init the low level hardware : GPIO, CLOCK, CORTEX...etc */ + hi2c->MspInitCallback(hi2c); +#else + /* Init the low level hardware : GPIO, CLOCK, CORTEX...etc */ + HAL_I2C_MspInit(hi2c); + 8003532: 6878 ldr r0, [r7, #4] + 8003534: f7fe fcf6 bl 8001f24 +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + } + + hi2c->State = HAL_I2C_STATE_BUSY; + 8003538: 687b ldr r3, [r7, #4] + 800353a: 2224 movs r2, #36 ; 0x24 + 800353c: f883 2041 strb.w r2, [r3, #65] ; 0x41 + + /* Disable the selected I2C peripheral */ + __HAL_I2C_DISABLE(hi2c); + 8003540: 687b ldr r3, [r7, #4] + 8003542: 681b ldr r3, [r3, #0] + 8003544: 681a ldr r2, [r3, #0] + 8003546: 687b ldr r3, [r7, #4] + 8003548: 681b ldr r3, [r3, #0] + 800354a: f022 0201 bic.w r2, r2, #1 + 800354e: 601a str r2, [r3, #0] + + /*---------------------------- I2Cx TIMINGR Configuration ------------------*/ + /* Configure I2Cx: Frequency range */ + hi2c->Instance->TIMINGR = hi2c->Init.Timing & TIMING_CLEAR_MASK; + 8003550: 687b ldr r3, [r7, #4] + 8003552: 685a ldr r2, [r3, #4] + 8003554: 687b ldr r3, [r7, #4] + 8003556: 681b ldr r3, [r3, #0] + 8003558: f022 6270 bic.w r2, r2, #251658240 ; 0xf000000 + 800355c: 611a str r2, [r3, #16] + + /*---------------------------- I2Cx OAR1 Configuration ---------------------*/ + /* Disable Own Address1 before set the Own Address1 configuration */ + hi2c->Instance->OAR1 &= ~I2C_OAR1_OA1EN; + 800355e: 687b ldr r3, [r7, #4] + 8003560: 681b ldr r3, [r3, #0] + 8003562: 689a ldr r2, [r3, #8] + 8003564: 687b ldr r3, [r7, #4] + 8003566: 681b ldr r3, [r3, #0] + 8003568: f422 4200 bic.w r2, r2, #32768 ; 0x8000 + 800356c: 609a str r2, [r3, #8] + + /* Configure I2Cx: Own Address1 and ack own address1 mode */ + if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT) + 800356e: 687b ldr r3, [r7, #4] + 8003570: 68db ldr r3, [r3, #12] + 8003572: 2b01 cmp r3, #1 + 8003574: d107 bne.n 8003586 + { + hi2c->Instance->OAR1 = (I2C_OAR1_OA1EN | hi2c->Init.OwnAddress1); + 8003576: 687b ldr r3, [r7, #4] + 8003578: 689a ldr r2, [r3, #8] + 800357a: 687b ldr r3, [r7, #4] + 800357c: 681b ldr r3, [r3, #0] + 800357e: f442 4200 orr.w r2, r2, #32768 ; 0x8000 + 8003582: 609a str r2, [r3, #8] + 8003584: e006 b.n 8003594 + } + else /* I2C_ADDRESSINGMODE_10BIT */ + { + hi2c->Instance->OAR1 = (I2C_OAR1_OA1EN | I2C_OAR1_OA1MODE | hi2c->Init.OwnAddress1); + 8003586: 687b ldr r3, [r7, #4] + 8003588: 689a ldr r2, [r3, #8] + 800358a: 687b ldr r3, [r7, #4] + 800358c: 681b ldr r3, [r3, #0] + 800358e: f442 4204 orr.w r2, r2, #33792 ; 0x8400 + 8003592: 609a str r2, [r3, #8] + } + + /*---------------------------- I2Cx CR2 Configuration ----------------------*/ + /* Configure I2Cx: Addressing Master mode */ + if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_10BIT) + 8003594: 687b ldr r3, [r7, #4] + 8003596: 68db ldr r3, [r3, #12] + 8003598: 2b02 cmp r3, #2 + 800359a: d104 bne.n 80035a6 + { + hi2c->Instance->CR2 = (I2C_CR2_ADD10); + 800359c: 687b ldr r3, [r7, #4] + 800359e: 681b ldr r3, [r3, #0] + 80035a0: f44f 6200 mov.w r2, #2048 ; 0x800 + 80035a4: 605a str r2, [r3, #4] + } + /* Enable the AUTOEND by default, and enable NACK (should be disable only during Slave process */ + hi2c->Instance->CR2 |= (I2C_CR2_AUTOEND | I2C_CR2_NACK); + 80035a6: 687b ldr r3, [r7, #4] + 80035a8: 681b ldr r3, [r3, #0] + 80035aa: 685b ldr r3, [r3, #4] + 80035ac: 687a ldr r2, [r7, #4] + 80035ae: 6812 ldr r2, [r2, #0] + 80035b0: f043 7300 orr.w r3, r3, #33554432 ; 0x2000000 + 80035b4: f443 4300 orr.w r3, r3, #32768 ; 0x8000 + 80035b8: 6053 str r3, [r2, #4] + + /*---------------------------- I2Cx OAR2 Configuration ---------------------*/ + /* Disable Own Address2 before set the Own Address2 configuration */ + hi2c->Instance->OAR2 &= ~I2C_DUALADDRESS_ENABLE; + 80035ba: 687b ldr r3, [r7, #4] + 80035bc: 681b ldr r3, [r3, #0] + 80035be: 68da ldr r2, [r3, #12] + 80035c0: 687b ldr r3, [r7, #4] + 80035c2: 681b ldr r3, [r3, #0] + 80035c4: f422 4200 bic.w r2, r2, #32768 ; 0x8000 + 80035c8: 60da str r2, [r3, #12] + + /* Configure I2Cx: Dual mode and Own Address2 */ + hi2c->Instance->OAR2 = (hi2c->Init.DualAddressMode | hi2c->Init.OwnAddress2 | \ + 80035ca: 687b ldr r3, [r7, #4] + 80035cc: 691a ldr r2, [r3, #16] + 80035ce: 687b ldr r3, [r7, #4] + 80035d0: 695b ldr r3, [r3, #20] + 80035d2: ea42 0103 orr.w r1, r2, r3 + (hi2c->Init.OwnAddress2Masks << 8)); + 80035d6: 687b ldr r3, [r7, #4] + 80035d8: 699b ldr r3, [r3, #24] + 80035da: 021a lsls r2, r3, #8 + hi2c->Instance->OAR2 = (hi2c->Init.DualAddressMode | hi2c->Init.OwnAddress2 | \ + 80035dc: 687b ldr r3, [r7, #4] + 80035de: 681b ldr r3, [r3, #0] + 80035e0: 430a orrs r2, r1 + 80035e2: 60da str r2, [r3, #12] + + /*---------------------------- I2Cx CR1 Configuration ----------------------*/ + /* Configure I2Cx: Generalcall and NoStretch mode */ + hi2c->Instance->CR1 = (hi2c->Init.GeneralCallMode | hi2c->Init.NoStretchMode); + 80035e4: 687b ldr r3, [r7, #4] + 80035e6: 69d9 ldr r1, [r3, #28] + 80035e8: 687b ldr r3, [r7, #4] + 80035ea: 6a1a ldr r2, [r3, #32] + 80035ec: 687b ldr r3, [r7, #4] + 80035ee: 681b ldr r3, [r3, #0] + 80035f0: 430a orrs r2, r1 + 80035f2: 601a str r2, [r3, #0] + + /* Enable the selected I2C peripheral */ + __HAL_I2C_ENABLE(hi2c); + 80035f4: 687b ldr r3, [r7, #4] + 80035f6: 681b ldr r3, [r3, #0] + 80035f8: 681a ldr r2, [r3, #0] + 80035fa: 687b ldr r3, [r7, #4] + 80035fc: 681b ldr r3, [r3, #0] + 80035fe: f042 0201 orr.w r2, r2, #1 + 8003602: 601a str r2, [r3, #0] + + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 8003604: 687b ldr r3, [r7, #4] + 8003606: 2200 movs r2, #0 + 8003608: 645a str r2, [r3, #68] ; 0x44 + hi2c->State = HAL_I2C_STATE_READY; + 800360a: 687b ldr r3, [r7, #4] + 800360c: 2220 movs r2, #32 + 800360e: f883 2041 strb.w r2, [r3, #65] ; 0x41 + hi2c->PreviousState = I2C_STATE_NONE; + 8003612: 687b ldr r3, [r7, #4] + 8003614: 2200 movs r2, #0 + 8003616: 631a str r2, [r3, #48] ; 0x30 + hi2c->Mode = HAL_I2C_MODE_NONE; + 8003618: 687b ldr r3, [r7, #4] + 800361a: 2200 movs r2, #0 + 800361c: f883 2042 strb.w r2, [r3, #66] ; 0x42 + + return HAL_OK; + 8003620: 2300 movs r3, #0 +} + 8003622: 4618 mov r0, r3 + 8003624: 3708 adds r7, #8 + 8003626: 46bd mov sp, r7 + 8003628: bd80 pop {r7, pc} + ... + +0800362c : + * @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) +{ + 800362c: b580 push {r7, lr} + 800362e: b088 sub sp, #32 + 8003630: af02 add r7, sp, #8 + 8003632: 60f8 str r0, [r7, #12] + 8003634: 607a str r2, [r7, #4] + 8003636: 461a mov r2, r3 + 8003638: 460b mov r3, r1 + 800363a: 817b strh r3, [r7, #10] + 800363c: 4613 mov r3, r2 + 800363e: 813b strh r3, [r7, #8] + uint32_t tickstart; + + if (hi2c->State == HAL_I2C_STATE_READY) + 8003640: 68fb ldr r3, [r7, #12] + 8003642: f893 3041 ldrb.w r3, [r3, #65] ; 0x41 + 8003646: b2db uxtb r3, r3 + 8003648: 2b20 cmp r3, #32 + 800364a: f040 80da bne.w 8003802 + { + /* Process Locked */ + __HAL_LOCK(hi2c); + 800364e: 68fb ldr r3, [r7, #12] + 8003650: f893 3040 ldrb.w r3, [r3, #64] ; 0x40 + 8003654: 2b01 cmp r3, #1 + 8003656: d101 bne.n 800365c + 8003658: 2302 movs r3, #2 + 800365a: e0d3 b.n 8003804 + 800365c: 68fb ldr r3, [r7, #12] + 800365e: 2201 movs r2, #1 + 8003660: f883 2040 strb.w r2, [r3, #64] ; 0x40 + + /* Init tickstart for timeout management*/ + tickstart = HAL_GetTick(); + 8003664: f7fe fdfe bl 8002264 + 8003668: 6178 str r0, [r7, #20] + + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY, tickstart) != HAL_OK) + 800366a: 697b ldr r3, [r7, #20] + 800366c: 9300 str r3, [sp, #0] + 800366e: 2319 movs r3, #25 + 8003670: 2201 movs r2, #1 + 8003672: f44f 4100 mov.w r1, #32768 ; 0x8000 + 8003676: 68f8 ldr r0, [r7, #12] + 8003678: f000 fcbc bl 8003ff4 + 800367c: 4603 mov r3, r0 + 800367e: 2b00 cmp r3, #0 + 8003680: d001 beq.n 8003686 + { + return HAL_ERROR; + 8003682: 2301 movs r3, #1 + 8003684: e0be b.n 8003804 + } + + hi2c->State = HAL_I2C_STATE_BUSY_TX; + 8003686: 68fb ldr r3, [r7, #12] + 8003688: 2221 movs r2, #33 ; 0x21 + 800368a: f883 2041 strb.w r2, [r3, #65] ; 0x41 + hi2c->Mode = HAL_I2C_MODE_MASTER; + 800368e: 68fb ldr r3, [r7, #12] + 8003690: 2210 movs r2, #16 + 8003692: f883 2042 strb.w r2, [r3, #66] ; 0x42 + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 8003696: 68fb ldr r3, [r7, #12] + 8003698: 2200 movs r2, #0 + 800369a: 645a str r2, [r3, #68] ; 0x44 + + /* Prepare transfer parameters */ + hi2c->pBuffPtr = pData; + 800369c: 68fb ldr r3, [r7, #12] + 800369e: 687a ldr r2, [r7, #4] + 80036a0: 625a str r2, [r3, #36] ; 0x24 + hi2c->XferCount = Size; + 80036a2: 68fb ldr r3, [r7, #12] + 80036a4: 893a ldrh r2, [r7, #8] + 80036a6: 855a strh r2, [r3, #42] ; 0x2a + hi2c->XferISR = NULL; + 80036a8: 68fb ldr r3, [r7, #12] + 80036aa: 2200 movs r2, #0 + 80036ac: 635a str r2, [r3, #52] ; 0x34 + + /* Send Slave Address */ + /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */ + if (hi2c->XferCount > MAX_NBYTE_SIZE) + 80036ae: 68fb ldr r3, [r7, #12] + 80036b0: 8d5b ldrh r3, [r3, #42] ; 0x2a + 80036b2: b29b uxth r3, r3 + 80036b4: 2bff cmp r3, #255 ; 0xff + 80036b6: d90e bls.n 80036d6 + { + hi2c->XferSize = MAX_NBYTE_SIZE; + 80036b8: 68fb ldr r3, [r7, #12] + 80036ba: 22ff movs r2, #255 ; 0xff + 80036bc: 851a strh r2, [r3, #40] ; 0x28 + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, + 80036be: 68fb ldr r3, [r7, #12] + 80036c0: 8d1b ldrh r3, [r3, #40] ; 0x28 + 80036c2: b2da uxtb r2, r3 + 80036c4: 8979 ldrh r1, [r7, #10] + 80036c6: 4b51 ldr r3, [pc, #324] ; (800380c ) + 80036c8: 9300 str r3, [sp, #0] + 80036ca: f04f 7380 mov.w r3, #16777216 ; 0x1000000 + 80036ce: 68f8 ldr r0, [r7, #12] + 80036d0: f000 fe2e bl 8004330 + 80036d4: e06c b.n 80037b0 + I2C_GENERATE_START_WRITE); + } + else + { + hi2c->XferSize = hi2c->XferCount; + 80036d6: 68fb ldr r3, [r7, #12] + 80036d8: 8d5b ldrh r3, [r3, #42] ; 0x2a + 80036da: b29a uxth r2, r3 + 80036dc: 68fb ldr r3, [r7, #12] + 80036de: 851a strh r2, [r3, #40] ; 0x28 + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, + 80036e0: 68fb ldr r3, [r7, #12] + 80036e2: 8d1b ldrh r3, [r3, #40] ; 0x28 + 80036e4: b2da uxtb r2, r3 + 80036e6: 8979 ldrh r1, [r7, #10] + 80036e8: 4b48 ldr r3, [pc, #288] ; (800380c ) + 80036ea: 9300 str r3, [sp, #0] + 80036ec: f04f 7300 mov.w r3, #33554432 ; 0x2000000 + 80036f0: 68f8 ldr r0, [r7, #12] + 80036f2: f000 fe1d bl 8004330 + I2C_GENERATE_START_WRITE); + } + + while (hi2c->XferCount > 0U) + 80036f6: e05b b.n 80037b0 + { + /* Wait until TXIS flag is set */ + if (I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) + 80036f8: 697a ldr r2, [r7, #20] + 80036fa: 6a39 ldr r1, [r7, #32] + 80036fc: 68f8 ldr r0, [r7, #12] + 80036fe: f000 fcb9 bl 8004074 + 8003702: 4603 mov r3, r0 + 8003704: 2b00 cmp r3, #0 + 8003706: d001 beq.n 800370c + { + return HAL_ERROR; + 8003708: 2301 movs r3, #1 + 800370a: e07b b.n 8003804 + } + /* Write data to TXDR */ + hi2c->Instance->TXDR = *hi2c->pBuffPtr; + 800370c: 68fb ldr r3, [r7, #12] + 800370e: 6a5b ldr r3, [r3, #36] ; 0x24 + 8003710: 781a ldrb r2, [r3, #0] + 8003712: 68fb ldr r3, [r7, #12] + 8003714: 681b ldr r3, [r3, #0] + 8003716: 629a str r2, [r3, #40] ; 0x28 + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + 8003718: 68fb ldr r3, [r7, #12] + 800371a: 6a5b ldr r3, [r3, #36] ; 0x24 + 800371c: 1c5a adds r2, r3, #1 + 800371e: 68fb ldr r3, [r7, #12] + 8003720: 625a str r2, [r3, #36] ; 0x24 + + hi2c->XferCount--; + 8003722: 68fb ldr r3, [r7, #12] + 8003724: 8d5b ldrh r3, [r3, #42] ; 0x2a + 8003726: b29b uxth r3, r3 + 8003728: 3b01 subs r3, #1 + 800372a: b29a uxth r2, r3 + 800372c: 68fb ldr r3, [r7, #12] + 800372e: 855a strh r2, [r3, #42] ; 0x2a + hi2c->XferSize--; + 8003730: 68fb ldr r3, [r7, #12] + 8003732: 8d1b ldrh r3, [r3, #40] ; 0x28 + 8003734: 3b01 subs r3, #1 + 8003736: b29a uxth r2, r3 + 8003738: 68fb ldr r3, [r7, #12] + 800373a: 851a strh r2, [r3, #40] ; 0x28 + + if ((hi2c->XferCount != 0U) && (hi2c->XferSize == 0U)) + 800373c: 68fb ldr r3, [r7, #12] + 800373e: 8d5b ldrh r3, [r3, #42] ; 0x2a + 8003740: b29b uxth r3, r3 + 8003742: 2b00 cmp r3, #0 + 8003744: d034 beq.n 80037b0 + 8003746: 68fb ldr r3, [r7, #12] + 8003748: 8d1b ldrh r3, [r3, #40] ; 0x28 + 800374a: 2b00 cmp r3, #0 + 800374c: d130 bne.n 80037b0 + { + /* Wait until TCR flag is set */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, Timeout, tickstart) != HAL_OK) + 800374e: 697b ldr r3, [r7, #20] + 8003750: 9300 str r3, [sp, #0] + 8003752: 6a3b ldr r3, [r7, #32] + 8003754: 2200 movs r2, #0 + 8003756: 2180 movs r1, #128 ; 0x80 + 8003758: 68f8 ldr r0, [r7, #12] + 800375a: f000 fc4b bl 8003ff4 + 800375e: 4603 mov r3, r0 + 8003760: 2b00 cmp r3, #0 + 8003762: d001 beq.n 8003768 + { + return HAL_ERROR; + 8003764: 2301 movs r3, #1 + 8003766: e04d b.n 8003804 + } + + if (hi2c->XferCount > MAX_NBYTE_SIZE) + 8003768: 68fb ldr r3, [r7, #12] + 800376a: 8d5b ldrh r3, [r3, #42] ; 0x2a + 800376c: b29b uxth r3, r3 + 800376e: 2bff cmp r3, #255 ; 0xff + 8003770: d90e bls.n 8003790 + { + hi2c->XferSize = MAX_NBYTE_SIZE; + 8003772: 68fb ldr r3, [r7, #12] + 8003774: 22ff movs r2, #255 ; 0xff + 8003776: 851a strh r2, [r3, #40] ; 0x28 + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, + 8003778: 68fb ldr r3, [r7, #12] + 800377a: 8d1b ldrh r3, [r3, #40] ; 0x28 + 800377c: b2da uxtb r2, r3 + 800377e: 8979 ldrh r1, [r7, #10] + 8003780: 2300 movs r3, #0 + 8003782: 9300 str r3, [sp, #0] + 8003784: f04f 7380 mov.w r3, #16777216 ; 0x1000000 + 8003788: 68f8 ldr r0, [r7, #12] + 800378a: f000 fdd1 bl 8004330 + 800378e: e00f b.n 80037b0 + I2C_NO_STARTSTOP); + } + else + { + hi2c->XferSize = hi2c->XferCount; + 8003790: 68fb ldr r3, [r7, #12] + 8003792: 8d5b ldrh r3, [r3, #42] ; 0x2a + 8003794: b29a uxth r2, r3 + 8003796: 68fb ldr r3, [r7, #12] + 8003798: 851a strh r2, [r3, #40] ; 0x28 + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, + 800379a: 68fb ldr r3, [r7, #12] + 800379c: 8d1b ldrh r3, [r3, #40] ; 0x28 + 800379e: b2da uxtb r2, r3 + 80037a0: 8979 ldrh r1, [r7, #10] + 80037a2: 2300 movs r3, #0 + 80037a4: 9300 str r3, [sp, #0] + 80037a6: f04f 7300 mov.w r3, #33554432 ; 0x2000000 + 80037aa: 68f8 ldr r0, [r7, #12] + 80037ac: f000 fdc0 bl 8004330 + while (hi2c->XferCount > 0U) + 80037b0: 68fb ldr r3, [r7, #12] + 80037b2: 8d5b ldrh r3, [r3, #42] ; 0x2a + 80037b4: b29b uxth r3, r3 + 80037b6: 2b00 cmp r3, #0 + 80037b8: d19e bne.n 80036f8 + } + } + + /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */ + /* Wait until STOPF flag is set */ + if (I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) + 80037ba: 697a ldr r2, [r7, #20] + 80037bc: 6a39 ldr r1, [r7, #32] + 80037be: 68f8 ldr r0, [r7, #12] + 80037c0: f000 fc98 bl 80040f4 + 80037c4: 4603 mov r3, r0 + 80037c6: 2b00 cmp r3, #0 + 80037c8: d001 beq.n 80037ce + { + return HAL_ERROR; + 80037ca: 2301 movs r3, #1 + 80037cc: e01a b.n 8003804 + } + + /* Clear STOP Flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF); + 80037ce: 68fb ldr r3, [r7, #12] + 80037d0: 681b ldr r3, [r3, #0] + 80037d2: 2220 movs r2, #32 + 80037d4: 61da str r2, [r3, #28] + + /* Clear Configuration Register 2 */ + I2C_RESET_CR2(hi2c); + 80037d6: 68fb ldr r3, [r7, #12] + 80037d8: 681b ldr r3, [r3, #0] + 80037da: 6859 ldr r1, [r3, #4] + 80037dc: 68fb ldr r3, [r7, #12] + 80037de: 681a ldr r2, [r3, #0] + 80037e0: 4b0b ldr r3, [pc, #44] ; (8003810 ) + 80037e2: 400b ands r3, r1 + 80037e4: 6053 str r3, [r2, #4] + + hi2c->State = HAL_I2C_STATE_READY; + 80037e6: 68fb ldr r3, [r7, #12] + 80037e8: 2220 movs r2, #32 + 80037ea: f883 2041 strb.w r2, [r3, #65] ; 0x41 + hi2c->Mode = HAL_I2C_MODE_NONE; + 80037ee: 68fb ldr r3, [r7, #12] + 80037f0: 2200 movs r2, #0 + 80037f2: f883 2042 strb.w r2, [r3, #66] ; 0x42 + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + 80037f6: 68fb ldr r3, [r7, #12] + 80037f8: 2200 movs r2, #0 + 80037fa: f883 2040 strb.w r2, [r3, #64] ; 0x40 + + return HAL_OK; + 80037fe: 2300 movs r3, #0 + 8003800: e000 b.n 8003804 + } + else + { + return HAL_BUSY; + 8003802: 2302 movs r3, #2 + } +} + 8003804: 4618 mov r0, r3 + 8003806: 3718 adds r7, #24 + 8003808: 46bd mov sp, r7 + 800380a: bd80 pop {r7, pc} + 800380c: 80002000 .word 0x80002000 + 8003810: fe00e800 .word 0xfe00e800 + +08003814 : + * @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) +{ + 8003814: b580 push {r7, lr} + 8003816: b088 sub sp, #32 + 8003818: af02 add r7, sp, #8 + 800381a: 60f8 str r0, [r7, #12] + 800381c: 607a str r2, [r7, #4] + 800381e: 461a mov r2, r3 + 8003820: 460b mov r3, r1 + 8003822: 817b strh r3, [r7, #10] + 8003824: 4613 mov r3, r2 + 8003826: 813b strh r3, [r7, #8] + uint32_t tickstart; + + if (hi2c->State == HAL_I2C_STATE_READY) + 8003828: 68fb ldr r3, [r7, #12] + 800382a: f893 3041 ldrb.w r3, [r3, #65] ; 0x41 + 800382e: b2db uxtb r3, r3 + 8003830: 2b20 cmp r3, #32 + 8003832: f040 80db bne.w 80039ec + { + /* Process Locked */ + __HAL_LOCK(hi2c); + 8003836: 68fb ldr r3, [r7, #12] + 8003838: f893 3040 ldrb.w r3, [r3, #64] ; 0x40 + 800383c: 2b01 cmp r3, #1 + 800383e: d101 bne.n 8003844 + 8003840: 2302 movs r3, #2 + 8003842: e0d4 b.n 80039ee + 8003844: 68fb ldr r3, [r7, #12] + 8003846: 2201 movs r2, #1 + 8003848: f883 2040 strb.w r2, [r3, #64] ; 0x40 + + /* Init tickstart for timeout management*/ + tickstart = HAL_GetTick(); + 800384c: f7fe fd0a bl 8002264 + 8003850: 6178 str r0, [r7, #20] + + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY, tickstart) != HAL_OK) + 8003852: 697b ldr r3, [r7, #20] + 8003854: 9300 str r3, [sp, #0] + 8003856: 2319 movs r3, #25 + 8003858: 2201 movs r2, #1 + 800385a: f44f 4100 mov.w r1, #32768 ; 0x8000 + 800385e: 68f8 ldr r0, [r7, #12] + 8003860: f000 fbc8 bl 8003ff4 + 8003864: 4603 mov r3, r0 + 8003866: 2b00 cmp r3, #0 + 8003868: d001 beq.n 800386e + { + return HAL_ERROR; + 800386a: 2301 movs r3, #1 + 800386c: e0bf b.n 80039ee + } + + hi2c->State = HAL_I2C_STATE_BUSY_RX; + 800386e: 68fb ldr r3, [r7, #12] + 8003870: 2222 movs r2, #34 ; 0x22 + 8003872: f883 2041 strb.w r2, [r3, #65] ; 0x41 + hi2c->Mode = HAL_I2C_MODE_MASTER; + 8003876: 68fb ldr r3, [r7, #12] + 8003878: 2210 movs r2, #16 + 800387a: f883 2042 strb.w r2, [r3, #66] ; 0x42 + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 800387e: 68fb ldr r3, [r7, #12] + 8003880: 2200 movs r2, #0 + 8003882: 645a str r2, [r3, #68] ; 0x44 + + /* Prepare transfer parameters */ + hi2c->pBuffPtr = pData; + 8003884: 68fb ldr r3, [r7, #12] + 8003886: 687a ldr r2, [r7, #4] + 8003888: 625a str r2, [r3, #36] ; 0x24 + hi2c->XferCount = Size; + 800388a: 68fb ldr r3, [r7, #12] + 800388c: 893a ldrh r2, [r7, #8] + 800388e: 855a strh r2, [r3, #42] ; 0x2a + hi2c->XferISR = NULL; + 8003890: 68fb ldr r3, [r7, #12] + 8003892: 2200 movs r2, #0 + 8003894: 635a str r2, [r3, #52] ; 0x34 + + /* Send Slave Address */ + /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */ + if (hi2c->XferCount > MAX_NBYTE_SIZE) + 8003896: 68fb ldr r3, [r7, #12] + 8003898: 8d5b ldrh r3, [r3, #42] ; 0x2a + 800389a: b29b uxth r3, r3 + 800389c: 2bff cmp r3, #255 ; 0xff + 800389e: d90e bls.n 80038be + { + hi2c->XferSize = MAX_NBYTE_SIZE; + 80038a0: 68fb ldr r3, [r7, #12] + 80038a2: 22ff movs r2, #255 ; 0xff + 80038a4: 851a strh r2, [r3, #40] ; 0x28 + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, + 80038a6: 68fb ldr r3, [r7, #12] + 80038a8: 8d1b ldrh r3, [r3, #40] ; 0x28 + 80038aa: b2da uxtb r2, r3 + 80038ac: 8979 ldrh r1, [r7, #10] + 80038ae: 4b52 ldr r3, [pc, #328] ; (80039f8 ) + 80038b0: 9300 str r3, [sp, #0] + 80038b2: f04f 7380 mov.w r3, #16777216 ; 0x1000000 + 80038b6: 68f8 ldr r0, [r7, #12] + 80038b8: f000 fd3a bl 8004330 + 80038bc: e06d b.n 800399a + I2C_GENERATE_START_READ); + } + else + { + hi2c->XferSize = hi2c->XferCount; + 80038be: 68fb ldr r3, [r7, #12] + 80038c0: 8d5b ldrh r3, [r3, #42] ; 0x2a + 80038c2: b29a uxth r2, r3 + 80038c4: 68fb ldr r3, [r7, #12] + 80038c6: 851a strh r2, [r3, #40] ; 0x28 + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, + 80038c8: 68fb ldr r3, [r7, #12] + 80038ca: 8d1b ldrh r3, [r3, #40] ; 0x28 + 80038cc: b2da uxtb r2, r3 + 80038ce: 8979 ldrh r1, [r7, #10] + 80038d0: 4b49 ldr r3, [pc, #292] ; (80039f8 ) + 80038d2: 9300 str r3, [sp, #0] + 80038d4: f04f 7300 mov.w r3, #33554432 ; 0x2000000 + 80038d8: 68f8 ldr r0, [r7, #12] + 80038da: f000 fd29 bl 8004330 + I2C_GENERATE_START_READ); + } + + while (hi2c->XferCount > 0U) + 80038de: e05c b.n 800399a + { + /* Wait until RXNE flag is set */ + if (I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) + 80038e0: 697a ldr r2, [r7, #20] + 80038e2: 6a39 ldr r1, [r7, #32] + 80038e4: 68f8 ldr r0, [r7, #12] + 80038e6: f000 fc41 bl 800416c + 80038ea: 4603 mov r3, r0 + 80038ec: 2b00 cmp r3, #0 + 80038ee: d001 beq.n 80038f4 + { + return HAL_ERROR; + 80038f0: 2301 movs r3, #1 + 80038f2: e07c b.n 80039ee + } + + /* Read data from RXDR */ + *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR; + 80038f4: 68fb ldr r3, [r7, #12] + 80038f6: 681b ldr r3, [r3, #0] + 80038f8: 6a5a ldr r2, [r3, #36] ; 0x24 + 80038fa: 68fb ldr r3, [r7, #12] + 80038fc: 6a5b ldr r3, [r3, #36] ; 0x24 + 80038fe: b2d2 uxtb r2, r2 + 8003900: 701a strb r2, [r3, #0] + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + 8003902: 68fb ldr r3, [r7, #12] + 8003904: 6a5b ldr r3, [r3, #36] ; 0x24 + 8003906: 1c5a adds r2, r3, #1 + 8003908: 68fb ldr r3, [r7, #12] + 800390a: 625a str r2, [r3, #36] ; 0x24 + + hi2c->XferSize--; + 800390c: 68fb ldr r3, [r7, #12] + 800390e: 8d1b ldrh r3, [r3, #40] ; 0x28 + 8003910: 3b01 subs r3, #1 + 8003912: b29a uxth r2, r3 + 8003914: 68fb ldr r3, [r7, #12] + 8003916: 851a strh r2, [r3, #40] ; 0x28 + hi2c->XferCount--; + 8003918: 68fb ldr r3, [r7, #12] + 800391a: 8d5b ldrh r3, [r3, #42] ; 0x2a + 800391c: b29b uxth r3, r3 + 800391e: 3b01 subs r3, #1 + 8003920: b29a uxth r2, r3 + 8003922: 68fb ldr r3, [r7, #12] + 8003924: 855a strh r2, [r3, #42] ; 0x2a + + if ((hi2c->XferCount != 0U) && (hi2c->XferSize == 0U)) + 8003926: 68fb ldr r3, [r7, #12] + 8003928: 8d5b ldrh r3, [r3, #42] ; 0x2a + 800392a: b29b uxth r3, r3 + 800392c: 2b00 cmp r3, #0 + 800392e: d034 beq.n 800399a + 8003930: 68fb ldr r3, [r7, #12] + 8003932: 8d1b ldrh r3, [r3, #40] ; 0x28 + 8003934: 2b00 cmp r3, #0 + 8003936: d130 bne.n 800399a + { + /* Wait until TCR flag is set */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, Timeout, tickstart) != HAL_OK) + 8003938: 697b ldr r3, [r7, #20] + 800393a: 9300 str r3, [sp, #0] + 800393c: 6a3b ldr r3, [r7, #32] + 800393e: 2200 movs r2, #0 + 8003940: 2180 movs r1, #128 ; 0x80 + 8003942: 68f8 ldr r0, [r7, #12] + 8003944: f000 fb56 bl 8003ff4 + 8003948: 4603 mov r3, r0 + 800394a: 2b00 cmp r3, #0 + 800394c: d001 beq.n 8003952 + { + return HAL_ERROR; + 800394e: 2301 movs r3, #1 + 8003950: e04d b.n 80039ee + } + + if (hi2c->XferCount > MAX_NBYTE_SIZE) + 8003952: 68fb ldr r3, [r7, #12] + 8003954: 8d5b ldrh r3, [r3, #42] ; 0x2a + 8003956: b29b uxth r3, r3 + 8003958: 2bff cmp r3, #255 ; 0xff + 800395a: d90e bls.n 800397a + { + hi2c->XferSize = MAX_NBYTE_SIZE; + 800395c: 68fb ldr r3, [r7, #12] + 800395e: 22ff movs r2, #255 ; 0xff + 8003960: 851a strh r2, [r3, #40] ; 0x28 + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, + 8003962: 68fb ldr r3, [r7, #12] + 8003964: 8d1b ldrh r3, [r3, #40] ; 0x28 + 8003966: b2da uxtb r2, r3 + 8003968: 8979 ldrh r1, [r7, #10] + 800396a: 2300 movs r3, #0 + 800396c: 9300 str r3, [sp, #0] + 800396e: f04f 7380 mov.w r3, #16777216 ; 0x1000000 + 8003972: 68f8 ldr r0, [r7, #12] + 8003974: f000 fcdc bl 8004330 + 8003978: e00f b.n 800399a + I2C_NO_STARTSTOP); + } + else + { + hi2c->XferSize = hi2c->XferCount; + 800397a: 68fb ldr r3, [r7, #12] + 800397c: 8d5b ldrh r3, [r3, #42] ; 0x2a + 800397e: b29a uxth r2, r3 + 8003980: 68fb ldr r3, [r7, #12] + 8003982: 851a strh r2, [r3, #40] ; 0x28 + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, + 8003984: 68fb ldr r3, [r7, #12] + 8003986: 8d1b ldrh r3, [r3, #40] ; 0x28 + 8003988: b2da uxtb r2, r3 + 800398a: 8979 ldrh r1, [r7, #10] + 800398c: 2300 movs r3, #0 + 800398e: 9300 str r3, [sp, #0] + 8003990: f04f 7300 mov.w r3, #33554432 ; 0x2000000 + 8003994: 68f8 ldr r0, [r7, #12] + 8003996: f000 fccb bl 8004330 + while (hi2c->XferCount > 0U) + 800399a: 68fb ldr r3, [r7, #12] + 800399c: 8d5b ldrh r3, [r3, #42] ; 0x2a + 800399e: b29b uxth r3, r3 + 80039a0: 2b00 cmp r3, #0 + 80039a2: d19d bne.n 80038e0 + } + } + + /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */ + /* Wait until STOPF flag is set */ + if (I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) + 80039a4: 697a ldr r2, [r7, #20] + 80039a6: 6a39 ldr r1, [r7, #32] + 80039a8: 68f8 ldr r0, [r7, #12] + 80039aa: f000 fba3 bl 80040f4 + 80039ae: 4603 mov r3, r0 + 80039b0: 2b00 cmp r3, #0 + 80039b2: d001 beq.n 80039b8 + { + return HAL_ERROR; + 80039b4: 2301 movs r3, #1 + 80039b6: e01a b.n 80039ee + } + + /* Clear STOP Flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF); + 80039b8: 68fb ldr r3, [r7, #12] + 80039ba: 681b ldr r3, [r3, #0] + 80039bc: 2220 movs r2, #32 + 80039be: 61da str r2, [r3, #28] + + /* Clear Configuration Register 2 */ + I2C_RESET_CR2(hi2c); + 80039c0: 68fb ldr r3, [r7, #12] + 80039c2: 681b ldr r3, [r3, #0] + 80039c4: 6859 ldr r1, [r3, #4] + 80039c6: 68fb ldr r3, [r7, #12] + 80039c8: 681a ldr r2, [r3, #0] + 80039ca: 4b0c ldr r3, [pc, #48] ; (80039fc ) + 80039cc: 400b ands r3, r1 + 80039ce: 6053 str r3, [r2, #4] + + hi2c->State = HAL_I2C_STATE_READY; + 80039d0: 68fb ldr r3, [r7, #12] + 80039d2: 2220 movs r2, #32 + 80039d4: f883 2041 strb.w r2, [r3, #65] ; 0x41 + hi2c->Mode = HAL_I2C_MODE_NONE; + 80039d8: 68fb ldr r3, [r7, #12] + 80039da: 2200 movs r2, #0 + 80039dc: f883 2042 strb.w r2, [r3, #66] ; 0x42 + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + 80039e0: 68fb ldr r3, [r7, #12] + 80039e2: 2200 movs r2, #0 + 80039e4: f883 2040 strb.w r2, [r3, #64] ; 0x40 + + return HAL_OK; + 80039e8: 2300 movs r3, #0 + 80039ea: e000 b.n 80039ee + } + else + { + return HAL_BUSY; + 80039ec: 2302 movs r3, #2 + } +} + 80039ee: 4618 mov r0, r3 + 80039f0: 3718 adds r7, #24 + 80039f2: 46bd mov sp, r7 + 80039f4: bd80 pop {r7, pc} + 80039f6: bf00 nop + 80039f8: 80002400 .word 0x80002400 + 80039fc: fe00e800 .word 0xfe00e800 + +08003a00 : + * @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) +{ + 8003a00: b580 push {r7, lr} + 8003a02: b088 sub sp, #32 + 8003a04: af02 add r7, sp, #8 + 8003a06: 60f8 str r0, [r7, #12] + 8003a08: 4608 mov r0, r1 + 8003a0a: 4611 mov r1, r2 + 8003a0c: 461a mov r2, r3 + 8003a0e: 4603 mov r3, r0 + 8003a10: 817b strh r3, [r7, #10] + 8003a12: 460b mov r3, r1 + 8003a14: 813b strh r3, [r7, #8] + 8003a16: 4613 mov r3, r2 + 8003a18: 80fb strh r3, [r7, #6] + uint32_t tickstart; + + /* Check the parameters */ + assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); + + if (hi2c->State == HAL_I2C_STATE_READY) + 8003a1a: 68fb ldr r3, [r7, #12] + 8003a1c: f893 3041 ldrb.w r3, [r3, #65] ; 0x41 + 8003a20: b2db uxtb r3, r3 + 8003a22: 2b20 cmp r3, #32 + 8003a24: f040 80f9 bne.w 8003c1a + { + if ((pData == NULL) || (Size == 0U)) + 8003a28: 6a3b ldr r3, [r7, #32] + 8003a2a: 2b00 cmp r3, #0 + 8003a2c: d002 beq.n 8003a34 + 8003a2e: 8cbb ldrh r3, [r7, #36] ; 0x24 + 8003a30: 2b00 cmp r3, #0 + 8003a32: d105 bne.n 8003a40 + { + hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM; + 8003a34: 68fb ldr r3, [r7, #12] + 8003a36: f44f 7200 mov.w r2, #512 ; 0x200 + 8003a3a: 645a str r2, [r3, #68] ; 0x44 + return HAL_ERROR; + 8003a3c: 2301 movs r3, #1 + 8003a3e: e0ed b.n 8003c1c + } + + /* Process Locked */ + __HAL_LOCK(hi2c); + 8003a40: 68fb ldr r3, [r7, #12] + 8003a42: f893 3040 ldrb.w r3, [r3, #64] ; 0x40 + 8003a46: 2b01 cmp r3, #1 + 8003a48: d101 bne.n 8003a4e + 8003a4a: 2302 movs r3, #2 + 8003a4c: e0e6 b.n 8003c1c + 8003a4e: 68fb ldr r3, [r7, #12] + 8003a50: 2201 movs r2, #1 + 8003a52: f883 2040 strb.w r2, [r3, #64] ; 0x40 + + /* Init tickstart for timeout management*/ + tickstart = HAL_GetTick(); + 8003a56: f7fe fc05 bl 8002264 + 8003a5a: 6178 str r0, [r7, #20] + + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY, tickstart) != HAL_OK) + 8003a5c: 697b ldr r3, [r7, #20] + 8003a5e: 9300 str r3, [sp, #0] + 8003a60: 2319 movs r3, #25 + 8003a62: 2201 movs r2, #1 + 8003a64: f44f 4100 mov.w r1, #32768 ; 0x8000 + 8003a68: 68f8 ldr r0, [r7, #12] + 8003a6a: f000 fac3 bl 8003ff4 + 8003a6e: 4603 mov r3, r0 + 8003a70: 2b00 cmp r3, #0 + 8003a72: d001 beq.n 8003a78 + { + return HAL_ERROR; + 8003a74: 2301 movs r3, #1 + 8003a76: e0d1 b.n 8003c1c + } + + hi2c->State = HAL_I2C_STATE_BUSY_TX; + 8003a78: 68fb ldr r3, [r7, #12] + 8003a7a: 2221 movs r2, #33 ; 0x21 + 8003a7c: f883 2041 strb.w r2, [r3, #65] ; 0x41 + hi2c->Mode = HAL_I2C_MODE_MEM; + 8003a80: 68fb ldr r3, [r7, #12] + 8003a82: 2240 movs r2, #64 ; 0x40 + 8003a84: f883 2042 strb.w r2, [r3, #66] ; 0x42 + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 8003a88: 68fb ldr r3, [r7, #12] + 8003a8a: 2200 movs r2, #0 + 8003a8c: 645a str r2, [r3, #68] ; 0x44 + + /* Prepare transfer parameters */ + hi2c->pBuffPtr = pData; + 8003a8e: 68fb ldr r3, [r7, #12] + 8003a90: 6a3a ldr r2, [r7, #32] + 8003a92: 625a str r2, [r3, #36] ; 0x24 + hi2c->XferCount = Size; + 8003a94: 68fb ldr r3, [r7, #12] + 8003a96: 8cba ldrh r2, [r7, #36] ; 0x24 + 8003a98: 855a strh r2, [r3, #42] ; 0x2a + hi2c->XferISR = NULL; + 8003a9a: 68fb ldr r3, [r7, #12] + 8003a9c: 2200 movs r2, #0 + 8003a9e: 635a str r2, [r3, #52] ; 0x34 + + /* Send Slave Address and Memory Address */ + if (I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, Timeout, tickstart) != HAL_OK) + 8003aa0: 88f8 ldrh r0, [r7, #6] + 8003aa2: 893a ldrh r2, [r7, #8] + 8003aa4: 8979 ldrh r1, [r7, #10] + 8003aa6: 697b ldr r3, [r7, #20] + 8003aa8: 9301 str r3, [sp, #4] + 8003aaa: 6abb ldr r3, [r7, #40] ; 0x28 + 8003aac: 9300 str r3, [sp, #0] + 8003aae: 4603 mov r3, r0 + 8003ab0: 68f8 ldr r0, [r7, #12] + 8003ab2: f000 f9d3 bl 8003e5c + 8003ab6: 4603 mov r3, r0 + 8003ab8: 2b00 cmp r3, #0 + 8003aba: d005 beq.n 8003ac8 + { + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + 8003abc: 68fb ldr r3, [r7, #12] + 8003abe: 2200 movs r2, #0 + 8003ac0: f883 2040 strb.w r2, [r3, #64] ; 0x40 + return HAL_ERROR; + 8003ac4: 2301 movs r3, #1 + 8003ac6: e0a9 b.n 8003c1c + } + + /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE */ + if (hi2c->XferCount > MAX_NBYTE_SIZE) + 8003ac8: 68fb ldr r3, [r7, #12] + 8003aca: 8d5b ldrh r3, [r3, #42] ; 0x2a + 8003acc: b29b uxth r3, r3 + 8003ace: 2bff cmp r3, #255 ; 0xff + 8003ad0: d90e bls.n 8003af0 + { + hi2c->XferSize = MAX_NBYTE_SIZE; + 8003ad2: 68fb ldr r3, [r7, #12] + 8003ad4: 22ff movs r2, #255 ; 0xff + 8003ad6: 851a strh r2, [r3, #40] ; 0x28 + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, I2C_NO_STARTSTOP); + 8003ad8: 68fb ldr r3, [r7, #12] + 8003ada: 8d1b ldrh r3, [r3, #40] ; 0x28 + 8003adc: b2da uxtb r2, r3 + 8003ade: 8979 ldrh r1, [r7, #10] + 8003ae0: 2300 movs r3, #0 + 8003ae2: 9300 str r3, [sp, #0] + 8003ae4: f04f 7380 mov.w r3, #16777216 ; 0x1000000 + 8003ae8: 68f8 ldr r0, [r7, #12] + 8003aea: f000 fc21 bl 8004330 + 8003aee: e00f b.n 8003b10 + } + else + { + hi2c->XferSize = hi2c->XferCount; + 8003af0: 68fb ldr r3, [r7, #12] + 8003af2: 8d5b ldrh r3, [r3, #42] ; 0x2a + 8003af4: b29a uxth r2, r3 + 8003af6: 68fb ldr r3, [r7, #12] + 8003af8: 851a strh r2, [r3, #40] ; 0x28 + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, I2C_NO_STARTSTOP); + 8003afa: 68fb ldr r3, [r7, #12] + 8003afc: 8d1b ldrh r3, [r3, #40] ; 0x28 + 8003afe: b2da uxtb r2, r3 + 8003b00: 8979 ldrh r1, [r7, #10] + 8003b02: 2300 movs r3, #0 + 8003b04: 9300 str r3, [sp, #0] + 8003b06: f04f 7300 mov.w r3, #33554432 ; 0x2000000 + 8003b0a: 68f8 ldr r0, [r7, #12] + 8003b0c: f000 fc10 bl 8004330 + } + + do + { + /* Wait until TXIS flag is set */ + if (I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) + 8003b10: 697a ldr r2, [r7, #20] + 8003b12: 6ab9 ldr r1, [r7, #40] ; 0x28 + 8003b14: 68f8 ldr r0, [r7, #12] + 8003b16: f000 faad bl 8004074 + 8003b1a: 4603 mov r3, r0 + 8003b1c: 2b00 cmp r3, #0 + 8003b1e: d001 beq.n 8003b24 + { + return HAL_ERROR; + 8003b20: 2301 movs r3, #1 + 8003b22: e07b b.n 8003c1c + } + + /* Write data to TXDR */ + hi2c->Instance->TXDR = *hi2c->pBuffPtr; + 8003b24: 68fb ldr r3, [r7, #12] + 8003b26: 6a5b ldr r3, [r3, #36] ; 0x24 + 8003b28: 781a ldrb r2, [r3, #0] + 8003b2a: 68fb ldr r3, [r7, #12] + 8003b2c: 681b ldr r3, [r3, #0] + 8003b2e: 629a str r2, [r3, #40] ; 0x28 + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + 8003b30: 68fb ldr r3, [r7, #12] + 8003b32: 6a5b ldr r3, [r3, #36] ; 0x24 + 8003b34: 1c5a adds r2, r3, #1 + 8003b36: 68fb ldr r3, [r7, #12] + 8003b38: 625a str r2, [r3, #36] ; 0x24 + + hi2c->XferCount--; + 8003b3a: 68fb ldr r3, [r7, #12] + 8003b3c: 8d5b ldrh r3, [r3, #42] ; 0x2a + 8003b3e: b29b uxth r3, r3 + 8003b40: 3b01 subs r3, #1 + 8003b42: b29a uxth r2, r3 + 8003b44: 68fb ldr r3, [r7, #12] + 8003b46: 855a strh r2, [r3, #42] ; 0x2a + hi2c->XferSize--; + 8003b48: 68fb ldr r3, [r7, #12] + 8003b4a: 8d1b ldrh r3, [r3, #40] ; 0x28 + 8003b4c: 3b01 subs r3, #1 + 8003b4e: b29a uxth r2, r3 + 8003b50: 68fb ldr r3, [r7, #12] + 8003b52: 851a strh r2, [r3, #40] ; 0x28 + + if ((hi2c->XferCount != 0U) && (hi2c->XferSize == 0U)) + 8003b54: 68fb ldr r3, [r7, #12] + 8003b56: 8d5b ldrh r3, [r3, #42] ; 0x2a + 8003b58: b29b uxth r3, r3 + 8003b5a: 2b00 cmp r3, #0 + 8003b5c: d034 beq.n 8003bc8 + 8003b5e: 68fb ldr r3, [r7, #12] + 8003b60: 8d1b ldrh r3, [r3, #40] ; 0x28 + 8003b62: 2b00 cmp r3, #0 + 8003b64: d130 bne.n 8003bc8 + { + /* Wait until TCR flag is set */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, Timeout, tickstart) != HAL_OK) + 8003b66: 697b ldr r3, [r7, #20] + 8003b68: 9300 str r3, [sp, #0] + 8003b6a: 6abb ldr r3, [r7, #40] ; 0x28 + 8003b6c: 2200 movs r2, #0 + 8003b6e: 2180 movs r1, #128 ; 0x80 + 8003b70: 68f8 ldr r0, [r7, #12] + 8003b72: f000 fa3f bl 8003ff4 + 8003b76: 4603 mov r3, r0 + 8003b78: 2b00 cmp r3, #0 + 8003b7a: d001 beq.n 8003b80 + { + return HAL_ERROR; + 8003b7c: 2301 movs r3, #1 + 8003b7e: e04d b.n 8003c1c + } + + if (hi2c->XferCount > MAX_NBYTE_SIZE) + 8003b80: 68fb ldr r3, [r7, #12] + 8003b82: 8d5b ldrh r3, [r3, #42] ; 0x2a + 8003b84: b29b uxth r3, r3 + 8003b86: 2bff cmp r3, #255 ; 0xff + 8003b88: d90e bls.n 8003ba8 + { + hi2c->XferSize = MAX_NBYTE_SIZE; + 8003b8a: 68fb ldr r3, [r7, #12] + 8003b8c: 22ff movs r2, #255 ; 0xff + 8003b8e: 851a strh r2, [r3, #40] ; 0x28 + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, + 8003b90: 68fb ldr r3, [r7, #12] + 8003b92: 8d1b ldrh r3, [r3, #40] ; 0x28 + 8003b94: b2da uxtb r2, r3 + 8003b96: 8979 ldrh r1, [r7, #10] + 8003b98: 2300 movs r3, #0 + 8003b9a: 9300 str r3, [sp, #0] + 8003b9c: f04f 7380 mov.w r3, #16777216 ; 0x1000000 + 8003ba0: 68f8 ldr r0, [r7, #12] + 8003ba2: f000 fbc5 bl 8004330 + 8003ba6: e00f b.n 8003bc8 + I2C_NO_STARTSTOP); + } + else + { + hi2c->XferSize = hi2c->XferCount; + 8003ba8: 68fb ldr r3, [r7, #12] + 8003baa: 8d5b ldrh r3, [r3, #42] ; 0x2a + 8003bac: b29a uxth r2, r3 + 8003bae: 68fb ldr r3, [r7, #12] + 8003bb0: 851a strh r2, [r3, #40] ; 0x28 + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, + 8003bb2: 68fb ldr r3, [r7, #12] + 8003bb4: 8d1b ldrh r3, [r3, #40] ; 0x28 + 8003bb6: b2da uxtb r2, r3 + 8003bb8: 8979 ldrh r1, [r7, #10] + 8003bba: 2300 movs r3, #0 + 8003bbc: 9300 str r3, [sp, #0] + 8003bbe: f04f 7300 mov.w r3, #33554432 ; 0x2000000 + 8003bc2: 68f8 ldr r0, [r7, #12] + 8003bc4: f000 fbb4 bl 8004330 + I2C_NO_STARTSTOP); + } + } + + } while (hi2c->XferCount > 0U); + 8003bc8: 68fb ldr r3, [r7, #12] + 8003bca: 8d5b ldrh r3, [r3, #42] ; 0x2a + 8003bcc: b29b uxth r3, r3 + 8003bce: 2b00 cmp r3, #0 + 8003bd0: d19e bne.n 8003b10 + + /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */ + /* Wait until STOPF flag is reset */ + if (I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) + 8003bd2: 697a ldr r2, [r7, #20] + 8003bd4: 6ab9 ldr r1, [r7, #40] ; 0x28 + 8003bd6: 68f8 ldr r0, [r7, #12] + 8003bd8: f000 fa8c bl 80040f4 + 8003bdc: 4603 mov r3, r0 + 8003bde: 2b00 cmp r3, #0 + 8003be0: d001 beq.n 8003be6 + { + return HAL_ERROR; + 8003be2: 2301 movs r3, #1 + 8003be4: e01a b.n 8003c1c + } + + /* Clear STOP Flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF); + 8003be6: 68fb ldr r3, [r7, #12] + 8003be8: 681b ldr r3, [r3, #0] + 8003bea: 2220 movs r2, #32 + 8003bec: 61da str r2, [r3, #28] + + /* Clear Configuration Register 2 */ + I2C_RESET_CR2(hi2c); + 8003bee: 68fb ldr r3, [r7, #12] + 8003bf0: 681b ldr r3, [r3, #0] + 8003bf2: 6859 ldr r1, [r3, #4] + 8003bf4: 68fb ldr r3, [r7, #12] + 8003bf6: 681a ldr r2, [r3, #0] + 8003bf8: 4b0a ldr r3, [pc, #40] ; (8003c24 ) + 8003bfa: 400b ands r3, r1 + 8003bfc: 6053 str r3, [r2, #4] + + hi2c->State = HAL_I2C_STATE_READY; + 8003bfe: 68fb ldr r3, [r7, #12] + 8003c00: 2220 movs r2, #32 + 8003c02: f883 2041 strb.w r2, [r3, #65] ; 0x41 + hi2c->Mode = HAL_I2C_MODE_NONE; + 8003c06: 68fb ldr r3, [r7, #12] + 8003c08: 2200 movs r2, #0 + 8003c0a: f883 2042 strb.w r2, [r3, #66] ; 0x42 + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + 8003c0e: 68fb ldr r3, [r7, #12] + 8003c10: 2200 movs r2, #0 + 8003c12: f883 2040 strb.w r2, [r3, #64] ; 0x40 + + return HAL_OK; + 8003c16: 2300 movs r3, #0 + 8003c18: e000 b.n 8003c1c + } + else + { + return HAL_BUSY; + 8003c1a: 2302 movs r3, #2 + } +} + 8003c1c: 4618 mov r0, r3 + 8003c1e: 3718 adds r7, #24 + 8003c20: 46bd mov sp, r7 + 8003c22: bd80 pop {r7, pc} + 8003c24: fe00e800 .word 0xfe00e800 + +08003c28 : + * @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) +{ + 8003c28: b580 push {r7, lr} + 8003c2a: b088 sub sp, #32 + 8003c2c: af02 add r7, sp, #8 + 8003c2e: 60f8 str r0, [r7, #12] + 8003c30: 4608 mov r0, r1 + 8003c32: 4611 mov r1, r2 + 8003c34: 461a mov r2, r3 + 8003c36: 4603 mov r3, r0 + 8003c38: 817b strh r3, [r7, #10] + 8003c3a: 460b mov r3, r1 + 8003c3c: 813b strh r3, [r7, #8] + 8003c3e: 4613 mov r3, r2 + 8003c40: 80fb strh r3, [r7, #6] + uint32_t tickstart; + + /* Check the parameters */ + assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); + + if (hi2c->State == HAL_I2C_STATE_READY) + 8003c42: 68fb ldr r3, [r7, #12] + 8003c44: f893 3041 ldrb.w r3, [r3, #65] ; 0x41 + 8003c48: b2db uxtb r3, r3 + 8003c4a: 2b20 cmp r3, #32 + 8003c4c: f040 80fd bne.w 8003e4a + { + if ((pData == NULL) || (Size == 0U)) + 8003c50: 6a3b ldr r3, [r7, #32] + 8003c52: 2b00 cmp r3, #0 + 8003c54: d002 beq.n 8003c5c + 8003c56: 8cbb ldrh r3, [r7, #36] ; 0x24 + 8003c58: 2b00 cmp r3, #0 + 8003c5a: d105 bne.n 8003c68 + { + hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM; + 8003c5c: 68fb ldr r3, [r7, #12] + 8003c5e: f44f 7200 mov.w r2, #512 ; 0x200 + 8003c62: 645a str r2, [r3, #68] ; 0x44 + return HAL_ERROR; + 8003c64: 2301 movs r3, #1 + 8003c66: e0f1 b.n 8003e4c + } + + /* Process Locked */ + __HAL_LOCK(hi2c); + 8003c68: 68fb ldr r3, [r7, #12] + 8003c6a: f893 3040 ldrb.w r3, [r3, #64] ; 0x40 + 8003c6e: 2b01 cmp r3, #1 + 8003c70: d101 bne.n 8003c76 + 8003c72: 2302 movs r3, #2 + 8003c74: e0ea b.n 8003e4c + 8003c76: 68fb ldr r3, [r7, #12] + 8003c78: 2201 movs r2, #1 + 8003c7a: f883 2040 strb.w r2, [r3, #64] ; 0x40 + + /* Init tickstart for timeout management*/ + tickstart = HAL_GetTick(); + 8003c7e: f7fe faf1 bl 8002264 + 8003c82: 6178 str r0, [r7, #20] + + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY, tickstart) != HAL_OK) + 8003c84: 697b ldr r3, [r7, #20] + 8003c86: 9300 str r3, [sp, #0] + 8003c88: 2319 movs r3, #25 + 8003c8a: 2201 movs r2, #1 + 8003c8c: f44f 4100 mov.w r1, #32768 ; 0x8000 + 8003c90: 68f8 ldr r0, [r7, #12] + 8003c92: f000 f9af bl 8003ff4 + 8003c96: 4603 mov r3, r0 + 8003c98: 2b00 cmp r3, #0 + 8003c9a: d001 beq.n 8003ca0 + { + return HAL_ERROR; + 8003c9c: 2301 movs r3, #1 + 8003c9e: e0d5 b.n 8003e4c + } + + hi2c->State = HAL_I2C_STATE_BUSY_RX; + 8003ca0: 68fb ldr r3, [r7, #12] + 8003ca2: 2222 movs r2, #34 ; 0x22 + 8003ca4: f883 2041 strb.w r2, [r3, #65] ; 0x41 + hi2c->Mode = HAL_I2C_MODE_MEM; + 8003ca8: 68fb ldr r3, [r7, #12] + 8003caa: 2240 movs r2, #64 ; 0x40 + 8003cac: f883 2042 strb.w r2, [r3, #66] ; 0x42 + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 8003cb0: 68fb ldr r3, [r7, #12] + 8003cb2: 2200 movs r2, #0 + 8003cb4: 645a str r2, [r3, #68] ; 0x44 + + /* Prepare transfer parameters */ + hi2c->pBuffPtr = pData; + 8003cb6: 68fb ldr r3, [r7, #12] + 8003cb8: 6a3a ldr r2, [r7, #32] + 8003cba: 625a str r2, [r3, #36] ; 0x24 + hi2c->XferCount = Size; + 8003cbc: 68fb ldr r3, [r7, #12] + 8003cbe: 8cba ldrh r2, [r7, #36] ; 0x24 + 8003cc0: 855a strh r2, [r3, #42] ; 0x2a + hi2c->XferISR = NULL; + 8003cc2: 68fb ldr r3, [r7, #12] + 8003cc4: 2200 movs r2, #0 + 8003cc6: 635a str r2, [r3, #52] ; 0x34 + + /* Send Slave Address and Memory Address */ + if (I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, Timeout, tickstart) != HAL_OK) + 8003cc8: 88f8 ldrh r0, [r7, #6] + 8003cca: 893a ldrh r2, [r7, #8] + 8003ccc: 8979 ldrh r1, [r7, #10] + 8003cce: 697b ldr r3, [r7, #20] + 8003cd0: 9301 str r3, [sp, #4] + 8003cd2: 6abb ldr r3, [r7, #40] ; 0x28 + 8003cd4: 9300 str r3, [sp, #0] + 8003cd6: 4603 mov r3, r0 + 8003cd8: 68f8 ldr r0, [r7, #12] + 8003cda: f000 f913 bl 8003f04 + 8003cde: 4603 mov r3, r0 + 8003ce0: 2b00 cmp r3, #0 + 8003ce2: d005 beq.n 8003cf0 + { + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + 8003ce4: 68fb ldr r3, [r7, #12] + 8003ce6: 2200 movs r2, #0 + 8003ce8: f883 2040 strb.w r2, [r3, #64] ; 0x40 + return HAL_ERROR; + 8003cec: 2301 movs r3, #1 + 8003cee: e0ad b.n 8003e4c + } + + /* Send Slave Address */ + /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */ + if (hi2c->XferCount > MAX_NBYTE_SIZE) + 8003cf0: 68fb ldr r3, [r7, #12] + 8003cf2: 8d5b ldrh r3, [r3, #42] ; 0x2a + 8003cf4: b29b uxth r3, r3 + 8003cf6: 2bff cmp r3, #255 ; 0xff + 8003cf8: d90e bls.n 8003d18 + { + hi2c->XferSize = MAX_NBYTE_SIZE; + 8003cfa: 68fb ldr r3, [r7, #12] + 8003cfc: 22ff movs r2, #255 ; 0xff + 8003cfe: 851a strh r2, [r3, #40] ; 0x28 + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, + 8003d00: 68fb ldr r3, [r7, #12] + 8003d02: 8d1b ldrh r3, [r3, #40] ; 0x28 + 8003d04: b2da uxtb r2, r3 + 8003d06: 8979 ldrh r1, [r7, #10] + 8003d08: 4b52 ldr r3, [pc, #328] ; (8003e54 ) + 8003d0a: 9300 str r3, [sp, #0] + 8003d0c: f04f 7380 mov.w r3, #16777216 ; 0x1000000 + 8003d10: 68f8 ldr r0, [r7, #12] + 8003d12: f000 fb0d bl 8004330 + 8003d16: e00f b.n 8003d38 + I2C_GENERATE_START_READ); + } + else + { + hi2c->XferSize = hi2c->XferCount; + 8003d18: 68fb ldr r3, [r7, #12] + 8003d1a: 8d5b ldrh r3, [r3, #42] ; 0x2a + 8003d1c: b29a uxth r2, r3 + 8003d1e: 68fb ldr r3, [r7, #12] + 8003d20: 851a strh r2, [r3, #40] ; 0x28 + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, + 8003d22: 68fb ldr r3, [r7, #12] + 8003d24: 8d1b ldrh r3, [r3, #40] ; 0x28 + 8003d26: b2da uxtb r2, r3 + 8003d28: 8979 ldrh r1, [r7, #10] + 8003d2a: 4b4a ldr r3, [pc, #296] ; (8003e54 ) + 8003d2c: 9300 str r3, [sp, #0] + 8003d2e: f04f 7300 mov.w r3, #33554432 ; 0x2000000 + 8003d32: 68f8 ldr r0, [r7, #12] + 8003d34: f000 fafc bl 8004330 + } + + do + { + /* Wait until RXNE flag is set */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_RXNE, RESET, Timeout, tickstart) != HAL_OK) + 8003d38: 697b ldr r3, [r7, #20] + 8003d3a: 9300 str r3, [sp, #0] + 8003d3c: 6abb ldr r3, [r7, #40] ; 0x28 + 8003d3e: 2200 movs r2, #0 + 8003d40: 2104 movs r1, #4 + 8003d42: 68f8 ldr r0, [r7, #12] + 8003d44: f000 f956 bl 8003ff4 + 8003d48: 4603 mov r3, r0 + 8003d4a: 2b00 cmp r3, #0 + 8003d4c: d001 beq.n 8003d52 + { + return HAL_ERROR; + 8003d4e: 2301 movs r3, #1 + 8003d50: e07c b.n 8003e4c + } + + /* Read data from RXDR */ + *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR; + 8003d52: 68fb ldr r3, [r7, #12] + 8003d54: 681b ldr r3, [r3, #0] + 8003d56: 6a5a ldr r2, [r3, #36] ; 0x24 + 8003d58: 68fb ldr r3, [r7, #12] + 8003d5a: 6a5b ldr r3, [r3, #36] ; 0x24 + 8003d5c: b2d2 uxtb r2, r2 + 8003d5e: 701a strb r2, [r3, #0] + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + 8003d60: 68fb ldr r3, [r7, #12] + 8003d62: 6a5b ldr r3, [r3, #36] ; 0x24 + 8003d64: 1c5a adds r2, r3, #1 + 8003d66: 68fb ldr r3, [r7, #12] + 8003d68: 625a str r2, [r3, #36] ; 0x24 + + hi2c->XferSize--; + 8003d6a: 68fb ldr r3, [r7, #12] + 8003d6c: 8d1b ldrh r3, [r3, #40] ; 0x28 + 8003d6e: 3b01 subs r3, #1 + 8003d70: b29a uxth r2, r3 + 8003d72: 68fb ldr r3, [r7, #12] + 8003d74: 851a strh r2, [r3, #40] ; 0x28 + hi2c->XferCount--; + 8003d76: 68fb ldr r3, [r7, #12] + 8003d78: 8d5b ldrh r3, [r3, #42] ; 0x2a + 8003d7a: b29b uxth r3, r3 + 8003d7c: 3b01 subs r3, #1 + 8003d7e: b29a uxth r2, r3 + 8003d80: 68fb ldr r3, [r7, #12] + 8003d82: 855a strh r2, [r3, #42] ; 0x2a + + if ((hi2c->XferCount != 0U) && (hi2c->XferSize == 0U)) + 8003d84: 68fb ldr r3, [r7, #12] + 8003d86: 8d5b ldrh r3, [r3, #42] ; 0x2a + 8003d88: b29b uxth r3, r3 + 8003d8a: 2b00 cmp r3, #0 + 8003d8c: d034 beq.n 8003df8 + 8003d8e: 68fb ldr r3, [r7, #12] + 8003d90: 8d1b ldrh r3, [r3, #40] ; 0x28 + 8003d92: 2b00 cmp r3, #0 + 8003d94: d130 bne.n 8003df8 + { + /* Wait until TCR flag is set */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, Timeout, tickstart) != HAL_OK) + 8003d96: 697b ldr r3, [r7, #20] + 8003d98: 9300 str r3, [sp, #0] + 8003d9a: 6abb ldr r3, [r7, #40] ; 0x28 + 8003d9c: 2200 movs r2, #0 + 8003d9e: 2180 movs r1, #128 ; 0x80 + 8003da0: 68f8 ldr r0, [r7, #12] + 8003da2: f000 f927 bl 8003ff4 + 8003da6: 4603 mov r3, r0 + 8003da8: 2b00 cmp r3, #0 + 8003daa: d001 beq.n 8003db0 + { + return HAL_ERROR; + 8003dac: 2301 movs r3, #1 + 8003dae: e04d b.n 8003e4c + } + + if (hi2c->XferCount > MAX_NBYTE_SIZE) + 8003db0: 68fb ldr r3, [r7, #12] + 8003db2: 8d5b ldrh r3, [r3, #42] ; 0x2a + 8003db4: b29b uxth r3, r3 + 8003db6: 2bff cmp r3, #255 ; 0xff + 8003db8: d90e bls.n 8003dd8 + { + hi2c->XferSize = MAX_NBYTE_SIZE; + 8003dba: 68fb ldr r3, [r7, #12] + 8003dbc: 22ff movs r2, #255 ; 0xff + 8003dbe: 851a strh r2, [r3, #40] ; 0x28 + I2C_TransferConfig(hi2c, DevAddress, (uint8_t) hi2c->XferSize, I2C_RELOAD_MODE, + 8003dc0: 68fb ldr r3, [r7, #12] + 8003dc2: 8d1b ldrh r3, [r3, #40] ; 0x28 + 8003dc4: b2da uxtb r2, r3 + 8003dc6: 8979 ldrh r1, [r7, #10] + 8003dc8: 2300 movs r3, #0 + 8003dca: 9300 str r3, [sp, #0] + 8003dcc: f04f 7380 mov.w r3, #16777216 ; 0x1000000 + 8003dd0: 68f8 ldr r0, [r7, #12] + 8003dd2: f000 faad bl 8004330 + 8003dd6: e00f b.n 8003df8 + I2C_NO_STARTSTOP); + } + else + { + hi2c->XferSize = hi2c->XferCount; + 8003dd8: 68fb ldr r3, [r7, #12] + 8003dda: 8d5b ldrh r3, [r3, #42] ; 0x2a + 8003ddc: b29a uxth r2, r3 + 8003dde: 68fb ldr r3, [r7, #12] + 8003de0: 851a strh r2, [r3, #40] ; 0x28 + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, + 8003de2: 68fb ldr r3, [r7, #12] + 8003de4: 8d1b ldrh r3, [r3, #40] ; 0x28 + 8003de6: b2da uxtb r2, r3 + 8003de8: 8979 ldrh r1, [r7, #10] + 8003dea: 2300 movs r3, #0 + 8003dec: 9300 str r3, [sp, #0] + 8003dee: f04f 7300 mov.w r3, #33554432 ; 0x2000000 + 8003df2: 68f8 ldr r0, [r7, #12] + 8003df4: f000 fa9c bl 8004330 + I2C_NO_STARTSTOP); + } + } + } while (hi2c->XferCount > 0U); + 8003df8: 68fb ldr r3, [r7, #12] + 8003dfa: 8d5b ldrh r3, [r3, #42] ; 0x2a + 8003dfc: b29b uxth r3, r3 + 8003dfe: 2b00 cmp r3, #0 + 8003e00: d19a bne.n 8003d38 + + /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */ + /* Wait until STOPF flag is reset */ + if (I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) + 8003e02: 697a ldr r2, [r7, #20] + 8003e04: 6ab9 ldr r1, [r7, #40] ; 0x28 + 8003e06: 68f8 ldr r0, [r7, #12] + 8003e08: f000 f974 bl 80040f4 + 8003e0c: 4603 mov r3, r0 + 8003e0e: 2b00 cmp r3, #0 + 8003e10: d001 beq.n 8003e16 + { + return HAL_ERROR; + 8003e12: 2301 movs r3, #1 + 8003e14: e01a b.n 8003e4c + } + + /* Clear STOP Flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF); + 8003e16: 68fb ldr r3, [r7, #12] + 8003e18: 681b ldr r3, [r3, #0] + 8003e1a: 2220 movs r2, #32 + 8003e1c: 61da str r2, [r3, #28] + + /* Clear Configuration Register 2 */ + I2C_RESET_CR2(hi2c); + 8003e1e: 68fb ldr r3, [r7, #12] + 8003e20: 681b ldr r3, [r3, #0] + 8003e22: 6859 ldr r1, [r3, #4] + 8003e24: 68fb ldr r3, [r7, #12] + 8003e26: 681a ldr r2, [r3, #0] + 8003e28: 4b0b ldr r3, [pc, #44] ; (8003e58 ) + 8003e2a: 400b ands r3, r1 + 8003e2c: 6053 str r3, [r2, #4] + + hi2c->State = HAL_I2C_STATE_READY; + 8003e2e: 68fb ldr r3, [r7, #12] + 8003e30: 2220 movs r2, #32 + 8003e32: f883 2041 strb.w r2, [r3, #65] ; 0x41 + hi2c->Mode = HAL_I2C_MODE_NONE; + 8003e36: 68fb ldr r3, [r7, #12] + 8003e38: 2200 movs r2, #0 + 8003e3a: f883 2042 strb.w r2, [r3, #66] ; 0x42 + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + 8003e3e: 68fb ldr r3, [r7, #12] + 8003e40: 2200 movs r2, #0 + 8003e42: f883 2040 strb.w r2, [r3, #64] ; 0x40 + + return HAL_OK; + 8003e46: 2300 movs r3, #0 + 8003e48: e000 b.n 8003e4c + } + else + { + return HAL_BUSY; + 8003e4a: 2302 movs r3, #2 + } +} + 8003e4c: 4618 mov r0, r3 + 8003e4e: 3718 adds r7, #24 + 8003e50: 46bd mov sp, r7 + 8003e52: bd80 pop {r7, pc} + 8003e54: 80002400 .word 0x80002400 + 8003e58: fe00e800 .word 0xfe00e800 + +08003e5c : + * @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) +{ + 8003e5c: b580 push {r7, lr} + 8003e5e: b086 sub sp, #24 + 8003e60: af02 add r7, sp, #8 + 8003e62: 60f8 str r0, [r7, #12] + 8003e64: 4608 mov r0, r1 + 8003e66: 4611 mov r1, r2 + 8003e68: 461a mov r2, r3 + 8003e6a: 4603 mov r3, r0 + 8003e6c: 817b strh r3, [r7, #10] + 8003e6e: 460b mov r3, r1 + 8003e70: 813b strh r3, [r7, #8] + 8003e72: 4613 mov r3, r2 + 8003e74: 80fb strh r3, [r7, #6] + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)MemAddSize, I2C_RELOAD_MODE, I2C_GENERATE_START_WRITE); + 8003e76: 88fb ldrh r3, [r7, #6] + 8003e78: b2da uxtb r2, r3 + 8003e7a: 8979 ldrh r1, [r7, #10] + 8003e7c: 4b20 ldr r3, [pc, #128] ; (8003f00 ) + 8003e7e: 9300 str r3, [sp, #0] + 8003e80: f04f 7380 mov.w r3, #16777216 ; 0x1000000 + 8003e84: 68f8 ldr r0, [r7, #12] + 8003e86: f000 fa53 bl 8004330 + + /* Wait until TXIS flag is set */ + if (I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK) + 8003e8a: 69fa ldr r2, [r7, #28] + 8003e8c: 69b9 ldr r1, [r7, #24] + 8003e8e: 68f8 ldr r0, [r7, #12] + 8003e90: f000 f8f0 bl 8004074 + 8003e94: 4603 mov r3, r0 + 8003e96: 2b00 cmp r3, #0 + 8003e98: d001 beq.n 8003e9e + { + return HAL_ERROR; + 8003e9a: 2301 movs r3, #1 + 8003e9c: e02c b.n 8003ef8 + } + + /* If Memory address size is 8Bit */ + if (MemAddSize == I2C_MEMADD_SIZE_8BIT) + 8003e9e: 88fb ldrh r3, [r7, #6] + 8003ea0: 2b01 cmp r3, #1 + 8003ea2: d105 bne.n 8003eb0 + { + /* Send Memory Address */ + hi2c->Instance->TXDR = I2C_MEM_ADD_LSB(MemAddress); + 8003ea4: 893b ldrh r3, [r7, #8] + 8003ea6: b2da uxtb r2, r3 + 8003ea8: 68fb ldr r3, [r7, #12] + 8003eaa: 681b ldr r3, [r3, #0] + 8003eac: 629a str r2, [r3, #40] ; 0x28 + 8003eae: e015 b.n 8003edc + } + /* If Memory address size is 16Bit */ + else + { + /* Send MSB of Memory Address */ + hi2c->Instance->TXDR = I2C_MEM_ADD_MSB(MemAddress); + 8003eb0: 893b ldrh r3, [r7, #8] + 8003eb2: 0a1b lsrs r3, r3, #8 + 8003eb4: b29b uxth r3, r3 + 8003eb6: b2da uxtb r2, r3 + 8003eb8: 68fb ldr r3, [r7, #12] + 8003eba: 681b ldr r3, [r3, #0] + 8003ebc: 629a str r2, [r3, #40] ; 0x28 + + /* Wait until TXIS flag is set */ + if (I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK) + 8003ebe: 69fa ldr r2, [r7, #28] + 8003ec0: 69b9 ldr r1, [r7, #24] + 8003ec2: 68f8 ldr r0, [r7, #12] + 8003ec4: f000 f8d6 bl 8004074 + 8003ec8: 4603 mov r3, r0 + 8003eca: 2b00 cmp r3, #0 + 8003ecc: d001 beq.n 8003ed2 + { + return HAL_ERROR; + 8003ece: 2301 movs r3, #1 + 8003ed0: e012 b.n 8003ef8 + } + + /* Send LSB of Memory Address */ + hi2c->Instance->TXDR = I2C_MEM_ADD_LSB(MemAddress); + 8003ed2: 893b ldrh r3, [r7, #8] + 8003ed4: b2da uxtb r2, r3 + 8003ed6: 68fb ldr r3, [r7, #12] + 8003ed8: 681b ldr r3, [r3, #0] + 8003eda: 629a str r2, [r3, #40] ; 0x28 + } + + /* Wait until TCR flag is set */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, Timeout, Tickstart) != HAL_OK) + 8003edc: 69fb ldr r3, [r7, #28] + 8003ede: 9300 str r3, [sp, #0] + 8003ee0: 69bb ldr r3, [r7, #24] + 8003ee2: 2200 movs r2, #0 + 8003ee4: 2180 movs r1, #128 ; 0x80 + 8003ee6: 68f8 ldr r0, [r7, #12] + 8003ee8: f000 f884 bl 8003ff4 + 8003eec: 4603 mov r3, r0 + 8003eee: 2b00 cmp r3, #0 + 8003ef0: d001 beq.n 8003ef6 + { + return HAL_ERROR; + 8003ef2: 2301 movs r3, #1 + 8003ef4: e000 b.n 8003ef8 + } + + return HAL_OK; + 8003ef6: 2300 movs r3, #0 +} + 8003ef8: 4618 mov r0, r3 + 8003efa: 3710 adds r7, #16 + 8003efc: 46bd mov sp, r7 + 8003efe: bd80 pop {r7, pc} + 8003f00: 80002000 .word 0x80002000 + +08003f04 : + * @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) +{ + 8003f04: b580 push {r7, lr} + 8003f06: b086 sub sp, #24 + 8003f08: af02 add r7, sp, #8 + 8003f0a: 60f8 str r0, [r7, #12] + 8003f0c: 4608 mov r0, r1 + 8003f0e: 4611 mov r1, r2 + 8003f10: 461a mov r2, r3 + 8003f12: 4603 mov r3, r0 + 8003f14: 817b strh r3, [r7, #10] + 8003f16: 460b mov r3, r1 + 8003f18: 813b strh r3, [r7, #8] + 8003f1a: 4613 mov r3, r2 + 8003f1c: 80fb strh r3, [r7, #6] + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)MemAddSize, I2C_SOFTEND_MODE, I2C_GENERATE_START_WRITE); + 8003f1e: 88fb ldrh r3, [r7, #6] + 8003f20: b2da uxtb r2, r3 + 8003f22: 8979 ldrh r1, [r7, #10] + 8003f24: 4b20 ldr r3, [pc, #128] ; (8003fa8 ) + 8003f26: 9300 str r3, [sp, #0] + 8003f28: 2300 movs r3, #0 + 8003f2a: 68f8 ldr r0, [r7, #12] + 8003f2c: f000 fa00 bl 8004330 + + /* Wait until TXIS flag is set */ + if (I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK) + 8003f30: 69fa ldr r2, [r7, #28] + 8003f32: 69b9 ldr r1, [r7, #24] + 8003f34: 68f8 ldr r0, [r7, #12] + 8003f36: f000 f89d bl 8004074 + 8003f3a: 4603 mov r3, r0 + 8003f3c: 2b00 cmp r3, #0 + 8003f3e: d001 beq.n 8003f44 + { + return HAL_ERROR; + 8003f40: 2301 movs r3, #1 + 8003f42: e02c b.n 8003f9e + } + + /* If Memory address size is 8Bit */ + if (MemAddSize == I2C_MEMADD_SIZE_8BIT) + 8003f44: 88fb ldrh r3, [r7, #6] + 8003f46: 2b01 cmp r3, #1 + 8003f48: d105 bne.n 8003f56 + { + /* Send Memory Address */ + hi2c->Instance->TXDR = I2C_MEM_ADD_LSB(MemAddress); + 8003f4a: 893b ldrh r3, [r7, #8] + 8003f4c: b2da uxtb r2, r3 + 8003f4e: 68fb ldr r3, [r7, #12] + 8003f50: 681b ldr r3, [r3, #0] + 8003f52: 629a str r2, [r3, #40] ; 0x28 + 8003f54: e015 b.n 8003f82 + } + /* If Memory address size is 16Bit */ + else + { + /* Send MSB of Memory Address */ + hi2c->Instance->TXDR = I2C_MEM_ADD_MSB(MemAddress); + 8003f56: 893b ldrh r3, [r7, #8] + 8003f58: 0a1b lsrs r3, r3, #8 + 8003f5a: b29b uxth r3, r3 + 8003f5c: b2da uxtb r2, r3 + 8003f5e: 68fb ldr r3, [r7, #12] + 8003f60: 681b ldr r3, [r3, #0] + 8003f62: 629a str r2, [r3, #40] ; 0x28 + + /* Wait until TXIS flag is set */ + if (I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK) + 8003f64: 69fa ldr r2, [r7, #28] + 8003f66: 69b9 ldr r1, [r7, #24] + 8003f68: 68f8 ldr r0, [r7, #12] + 8003f6a: f000 f883 bl 8004074 + 8003f6e: 4603 mov r3, r0 + 8003f70: 2b00 cmp r3, #0 + 8003f72: d001 beq.n 8003f78 + { + return HAL_ERROR; + 8003f74: 2301 movs r3, #1 + 8003f76: e012 b.n 8003f9e + } + + /* Send LSB of Memory Address */ + hi2c->Instance->TXDR = I2C_MEM_ADD_LSB(MemAddress); + 8003f78: 893b ldrh r3, [r7, #8] + 8003f7a: b2da uxtb r2, r3 + 8003f7c: 68fb ldr r3, [r7, #12] + 8003f7e: 681b ldr r3, [r3, #0] + 8003f80: 629a str r2, [r3, #40] ; 0x28 + } + + /* Wait until TC flag is set */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TC, RESET, Timeout, Tickstart) != HAL_OK) + 8003f82: 69fb ldr r3, [r7, #28] + 8003f84: 9300 str r3, [sp, #0] + 8003f86: 69bb ldr r3, [r7, #24] + 8003f88: 2200 movs r2, #0 + 8003f8a: 2140 movs r1, #64 ; 0x40 + 8003f8c: 68f8 ldr r0, [r7, #12] + 8003f8e: f000 f831 bl 8003ff4 + 8003f92: 4603 mov r3, r0 + 8003f94: 2b00 cmp r3, #0 + 8003f96: d001 beq.n 8003f9c + { + return HAL_ERROR; + 8003f98: 2301 movs r3, #1 + 8003f9a: e000 b.n 8003f9e + } + + return HAL_OK; + 8003f9c: 2300 movs r3, #0 +} + 8003f9e: 4618 mov r0, r3 + 8003fa0: 3710 adds r7, #16 + 8003fa2: 46bd mov sp, r7 + 8003fa4: bd80 pop {r7, pc} + 8003fa6: bf00 nop + 8003fa8: 80002000 .word 0x80002000 + +08003fac : + * @brief I2C Tx data register flush process. + * @param hi2c I2C handle. + * @retval None + */ +static void I2C_Flush_TXDR(I2C_HandleTypeDef *hi2c) +{ + 8003fac: b480 push {r7} + 8003fae: b083 sub sp, #12 + 8003fb0: af00 add r7, sp, #0 + 8003fb2: 6078 str r0, [r7, #4] + /* If a pending TXIS flag is set */ + /* Write a dummy data in TXDR to clear it */ + if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXIS) != RESET) + 8003fb4: 687b ldr r3, [r7, #4] + 8003fb6: 681b ldr r3, [r3, #0] + 8003fb8: 699b ldr r3, [r3, #24] + 8003fba: f003 0302 and.w r3, r3, #2 + 8003fbe: 2b02 cmp r3, #2 + 8003fc0: d103 bne.n 8003fca + { + hi2c->Instance->TXDR = 0x00U; + 8003fc2: 687b ldr r3, [r7, #4] + 8003fc4: 681b ldr r3, [r3, #0] + 8003fc6: 2200 movs r2, #0 + 8003fc8: 629a str r2, [r3, #40] ; 0x28 + } + + /* Flush TX register if not empty */ + if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXE) == RESET) + 8003fca: 687b ldr r3, [r7, #4] + 8003fcc: 681b ldr r3, [r3, #0] + 8003fce: 699b ldr r3, [r3, #24] + 8003fd0: f003 0301 and.w r3, r3, #1 + 8003fd4: 2b01 cmp r3, #1 + 8003fd6: d007 beq.n 8003fe8 + { + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_TXE); + 8003fd8: 687b ldr r3, [r7, #4] + 8003fda: 681b ldr r3, [r3, #0] + 8003fdc: 699a ldr r2, [r3, #24] + 8003fde: 687b ldr r3, [r7, #4] + 8003fe0: 681b ldr r3, [r3, #0] + 8003fe2: f042 0201 orr.w r2, r2, #1 + 8003fe6: 619a str r2, [r3, #24] + } +} + 8003fe8: bf00 nop + 8003fea: 370c adds r7, #12 + 8003fec: 46bd mov sp, r7 + 8003fee: f85d 7b04 ldr.w r7, [sp], #4 + 8003ff2: 4770 bx lr + +08003ff4 : + * @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) +{ + 8003ff4: b580 push {r7, lr} + 8003ff6: b084 sub sp, #16 + 8003ff8: af00 add r7, sp, #0 + 8003ffa: 60f8 str r0, [r7, #12] + 8003ffc: 60b9 str r1, [r7, #8] + 8003ffe: 603b str r3, [r7, #0] + 8004000: 4613 mov r3, r2 + 8004002: 71fb strb r3, [r7, #7] + while (__HAL_I2C_GET_FLAG(hi2c, Flag) == Status) + 8004004: e022 b.n 800404c + { + /* Check for the Timeout */ + if (Timeout != HAL_MAX_DELAY) + 8004006: 683b ldr r3, [r7, #0] + 8004008: f1b3 3fff cmp.w r3, #4294967295 ; 0xffffffff + 800400c: d01e beq.n 800404c + { + if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) + 800400e: f7fe f929 bl 8002264 + 8004012: 4602 mov r2, r0 + 8004014: 69bb ldr r3, [r7, #24] + 8004016: 1ad3 subs r3, r2, r3 + 8004018: 683a ldr r2, [r7, #0] + 800401a: 429a cmp r2, r3 + 800401c: d302 bcc.n 8004024 + 800401e: 683b ldr r3, [r7, #0] + 8004020: 2b00 cmp r3, #0 + 8004022: d113 bne.n 800404c + { + hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; + 8004024: 68fb ldr r3, [r7, #12] + 8004026: 6c5b ldr r3, [r3, #68] ; 0x44 + 8004028: f043 0220 orr.w r2, r3, #32 + 800402c: 68fb ldr r3, [r7, #12] + 800402e: 645a str r2, [r3, #68] ; 0x44 + hi2c->State = HAL_I2C_STATE_READY; + 8004030: 68fb ldr r3, [r7, #12] + 8004032: 2220 movs r2, #32 + 8004034: f883 2041 strb.w r2, [r3, #65] ; 0x41 + hi2c->Mode = HAL_I2C_MODE_NONE; + 8004038: 68fb ldr r3, [r7, #12] + 800403a: 2200 movs r2, #0 + 800403c: f883 2042 strb.w r2, [r3, #66] ; 0x42 + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + 8004040: 68fb ldr r3, [r7, #12] + 8004042: 2200 movs r2, #0 + 8004044: f883 2040 strb.w r2, [r3, #64] ; 0x40 + return HAL_ERROR; + 8004048: 2301 movs r3, #1 + 800404a: e00f b.n 800406c + while (__HAL_I2C_GET_FLAG(hi2c, Flag) == Status) + 800404c: 68fb ldr r3, [r7, #12] + 800404e: 681b ldr r3, [r3, #0] + 8004050: 699a ldr r2, [r3, #24] + 8004052: 68bb ldr r3, [r7, #8] + 8004054: 4013 ands r3, r2 + 8004056: 68ba ldr r2, [r7, #8] + 8004058: 429a cmp r2, r3 + 800405a: bf0c ite eq + 800405c: 2301 moveq r3, #1 + 800405e: 2300 movne r3, #0 + 8004060: b2db uxtb r3, r3 + 8004062: 461a mov r2, r3 + 8004064: 79fb ldrb r3, [r7, #7] + 8004066: 429a cmp r2, r3 + 8004068: d0cd beq.n 8004006 + } + } + } + return HAL_OK; + 800406a: 2300 movs r3, #0 +} + 800406c: 4618 mov r0, r3 + 800406e: 3710 adds r7, #16 + 8004070: 46bd mov sp, r7 + 8004072: bd80 pop {r7, pc} + +08004074 : + * @param Tickstart Tick start value + * @retval HAL status + */ +static HAL_StatusTypeDef I2C_WaitOnTXISFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, + uint32_t Tickstart) +{ + 8004074: b580 push {r7, lr} + 8004076: b084 sub sp, #16 + 8004078: af00 add r7, sp, #0 + 800407a: 60f8 str r0, [r7, #12] + 800407c: 60b9 str r1, [r7, #8] + 800407e: 607a str r2, [r7, #4] + while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXIS) == RESET) + 8004080: e02c b.n 80040dc + { + /* Check if a NACK is detected */ + if (I2C_IsAcknowledgeFailed(hi2c, Timeout, Tickstart) != HAL_OK) + 8004082: 687a ldr r2, [r7, #4] + 8004084: 68b9 ldr r1, [r7, #8] + 8004086: 68f8 ldr r0, [r7, #12] + 8004088: f000 f8dc bl 8004244 + 800408c: 4603 mov r3, r0 + 800408e: 2b00 cmp r3, #0 + 8004090: d001 beq.n 8004096 + { + return HAL_ERROR; + 8004092: 2301 movs r3, #1 + 8004094: e02a b.n 80040ec + } + + /* Check for the Timeout */ + if (Timeout != HAL_MAX_DELAY) + 8004096: 68bb ldr r3, [r7, #8] + 8004098: f1b3 3fff cmp.w r3, #4294967295 ; 0xffffffff + 800409c: d01e beq.n 80040dc + { + if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) + 800409e: f7fe f8e1 bl 8002264 + 80040a2: 4602 mov r2, r0 + 80040a4: 687b ldr r3, [r7, #4] + 80040a6: 1ad3 subs r3, r2, r3 + 80040a8: 68ba ldr r2, [r7, #8] + 80040aa: 429a cmp r2, r3 + 80040ac: d302 bcc.n 80040b4 + 80040ae: 68bb ldr r3, [r7, #8] + 80040b0: 2b00 cmp r3, #0 + 80040b2: d113 bne.n 80040dc + { + hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; + 80040b4: 68fb ldr r3, [r7, #12] + 80040b6: 6c5b ldr r3, [r3, #68] ; 0x44 + 80040b8: f043 0220 orr.w r2, r3, #32 + 80040bc: 68fb ldr r3, [r7, #12] + 80040be: 645a str r2, [r3, #68] ; 0x44 + hi2c->State = HAL_I2C_STATE_READY; + 80040c0: 68fb ldr r3, [r7, #12] + 80040c2: 2220 movs r2, #32 + 80040c4: f883 2041 strb.w r2, [r3, #65] ; 0x41 + hi2c->Mode = HAL_I2C_MODE_NONE; + 80040c8: 68fb ldr r3, [r7, #12] + 80040ca: 2200 movs r2, #0 + 80040cc: f883 2042 strb.w r2, [r3, #66] ; 0x42 + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + 80040d0: 68fb ldr r3, [r7, #12] + 80040d2: 2200 movs r2, #0 + 80040d4: f883 2040 strb.w r2, [r3, #64] ; 0x40 + + return HAL_ERROR; + 80040d8: 2301 movs r3, #1 + 80040da: e007 b.n 80040ec + while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXIS) == RESET) + 80040dc: 68fb ldr r3, [r7, #12] + 80040de: 681b ldr r3, [r3, #0] + 80040e0: 699b ldr r3, [r3, #24] + 80040e2: f003 0302 and.w r3, r3, #2 + 80040e6: 2b02 cmp r3, #2 + 80040e8: d1cb bne.n 8004082 + } + } + } + return HAL_OK; + 80040ea: 2300 movs r3, #0 +} + 80040ec: 4618 mov r0, r3 + 80040ee: 3710 adds r7, #16 + 80040f0: 46bd mov sp, r7 + 80040f2: bd80 pop {r7, pc} + +080040f4 : + * @param Tickstart Tick start value + * @retval HAL status + */ +static HAL_StatusTypeDef I2C_WaitOnSTOPFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, + uint32_t Tickstart) +{ + 80040f4: b580 push {r7, lr} + 80040f6: b084 sub sp, #16 + 80040f8: af00 add r7, sp, #0 + 80040fa: 60f8 str r0, [r7, #12] + 80040fc: 60b9 str r1, [r7, #8] + 80040fe: 607a str r2, [r7, #4] + while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == RESET) + 8004100: e028 b.n 8004154 + { + /* Check if a NACK is detected */ + if (I2C_IsAcknowledgeFailed(hi2c, Timeout, Tickstart) != HAL_OK) + 8004102: 687a ldr r2, [r7, #4] + 8004104: 68b9 ldr r1, [r7, #8] + 8004106: 68f8 ldr r0, [r7, #12] + 8004108: f000 f89c bl 8004244 + 800410c: 4603 mov r3, r0 + 800410e: 2b00 cmp r3, #0 + 8004110: d001 beq.n 8004116 + { + return HAL_ERROR; + 8004112: 2301 movs r3, #1 + 8004114: e026 b.n 8004164 + } + + /* Check for the Timeout */ + if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) + 8004116: f7fe f8a5 bl 8002264 + 800411a: 4602 mov r2, r0 + 800411c: 687b ldr r3, [r7, #4] + 800411e: 1ad3 subs r3, r2, r3 + 8004120: 68ba ldr r2, [r7, #8] + 8004122: 429a cmp r2, r3 + 8004124: d302 bcc.n 800412c + 8004126: 68bb ldr r3, [r7, #8] + 8004128: 2b00 cmp r3, #0 + 800412a: d113 bne.n 8004154 + { + hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; + 800412c: 68fb ldr r3, [r7, #12] + 800412e: 6c5b ldr r3, [r3, #68] ; 0x44 + 8004130: f043 0220 orr.w r2, r3, #32 + 8004134: 68fb ldr r3, [r7, #12] + 8004136: 645a str r2, [r3, #68] ; 0x44 + hi2c->State = HAL_I2C_STATE_READY; + 8004138: 68fb ldr r3, [r7, #12] + 800413a: 2220 movs r2, #32 + 800413c: f883 2041 strb.w r2, [r3, #65] ; 0x41 + hi2c->Mode = HAL_I2C_MODE_NONE; + 8004140: 68fb ldr r3, [r7, #12] + 8004142: 2200 movs r2, #0 + 8004144: f883 2042 strb.w r2, [r3, #66] ; 0x42 + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + 8004148: 68fb ldr r3, [r7, #12] + 800414a: 2200 movs r2, #0 + 800414c: f883 2040 strb.w r2, [r3, #64] ; 0x40 + + return HAL_ERROR; + 8004150: 2301 movs r3, #1 + 8004152: e007 b.n 8004164 + while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == RESET) + 8004154: 68fb ldr r3, [r7, #12] + 8004156: 681b ldr r3, [r3, #0] + 8004158: 699b ldr r3, [r3, #24] + 800415a: f003 0320 and.w r3, r3, #32 + 800415e: 2b20 cmp r3, #32 + 8004160: d1cf bne.n 8004102 + } + } + return HAL_OK; + 8004162: 2300 movs r3, #0 +} + 8004164: 4618 mov r0, r3 + 8004166: 3710 adds r7, #16 + 8004168: 46bd mov sp, r7 + 800416a: bd80 pop {r7, pc} + +0800416c : + * @param Tickstart Tick start value + * @retval HAL status + */ +static HAL_StatusTypeDef I2C_WaitOnRXNEFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, + uint32_t Tickstart) +{ + 800416c: b580 push {r7, lr} + 800416e: b084 sub sp, #16 + 8004170: af00 add r7, sp, #0 + 8004172: 60f8 str r0, [r7, #12] + 8004174: 60b9 str r1, [r7, #8] + 8004176: 607a str r2, [r7, #4] + while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == RESET) + 8004178: e055 b.n 8004226 + { + /* Check if a NACK is detected */ + if (I2C_IsAcknowledgeFailed(hi2c, Timeout, Tickstart) != HAL_OK) + 800417a: 687a ldr r2, [r7, #4] + 800417c: 68b9 ldr r1, [r7, #8] + 800417e: 68f8 ldr r0, [r7, #12] + 8004180: f000 f860 bl 8004244 + 8004184: 4603 mov r3, r0 + 8004186: 2b00 cmp r3, #0 + 8004188: d001 beq.n 800418e + { + return HAL_ERROR; + 800418a: 2301 movs r3, #1 + 800418c: e053 b.n 8004236 + } + + /* Check if a STOPF is detected */ + if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == SET) + 800418e: 68fb ldr r3, [r7, #12] + 8004190: 681b ldr r3, [r3, #0] + 8004192: 699b ldr r3, [r3, #24] + 8004194: f003 0320 and.w r3, r3, #32 + 8004198: 2b20 cmp r3, #32 + 800419a: d129 bne.n 80041f0 + { + /* Check if an RXNE is pending */ + /* Store Last receive data if any */ + if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET) && (hi2c->XferSize > 0U)) + 800419c: 68fb ldr r3, [r7, #12] + 800419e: 681b ldr r3, [r3, #0] + 80041a0: 699b ldr r3, [r3, #24] + 80041a2: f003 0304 and.w r3, r3, #4 + 80041a6: 2b04 cmp r3, #4 + 80041a8: d105 bne.n 80041b6 + 80041aa: 68fb ldr r3, [r7, #12] + 80041ac: 8d1b ldrh r3, [r3, #40] ; 0x28 + 80041ae: 2b00 cmp r3, #0 + 80041b0: d001 beq.n 80041b6 + { + /* Return HAL_OK */ + /* The Reading of data from RXDR will be done in caller function */ + return HAL_OK; + 80041b2: 2300 movs r3, #0 + 80041b4: e03f b.n 8004236 + } + else + { + /* Clear STOP Flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF); + 80041b6: 68fb ldr r3, [r7, #12] + 80041b8: 681b ldr r3, [r3, #0] + 80041ba: 2220 movs r2, #32 + 80041bc: 61da str r2, [r3, #28] + + /* Clear Configuration Register 2 */ + I2C_RESET_CR2(hi2c); + 80041be: 68fb ldr r3, [r7, #12] + 80041c0: 681b ldr r3, [r3, #0] + 80041c2: 6859 ldr r1, [r3, #4] + 80041c4: 68fb ldr r3, [r7, #12] + 80041c6: 681a ldr r2, [r3, #0] + 80041c8: 4b1d ldr r3, [pc, #116] ; (8004240 ) + 80041ca: 400b ands r3, r1 + 80041cc: 6053 str r3, [r2, #4] + + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 80041ce: 68fb ldr r3, [r7, #12] + 80041d0: 2200 movs r2, #0 + 80041d2: 645a str r2, [r3, #68] ; 0x44 + hi2c->State = HAL_I2C_STATE_READY; + 80041d4: 68fb ldr r3, [r7, #12] + 80041d6: 2220 movs r2, #32 + 80041d8: f883 2041 strb.w r2, [r3, #65] ; 0x41 + hi2c->Mode = HAL_I2C_MODE_NONE; + 80041dc: 68fb ldr r3, [r7, #12] + 80041de: 2200 movs r2, #0 + 80041e0: f883 2042 strb.w r2, [r3, #66] ; 0x42 + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + 80041e4: 68fb ldr r3, [r7, #12] + 80041e6: 2200 movs r2, #0 + 80041e8: f883 2040 strb.w r2, [r3, #64] ; 0x40 + + return HAL_ERROR; + 80041ec: 2301 movs r3, #1 + 80041ee: e022 b.n 8004236 + } + } + + /* Check for the Timeout */ + if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) + 80041f0: f7fe f838 bl 8002264 + 80041f4: 4602 mov r2, r0 + 80041f6: 687b ldr r3, [r7, #4] + 80041f8: 1ad3 subs r3, r2, r3 + 80041fa: 68ba ldr r2, [r7, #8] + 80041fc: 429a cmp r2, r3 + 80041fe: d302 bcc.n 8004206 + 8004200: 68bb ldr r3, [r7, #8] + 8004202: 2b00 cmp r3, #0 + 8004204: d10f bne.n 8004226 + { + hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; + 8004206: 68fb ldr r3, [r7, #12] + 8004208: 6c5b ldr r3, [r3, #68] ; 0x44 + 800420a: f043 0220 orr.w r2, r3, #32 + 800420e: 68fb ldr r3, [r7, #12] + 8004210: 645a str r2, [r3, #68] ; 0x44 + hi2c->State = HAL_I2C_STATE_READY; + 8004212: 68fb ldr r3, [r7, #12] + 8004214: 2220 movs r2, #32 + 8004216: f883 2041 strb.w r2, [r3, #65] ; 0x41 + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + 800421a: 68fb ldr r3, [r7, #12] + 800421c: 2200 movs r2, #0 + 800421e: f883 2040 strb.w r2, [r3, #64] ; 0x40 + + return HAL_ERROR; + 8004222: 2301 movs r3, #1 + 8004224: e007 b.n 8004236 + while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == RESET) + 8004226: 68fb ldr r3, [r7, #12] + 8004228: 681b ldr r3, [r3, #0] + 800422a: 699b ldr r3, [r3, #24] + 800422c: f003 0304 and.w r3, r3, #4 + 8004230: 2b04 cmp r3, #4 + 8004232: d1a2 bne.n 800417a + } + } + return HAL_OK; + 8004234: 2300 movs r3, #0 +} + 8004236: 4618 mov r0, r3 + 8004238: 3710 adds r7, #16 + 800423a: 46bd mov sp, r7 + 800423c: bd80 pop {r7, pc} + 800423e: bf00 nop + 8004240: fe00e800 .word 0xfe00e800 + +08004244 : + * @param Timeout Timeout duration + * @param Tickstart Tick start value + * @retval HAL status + */ +static HAL_StatusTypeDef I2C_IsAcknowledgeFailed(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart) +{ + 8004244: b580 push {r7, lr} + 8004246: b084 sub sp, #16 + 8004248: af00 add r7, sp, #0 + 800424a: 60f8 str r0, [r7, #12] + 800424c: 60b9 str r1, [r7, #8] + 800424e: 607a str r2, [r7, #4] + if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == SET) + 8004250: 68fb ldr r3, [r7, #12] + 8004252: 681b ldr r3, [r3, #0] + 8004254: 699b ldr r3, [r3, #24] + 8004256: f003 0310 and.w r3, r3, #16 + 800425a: 2b10 cmp r3, #16 + 800425c: d161 bne.n 8004322 + { + /* In case of Soft End condition, generate the STOP condition */ + if (I2C_GET_STOP_MODE(hi2c) != I2C_AUTOEND_MODE) + 800425e: 68fb ldr r3, [r7, #12] + 8004260: 681b ldr r3, [r3, #0] + 8004262: 685b ldr r3, [r3, #4] + 8004264: f003 7300 and.w r3, r3, #33554432 ; 0x2000000 + 8004268: f1b3 7f00 cmp.w r3, #33554432 ; 0x2000000 + 800426c: d02b beq.n 80042c6 + { + /* Generate Stop */ + hi2c->Instance->CR2 |= I2C_CR2_STOP; + 800426e: 68fb ldr r3, [r7, #12] + 8004270: 681b ldr r3, [r3, #0] + 8004272: 685a ldr r2, [r3, #4] + 8004274: 68fb ldr r3, [r7, #12] + 8004276: 681b ldr r3, [r3, #0] + 8004278: f442 4280 orr.w r2, r2, #16384 ; 0x4000 + 800427c: 605a str r2, [r3, #4] + } + /* Wait until STOP Flag is reset */ + /* AutoEnd should be initiate after AF */ + while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == RESET) + 800427e: e022 b.n 80042c6 + { + /* Check for the Timeout */ + if (Timeout != HAL_MAX_DELAY) + 8004280: 68bb ldr r3, [r7, #8] + 8004282: f1b3 3fff cmp.w r3, #4294967295 ; 0xffffffff + 8004286: d01e beq.n 80042c6 + { + if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) + 8004288: f7fd ffec bl 8002264 + 800428c: 4602 mov r2, r0 + 800428e: 687b ldr r3, [r7, #4] + 8004290: 1ad3 subs r3, r2, r3 + 8004292: 68ba ldr r2, [r7, #8] + 8004294: 429a cmp r2, r3 + 8004296: d302 bcc.n 800429e + 8004298: 68bb ldr r3, [r7, #8] + 800429a: 2b00 cmp r3, #0 + 800429c: d113 bne.n 80042c6 + { + hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; + 800429e: 68fb ldr r3, [r7, #12] + 80042a0: 6c5b ldr r3, [r3, #68] ; 0x44 + 80042a2: f043 0220 orr.w r2, r3, #32 + 80042a6: 68fb ldr r3, [r7, #12] + 80042a8: 645a str r2, [r3, #68] ; 0x44 + hi2c->State = HAL_I2C_STATE_READY; + 80042aa: 68fb ldr r3, [r7, #12] + 80042ac: 2220 movs r2, #32 + 80042ae: f883 2041 strb.w r2, [r3, #65] ; 0x41 + hi2c->Mode = HAL_I2C_MODE_NONE; + 80042b2: 68fb ldr r3, [r7, #12] + 80042b4: 2200 movs r2, #0 + 80042b6: f883 2042 strb.w r2, [r3, #66] ; 0x42 + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + 80042ba: 68fb ldr r3, [r7, #12] + 80042bc: 2200 movs r2, #0 + 80042be: f883 2040 strb.w r2, [r3, #64] ; 0x40 + + return HAL_ERROR; + 80042c2: 2301 movs r3, #1 + 80042c4: e02e b.n 8004324 + while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == RESET) + 80042c6: 68fb ldr r3, [r7, #12] + 80042c8: 681b ldr r3, [r3, #0] + 80042ca: 699b ldr r3, [r3, #24] + 80042cc: f003 0320 and.w r3, r3, #32 + 80042d0: 2b20 cmp r3, #32 + 80042d2: d1d5 bne.n 8004280 + } + } + } + + /* Clear NACKF Flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); + 80042d4: 68fb ldr r3, [r7, #12] + 80042d6: 681b ldr r3, [r3, #0] + 80042d8: 2210 movs r2, #16 + 80042da: 61da str r2, [r3, #28] + + /* Clear STOP Flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF); + 80042dc: 68fb ldr r3, [r7, #12] + 80042de: 681b ldr r3, [r3, #0] + 80042e0: 2220 movs r2, #32 + 80042e2: 61da str r2, [r3, #28] + + /* Flush TX register */ + I2C_Flush_TXDR(hi2c); + 80042e4: 68f8 ldr r0, [r7, #12] + 80042e6: f7ff fe61 bl 8003fac + + /* Clear Configuration Register 2 */ + I2C_RESET_CR2(hi2c); + 80042ea: 68fb ldr r3, [r7, #12] + 80042ec: 681b ldr r3, [r3, #0] + 80042ee: 6859 ldr r1, [r3, #4] + 80042f0: 68fb ldr r3, [r7, #12] + 80042f2: 681a ldr r2, [r3, #0] + 80042f4: 4b0d ldr r3, [pc, #52] ; (800432c ) + 80042f6: 400b ands r3, r1 + 80042f8: 6053 str r3, [r2, #4] + + hi2c->ErrorCode |= HAL_I2C_ERROR_AF; + 80042fa: 68fb ldr r3, [r7, #12] + 80042fc: 6c5b ldr r3, [r3, #68] ; 0x44 + 80042fe: f043 0204 orr.w r2, r3, #4 + 8004302: 68fb ldr r3, [r7, #12] + 8004304: 645a str r2, [r3, #68] ; 0x44 + hi2c->State = HAL_I2C_STATE_READY; + 8004306: 68fb ldr r3, [r7, #12] + 8004308: 2220 movs r2, #32 + 800430a: f883 2041 strb.w r2, [r3, #65] ; 0x41 + hi2c->Mode = HAL_I2C_MODE_NONE; + 800430e: 68fb ldr r3, [r7, #12] + 8004310: 2200 movs r2, #0 + 8004312: f883 2042 strb.w r2, [r3, #66] ; 0x42 + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + 8004316: 68fb ldr r3, [r7, #12] + 8004318: 2200 movs r2, #0 + 800431a: f883 2040 strb.w r2, [r3, #64] ; 0x40 + + return HAL_ERROR; + 800431e: 2301 movs r3, #1 + 8004320: e000 b.n 8004324 + } + return HAL_OK; + 8004322: 2300 movs r3, #0 +} + 8004324: 4618 mov r0, r3 + 8004326: 3710 adds r7, #16 + 8004328: 46bd mov sp, r7 + 800432a: bd80 pop {r7, pc} + 800432c: fe00e800 .word 0xfe00e800 + +08004330 : + * @arg @ref I2C_GENERATE_START_WRITE Generate Restart for write request. + * @retval None + */ +static void I2C_TransferConfig(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t Size, uint32_t Mode, + uint32_t Request) +{ + 8004330: b480 push {r7} + 8004332: b085 sub sp, #20 + 8004334: af00 add r7, sp, #0 + 8004336: 60f8 str r0, [r7, #12] + 8004338: 607b str r3, [r7, #4] + 800433a: 460b mov r3, r1 + 800433c: 817b strh r3, [r7, #10] + 800433e: 4613 mov r3, r2 + 8004340: 727b strb r3, [r7, #9] + assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance)); + assert_param(IS_TRANSFER_MODE(Mode)); + assert_param(IS_TRANSFER_REQUEST(Request)); + + /* update CR2 register */ + MODIFY_REG(hi2c->Instance->CR2, + 8004342: 68fb ldr r3, [r7, #12] + 8004344: 681b ldr r3, [r3, #0] + 8004346: 685a ldr r2, [r3, #4] + 8004348: 69bb ldr r3, [r7, #24] + 800434a: 0d5b lsrs r3, r3, #21 + 800434c: f403 6180 and.w r1, r3, #1024 ; 0x400 + 8004350: 4b0d ldr r3, [pc, #52] ; (8004388 ) + 8004352: 430b orrs r3, r1 + 8004354: 43db mvns r3, r3 + 8004356: ea02 0103 and.w r1, r2, r3 + 800435a: 897b ldrh r3, [r7, #10] + 800435c: f3c3 0209 ubfx r2, r3, #0, #10 + 8004360: 7a7b ldrb r3, [r7, #9] + 8004362: 041b lsls r3, r3, #16 + 8004364: f403 037f and.w r3, r3, #16711680 ; 0xff0000 + 8004368: 431a orrs r2, r3 + 800436a: 687b ldr r3, [r7, #4] + 800436c: 431a orrs r2, r3 + 800436e: 69bb ldr r3, [r7, #24] + 8004370: 431a orrs r2, r3 + 8004372: 68fb ldr r3, [r7, #12] + 8004374: 681b ldr r3, [r3, #0] + 8004376: 430a orrs r2, r1 + 8004378: 605a str r2, [r3, #4] + (I2C_CR2_RD_WRN & (uint32_t)(Request >> (31U - I2C_CR2_RD_WRN_Pos))) | \ + I2C_CR2_START | I2C_CR2_STOP)), \ + (uint32_t)(((uint32_t)DevAddress & I2C_CR2_SADD) | \ + (((uint32_t)Size << I2C_CR2_NBYTES_Pos) & I2C_CR2_NBYTES) | \ + (uint32_t)Mode | (uint32_t)Request)); +} + 800437a: bf00 nop + 800437c: 3714 adds r7, #20 + 800437e: 46bd mov sp, r7 + 8004380: f85d 7b04 ldr.w r7, [sp], #4 + 8004384: 4770 bx lr + 8004386: bf00 nop + 8004388: 03ff63ff .word 0x03ff63ff + +0800438c : + * 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) +{ + 800438c: b480 push {r7} + 800438e: b083 sub sp, #12 + 8004390: af00 add r7, sp, #0 + 8004392: 6078 str r0, [r7, #4] + 8004394: 6039 str r1, [r7, #0] + /* 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) + 8004396: 687b ldr r3, [r7, #4] + 8004398: f893 3041 ldrb.w r3, [r3, #65] ; 0x41 + 800439c: b2db uxtb r3, r3 + 800439e: 2b20 cmp r3, #32 + 80043a0: d138 bne.n 8004414 + { + /* Process Locked */ + __HAL_LOCK(hi2c); + 80043a2: 687b ldr r3, [r7, #4] + 80043a4: f893 3040 ldrb.w r3, [r3, #64] ; 0x40 + 80043a8: 2b01 cmp r3, #1 + 80043aa: d101 bne.n 80043b0 + 80043ac: 2302 movs r3, #2 + 80043ae: e032 b.n 8004416 + 80043b0: 687b ldr r3, [r7, #4] + 80043b2: 2201 movs r2, #1 + 80043b4: f883 2040 strb.w r2, [r3, #64] ; 0x40 + + hi2c->State = HAL_I2C_STATE_BUSY; + 80043b8: 687b ldr r3, [r7, #4] + 80043ba: 2224 movs r2, #36 ; 0x24 + 80043bc: f883 2041 strb.w r2, [r3, #65] ; 0x41 + + /* Disable the selected I2C peripheral */ + __HAL_I2C_DISABLE(hi2c); + 80043c0: 687b ldr r3, [r7, #4] + 80043c2: 681b ldr r3, [r3, #0] + 80043c4: 681a ldr r2, [r3, #0] + 80043c6: 687b ldr r3, [r7, #4] + 80043c8: 681b ldr r3, [r3, #0] + 80043ca: f022 0201 bic.w r2, r2, #1 + 80043ce: 601a str r2, [r3, #0] + + /* Reset I2Cx ANOFF bit */ + hi2c->Instance->CR1 &= ~(I2C_CR1_ANFOFF); + 80043d0: 687b ldr r3, [r7, #4] + 80043d2: 681b ldr r3, [r3, #0] + 80043d4: 681a ldr r2, [r3, #0] + 80043d6: 687b ldr r3, [r7, #4] + 80043d8: 681b ldr r3, [r3, #0] + 80043da: f422 5280 bic.w r2, r2, #4096 ; 0x1000 + 80043de: 601a str r2, [r3, #0] + + /* Set analog filter bit*/ + hi2c->Instance->CR1 |= AnalogFilter; + 80043e0: 687b ldr r3, [r7, #4] + 80043e2: 681b ldr r3, [r3, #0] + 80043e4: 6819 ldr r1, [r3, #0] + 80043e6: 687b ldr r3, [r7, #4] + 80043e8: 681b ldr r3, [r3, #0] + 80043ea: 683a ldr r2, [r7, #0] + 80043ec: 430a orrs r2, r1 + 80043ee: 601a str r2, [r3, #0] + + __HAL_I2C_ENABLE(hi2c); + 80043f0: 687b ldr r3, [r7, #4] + 80043f2: 681b ldr r3, [r3, #0] + 80043f4: 681a ldr r2, [r3, #0] + 80043f6: 687b ldr r3, [r7, #4] + 80043f8: 681b ldr r3, [r3, #0] + 80043fa: f042 0201 orr.w r2, r2, #1 + 80043fe: 601a str r2, [r3, #0] + + hi2c->State = HAL_I2C_STATE_READY; + 8004400: 687b ldr r3, [r7, #4] + 8004402: 2220 movs r2, #32 + 8004404: f883 2041 strb.w r2, [r3, #65] ; 0x41 + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + 8004408: 687b ldr r3, [r7, #4] + 800440a: 2200 movs r2, #0 + 800440c: f883 2040 strb.w r2, [r3, #64] ; 0x40 + + return HAL_OK; + 8004410: 2300 movs r3, #0 + 8004412: e000 b.n 8004416 + } + else + { + return HAL_BUSY; + 8004414: 2302 movs r3, #2 + } +} + 8004416: 4618 mov r0, r3 + 8004418: 370c adds r7, #12 + 800441a: 46bd mov sp, r7 + 800441c: f85d 7b04 ldr.w r7, [sp], #4 + 8004420: 4770 bx lr + +08004422 : + * the configuration information for the specified I2Cx peripheral. + * @param DigitalFilter Coefficient of digital noise filter between Min_Data=0x00 and Max_Data=0x0F. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_I2CEx_ConfigDigitalFilter(I2C_HandleTypeDef *hi2c, uint32_t DigitalFilter) +{ + 8004422: b480 push {r7} + 8004424: b085 sub sp, #20 + 8004426: af00 add r7, sp, #0 + 8004428: 6078 str r0, [r7, #4] + 800442a: 6039 str r1, [r7, #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) + 800442c: 687b ldr r3, [r7, #4] + 800442e: f893 3041 ldrb.w r3, [r3, #65] ; 0x41 + 8004432: b2db uxtb r3, r3 + 8004434: 2b20 cmp r3, #32 + 8004436: d139 bne.n 80044ac + { + /* Process Locked */ + __HAL_LOCK(hi2c); + 8004438: 687b ldr r3, [r7, #4] + 800443a: f893 3040 ldrb.w r3, [r3, #64] ; 0x40 + 800443e: 2b01 cmp r3, #1 + 8004440: d101 bne.n 8004446 + 8004442: 2302 movs r3, #2 + 8004444: e033 b.n 80044ae + 8004446: 687b ldr r3, [r7, #4] + 8004448: 2201 movs r2, #1 + 800444a: f883 2040 strb.w r2, [r3, #64] ; 0x40 + + hi2c->State = HAL_I2C_STATE_BUSY; + 800444e: 687b ldr r3, [r7, #4] + 8004450: 2224 movs r2, #36 ; 0x24 + 8004452: f883 2041 strb.w r2, [r3, #65] ; 0x41 + + /* Disable the selected I2C peripheral */ + __HAL_I2C_DISABLE(hi2c); + 8004456: 687b ldr r3, [r7, #4] + 8004458: 681b ldr r3, [r3, #0] + 800445a: 681a ldr r2, [r3, #0] + 800445c: 687b ldr r3, [r7, #4] + 800445e: 681b ldr r3, [r3, #0] + 8004460: f022 0201 bic.w r2, r2, #1 + 8004464: 601a str r2, [r3, #0] + + /* Get the old register value */ + tmpreg = hi2c->Instance->CR1; + 8004466: 687b ldr r3, [r7, #4] + 8004468: 681b ldr r3, [r3, #0] + 800446a: 681b ldr r3, [r3, #0] + 800446c: 60fb str r3, [r7, #12] + + /* Reset I2Cx DNF bits [11:8] */ + tmpreg &= ~(I2C_CR1_DNF); + 800446e: 68fb ldr r3, [r7, #12] + 8004470: f423 6370 bic.w r3, r3, #3840 ; 0xf00 + 8004474: 60fb str r3, [r7, #12] + + /* Set I2Cx DNF coefficient */ + tmpreg |= DigitalFilter << 8U; + 8004476: 683b ldr r3, [r7, #0] + 8004478: 021b lsls r3, r3, #8 + 800447a: 68fa ldr r2, [r7, #12] + 800447c: 4313 orrs r3, r2 + 800447e: 60fb str r3, [r7, #12] + + /* Store the new register value */ + hi2c->Instance->CR1 = tmpreg; + 8004480: 687b ldr r3, [r7, #4] + 8004482: 681b ldr r3, [r3, #0] + 8004484: 68fa ldr r2, [r7, #12] + 8004486: 601a str r2, [r3, #0] + + __HAL_I2C_ENABLE(hi2c); + 8004488: 687b ldr r3, [r7, #4] + 800448a: 681b ldr r3, [r3, #0] + 800448c: 681a ldr r2, [r3, #0] + 800448e: 687b ldr r3, [r7, #4] + 8004490: 681b ldr r3, [r3, #0] + 8004492: f042 0201 orr.w r2, r2, #1 + 8004496: 601a str r2, [r3, #0] + + hi2c->State = HAL_I2C_STATE_READY; + 8004498: 687b ldr r3, [r7, #4] + 800449a: 2220 movs r2, #32 + 800449c: f883 2041 strb.w r2, [r3, #65] ; 0x41 + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + 80044a0: 687b ldr r3, [r7, #4] + 80044a2: 2200 movs r2, #0 + 80044a4: f883 2040 strb.w r2, [r3, #64] ; 0x40 + + return HAL_OK; + 80044a8: 2300 movs r3, #0 + 80044aa: e000 b.n 80044ae + } + else + { + return HAL_BUSY; + 80044ac: 2302 movs r3, #2 + } +} + 80044ae: 4618 mov r0, r3 + 80044b0: 3714 adds r7, #20 + 80044b2: 46bd mov sp, r7 + 80044b4: f85d 7b04 ldr.w r7, [sp], #4 + 80044b8: 4770 bx lr + ... + +080044bc : + * supported by this macro. User should request a transition to HSE Off + * first and then HSE On or HSE Bypass. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) +{ + 80044bc: b580 push {r7, lr} + 80044be: f5ad 7d00 sub.w sp, sp, #512 ; 0x200 + 80044c2: af00 add r7, sp, #0 + 80044c4: f507 7300 add.w r3, r7, #512 ; 0x200 + 80044c8: f5a3 73fe sub.w r3, r3, #508 ; 0x1fc + 80044cc: 6018 str r0, [r3, #0] +#if defined(RCC_CFGR_PLLSRC_HSI_PREDIV) + uint32_t pll_config2; +#endif /* RCC_CFGR_PLLSRC_HSI_PREDIV */ + + /* Check Null pointer */ + if(RCC_OscInitStruct == NULL) + 80044ce: f507 7300 add.w r3, r7, #512 ; 0x200 + 80044d2: f5a3 73fe sub.w r3, r3, #508 ; 0x1fc + 80044d6: 681b ldr r3, [r3, #0] + 80044d8: 2b00 cmp r3, #0 + 80044da: d102 bne.n 80044e2 + { + return HAL_ERROR; + 80044dc: 2301 movs r3, #1 + 80044de: f001 b823 b.w 8005528 + + /* Check the parameters */ + assert_param(IS_RCC_OSCILLATORTYPE(RCC_OscInitStruct->OscillatorType)); + + /*------------------------------- HSE Configuration ------------------------*/ + if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE) + 80044e2: f507 7300 add.w r3, r7, #512 ; 0x200 + 80044e6: f5a3 73fe sub.w r3, r3, #508 ; 0x1fc + 80044ea: 681b ldr r3, [r3, #0] + 80044ec: 681b ldr r3, [r3, #0] + 80044ee: f003 0301 and.w r3, r3, #1 + 80044f2: 2b00 cmp r3, #0 + 80044f4: f000 817d beq.w 80047f2 + { + /* Check the parameters */ + assert_param(IS_RCC_HSE(RCC_OscInitStruct->HSEState)); + + /* When the HSE is used as system clock or clock source for PLL in these cases it is not allowed to be disabled */ + if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSE) + 80044f8: 4bbc ldr r3, [pc, #752] ; (80047ec ) + 80044fa: 685b ldr r3, [r3, #4] + 80044fc: f003 030c and.w r3, r3, #12 + 8004500: 2b04 cmp r3, #4 + 8004502: d00c beq.n 800451e + || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && (__HAL_RCC_GET_PLL_OSCSOURCE() == RCC_PLLSOURCE_HSE))) + 8004504: 4bb9 ldr r3, [pc, #740] ; (80047ec ) + 8004506: 685b ldr r3, [r3, #4] + 8004508: f003 030c and.w r3, r3, #12 + 800450c: 2b08 cmp r3, #8 + 800450e: d15c bne.n 80045ca + 8004510: 4bb6 ldr r3, [pc, #728] ; (80047ec ) + 8004512: 685b ldr r3, [r3, #4] + 8004514: f403 3380 and.w r3, r3, #65536 ; 0x10000 + 8004518: f5b3 3f80 cmp.w r3, #65536 ; 0x10000 + 800451c: d155 bne.n 80045ca + 800451e: f44f 3300 mov.w r3, #131072 ; 0x20000 + 8004522: f8c7 31f0 str.w r3, [r7, #496] ; 0x1f0 + uint32_t result; + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 8004526: f8d7 31f0 ldr.w r3, [r7, #496] ; 0x1f0 + 800452a: fa93 f3a3 rbit r3, r3 + 800452e: f8c7 31ec str.w r3, [r7, #492] ; 0x1ec + result |= value & 1U; + s--; + } + result <<= s; /* shift when v's highest bits are zero */ +#endif + return result; + 8004532: f8d7 31ec ldr.w r3, [r7, #492] ; 0x1ec + { + if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF)) + 8004536: fab3 f383 clz r3, r3 + 800453a: b2db uxtb r3, r3 + 800453c: 095b lsrs r3, r3, #5 + 800453e: b2db uxtb r3, r3 + 8004540: f043 0301 orr.w r3, r3, #1 + 8004544: b2db uxtb r3, r3 + 8004546: 2b01 cmp r3, #1 + 8004548: d102 bne.n 8004550 + 800454a: 4ba8 ldr r3, [pc, #672] ; (80047ec ) + 800454c: 681b ldr r3, [r3, #0] + 800454e: e015 b.n 800457c + 8004550: f44f 3300 mov.w r3, #131072 ; 0x20000 + 8004554: f8c7 31e8 str.w r3, [r7, #488] ; 0x1e8 + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 8004558: f8d7 31e8 ldr.w r3, [r7, #488] ; 0x1e8 + 800455c: fa93 f3a3 rbit r3, r3 + 8004560: f8c7 31e4 str.w r3, [r7, #484] ; 0x1e4 + 8004564: f44f 3300 mov.w r3, #131072 ; 0x20000 + 8004568: f8c7 31e0 str.w r3, [r7, #480] ; 0x1e0 + 800456c: f8d7 31e0 ldr.w r3, [r7, #480] ; 0x1e0 + 8004570: fa93 f3a3 rbit r3, r3 + 8004574: f8c7 31dc str.w r3, [r7, #476] ; 0x1dc + 8004578: 4b9c ldr r3, [pc, #624] ; (80047ec ) + 800457a: 6a5b ldr r3, [r3, #36] ; 0x24 + 800457c: f44f 3200 mov.w r2, #131072 ; 0x20000 + 8004580: f8c7 21d8 str.w r2, [r7, #472] ; 0x1d8 + 8004584: f8d7 21d8 ldr.w r2, [r7, #472] ; 0x1d8 + 8004588: fa92 f2a2 rbit r2, r2 + 800458c: f8c7 21d4 str.w r2, [r7, #468] ; 0x1d4 + return result; + 8004590: f8d7 21d4 ldr.w r2, [r7, #468] ; 0x1d4 + 8004594: fab2 f282 clz r2, r2 + 8004598: b2d2 uxtb r2, r2 + 800459a: f042 0220 orr.w r2, r2, #32 + 800459e: b2d2 uxtb r2, r2 + 80045a0: f002 021f and.w r2, r2, #31 + 80045a4: 2101 movs r1, #1 + 80045a6: fa01 f202 lsl.w r2, r1, r2 + 80045aa: 4013 ands r3, r2 + 80045ac: 2b00 cmp r3, #0 + 80045ae: f000 811f beq.w 80047f0 + 80045b2: f507 7300 add.w r3, r7, #512 ; 0x200 + 80045b6: f5a3 73fe sub.w r3, r3, #508 ; 0x1fc + 80045ba: 681b ldr r3, [r3, #0] + 80045bc: 685b ldr r3, [r3, #4] + 80045be: 2b00 cmp r3, #0 + 80045c0: f040 8116 bne.w 80047f0 + { + return HAL_ERROR; + 80045c4: 2301 movs r3, #1 + 80045c6: f000 bfaf b.w 8005528 + } + } + else + { + /* Set the new HSE configuration ---------------------------------------*/ + __HAL_RCC_HSE_CONFIG(RCC_OscInitStruct->HSEState); + 80045ca: f507 7300 add.w r3, r7, #512 ; 0x200 + 80045ce: f5a3 73fe sub.w r3, r3, #508 ; 0x1fc + 80045d2: 681b ldr r3, [r3, #0] + 80045d4: 685b ldr r3, [r3, #4] + 80045d6: f5b3 3f80 cmp.w r3, #65536 ; 0x10000 + 80045da: d106 bne.n 80045ea + 80045dc: 4b83 ldr r3, [pc, #524] ; (80047ec ) + 80045de: 681b ldr r3, [r3, #0] + 80045e0: 4a82 ldr r2, [pc, #520] ; (80047ec ) + 80045e2: f443 3380 orr.w r3, r3, #65536 ; 0x10000 + 80045e6: 6013 str r3, [r2, #0] + 80045e8: e036 b.n 8004658 + 80045ea: f507 7300 add.w r3, r7, #512 ; 0x200 + 80045ee: f5a3 73fe sub.w r3, r3, #508 ; 0x1fc + 80045f2: 681b ldr r3, [r3, #0] + 80045f4: 685b ldr r3, [r3, #4] + 80045f6: 2b00 cmp r3, #0 + 80045f8: d10c bne.n 8004614 + 80045fa: 4b7c ldr r3, [pc, #496] ; (80047ec ) + 80045fc: 681b ldr r3, [r3, #0] + 80045fe: 4a7b ldr r2, [pc, #492] ; (80047ec ) + 8004600: f423 3380 bic.w r3, r3, #65536 ; 0x10000 + 8004604: 6013 str r3, [r2, #0] + 8004606: 4b79 ldr r3, [pc, #484] ; (80047ec ) + 8004608: 681b ldr r3, [r3, #0] + 800460a: 4a78 ldr r2, [pc, #480] ; (80047ec ) + 800460c: f423 2380 bic.w r3, r3, #262144 ; 0x40000 + 8004610: 6013 str r3, [r2, #0] + 8004612: e021 b.n 8004658 + 8004614: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004618: f5a3 73fe sub.w r3, r3, #508 ; 0x1fc + 800461c: 681b ldr r3, [r3, #0] + 800461e: 685b ldr r3, [r3, #4] + 8004620: f5b3 2fa0 cmp.w r3, #327680 ; 0x50000 + 8004624: d10c bne.n 8004640 + 8004626: 4b71 ldr r3, [pc, #452] ; (80047ec ) + 8004628: 681b ldr r3, [r3, #0] + 800462a: 4a70 ldr r2, [pc, #448] ; (80047ec ) + 800462c: f443 2380 orr.w r3, r3, #262144 ; 0x40000 + 8004630: 6013 str r3, [r2, #0] + 8004632: 4b6e ldr r3, [pc, #440] ; (80047ec ) + 8004634: 681b ldr r3, [r3, #0] + 8004636: 4a6d ldr r2, [pc, #436] ; (80047ec ) + 8004638: f443 3380 orr.w r3, r3, #65536 ; 0x10000 + 800463c: 6013 str r3, [r2, #0] + 800463e: e00b b.n 8004658 + 8004640: 4b6a ldr r3, [pc, #424] ; (80047ec ) + 8004642: 681b ldr r3, [r3, #0] + 8004644: 4a69 ldr r2, [pc, #420] ; (80047ec ) + 8004646: f423 3380 bic.w r3, r3, #65536 ; 0x10000 + 800464a: 6013 str r3, [r2, #0] + 800464c: 4b67 ldr r3, [pc, #412] ; (80047ec ) + 800464e: 681b ldr r3, [r3, #0] + 8004650: 4a66 ldr r2, [pc, #408] ; (80047ec ) + 8004652: f423 2380 bic.w r3, r3, #262144 ; 0x40000 + 8004656: 6013 str r3, [r2, #0] + +#if defined(RCC_CFGR_PLLSRC_HSI_DIV2) + /* Configure the HSE predivision factor --------------------------------*/ + __HAL_RCC_HSE_PREDIV_CONFIG(RCC_OscInitStruct->HSEPredivValue); + 8004658: 4b64 ldr r3, [pc, #400] ; (80047ec ) + 800465a: 6adb ldr r3, [r3, #44] ; 0x2c + 800465c: f023 020f bic.w r2, r3, #15 + 8004660: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004664: f5a3 73fe sub.w r3, r3, #508 ; 0x1fc + 8004668: 681b ldr r3, [r3, #0] + 800466a: 689b ldr r3, [r3, #8] + 800466c: 495f ldr r1, [pc, #380] ; (80047ec ) + 800466e: 4313 orrs r3, r2 + 8004670: 62cb str r3, [r1, #44] ; 0x2c +#endif /* RCC_CFGR_PLLSRC_HSI_DIV2 */ + + /* Check the HSE State */ + if(RCC_OscInitStruct->HSEState != RCC_HSE_OFF) + 8004672: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004676: f5a3 73fe sub.w r3, r3, #508 ; 0x1fc + 800467a: 681b ldr r3, [r3, #0] + 800467c: 685b ldr r3, [r3, #4] + 800467e: 2b00 cmp r3, #0 + 8004680: d059 beq.n 8004736 + { + /* Get Start Tick */ + tickstart = HAL_GetTick(); + 8004682: f7fd fdef bl 8002264 + 8004686: f8c7 01f8 str.w r0, [r7, #504] ; 0x1f8 + + /* Wait till HSE is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) + 800468a: e00a b.n 80046a2 + { + if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) + 800468c: f7fd fdea bl 8002264 + 8004690: 4602 mov r2, r0 + 8004692: f8d7 31f8 ldr.w r3, [r7, #504] ; 0x1f8 + 8004696: 1ad3 subs r3, r2, r3 + 8004698: 2b64 cmp r3, #100 ; 0x64 + 800469a: d902 bls.n 80046a2 + { + return HAL_TIMEOUT; + 800469c: 2303 movs r3, #3 + 800469e: f000 bf43 b.w 8005528 + 80046a2: f44f 3300 mov.w r3, #131072 ; 0x20000 + 80046a6: f8c7 31d0 str.w r3, [r7, #464] ; 0x1d0 + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 80046aa: f8d7 31d0 ldr.w r3, [r7, #464] ; 0x1d0 + 80046ae: fa93 f3a3 rbit r3, r3 + 80046b2: f8c7 31cc str.w r3, [r7, #460] ; 0x1cc + return result; + 80046b6: f8d7 31cc ldr.w r3, [r7, #460] ; 0x1cc + while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) + 80046ba: fab3 f383 clz r3, r3 + 80046be: b2db uxtb r3, r3 + 80046c0: 095b lsrs r3, r3, #5 + 80046c2: b2db uxtb r3, r3 + 80046c4: f043 0301 orr.w r3, r3, #1 + 80046c8: b2db uxtb r3, r3 + 80046ca: 2b01 cmp r3, #1 + 80046cc: d102 bne.n 80046d4 + 80046ce: 4b47 ldr r3, [pc, #284] ; (80047ec ) + 80046d0: 681b ldr r3, [r3, #0] + 80046d2: e015 b.n 8004700 + 80046d4: f44f 3300 mov.w r3, #131072 ; 0x20000 + 80046d8: f8c7 31c8 str.w r3, [r7, #456] ; 0x1c8 + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 80046dc: f8d7 31c8 ldr.w r3, [r7, #456] ; 0x1c8 + 80046e0: fa93 f3a3 rbit r3, r3 + 80046e4: f8c7 31c4 str.w r3, [r7, #452] ; 0x1c4 + 80046e8: f44f 3300 mov.w r3, #131072 ; 0x20000 + 80046ec: f8c7 31c0 str.w r3, [r7, #448] ; 0x1c0 + 80046f0: f8d7 31c0 ldr.w r3, [r7, #448] ; 0x1c0 + 80046f4: fa93 f3a3 rbit r3, r3 + 80046f8: f8c7 31bc str.w r3, [r7, #444] ; 0x1bc + 80046fc: 4b3b ldr r3, [pc, #236] ; (80047ec ) + 80046fe: 6a5b ldr r3, [r3, #36] ; 0x24 + 8004700: f44f 3200 mov.w r2, #131072 ; 0x20000 + 8004704: f8c7 21b8 str.w r2, [r7, #440] ; 0x1b8 + 8004708: f8d7 21b8 ldr.w r2, [r7, #440] ; 0x1b8 + 800470c: fa92 f2a2 rbit r2, r2 + 8004710: f8c7 21b4 str.w r2, [r7, #436] ; 0x1b4 + return result; + 8004714: f8d7 21b4 ldr.w r2, [r7, #436] ; 0x1b4 + 8004718: fab2 f282 clz r2, r2 + 800471c: b2d2 uxtb r2, r2 + 800471e: f042 0220 orr.w r2, r2, #32 + 8004722: b2d2 uxtb r2, r2 + 8004724: f002 021f and.w r2, r2, #31 + 8004728: 2101 movs r1, #1 + 800472a: fa01 f202 lsl.w r2, r1, r2 + 800472e: 4013 ands r3, r2 + 8004730: 2b00 cmp r3, #0 + 8004732: d0ab beq.n 800468c + 8004734: e05d b.n 80047f2 + } + } + else + { + /* Get Start Tick */ + tickstart = HAL_GetTick(); + 8004736: f7fd fd95 bl 8002264 + 800473a: f8c7 01f8 str.w r0, [r7, #504] ; 0x1f8 + + /* Wait till HSE is disabled */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) + 800473e: e00a b.n 8004756 + { + if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) + 8004740: f7fd fd90 bl 8002264 + 8004744: 4602 mov r2, r0 + 8004746: f8d7 31f8 ldr.w r3, [r7, #504] ; 0x1f8 + 800474a: 1ad3 subs r3, r2, r3 + 800474c: 2b64 cmp r3, #100 ; 0x64 + 800474e: d902 bls.n 8004756 + { + return HAL_TIMEOUT; + 8004750: 2303 movs r3, #3 + 8004752: f000 bee9 b.w 8005528 + 8004756: f44f 3300 mov.w r3, #131072 ; 0x20000 + 800475a: f8c7 31b0 str.w r3, [r7, #432] ; 0x1b0 + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 800475e: f8d7 31b0 ldr.w r3, [r7, #432] ; 0x1b0 + 8004762: fa93 f3a3 rbit r3, r3 + 8004766: f8c7 31ac str.w r3, [r7, #428] ; 0x1ac + return result; + 800476a: f8d7 31ac ldr.w r3, [r7, #428] ; 0x1ac + while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) + 800476e: fab3 f383 clz r3, r3 + 8004772: b2db uxtb r3, r3 + 8004774: 095b lsrs r3, r3, #5 + 8004776: b2db uxtb r3, r3 + 8004778: f043 0301 orr.w r3, r3, #1 + 800477c: b2db uxtb r3, r3 + 800477e: 2b01 cmp r3, #1 + 8004780: d102 bne.n 8004788 + 8004782: 4b1a ldr r3, [pc, #104] ; (80047ec ) + 8004784: 681b ldr r3, [r3, #0] + 8004786: e015 b.n 80047b4 + 8004788: f44f 3300 mov.w r3, #131072 ; 0x20000 + 800478c: f8c7 31a8 str.w r3, [r7, #424] ; 0x1a8 + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 8004790: f8d7 31a8 ldr.w r3, [r7, #424] ; 0x1a8 + 8004794: fa93 f3a3 rbit r3, r3 + 8004798: f8c7 31a4 str.w r3, [r7, #420] ; 0x1a4 + 800479c: f44f 3300 mov.w r3, #131072 ; 0x20000 + 80047a0: f8c7 31a0 str.w r3, [r7, #416] ; 0x1a0 + 80047a4: f8d7 31a0 ldr.w r3, [r7, #416] ; 0x1a0 + 80047a8: fa93 f3a3 rbit r3, r3 + 80047ac: f8c7 319c str.w r3, [r7, #412] ; 0x19c + 80047b0: 4b0e ldr r3, [pc, #56] ; (80047ec ) + 80047b2: 6a5b ldr r3, [r3, #36] ; 0x24 + 80047b4: f44f 3200 mov.w r2, #131072 ; 0x20000 + 80047b8: f8c7 2198 str.w r2, [r7, #408] ; 0x198 + 80047bc: f8d7 2198 ldr.w r2, [r7, #408] ; 0x198 + 80047c0: fa92 f2a2 rbit r2, r2 + 80047c4: f8c7 2194 str.w r2, [r7, #404] ; 0x194 + return result; + 80047c8: f8d7 2194 ldr.w r2, [r7, #404] ; 0x194 + 80047cc: fab2 f282 clz r2, r2 + 80047d0: b2d2 uxtb r2, r2 + 80047d2: f042 0220 orr.w r2, r2, #32 + 80047d6: b2d2 uxtb r2, r2 + 80047d8: f002 021f and.w r2, r2, #31 + 80047dc: 2101 movs r1, #1 + 80047de: fa01 f202 lsl.w r2, r1, r2 + 80047e2: 4013 ands r3, r2 + 80047e4: 2b00 cmp r3, #0 + 80047e6: d1ab bne.n 8004740 + 80047e8: e003 b.n 80047f2 + 80047ea: bf00 nop + 80047ec: 40021000 .word 0x40021000 + if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF)) + 80047f0: bf00 nop + } + } + } + } + /*----------------------------- HSI Configuration --------------------------*/ + if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI) + 80047f2: f507 7300 add.w r3, r7, #512 ; 0x200 + 80047f6: f5a3 73fe sub.w r3, r3, #508 ; 0x1fc + 80047fa: 681b ldr r3, [r3, #0] + 80047fc: 681b ldr r3, [r3, #0] + 80047fe: f003 0302 and.w r3, r3, #2 + 8004802: 2b00 cmp r3, #0 + 8004804: f000 817d beq.w 8004b02 + /* Check the parameters */ + assert_param(IS_RCC_HSI(RCC_OscInitStruct->HSIState)); + assert_param(IS_RCC_CALIBRATION_VALUE(RCC_OscInitStruct->HSICalibrationValue)); + + /* Check if HSI is used as system clock or as PLL source when PLL is selected as system clock */ + if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSI) + 8004808: 4ba6 ldr r3, [pc, #664] ; (8004aa4 ) + 800480a: 685b ldr r3, [r3, #4] + 800480c: f003 030c and.w r3, r3, #12 + 8004810: 2b00 cmp r3, #0 + 8004812: d00b beq.n 800482c + || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && (__HAL_RCC_GET_PLL_OSCSOURCE() == RCC_PLLSOURCE_HSI))) + 8004814: 4ba3 ldr r3, [pc, #652] ; (8004aa4 ) + 8004816: 685b ldr r3, [r3, #4] + 8004818: f003 030c and.w r3, r3, #12 + 800481c: 2b08 cmp r3, #8 + 800481e: d172 bne.n 8004906 + 8004820: 4ba0 ldr r3, [pc, #640] ; (8004aa4 ) + 8004822: 685b ldr r3, [r3, #4] + 8004824: f403 3380 and.w r3, r3, #65536 ; 0x10000 + 8004828: 2b00 cmp r3, #0 + 800482a: d16c bne.n 8004906 + 800482c: 2302 movs r3, #2 + 800482e: f8c7 3190 str.w r3, [r7, #400] ; 0x190 + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 8004832: f8d7 3190 ldr.w r3, [r7, #400] ; 0x190 + 8004836: fa93 f3a3 rbit r3, r3 + 800483a: f8c7 318c str.w r3, [r7, #396] ; 0x18c + return result; + 800483e: f8d7 318c ldr.w r3, [r7, #396] ; 0x18c + { + /* 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)) + 8004842: fab3 f383 clz r3, r3 + 8004846: b2db uxtb r3, r3 + 8004848: 095b lsrs r3, r3, #5 + 800484a: b2db uxtb r3, r3 + 800484c: f043 0301 orr.w r3, r3, #1 + 8004850: b2db uxtb r3, r3 + 8004852: 2b01 cmp r3, #1 + 8004854: d102 bne.n 800485c + 8004856: 4b93 ldr r3, [pc, #588] ; (8004aa4 ) + 8004858: 681b ldr r3, [r3, #0] + 800485a: e013 b.n 8004884 + 800485c: 2302 movs r3, #2 + 800485e: f8c7 3188 str.w r3, [r7, #392] ; 0x188 + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 8004862: f8d7 3188 ldr.w r3, [r7, #392] ; 0x188 + 8004866: fa93 f3a3 rbit r3, r3 + 800486a: f8c7 3184 str.w r3, [r7, #388] ; 0x184 + 800486e: 2302 movs r3, #2 + 8004870: f8c7 3180 str.w r3, [r7, #384] ; 0x180 + 8004874: f8d7 3180 ldr.w r3, [r7, #384] ; 0x180 + 8004878: fa93 f3a3 rbit r3, r3 + 800487c: f8c7 317c str.w r3, [r7, #380] ; 0x17c + 8004880: 4b88 ldr r3, [pc, #544] ; (8004aa4 ) + 8004882: 6a5b ldr r3, [r3, #36] ; 0x24 + 8004884: 2202 movs r2, #2 + 8004886: f8c7 2178 str.w r2, [r7, #376] ; 0x178 + 800488a: f8d7 2178 ldr.w r2, [r7, #376] ; 0x178 + 800488e: fa92 f2a2 rbit r2, r2 + 8004892: f8c7 2174 str.w r2, [r7, #372] ; 0x174 + return result; + 8004896: f8d7 2174 ldr.w r2, [r7, #372] ; 0x174 + 800489a: fab2 f282 clz r2, r2 + 800489e: b2d2 uxtb r2, r2 + 80048a0: f042 0220 orr.w r2, r2, #32 + 80048a4: b2d2 uxtb r2, r2 + 80048a6: f002 021f and.w r2, r2, #31 + 80048aa: 2101 movs r1, #1 + 80048ac: fa01 f202 lsl.w r2, r1, r2 + 80048b0: 4013 ands r3, r2 + 80048b2: 2b00 cmp r3, #0 + 80048b4: d00a beq.n 80048cc + 80048b6: f507 7300 add.w r3, r7, #512 ; 0x200 + 80048ba: f5a3 73fe sub.w r3, r3, #508 ; 0x1fc + 80048be: 681b ldr r3, [r3, #0] + 80048c0: 691b ldr r3, [r3, #16] + 80048c2: 2b01 cmp r3, #1 + 80048c4: d002 beq.n 80048cc + { + return HAL_ERROR; + 80048c6: 2301 movs r3, #1 + 80048c8: f000 be2e b.w 8005528 + } + /* Otherwise, just the calibration is allowed */ + else + { + /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/ + __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); + 80048cc: 4b75 ldr r3, [pc, #468] ; (8004aa4 ) + 80048ce: 681b ldr r3, [r3, #0] + 80048d0: f023 02f8 bic.w r2, r3, #248 ; 0xf8 + 80048d4: f507 7300 add.w r3, r7, #512 ; 0x200 + 80048d8: f5a3 73fe sub.w r3, r3, #508 ; 0x1fc + 80048dc: 681b ldr r3, [r3, #0] + 80048de: 695b ldr r3, [r3, #20] + 80048e0: 21f8 movs r1, #248 ; 0xf8 + 80048e2: f8c7 1170 str.w r1, [r7, #368] ; 0x170 + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 80048e6: f8d7 1170 ldr.w r1, [r7, #368] ; 0x170 + 80048ea: fa91 f1a1 rbit r1, r1 + 80048ee: f8c7 116c str.w r1, [r7, #364] ; 0x16c + return result; + 80048f2: f8d7 116c ldr.w r1, [r7, #364] ; 0x16c + 80048f6: fab1 f181 clz r1, r1 + 80048fa: b2c9 uxtb r1, r1 + 80048fc: 408b lsls r3, r1 + 80048fe: 4969 ldr r1, [pc, #420] ; (8004aa4 ) + 8004900: 4313 orrs r3, r2 + 8004902: 600b str r3, [r1, #0] + if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) && (RCC_OscInitStruct->HSIState != RCC_HSI_ON)) + 8004904: e0fd b.n 8004b02 + } + } + else + { + /* Check the HSI State */ + if(RCC_OscInitStruct->HSIState != RCC_HSI_OFF) + 8004906: f507 7300 add.w r3, r7, #512 ; 0x200 + 800490a: f5a3 73fe sub.w r3, r3, #508 ; 0x1fc + 800490e: 681b ldr r3, [r3, #0] + 8004910: 691b ldr r3, [r3, #16] + 8004912: 2b00 cmp r3, #0 + 8004914: f000 8088 beq.w 8004a28 + 8004918: 2301 movs r3, #1 + 800491a: f8c7 3168 str.w r3, [r7, #360] ; 0x168 + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 800491e: f8d7 3168 ldr.w r3, [r7, #360] ; 0x168 + 8004922: fa93 f3a3 rbit r3, r3 + 8004926: f8c7 3164 str.w r3, [r7, #356] ; 0x164 + return result; + 800492a: f8d7 3164 ldr.w r3, [r7, #356] ; 0x164 + { + /* Enable the Internal High Speed oscillator (HSI). */ + __HAL_RCC_HSI_ENABLE(); + 800492e: fab3 f383 clz r3, r3 + 8004932: b2db uxtb r3, r3 + 8004934: f103 5384 add.w r3, r3, #276824064 ; 0x10800000 + 8004938: f503 1384 add.w r3, r3, #1081344 ; 0x108000 + 800493c: 009b lsls r3, r3, #2 + 800493e: 461a mov r2, r3 + 8004940: 2301 movs r3, #1 + 8004942: 6013 str r3, [r2, #0] + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + 8004944: f7fd fc8e bl 8002264 + 8004948: f8c7 01f8 str.w r0, [r7, #504] ; 0x1f8 + + /* Wait till HSI is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) + 800494c: e00a b.n 8004964 + { + if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) + 800494e: f7fd fc89 bl 8002264 + 8004952: 4602 mov r2, r0 + 8004954: f8d7 31f8 ldr.w r3, [r7, #504] ; 0x1f8 + 8004958: 1ad3 subs r3, r2, r3 + 800495a: 2b02 cmp r3, #2 + 800495c: d902 bls.n 8004964 + { + return HAL_TIMEOUT; + 800495e: 2303 movs r3, #3 + 8004960: f000 bde2 b.w 8005528 + 8004964: 2302 movs r3, #2 + 8004966: f8c7 3160 str.w r3, [r7, #352] ; 0x160 + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 800496a: f8d7 3160 ldr.w r3, [r7, #352] ; 0x160 + 800496e: fa93 f3a3 rbit r3, r3 + 8004972: f8c7 315c str.w r3, [r7, #348] ; 0x15c + return result; + 8004976: f8d7 315c ldr.w r3, [r7, #348] ; 0x15c + while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) + 800497a: fab3 f383 clz r3, r3 + 800497e: b2db uxtb r3, r3 + 8004980: 095b lsrs r3, r3, #5 + 8004982: b2db uxtb r3, r3 + 8004984: f043 0301 orr.w r3, r3, #1 + 8004988: b2db uxtb r3, r3 + 800498a: 2b01 cmp r3, #1 + 800498c: d102 bne.n 8004994 + 800498e: 4b45 ldr r3, [pc, #276] ; (8004aa4 ) + 8004990: 681b ldr r3, [r3, #0] + 8004992: e013 b.n 80049bc + 8004994: 2302 movs r3, #2 + 8004996: f8c7 3158 str.w r3, [r7, #344] ; 0x158 + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 800499a: f8d7 3158 ldr.w r3, [r7, #344] ; 0x158 + 800499e: fa93 f3a3 rbit r3, r3 + 80049a2: f8c7 3154 str.w r3, [r7, #340] ; 0x154 + 80049a6: 2302 movs r3, #2 + 80049a8: f8c7 3150 str.w r3, [r7, #336] ; 0x150 + 80049ac: f8d7 3150 ldr.w r3, [r7, #336] ; 0x150 + 80049b0: fa93 f3a3 rbit r3, r3 + 80049b4: f8c7 314c str.w r3, [r7, #332] ; 0x14c + 80049b8: 4b3a ldr r3, [pc, #232] ; (8004aa4 ) + 80049ba: 6a5b ldr r3, [r3, #36] ; 0x24 + 80049bc: 2202 movs r2, #2 + 80049be: f8c7 2148 str.w r2, [r7, #328] ; 0x148 + 80049c2: f8d7 2148 ldr.w r2, [r7, #328] ; 0x148 + 80049c6: fa92 f2a2 rbit r2, r2 + 80049ca: f8c7 2144 str.w r2, [r7, #324] ; 0x144 + return result; + 80049ce: f8d7 2144 ldr.w r2, [r7, #324] ; 0x144 + 80049d2: fab2 f282 clz r2, r2 + 80049d6: b2d2 uxtb r2, r2 + 80049d8: f042 0220 orr.w r2, r2, #32 + 80049dc: b2d2 uxtb r2, r2 + 80049de: f002 021f and.w r2, r2, #31 + 80049e2: 2101 movs r1, #1 + 80049e4: fa01 f202 lsl.w r2, r1, r2 + 80049e8: 4013 ands r3, r2 + 80049ea: 2b00 cmp r3, #0 + 80049ec: d0af beq.n 800494e + } + } + + /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/ + __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); + 80049ee: 4b2d ldr r3, [pc, #180] ; (8004aa4 ) + 80049f0: 681b ldr r3, [r3, #0] + 80049f2: f023 02f8 bic.w r2, r3, #248 ; 0xf8 + 80049f6: f507 7300 add.w r3, r7, #512 ; 0x200 + 80049fa: f5a3 73fe sub.w r3, r3, #508 ; 0x1fc + 80049fe: 681b ldr r3, [r3, #0] + 8004a00: 695b ldr r3, [r3, #20] + 8004a02: 21f8 movs r1, #248 ; 0xf8 + 8004a04: f8c7 1140 str.w r1, [r7, #320] ; 0x140 + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 8004a08: f8d7 1140 ldr.w r1, [r7, #320] ; 0x140 + 8004a0c: fa91 f1a1 rbit r1, r1 + 8004a10: f8c7 113c str.w r1, [r7, #316] ; 0x13c + return result; + 8004a14: f8d7 113c ldr.w r1, [r7, #316] ; 0x13c + 8004a18: fab1 f181 clz r1, r1 + 8004a1c: b2c9 uxtb r1, r1 + 8004a1e: 408b lsls r3, r1 + 8004a20: 4920 ldr r1, [pc, #128] ; (8004aa4 ) + 8004a22: 4313 orrs r3, r2 + 8004a24: 600b str r3, [r1, #0] + 8004a26: e06c b.n 8004b02 + 8004a28: 2301 movs r3, #1 + 8004a2a: f8c7 3138 str.w r3, [r7, #312] ; 0x138 + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 8004a2e: f8d7 3138 ldr.w r3, [r7, #312] ; 0x138 + 8004a32: fa93 f3a3 rbit r3, r3 + 8004a36: f8c7 3134 str.w r3, [r7, #308] ; 0x134 + return result; + 8004a3a: f8d7 3134 ldr.w r3, [r7, #308] ; 0x134 + } + else + { + /* Disable the Internal High Speed oscillator (HSI). */ + __HAL_RCC_HSI_DISABLE(); + 8004a3e: fab3 f383 clz r3, r3 + 8004a42: b2db uxtb r3, r3 + 8004a44: f103 5384 add.w r3, r3, #276824064 ; 0x10800000 + 8004a48: f503 1384 add.w r3, r3, #1081344 ; 0x108000 + 8004a4c: 009b lsls r3, r3, #2 + 8004a4e: 461a mov r2, r3 + 8004a50: 2300 movs r3, #0 + 8004a52: 6013 str r3, [r2, #0] + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + 8004a54: f7fd fc06 bl 8002264 + 8004a58: f8c7 01f8 str.w r0, [r7, #504] ; 0x1f8 + + /* Wait till HSI is disabled */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) + 8004a5c: e00a b.n 8004a74 + { + if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) + 8004a5e: f7fd fc01 bl 8002264 + 8004a62: 4602 mov r2, r0 + 8004a64: f8d7 31f8 ldr.w r3, [r7, #504] ; 0x1f8 + 8004a68: 1ad3 subs r3, r2, r3 + 8004a6a: 2b02 cmp r3, #2 + 8004a6c: d902 bls.n 8004a74 + { + return HAL_TIMEOUT; + 8004a6e: 2303 movs r3, #3 + 8004a70: f000 bd5a b.w 8005528 + 8004a74: 2302 movs r3, #2 + 8004a76: f8c7 3130 str.w r3, [r7, #304] ; 0x130 + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 8004a7a: f8d7 3130 ldr.w r3, [r7, #304] ; 0x130 + 8004a7e: fa93 f3a3 rbit r3, r3 + 8004a82: f8c7 312c str.w r3, [r7, #300] ; 0x12c + return result; + 8004a86: f8d7 312c ldr.w r3, [r7, #300] ; 0x12c + while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) + 8004a8a: fab3 f383 clz r3, r3 + 8004a8e: b2db uxtb r3, r3 + 8004a90: 095b lsrs r3, r3, #5 + 8004a92: b2db uxtb r3, r3 + 8004a94: f043 0301 orr.w r3, r3, #1 + 8004a98: b2db uxtb r3, r3 + 8004a9a: 2b01 cmp r3, #1 + 8004a9c: d104 bne.n 8004aa8 + 8004a9e: 4b01 ldr r3, [pc, #4] ; (8004aa4 ) + 8004aa0: 681b ldr r3, [r3, #0] + 8004aa2: e015 b.n 8004ad0 + 8004aa4: 40021000 .word 0x40021000 + 8004aa8: 2302 movs r3, #2 + 8004aaa: f8c7 3128 str.w r3, [r7, #296] ; 0x128 + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 8004aae: f8d7 3128 ldr.w r3, [r7, #296] ; 0x128 + 8004ab2: fa93 f3a3 rbit r3, r3 + 8004ab6: f8c7 3124 str.w r3, [r7, #292] ; 0x124 + 8004aba: 2302 movs r3, #2 + 8004abc: f8c7 3120 str.w r3, [r7, #288] ; 0x120 + 8004ac0: f8d7 3120 ldr.w r3, [r7, #288] ; 0x120 + 8004ac4: fa93 f3a3 rbit r3, r3 + 8004ac8: f8c7 311c str.w r3, [r7, #284] ; 0x11c + 8004acc: 4bc8 ldr r3, [pc, #800] ; (8004df0 ) + 8004ace: 6a5b ldr r3, [r3, #36] ; 0x24 + 8004ad0: 2202 movs r2, #2 + 8004ad2: f8c7 2118 str.w r2, [r7, #280] ; 0x118 + 8004ad6: f8d7 2118 ldr.w r2, [r7, #280] ; 0x118 + 8004ada: fa92 f2a2 rbit r2, r2 + 8004ade: f8c7 2114 str.w r2, [r7, #276] ; 0x114 + return result; + 8004ae2: f8d7 2114 ldr.w r2, [r7, #276] ; 0x114 + 8004ae6: fab2 f282 clz r2, r2 + 8004aea: b2d2 uxtb r2, r2 + 8004aec: f042 0220 orr.w r2, r2, #32 + 8004af0: b2d2 uxtb r2, r2 + 8004af2: f002 021f and.w r2, r2, #31 + 8004af6: 2101 movs r1, #1 + 8004af8: fa01 f202 lsl.w r2, r1, r2 + 8004afc: 4013 ands r3, r2 + 8004afe: 2b00 cmp r3, #0 + 8004b00: d1ad bne.n 8004a5e + } + } + } + } + /*------------------------------ LSI Configuration -------------------------*/ + if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI) + 8004b02: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004b06: f5a3 73fe sub.w r3, r3, #508 ; 0x1fc + 8004b0a: 681b ldr r3, [r3, #0] + 8004b0c: 681b ldr r3, [r3, #0] + 8004b0e: f003 0308 and.w r3, r3, #8 + 8004b12: 2b00 cmp r3, #0 + 8004b14: f000 8110 beq.w 8004d38 + { + /* Check the parameters */ + assert_param(IS_RCC_LSI(RCC_OscInitStruct->LSIState)); + + /* Check the LSI State */ + if(RCC_OscInitStruct->LSIState != RCC_LSI_OFF) + 8004b18: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004b1c: f5a3 73fe sub.w r3, r3, #508 ; 0x1fc + 8004b20: 681b ldr r3, [r3, #0] + 8004b22: 699b ldr r3, [r3, #24] + 8004b24: 2b00 cmp r3, #0 + 8004b26: d079 beq.n 8004c1c + 8004b28: 2301 movs r3, #1 + 8004b2a: f8c7 3110 str.w r3, [r7, #272] ; 0x110 + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 8004b2e: f8d7 3110 ldr.w r3, [r7, #272] ; 0x110 + 8004b32: fa93 f3a3 rbit r3, r3 + 8004b36: f8c7 310c str.w r3, [r7, #268] ; 0x10c + return result; + 8004b3a: f8d7 310c ldr.w r3, [r7, #268] ; 0x10c + { + /* Enable the Internal Low Speed oscillator (LSI). */ + __HAL_RCC_LSI_ENABLE(); + 8004b3e: fab3 f383 clz r3, r3 + 8004b42: b2db uxtb r3, r3 + 8004b44: 461a mov r2, r3 + 8004b46: 4bab ldr r3, [pc, #684] ; (8004df4 ) + 8004b48: 4413 add r3, r2 + 8004b4a: 009b lsls r3, r3, #2 + 8004b4c: 461a mov r2, r3 + 8004b4e: 2301 movs r3, #1 + 8004b50: 6013 str r3, [r2, #0] + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + 8004b52: f7fd fb87 bl 8002264 + 8004b56: f8c7 01f8 str.w r0, [r7, #504] ; 0x1f8 + + /* Wait till LSI is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) + 8004b5a: e00a b.n 8004b72 + { + if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) + 8004b5c: f7fd fb82 bl 8002264 + 8004b60: 4602 mov r2, r0 + 8004b62: f8d7 31f8 ldr.w r3, [r7, #504] ; 0x1f8 + 8004b66: 1ad3 subs r3, r2, r3 + 8004b68: 2b02 cmp r3, #2 + 8004b6a: d902 bls.n 8004b72 + { + return HAL_TIMEOUT; + 8004b6c: 2303 movs r3, #3 + 8004b6e: f000 bcdb b.w 8005528 + 8004b72: 2302 movs r3, #2 + 8004b74: f8c7 3108 str.w r3, [r7, #264] ; 0x108 + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 8004b78: f8d7 3108 ldr.w r3, [r7, #264] ; 0x108 + 8004b7c: fa93 f3a3 rbit r3, r3 + 8004b80: f8c7 3104 str.w r3, [r7, #260] ; 0x104 + 8004b84: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004b88: f5a3 7380 sub.w r3, r3, #256 ; 0x100 + 8004b8c: 2202 movs r2, #2 + 8004b8e: 601a str r2, [r3, #0] + 8004b90: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004b94: f5a3 7380 sub.w r3, r3, #256 ; 0x100 + 8004b98: 681b ldr r3, [r3, #0] + 8004b9a: fa93 f2a3 rbit r2, r3 + 8004b9e: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004ba2: f5a3 7382 sub.w r3, r3, #260 ; 0x104 + 8004ba6: 601a str r2, [r3, #0] + 8004ba8: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004bac: f5a3 7384 sub.w r3, r3, #264 ; 0x108 + 8004bb0: 2202 movs r2, #2 + 8004bb2: 601a str r2, [r3, #0] + 8004bb4: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004bb8: f5a3 7384 sub.w r3, r3, #264 ; 0x108 + 8004bbc: 681b ldr r3, [r3, #0] + 8004bbe: fa93 f2a3 rbit r2, r3 + 8004bc2: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004bc6: f5a3 7386 sub.w r3, r3, #268 ; 0x10c + 8004bca: 601a str r2, [r3, #0] + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) + 8004bcc: 4b88 ldr r3, [pc, #544] ; (8004df0 ) + 8004bce: 6a5a ldr r2, [r3, #36] ; 0x24 + 8004bd0: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004bd4: f5a3 7388 sub.w r3, r3, #272 ; 0x110 + 8004bd8: 2102 movs r1, #2 + 8004bda: 6019 str r1, [r3, #0] + 8004bdc: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004be0: f5a3 7388 sub.w r3, r3, #272 ; 0x110 + 8004be4: 681b ldr r3, [r3, #0] + 8004be6: fa93 f1a3 rbit r1, r3 + 8004bea: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004bee: f5a3 738a sub.w r3, r3, #276 ; 0x114 + 8004bf2: 6019 str r1, [r3, #0] + return result; + 8004bf4: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004bf8: f5a3 738a sub.w r3, r3, #276 ; 0x114 + 8004bfc: 681b ldr r3, [r3, #0] + 8004bfe: fab3 f383 clz r3, r3 + 8004c02: b2db uxtb r3, r3 + 8004c04: f043 0360 orr.w r3, r3, #96 ; 0x60 + 8004c08: b2db uxtb r3, r3 + 8004c0a: f003 031f and.w r3, r3, #31 + 8004c0e: 2101 movs r1, #1 + 8004c10: fa01 f303 lsl.w r3, r1, r3 + 8004c14: 4013 ands r3, r2 + 8004c16: 2b00 cmp r3, #0 + 8004c18: d0a0 beq.n 8004b5c + 8004c1a: e08d b.n 8004d38 + 8004c1c: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004c20: f5a3 738c sub.w r3, r3, #280 ; 0x118 + 8004c24: 2201 movs r2, #1 + 8004c26: 601a str r2, [r3, #0] + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 8004c28: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004c2c: f5a3 738c sub.w r3, r3, #280 ; 0x118 + 8004c30: 681b ldr r3, [r3, #0] + 8004c32: fa93 f2a3 rbit r2, r3 + 8004c36: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004c3a: f5a3 738e sub.w r3, r3, #284 ; 0x11c + 8004c3e: 601a str r2, [r3, #0] + return result; + 8004c40: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004c44: f5a3 738e sub.w r3, r3, #284 ; 0x11c + 8004c48: 681b ldr r3, [r3, #0] + } + } + else + { + /* Disable the Internal Low Speed oscillator (LSI). */ + __HAL_RCC_LSI_DISABLE(); + 8004c4a: fab3 f383 clz r3, r3 + 8004c4e: b2db uxtb r3, r3 + 8004c50: 461a mov r2, r3 + 8004c52: 4b68 ldr r3, [pc, #416] ; (8004df4 ) + 8004c54: 4413 add r3, r2 + 8004c56: 009b lsls r3, r3, #2 + 8004c58: 461a mov r2, r3 + 8004c5a: 2300 movs r3, #0 + 8004c5c: 6013 str r3, [r2, #0] + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + 8004c5e: f7fd fb01 bl 8002264 + 8004c62: f8c7 01f8 str.w r0, [r7, #504] ; 0x1f8 + + /* Wait till LSI is disabled */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET) + 8004c66: e00a b.n 8004c7e + { + if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) + 8004c68: f7fd fafc bl 8002264 + 8004c6c: 4602 mov r2, r0 + 8004c6e: f8d7 31f8 ldr.w r3, [r7, #504] ; 0x1f8 + 8004c72: 1ad3 subs r3, r2, r3 + 8004c74: 2b02 cmp r3, #2 + 8004c76: d902 bls.n 8004c7e + { + return HAL_TIMEOUT; + 8004c78: 2303 movs r3, #3 + 8004c7a: f000 bc55 b.w 8005528 + 8004c7e: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004c82: f5a3 7390 sub.w r3, r3, #288 ; 0x120 + 8004c86: 2202 movs r2, #2 + 8004c88: 601a str r2, [r3, #0] + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 8004c8a: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004c8e: f5a3 7390 sub.w r3, r3, #288 ; 0x120 + 8004c92: 681b ldr r3, [r3, #0] + 8004c94: fa93 f2a3 rbit r2, r3 + 8004c98: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004c9c: f5a3 7392 sub.w r3, r3, #292 ; 0x124 + 8004ca0: 601a str r2, [r3, #0] + 8004ca2: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004ca6: f5a3 7394 sub.w r3, r3, #296 ; 0x128 + 8004caa: 2202 movs r2, #2 + 8004cac: 601a str r2, [r3, #0] + 8004cae: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004cb2: f5a3 7394 sub.w r3, r3, #296 ; 0x128 + 8004cb6: 681b ldr r3, [r3, #0] + 8004cb8: fa93 f2a3 rbit r2, r3 + 8004cbc: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004cc0: f5a3 7396 sub.w r3, r3, #300 ; 0x12c + 8004cc4: 601a str r2, [r3, #0] + 8004cc6: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004cca: f5a3 7398 sub.w r3, r3, #304 ; 0x130 + 8004cce: 2202 movs r2, #2 + 8004cd0: 601a str r2, [r3, #0] + 8004cd2: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004cd6: f5a3 7398 sub.w r3, r3, #304 ; 0x130 + 8004cda: 681b ldr r3, [r3, #0] + 8004cdc: fa93 f2a3 rbit r2, r3 + 8004ce0: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004ce4: f5a3 739a sub.w r3, r3, #308 ; 0x134 + 8004ce8: 601a str r2, [r3, #0] + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET) + 8004cea: 4b41 ldr r3, [pc, #260] ; (8004df0 ) + 8004cec: 6a5a ldr r2, [r3, #36] ; 0x24 + 8004cee: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004cf2: f5a3 739c sub.w r3, r3, #312 ; 0x138 + 8004cf6: 2102 movs r1, #2 + 8004cf8: 6019 str r1, [r3, #0] + 8004cfa: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004cfe: f5a3 739c sub.w r3, r3, #312 ; 0x138 + 8004d02: 681b ldr r3, [r3, #0] + 8004d04: fa93 f1a3 rbit r1, r3 + 8004d08: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004d0c: f5a3 739e sub.w r3, r3, #316 ; 0x13c + 8004d10: 6019 str r1, [r3, #0] + return result; + 8004d12: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004d16: f5a3 739e sub.w r3, r3, #316 ; 0x13c + 8004d1a: 681b ldr r3, [r3, #0] + 8004d1c: fab3 f383 clz r3, r3 + 8004d20: b2db uxtb r3, r3 + 8004d22: f043 0360 orr.w r3, r3, #96 ; 0x60 + 8004d26: b2db uxtb r3, r3 + 8004d28: f003 031f and.w r3, r3, #31 + 8004d2c: 2101 movs r1, #1 + 8004d2e: fa01 f303 lsl.w r3, r1, r3 + 8004d32: 4013 ands r3, r2 + 8004d34: 2b00 cmp r3, #0 + 8004d36: d197 bne.n 8004c68 + } + } + } + } + /*------------------------------ LSE Configuration -------------------------*/ + if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE) + 8004d38: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004d3c: f5a3 73fe sub.w r3, r3, #508 ; 0x1fc + 8004d40: 681b ldr r3, [r3, #0] + 8004d42: 681b ldr r3, [r3, #0] + 8004d44: f003 0304 and.w r3, r3, #4 + 8004d48: 2b00 cmp r3, #0 + 8004d4a: f000 81a1 beq.w 8005090 + { + FlagStatus pwrclkchanged = RESET; + 8004d4e: 2300 movs r3, #0 + 8004d50: f887 31ff strb.w r3, [r7, #511] ; 0x1ff + /* 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()) + 8004d54: 4b26 ldr r3, [pc, #152] ; (8004df0 ) + 8004d56: 69db ldr r3, [r3, #28] + 8004d58: f003 5380 and.w r3, r3, #268435456 ; 0x10000000 + 8004d5c: 2b00 cmp r3, #0 + 8004d5e: d116 bne.n 8004d8e + { + __HAL_RCC_PWR_CLK_ENABLE(); + 8004d60: 4b23 ldr r3, [pc, #140] ; (8004df0 ) + 8004d62: 69db ldr r3, [r3, #28] + 8004d64: 4a22 ldr r2, [pc, #136] ; (8004df0 ) + 8004d66: f043 5380 orr.w r3, r3, #268435456 ; 0x10000000 + 8004d6a: 61d3 str r3, [r2, #28] + 8004d6c: 4b20 ldr r3, [pc, #128] ; (8004df0 ) + 8004d6e: 69db ldr r3, [r3, #28] + 8004d70: f003 5280 and.w r2, r3, #268435456 ; 0x10000000 + 8004d74: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004d78: f5a3 73fc sub.w r3, r3, #504 ; 0x1f8 + 8004d7c: 601a str r2, [r3, #0] + 8004d7e: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004d82: f5a3 73fc sub.w r3, r3, #504 ; 0x1f8 + 8004d86: 681b ldr r3, [r3, #0] + pwrclkchanged = SET; + 8004d88: 2301 movs r3, #1 + 8004d8a: f887 31ff strb.w r3, [r7, #511] ; 0x1ff + } + + if(HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) + 8004d8e: 4b1a ldr r3, [pc, #104] ; (8004df8 ) + 8004d90: 681b ldr r3, [r3, #0] + 8004d92: f403 7380 and.w r3, r3, #256 ; 0x100 + 8004d96: 2b00 cmp r3, #0 + 8004d98: d11a bne.n 8004dd0 + { + /* Enable write access to Backup domain */ + SET_BIT(PWR->CR, PWR_CR_DBP); + 8004d9a: 4b17 ldr r3, [pc, #92] ; (8004df8 ) + 8004d9c: 681b ldr r3, [r3, #0] + 8004d9e: 4a16 ldr r2, [pc, #88] ; (8004df8 ) + 8004da0: f443 7380 orr.w r3, r3, #256 ; 0x100 + 8004da4: 6013 str r3, [r2, #0] + + /* Wait for Backup domain Write protection disable */ + tickstart = HAL_GetTick(); + 8004da6: f7fd fa5d bl 8002264 + 8004daa: f8c7 01f8 str.w r0, [r7, #504] ; 0x1f8 + + while(HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) + 8004dae: e009 b.n 8004dc4 + { + if((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) + 8004db0: f7fd fa58 bl 8002264 + 8004db4: 4602 mov r2, r0 + 8004db6: f8d7 31f8 ldr.w r3, [r7, #504] ; 0x1f8 + 8004dba: 1ad3 subs r3, r2, r3 + 8004dbc: 2b64 cmp r3, #100 ; 0x64 + 8004dbe: d901 bls.n 8004dc4 + { + return HAL_TIMEOUT; + 8004dc0: 2303 movs r3, #3 + 8004dc2: e3b1 b.n 8005528 + while(HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) + 8004dc4: 4b0c ldr r3, [pc, #48] ; (8004df8 ) + 8004dc6: 681b ldr r3, [r3, #0] + 8004dc8: f403 7380 and.w r3, r3, #256 ; 0x100 + 8004dcc: 2b00 cmp r3, #0 + 8004dce: d0ef beq.n 8004db0 + } + } + } + + /* Set the new LSE configuration -----------------------------------------*/ + __HAL_RCC_LSE_CONFIG(RCC_OscInitStruct->LSEState); + 8004dd0: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004dd4: f5a3 73fe sub.w r3, r3, #508 ; 0x1fc + 8004dd8: 681b ldr r3, [r3, #0] + 8004dda: 68db ldr r3, [r3, #12] + 8004ddc: 2b01 cmp r3, #1 + 8004dde: d10d bne.n 8004dfc + 8004de0: 4b03 ldr r3, [pc, #12] ; (8004df0 ) + 8004de2: 6a1b ldr r3, [r3, #32] + 8004de4: 4a02 ldr r2, [pc, #8] ; (8004df0 ) + 8004de6: f043 0301 orr.w r3, r3, #1 + 8004dea: 6213 str r3, [r2, #32] + 8004dec: e03c b.n 8004e68 + 8004dee: bf00 nop + 8004df0: 40021000 .word 0x40021000 + 8004df4: 10908120 .word 0x10908120 + 8004df8: 40007000 .word 0x40007000 + 8004dfc: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004e00: f5a3 73fe sub.w r3, r3, #508 ; 0x1fc + 8004e04: 681b ldr r3, [r3, #0] + 8004e06: 68db ldr r3, [r3, #12] + 8004e08: 2b00 cmp r3, #0 + 8004e0a: d10c bne.n 8004e26 + 8004e0c: 4bc1 ldr r3, [pc, #772] ; (8005114 ) + 8004e0e: 6a1b ldr r3, [r3, #32] + 8004e10: 4ac0 ldr r2, [pc, #768] ; (8005114 ) + 8004e12: f023 0301 bic.w r3, r3, #1 + 8004e16: 6213 str r3, [r2, #32] + 8004e18: 4bbe ldr r3, [pc, #760] ; (8005114 ) + 8004e1a: 6a1b ldr r3, [r3, #32] + 8004e1c: 4abd ldr r2, [pc, #756] ; (8005114 ) + 8004e1e: f023 0304 bic.w r3, r3, #4 + 8004e22: 6213 str r3, [r2, #32] + 8004e24: e020 b.n 8004e68 + 8004e26: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004e2a: f5a3 73fe sub.w r3, r3, #508 ; 0x1fc + 8004e2e: 681b ldr r3, [r3, #0] + 8004e30: 68db ldr r3, [r3, #12] + 8004e32: 2b05 cmp r3, #5 + 8004e34: d10c bne.n 8004e50 + 8004e36: 4bb7 ldr r3, [pc, #732] ; (8005114 ) + 8004e38: 6a1b ldr r3, [r3, #32] + 8004e3a: 4ab6 ldr r2, [pc, #728] ; (8005114 ) + 8004e3c: f043 0304 orr.w r3, r3, #4 + 8004e40: 6213 str r3, [r2, #32] + 8004e42: 4bb4 ldr r3, [pc, #720] ; (8005114 ) + 8004e44: 6a1b ldr r3, [r3, #32] + 8004e46: 4ab3 ldr r2, [pc, #716] ; (8005114 ) + 8004e48: f043 0301 orr.w r3, r3, #1 + 8004e4c: 6213 str r3, [r2, #32] + 8004e4e: e00b b.n 8004e68 + 8004e50: 4bb0 ldr r3, [pc, #704] ; (8005114 ) + 8004e52: 6a1b ldr r3, [r3, #32] + 8004e54: 4aaf ldr r2, [pc, #700] ; (8005114 ) + 8004e56: f023 0301 bic.w r3, r3, #1 + 8004e5a: 6213 str r3, [r2, #32] + 8004e5c: 4bad ldr r3, [pc, #692] ; (8005114 ) + 8004e5e: 6a1b ldr r3, [r3, #32] + 8004e60: 4aac ldr r2, [pc, #688] ; (8005114 ) + 8004e62: f023 0304 bic.w r3, r3, #4 + 8004e66: 6213 str r3, [r2, #32] + /* Check the LSE State */ + if(RCC_OscInitStruct->LSEState != RCC_LSE_OFF) + 8004e68: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004e6c: f5a3 73fe sub.w r3, r3, #508 ; 0x1fc + 8004e70: 681b ldr r3, [r3, #0] + 8004e72: 68db ldr r3, [r3, #12] + 8004e74: 2b00 cmp r3, #0 + 8004e76: f000 8081 beq.w 8004f7c + { + /* Get Start Tick */ + tickstart = HAL_GetTick(); + 8004e7a: f7fd f9f3 bl 8002264 + 8004e7e: f8c7 01f8 str.w r0, [r7, #504] ; 0x1f8 + + /* Wait till LSE is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) + 8004e82: e00b b.n 8004e9c + { + if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + 8004e84: f7fd f9ee bl 8002264 + 8004e88: 4602 mov r2, r0 + 8004e8a: f8d7 31f8 ldr.w r3, [r7, #504] ; 0x1f8 + 8004e8e: 1ad3 subs r3, r2, r3 + 8004e90: f241 3288 movw r2, #5000 ; 0x1388 + 8004e94: 4293 cmp r3, r2 + 8004e96: d901 bls.n 8004e9c + { + return HAL_TIMEOUT; + 8004e98: 2303 movs r3, #3 + 8004e9a: e345 b.n 8005528 + 8004e9c: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004ea0: f5a3 73a0 sub.w r3, r3, #320 ; 0x140 + 8004ea4: 2202 movs r2, #2 + 8004ea6: 601a str r2, [r3, #0] + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 8004ea8: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004eac: f5a3 73a0 sub.w r3, r3, #320 ; 0x140 + 8004eb0: 681b ldr r3, [r3, #0] + 8004eb2: fa93 f2a3 rbit r2, r3 + 8004eb6: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004eba: f5a3 73a2 sub.w r3, r3, #324 ; 0x144 + 8004ebe: 601a str r2, [r3, #0] + 8004ec0: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004ec4: f5a3 73a4 sub.w r3, r3, #328 ; 0x148 + 8004ec8: 2202 movs r2, #2 + 8004eca: 601a str r2, [r3, #0] + 8004ecc: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004ed0: f5a3 73a4 sub.w r3, r3, #328 ; 0x148 + 8004ed4: 681b ldr r3, [r3, #0] + 8004ed6: fa93 f2a3 rbit r2, r3 + 8004eda: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004ede: f5a3 73a6 sub.w r3, r3, #332 ; 0x14c + 8004ee2: 601a str r2, [r3, #0] + return result; + 8004ee4: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004ee8: f5a3 73a6 sub.w r3, r3, #332 ; 0x14c + 8004eec: 681b ldr r3, [r3, #0] + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) + 8004eee: fab3 f383 clz r3, r3 + 8004ef2: b2db uxtb r3, r3 + 8004ef4: 095b lsrs r3, r3, #5 + 8004ef6: b2db uxtb r3, r3 + 8004ef8: f043 0302 orr.w r3, r3, #2 + 8004efc: b2db uxtb r3, r3 + 8004efe: 2b02 cmp r3, #2 + 8004f00: d102 bne.n 8004f08 + 8004f02: 4b84 ldr r3, [pc, #528] ; (8005114 ) + 8004f04: 6a1b ldr r3, [r3, #32] + 8004f06: e013 b.n 8004f30 + 8004f08: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004f0c: f5a3 73a8 sub.w r3, r3, #336 ; 0x150 + 8004f10: 2202 movs r2, #2 + 8004f12: 601a str r2, [r3, #0] + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 8004f14: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004f18: f5a3 73a8 sub.w r3, r3, #336 ; 0x150 + 8004f1c: 681b ldr r3, [r3, #0] + 8004f1e: fa93 f2a3 rbit r2, r3 + 8004f22: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004f26: f5a3 73aa sub.w r3, r3, #340 ; 0x154 + 8004f2a: 601a str r2, [r3, #0] + 8004f2c: 4b79 ldr r3, [pc, #484] ; (8005114 ) + 8004f2e: 6a5b ldr r3, [r3, #36] ; 0x24 + 8004f30: f507 7200 add.w r2, r7, #512 ; 0x200 + 8004f34: f5a2 72ac sub.w r2, r2, #344 ; 0x158 + 8004f38: 2102 movs r1, #2 + 8004f3a: 6011 str r1, [r2, #0] + 8004f3c: f507 7200 add.w r2, r7, #512 ; 0x200 + 8004f40: f5a2 72ac sub.w r2, r2, #344 ; 0x158 + 8004f44: 6812 ldr r2, [r2, #0] + 8004f46: fa92 f1a2 rbit r1, r2 + 8004f4a: f507 7200 add.w r2, r7, #512 ; 0x200 + 8004f4e: f5a2 72ae sub.w r2, r2, #348 ; 0x15c + 8004f52: 6011 str r1, [r2, #0] + return result; + 8004f54: f507 7200 add.w r2, r7, #512 ; 0x200 + 8004f58: f5a2 72ae sub.w r2, r2, #348 ; 0x15c + 8004f5c: 6812 ldr r2, [r2, #0] + 8004f5e: fab2 f282 clz r2, r2 + 8004f62: b2d2 uxtb r2, r2 + 8004f64: f042 0240 orr.w r2, r2, #64 ; 0x40 + 8004f68: b2d2 uxtb r2, r2 + 8004f6a: f002 021f and.w r2, r2, #31 + 8004f6e: 2101 movs r1, #1 + 8004f70: fa01 f202 lsl.w r2, r1, r2 + 8004f74: 4013 ands r3, r2 + 8004f76: 2b00 cmp r3, #0 + 8004f78: d084 beq.n 8004e84 + 8004f7a: e07f b.n 800507c + } + } + else + { + /* Get Start Tick */ + tickstart = HAL_GetTick(); + 8004f7c: f7fd f972 bl 8002264 + 8004f80: f8c7 01f8 str.w r0, [r7, #504] ; 0x1f8 + + /* Wait till LSE is disabled */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) + 8004f84: e00b b.n 8004f9e + { + if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + 8004f86: f7fd f96d bl 8002264 + 8004f8a: 4602 mov r2, r0 + 8004f8c: f8d7 31f8 ldr.w r3, [r7, #504] ; 0x1f8 + 8004f90: 1ad3 subs r3, r2, r3 + 8004f92: f241 3288 movw r2, #5000 ; 0x1388 + 8004f96: 4293 cmp r3, r2 + 8004f98: d901 bls.n 8004f9e + { + return HAL_TIMEOUT; + 8004f9a: 2303 movs r3, #3 + 8004f9c: e2c4 b.n 8005528 + 8004f9e: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004fa2: f5a3 73b0 sub.w r3, r3, #352 ; 0x160 + 8004fa6: 2202 movs r2, #2 + 8004fa8: 601a str r2, [r3, #0] + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 8004faa: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004fae: f5a3 73b0 sub.w r3, r3, #352 ; 0x160 + 8004fb2: 681b ldr r3, [r3, #0] + 8004fb4: fa93 f2a3 rbit r2, r3 + 8004fb8: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004fbc: f5a3 73b2 sub.w r3, r3, #356 ; 0x164 + 8004fc0: 601a str r2, [r3, #0] + 8004fc2: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004fc6: f5a3 73b4 sub.w r3, r3, #360 ; 0x168 + 8004fca: 2202 movs r2, #2 + 8004fcc: 601a str r2, [r3, #0] + 8004fce: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004fd2: f5a3 73b4 sub.w r3, r3, #360 ; 0x168 + 8004fd6: 681b ldr r3, [r3, #0] + 8004fd8: fa93 f2a3 rbit r2, r3 + 8004fdc: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004fe0: f5a3 73b6 sub.w r3, r3, #364 ; 0x16c + 8004fe4: 601a str r2, [r3, #0] + return result; + 8004fe6: f507 7300 add.w r3, r7, #512 ; 0x200 + 8004fea: f5a3 73b6 sub.w r3, r3, #364 ; 0x16c + 8004fee: 681b ldr r3, [r3, #0] + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) + 8004ff0: fab3 f383 clz r3, r3 + 8004ff4: b2db uxtb r3, r3 + 8004ff6: 095b lsrs r3, r3, #5 + 8004ff8: b2db uxtb r3, r3 + 8004ffa: f043 0302 orr.w r3, r3, #2 + 8004ffe: b2db uxtb r3, r3 + 8005000: 2b02 cmp r3, #2 + 8005002: d102 bne.n 800500a + 8005004: 4b43 ldr r3, [pc, #268] ; (8005114 ) + 8005006: 6a1b ldr r3, [r3, #32] + 8005008: e013 b.n 8005032 + 800500a: f507 7300 add.w r3, r7, #512 ; 0x200 + 800500e: f5a3 73b8 sub.w r3, r3, #368 ; 0x170 + 8005012: 2202 movs r2, #2 + 8005014: 601a str r2, [r3, #0] + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 8005016: f507 7300 add.w r3, r7, #512 ; 0x200 + 800501a: f5a3 73b8 sub.w r3, r3, #368 ; 0x170 + 800501e: 681b ldr r3, [r3, #0] + 8005020: fa93 f2a3 rbit r2, r3 + 8005024: f507 7300 add.w r3, r7, #512 ; 0x200 + 8005028: f5a3 73ba sub.w r3, r3, #372 ; 0x174 + 800502c: 601a str r2, [r3, #0] + 800502e: 4b39 ldr r3, [pc, #228] ; (8005114 ) + 8005030: 6a5b ldr r3, [r3, #36] ; 0x24 + 8005032: f507 7200 add.w r2, r7, #512 ; 0x200 + 8005036: f5a2 72bc sub.w r2, r2, #376 ; 0x178 + 800503a: 2102 movs r1, #2 + 800503c: 6011 str r1, [r2, #0] + 800503e: f507 7200 add.w r2, r7, #512 ; 0x200 + 8005042: f5a2 72bc sub.w r2, r2, #376 ; 0x178 + 8005046: 6812 ldr r2, [r2, #0] + 8005048: fa92 f1a2 rbit r1, r2 + 800504c: f507 7200 add.w r2, r7, #512 ; 0x200 + 8005050: f5a2 72be sub.w r2, r2, #380 ; 0x17c + 8005054: 6011 str r1, [r2, #0] + return result; + 8005056: f507 7200 add.w r2, r7, #512 ; 0x200 + 800505a: f5a2 72be sub.w r2, r2, #380 ; 0x17c + 800505e: 6812 ldr r2, [r2, #0] + 8005060: fab2 f282 clz r2, r2 + 8005064: b2d2 uxtb r2, r2 + 8005066: f042 0240 orr.w r2, r2, #64 ; 0x40 + 800506a: b2d2 uxtb r2, r2 + 800506c: f002 021f and.w r2, r2, #31 + 8005070: 2101 movs r1, #1 + 8005072: fa01 f202 lsl.w r2, r1, r2 + 8005076: 4013 ands r3, r2 + 8005078: 2b00 cmp r3, #0 + 800507a: d184 bne.n 8004f86 + } + } + } + + /* Require to disable power clock if necessary */ + if(pwrclkchanged == SET) + 800507c: f897 31ff ldrb.w r3, [r7, #511] ; 0x1ff + 8005080: 2b01 cmp r3, #1 + 8005082: d105 bne.n 8005090 + { + __HAL_RCC_PWR_CLK_DISABLE(); + 8005084: 4b23 ldr r3, [pc, #140] ; (8005114 ) + 8005086: 69db ldr r3, [r3, #28] + 8005088: 4a22 ldr r2, [pc, #136] ; (8005114 ) + 800508a: f023 5380 bic.w r3, r3, #268435456 ; 0x10000000 + 800508e: 61d3 str r3, [r2, #28] + } + + /*-------------------------------- PLL Configuration -----------------------*/ + /* Check the parameters */ + assert_param(IS_RCC_PLL(RCC_OscInitStruct->PLL.PLLState)); + if ((RCC_OscInitStruct->PLL.PLLState) != RCC_PLL_NONE) + 8005090: f507 7300 add.w r3, r7, #512 ; 0x200 + 8005094: f5a3 73fe sub.w r3, r3, #508 ; 0x1fc + 8005098: 681b ldr r3, [r3, #0] + 800509a: 69db ldr r3, [r3, #28] + 800509c: 2b00 cmp r3, #0 + 800509e: f000 8242 beq.w 8005526 + { + /* Check if the PLL is used as system clock or not */ + if(__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_SYSCLKSOURCE_STATUS_PLLCLK) + 80050a2: 4b1c ldr r3, [pc, #112] ; (8005114 ) + 80050a4: 685b ldr r3, [r3, #4] + 80050a6: f003 030c and.w r3, r3, #12 + 80050aa: 2b08 cmp r3, #8 + 80050ac: f000 8213 beq.w 80054d6 + { + if((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON) + 80050b0: f507 7300 add.w r3, r7, #512 ; 0x200 + 80050b4: f5a3 73fe sub.w r3, r3, #508 ; 0x1fc + 80050b8: 681b ldr r3, [r3, #0] + 80050ba: 69db ldr r3, [r3, #28] + 80050bc: 2b02 cmp r3, #2 + 80050be: f040 8162 bne.w 8005386 + 80050c2: f507 7300 add.w r3, r7, #512 ; 0x200 + 80050c6: f5a3 73c0 sub.w r3, r3, #384 ; 0x180 + 80050ca: f04f 7280 mov.w r2, #16777216 ; 0x1000000 + 80050ce: 601a str r2, [r3, #0] + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 80050d0: f507 7300 add.w r3, r7, #512 ; 0x200 + 80050d4: f5a3 73c0 sub.w r3, r3, #384 ; 0x180 + 80050d8: 681b ldr r3, [r3, #0] + 80050da: fa93 f2a3 rbit r2, r3 + 80050de: f507 7300 add.w r3, r7, #512 ; 0x200 + 80050e2: f5a3 73c2 sub.w r3, r3, #388 ; 0x184 + 80050e6: 601a str r2, [r3, #0] + return result; + 80050e8: f507 7300 add.w r3, r7, #512 ; 0x200 + 80050ec: f5a3 73c2 sub.w r3, r3, #388 ; 0x184 + 80050f0: 681b ldr r3, [r3, #0] +#if defined(RCC_CFGR_PLLSRC_HSI_PREDIV) + assert_param(IS_RCC_PREDIV(RCC_OscInitStruct->PLL.PREDIV)); +#endif + + /* Disable the main PLL. */ + __HAL_RCC_PLL_DISABLE(); + 80050f2: fab3 f383 clz r3, r3 + 80050f6: b2db uxtb r3, r3 + 80050f8: f103 5384 add.w r3, r3, #276824064 ; 0x10800000 + 80050fc: f503 1384 add.w r3, r3, #1081344 ; 0x108000 + 8005100: 009b lsls r3, r3, #2 + 8005102: 461a mov r2, r3 + 8005104: 2300 movs r3, #0 + 8005106: 6013 str r3, [r2, #0] + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + 8005108: f7fd f8ac bl 8002264 + 800510c: f8c7 01f8 str.w r0, [r7, #504] ; 0x1f8 + + /* Wait till PLL is disabled */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) + 8005110: e00c b.n 800512c + 8005112: bf00 nop + 8005114: 40021000 .word 0x40021000 + { + if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + 8005118: f7fd f8a4 bl 8002264 + 800511c: 4602 mov r2, r0 + 800511e: f8d7 31f8 ldr.w r3, [r7, #504] ; 0x1f8 + 8005122: 1ad3 subs r3, r2, r3 + 8005124: 2b02 cmp r3, #2 + 8005126: d901 bls.n 800512c + { + return HAL_TIMEOUT; + 8005128: 2303 movs r3, #3 + 800512a: e1fd b.n 8005528 + 800512c: f507 7300 add.w r3, r7, #512 ; 0x200 + 8005130: f5a3 73c4 sub.w r3, r3, #392 ; 0x188 + 8005134: f04f 7200 mov.w r2, #33554432 ; 0x2000000 + 8005138: 601a str r2, [r3, #0] + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 800513a: f507 7300 add.w r3, r7, #512 ; 0x200 + 800513e: f5a3 73c4 sub.w r3, r3, #392 ; 0x188 + 8005142: 681b ldr r3, [r3, #0] + 8005144: fa93 f2a3 rbit r2, r3 + 8005148: f507 7300 add.w r3, r7, #512 ; 0x200 + 800514c: f5a3 73c6 sub.w r3, r3, #396 ; 0x18c + 8005150: 601a str r2, [r3, #0] + return result; + 8005152: f507 7300 add.w r3, r7, #512 ; 0x200 + 8005156: f5a3 73c6 sub.w r3, r3, #396 ; 0x18c + 800515a: 681b ldr r3, [r3, #0] + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) + 800515c: fab3 f383 clz r3, r3 + 8005160: b2db uxtb r3, r3 + 8005162: 095b lsrs r3, r3, #5 + 8005164: b2db uxtb r3, r3 + 8005166: f043 0301 orr.w r3, r3, #1 + 800516a: b2db uxtb r3, r3 + 800516c: 2b01 cmp r3, #1 + 800516e: d102 bne.n 8005176 + 8005170: 4bb0 ldr r3, [pc, #704] ; (8005434 ) + 8005172: 681b ldr r3, [r3, #0] + 8005174: e027 b.n 80051c6 + 8005176: f507 7300 add.w r3, r7, #512 ; 0x200 + 800517a: f5a3 73c8 sub.w r3, r3, #400 ; 0x190 + 800517e: f04f 7200 mov.w r2, #33554432 ; 0x2000000 + 8005182: 601a str r2, [r3, #0] + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 8005184: f507 7300 add.w r3, r7, #512 ; 0x200 + 8005188: f5a3 73c8 sub.w r3, r3, #400 ; 0x190 + 800518c: 681b ldr r3, [r3, #0] + 800518e: fa93 f2a3 rbit r2, r3 + 8005192: f507 7300 add.w r3, r7, #512 ; 0x200 + 8005196: f5a3 73ca sub.w r3, r3, #404 ; 0x194 + 800519a: 601a str r2, [r3, #0] + 800519c: f507 7300 add.w r3, r7, #512 ; 0x200 + 80051a0: f5a3 73cc sub.w r3, r3, #408 ; 0x198 + 80051a4: f04f 7200 mov.w r2, #33554432 ; 0x2000000 + 80051a8: 601a str r2, [r3, #0] + 80051aa: f507 7300 add.w r3, r7, #512 ; 0x200 + 80051ae: f5a3 73cc sub.w r3, r3, #408 ; 0x198 + 80051b2: 681b ldr r3, [r3, #0] + 80051b4: fa93 f2a3 rbit r2, r3 + 80051b8: f507 7300 add.w r3, r7, #512 ; 0x200 + 80051bc: f5a3 73ce sub.w r3, r3, #412 ; 0x19c + 80051c0: 601a str r2, [r3, #0] + 80051c2: 4b9c ldr r3, [pc, #624] ; (8005434 ) + 80051c4: 6a5b ldr r3, [r3, #36] ; 0x24 + 80051c6: f507 7200 add.w r2, r7, #512 ; 0x200 + 80051ca: f5a2 72d0 sub.w r2, r2, #416 ; 0x1a0 + 80051ce: f04f 7100 mov.w r1, #33554432 ; 0x2000000 + 80051d2: 6011 str r1, [r2, #0] + 80051d4: f507 7200 add.w r2, r7, #512 ; 0x200 + 80051d8: f5a2 72d0 sub.w r2, r2, #416 ; 0x1a0 + 80051dc: 6812 ldr r2, [r2, #0] + 80051de: fa92 f1a2 rbit r1, r2 + 80051e2: f507 7200 add.w r2, r7, #512 ; 0x200 + 80051e6: f5a2 72d2 sub.w r2, r2, #420 ; 0x1a4 + 80051ea: 6011 str r1, [r2, #0] + return result; + 80051ec: f507 7200 add.w r2, r7, #512 ; 0x200 + 80051f0: f5a2 72d2 sub.w r2, r2, #420 ; 0x1a4 + 80051f4: 6812 ldr r2, [r2, #0] + 80051f6: fab2 f282 clz r2, r2 + 80051fa: b2d2 uxtb r2, r2 + 80051fc: f042 0220 orr.w r2, r2, #32 + 8005200: b2d2 uxtb r2, r2 + 8005202: f002 021f and.w r2, r2, #31 + 8005206: 2101 movs r1, #1 + 8005208: fa01 f202 lsl.w r2, r1, r2 + 800520c: 4013 ands r3, r2 + 800520e: 2b00 cmp r3, #0 + 8005210: d182 bne.n 8005118 + __HAL_RCC_PLL_CONFIG(RCC_OscInitStruct->PLL.PLLSource, + RCC_OscInitStruct->PLL.PREDIV, + RCC_OscInitStruct->PLL.PLLMUL); +#else + /* Configure the main PLL clock source and multiplication factor. */ + __HAL_RCC_PLL_CONFIG(RCC_OscInitStruct->PLL.PLLSource, + 8005212: 4b88 ldr r3, [pc, #544] ; (8005434 ) + 8005214: 685b ldr r3, [r3, #4] + 8005216: f423 1274 bic.w r2, r3, #3997696 ; 0x3d0000 + 800521a: f507 7300 add.w r3, r7, #512 ; 0x200 + 800521e: f5a3 73fe sub.w r3, r3, #508 ; 0x1fc + 8005222: 681b ldr r3, [r3, #0] + 8005224: 6a59 ldr r1, [r3, #36] ; 0x24 + 8005226: f507 7300 add.w r3, r7, #512 ; 0x200 + 800522a: f5a3 73fe sub.w r3, r3, #508 ; 0x1fc + 800522e: 681b ldr r3, [r3, #0] + 8005230: 6a1b ldr r3, [r3, #32] + 8005232: 430b orrs r3, r1 + 8005234: 497f ldr r1, [pc, #508] ; (8005434 ) + 8005236: 4313 orrs r3, r2 + 8005238: 604b str r3, [r1, #4] + 800523a: f507 7300 add.w r3, r7, #512 ; 0x200 + 800523e: f5a3 73d4 sub.w r3, r3, #424 ; 0x1a8 + 8005242: f04f 7280 mov.w r2, #16777216 ; 0x1000000 + 8005246: 601a str r2, [r3, #0] + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 8005248: f507 7300 add.w r3, r7, #512 ; 0x200 + 800524c: f5a3 73d4 sub.w r3, r3, #424 ; 0x1a8 + 8005250: 681b ldr r3, [r3, #0] + 8005252: fa93 f2a3 rbit r2, r3 + 8005256: f507 7300 add.w r3, r7, #512 ; 0x200 + 800525a: f5a3 73d6 sub.w r3, r3, #428 ; 0x1ac + 800525e: 601a str r2, [r3, #0] + return result; + 8005260: f507 7300 add.w r3, r7, #512 ; 0x200 + 8005264: f5a3 73d6 sub.w r3, r3, #428 ; 0x1ac + 8005268: 681b ldr r3, [r3, #0] + RCC_OscInitStruct->PLL.PLLMUL); +#endif /* RCC_CFGR_PLLSRC_HSI_PREDIV */ + /* Enable the main PLL. */ + __HAL_RCC_PLL_ENABLE(); + 800526a: fab3 f383 clz r3, r3 + 800526e: b2db uxtb r3, r3 + 8005270: f103 5384 add.w r3, r3, #276824064 ; 0x10800000 + 8005274: f503 1384 add.w r3, r3, #1081344 ; 0x108000 + 8005278: 009b lsls r3, r3, #2 + 800527a: 461a mov r2, r3 + 800527c: 2301 movs r3, #1 + 800527e: 6013 str r3, [r2, #0] + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + 8005280: f7fc fff0 bl 8002264 + 8005284: f8c7 01f8 str.w r0, [r7, #504] ; 0x1f8 + + /* Wait till PLL is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) + 8005288: e009 b.n 800529e + { + if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + 800528a: f7fc ffeb bl 8002264 + 800528e: 4602 mov r2, r0 + 8005290: f8d7 31f8 ldr.w r3, [r7, #504] ; 0x1f8 + 8005294: 1ad3 subs r3, r2, r3 + 8005296: 2b02 cmp r3, #2 + 8005298: d901 bls.n 800529e + { + return HAL_TIMEOUT; + 800529a: 2303 movs r3, #3 + 800529c: e144 b.n 8005528 + 800529e: f507 7300 add.w r3, r7, #512 ; 0x200 + 80052a2: f5a3 73d8 sub.w r3, r3, #432 ; 0x1b0 + 80052a6: f04f 7200 mov.w r2, #33554432 ; 0x2000000 + 80052aa: 601a str r2, [r3, #0] + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 80052ac: f507 7300 add.w r3, r7, #512 ; 0x200 + 80052b0: f5a3 73d8 sub.w r3, r3, #432 ; 0x1b0 + 80052b4: 681b ldr r3, [r3, #0] + 80052b6: fa93 f2a3 rbit r2, r3 + 80052ba: f507 7300 add.w r3, r7, #512 ; 0x200 + 80052be: f5a3 73da sub.w r3, r3, #436 ; 0x1b4 + 80052c2: 601a str r2, [r3, #0] + return result; + 80052c4: f507 7300 add.w r3, r7, #512 ; 0x200 + 80052c8: f5a3 73da sub.w r3, r3, #436 ; 0x1b4 + 80052cc: 681b ldr r3, [r3, #0] + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) + 80052ce: fab3 f383 clz r3, r3 + 80052d2: b2db uxtb r3, r3 + 80052d4: 095b lsrs r3, r3, #5 + 80052d6: b2db uxtb r3, r3 + 80052d8: f043 0301 orr.w r3, r3, #1 + 80052dc: b2db uxtb r3, r3 + 80052de: 2b01 cmp r3, #1 + 80052e0: d102 bne.n 80052e8 + 80052e2: 4b54 ldr r3, [pc, #336] ; (8005434 ) + 80052e4: 681b ldr r3, [r3, #0] + 80052e6: e027 b.n 8005338 + 80052e8: f507 7300 add.w r3, r7, #512 ; 0x200 + 80052ec: f5a3 73dc sub.w r3, r3, #440 ; 0x1b8 + 80052f0: f04f 7200 mov.w r2, #33554432 ; 0x2000000 + 80052f4: 601a str r2, [r3, #0] + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 80052f6: f507 7300 add.w r3, r7, #512 ; 0x200 + 80052fa: f5a3 73dc sub.w r3, r3, #440 ; 0x1b8 + 80052fe: 681b ldr r3, [r3, #0] + 8005300: fa93 f2a3 rbit r2, r3 + 8005304: f507 7300 add.w r3, r7, #512 ; 0x200 + 8005308: f5a3 73de sub.w r3, r3, #444 ; 0x1bc + 800530c: 601a str r2, [r3, #0] + 800530e: f507 7300 add.w r3, r7, #512 ; 0x200 + 8005312: f5a3 73e0 sub.w r3, r3, #448 ; 0x1c0 + 8005316: f04f 7200 mov.w r2, #33554432 ; 0x2000000 + 800531a: 601a str r2, [r3, #0] + 800531c: f507 7300 add.w r3, r7, #512 ; 0x200 + 8005320: f5a3 73e0 sub.w r3, r3, #448 ; 0x1c0 + 8005324: 681b ldr r3, [r3, #0] + 8005326: fa93 f2a3 rbit r2, r3 + 800532a: f507 7300 add.w r3, r7, #512 ; 0x200 + 800532e: f5a3 73e2 sub.w r3, r3, #452 ; 0x1c4 + 8005332: 601a str r2, [r3, #0] + 8005334: 4b3f ldr r3, [pc, #252] ; (8005434 ) + 8005336: 6a5b ldr r3, [r3, #36] ; 0x24 + 8005338: f507 7200 add.w r2, r7, #512 ; 0x200 + 800533c: f5a2 72e4 sub.w r2, r2, #456 ; 0x1c8 + 8005340: f04f 7100 mov.w r1, #33554432 ; 0x2000000 + 8005344: 6011 str r1, [r2, #0] + 8005346: f507 7200 add.w r2, r7, #512 ; 0x200 + 800534a: f5a2 72e4 sub.w r2, r2, #456 ; 0x1c8 + 800534e: 6812 ldr r2, [r2, #0] + 8005350: fa92 f1a2 rbit r1, r2 + 8005354: f507 7200 add.w r2, r7, #512 ; 0x200 + 8005358: f5a2 72e6 sub.w r2, r2, #460 ; 0x1cc + 800535c: 6011 str r1, [r2, #0] + return result; + 800535e: f507 7200 add.w r2, r7, #512 ; 0x200 + 8005362: f5a2 72e6 sub.w r2, r2, #460 ; 0x1cc + 8005366: 6812 ldr r2, [r2, #0] + 8005368: fab2 f282 clz r2, r2 + 800536c: b2d2 uxtb r2, r2 + 800536e: f042 0220 orr.w r2, r2, #32 + 8005372: b2d2 uxtb r2, r2 + 8005374: f002 021f and.w r2, r2, #31 + 8005378: 2101 movs r1, #1 + 800537a: fa01 f202 lsl.w r2, r1, r2 + 800537e: 4013 ands r3, r2 + 8005380: 2b00 cmp r3, #0 + 8005382: d082 beq.n 800528a + 8005384: e0cf b.n 8005526 + 8005386: f507 7300 add.w r3, r7, #512 ; 0x200 + 800538a: f5a3 73e8 sub.w r3, r3, #464 ; 0x1d0 + 800538e: f04f 7280 mov.w r2, #16777216 ; 0x1000000 + 8005392: 601a str r2, [r3, #0] + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 8005394: f507 7300 add.w r3, r7, #512 ; 0x200 + 8005398: f5a3 73e8 sub.w r3, r3, #464 ; 0x1d0 + 800539c: 681b ldr r3, [r3, #0] + 800539e: fa93 f2a3 rbit r2, r3 + 80053a2: f507 7300 add.w r3, r7, #512 ; 0x200 + 80053a6: f5a3 73ea sub.w r3, r3, #468 ; 0x1d4 + 80053aa: 601a str r2, [r3, #0] + return result; + 80053ac: f507 7300 add.w r3, r7, #512 ; 0x200 + 80053b0: f5a3 73ea sub.w r3, r3, #468 ; 0x1d4 + 80053b4: 681b ldr r3, [r3, #0] + } + } + else + { + /* Disable the main PLL. */ + __HAL_RCC_PLL_DISABLE(); + 80053b6: fab3 f383 clz r3, r3 + 80053ba: b2db uxtb r3, r3 + 80053bc: f103 5384 add.w r3, r3, #276824064 ; 0x10800000 + 80053c0: f503 1384 add.w r3, r3, #1081344 ; 0x108000 + 80053c4: 009b lsls r3, r3, #2 + 80053c6: 461a mov r2, r3 + 80053c8: 2300 movs r3, #0 + 80053ca: 6013 str r3, [r2, #0] + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + 80053cc: f7fc ff4a bl 8002264 + 80053d0: f8c7 01f8 str.w r0, [r7, #504] ; 0x1f8 + + /* Wait till PLL is disabled */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) + 80053d4: e009 b.n 80053ea + { + if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + 80053d6: f7fc ff45 bl 8002264 + 80053da: 4602 mov r2, r0 + 80053dc: f8d7 31f8 ldr.w r3, [r7, #504] ; 0x1f8 + 80053e0: 1ad3 subs r3, r2, r3 + 80053e2: 2b02 cmp r3, #2 + 80053e4: d901 bls.n 80053ea + { + return HAL_TIMEOUT; + 80053e6: 2303 movs r3, #3 + 80053e8: e09e b.n 8005528 + 80053ea: f507 7300 add.w r3, r7, #512 ; 0x200 + 80053ee: f5a3 73ec sub.w r3, r3, #472 ; 0x1d8 + 80053f2: f04f 7200 mov.w r2, #33554432 ; 0x2000000 + 80053f6: 601a str r2, [r3, #0] + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 80053f8: f507 7300 add.w r3, r7, #512 ; 0x200 + 80053fc: f5a3 73ec sub.w r3, r3, #472 ; 0x1d8 + 8005400: 681b ldr r3, [r3, #0] + 8005402: fa93 f2a3 rbit r2, r3 + 8005406: f507 7300 add.w r3, r7, #512 ; 0x200 + 800540a: f5a3 73ee sub.w r3, r3, #476 ; 0x1dc + 800540e: 601a str r2, [r3, #0] + return result; + 8005410: f507 7300 add.w r3, r7, #512 ; 0x200 + 8005414: f5a3 73ee sub.w r3, r3, #476 ; 0x1dc + 8005418: 681b ldr r3, [r3, #0] + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) + 800541a: fab3 f383 clz r3, r3 + 800541e: b2db uxtb r3, r3 + 8005420: 095b lsrs r3, r3, #5 + 8005422: b2db uxtb r3, r3 + 8005424: f043 0301 orr.w r3, r3, #1 + 8005428: b2db uxtb r3, r3 + 800542a: 2b01 cmp r3, #1 + 800542c: d104 bne.n 8005438 + 800542e: 4b01 ldr r3, [pc, #4] ; (8005434 ) + 8005430: 681b ldr r3, [r3, #0] + 8005432: e029 b.n 8005488 + 8005434: 40021000 .word 0x40021000 + 8005438: f507 7300 add.w r3, r7, #512 ; 0x200 + 800543c: f5a3 73f0 sub.w r3, r3, #480 ; 0x1e0 + 8005440: f04f 7200 mov.w r2, #33554432 ; 0x2000000 + 8005444: 601a str r2, [r3, #0] + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 8005446: f507 7300 add.w r3, r7, #512 ; 0x200 + 800544a: f5a3 73f0 sub.w r3, r3, #480 ; 0x1e0 + 800544e: 681b ldr r3, [r3, #0] + 8005450: fa93 f2a3 rbit r2, r3 + 8005454: f507 7300 add.w r3, r7, #512 ; 0x200 + 8005458: f5a3 73f2 sub.w r3, r3, #484 ; 0x1e4 + 800545c: 601a str r2, [r3, #0] + 800545e: f507 7300 add.w r3, r7, #512 ; 0x200 + 8005462: f5a3 73f4 sub.w r3, r3, #488 ; 0x1e8 + 8005466: f04f 7200 mov.w r2, #33554432 ; 0x2000000 + 800546a: 601a str r2, [r3, #0] + 800546c: f507 7300 add.w r3, r7, #512 ; 0x200 + 8005470: f5a3 73f4 sub.w r3, r3, #488 ; 0x1e8 + 8005474: 681b ldr r3, [r3, #0] + 8005476: fa93 f2a3 rbit r2, r3 + 800547a: f507 7300 add.w r3, r7, #512 ; 0x200 + 800547e: f5a3 73f6 sub.w r3, r3, #492 ; 0x1ec + 8005482: 601a str r2, [r3, #0] + 8005484: 4b2b ldr r3, [pc, #172] ; (8005534 ) + 8005486: 6a5b ldr r3, [r3, #36] ; 0x24 + 8005488: f507 7200 add.w r2, r7, #512 ; 0x200 + 800548c: f5a2 72f8 sub.w r2, r2, #496 ; 0x1f0 + 8005490: f04f 7100 mov.w r1, #33554432 ; 0x2000000 + 8005494: 6011 str r1, [r2, #0] + 8005496: f507 7200 add.w r2, r7, #512 ; 0x200 + 800549a: f5a2 72f8 sub.w r2, r2, #496 ; 0x1f0 + 800549e: 6812 ldr r2, [r2, #0] + 80054a0: fa92 f1a2 rbit r1, r2 + 80054a4: f507 7200 add.w r2, r7, #512 ; 0x200 + 80054a8: f5a2 72fa sub.w r2, r2, #500 ; 0x1f4 + 80054ac: 6011 str r1, [r2, #0] + return result; + 80054ae: f507 7200 add.w r2, r7, #512 ; 0x200 + 80054b2: f5a2 72fa sub.w r2, r2, #500 ; 0x1f4 + 80054b6: 6812 ldr r2, [r2, #0] + 80054b8: fab2 f282 clz r2, r2 + 80054bc: b2d2 uxtb r2, r2 + 80054be: f042 0220 orr.w r2, r2, #32 + 80054c2: b2d2 uxtb r2, r2 + 80054c4: f002 021f and.w r2, r2, #31 + 80054c8: 2101 movs r1, #1 + 80054ca: fa01 f202 lsl.w r2, r1, r2 + 80054ce: 4013 ands r3, r2 + 80054d0: 2b00 cmp r3, #0 + 80054d2: d180 bne.n 80053d6 + 80054d4: e027 b.n 8005526 + } + } + else + { + /* Check if there is a request to disable the PLL used as System clock source */ + if((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) + 80054d6: f507 7300 add.w r3, r7, #512 ; 0x200 + 80054da: f5a3 73fe sub.w r3, r3, #508 ; 0x1fc + 80054de: 681b ldr r3, [r3, #0] + 80054e0: 69db ldr r3, [r3, #28] + 80054e2: 2b01 cmp r3, #1 + 80054e4: d101 bne.n 80054ea + { + return HAL_ERROR; + 80054e6: 2301 movs r3, #1 + 80054e8: e01e b.n 8005528 + } + else + { + /* Do not return HAL_ERROR if request repeats the current configuration */ + pll_config = RCC->CFGR; + 80054ea: 4b12 ldr r3, [pc, #72] ; (8005534 ) + 80054ec: 685b ldr r3, [r3, #4] + 80054ee: f8c7 31f4 str.w r3, [r7, #500] ; 0x1f4 + pll_config2 = RCC->CFGR2; + if((READ_BIT(pll_config, RCC_CFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || + (READ_BIT(pll_config, RCC_CFGR_PLLMUL) != RCC_OscInitStruct->PLL.PLLMUL) || + (READ_BIT(pll_config2, RCC_CFGR2_PREDIV) != RCC_OscInitStruct->PLL.PREDIV)) +#else + if((READ_BIT(pll_config, RCC_CFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || + 80054f2: f8d7 31f4 ldr.w r3, [r7, #500] ; 0x1f4 + 80054f6: f403 3280 and.w r2, r3, #65536 ; 0x10000 + 80054fa: f507 7300 add.w r3, r7, #512 ; 0x200 + 80054fe: f5a3 73fe sub.w r3, r3, #508 ; 0x1fc + 8005502: 681b ldr r3, [r3, #0] + 8005504: 6a1b ldr r3, [r3, #32] + 8005506: 429a cmp r2, r3 + 8005508: d10b bne.n 8005522 + (READ_BIT(pll_config, RCC_CFGR_PLLMUL) != RCC_OscInitStruct->PLL.PLLMUL)) + 800550a: f8d7 31f4 ldr.w r3, [r7, #500] ; 0x1f4 + 800550e: f403 1270 and.w r2, r3, #3932160 ; 0x3c0000 + 8005512: f507 7300 add.w r3, r7, #512 ; 0x200 + 8005516: f5a3 73fe sub.w r3, r3, #508 ; 0x1fc + 800551a: 681b ldr r3, [r3, #0] + 800551c: 6a5b ldr r3, [r3, #36] ; 0x24 + if((READ_BIT(pll_config, RCC_CFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || + 800551e: 429a cmp r2, r3 + 8005520: d001 beq.n 8005526 +#endif + { + return HAL_ERROR; + 8005522: 2301 movs r3, #1 + 8005524: e000 b.n 8005528 + } + } + } + } + + return HAL_OK; + 8005526: 2300 movs r3, #0 +} + 8005528: 4618 mov r0, r3 + 800552a: f507 7700 add.w r7, r7, #512 ; 0x200 + 800552e: 46bd mov sp, r7 + 8005530: bd80 pop {r7, pc} + 8005532: bf00 nop + 8005534: 40021000 .word 0x40021000 + +08005538 : + * You can use @ref HAL_RCC_GetClockConfig() function to know which clock is + * currently used as system clock source. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t FLatency) +{ + 8005538: b580 push {r7, lr} + 800553a: b09e sub sp, #120 ; 0x78 + 800553c: af00 add r7, sp, #0 + 800553e: 6078 str r0, [r7, #4] + 8005540: 6039 str r1, [r7, #0] + uint32_t tickstart = 0U; + 8005542: 2300 movs r3, #0 + 8005544: 677b str r3, [r7, #116] ; 0x74 + + /* Check Null pointer */ + if(RCC_ClkInitStruct == NULL) + 8005546: 687b ldr r3, [r7, #4] + 8005548: 2b00 cmp r3, #0 + 800554a: d101 bne.n 8005550 + { + return HAL_ERROR; + 800554c: 2301 movs r3, #1 + 800554e: e162 b.n 8005816 + /* To correctly read data from FLASH memory, the number of wait states (LATENCY) + must be correctly programmed according to the frequency of the CPU clock + (HCLK) of the device. */ + + /* Increasing the number of wait states because of higher CPU frequency */ + if(FLatency > __HAL_FLASH_GET_LATENCY()) + 8005550: 4b90 ldr r3, [pc, #576] ; (8005794 ) + 8005552: 681b ldr r3, [r3, #0] + 8005554: f003 0307 and.w r3, r3, #7 + 8005558: 683a ldr r2, [r7, #0] + 800555a: 429a cmp r2, r3 + 800555c: d910 bls.n 8005580 + { + /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ + __HAL_FLASH_SET_LATENCY(FLatency); + 800555e: 4b8d ldr r3, [pc, #564] ; (8005794 ) + 8005560: 681b ldr r3, [r3, #0] + 8005562: f023 0207 bic.w r2, r3, #7 + 8005566: 498b ldr r1, [pc, #556] ; (8005794 ) + 8005568: 683b ldr r3, [r7, #0] + 800556a: 4313 orrs r3, r2 + 800556c: 600b str r3, [r1, #0] + + /* Check that the new number of wait states is taken into account to access the Flash + memory by reading the FLASH_ACR register */ + if(__HAL_FLASH_GET_LATENCY() != FLatency) + 800556e: 4b89 ldr r3, [pc, #548] ; (8005794 ) + 8005570: 681b ldr r3, [r3, #0] + 8005572: f003 0307 and.w r3, r3, #7 + 8005576: 683a ldr r2, [r7, #0] + 8005578: 429a cmp r2, r3 + 800557a: d001 beq.n 8005580 + { + return HAL_ERROR; + 800557c: 2301 movs r3, #1 + 800557e: e14a b.n 8005816 + } + } + + /*-------------------------- HCLK Configuration --------------------------*/ + if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_HCLK) == RCC_CLOCKTYPE_HCLK) + 8005580: 687b ldr r3, [r7, #4] + 8005582: 681b ldr r3, [r3, #0] + 8005584: f003 0302 and.w r3, r3, #2 + 8005588: 2b00 cmp r3, #0 + 800558a: d008 beq.n 800559e + { + assert_param(IS_RCC_HCLK(RCC_ClkInitStruct->AHBCLKDivider)); + MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, RCC_ClkInitStruct->AHBCLKDivider); + 800558c: 4b82 ldr r3, [pc, #520] ; (8005798 ) + 800558e: 685b ldr r3, [r3, #4] + 8005590: f023 02f0 bic.w r2, r3, #240 ; 0xf0 + 8005594: 687b ldr r3, [r7, #4] + 8005596: 689b ldr r3, [r3, #8] + 8005598: 497f ldr r1, [pc, #508] ; (8005798 ) + 800559a: 4313 orrs r3, r2 + 800559c: 604b str r3, [r1, #4] + } + + /*------------------------- SYSCLK Configuration ---------------------------*/ + if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_SYSCLK) == RCC_CLOCKTYPE_SYSCLK) + 800559e: 687b ldr r3, [r7, #4] + 80055a0: 681b ldr r3, [r3, #0] + 80055a2: f003 0301 and.w r3, r3, #1 + 80055a6: 2b00 cmp r3, #0 + 80055a8: f000 80dc beq.w 8005764 + { + assert_param(IS_RCC_SYSCLKSOURCE(RCC_ClkInitStruct->SYSCLKSource)); + + /* HSE is selected as System Clock Source */ + if(RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_HSE) + 80055ac: 687b ldr r3, [r7, #4] + 80055ae: 685b ldr r3, [r3, #4] + 80055b0: 2b01 cmp r3, #1 + 80055b2: d13c bne.n 800562e + 80055b4: f44f 3300 mov.w r3, #131072 ; 0x20000 + 80055b8: 673b str r3, [r7, #112] ; 0x70 + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 80055ba: 6f3b ldr r3, [r7, #112] ; 0x70 + 80055bc: fa93 f3a3 rbit r3, r3 + 80055c0: 66fb str r3, [r7, #108] ; 0x6c + return result; + 80055c2: 6efb ldr r3, [r7, #108] ; 0x6c + { + /* Check the HSE ready flag */ + if(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) + 80055c4: fab3 f383 clz r3, r3 + 80055c8: b2db uxtb r3, r3 + 80055ca: 095b lsrs r3, r3, #5 + 80055cc: b2db uxtb r3, r3 + 80055ce: f043 0301 orr.w r3, r3, #1 + 80055d2: b2db uxtb r3, r3 + 80055d4: 2b01 cmp r3, #1 + 80055d6: d102 bne.n 80055de + 80055d8: 4b6f ldr r3, [pc, #444] ; (8005798 ) + 80055da: 681b ldr r3, [r3, #0] + 80055dc: e00f b.n 80055fe + 80055de: f44f 3300 mov.w r3, #131072 ; 0x20000 + 80055e2: 66bb str r3, [r7, #104] ; 0x68 + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 80055e4: 6ebb ldr r3, [r7, #104] ; 0x68 + 80055e6: fa93 f3a3 rbit r3, r3 + 80055ea: 667b str r3, [r7, #100] ; 0x64 + 80055ec: f44f 3300 mov.w r3, #131072 ; 0x20000 + 80055f0: 663b str r3, [r7, #96] ; 0x60 + 80055f2: 6e3b ldr r3, [r7, #96] ; 0x60 + 80055f4: fa93 f3a3 rbit r3, r3 + 80055f8: 65fb str r3, [r7, #92] ; 0x5c + 80055fa: 4b67 ldr r3, [pc, #412] ; (8005798 ) + 80055fc: 6a5b ldr r3, [r3, #36] ; 0x24 + 80055fe: f44f 3200 mov.w r2, #131072 ; 0x20000 + 8005602: 65ba str r2, [r7, #88] ; 0x58 + 8005604: 6dba ldr r2, [r7, #88] ; 0x58 + 8005606: fa92 f2a2 rbit r2, r2 + 800560a: 657a str r2, [r7, #84] ; 0x54 + return result; + 800560c: 6d7a ldr r2, [r7, #84] ; 0x54 + 800560e: fab2 f282 clz r2, r2 + 8005612: b2d2 uxtb r2, r2 + 8005614: f042 0220 orr.w r2, r2, #32 + 8005618: b2d2 uxtb r2, r2 + 800561a: f002 021f and.w r2, r2, #31 + 800561e: 2101 movs r1, #1 + 8005620: fa01 f202 lsl.w r2, r1, r2 + 8005624: 4013 ands r3, r2 + 8005626: 2b00 cmp r3, #0 + 8005628: d17b bne.n 8005722 + { + return HAL_ERROR; + 800562a: 2301 movs r3, #1 + 800562c: e0f3 b.n 8005816 + } + } + /* PLL is selected as System Clock Source */ + else if(RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLCLK) + 800562e: 687b ldr r3, [r7, #4] + 8005630: 685b ldr r3, [r3, #4] + 8005632: 2b02 cmp r3, #2 + 8005634: d13c bne.n 80056b0 + 8005636: f04f 7300 mov.w r3, #33554432 ; 0x2000000 + 800563a: 653b str r3, [r7, #80] ; 0x50 + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 800563c: 6d3b ldr r3, [r7, #80] ; 0x50 + 800563e: fa93 f3a3 rbit r3, r3 + 8005642: 64fb str r3, [r7, #76] ; 0x4c + return result; + 8005644: 6cfb ldr r3, [r7, #76] ; 0x4c + { + /* Check the PLL ready flag */ + if(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) + 8005646: fab3 f383 clz r3, r3 + 800564a: b2db uxtb r3, r3 + 800564c: 095b lsrs r3, r3, #5 + 800564e: b2db uxtb r3, r3 + 8005650: f043 0301 orr.w r3, r3, #1 + 8005654: b2db uxtb r3, r3 + 8005656: 2b01 cmp r3, #1 + 8005658: d102 bne.n 8005660 + 800565a: 4b4f ldr r3, [pc, #316] ; (8005798 ) + 800565c: 681b ldr r3, [r3, #0] + 800565e: e00f b.n 8005680 + 8005660: f04f 7300 mov.w r3, #33554432 ; 0x2000000 + 8005664: 64bb str r3, [r7, #72] ; 0x48 + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 8005666: 6cbb ldr r3, [r7, #72] ; 0x48 + 8005668: fa93 f3a3 rbit r3, r3 + 800566c: 647b str r3, [r7, #68] ; 0x44 + 800566e: f04f 7300 mov.w r3, #33554432 ; 0x2000000 + 8005672: 643b str r3, [r7, #64] ; 0x40 + 8005674: 6c3b ldr r3, [r7, #64] ; 0x40 + 8005676: fa93 f3a3 rbit r3, r3 + 800567a: 63fb str r3, [r7, #60] ; 0x3c + 800567c: 4b46 ldr r3, [pc, #280] ; (8005798 ) + 800567e: 6a5b ldr r3, [r3, #36] ; 0x24 + 8005680: f04f 7200 mov.w r2, #33554432 ; 0x2000000 + 8005684: 63ba str r2, [r7, #56] ; 0x38 + 8005686: 6bba ldr r2, [r7, #56] ; 0x38 + 8005688: fa92 f2a2 rbit r2, r2 + 800568c: 637a str r2, [r7, #52] ; 0x34 + return result; + 800568e: 6b7a ldr r2, [r7, #52] ; 0x34 + 8005690: fab2 f282 clz r2, r2 + 8005694: b2d2 uxtb r2, r2 + 8005696: f042 0220 orr.w r2, r2, #32 + 800569a: b2d2 uxtb r2, r2 + 800569c: f002 021f and.w r2, r2, #31 + 80056a0: 2101 movs r1, #1 + 80056a2: fa01 f202 lsl.w r2, r1, r2 + 80056a6: 4013 ands r3, r2 + 80056a8: 2b00 cmp r3, #0 + 80056aa: d13a bne.n 8005722 + { + return HAL_ERROR; + 80056ac: 2301 movs r3, #1 + 80056ae: e0b2 b.n 8005816 + 80056b0: 2302 movs r3, #2 + 80056b2: 633b str r3, [r7, #48] ; 0x30 + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 80056b4: 6b3b ldr r3, [r7, #48] ; 0x30 + 80056b6: fa93 f3a3 rbit r3, r3 + 80056ba: 62fb str r3, [r7, #44] ; 0x2c + return result; + 80056bc: 6afb ldr r3, [r7, #44] ; 0x2c + } + /* HSI is selected as System Clock Source */ + else + { + /* Check the HSI ready flag */ + if(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) + 80056be: fab3 f383 clz r3, r3 + 80056c2: b2db uxtb r3, r3 + 80056c4: 095b lsrs r3, r3, #5 + 80056c6: b2db uxtb r3, r3 + 80056c8: f043 0301 orr.w r3, r3, #1 + 80056cc: b2db uxtb r3, r3 + 80056ce: 2b01 cmp r3, #1 + 80056d0: d102 bne.n 80056d8 + 80056d2: 4b31 ldr r3, [pc, #196] ; (8005798 ) + 80056d4: 681b ldr r3, [r3, #0] + 80056d6: e00d b.n 80056f4 + 80056d8: 2302 movs r3, #2 + 80056da: 62bb str r3, [r7, #40] ; 0x28 + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 80056dc: 6abb ldr r3, [r7, #40] ; 0x28 + 80056de: fa93 f3a3 rbit r3, r3 + 80056e2: 627b str r3, [r7, #36] ; 0x24 + 80056e4: 2302 movs r3, #2 + 80056e6: 623b str r3, [r7, #32] + 80056e8: 6a3b ldr r3, [r7, #32] + 80056ea: fa93 f3a3 rbit r3, r3 + 80056ee: 61fb str r3, [r7, #28] + 80056f0: 4b29 ldr r3, [pc, #164] ; (8005798 ) + 80056f2: 6a5b ldr r3, [r3, #36] ; 0x24 + 80056f4: 2202 movs r2, #2 + 80056f6: 61ba str r2, [r7, #24] + 80056f8: 69ba ldr r2, [r7, #24] + 80056fa: fa92 f2a2 rbit r2, r2 + 80056fe: 617a str r2, [r7, #20] + return result; + 8005700: 697a ldr r2, [r7, #20] + 8005702: fab2 f282 clz r2, r2 + 8005706: b2d2 uxtb r2, r2 + 8005708: f042 0220 orr.w r2, r2, #32 + 800570c: b2d2 uxtb r2, r2 + 800570e: f002 021f and.w r2, r2, #31 + 8005712: 2101 movs r1, #1 + 8005714: fa01 f202 lsl.w r2, r1, r2 + 8005718: 4013 ands r3, r2 + 800571a: 2b00 cmp r3, #0 + 800571c: d101 bne.n 8005722 + { + return HAL_ERROR; + 800571e: 2301 movs r3, #1 + 8005720: e079 b.n 8005816 + } + } + + __HAL_RCC_SYSCLK_CONFIG(RCC_ClkInitStruct->SYSCLKSource); + 8005722: 4b1d ldr r3, [pc, #116] ; (8005798 ) + 8005724: 685b ldr r3, [r3, #4] + 8005726: f023 0203 bic.w r2, r3, #3 + 800572a: 687b ldr r3, [r7, #4] + 800572c: 685b ldr r3, [r3, #4] + 800572e: 491a ldr r1, [pc, #104] ; (8005798 ) + 8005730: 4313 orrs r3, r2 + 8005732: 604b str r3, [r1, #4] + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + 8005734: f7fc fd96 bl 8002264 + 8005738: 6778 str r0, [r7, #116] ; 0x74 + + while (__HAL_RCC_GET_SYSCLK_SOURCE() != (RCC_ClkInitStruct->SYSCLKSource << RCC_CFGR_SWS_Pos)) + 800573a: e00a b.n 8005752 + { + if ((HAL_GetTick() - tickstart) > CLOCKSWITCH_TIMEOUT_VALUE) + 800573c: f7fc fd92 bl 8002264 + 8005740: 4602 mov r2, r0 + 8005742: 6f7b ldr r3, [r7, #116] ; 0x74 + 8005744: 1ad3 subs r3, r2, r3 + 8005746: f241 3288 movw r2, #5000 ; 0x1388 + 800574a: 4293 cmp r3, r2 + 800574c: d901 bls.n 8005752 + { + return HAL_TIMEOUT; + 800574e: 2303 movs r3, #3 + 8005750: e061 b.n 8005816 + while (__HAL_RCC_GET_SYSCLK_SOURCE() != (RCC_ClkInitStruct->SYSCLKSource << RCC_CFGR_SWS_Pos)) + 8005752: 4b11 ldr r3, [pc, #68] ; (8005798 ) + 8005754: 685b ldr r3, [r3, #4] + 8005756: f003 020c and.w r2, r3, #12 + 800575a: 687b ldr r3, [r7, #4] + 800575c: 685b ldr r3, [r3, #4] + 800575e: 009b lsls r3, r3, #2 + 8005760: 429a cmp r2, r3 + 8005762: d1eb bne.n 800573c + } + } + } + /* Decreasing the number of wait states because of lower CPU frequency */ + if(FLatency < __HAL_FLASH_GET_LATENCY()) + 8005764: 4b0b ldr r3, [pc, #44] ; (8005794 ) + 8005766: 681b ldr r3, [r3, #0] + 8005768: f003 0307 and.w r3, r3, #7 + 800576c: 683a ldr r2, [r7, #0] + 800576e: 429a cmp r2, r3 + 8005770: d214 bcs.n 800579c + { + /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ + __HAL_FLASH_SET_LATENCY(FLatency); + 8005772: 4b08 ldr r3, [pc, #32] ; (8005794 ) + 8005774: 681b ldr r3, [r3, #0] + 8005776: f023 0207 bic.w r2, r3, #7 + 800577a: 4906 ldr r1, [pc, #24] ; (8005794 ) + 800577c: 683b ldr r3, [r7, #0] + 800577e: 4313 orrs r3, r2 + 8005780: 600b str r3, [r1, #0] + + /* Check that the new number of wait states is taken into account to access the Flash + memory by reading the FLASH_ACR register */ + if(__HAL_FLASH_GET_LATENCY() != FLatency) + 8005782: 4b04 ldr r3, [pc, #16] ; (8005794 ) + 8005784: 681b ldr r3, [r3, #0] + 8005786: f003 0307 and.w r3, r3, #7 + 800578a: 683a ldr r2, [r7, #0] + 800578c: 429a cmp r2, r3 + 800578e: d005 beq.n 800579c + { + return HAL_ERROR; + 8005790: 2301 movs r3, #1 + 8005792: e040 b.n 8005816 + 8005794: 40022000 .word 0x40022000 + 8005798: 40021000 .word 0x40021000 + } + } + + /*-------------------------- PCLK1 Configuration ---------------------------*/ + if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) + 800579c: 687b ldr r3, [r7, #4] + 800579e: 681b ldr r3, [r3, #0] + 80057a0: f003 0304 and.w r3, r3, #4 + 80057a4: 2b00 cmp r3, #0 + 80057a6: d008 beq.n 80057ba + { + assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB1CLKDivider)); + MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_ClkInitStruct->APB1CLKDivider); + 80057a8: 4b1d ldr r3, [pc, #116] ; (8005820 ) + 80057aa: 685b ldr r3, [r3, #4] + 80057ac: f423 62e0 bic.w r2, r3, #1792 ; 0x700 + 80057b0: 687b ldr r3, [r7, #4] + 80057b2: 68db ldr r3, [r3, #12] + 80057b4: 491a ldr r1, [pc, #104] ; (8005820 ) + 80057b6: 4313 orrs r3, r2 + 80057b8: 604b str r3, [r1, #4] + } + + /*-------------------------- PCLK2 Configuration ---------------------------*/ + if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) + 80057ba: 687b ldr r3, [r7, #4] + 80057bc: 681b ldr r3, [r3, #0] + 80057be: f003 0308 and.w r3, r3, #8 + 80057c2: 2b00 cmp r3, #0 + 80057c4: d009 beq.n 80057da + { + assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB2CLKDivider)); + MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, ((RCC_ClkInitStruct->APB2CLKDivider) << 3U)); + 80057c6: 4b16 ldr r3, [pc, #88] ; (8005820 ) + 80057c8: 685b ldr r3, [r3, #4] + 80057ca: f423 5260 bic.w r2, r3, #14336 ; 0x3800 + 80057ce: 687b ldr r3, [r7, #4] + 80057d0: 691b ldr r3, [r3, #16] + 80057d2: 00db lsls r3, r3, #3 + 80057d4: 4912 ldr r1, [pc, #72] ; (8005820 ) + 80057d6: 4313 orrs r3, r2 + 80057d8: 604b str r3, [r1, #4] + } + + /* Update the SystemCoreClock global variable */ + SystemCoreClock = HAL_RCC_GetSysClockFreq() >> AHBPrescTable[(RCC->CFGR & RCC_CFGR_HPRE)>> RCC_CFGR_HPRE_BITNUMBER]; + 80057da: f000 f829 bl 8005830 + 80057de: 4601 mov r1, r0 + 80057e0: 4b0f ldr r3, [pc, #60] ; (8005820 ) + 80057e2: 685b ldr r3, [r3, #4] + 80057e4: f003 03f0 and.w r3, r3, #240 ; 0xf0 + 80057e8: 22f0 movs r2, #240 ; 0xf0 + 80057ea: 613a str r2, [r7, #16] + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 80057ec: 693a ldr r2, [r7, #16] + 80057ee: fa92 f2a2 rbit r2, r2 + 80057f2: 60fa str r2, [r7, #12] + return result; + 80057f4: 68fa ldr r2, [r7, #12] + 80057f6: fab2 f282 clz r2, r2 + 80057fa: b2d2 uxtb r2, r2 + 80057fc: 40d3 lsrs r3, r2 + 80057fe: 4a09 ldr r2, [pc, #36] ; (8005824 ) + 8005800: 5cd3 ldrb r3, [r2, r3] + 8005802: fa21 f303 lsr.w r3, r1, r3 + 8005806: 4a08 ldr r2, [pc, #32] ; (8005828 ) + 8005808: 6013 str r3, [r2, #0] + + /* Configure the source of time base considering new system clocks settings*/ + HAL_InitTick (uwTickPrio); + 800580a: 4b08 ldr r3, [pc, #32] ; (800582c ) + 800580c: 681b ldr r3, [r3, #0] + 800580e: 4618 mov r0, r3 + 8005810: f7fc fce4 bl 80021dc + + return HAL_OK; + 8005814: 2300 movs r3, #0 +} + 8005816: 4618 mov r0, r3 + 8005818: 3778 adds r7, #120 ; 0x78 + 800581a: 46bd mov sp, r7 + 800581c: bd80 pop {r7, pc} + 800581e: bf00 nop + 8005820: 40021000 .word 0x40021000 + 8005824: 080064e0 .word 0x080064e0 + 8005828: 20000008 .word 0x20000008 + 800582c: 2000000c .word 0x2000000c + +08005830 : + * right SYSCLK value. Otherwise, any configuration based on this function will be incorrect. + * + * @retval SYSCLK frequency + */ +uint32_t HAL_RCC_GetSysClockFreq(void) +{ + 8005830: b480 push {r7} + 8005832: b08b sub sp, #44 ; 0x2c + 8005834: af00 add r7, sp, #0 + uint32_t tmpreg = 0U, prediv = 0U, pllclk = 0U, pllmul = 0U; + 8005836: 2300 movs r3, #0 + 8005838: 61fb str r3, [r7, #28] + 800583a: 2300 movs r3, #0 + 800583c: 61bb str r3, [r7, #24] + 800583e: 2300 movs r3, #0 + 8005840: 627b str r3, [r7, #36] ; 0x24 + 8005842: 2300 movs r3, #0 + 8005844: 617b str r3, [r7, #20] + uint32_t sysclockfreq = 0U; + 8005846: 2300 movs r3, #0 + 8005848: 623b str r3, [r7, #32] + + tmpreg = RCC->CFGR; + 800584a: 4b29 ldr r3, [pc, #164] ; (80058f0 ) + 800584c: 685b ldr r3, [r3, #4] + 800584e: 61fb str r3, [r7, #28] + + /* Get SYSCLK source -------------------------------------------------------*/ + switch (tmpreg & RCC_CFGR_SWS) + 8005850: 69fb ldr r3, [r7, #28] + 8005852: f003 030c and.w r3, r3, #12 + 8005856: 2b04 cmp r3, #4 + 8005858: d002 beq.n 8005860 + 800585a: 2b08 cmp r3, #8 + 800585c: d003 beq.n 8005866 + 800585e: e03c b.n 80058da + { + case RCC_SYSCLKSOURCE_STATUS_HSE: /* HSE used as system clock */ + { + sysclockfreq = HSE_VALUE; + 8005860: 4b24 ldr r3, [pc, #144] ; (80058f4 ) + 8005862: 623b str r3, [r7, #32] + break; + 8005864: e03c b.n 80058e0 + } + case RCC_SYSCLKSOURCE_STATUS_PLLCLK: /* PLL used as system clock */ + { + pllmul = aPLLMULFactorTable[(uint32_t)(tmpreg & RCC_CFGR_PLLMUL) >> POSITION_VAL(RCC_CFGR_PLLMUL)]; + 8005866: 69fb ldr r3, [r7, #28] + 8005868: f403 1370 and.w r3, r3, #3932160 ; 0x3c0000 + 800586c: f44f 1270 mov.w r2, #3932160 ; 0x3c0000 + 8005870: 60ba str r2, [r7, #8] + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 8005872: 68ba ldr r2, [r7, #8] + 8005874: fa92 f2a2 rbit r2, r2 + 8005878: 607a str r2, [r7, #4] + return result; + 800587a: 687a ldr r2, [r7, #4] + 800587c: fab2 f282 clz r2, r2 + 8005880: b2d2 uxtb r2, r2 + 8005882: 40d3 lsrs r3, r2 + 8005884: 4a1c ldr r2, [pc, #112] ; (80058f8 ) + 8005886: 5cd3 ldrb r3, [r2, r3] + 8005888: 617b str r3, [r7, #20] + prediv = aPredivFactorTable[(uint32_t)(RCC->CFGR2 & RCC_CFGR2_PREDIV) >> POSITION_VAL(RCC_CFGR2_PREDIV)]; + 800588a: 4b19 ldr r3, [pc, #100] ; (80058f0 ) + 800588c: 6adb ldr r3, [r3, #44] ; 0x2c + 800588e: f003 030f and.w r3, r3, #15 + 8005892: 220f movs r2, #15 + 8005894: 613a str r2, [r7, #16] + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 8005896: 693a ldr r2, [r7, #16] + 8005898: fa92 f2a2 rbit r2, r2 + 800589c: 60fa str r2, [r7, #12] + return result; + 800589e: 68fa ldr r2, [r7, #12] + 80058a0: fab2 f282 clz r2, r2 + 80058a4: b2d2 uxtb r2, r2 + 80058a6: 40d3 lsrs r3, r2 + 80058a8: 4a14 ldr r2, [pc, #80] ; (80058fc ) + 80058aa: 5cd3 ldrb r3, [r2, r3] + 80058ac: 61bb str r3, [r7, #24] +#if defined(RCC_CFGR_PLLSRC_HSI_DIV2) + if ((tmpreg & RCC_CFGR_PLLSRC) != RCC_PLLSOURCE_HSI) + 80058ae: 69fb ldr r3, [r7, #28] + 80058b0: f403 3380 and.w r3, r3, #65536 ; 0x10000 + 80058b4: 2b00 cmp r3, #0 + 80058b6: d008 beq.n 80058ca + { + /* HSE used as PLL clock source : PLLCLK = HSE/PREDIV * PLLMUL */ + pllclk = (uint32_t)((uint64_t) HSE_VALUE / (uint64_t) (prediv)) * ((uint64_t) pllmul); + 80058b8: 4a0e ldr r2, [pc, #56] ; (80058f4 ) + 80058ba: 69bb ldr r3, [r7, #24] + 80058bc: fbb2 f2f3 udiv r2, r2, r3 + 80058c0: 697b ldr r3, [r7, #20] + 80058c2: fb02 f303 mul.w r3, r2, r3 + 80058c6: 627b str r3, [r7, #36] ; 0x24 + 80058c8: e004 b.n 80058d4 + } + else + { + /* HSI used as PLL clock source : PLLCLK = HSI/2 * PLLMUL */ + pllclk = (uint32_t)((uint64_t) (HSI_VALUE >> 1U) * ((uint64_t) pllmul)); + 80058ca: 697b ldr r3, [r7, #20] + 80058cc: 4a0c ldr r2, [pc, #48] ; (8005900 ) + 80058ce: fb02 f303 mul.w r3, r2, r3 + 80058d2: 627b str r3, [r7, #36] ; 0x24 + { + /* HSI used as PLL clock source : PLLCLK = HSI/PREDIV * PLLMUL */ + pllclk = (uint32_t)((uint64_t) HSI_VALUE / (uint64_t) (prediv)) * ((uint64_t) pllmul); + } +#endif /* RCC_CFGR_PLLSRC_HSI_DIV2 */ + sysclockfreq = pllclk; + 80058d4: 6a7b ldr r3, [r7, #36] ; 0x24 + 80058d6: 623b str r3, [r7, #32] + break; + 80058d8: e002 b.n 80058e0 + } + case RCC_SYSCLKSOURCE_STATUS_HSI: /* HSI used as system clock source */ + default: /* HSI used as system clock */ + { + sysclockfreq = HSI_VALUE; + 80058da: 4b0a ldr r3, [pc, #40] ; (8005904 ) + 80058dc: 623b str r3, [r7, #32] + break; + 80058de: bf00 nop + } + } + return sysclockfreq; + 80058e0: 6a3b ldr r3, [r7, #32] +} + 80058e2: 4618 mov r0, r3 + 80058e4: 372c adds r7, #44 ; 0x2c + 80058e6: 46bd mov sp, r7 + 80058e8: f85d 7b04 ldr.w r7, [sp], #4 + 80058ec: 4770 bx lr + 80058ee: bf00 nop + 80058f0: 40021000 .word 0x40021000 + 80058f4: 00f42400 .word 0x00f42400 + 80058f8: 080064f0 .word 0x080064f0 + 80058fc: 08006500 .word 0x08006500 + 8005900: 003d0900 .word 0x003d0900 + 8005904: 007a1200 .word 0x007a1200 + +08005908 : + * When the TIMx clock source is PLL clock, so the TIMx clock is PLL clock x 2. + * + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + 8005908: b580 push {r7, lr} + 800590a: b092 sub sp, #72 ; 0x48 + 800590c: af00 add r7, sp, #0 + 800590e: 6078 str r0, [r7, #4] + uint32_t tickstart = 0U; + 8005910: 2300 movs r3, #0 + 8005912: 643b str r3, [r7, #64] ; 0x40 + uint32_t temp_reg = 0U; + 8005914: 2300 movs r3, #0 + 8005916: 63fb str r3, [r7, #60] ; 0x3c + FlagStatus pwrclkchanged = RESET; + 8005918: 2300 movs r3, #0 + 800591a: f887 3047 strb.w r3, [r7, #71] ; 0x47 + + /* Check the parameters */ + assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); + + /*---------------------------- RTC configuration -------------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) + 800591e: 687b ldr r3, [r7, #4] + 8005920: 681b ldr r3, [r3, #0] + 8005922: f403 3380 and.w r3, r3, #65536 ; 0x10000 + 8005926: 2b00 cmp r3, #0 + 8005928: f000 80d4 beq.w 8005ad4 + + + /* As soon as function is called to change RTC clock source, activation of the + power domain is done. */ + /* Requires to enable write access to Backup Domain of necessary */ + if(__HAL_RCC_PWR_IS_CLK_DISABLED()) + 800592c: 4b4e ldr r3, [pc, #312] ; (8005a68 ) + 800592e: 69db ldr r3, [r3, #28] + 8005930: f003 5380 and.w r3, r3, #268435456 ; 0x10000000 + 8005934: 2b00 cmp r3, #0 + 8005936: d10e bne.n 8005956 + { + __HAL_RCC_PWR_CLK_ENABLE(); + 8005938: 4b4b ldr r3, [pc, #300] ; (8005a68 ) + 800593a: 69db ldr r3, [r3, #28] + 800593c: 4a4a ldr r2, [pc, #296] ; (8005a68 ) + 800593e: f043 5380 orr.w r3, r3, #268435456 ; 0x10000000 + 8005942: 61d3 str r3, [r2, #28] + 8005944: 4b48 ldr r3, [pc, #288] ; (8005a68 ) + 8005946: 69db ldr r3, [r3, #28] + 8005948: f003 5380 and.w r3, r3, #268435456 ; 0x10000000 + 800594c: 60bb str r3, [r7, #8] + 800594e: 68bb ldr r3, [r7, #8] + pwrclkchanged = SET; + 8005950: 2301 movs r3, #1 + 8005952: f887 3047 strb.w r3, [r7, #71] ; 0x47 + } + + if(HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) + 8005956: 4b45 ldr r3, [pc, #276] ; (8005a6c ) + 8005958: 681b ldr r3, [r3, #0] + 800595a: f403 7380 and.w r3, r3, #256 ; 0x100 + 800595e: 2b00 cmp r3, #0 + 8005960: d118 bne.n 8005994 + { + /* Enable write access to Backup domain */ + SET_BIT(PWR->CR, PWR_CR_DBP); + 8005962: 4b42 ldr r3, [pc, #264] ; (8005a6c ) + 8005964: 681b ldr r3, [r3, #0] + 8005966: 4a41 ldr r2, [pc, #260] ; (8005a6c ) + 8005968: f443 7380 orr.w r3, r3, #256 ; 0x100 + 800596c: 6013 str r3, [r2, #0] + + /* Wait for Backup domain Write protection disable */ + tickstart = HAL_GetTick(); + 800596e: f7fc fc79 bl 8002264 + 8005972: 6438 str r0, [r7, #64] ; 0x40 + + while(HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) + 8005974: e008 b.n 8005988 + { + if((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) + 8005976: f7fc fc75 bl 8002264 + 800597a: 4602 mov r2, r0 + 800597c: 6c3b ldr r3, [r7, #64] ; 0x40 + 800597e: 1ad3 subs r3, r2, r3 + 8005980: 2b64 cmp r3, #100 ; 0x64 + 8005982: d901 bls.n 8005988 + { + return HAL_TIMEOUT; + 8005984: 2303 movs r3, #3 + 8005986: e14b b.n 8005c20 + while(HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) + 8005988: 4b38 ldr r3, [pc, #224] ; (8005a6c ) + 800598a: 681b ldr r3, [r3, #0] + 800598c: f403 7380 and.w r3, r3, #256 ; 0x100 + 8005990: 2b00 cmp r3, #0 + 8005992: d0f0 beq.n 8005976 + } + } + } + + /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ + temp_reg = (RCC->BDCR & RCC_BDCR_RTCSEL); + 8005994: 4b34 ldr r3, [pc, #208] ; (8005a68 ) + 8005996: 6a1b ldr r3, [r3, #32] + 8005998: f403 7340 and.w r3, r3, #768 ; 0x300 + 800599c: 63fb str r3, [r7, #60] ; 0x3c + if((temp_reg != 0x00000000U) && (temp_reg != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) + 800599e: 6bfb ldr r3, [r7, #60] ; 0x3c + 80059a0: 2b00 cmp r3, #0 + 80059a2: f000 8084 beq.w 8005aae + 80059a6: 687b ldr r3, [r7, #4] + 80059a8: 685b ldr r3, [r3, #4] + 80059aa: f403 7340 and.w r3, r3, #768 ; 0x300 + 80059ae: 6bfa ldr r2, [r7, #60] ; 0x3c + 80059b0: 429a cmp r2, r3 + 80059b2: d07c beq.n 8005aae + { + /* Store the content of BDCR register before the reset of Backup Domain */ + temp_reg = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); + 80059b4: 4b2c ldr r3, [pc, #176] ; (8005a68 ) + 80059b6: 6a1b ldr r3, [r3, #32] + 80059b8: f423 7340 bic.w r3, r3, #768 ; 0x300 + 80059bc: 63fb str r3, [r7, #60] ; 0x3c + 80059be: f44f 3380 mov.w r3, #65536 ; 0x10000 + 80059c2: 633b str r3, [r7, #48] ; 0x30 + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 80059c4: 6b3b ldr r3, [r7, #48] ; 0x30 + 80059c6: fa93 f3a3 rbit r3, r3 + 80059ca: 62fb str r3, [r7, #44] ; 0x2c + return result; + 80059cc: 6afb ldr r3, [r7, #44] ; 0x2c + /* RTC Clock selection can be changed only if the Backup Domain is reset */ + __HAL_RCC_BACKUPRESET_FORCE(); + 80059ce: fab3 f383 clz r3, r3 + 80059d2: b2db uxtb r3, r3 + 80059d4: 461a mov r2, r3 + 80059d6: 4b26 ldr r3, [pc, #152] ; (8005a70 ) + 80059d8: 4413 add r3, r2 + 80059da: 009b lsls r3, r3, #2 + 80059dc: 461a mov r2, r3 + 80059de: 2301 movs r3, #1 + 80059e0: 6013 str r3, [r2, #0] + 80059e2: f44f 3380 mov.w r3, #65536 ; 0x10000 + 80059e6: 63bb str r3, [r7, #56] ; 0x38 + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 80059e8: 6bbb ldr r3, [r7, #56] ; 0x38 + 80059ea: fa93 f3a3 rbit r3, r3 + 80059ee: 637b str r3, [r7, #52] ; 0x34 + return result; + 80059f0: 6b7b ldr r3, [r7, #52] ; 0x34 + __HAL_RCC_BACKUPRESET_RELEASE(); + 80059f2: fab3 f383 clz r3, r3 + 80059f6: b2db uxtb r3, r3 + 80059f8: 461a mov r2, r3 + 80059fa: 4b1d ldr r3, [pc, #116] ; (8005a70 ) + 80059fc: 4413 add r3, r2 + 80059fe: 009b lsls r3, r3, #2 + 8005a00: 461a mov r2, r3 + 8005a02: 2300 movs r3, #0 + 8005a04: 6013 str r3, [r2, #0] + /* Restore the Content of BDCR register */ + RCC->BDCR = temp_reg; + 8005a06: 4a18 ldr r2, [pc, #96] ; (8005a68 ) + 8005a08: 6bfb ldr r3, [r7, #60] ; 0x3c + 8005a0a: 6213 str r3, [r2, #32] + + /* Wait for LSERDY if LSE was enabled */ + if (HAL_IS_BIT_SET(temp_reg, RCC_BDCR_LSEON)) + 8005a0c: 6bfb ldr r3, [r7, #60] ; 0x3c + 8005a0e: f003 0301 and.w r3, r3, #1 + 8005a12: 2b00 cmp r3, #0 + 8005a14: d04b beq.n 8005aae + { + /* Get Start Tick */ + tickstart = HAL_GetTick(); + 8005a16: f7fc fc25 bl 8002264 + 8005a1a: 6438 str r0, [r7, #64] ; 0x40 + + /* Wait till LSE is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) + 8005a1c: e00a b.n 8005a34 + { + if((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) + 8005a1e: f7fc fc21 bl 8002264 + 8005a22: 4602 mov r2, r0 + 8005a24: 6c3b ldr r3, [r7, #64] ; 0x40 + 8005a26: 1ad3 subs r3, r2, r3 + 8005a28: f241 3288 movw r2, #5000 ; 0x1388 + 8005a2c: 4293 cmp r3, r2 + 8005a2e: d901 bls.n 8005a34 + { + return HAL_TIMEOUT; + 8005a30: 2303 movs r3, #3 + 8005a32: e0f5 b.n 8005c20 + 8005a34: 2302 movs r3, #2 + 8005a36: 62bb str r3, [r7, #40] ; 0x28 + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 8005a38: 6abb ldr r3, [r7, #40] ; 0x28 + 8005a3a: fa93 f3a3 rbit r3, r3 + 8005a3e: 627b str r3, [r7, #36] ; 0x24 + 8005a40: 2302 movs r3, #2 + 8005a42: 623b str r3, [r7, #32] + 8005a44: 6a3b ldr r3, [r7, #32] + 8005a46: fa93 f3a3 rbit r3, r3 + 8005a4a: 61fb str r3, [r7, #28] + return result; + 8005a4c: 69fb ldr r3, [r7, #28] + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) + 8005a4e: fab3 f383 clz r3, r3 + 8005a52: b2db uxtb r3, r3 + 8005a54: 095b lsrs r3, r3, #5 + 8005a56: b2db uxtb r3, r3 + 8005a58: f043 0302 orr.w r3, r3, #2 + 8005a5c: b2db uxtb r3, r3 + 8005a5e: 2b02 cmp r3, #2 + 8005a60: d108 bne.n 8005a74 + 8005a62: 4b01 ldr r3, [pc, #4] ; (8005a68 ) + 8005a64: 6a1b ldr r3, [r3, #32] + 8005a66: e00d b.n 8005a84 + 8005a68: 40021000 .word 0x40021000 + 8005a6c: 40007000 .word 0x40007000 + 8005a70: 10908100 .word 0x10908100 + 8005a74: 2302 movs r3, #2 + 8005a76: 61bb str r3, [r7, #24] + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 8005a78: 69bb ldr r3, [r7, #24] + 8005a7a: fa93 f3a3 rbit r3, r3 + 8005a7e: 617b str r3, [r7, #20] + 8005a80: 4b69 ldr r3, [pc, #420] ; (8005c28 ) + 8005a82: 6a5b ldr r3, [r3, #36] ; 0x24 + 8005a84: 2202 movs r2, #2 + 8005a86: 613a str r2, [r7, #16] + 8005a88: 693a ldr r2, [r7, #16] + 8005a8a: fa92 f2a2 rbit r2, r2 + 8005a8e: 60fa str r2, [r7, #12] + return result; + 8005a90: 68fa ldr r2, [r7, #12] + 8005a92: fab2 f282 clz r2, r2 + 8005a96: b2d2 uxtb r2, r2 + 8005a98: f042 0240 orr.w r2, r2, #64 ; 0x40 + 8005a9c: b2d2 uxtb r2, r2 + 8005a9e: f002 021f and.w r2, r2, #31 + 8005aa2: 2101 movs r1, #1 + 8005aa4: fa01 f202 lsl.w r2, r1, r2 + 8005aa8: 4013 ands r3, r2 + 8005aaa: 2b00 cmp r3, #0 + 8005aac: d0b7 beq.n 8005a1e + } + } + } + } + __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); + 8005aae: 4b5e ldr r3, [pc, #376] ; (8005c28 ) + 8005ab0: 6a1b ldr r3, [r3, #32] + 8005ab2: f423 7240 bic.w r2, r3, #768 ; 0x300 + 8005ab6: 687b ldr r3, [r7, #4] + 8005ab8: 685b ldr r3, [r3, #4] + 8005aba: 495b ldr r1, [pc, #364] ; (8005c28 ) + 8005abc: 4313 orrs r3, r2 + 8005abe: 620b str r3, [r1, #32] + + /* Require to disable power clock if necessary */ + if(pwrclkchanged == SET) + 8005ac0: f897 3047 ldrb.w r3, [r7, #71] ; 0x47 + 8005ac4: 2b01 cmp r3, #1 + 8005ac6: d105 bne.n 8005ad4 + { + __HAL_RCC_PWR_CLK_DISABLE(); + 8005ac8: 4b57 ldr r3, [pc, #348] ; (8005c28 ) + 8005aca: 69db ldr r3, [r3, #28] + 8005acc: 4a56 ldr r2, [pc, #344] ; (8005c28 ) + 8005ace: f023 5380 bic.w r3, r3, #268435456 ; 0x10000000 + 8005ad2: 61d3 str r3, [r2, #28] + } + } + + /*------------------------------- USART1 Configuration ------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_USART1) == RCC_PERIPHCLK_USART1) + 8005ad4: 687b ldr r3, [r7, #4] + 8005ad6: 681b ldr r3, [r3, #0] + 8005ad8: f003 0301 and.w r3, r3, #1 + 8005adc: 2b00 cmp r3, #0 + 8005ade: d008 beq.n 8005af2 + { + /* Check the parameters */ + assert_param(IS_RCC_USART1CLKSOURCE(PeriphClkInit->Usart1ClockSelection)); + + /* Configure the USART1 clock source */ + __HAL_RCC_USART1_CONFIG(PeriphClkInit->Usart1ClockSelection); + 8005ae0: 4b51 ldr r3, [pc, #324] ; (8005c28 ) + 8005ae2: 6b1b ldr r3, [r3, #48] ; 0x30 + 8005ae4: f023 0203 bic.w r2, r3, #3 + 8005ae8: 687b ldr r3, [r7, #4] + 8005aea: 689b ldr r3, [r3, #8] + 8005aec: 494e ldr r1, [pc, #312] ; (8005c28 ) + 8005aee: 4313 orrs r3, r2 + 8005af0: 630b str r3, [r1, #48] ; 0x30 + } + +#if defined(RCC_CFGR3_USART2SW) + /*----------------------------- USART2 Configuration --------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_USART2) == RCC_PERIPHCLK_USART2) + 8005af2: 687b ldr r3, [r7, #4] + 8005af4: 681b ldr r3, [r3, #0] + 8005af6: f003 0302 and.w r3, r3, #2 + 8005afa: 2b00 cmp r3, #0 + 8005afc: d008 beq.n 8005b10 + { + /* Check the parameters */ + assert_param(IS_RCC_USART2CLKSOURCE(PeriphClkInit->Usart2ClockSelection)); + + /* Configure the USART2 clock source */ + __HAL_RCC_USART2_CONFIG(PeriphClkInit->Usart2ClockSelection); + 8005afe: 4b4a ldr r3, [pc, #296] ; (8005c28 ) + 8005b00: 6b1b ldr r3, [r3, #48] ; 0x30 + 8005b02: f423 3240 bic.w r2, r3, #196608 ; 0x30000 + 8005b06: 687b ldr r3, [r7, #4] + 8005b08: 68db ldr r3, [r3, #12] + 8005b0a: 4947 ldr r1, [pc, #284] ; (8005c28 ) + 8005b0c: 4313 orrs r3, r2 + 8005b0e: 630b str r3, [r1, #48] ; 0x30 + } +#endif /* RCC_CFGR3_USART2SW */ + +#if defined(RCC_CFGR3_USART3SW) + /*------------------------------ USART3 Configuration ------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_USART3) == RCC_PERIPHCLK_USART3) + 8005b10: 687b ldr r3, [r7, #4] + 8005b12: 681b ldr r3, [r3, #0] + 8005b14: f003 0304 and.w r3, r3, #4 + 8005b18: 2b00 cmp r3, #0 + 8005b1a: d008 beq.n 8005b2e + { + /* Check the parameters */ + assert_param(IS_RCC_USART3CLKSOURCE(PeriphClkInit->Usart3ClockSelection)); + + /* Configure the USART3 clock source */ + __HAL_RCC_USART3_CONFIG(PeriphClkInit->Usart3ClockSelection); + 8005b1c: 4b42 ldr r3, [pc, #264] ; (8005c28 ) + 8005b1e: 6b1b ldr r3, [r3, #48] ; 0x30 + 8005b20: f423 2240 bic.w r2, r3, #786432 ; 0xc0000 + 8005b24: 687b ldr r3, [r7, #4] + 8005b26: 691b ldr r3, [r3, #16] + 8005b28: 493f ldr r1, [pc, #252] ; (8005c28 ) + 8005b2a: 4313 orrs r3, r2 + 8005b2c: 630b str r3, [r1, #48] ; 0x30 + } +#endif /* RCC_CFGR3_USART3SW */ + + /*------------------------------ I2C1 Configuration ------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2C1) == RCC_PERIPHCLK_I2C1) + 8005b2e: 687b ldr r3, [r7, #4] + 8005b30: 681b ldr r3, [r3, #0] + 8005b32: f003 0320 and.w r3, r3, #32 + 8005b36: 2b00 cmp r3, #0 + 8005b38: d008 beq.n 8005b4c + { + /* Check the parameters */ + assert_param(IS_RCC_I2C1CLKSOURCE(PeriphClkInit->I2c1ClockSelection)); + + /* Configure the I2C1 clock source */ + __HAL_RCC_I2C1_CONFIG(PeriphClkInit->I2c1ClockSelection); + 8005b3a: 4b3b ldr r3, [pc, #236] ; (8005c28 ) + 8005b3c: 6b1b ldr r3, [r3, #48] ; 0x30 + 8005b3e: f023 0210 bic.w r2, r3, #16 + 8005b42: 687b ldr r3, [r7, #4] + 8005b44: 69db ldr r3, [r3, #28] + 8005b46: 4938 ldr r1, [pc, #224] ; (8005c28 ) + 8005b48: 4313 orrs r3, r2 + 8005b4a: 630b str r3, [r1, #48] ; 0x30 +#if defined(STM32F302xE) || defined(STM32F303xE)\ + || defined(STM32F302xC) || defined(STM32F303xC)\ + || defined(STM32F302x8) \ + || defined(STM32F373xC) + /*------------------------------ USB Configuration ------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_USB) == RCC_PERIPHCLK_USB) + 8005b4c: 687b ldr r3, [r7, #4] + 8005b4e: 681b ldr r3, [r3, #0] + 8005b50: f403 3300 and.w r3, r3, #131072 ; 0x20000 + 8005b54: 2b00 cmp r3, #0 + 8005b56: d008 beq.n 8005b6a + { + /* Check the parameters */ + assert_param(IS_RCC_USBCLKSOURCE(PeriphClkInit->USBClockSelection)); + + /* Configure the USB clock source */ + __HAL_RCC_USB_CONFIG(PeriphClkInit->USBClockSelection); + 8005b58: 4b33 ldr r3, [pc, #204] ; (8005c28 ) + 8005b5a: 685b ldr r3, [r3, #4] + 8005b5c: f423 0280 bic.w r2, r3, #4194304 ; 0x400000 + 8005b60: 687b ldr r3, [r7, #4] + 8005b62: 6b1b ldr r3, [r3, #48] ; 0x30 + 8005b64: 4930 ldr r1, [pc, #192] ; (8005c28 ) + 8005b66: 4313 orrs r3, r2 + 8005b68: 604b str r3, [r1, #4] + || defined(STM32F302xC) || defined(STM32F303xC) || defined(STM32F358xx)\ + || defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx)\ + || defined(STM32F373xC) || defined(STM32F378xx) + + /*------------------------------ I2C2 Configuration ------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2C2) == RCC_PERIPHCLK_I2C2) + 8005b6a: 687b ldr r3, [r7, #4] + 8005b6c: 681b ldr r3, [r3, #0] + 8005b6e: f003 0340 and.w r3, r3, #64 ; 0x40 + 8005b72: 2b00 cmp r3, #0 + 8005b74: d008 beq.n 8005b88 + { + /* Check the parameters */ + assert_param(IS_RCC_I2C2CLKSOURCE(PeriphClkInit->I2c2ClockSelection)); + + /* Configure the I2C2 clock source */ + __HAL_RCC_I2C2_CONFIG(PeriphClkInit->I2c2ClockSelection); + 8005b76: 4b2c ldr r3, [pc, #176] ; (8005c28 ) + 8005b78: 6b1b ldr r3, [r3, #48] ; 0x30 + 8005b7a: f023 0220 bic.w r2, r3, #32 + 8005b7e: 687b ldr r3, [r7, #4] + 8005b80: 6a1b ldr r3, [r3, #32] + 8005b82: 4929 ldr r1, [pc, #164] ; (8005c28 ) + 8005b84: 4313 orrs r3, r2 + 8005b86: 630b str r3, [r1, #48] ; 0x30 + +#if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx)\ + || defined(STM32F302xC) || defined(STM32F303xC) || defined(STM32F358xx) + + /*------------------------------ UART4 Configuration ------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_UART4) == RCC_PERIPHCLK_UART4) + 8005b88: 687b ldr r3, [r7, #4] + 8005b8a: 681b ldr r3, [r3, #0] + 8005b8c: f003 0308 and.w r3, r3, #8 + 8005b90: 2b00 cmp r3, #0 + 8005b92: d008 beq.n 8005ba6 + { + /* Check the parameters */ + assert_param(IS_RCC_UART4CLKSOURCE(PeriphClkInit->Uart4ClockSelection)); + + /* Configure the UART4 clock source */ + __HAL_RCC_UART4_CONFIG(PeriphClkInit->Uart4ClockSelection); + 8005b94: 4b24 ldr r3, [pc, #144] ; (8005c28 ) + 8005b96: 6b1b ldr r3, [r3, #48] ; 0x30 + 8005b98: f423 1240 bic.w r2, r3, #3145728 ; 0x300000 + 8005b9c: 687b ldr r3, [r7, #4] + 8005b9e: 695b ldr r3, [r3, #20] + 8005ba0: 4921 ldr r1, [pc, #132] ; (8005c28 ) + 8005ba2: 4313 orrs r3, r2 + 8005ba4: 630b str r3, [r1, #48] ; 0x30 + } + + /*------------------------------ UART5 Configuration ------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_UART5) == RCC_PERIPHCLK_UART5) + 8005ba6: 687b ldr r3, [r7, #4] + 8005ba8: 681b ldr r3, [r3, #0] + 8005baa: f003 0310 and.w r3, r3, #16 + 8005bae: 2b00 cmp r3, #0 + 8005bb0: d008 beq.n 8005bc4 + { + /* Check the parameters */ + assert_param(IS_RCC_UART5CLKSOURCE(PeriphClkInit->Uart5ClockSelection)); + + /* Configure the UART5 clock source */ + __HAL_RCC_UART5_CONFIG(PeriphClkInit->Uart5ClockSelection); + 8005bb2: 4b1d ldr r3, [pc, #116] ; (8005c28 ) + 8005bb4: 6b1b ldr r3, [r3, #48] ; 0x30 + 8005bb6: f423 0240 bic.w r2, r3, #12582912 ; 0xc00000 + 8005bba: 687b ldr r3, [r7, #4] + 8005bbc: 699b ldr r3, [r3, #24] + 8005bbe: 491a ldr r1, [pc, #104] ; (8005c28 ) + 8005bc0: 4313 orrs r3, r2 + 8005bc2: 630b str r3, [r1, #48] ; 0x30 + +#if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx)\ + || defined(STM32F302xC) || defined(STM32F303xC) || defined(STM32F358xx)\ + || defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx) + /*------------------------------ I2S Configuration ------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == RCC_PERIPHCLK_I2S) + 8005bc4: 687b ldr r3, [r7, #4] + 8005bc6: 681b ldr r3, [r3, #0] + 8005bc8: f403 7300 and.w r3, r3, #512 ; 0x200 + 8005bcc: 2b00 cmp r3, #0 + 8005bce: d008 beq.n 8005be2 + { + /* Check the parameters */ + assert_param(IS_RCC_I2SCLKSOURCE(PeriphClkInit->I2sClockSelection)); + + /* Configure the I2S clock source */ + __HAL_RCC_I2S_CONFIG(PeriphClkInit->I2sClockSelection); + 8005bd0: 4b15 ldr r3, [pc, #84] ; (8005c28 ) + 8005bd2: 685b ldr r3, [r3, #4] + 8005bd4: f423 0200 bic.w r2, r3, #8388608 ; 0x800000 + 8005bd8: 687b ldr r3, [r7, #4] + 8005bda: 6a9b ldr r3, [r3, #40] ; 0x28 + 8005bdc: 4912 ldr r1, [pc, #72] ; (8005c28 ) + 8005bde: 4313 orrs r3, r2 + 8005be0: 604b str r3, [r1, #4] +#if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx)\ + || defined(STM32F302xC) || defined(STM32F303xC) || defined(STM32F358xx)\ + || defined(STM32F303x8) || defined(STM32F334x8) || defined(STM32F328xx) + + /*------------------------------ ADC1 & ADC2 clock Configuration -------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_ADC12) == RCC_PERIPHCLK_ADC12) + 8005be2: 687b ldr r3, [r7, #4] + 8005be4: 681b ldr r3, [r3, #0] + 8005be6: f003 0380 and.w r3, r3, #128 ; 0x80 + 8005bea: 2b00 cmp r3, #0 + 8005bec: d008 beq.n 8005c00 + { + /* Check the parameters */ + assert_param(IS_RCC_ADC12PLLCLK_DIV(PeriphClkInit->Adc12ClockSelection)); + + /* Configure the ADC12 clock source */ + __HAL_RCC_ADC12_CONFIG(PeriphClkInit->Adc12ClockSelection); + 8005bee: 4b0e ldr r3, [pc, #56] ; (8005c28 ) + 8005bf0: 6adb ldr r3, [r3, #44] ; 0x2c + 8005bf2: f423 72f8 bic.w r2, r3, #496 ; 0x1f0 + 8005bf6: 687b ldr r3, [r7, #4] + 8005bf8: 6a5b ldr r3, [r3, #36] ; 0x24 + 8005bfa: 490b ldr r1, [pc, #44] ; (8005c28 ) + 8005bfc: 4313 orrs r3, r2 + 8005bfe: 62cb str r3, [r1, #44] ; 0x2c + || defined(STM32F302xC) || defined(STM32F303xC) || defined(STM32F358xx)\ + || defined(STM32F303x8) || defined(STM32F334x8) || defined(STM32F328xx)\ + || defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx) + + /*------------------------------ TIM1 clock Configuration ----------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM1) == RCC_PERIPHCLK_TIM1) + 8005c00: 687b ldr r3, [r7, #4] + 8005c02: 681b ldr r3, [r3, #0] + 8005c04: f403 5380 and.w r3, r3, #4096 ; 0x1000 + 8005c08: 2b00 cmp r3, #0 + 8005c0a: d008 beq.n 8005c1e + { + /* Check the parameters */ + assert_param(IS_RCC_TIM1CLKSOURCE(PeriphClkInit->Tim1ClockSelection)); + + /* Configure the TIM1 clock source */ + __HAL_RCC_TIM1_CONFIG(PeriphClkInit->Tim1ClockSelection); + 8005c0c: 4b06 ldr r3, [pc, #24] ; (8005c28 ) + 8005c0e: 6b1b ldr r3, [r3, #48] ; 0x30 + 8005c10: f423 7280 bic.w r2, r3, #256 ; 0x100 + 8005c14: 687b ldr r3, [r7, #4] + 8005c16: 6adb ldr r3, [r3, #44] ; 0x2c + 8005c18: 4903 ldr r1, [pc, #12] ; (8005c28 ) + 8005c1a: 4313 orrs r3, r2 + 8005c1c: 630b str r3, [r1, #48] ; 0x30 + __HAL_RCC_TIM20_CONFIG(PeriphClkInit->Tim20ClockSelection); + } +#endif /* STM32F303xE || STM32F398xx */ + + + return HAL_OK; + 8005c1e: 2300 movs r3, #0 +} + 8005c20: 4618 mov r0, r3 + 8005c22: 3748 adds r7, #72 ; 0x48 + 8005c24: 46bd mov sp, r7 + 8005c26: bd80 pop {r7, pc} + 8005c28: 40021000 .word 0x40021000 + +08005c2c : + * @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) +{ + 8005c2c: b580 push {r7, lr} + 8005c2e: b084 sub sp, #16 + 8005c30: af00 add r7, sp, #0 + 8005c32: 6078 str r0, [r7, #4] + uint32_t frxth; + + /* Check the SPI handle allocation */ + if (hspi == NULL) + 8005c34: 687b ldr r3, [r7, #4] + 8005c36: 2b00 cmp r3, #0 + 8005c38: d101 bne.n 8005c3e + { + return HAL_ERROR; + 8005c3a: 2301 movs r3, #1 + 8005c3c: e09d b.n 8005d7a + assert_param(IS_SPI_NSS(hspi->Init.NSS)); + assert_param(IS_SPI_NSSP(hspi->Init.NSSPMode)); + 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) + 8005c3e: 687b ldr r3, [r7, #4] + 8005c40: 6a5b ldr r3, [r3, #36] ; 0x24 + 8005c42: 2b00 cmp r3, #0 + 8005c44: d108 bne.n 8005c58 + { + assert_param(IS_SPI_CPOL(hspi->Init.CLKPolarity)); + assert_param(IS_SPI_CPHA(hspi->Init.CLKPhase)); + + if (hspi->Init.Mode == SPI_MODE_MASTER) + 8005c46: 687b ldr r3, [r7, #4] + 8005c48: 685b ldr r3, [r3, #4] + 8005c4a: f5b3 7f82 cmp.w r3, #260 ; 0x104 + 8005c4e: d009 beq.n 8005c64 + 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; + 8005c50: 687b ldr r3, [r7, #4] + 8005c52: 2200 movs r2, #0 + 8005c54: 61da str r2, [r3, #28] + 8005c56: e005 b.n 8005c64 + else + { + assert_param(IS_SPI_BAUDRATE_PRESCALER(hspi->Init.BaudRatePrescaler)); + + /* Force polarity and phase to TI protocaol requirements */ + hspi->Init.CLKPolarity = SPI_POLARITY_LOW; + 8005c58: 687b ldr r3, [r7, #4] + 8005c5a: 2200 movs r2, #0 + 8005c5c: 611a str r2, [r3, #16] + hspi->Init.CLKPhase = SPI_PHASE_1EDGE; + 8005c5e: 687b ldr r3, [r7, #4] + 8005c60: 2200 movs r2, #0 + 8005c62: 615a str r2, [r3, #20] + { + assert_param(IS_SPI_CRC_POLYNOMIAL(hspi->Init.CRCPolynomial)); + assert_param(IS_SPI_CRC_LENGTH(hspi->Init.CRCLength)); + } +#else + hspi->Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + 8005c64: 687b ldr r3, [r7, #4] + 8005c66: 2200 movs r2, #0 + 8005c68: 629a str r2, [r3, #40] ; 0x28 +#endif /* USE_SPI_CRC */ + + if (hspi->State == HAL_SPI_STATE_RESET) + 8005c6a: 687b ldr r3, [r7, #4] + 8005c6c: f893 305d ldrb.w r3, [r3, #93] ; 0x5d + 8005c70: b2db uxtb r3, r3 + 8005c72: 2b00 cmp r3, #0 + 8005c74: d106 bne.n 8005c84 + { + /* Allocate lock resource and initialize it */ + hspi->Lock = HAL_UNLOCKED; + 8005c76: 687b ldr r3, [r7, #4] + 8005c78: 2200 movs r2, #0 + 8005c7a: f883 205c strb.w r2, [r3, #92] ; 0x5c + + /* Init the low level hardware : GPIO, CLOCK, NVIC... */ + hspi->MspInitCallback(hspi); +#else + /* Init the low level hardware : GPIO, CLOCK, NVIC... */ + HAL_SPI_MspInit(hspi); + 8005c7e: 6878 ldr r0, [r7, #4] + 8005c80: f7fc f9e4 bl 800204c +#endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + } + + hspi->State = HAL_SPI_STATE_BUSY; + 8005c84: 687b ldr r3, [r7, #4] + 8005c86: 2202 movs r2, #2 + 8005c88: f883 205d strb.w r2, [r3, #93] ; 0x5d + + /* Disable the selected SPI peripheral */ + __HAL_SPI_DISABLE(hspi); + 8005c8c: 687b ldr r3, [r7, #4] + 8005c8e: 681b ldr r3, [r3, #0] + 8005c90: 681a ldr r2, [r3, #0] + 8005c92: 687b ldr r3, [r7, #4] + 8005c94: 681b ldr r3, [r3, #0] + 8005c96: f022 0240 bic.w r2, r2, #64 ; 0x40 + 8005c9a: 601a str r2, [r3, #0] + + /* Align by default the rs fifo threshold on the data size */ + if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) + 8005c9c: 687b ldr r3, [r7, #4] + 8005c9e: 68db ldr r3, [r3, #12] + 8005ca0: f5b3 6fe0 cmp.w r3, #1792 ; 0x700 + 8005ca4: d902 bls.n 8005cac + { + frxth = SPI_RXFIFO_THRESHOLD_HF; + 8005ca6: 2300 movs r3, #0 + 8005ca8: 60fb str r3, [r7, #12] + 8005caa: e002 b.n 8005cb2 + } + else + { + frxth = SPI_RXFIFO_THRESHOLD_QF; + 8005cac: f44f 5380 mov.w r3, #4096 ; 0x1000 + 8005cb0: 60fb str r3, [r7, #12] + } + + /* CRC calculation is valid only for 16Bit and 8 Bit */ + if ((hspi->Init.DataSize != SPI_DATASIZE_16BIT) && (hspi->Init.DataSize != SPI_DATASIZE_8BIT)) + 8005cb2: 687b ldr r3, [r7, #4] + 8005cb4: 68db ldr r3, [r3, #12] + 8005cb6: f5b3 6f70 cmp.w r3, #3840 ; 0xf00 + 8005cba: d007 beq.n 8005ccc + 8005cbc: 687b ldr r3, [r7, #4] + 8005cbe: 68db ldr r3, [r3, #12] + 8005cc0: f5b3 6fe0 cmp.w r3, #1792 ; 0x700 + 8005cc4: d002 beq.n 8005ccc + { + /* CRC must be disabled */ + hspi->Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + 8005cc6: 687b ldr r3, [r7, #4] + 8005cc8: 2200 movs r2, #0 + 8005cca: 629a str r2, [r3, #40] ; 0x28 + } + + /*----------------------- SPIx CR1 & CR2 Configuration ---------------------*/ + /* Configure : SPI Mode, Communication Mode, 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)) | + 8005ccc: 687b ldr r3, [r7, #4] + 8005cce: 685b ldr r3, [r3, #4] + 8005cd0: f403 7282 and.w r2, r3, #260 ; 0x104 + 8005cd4: 687b ldr r3, [r7, #4] + 8005cd6: 689b ldr r3, [r3, #8] + 8005cd8: f403 4304 and.w r3, r3, #33792 ; 0x8400 + 8005cdc: 431a orrs r2, r3 + 8005cde: 687b ldr r3, [r7, #4] + 8005ce0: 691b ldr r3, [r3, #16] + 8005ce2: f003 0302 and.w r3, r3, #2 + 8005ce6: 431a orrs r2, r3 + 8005ce8: 687b ldr r3, [r7, #4] + 8005cea: 695b ldr r3, [r3, #20] + 8005cec: f003 0301 and.w r3, r3, #1 + 8005cf0: 431a orrs r2, r3 + 8005cf2: 687b ldr r3, [r7, #4] + 8005cf4: 699b ldr r3, [r3, #24] + 8005cf6: f403 7300 and.w r3, r3, #512 ; 0x200 + 8005cfa: 431a orrs r2, r3 + 8005cfc: 687b ldr r3, [r7, #4] + 8005cfe: 69db ldr r3, [r3, #28] + 8005d00: f003 0338 and.w r3, r3, #56 ; 0x38 + 8005d04: 431a orrs r2, r3 + 8005d06: 687b ldr r3, [r7, #4] + 8005d08: 6a1b ldr r3, [r3, #32] + 8005d0a: f003 0380 and.w r3, r3, #128 ; 0x80 + 8005d0e: ea42 0103 orr.w r1, r2, r3 + 8005d12: 687b ldr r3, [r7, #4] + 8005d14: 6a9b ldr r3, [r3, #40] ; 0x28 + 8005d16: f403 5200 and.w r2, r3, #8192 ; 0x2000 + 8005d1a: 687b ldr r3, [r7, #4] + 8005d1c: 681b ldr r3, [r3, #0] + 8005d1e: 430a orrs r2, r1 + 8005d20: 601a str r2, [r3, #0] + } + } +#endif /* USE_SPI_CRC */ + + /* Configure : NSS management, TI Mode, NSS Pulse, Data size and Rx Fifo threshold */ + WRITE_REG(hspi->Instance->CR2, (((hspi->Init.NSS >> 16U) & SPI_CR2_SSOE) | + 8005d22: 687b ldr r3, [r7, #4] + 8005d24: 699b ldr r3, [r3, #24] + 8005d26: 0c1b lsrs r3, r3, #16 + 8005d28: f003 0204 and.w r2, r3, #4 + 8005d2c: 687b ldr r3, [r7, #4] + 8005d2e: 6a5b ldr r3, [r3, #36] ; 0x24 + 8005d30: f003 0310 and.w r3, r3, #16 + 8005d34: 431a orrs r2, r3 + 8005d36: 687b ldr r3, [r7, #4] + 8005d38: 6b5b ldr r3, [r3, #52] ; 0x34 + 8005d3a: f003 0308 and.w r3, r3, #8 + 8005d3e: 431a orrs r2, r3 + 8005d40: 687b ldr r3, [r7, #4] + 8005d42: 68db ldr r3, [r3, #12] + 8005d44: f403 6370 and.w r3, r3, #3840 ; 0xf00 + 8005d48: ea42 0103 orr.w r1, r2, r3 + 8005d4c: 68fb ldr r3, [r7, #12] + 8005d4e: f403 5280 and.w r2, r3, #4096 ; 0x1000 + 8005d52: 687b ldr r3, [r7, #4] + 8005d54: 681b ldr r3, [r3, #0] + 8005d56: 430a orrs r2, r1 + 8005d58: 605a str r2, [r3, #4] + } +#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); + 8005d5a: 687b ldr r3, [r7, #4] + 8005d5c: 681b ldr r3, [r3, #0] + 8005d5e: 69da ldr r2, [r3, #28] + 8005d60: 687b ldr r3, [r7, #4] + 8005d62: 681b ldr r3, [r3, #0] + 8005d64: f422 6200 bic.w r2, r2, #2048 ; 0x800 + 8005d68: 61da str r2, [r3, #28] +#endif /* SPI_I2SCFGR_I2SMOD */ + + hspi->ErrorCode = HAL_SPI_ERROR_NONE; + 8005d6a: 687b ldr r3, [r7, #4] + 8005d6c: 2200 movs r2, #0 + 8005d6e: 661a str r2, [r3, #96] ; 0x60 + hspi->State = HAL_SPI_STATE_READY; + 8005d70: 687b ldr r3, [r7, #4] + 8005d72: 2201 movs r2, #1 + 8005d74: f883 205d strb.w r2, [r3, #93] ; 0x5d + + return HAL_OK; + 8005d78: 2300 movs r3, #0 +} + 8005d7a: 4618 mov r0, r3 + 8005d7c: 3710 adds r7, #16 + 8005d7e: 46bd mov sp, r7 + 8005d80: bd80 pop {r7, pc} + +08005d82 : + * @param Timeout Timeout duration + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, + uint32_t Timeout) +{ + 8005d82: b580 push {r7, lr} + 8005d84: b08a sub sp, #40 ; 0x28 + 8005d86: af00 add r7, sp, #0 + 8005d88: 60f8 str r0, [r7, #12] + 8005d8a: 60b9 str r1, [r7, #8] + 8005d8c: 607a str r2, [r7, #4] + 8005d8e: 807b strh r3, [r7, #2] + __IO uint8_t * ptmpreg8; + __IO uint8_t tmpreg8 = 0; +#endif /* USE_SPI_CRC */ + + /* Variable used to alternate Rx and Tx during transfer */ + uint32_t txallowed = 1U; + 8005d90: 2301 movs r3, #1 + 8005d92: 627b str r3, [r7, #36] ; 0x24 + HAL_StatusTypeDef errorcode = HAL_OK; + 8005d94: 2300 movs r3, #0 + 8005d96: f887 3023 strb.w r3, [r7, #35] ; 0x23 + + /* Check Direction parameter */ + assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction)); + + /* Process Locked */ + __HAL_LOCK(hspi); + 8005d9a: 68fb ldr r3, [r7, #12] + 8005d9c: f893 305c ldrb.w r3, [r3, #92] ; 0x5c + 8005da0: 2b01 cmp r3, #1 + 8005da2: d101 bne.n 8005da8 + 8005da4: 2302 movs r3, #2 + 8005da6: e1fb b.n 80061a0 + 8005da8: 68fb ldr r3, [r7, #12] + 8005daa: 2201 movs r2, #1 + 8005dac: f883 205c strb.w r2, [r3, #92] ; 0x5c + + /* Init tickstart for timeout management*/ + tickstart = HAL_GetTick(); + 8005db0: f7fc fa58 bl 8002264 + 8005db4: 61f8 str r0, [r7, #28] + + /* Init temporary variables */ + tmp_state = hspi->State; + 8005db6: 68fb ldr r3, [r7, #12] + 8005db8: f893 305d ldrb.w r3, [r3, #93] ; 0x5d + 8005dbc: 76fb strb r3, [r7, #27] + tmp_mode = hspi->Init.Mode; + 8005dbe: 68fb ldr r3, [r7, #12] + 8005dc0: 685b ldr r3, [r3, #4] + 8005dc2: 617b str r3, [r7, #20] + initial_TxXferCount = Size; + 8005dc4: 887b ldrh r3, [r7, #2] + 8005dc6: 827b strh r3, [r7, #18] + initial_RxXferCount = Size; + 8005dc8: 887b ldrh r3, [r7, #2] + 8005dca: 823b strh r3, [r7, #16] +#if (USE_SPI_CRC != 0U) + spi_cr1 = READ_REG(hspi->Instance->CR1); + spi_cr2 = READ_REG(hspi->Instance->CR2); +#endif /* USE_SPI_CRC */ + + if (!((tmp_state == HAL_SPI_STATE_READY) || \ + 8005dcc: 7efb ldrb r3, [r7, #27] + 8005dce: 2b01 cmp r3, #1 + 8005dd0: d00e beq.n 8005df0 + 8005dd2: 697b ldr r3, [r7, #20] + 8005dd4: f5b3 7f82 cmp.w r3, #260 ; 0x104 + 8005dd8: d106 bne.n 8005de8 + ((tmp_mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES) && (tmp_state == HAL_SPI_STATE_BUSY_RX)))) + 8005dda: 68fb ldr r3, [r7, #12] + 8005ddc: 689b ldr r3, [r3, #8] + 8005dde: 2b00 cmp r3, #0 + 8005de0: d102 bne.n 8005de8 + 8005de2: 7efb ldrb r3, [r7, #27] + 8005de4: 2b04 cmp r3, #4 + 8005de6: d003 beq.n 8005df0 + { + errorcode = HAL_BUSY; + 8005de8: 2302 movs r3, #2 + 8005dea: f887 3023 strb.w r3, [r7, #35] ; 0x23 + goto error; + 8005dee: e1cd b.n 800618c + } + + if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U)) + 8005df0: 68bb ldr r3, [r7, #8] + 8005df2: 2b00 cmp r3, #0 + 8005df4: d005 beq.n 8005e02 + 8005df6: 687b ldr r3, [r7, #4] + 8005df8: 2b00 cmp r3, #0 + 8005dfa: d002 beq.n 8005e02 + 8005dfc: 887b ldrh r3, [r7, #2] + 8005dfe: 2b00 cmp r3, #0 + 8005e00: d103 bne.n 8005e0a + { + errorcode = HAL_ERROR; + 8005e02: 2301 movs r3, #1 + 8005e04: f887 3023 strb.w r3, [r7, #35] ; 0x23 + goto error; + 8005e08: e1c0 b.n 800618c + } + + /* Don't overwrite in case of HAL_SPI_STATE_BUSY_RX */ + if (hspi->State != HAL_SPI_STATE_BUSY_RX) + 8005e0a: 68fb ldr r3, [r7, #12] + 8005e0c: f893 305d ldrb.w r3, [r3, #93] ; 0x5d + 8005e10: b2db uxtb r3, r3 + 8005e12: 2b04 cmp r3, #4 + 8005e14: d003 beq.n 8005e1e + { + hspi->State = HAL_SPI_STATE_BUSY_TX_RX; + 8005e16: 68fb ldr r3, [r7, #12] + 8005e18: 2205 movs r2, #5 + 8005e1a: f883 205d strb.w r2, [r3, #93] ; 0x5d + } + + /* Set the transaction information */ + hspi->ErrorCode = HAL_SPI_ERROR_NONE; + 8005e1e: 68fb ldr r3, [r7, #12] + 8005e20: 2200 movs r2, #0 + 8005e22: 661a str r2, [r3, #96] ; 0x60 + hspi->pRxBuffPtr = (uint8_t *)pRxData; + 8005e24: 68fb ldr r3, [r7, #12] + 8005e26: 687a ldr r2, [r7, #4] + 8005e28: 641a str r2, [r3, #64] ; 0x40 + hspi->RxXferCount = Size; + 8005e2a: 68fb ldr r3, [r7, #12] + 8005e2c: 887a ldrh r2, [r7, #2] + 8005e2e: f8a3 2046 strh.w r2, [r3, #70] ; 0x46 + hspi->RxXferSize = Size; + 8005e32: 68fb ldr r3, [r7, #12] + 8005e34: 887a ldrh r2, [r7, #2] + 8005e36: f8a3 2044 strh.w r2, [r3, #68] ; 0x44 + hspi->pTxBuffPtr = (uint8_t *)pTxData; + 8005e3a: 68fb ldr r3, [r7, #12] + 8005e3c: 68ba ldr r2, [r7, #8] + 8005e3e: 639a str r2, [r3, #56] ; 0x38 + hspi->TxXferCount = Size; + 8005e40: 68fb ldr r3, [r7, #12] + 8005e42: 887a ldrh r2, [r7, #2] + 8005e44: 87da strh r2, [r3, #62] ; 0x3e + hspi->TxXferSize = Size; + 8005e46: 68fb ldr r3, [r7, #12] + 8005e48: 887a ldrh r2, [r7, #2] + 8005e4a: 879a strh r2, [r3, #60] ; 0x3c + + /*Init field not used in handle to zero */ + hspi->RxISR = NULL; + 8005e4c: 68fb ldr r3, [r7, #12] + 8005e4e: 2200 movs r2, #0 + 8005e50: 64da str r2, [r3, #76] ; 0x4c + hspi->TxISR = NULL; + 8005e52: 68fb ldr r3, [r7, #12] + 8005e54: 2200 movs r2, #0 + 8005e56: 651a str r2, [r3, #80] ; 0x50 + SPI_RESET_CRC(hspi); + } +#endif /* USE_SPI_CRC */ + + /* Set the Rx Fifo threshold */ + if ((hspi->Init.DataSize > SPI_DATASIZE_8BIT) || (initial_RxXferCount > 1U)) + 8005e58: 68fb ldr r3, [r7, #12] + 8005e5a: 68db ldr r3, [r3, #12] + 8005e5c: f5b3 6fe0 cmp.w r3, #1792 ; 0x700 + 8005e60: d802 bhi.n 8005e68 + 8005e62: 8a3b ldrh r3, [r7, #16] + 8005e64: 2b01 cmp r3, #1 + 8005e66: d908 bls.n 8005e7a + { + /* Set fiforxthreshold according the reception data length: 16bit */ + CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); + 8005e68: 68fb ldr r3, [r7, #12] + 8005e6a: 681b ldr r3, [r3, #0] + 8005e6c: 685a ldr r2, [r3, #4] + 8005e6e: 68fb ldr r3, [r7, #12] + 8005e70: 681b ldr r3, [r3, #0] + 8005e72: f422 5280 bic.w r2, r2, #4096 ; 0x1000 + 8005e76: 605a str r2, [r3, #4] + 8005e78: e007 b.n 8005e8a + } + else + { + /* Set fiforxthreshold according the reception data length: 8bit */ + SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); + 8005e7a: 68fb ldr r3, [r7, #12] + 8005e7c: 681b ldr r3, [r3, #0] + 8005e7e: 685a ldr r2, [r3, #4] + 8005e80: 68fb ldr r3, [r7, #12] + 8005e82: 681b ldr r3, [r3, #0] + 8005e84: f442 5280 orr.w r2, r2, #4096 ; 0x1000 + 8005e88: 605a str r2, [r3, #4] + } + + /* Check if the SPI is already enabled */ + if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) + 8005e8a: 68fb ldr r3, [r7, #12] + 8005e8c: 681b ldr r3, [r3, #0] + 8005e8e: 681b ldr r3, [r3, #0] + 8005e90: f003 0340 and.w r3, r3, #64 ; 0x40 + 8005e94: 2b40 cmp r3, #64 ; 0x40 + 8005e96: d007 beq.n 8005ea8 + { + /* Enable SPI peripheral */ + __HAL_SPI_ENABLE(hspi); + 8005e98: 68fb ldr r3, [r7, #12] + 8005e9a: 681b ldr r3, [r3, #0] + 8005e9c: 681a ldr r2, [r3, #0] + 8005e9e: 68fb ldr r3, [r7, #12] + 8005ea0: 681b ldr r3, [r3, #0] + 8005ea2: f042 0240 orr.w r2, r2, #64 ; 0x40 + 8005ea6: 601a str r2, [r3, #0] + } + + /* Transmit and Receive data in 16 Bit mode */ + if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) + 8005ea8: 68fb ldr r3, [r7, #12] + 8005eaa: 68db ldr r3, [r3, #12] + 8005eac: f5b3 6fe0 cmp.w r3, #1792 ; 0x700 + 8005eb0: d97c bls.n 8005fac + { + if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U)) + 8005eb2: 68fb ldr r3, [r7, #12] + 8005eb4: 685b ldr r3, [r3, #4] + 8005eb6: 2b00 cmp r3, #0 + 8005eb8: d002 beq.n 8005ec0 + 8005eba: 8a7b ldrh r3, [r7, #18] + 8005ebc: 2b01 cmp r3, #1 + 8005ebe: d169 bne.n 8005f94 + { + hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr); + 8005ec0: 68fb ldr r3, [r7, #12] + 8005ec2: 6b9b ldr r3, [r3, #56] ; 0x38 + 8005ec4: 881a ldrh r2, [r3, #0] + 8005ec6: 68fb ldr r3, [r7, #12] + 8005ec8: 681b ldr r3, [r3, #0] + 8005eca: 60da str r2, [r3, #12] + hspi->pTxBuffPtr += sizeof(uint16_t); + 8005ecc: 68fb ldr r3, [r7, #12] + 8005ece: 6b9b ldr r3, [r3, #56] ; 0x38 + 8005ed0: 1c9a adds r2, r3, #2 + 8005ed2: 68fb ldr r3, [r7, #12] + 8005ed4: 639a str r2, [r3, #56] ; 0x38 + hspi->TxXferCount--; + 8005ed6: 68fb ldr r3, [r7, #12] + 8005ed8: 8fdb ldrh r3, [r3, #62] ; 0x3e + 8005eda: b29b uxth r3, r3 + 8005edc: 3b01 subs r3, #1 + 8005ede: b29a uxth r2, r3 + 8005ee0: 68fb ldr r3, [r7, #12] + 8005ee2: 87da strh r2, [r3, #62] ; 0x3e + } + while ((hspi->TxXferCount > 0U) || (hspi->RxXferCount > 0U)) + 8005ee4: e056 b.n 8005f94 + { + /* Check TXE flag */ + if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE)) && (hspi->TxXferCount > 0U) && (txallowed == 1U)) + 8005ee6: 68fb ldr r3, [r7, #12] + 8005ee8: 681b ldr r3, [r3, #0] + 8005eea: 689b ldr r3, [r3, #8] + 8005eec: f003 0302 and.w r3, r3, #2 + 8005ef0: 2b02 cmp r3, #2 + 8005ef2: d11b bne.n 8005f2c + 8005ef4: 68fb ldr r3, [r7, #12] + 8005ef6: 8fdb ldrh r3, [r3, #62] ; 0x3e + 8005ef8: b29b uxth r3, r3 + 8005efa: 2b00 cmp r3, #0 + 8005efc: d016 beq.n 8005f2c + 8005efe: 6a7b ldr r3, [r7, #36] ; 0x24 + 8005f00: 2b01 cmp r3, #1 + 8005f02: d113 bne.n 8005f2c + { + hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr); + 8005f04: 68fb ldr r3, [r7, #12] + 8005f06: 6b9b ldr r3, [r3, #56] ; 0x38 + 8005f08: 881a ldrh r2, [r3, #0] + 8005f0a: 68fb ldr r3, [r7, #12] + 8005f0c: 681b ldr r3, [r3, #0] + 8005f0e: 60da str r2, [r3, #12] + hspi->pTxBuffPtr += sizeof(uint16_t); + 8005f10: 68fb ldr r3, [r7, #12] + 8005f12: 6b9b ldr r3, [r3, #56] ; 0x38 + 8005f14: 1c9a adds r2, r3, #2 + 8005f16: 68fb ldr r3, [r7, #12] + 8005f18: 639a str r2, [r3, #56] ; 0x38 + hspi->TxXferCount--; + 8005f1a: 68fb ldr r3, [r7, #12] + 8005f1c: 8fdb ldrh r3, [r3, #62] ; 0x3e + 8005f1e: b29b uxth r3, r3 + 8005f20: 3b01 subs r3, #1 + 8005f22: b29a uxth r2, r3 + 8005f24: 68fb ldr r3, [r7, #12] + 8005f26: 87da strh r2, [r3, #62] ; 0x3e + /* Next Data is a reception (Rx). Tx not allowed */ + txallowed = 0U; + 8005f28: 2300 movs r3, #0 + 8005f2a: 627b str r3, [r7, #36] ; 0x24 + } +#endif /* USE_SPI_CRC */ + } + + /* Check RXNE flag */ + if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE)) && (hspi->RxXferCount > 0U)) + 8005f2c: 68fb ldr r3, [r7, #12] + 8005f2e: 681b ldr r3, [r3, #0] + 8005f30: 689b ldr r3, [r3, #8] + 8005f32: f003 0301 and.w r3, r3, #1 + 8005f36: 2b01 cmp r3, #1 + 8005f38: d11c bne.n 8005f74 + 8005f3a: 68fb ldr r3, [r7, #12] + 8005f3c: f8b3 3046 ldrh.w r3, [r3, #70] ; 0x46 + 8005f40: b29b uxth r3, r3 + 8005f42: 2b00 cmp r3, #0 + 8005f44: d016 beq.n 8005f74 + { + *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)hspi->Instance->DR; + 8005f46: 68fb ldr r3, [r7, #12] + 8005f48: 681b ldr r3, [r3, #0] + 8005f4a: 68da ldr r2, [r3, #12] + 8005f4c: 68fb ldr r3, [r7, #12] + 8005f4e: 6c1b ldr r3, [r3, #64] ; 0x40 + 8005f50: b292 uxth r2, r2 + 8005f52: 801a strh r2, [r3, #0] + hspi->pRxBuffPtr += sizeof(uint16_t); + 8005f54: 68fb ldr r3, [r7, #12] + 8005f56: 6c1b ldr r3, [r3, #64] ; 0x40 + 8005f58: 1c9a adds r2, r3, #2 + 8005f5a: 68fb ldr r3, [r7, #12] + 8005f5c: 641a str r2, [r3, #64] ; 0x40 + hspi->RxXferCount--; + 8005f5e: 68fb ldr r3, [r7, #12] + 8005f60: f8b3 3046 ldrh.w r3, [r3, #70] ; 0x46 + 8005f64: b29b uxth r3, r3 + 8005f66: 3b01 subs r3, #1 + 8005f68: b29a uxth r2, r3 + 8005f6a: 68fb ldr r3, [r7, #12] + 8005f6c: f8a3 2046 strh.w r2, [r3, #70] ; 0x46 + /* Next Data is a Transmission (Tx). Tx is allowed */ + txallowed = 1U; + 8005f70: 2301 movs r3, #1 + 8005f72: 627b str r3, [r7, #36] ; 0x24 + } + if (((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) + 8005f74: f7fc f976 bl 8002264 + 8005f78: 4602 mov r2, r0 + 8005f7a: 69fb ldr r3, [r7, #28] + 8005f7c: 1ad3 subs r3, r2, r3 + 8005f7e: 6b3a ldr r2, [r7, #48] ; 0x30 + 8005f80: 429a cmp r2, r3 + 8005f82: d807 bhi.n 8005f94 + 8005f84: 6b3b ldr r3, [r7, #48] ; 0x30 + 8005f86: f1b3 3fff cmp.w r3, #4294967295 ; 0xffffffff + 8005f8a: d003 beq.n 8005f94 + { + errorcode = HAL_TIMEOUT; + 8005f8c: 2303 movs r3, #3 + 8005f8e: f887 3023 strb.w r3, [r7, #35] ; 0x23 + goto error; + 8005f92: e0fb b.n 800618c + while ((hspi->TxXferCount > 0U) || (hspi->RxXferCount > 0U)) + 8005f94: 68fb ldr r3, [r7, #12] + 8005f96: 8fdb ldrh r3, [r3, #62] ; 0x3e + 8005f98: b29b uxth r3, r3 + 8005f9a: 2b00 cmp r3, #0 + 8005f9c: d1a3 bne.n 8005ee6 + 8005f9e: 68fb ldr r3, [r7, #12] + 8005fa0: f8b3 3046 ldrh.w r3, [r3, #70] ; 0x46 + 8005fa4: b29b uxth r3, r3 + 8005fa6: 2b00 cmp r3, #0 + 8005fa8: d19d bne.n 8005ee6 + 8005faa: e0df b.n 800616c + } + } + /* Transmit and Receive data in 8 Bit mode */ + else + { + if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U)) + 8005fac: 68fb ldr r3, [r7, #12] + 8005fae: 685b ldr r3, [r3, #4] + 8005fb0: 2b00 cmp r3, #0 + 8005fb2: d003 beq.n 8005fbc + 8005fb4: 8a7b ldrh r3, [r7, #18] + 8005fb6: 2b01 cmp r3, #1 + 8005fb8: f040 80cb bne.w 8006152 + { + if (hspi->TxXferCount > 1U) + 8005fbc: 68fb ldr r3, [r7, #12] + 8005fbe: 8fdb ldrh r3, [r3, #62] ; 0x3e + 8005fc0: b29b uxth r3, r3 + 8005fc2: 2b01 cmp r3, #1 + 8005fc4: d912 bls.n 8005fec + { + hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr); + 8005fc6: 68fb ldr r3, [r7, #12] + 8005fc8: 6b9b ldr r3, [r3, #56] ; 0x38 + 8005fca: 881a ldrh r2, [r3, #0] + 8005fcc: 68fb ldr r3, [r7, #12] + 8005fce: 681b ldr r3, [r3, #0] + 8005fd0: 60da str r2, [r3, #12] + hspi->pTxBuffPtr += sizeof(uint16_t); + 8005fd2: 68fb ldr r3, [r7, #12] + 8005fd4: 6b9b ldr r3, [r3, #56] ; 0x38 + 8005fd6: 1c9a adds r2, r3, #2 + 8005fd8: 68fb ldr r3, [r7, #12] + 8005fda: 639a str r2, [r3, #56] ; 0x38 + hspi->TxXferCount -= 2U; + 8005fdc: 68fb ldr r3, [r7, #12] + 8005fde: 8fdb ldrh r3, [r3, #62] ; 0x3e + 8005fe0: b29b uxth r3, r3 + 8005fe2: 3b02 subs r3, #2 + 8005fe4: b29a uxth r2, r3 + 8005fe6: 68fb ldr r3, [r7, #12] + 8005fe8: 87da strh r2, [r3, #62] ; 0x3e + 8005fea: e0b2 b.n 8006152 + } + else + { + *(__IO uint8_t *)&hspi->Instance->DR = (*hspi->pTxBuffPtr); + 8005fec: 68fb ldr r3, [r7, #12] + 8005fee: 6b9a ldr r2, [r3, #56] ; 0x38 + 8005ff0: 68fb ldr r3, [r7, #12] + 8005ff2: 681b ldr r3, [r3, #0] + 8005ff4: 330c adds r3, #12 + 8005ff6: 7812 ldrb r2, [r2, #0] + 8005ff8: 701a strb r2, [r3, #0] + hspi->pTxBuffPtr++; + 8005ffa: 68fb ldr r3, [r7, #12] + 8005ffc: 6b9b ldr r3, [r3, #56] ; 0x38 + 8005ffe: 1c5a adds r2, r3, #1 + 8006000: 68fb ldr r3, [r7, #12] + 8006002: 639a str r2, [r3, #56] ; 0x38 + hspi->TxXferCount--; + 8006004: 68fb ldr r3, [r7, #12] + 8006006: 8fdb ldrh r3, [r3, #62] ; 0x3e + 8006008: b29b uxth r3, r3 + 800600a: 3b01 subs r3, #1 + 800600c: b29a uxth r2, r3 + 800600e: 68fb ldr r3, [r7, #12] + 8006010: 87da strh r2, [r3, #62] ; 0x3e + } + } + while ((hspi->TxXferCount > 0U) || (hspi->RxXferCount > 0U)) + 8006012: e09e b.n 8006152 + { + /* Check TXE flag */ + if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE)) && (hspi->TxXferCount > 0U) && (txallowed == 1U)) + 8006014: 68fb ldr r3, [r7, #12] + 8006016: 681b ldr r3, [r3, #0] + 8006018: 689b ldr r3, [r3, #8] + 800601a: f003 0302 and.w r3, r3, #2 + 800601e: 2b02 cmp r3, #2 + 8006020: d134 bne.n 800608c + 8006022: 68fb ldr r3, [r7, #12] + 8006024: 8fdb ldrh r3, [r3, #62] ; 0x3e + 8006026: b29b uxth r3, r3 + 8006028: 2b00 cmp r3, #0 + 800602a: d02f beq.n 800608c + 800602c: 6a7b ldr r3, [r7, #36] ; 0x24 + 800602e: 2b01 cmp r3, #1 + 8006030: d12c bne.n 800608c + { + if (hspi->TxXferCount > 1U) + 8006032: 68fb ldr r3, [r7, #12] + 8006034: 8fdb ldrh r3, [r3, #62] ; 0x3e + 8006036: b29b uxth r3, r3 + 8006038: 2b01 cmp r3, #1 + 800603a: d912 bls.n 8006062 + { + hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr); + 800603c: 68fb ldr r3, [r7, #12] + 800603e: 6b9b ldr r3, [r3, #56] ; 0x38 + 8006040: 881a ldrh r2, [r3, #0] + 8006042: 68fb ldr r3, [r7, #12] + 8006044: 681b ldr r3, [r3, #0] + 8006046: 60da str r2, [r3, #12] + hspi->pTxBuffPtr += sizeof(uint16_t); + 8006048: 68fb ldr r3, [r7, #12] + 800604a: 6b9b ldr r3, [r3, #56] ; 0x38 + 800604c: 1c9a adds r2, r3, #2 + 800604e: 68fb ldr r3, [r7, #12] + 8006050: 639a str r2, [r3, #56] ; 0x38 + hspi->TxXferCount -= 2U; + 8006052: 68fb ldr r3, [r7, #12] + 8006054: 8fdb ldrh r3, [r3, #62] ; 0x3e + 8006056: b29b uxth r3, r3 + 8006058: 3b02 subs r3, #2 + 800605a: b29a uxth r2, r3 + 800605c: 68fb ldr r3, [r7, #12] + 800605e: 87da strh r2, [r3, #62] ; 0x3e + 8006060: e012 b.n 8006088 + } + else + { + *(__IO uint8_t *)&hspi->Instance->DR = (*hspi->pTxBuffPtr); + 8006062: 68fb ldr r3, [r7, #12] + 8006064: 6b9a ldr r2, [r3, #56] ; 0x38 + 8006066: 68fb ldr r3, [r7, #12] + 8006068: 681b ldr r3, [r3, #0] + 800606a: 330c adds r3, #12 + 800606c: 7812 ldrb r2, [r2, #0] + 800606e: 701a strb r2, [r3, #0] + hspi->pTxBuffPtr++; + 8006070: 68fb ldr r3, [r7, #12] + 8006072: 6b9b ldr r3, [r3, #56] ; 0x38 + 8006074: 1c5a adds r2, r3, #1 + 8006076: 68fb ldr r3, [r7, #12] + 8006078: 639a str r2, [r3, #56] ; 0x38 + hspi->TxXferCount--; + 800607a: 68fb ldr r3, [r7, #12] + 800607c: 8fdb ldrh r3, [r3, #62] ; 0x3e + 800607e: b29b uxth r3, r3 + 8006080: 3b01 subs r3, #1 + 8006082: b29a uxth r2, r3 + 8006084: 68fb ldr r3, [r7, #12] + 8006086: 87da strh r2, [r3, #62] ; 0x3e + } + /* Next Data is a reception (Rx). Tx not allowed */ + txallowed = 0U; + 8006088: 2300 movs r3, #0 + 800608a: 627b str r3, [r7, #36] ; 0x24 + } +#endif /* USE_SPI_CRC */ + } + + /* Wait until RXNE flag is reset */ + if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE)) && (hspi->RxXferCount > 0U)) + 800608c: 68fb ldr r3, [r7, #12] + 800608e: 681b ldr r3, [r3, #0] + 8006090: 689b ldr r3, [r3, #8] + 8006092: f003 0301 and.w r3, r3, #1 + 8006096: 2b01 cmp r3, #1 + 8006098: d148 bne.n 800612c + 800609a: 68fb ldr r3, [r7, #12] + 800609c: f8b3 3046 ldrh.w r3, [r3, #70] ; 0x46 + 80060a0: b29b uxth r3, r3 + 80060a2: 2b00 cmp r3, #0 + 80060a4: d042 beq.n 800612c + { + if (hspi->RxXferCount > 1U) + 80060a6: 68fb ldr r3, [r7, #12] + 80060a8: f8b3 3046 ldrh.w r3, [r3, #70] ; 0x46 + 80060ac: b29b uxth r3, r3 + 80060ae: 2b01 cmp r3, #1 + 80060b0: d923 bls.n 80060fa + { + *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)hspi->Instance->DR; + 80060b2: 68fb ldr r3, [r7, #12] + 80060b4: 681b ldr r3, [r3, #0] + 80060b6: 68da ldr r2, [r3, #12] + 80060b8: 68fb ldr r3, [r7, #12] + 80060ba: 6c1b ldr r3, [r3, #64] ; 0x40 + 80060bc: b292 uxth r2, r2 + 80060be: 801a strh r2, [r3, #0] + hspi->pRxBuffPtr += sizeof(uint16_t); + 80060c0: 68fb ldr r3, [r7, #12] + 80060c2: 6c1b ldr r3, [r3, #64] ; 0x40 + 80060c4: 1c9a adds r2, r3, #2 + 80060c6: 68fb ldr r3, [r7, #12] + 80060c8: 641a str r2, [r3, #64] ; 0x40 + hspi->RxXferCount -= 2U; + 80060ca: 68fb ldr r3, [r7, #12] + 80060cc: f8b3 3046 ldrh.w r3, [r3, #70] ; 0x46 + 80060d0: b29b uxth r3, r3 + 80060d2: 3b02 subs r3, #2 + 80060d4: b29a uxth r2, r3 + 80060d6: 68fb ldr r3, [r7, #12] + 80060d8: f8a3 2046 strh.w r2, [r3, #70] ; 0x46 + if (hspi->RxXferCount <= 1U) + 80060dc: 68fb ldr r3, [r7, #12] + 80060de: f8b3 3046 ldrh.w r3, [r3, #70] ; 0x46 + 80060e2: b29b uxth r3, r3 + 80060e4: 2b01 cmp r3, #1 + 80060e6: d81f bhi.n 8006128 + { + /* Set RX Fifo threshold before to switch on 8 bit data size */ + SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); + 80060e8: 68fb ldr r3, [r7, #12] + 80060ea: 681b ldr r3, [r3, #0] + 80060ec: 685a ldr r2, [r3, #4] + 80060ee: 68fb ldr r3, [r7, #12] + 80060f0: 681b ldr r3, [r3, #0] + 80060f2: f442 5280 orr.w r2, r2, #4096 ; 0x1000 + 80060f6: 605a str r2, [r3, #4] + 80060f8: e016 b.n 8006128 + } + } + else + { + (*(uint8_t *)hspi->pRxBuffPtr) = *(__IO uint8_t *)&hspi->Instance->DR; + 80060fa: 68fb ldr r3, [r7, #12] + 80060fc: 681b ldr r3, [r3, #0] + 80060fe: f103 020c add.w r2, r3, #12 + 8006102: 68fb ldr r3, [r7, #12] + 8006104: 6c1b ldr r3, [r3, #64] ; 0x40 + 8006106: 7812 ldrb r2, [r2, #0] + 8006108: b2d2 uxtb r2, r2 + 800610a: 701a strb r2, [r3, #0] + hspi->pRxBuffPtr++; + 800610c: 68fb ldr r3, [r7, #12] + 800610e: 6c1b ldr r3, [r3, #64] ; 0x40 + 8006110: 1c5a adds r2, r3, #1 + 8006112: 68fb ldr r3, [r7, #12] + 8006114: 641a str r2, [r3, #64] ; 0x40 + hspi->RxXferCount--; + 8006116: 68fb ldr r3, [r7, #12] + 8006118: f8b3 3046 ldrh.w r3, [r3, #70] ; 0x46 + 800611c: b29b uxth r3, r3 + 800611e: 3b01 subs r3, #1 + 8006120: b29a uxth r2, r3 + 8006122: 68fb ldr r3, [r7, #12] + 8006124: f8a3 2046 strh.w r2, [r3, #70] ; 0x46 + } + /* Next Data is a Transmission (Tx). Tx is allowed */ + txallowed = 1U; + 8006128: 2301 movs r3, #1 + 800612a: 627b str r3, [r7, #36] ; 0x24 + } + if ((((HAL_GetTick() - tickstart) >= Timeout) && ((Timeout != HAL_MAX_DELAY))) || (Timeout == 0U)) + 800612c: f7fc f89a bl 8002264 + 8006130: 4602 mov r2, r0 + 8006132: 69fb ldr r3, [r7, #28] + 8006134: 1ad3 subs r3, r2, r3 + 8006136: 6b3a ldr r2, [r7, #48] ; 0x30 + 8006138: 429a cmp r2, r3 + 800613a: d803 bhi.n 8006144 + 800613c: 6b3b ldr r3, [r7, #48] ; 0x30 + 800613e: f1b3 3fff cmp.w r3, #4294967295 ; 0xffffffff + 8006142: d102 bne.n 800614a + 8006144: 6b3b ldr r3, [r7, #48] ; 0x30 + 8006146: 2b00 cmp r3, #0 + 8006148: d103 bne.n 8006152 + { + errorcode = HAL_TIMEOUT; + 800614a: 2303 movs r3, #3 + 800614c: f887 3023 strb.w r3, [r7, #35] ; 0x23 + goto error; + 8006150: e01c b.n 800618c + while ((hspi->TxXferCount > 0U) || (hspi->RxXferCount > 0U)) + 8006152: 68fb ldr r3, [r7, #12] + 8006154: 8fdb ldrh r3, [r3, #62] ; 0x3e + 8006156: b29b uxth r3, r3 + 8006158: 2b00 cmp r3, #0 + 800615a: f47f af5b bne.w 8006014 + 800615e: 68fb ldr r3, [r7, #12] + 8006160: f8b3 3046 ldrh.w r3, [r3, #70] ; 0x46 + 8006164: b29b uxth r3, r3 + 8006166: 2b00 cmp r3, #0 + 8006168: f47f af54 bne.w 8006014 + errorcode = HAL_ERROR; + } +#endif /* USE_SPI_CRC */ + + /* Check the end of the transaction */ + if (SPI_EndRxTxTransaction(hspi, Timeout, tickstart) != HAL_OK) + 800616c: 69fa ldr r2, [r7, #28] + 800616e: 6b39 ldr r1, [r7, #48] ; 0x30 + 8006170: 68f8 ldr r0, [r7, #12] + 8006172: f000 f937 bl 80063e4 + 8006176: 4603 mov r3, r0 + 8006178: 2b00 cmp r3, #0 + 800617a: d006 beq.n 800618a + { + errorcode = HAL_ERROR; + 800617c: 2301 movs r3, #1 + 800617e: f887 3023 strb.w r3, [r7, #35] ; 0x23 + hspi->ErrorCode = HAL_SPI_ERROR_FLAG; + 8006182: 68fb ldr r3, [r7, #12] + 8006184: 2220 movs r2, #32 + 8006186: 661a str r2, [r3, #96] ; 0x60 + 8006188: e000 b.n 800618c + } + +error : + 800618a: bf00 nop + hspi->State = HAL_SPI_STATE_READY; + 800618c: 68fb ldr r3, [r7, #12] + 800618e: 2201 movs r2, #1 + 8006190: f883 205d strb.w r2, [r3, #93] ; 0x5d + __HAL_UNLOCK(hspi); + 8006194: 68fb ldr r3, [r7, #12] + 8006196: 2200 movs r2, #0 + 8006198: f883 205c strb.w r2, [r3, #92] ; 0x5c + return errorcode; + 800619c: f897 3023 ldrb.w r3, [r7, #35] ; 0x23 +} + 80061a0: 4618 mov r0, r3 + 80061a2: 3728 adds r7, #40 ; 0x28 + 80061a4: 46bd mov sp, r7 + 80061a6: bd80 pop {r7, pc} + +080061a8 : + * @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) +{ + 80061a8: b580 push {r7, lr} + 80061aa: b088 sub sp, #32 + 80061ac: af00 add r7, sp, #0 + 80061ae: 60f8 str r0, [r7, #12] + 80061b0: 60b9 str r1, [r7, #8] + 80061b2: 603b str r3, [r7, #0] + 80061b4: 4613 mov r3, r2 + 80061b6: 71fb strb r3, [r7, #7] + __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); + 80061b8: f7fc f854 bl 8002264 + 80061bc: 4602 mov r2, r0 + 80061be: 6abb ldr r3, [r7, #40] ; 0x28 + 80061c0: 1a9b subs r3, r3, r2 + 80061c2: 683a ldr r2, [r7, #0] + 80061c4: 4413 add r3, r2 + 80061c6: 61fb str r3, [r7, #28] + tmp_tickstart = HAL_GetTick(); + 80061c8: f7fc f84c bl 8002264 + 80061cc: 61b8 str r0, [r7, #24] + + /* Calculate Timeout based on a software loop to avoid blocking issue if Systick is disabled */ + count = tmp_timeout * ((SystemCoreClock * 32U) >> 20U); + 80061ce: 4b39 ldr r3, [pc, #228] ; (80062b4 ) + 80061d0: 681b ldr r3, [r3, #0] + 80061d2: 015b lsls r3, r3, #5 + 80061d4: 0d1b lsrs r3, r3, #20 + 80061d6: 69fa ldr r2, [r7, #28] + 80061d8: fb02 f303 mul.w r3, r2, r3 + 80061dc: 617b str r3, [r7, #20] + + while ((__HAL_SPI_GET_FLAG(hspi, Flag) ? SET : RESET) != State) + 80061de: e054 b.n 800628a + { + if (Timeout != HAL_MAX_DELAY) + 80061e0: 683b ldr r3, [r7, #0] + 80061e2: f1b3 3fff cmp.w r3, #4294967295 ; 0xffffffff + 80061e6: d050 beq.n 800628a + { + if (((HAL_GetTick() - tmp_tickstart) >= tmp_timeout) || (tmp_timeout == 0U)) + 80061e8: f7fc f83c bl 8002264 + 80061ec: 4602 mov r2, r0 + 80061ee: 69bb ldr r3, [r7, #24] + 80061f0: 1ad3 subs r3, r2, r3 + 80061f2: 69fa ldr r2, [r7, #28] + 80061f4: 429a cmp r2, r3 + 80061f6: d902 bls.n 80061fe + 80061f8: 69fb ldr r3, [r7, #28] + 80061fa: 2b00 cmp r3, #0 + 80061fc: d13d bne.n 800627a + /* 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)); + 80061fe: 68fb ldr r3, [r7, #12] + 8006200: 681b ldr r3, [r3, #0] + 8006202: 685a ldr r2, [r3, #4] + 8006204: 68fb ldr r3, [r7, #12] + 8006206: 681b ldr r3, [r3, #0] + 8006208: f022 02e0 bic.w r2, r2, #224 ; 0xe0 + 800620c: 605a str r2, [r3, #4] + + if ((hspi->Init.Mode == SPI_MODE_MASTER) && ((hspi->Init.Direction == SPI_DIRECTION_1LINE) + 800620e: 68fb ldr r3, [r7, #12] + 8006210: 685b ldr r3, [r3, #4] + 8006212: f5b3 7f82 cmp.w r3, #260 ; 0x104 + 8006216: d111 bne.n 800623c + 8006218: 68fb ldr r3, [r7, #12] + 800621a: 689b ldr r3, [r3, #8] + 800621c: f5b3 4f00 cmp.w r3, #32768 ; 0x8000 + 8006220: d004 beq.n 800622c + || (hspi->Init.Direction == SPI_DIRECTION_2LINES_RXONLY))) + 8006222: 68fb ldr r3, [r7, #12] + 8006224: 689b ldr r3, [r3, #8] + 8006226: f5b3 6f80 cmp.w r3, #1024 ; 0x400 + 800622a: d107 bne.n 800623c + { + /* Disable SPI peripheral */ + __HAL_SPI_DISABLE(hspi); + 800622c: 68fb ldr r3, [r7, #12] + 800622e: 681b ldr r3, [r3, #0] + 8006230: 681a ldr r2, [r3, #0] + 8006232: 68fb ldr r3, [r7, #12] + 8006234: 681b ldr r3, [r3, #0] + 8006236: f022 0240 bic.w r2, r2, #64 ; 0x40 + 800623a: 601a str r2, [r3, #0] + } + + /* Reset CRC Calculation */ + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + 800623c: 68fb ldr r3, [r7, #12] + 800623e: 6a9b ldr r3, [r3, #40] ; 0x28 + 8006240: f5b3 5f00 cmp.w r3, #8192 ; 0x2000 + 8006244: d10f bne.n 8006266 + { + SPI_RESET_CRC(hspi); + 8006246: 68fb ldr r3, [r7, #12] + 8006248: 681b ldr r3, [r3, #0] + 800624a: 681a ldr r2, [r3, #0] + 800624c: 68fb ldr r3, [r7, #12] + 800624e: 681b ldr r3, [r3, #0] + 8006250: f422 5200 bic.w r2, r2, #8192 ; 0x2000 + 8006254: 601a str r2, [r3, #0] + 8006256: 68fb ldr r3, [r7, #12] + 8006258: 681b ldr r3, [r3, #0] + 800625a: 681a ldr r2, [r3, #0] + 800625c: 68fb ldr r3, [r7, #12] + 800625e: 681b ldr r3, [r3, #0] + 8006260: f442 5200 orr.w r2, r2, #8192 ; 0x2000 + 8006264: 601a str r2, [r3, #0] + } + + hspi->State = HAL_SPI_STATE_READY; + 8006266: 68fb ldr r3, [r7, #12] + 8006268: 2201 movs r2, #1 + 800626a: f883 205d strb.w r2, [r3, #93] ; 0x5d + + /* Process Unlocked */ + __HAL_UNLOCK(hspi); + 800626e: 68fb ldr r3, [r7, #12] + 8006270: 2200 movs r2, #0 + 8006272: f883 205c strb.w r2, [r3, #92] ; 0x5c + + return HAL_TIMEOUT; + 8006276: 2303 movs r3, #3 + 8006278: e017 b.n 80062aa + } + /* If Systick is disabled or not incremented, deactivate timeout to go in disable loop procedure */ + if(count == 0U) + 800627a: 697b ldr r3, [r7, #20] + 800627c: 2b00 cmp r3, #0 + 800627e: d101 bne.n 8006284 + { + tmp_timeout = 0U; + 8006280: 2300 movs r3, #0 + 8006282: 61fb str r3, [r7, #28] + } + count--; + 8006284: 697b ldr r3, [r7, #20] + 8006286: 3b01 subs r3, #1 + 8006288: 617b str r3, [r7, #20] + while ((__HAL_SPI_GET_FLAG(hspi, Flag) ? SET : RESET) != State) + 800628a: 68fb ldr r3, [r7, #12] + 800628c: 681b ldr r3, [r3, #0] + 800628e: 689a ldr r2, [r3, #8] + 8006290: 68bb ldr r3, [r7, #8] + 8006292: 4013 ands r3, r2 + 8006294: 68ba ldr r2, [r7, #8] + 8006296: 429a cmp r2, r3 + 8006298: bf0c ite eq + 800629a: 2301 moveq r3, #1 + 800629c: 2300 movne r3, #0 + 800629e: b2db uxtb r3, r3 + 80062a0: 461a mov r2, r3 + 80062a2: 79fb ldrb r3, [r7, #7] + 80062a4: 429a cmp r2, r3 + 80062a6: d19b bne.n 80061e0 + } + } + + return HAL_OK; + 80062a8: 2300 movs r3, #0 +} + 80062aa: 4618 mov r0, r3 + 80062ac: 3720 adds r7, #32 + 80062ae: 46bd mov sp, r7 + 80062b0: bd80 pop {r7, pc} + 80062b2: bf00 nop + 80062b4: 20000008 .word 0x20000008 + +080062b8 : + * @param Tickstart tick start value + * @retval HAL status + */ +static HAL_StatusTypeDef SPI_WaitFifoStateUntilTimeout(SPI_HandleTypeDef *hspi, uint32_t Fifo, uint32_t State, + uint32_t Timeout, uint32_t Tickstart) +{ + 80062b8: b580 push {r7, lr} + 80062ba: b08a sub sp, #40 ; 0x28 + 80062bc: af00 add r7, sp, #0 + 80062be: 60f8 str r0, [r7, #12] + 80062c0: 60b9 str r1, [r7, #8] + 80062c2: 607a str r2, [r7, #4] + 80062c4: 603b str r3, [r7, #0] + __IO uint32_t count; + uint32_t tmp_timeout; + uint32_t tmp_tickstart; + __IO uint8_t * ptmpreg8; + __IO uint8_t tmpreg8 = 0; + 80062c6: 2300 movs r3, #0 + 80062c8: 75fb strb r3, [r7, #23] + + /* Adjust Timeout value in case of end of transfer */ + tmp_timeout = Timeout - (HAL_GetTick() - Tickstart); + 80062ca: f7fb ffcb bl 8002264 + 80062ce: 4602 mov r2, r0 + 80062d0: 6b3b ldr r3, [r7, #48] ; 0x30 + 80062d2: 1a9b subs r3, r3, r2 + 80062d4: 683a ldr r2, [r7, #0] + 80062d6: 4413 add r3, r2 + 80062d8: 627b str r3, [r7, #36] ; 0x24 + tmp_tickstart = HAL_GetTick(); + 80062da: f7fb ffc3 bl 8002264 + 80062de: 6238 str r0, [r7, #32] + + /* Initialize the 8bit temporary pointer */ + ptmpreg8 = (__IO uint8_t *)&hspi->Instance->DR; + 80062e0: 68fb ldr r3, [r7, #12] + 80062e2: 681b ldr r3, [r3, #0] + 80062e4: 330c adds r3, #12 + 80062e6: 61fb str r3, [r7, #28] + + /* Calculate Timeout based on a software loop to avoid blocking issue if Systick is disabled */ + count = tmp_timeout * ((SystemCoreClock * 35U) >> 20U); + 80062e8: 4b3d ldr r3, [pc, #244] ; (80063e0 ) + 80062ea: 681a ldr r2, [r3, #0] + 80062ec: 4613 mov r3, r2 + 80062ee: 009b lsls r3, r3, #2 + 80062f0: 4413 add r3, r2 + 80062f2: 00da lsls r2, r3, #3 + 80062f4: 1ad3 subs r3, r2, r3 + 80062f6: 0d1b lsrs r3, r3, #20 + 80062f8: 6a7a ldr r2, [r7, #36] ; 0x24 + 80062fa: fb02 f303 mul.w r3, r2, r3 + 80062fe: 61bb str r3, [r7, #24] + + while ((hspi->Instance->SR & Fifo) != State) + 8006300: e060 b.n 80063c4 + { + if ((Fifo == SPI_SR_FRLVL) && (State == SPI_FRLVL_EMPTY)) + 8006302: 68bb ldr r3, [r7, #8] + 8006304: f5b3 6fc0 cmp.w r3, #1536 ; 0x600 + 8006308: d107 bne.n 800631a + 800630a: 687b ldr r3, [r7, #4] + 800630c: 2b00 cmp r3, #0 + 800630e: d104 bne.n 800631a + { + /* Flush Data Register by a blank read */ + tmpreg8 = *ptmpreg8; + 8006310: 69fb ldr r3, [r7, #28] + 8006312: 781b ldrb r3, [r3, #0] + 8006314: b2db uxtb r3, r3 + 8006316: 75fb strb r3, [r7, #23] + /* To avoid GCC warning */ + UNUSED(tmpreg8); + 8006318: 7dfb ldrb r3, [r7, #23] + } + + if (Timeout != HAL_MAX_DELAY) + 800631a: 683b ldr r3, [r7, #0] + 800631c: f1b3 3fff cmp.w r3, #4294967295 ; 0xffffffff + 8006320: d050 beq.n 80063c4 + { + if (((HAL_GetTick() - tmp_tickstart) >= tmp_timeout) || (tmp_timeout == 0U)) + 8006322: f7fb ff9f bl 8002264 + 8006326: 4602 mov r2, r0 + 8006328: 6a3b ldr r3, [r7, #32] + 800632a: 1ad3 subs r3, r2, r3 + 800632c: 6a7a ldr r2, [r7, #36] ; 0x24 + 800632e: 429a cmp r2, r3 + 8006330: d902 bls.n 8006338 + 8006332: 6a7b ldr r3, [r7, #36] ; 0x24 + 8006334: 2b00 cmp r3, #0 + 8006336: d13d bne.n 80063b4 + /* 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)); + 8006338: 68fb ldr r3, [r7, #12] + 800633a: 681b ldr r3, [r3, #0] + 800633c: 685a ldr r2, [r3, #4] + 800633e: 68fb ldr r3, [r7, #12] + 8006340: 681b ldr r3, [r3, #0] + 8006342: f022 02e0 bic.w r2, r2, #224 ; 0xe0 + 8006346: 605a str r2, [r3, #4] + + if ((hspi->Init.Mode == SPI_MODE_MASTER) && ((hspi->Init.Direction == SPI_DIRECTION_1LINE) + 8006348: 68fb ldr r3, [r7, #12] + 800634a: 685b ldr r3, [r3, #4] + 800634c: f5b3 7f82 cmp.w r3, #260 ; 0x104 + 8006350: d111 bne.n 8006376 + 8006352: 68fb ldr r3, [r7, #12] + 8006354: 689b ldr r3, [r3, #8] + 8006356: f5b3 4f00 cmp.w r3, #32768 ; 0x8000 + 800635a: d004 beq.n 8006366 + || (hspi->Init.Direction == SPI_DIRECTION_2LINES_RXONLY))) + 800635c: 68fb ldr r3, [r7, #12] + 800635e: 689b ldr r3, [r3, #8] + 8006360: f5b3 6f80 cmp.w r3, #1024 ; 0x400 + 8006364: d107 bne.n 8006376 + { + /* Disable SPI peripheral */ + __HAL_SPI_DISABLE(hspi); + 8006366: 68fb ldr r3, [r7, #12] + 8006368: 681b ldr r3, [r3, #0] + 800636a: 681a ldr r2, [r3, #0] + 800636c: 68fb ldr r3, [r7, #12] + 800636e: 681b ldr r3, [r3, #0] + 8006370: f022 0240 bic.w r2, r2, #64 ; 0x40 + 8006374: 601a str r2, [r3, #0] + } + + /* Reset CRC Calculation */ + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + 8006376: 68fb ldr r3, [r7, #12] + 8006378: 6a9b ldr r3, [r3, #40] ; 0x28 + 800637a: f5b3 5f00 cmp.w r3, #8192 ; 0x2000 + 800637e: d10f bne.n 80063a0 + { + SPI_RESET_CRC(hspi); + 8006380: 68fb ldr r3, [r7, #12] + 8006382: 681b ldr r3, [r3, #0] + 8006384: 681a ldr r2, [r3, #0] + 8006386: 68fb ldr r3, [r7, #12] + 8006388: 681b ldr r3, [r3, #0] + 800638a: f422 5200 bic.w r2, r2, #8192 ; 0x2000 + 800638e: 601a str r2, [r3, #0] + 8006390: 68fb ldr r3, [r7, #12] + 8006392: 681b ldr r3, [r3, #0] + 8006394: 681a ldr r2, [r3, #0] + 8006396: 68fb ldr r3, [r7, #12] + 8006398: 681b ldr r3, [r3, #0] + 800639a: f442 5200 orr.w r2, r2, #8192 ; 0x2000 + 800639e: 601a str r2, [r3, #0] + } + + hspi->State = HAL_SPI_STATE_READY; + 80063a0: 68fb ldr r3, [r7, #12] + 80063a2: 2201 movs r2, #1 + 80063a4: f883 205d strb.w r2, [r3, #93] ; 0x5d + + /* Process Unlocked */ + __HAL_UNLOCK(hspi); + 80063a8: 68fb ldr r3, [r7, #12] + 80063aa: 2200 movs r2, #0 + 80063ac: f883 205c strb.w r2, [r3, #92] ; 0x5c + + return HAL_TIMEOUT; + 80063b0: 2303 movs r3, #3 + 80063b2: e010 b.n 80063d6 + } + /* If Systick is disabled or not incremented, deactivate timeout to go in disable loop procedure */ + if(count == 0U) + 80063b4: 69bb ldr r3, [r7, #24] + 80063b6: 2b00 cmp r3, #0 + 80063b8: d101 bne.n 80063be + { + tmp_timeout = 0U; + 80063ba: 2300 movs r3, #0 + 80063bc: 627b str r3, [r7, #36] ; 0x24 + } + count--; + 80063be: 69bb ldr r3, [r7, #24] + 80063c0: 3b01 subs r3, #1 + 80063c2: 61bb str r3, [r7, #24] + while ((hspi->Instance->SR & Fifo) != State) + 80063c4: 68fb ldr r3, [r7, #12] + 80063c6: 681b ldr r3, [r3, #0] + 80063c8: 689a ldr r2, [r3, #8] + 80063ca: 68bb ldr r3, [r7, #8] + 80063cc: 4013 ands r3, r2 + 80063ce: 687a ldr r2, [r7, #4] + 80063d0: 429a cmp r2, r3 + 80063d2: d196 bne.n 8006302 + } + } + + return HAL_OK; + 80063d4: 2300 movs r3, #0 +} + 80063d6: 4618 mov r0, r3 + 80063d8: 3728 adds r7, #40 ; 0x28 + 80063da: 46bd mov sp, r7 + 80063dc: bd80 pop {r7, pc} + 80063de: bf00 nop + 80063e0: 20000008 .word 0x20000008 + +080063e4 : + * @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) +{ + 80063e4: b580 push {r7, lr} + 80063e6: b086 sub sp, #24 + 80063e8: af02 add r7, sp, #8 + 80063ea: 60f8 str r0, [r7, #12] + 80063ec: 60b9 str r1, [r7, #8] + 80063ee: 607a str r2, [r7, #4] + /* Control if the TX fifo is empty */ + if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FTLVL, SPI_FTLVL_EMPTY, Timeout, Tickstart) != HAL_OK) + 80063f0: 687b ldr r3, [r7, #4] + 80063f2: 9300 str r3, [sp, #0] + 80063f4: 68bb ldr r3, [r7, #8] + 80063f6: 2200 movs r2, #0 + 80063f8: f44f 51c0 mov.w r1, #6144 ; 0x1800 + 80063fc: 68f8 ldr r0, [r7, #12] + 80063fe: f7ff ff5b bl 80062b8 + 8006402: 4603 mov r3, r0 + 8006404: 2b00 cmp r3, #0 + 8006406: d007 beq.n 8006418 + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); + 8006408: 68fb ldr r3, [r7, #12] + 800640a: 6e1b ldr r3, [r3, #96] ; 0x60 + 800640c: f043 0220 orr.w r2, r3, #32 + 8006410: 68fb ldr r3, [r7, #12] + 8006412: 661a str r2, [r3, #96] ; 0x60 + return HAL_TIMEOUT; + 8006414: 2303 movs r3, #3 + 8006416: e027 b.n 8006468 + } + + /* Control the BSY flag */ + if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_BSY, RESET, Timeout, Tickstart) != HAL_OK) + 8006418: 687b ldr r3, [r7, #4] + 800641a: 9300 str r3, [sp, #0] + 800641c: 68bb ldr r3, [r7, #8] + 800641e: 2200 movs r2, #0 + 8006420: 2180 movs r1, #128 ; 0x80 + 8006422: 68f8 ldr r0, [r7, #12] + 8006424: f7ff fec0 bl 80061a8 + 8006428: 4603 mov r3, r0 + 800642a: 2b00 cmp r3, #0 + 800642c: d007 beq.n 800643e + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); + 800642e: 68fb ldr r3, [r7, #12] + 8006430: 6e1b ldr r3, [r3, #96] ; 0x60 + 8006432: f043 0220 orr.w r2, r3, #32 + 8006436: 68fb ldr r3, [r7, #12] + 8006438: 661a str r2, [r3, #96] ; 0x60 + return HAL_TIMEOUT; + 800643a: 2303 movs r3, #3 + 800643c: e014 b.n 8006468 + } + + /* Control if the RX fifo is empty */ + if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, Timeout, Tickstart) != HAL_OK) + 800643e: 687b ldr r3, [r7, #4] + 8006440: 9300 str r3, [sp, #0] + 8006442: 68bb ldr r3, [r7, #8] + 8006444: 2200 movs r2, #0 + 8006446: f44f 61c0 mov.w r1, #1536 ; 0x600 + 800644a: 68f8 ldr r0, [r7, #12] + 800644c: f7ff ff34 bl 80062b8 + 8006450: 4603 mov r3, r0 + 8006452: 2b00 cmp r3, #0 + 8006454: d007 beq.n 8006466 + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); + 8006456: 68fb ldr r3, [r7, #12] + 8006458: 6e1b ldr r3, [r3, #96] ; 0x60 + 800645a: f043 0220 orr.w r2, r3, #32 + 800645e: 68fb ldr r3, [r7, #12] + 8006460: 661a str r2, [r3, #96] ; 0x60 + return HAL_TIMEOUT; + 8006462: 2303 movs r3, #3 + 8006464: e000 b.n 8006468 + } + + return HAL_OK; + 8006466: 2300 movs r3, #0 +} + 8006468: 4618 mov r0, r3 + 800646a: 3710 adds r7, #16 + 800646c: 46bd mov sp, r7 + 800646e: bd80 pop {r7, pc} + +08006470 <__libc_init_array>: + 8006470: b570 push {r4, r5, r6, lr} + 8006472: 4d0d ldr r5, [pc, #52] ; (80064a8 <__libc_init_array+0x38>) + 8006474: 4c0d ldr r4, [pc, #52] ; (80064ac <__libc_init_array+0x3c>) + 8006476: 1b64 subs r4, r4, r5 + 8006478: 10a4 asrs r4, r4, #2 + 800647a: 2600 movs r6, #0 + 800647c: 42a6 cmp r6, r4 + 800647e: d109 bne.n 8006494 <__libc_init_array+0x24> + 8006480: 4d0b ldr r5, [pc, #44] ; (80064b0 <__libc_init_array+0x40>) + 8006482: 4c0c ldr r4, [pc, #48] ; (80064b4 <__libc_init_array+0x44>) + 8006484: f000 f820 bl 80064c8 <_init> + 8006488: 1b64 subs r4, r4, r5 + 800648a: 10a4 asrs r4, r4, #2 + 800648c: 2600 movs r6, #0 + 800648e: 42a6 cmp r6, r4 + 8006490: d105 bne.n 800649e <__libc_init_array+0x2e> + 8006492: bd70 pop {r4, r5, r6, pc} + 8006494: f855 3b04 ldr.w r3, [r5], #4 + 8006498: 4798 blx r3 + 800649a: 3601 adds r6, #1 + 800649c: e7ee b.n 800647c <__libc_init_array+0xc> + 800649e: f855 3b04 ldr.w r3, [r5], #4 + 80064a2: 4798 blx r3 + 80064a4: 3601 adds r6, #1 + 80064a6: e7f2 b.n 800648e <__libc_init_array+0x1e> + 80064a8: 08006510 .word 0x08006510 + 80064ac: 08006510 .word 0x08006510 + 80064b0: 08006510 .word 0x08006510 + 80064b4: 08006514 .word 0x08006514 + +080064b8 : + 80064b8: 4402 add r2, r0 + 80064ba: 4603 mov r3, r0 + 80064bc: 4293 cmp r3, r2 + 80064be: d100 bne.n 80064c2 + 80064c0: 4770 bx lr + 80064c2: f803 1b01 strb.w r1, [r3], #1 + 80064c6: e7f9 b.n 80064bc + +080064c8 <_init>: + 80064c8: b5f8 push {r3, r4, r5, r6, r7, lr} + 80064ca: bf00 nop + 80064cc: bcf8 pop {r3, r4, r5, r6, r7} + 80064ce: bc08 pop {r3} + 80064d0: 469e mov lr, r3 + 80064d2: 4770 bx lr + +080064d4 <_fini>: + 80064d4: b5f8 push {r3, r4, r5, r6, r7, lr} + 80064d6: bf00 nop + 80064d8: bcf8 pop {r3, r4, r5, r6, r7} + 80064da: bc08 pop {r3} + 80064dc: 469e mov lr, r3 + 80064de: 4770 bx lr diff --git a/BMS_Testbench/BMS_Software_V1/Debug/BMS_Software.map b/BMS_Testbench/BMS_Software_V1/Debug/BMS_Software.map new file mode 100644 index 0000000..eef1176 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Debug/BMS_Software.map @@ -0,0 +1,4236 @@ +Archive member included to satisfy reference by file (symbol) + +/opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(lib_a-errno.o) + ./Core/Src/syscalls.o (__errno) +/opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(lib_a-exit.o) + /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o (exit) +/opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(lib_a-impure.o) + /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(lib_a-exit.o) (_global_impure_ptr) +/opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(lib_a-init.o) + /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o (__libc_init_array) +/opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(lib_a-memset.o) + /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o (memset) + +Discarded input sections + + .text 0x0000000000000000 0x0 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crti.o + .data 0x0000000000000000 0x0 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crti.o + .bss 0x0000000000000000 0x0 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crti.o + .data 0x0000000000000000 0x4 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtbegin.o + .rodata 0x0000000000000000 0x24 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtbegin.o + .text 0x0000000000000000 0x7c /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o + .data 0x0000000000000000 0x0 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o + .bss 0x0000000000000000 0x0 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o + .ARM.extab 0x0000000000000000 0x0 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o + .ARM.exidx 0x0000000000000000 0x10 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o + .ARM.attributes + 0x0000000000000000 0x1c /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_Abstraction.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_Abstraction.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_Abstraction.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_Abstraction.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_Abstraction.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_Abstraction.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_Abstraction.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_Abstraction.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_Abstraction.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_Abstraction.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_Abstraction.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_Abstraction.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_Abstraction.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_Abstraction.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_Abstraction.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_Abstraction.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_Abstraction.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_Abstraction.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_Abstraction.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_Abstraction.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_Abstraction.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_Abstraction.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_Abstraction.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_Abstraction.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_Abstraction.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_Abstraction.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_Abstraction.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_Abstraction.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_Abstraction.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_Abstraction.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_Abstraction.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_Abstraction.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_Abstraction.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_Abstraction.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_Abstraction.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_Abstraction.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_Abstraction.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_Abstraction.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_Abstraction.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_Abstraction.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_Abstraction.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_Abstraction.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_Abstraction.o + .text 0x0000000000000000 0x0 ./Core/Src/ADBMS_Abstraction.o + .data 0x0000000000000000 0x0 ./Core/Src/ADBMS_Abstraction.o + .bss 0x0000000000000000 0x0 ./Core/Src/ADBMS_Abstraction.o + .text.amsConfigCellMeasurement + 0x0000000000000000 0x24 ./Core/Src/ADBMS_Abstraction.o + .text.amsConfigGPIO + 0x0000000000000000 0x18 ./Core/Src/ADBMS_Abstraction.o + .text.amsSetGPIO + 0x0000000000000000 0x18 ./Core/Src/ADBMS_Abstraction.o + .text.readGPIO + 0x0000000000000000 0x16 ./Core/Src/ADBMS_Abstraction.o + .text.amsSelfTest + 0x0000000000000000 0x10 ./Core/Src/ADBMS_Abstraction.o + .text.amsClearStatus + 0x0000000000000000 0x1e ./Core/Src/ADBMS_Abstraction.o + .text.amsClearCells + 0x0000000000000000 0x1e ./Core/Src/ADBMS_Abstraction.o + .text.amsSendWarning + 0x0000000000000000 0x10 ./Core/Src/ADBMS_Abstraction.o + .text.amsSendError + 0x0000000000000000 0x10 ./Core/Src/ADBMS_Abstraction.o + .text.amsClearError + 0x0000000000000000 0x10 ./Core/Src/ADBMS_Abstraction.o + .text.amscheckOpenCellWire + 0x0000000000000000 0x128 ./Core/Src/ADBMS_Abstraction.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_LL_Driver.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_LL_Driver.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_LL_Driver.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_LL_Driver.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_LL_Driver.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_LL_Driver.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_LL_Driver.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_LL_Driver.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_LL_Driver.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_LL_Driver.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_LL_Driver.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_LL_Driver.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_LL_Driver.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_LL_Driver.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_LL_Driver.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_LL_Driver.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_LL_Driver.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_LL_Driver.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_LL_Driver.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_LL_Driver.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_LL_Driver.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_LL_Driver.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_LL_Driver.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_LL_Driver.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_LL_Driver.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_LL_Driver.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_LL_Driver.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_LL_Driver.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_LL_Driver.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_LL_Driver.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_LL_Driver.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_LL_Driver.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_LL_Driver.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_LL_Driver.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_LL_Driver.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_LL_Driver.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_LL_Driver.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_LL_Driver.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_LL_Driver.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_LL_Driver.o + .group 0x0000000000000000 0xc ./Core/Src/ADBMS_LL_Driver.o + .text 0x0000000000000000 0x0 ./Core/Src/ADBMS_LL_Driver.o + .data 0x0000000000000000 0x0 ./Core/Src/ADBMS_LL_Driver.o + .bss 0x0000000000000000 0x0 ./Core/Src/ADBMS_LL_Driver.o + .text.mcuSPIReceive + 0x0000000000000000 0x30 ./Core/Src/ADBMS_LL_Driver.o + .debug_macro 0x0000000000000000 0xa78 ./Core/Src/ADBMS_LL_Driver.o + .debug_macro 0x0000000000000000 0x10 ./Core/Src/ADBMS_LL_Driver.o + .debug_macro 0x0000000000000000 0x157 ./Core/Src/ADBMS_LL_Driver.o + .debug_macro 0x0000000000000000 0x2e ./Core/Src/ADBMS_LL_Driver.o + .debug_macro 0x0000000000000000 0x28 ./Core/Src/ADBMS_LL_Driver.o + .debug_macro 0x0000000000000000 0x22 ./Core/Src/ADBMS_LL_Driver.o + .debug_macro 0x0000000000000000 0x8e ./Core/Src/ADBMS_LL_Driver.o + .debug_macro 0x0000000000000000 0x51 ./Core/Src/ADBMS_LL_Driver.o + .debug_macro 0x0000000000000000 0x103 ./Core/Src/ADBMS_LL_Driver.o + .debug_macro 0x0000000000000000 0x6a ./Core/Src/ADBMS_LL_Driver.o + .debug_macro 0x0000000000000000 0x1df ./Core/Src/ADBMS_LL_Driver.o + .debug_macro 0x0000000000000000 0x1c ./Core/Src/ADBMS_LL_Driver.o + .debug_macro 0x0000000000000000 0x22 ./Core/Src/ADBMS_LL_Driver.o + .debug_macro 0x0000000000000000 0xd9 ./Core/Src/ADBMS_LL_Driver.o + .debug_macro 0x0000000000000000 0x102d ./Core/Src/ADBMS_LL_Driver.o + .debug_macro 0x0000000000000000 0x11f ./Core/Src/ADBMS_LL_Driver.o + .debug_macro 0x0000000000000000 0x11851 ./Core/Src/ADBMS_LL_Driver.o + .debug_macro 0x0000000000000000 0x6d ./Core/Src/ADBMS_LL_Driver.o + .debug_macro 0x0000000000000000 0x3540 ./Core/Src/ADBMS_LL_Driver.o + .debug_macro 0x0000000000000000 0x174 ./Core/Src/ADBMS_LL_Driver.o + .debug_macro 0x0000000000000000 0x55 ./Core/Src/ADBMS_LL_Driver.o + .debug_macro 0x0000000000000000 0x962 ./Core/Src/ADBMS_LL_Driver.o + .debug_macro 0x0000000000000000 0x4df ./Core/Src/ADBMS_LL_Driver.o + .debug_macro 0x0000000000000000 0x1b6 ./Core/Src/ADBMS_LL_Driver.o + .debug_macro 0x0000000000000000 0x174 ./Core/Src/ADBMS_LL_Driver.o + .debug_macro 0x0000000000000000 0x1dc ./Core/Src/ADBMS_LL_Driver.o + .debug_macro 0x0000000000000000 0x1bc ./Core/Src/ADBMS_LL_Driver.o + .debug_macro 0x0000000000000000 0x30 ./Core/Src/ADBMS_LL_Driver.o + .debug_macro 0x0000000000000000 0x3c ./Core/Src/ADBMS_LL_Driver.o + .debug_macro 0x0000000000000000 0x236 ./Core/Src/ADBMS_LL_Driver.o + .debug_macro 0x0000000000000000 0x408 ./Core/Src/ADBMS_LL_Driver.o + .debug_macro 0x0000000000000000 0xc5 ./Core/Src/ADBMS_LL_Driver.o + .debug_macro 0x0000000000000000 0x21d ./Core/Src/ADBMS_LL_Driver.o + .debug_macro 0x0000000000000000 0x22c ./Core/Src/ADBMS_LL_Driver.o + .debug_macro 0x0000000000000000 0x5b ./Core/Src/ADBMS_LL_Driver.o + .debug_macro 0x0000000000000000 0xa5 ./Core/Src/ADBMS_LL_Driver.o + .debug_macro 0x0000000000000000 0x81 ./Core/Src/ADBMS_LL_Driver.o + .debug_macro 0x0000000000000000 0xd3 ./Core/Src/ADBMS_LL_Driver.o + .debug_macro 0x0000000000000000 0x2fe ./Core/Src/ADBMS_LL_Driver.o + .debug_macro 0x0000000000000000 0x213 ./Core/Src/ADBMS_LL_Driver.o + .debug_macro 0x0000000000000000 0x58 ./Core/Src/ADBMS_LL_Driver.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_CAN.o + .text 0x0000000000000000 0x0 ./Core/Src/AMS_CAN.o + .data 0x0000000000000000 0x0 ./Core/Src/AMS_CAN.o + .bss 0x0000000000000000 0x0 ./Core/Src/AMS_CAN.o + .debug_macro 0x0000000000000000 0xa78 ./Core/Src/AMS_CAN.o + .debug_macro 0x0000000000000000 0x157 ./Core/Src/AMS_CAN.o + .debug_macro 0x0000000000000000 0x2e ./Core/Src/AMS_CAN.o + .debug_macro 0x0000000000000000 0x28 ./Core/Src/AMS_CAN.o + .debug_macro 0x0000000000000000 0x22 ./Core/Src/AMS_CAN.o + .debug_macro 0x0000000000000000 0x8e ./Core/Src/AMS_CAN.o + .debug_macro 0x0000000000000000 0x51 ./Core/Src/AMS_CAN.o + .debug_macro 0x0000000000000000 0x103 ./Core/Src/AMS_CAN.o + .debug_macro 0x0000000000000000 0x6a ./Core/Src/AMS_CAN.o + .debug_macro 0x0000000000000000 0x1df ./Core/Src/AMS_CAN.o + .debug_macro 0x0000000000000000 0x1c ./Core/Src/AMS_CAN.o + .debug_macro 0x0000000000000000 0x22 ./Core/Src/AMS_CAN.o + .debug_macro 0x0000000000000000 0xd9 ./Core/Src/AMS_CAN.o + .debug_macro 0x0000000000000000 0x102d ./Core/Src/AMS_CAN.o + .debug_macro 0x0000000000000000 0x11f ./Core/Src/AMS_CAN.o + .debug_macro 0x0000000000000000 0x11851 ./Core/Src/AMS_CAN.o + .debug_macro 0x0000000000000000 0x6d ./Core/Src/AMS_CAN.o + .debug_macro 0x0000000000000000 0x3540 ./Core/Src/AMS_CAN.o + .debug_macro 0x0000000000000000 0x174 ./Core/Src/AMS_CAN.o + .debug_macro 0x0000000000000000 0x55 ./Core/Src/AMS_CAN.o + .debug_macro 0x0000000000000000 0x962 ./Core/Src/AMS_CAN.o + .debug_macro 0x0000000000000000 0x4df ./Core/Src/AMS_CAN.o + .debug_macro 0x0000000000000000 0x1b6 ./Core/Src/AMS_CAN.o + .debug_macro 0x0000000000000000 0x174 ./Core/Src/AMS_CAN.o + .debug_macro 0x0000000000000000 0x1dc ./Core/Src/AMS_CAN.o + .debug_macro 0x0000000000000000 0x1bc ./Core/Src/AMS_CAN.o + .debug_macro 0x0000000000000000 0x30 ./Core/Src/AMS_CAN.o + .debug_macro 0x0000000000000000 0x3c ./Core/Src/AMS_CAN.o + .debug_macro 0x0000000000000000 0x236 ./Core/Src/AMS_CAN.o + .debug_macro 0x0000000000000000 0x408 ./Core/Src/AMS_CAN.o + .debug_macro 0x0000000000000000 0xc5 ./Core/Src/AMS_CAN.o + .debug_macro 0x0000000000000000 0x21d ./Core/Src/AMS_CAN.o + .debug_macro 0x0000000000000000 0x22c ./Core/Src/AMS_CAN.o + .debug_macro 0x0000000000000000 0x5b ./Core/Src/AMS_CAN.o + .debug_macro 0x0000000000000000 0xa5 ./Core/Src/AMS_CAN.o + .debug_macro 0x0000000000000000 0x81 ./Core/Src/AMS_CAN.o + .debug_macro 0x0000000000000000 0xd3 ./Core/Src/AMS_CAN.o + .debug_macro 0x0000000000000000 0x2fe ./Core/Src/AMS_CAN.o + .debug_macro 0x0000000000000000 0x213 ./Core/Src/AMS_CAN.o + .debug_macro 0x0000000000000000 0x58 ./Core/Src/AMS_CAN.o + .debug_macro 0x0000000000000000 0x10 ./Core/Src/AMS_CAN.o + .debug_macro 0x0000000000000000 0x2d1 ./Core/Src/AMS_CAN.o + .debug_macro 0x0000000000000000 0x22 ./Core/Src/AMS_CAN.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_HighLevel.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_HighLevel.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_HighLevel.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_HighLevel.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_HighLevel.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_HighLevel.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_HighLevel.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_HighLevel.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_HighLevel.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_HighLevel.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_HighLevel.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_HighLevel.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_HighLevel.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_HighLevel.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_HighLevel.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_HighLevel.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_HighLevel.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_HighLevel.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_HighLevel.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_HighLevel.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_HighLevel.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_HighLevel.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_HighLevel.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_HighLevel.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_HighLevel.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_HighLevel.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_HighLevel.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_HighLevel.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_HighLevel.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_HighLevel.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_HighLevel.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_HighLevel.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_HighLevel.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_HighLevel.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_HighLevel.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_HighLevel.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_HighLevel.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_HighLevel.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_HighLevel.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_HighLevel.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_HighLevel.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_HighLevel.o + .group 0x0000000000000000 0xc ./Core/Src/AMS_HighLevel.o + .text 0x0000000000000000 0x0 ./Core/Src/AMS_HighLevel.o + .data 0x0000000000000000 0x0 ./Core/Src/AMS_HighLevel.o + .bss 0x0000000000000000 0x0 ./Core/Src/AMS_HighLevel.o + .bss.balancedCells + 0x0000000000000000 0x4 ./Core/Src/AMS_HighLevel.o + .bss.BalancingActive + 0x0000000000000000 0x1 ./Core/Src/AMS_HighLevel.o + .data.stateofcharge + 0x0000000000000000 0x1 ./Core/Src/AMS_HighLevel.o + .data.internalbalancingalgo + 0x0000000000000000 0x1 ./Core/Src/AMS_HighLevel.o + .data.startbalancingthreshold + 0x0000000000000000 0x2 ./Core/Src/AMS_HighLevel.o + .data.stopbalancingthreshold + 0x0000000000000000 0x2 ./Core/Src/AMS_HighLevel.o + .data.balancingvoltagedelta + 0x0000000000000000 0x2 ./Core/Src/AMS_HighLevel.o + .bss.amswarningcode + 0x0000000000000000 0x1 ./Core/Src/AMS_HighLevel.o + .text.AMS_Error_Loop + 0x0000000000000000 0x10 ./Core/Src/AMS_HighLevel.o + .text.AMS_Charging_Loop + 0x0000000000000000 0x10 ./Core/Src/AMS_HighLevel.o + .text.AMS_Discharging_Loop + 0x0000000000000000 0x10 ./Core/Src/AMS_HighLevel.o + .text.AMS_Balancing_Loop + 0x0000000000000000 0x1b4 ./Core/Src/AMS_HighLevel.o + .debug_macro 0x0000000000000000 0xa78 ./Core/Src/AMS_HighLevel.o + .debug_macro 0x0000000000000000 0x10 ./Core/Src/AMS_HighLevel.o + .debug_macro 0x0000000000000000 0x157 ./Core/Src/AMS_HighLevel.o + .debug_macro 0x0000000000000000 0x2e ./Core/Src/AMS_HighLevel.o + .debug_macro 0x0000000000000000 0x28 ./Core/Src/AMS_HighLevel.o + .debug_macro 0x0000000000000000 0x22 ./Core/Src/AMS_HighLevel.o + .debug_macro 0x0000000000000000 0x8e ./Core/Src/AMS_HighLevel.o + .debug_macro 0x0000000000000000 0x51 ./Core/Src/AMS_HighLevel.o + .debug_macro 0x0000000000000000 0x103 ./Core/Src/AMS_HighLevel.o + .debug_macro 0x0000000000000000 0x6a ./Core/Src/AMS_HighLevel.o + .debug_macro 0x0000000000000000 0x1df ./Core/Src/AMS_HighLevel.o + .debug_macro 0x0000000000000000 0x1c ./Core/Src/AMS_HighLevel.o + .debug_macro 0x0000000000000000 0x22 ./Core/Src/AMS_HighLevel.o + .debug_macro 0x0000000000000000 0xd9 ./Core/Src/AMS_HighLevel.o + .debug_macro 0x0000000000000000 0x102d ./Core/Src/AMS_HighLevel.o + .debug_macro 0x0000000000000000 0x11f ./Core/Src/AMS_HighLevel.o + .debug_macro 0x0000000000000000 0x11851 ./Core/Src/AMS_HighLevel.o + .debug_macro 0x0000000000000000 0x6d ./Core/Src/AMS_HighLevel.o + .debug_macro 0x0000000000000000 0x3540 ./Core/Src/AMS_HighLevel.o + .debug_macro 0x0000000000000000 0x174 ./Core/Src/AMS_HighLevel.o + .debug_macro 0x0000000000000000 0x55 ./Core/Src/AMS_HighLevel.o + .debug_macro 0x0000000000000000 0x962 ./Core/Src/AMS_HighLevel.o + .debug_macro 0x0000000000000000 0x4df ./Core/Src/AMS_HighLevel.o + .debug_macro 0x0000000000000000 0x1b6 ./Core/Src/AMS_HighLevel.o + .debug_macro 0x0000000000000000 0x174 ./Core/Src/AMS_HighLevel.o + .debug_macro 0x0000000000000000 0x1dc ./Core/Src/AMS_HighLevel.o + .debug_macro 0x0000000000000000 0x1bc ./Core/Src/AMS_HighLevel.o + .debug_macro 0x0000000000000000 0x30 ./Core/Src/AMS_HighLevel.o + .debug_macro 0x0000000000000000 0x3c ./Core/Src/AMS_HighLevel.o + .debug_macro 0x0000000000000000 0x236 ./Core/Src/AMS_HighLevel.o + .debug_macro 0x0000000000000000 0x408 ./Core/Src/AMS_HighLevel.o + .debug_macro 0x0000000000000000 0xc5 ./Core/Src/AMS_HighLevel.o + .debug_macro 0x0000000000000000 0x21d ./Core/Src/AMS_HighLevel.o + .debug_macro 0x0000000000000000 0x22c ./Core/Src/AMS_HighLevel.o + .debug_macro 0x0000000000000000 0x5b ./Core/Src/AMS_HighLevel.o + .debug_macro 0x0000000000000000 0xa5 ./Core/Src/AMS_HighLevel.o + .debug_macro 0x0000000000000000 0x81 ./Core/Src/AMS_HighLevel.o + .debug_macro 0x0000000000000000 0xd3 ./Core/Src/AMS_HighLevel.o + .debug_macro 0x0000000000000000 0x2fe ./Core/Src/AMS_HighLevel.o + .debug_macro 0x0000000000000000 0x213 ./Core/Src/AMS_HighLevel.o + .debug_macro 0x0000000000000000 0x58 ./Core/Src/AMS_HighLevel.o + .debug_macro 0x0000000000000000 0x2d1 ./Core/Src/AMS_HighLevel.o + .debug_macro 0x0000000000000000 0x22 ./Core/Src/AMS_HighLevel.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/Testbench.o + .text 0x0000000000000000 0x0 ./Core/Src/Testbench.o + .data 0x0000000000000000 0x0 ./Core/Src/Testbench.o + .bss 0x0000000000000000 0x0 ./Core/Src/Testbench.o + .debug_macro 0x0000000000000000 0xa78 ./Core/Src/Testbench.o + .debug_macro 0x0000000000000000 0x157 ./Core/Src/Testbench.o + .debug_macro 0x0000000000000000 0x2e ./Core/Src/Testbench.o + .debug_macro 0x0000000000000000 0x28 ./Core/Src/Testbench.o + .debug_macro 0x0000000000000000 0x22 ./Core/Src/Testbench.o + .debug_macro 0x0000000000000000 0x8e ./Core/Src/Testbench.o + .debug_macro 0x0000000000000000 0x51 ./Core/Src/Testbench.o + .debug_macro 0x0000000000000000 0x103 ./Core/Src/Testbench.o + .debug_macro 0x0000000000000000 0x6a ./Core/Src/Testbench.o + .debug_macro 0x0000000000000000 0x1df ./Core/Src/Testbench.o + .debug_macro 0x0000000000000000 0x1c ./Core/Src/Testbench.o + .debug_macro 0x0000000000000000 0x22 ./Core/Src/Testbench.o + .debug_macro 0x0000000000000000 0xd9 ./Core/Src/Testbench.o + .debug_macro 0x0000000000000000 0x102d ./Core/Src/Testbench.o + .debug_macro 0x0000000000000000 0x11f ./Core/Src/Testbench.o + .debug_macro 0x0000000000000000 0x11851 ./Core/Src/Testbench.o + .debug_macro 0x0000000000000000 0x6d ./Core/Src/Testbench.o + .debug_macro 0x0000000000000000 0x3540 ./Core/Src/Testbench.o + .debug_macro 0x0000000000000000 0x174 ./Core/Src/Testbench.o + .debug_macro 0x0000000000000000 0x55 ./Core/Src/Testbench.o + .debug_macro 0x0000000000000000 0x962 ./Core/Src/Testbench.o + .debug_macro 0x0000000000000000 0x4df ./Core/Src/Testbench.o + .debug_macro 0x0000000000000000 0x1b6 ./Core/Src/Testbench.o + .debug_macro 0x0000000000000000 0x174 ./Core/Src/Testbench.o + .debug_macro 0x0000000000000000 0x1dc ./Core/Src/Testbench.o + .debug_macro 0x0000000000000000 0x1bc ./Core/Src/Testbench.o + .debug_macro 0x0000000000000000 0x30 ./Core/Src/Testbench.o + .debug_macro 0x0000000000000000 0x3c ./Core/Src/Testbench.o + .debug_macro 0x0000000000000000 0x236 ./Core/Src/Testbench.o + .debug_macro 0x0000000000000000 0x408 ./Core/Src/Testbench.o + .debug_macro 0x0000000000000000 0xc5 ./Core/Src/Testbench.o + .debug_macro 0x0000000000000000 0x21d ./Core/Src/Testbench.o + .debug_macro 0x0000000000000000 0x22c ./Core/Src/Testbench.o + .debug_macro 0x0000000000000000 0x5b ./Core/Src/Testbench.o + .debug_macro 0x0000000000000000 0xa5 ./Core/Src/Testbench.o + .debug_macro 0x0000000000000000 0x81 ./Core/Src/Testbench.o + .debug_macro 0x0000000000000000 0xd3 ./Core/Src/Testbench.o + .debug_macro 0x0000000000000000 0x2fe ./Core/Src/Testbench.o + .debug_macro 0x0000000000000000 0x213 ./Core/Src/Testbench.o + .debug_macro 0x0000000000000000 0x58 ./Core/Src/Testbench.o + .debug_macro 0x0000000000000000 0x10 ./Core/Src/Testbench.o + .debug_macro 0x0000000000000000 0x2d1 ./Core/Src/Testbench.o + .debug_macro 0x0000000000000000 0x22 ./Core/Src/Testbench.o + .debug_macro 0x0000000000000000 0x10 ./Core/Src/Testbench.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/main.o + .text 0x0000000000000000 0x0 ./Core/Src/main.o + .data 0x0000000000000000 0x0 ./Core/Src/main.o + .bss 0x0000000000000000 0x0 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0xa78 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x157 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x2e ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x28 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x22 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x8e ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x51 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x103 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x6a ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x1df ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x1c ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x22 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0xd9 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x102d ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x11f ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x11851 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x6d ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x3540 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x174 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x55 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x962 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x4df ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x1b6 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x174 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x1dc ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x1bc ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x30 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x3c ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x236 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x408 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0xc5 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x21d ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x22c ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x5b ./Core/Src/main.o + .debug_macro 0x0000000000000000 0xa5 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x81 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0xd3 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x2fe ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x213 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x58 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x10 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x2d1 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x22 ./Core/Src/main.o + .debug_macro 0x0000000000000000 0x2e ./Core/Src/main.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_hal_msp.o + .text 0x0000000000000000 0x0 ./Core/Src/stm32f3xx_hal_msp.o + .data 0x0000000000000000 0x0 ./Core/Src/stm32f3xx_hal_msp.o + .bss 0x0000000000000000 0x0 ./Core/Src/stm32f3xx_hal_msp.o + .text.HAL_CAN_MspDeInit + 0x0000000000000000 0x40 ./Core/Src/stm32f3xx_hal_msp.o + .text.HAL_I2C_MspDeInit + 0x0000000000000000 0x7c ./Core/Src/stm32f3xx_hal_msp.o + .text.HAL_SPI_MspDeInit + 0x0000000000000000 0x38 ./Core/Src/stm32f3xx_hal_msp.o + .debug_macro 0x0000000000000000 0xa78 ./Core/Src/stm32f3xx_hal_msp.o + .debug_macro 0x0000000000000000 0x157 ./Core/Src/stm32f3xx_hal_msp.o + .debug_macro 0x0000000000000000 0x2e ./Core/Src/stm32f3xx_hal_msp.o + .debug_macro 0x0000000000000000 0x28 ./Core/Src/stm32f3xx_hal_msp.o + .debug_macro 0x0000000000000000 0x22 ./Core/Src/stm32f3xx_hal_msp.o + .debug_macro 0x0000000000000000 0x8e ./Core/Src/stm32f3xx_hal_msp.o + .debug_macro 0x0000000000000000 0x51 ./Core/Src/stm32f3xx_hal_msp.o + .debug_macro 0x0000000000000000 0x103 ./Core/Src/stm32f3xx_hal_msp.o + .debug_macro 0x0000000000000000 0x6a ./Core/Src/stm32f3xx_hal_msp.o + .debug_macro 0x0000000000000000 0x1df ./Core/Src/stm32f3xx_hal_msp.o + .debug_macro 0x0000000000000000 0x1c ./Core/Src/stm32f3xx_hal_msp.o + .debug_macro 0x0000000000000000 0x22 ./Core/Src/stm32f3xx_hal_msp.o + .debug_macro 0x0000000000000000 0xd9 ./Core/Src/stm32f3xx_hal_msp.o + .debug_macro 0x0000000000000000 0x102d ./Core/Src/stm32f3xx_hal_msp.o + .debug_macro 0x0000000000000000 0x11f ./Core/Src/stm32f3xx_hal_msp.o + .debug_macro 0x0000000000000000 0x11851 ./Core/Src/stm32f3xx_hal_msp.o + .debug_macro 0x0000000000000000 0x6d ./Core/Src/stm32f3xx_hal_msp.o + .debug_macro 0x0000000000000000 0x3540 ./Core/Src/stm32f3xx_hal_msp.o + .debug_macro 0x0000000000000000 0x174 ./Core/Src/stm32f3xx_hal_msp.o + .debug_macro 0x0000000000000000 0x55 ./Core/Src/stm32f3xx_hal_msp.o + .debug_macro 0x0000000000000000 0x962 ./Core/Src/stm32f3xx_hal_msp.o + .debug_macro 0x0000000000000000 0x4df ./Core/Src/stm32f3xx_hal_msp.o + .debug_macro 0x0000000000000000 0x1b6 ./Core/Src/stm32f3xx_hal_msp.o + .debug_macro 0x0000000000000000 0x174 ./Core/Src/stm32f3xx_hal_msp.o + .debug_macro 0x0000000000000000 0x1dc ./Core/Src/stm32f3xx_hal_msp.o + .debug_macro 0x0000000000000000 0x1bc ./Core/Src/stm32f3xx_hal_msp.o + .debug_macro 0x0000000000000000 0x30 ./Core/Src/stm32f3xx_hal_msp.o + .debug_macro 0x0000000000000000 0x3c ./Core/Src/stm32f3xx_hal_msp.o + .debug_macro 0x0000000000000000 0x236 ./Core/Src/stm32f3xx_hal_msp.o + .debug_macro 0x0000000000000000 0x408 ./Core/Src/stm32f3xx_hal_msp.o + .debug_macro 0x0000000000000000 0xc5 ./Core/Src/stm32f3xx_hal_msp.o + .debug_macro 0x0000000000000000 0x21d ./Core/Src/stm32f3xx_hal_msp.o + .debug_macro 0x0000000000000000 0x22c ./Core/Src/stm32f3xx_hal_msp.o + .debug_macro 0x0000000000000000 0x5b ./Core/Src/stm32f3xx_hal_msp.o + .debug_macro 0x0000000000000000 0xa5 ./Core/Src/stm32f3xx_hal_msp.o + .debug_macro 0x0000000000000000 0x81 ./Core/Src/stm32f3xx_hal_msp.o + .debug_macro 0x0000000000000000 0xd3 ./Core/Src/stm32f3xx_hal_msp.o + .debug_macro 0x0000000000000000 0x2fe ./Core/Src/stm32f3xx_hal_msp.o + .debug_macro 0x0000000000000000 0x213 ./Core/Src/stm32f3xx_hal_msp.o + .debug_macro 0x0000000000000000 0x58 ./Core/Src/stm32f3xx_hal_msp.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/stm32f3xx_it.o + .text 0x0000000000000000 0x0 ./Core/Src/stm32f3xx_it.o + .data 0x0000000000000000 0x0 ./Core/Src/stm32f3xx_it.o + .bss 0x0000000000000000 0x0 ./Core/Src/stm32f3xx_it.o + .debug_macro 0x0000000000000000 0xa78 ./Core/Src/stm32f3xx_it.o + .debug_macro 0x0000000000000000 0x157 ./Core/Src/stm32f3xx_it.o + .debug_macro 0x0000000000000000 0x2e ./Core/Src/stm32f3xx_it.o + .debug_macro 0x0000000000000000 0x28 ./Core/Src/stm32f3xx_it.o + .debug_macro 0x0000000000000000 0x22 ./Core/Src/stm32f3xx_it.o + .debug_macro 0x0000000000000000 0x8e ./Core/Src/stm32f3xx_it.o + .debug_macro 0x0000000000000000 0x51 ./Core/Src/stm32f3xx_it.o + .debug_macro 0x0000000000000000 0x103 ./Core/Src/stm32f3xx_it.o + .debug_macro 0x0000000000000000 0x6a ./Core/Src/stm32f3xx_it.o + .debug_macro 0x0000000000000000 0x1df ./Core/Src/stm32f3xx_it.o + .debug_macro 0x0000000000000000 0x1c ./Core/Src/stm32f3xx_it.o + .debug_macro 0x0000000000000000 0x22 ./Core/Src/stm32f3xx_it.o + .debug_macro 0x0000000000000000 0xd9 ./Core/Src/stm32f3xx_it.o + .debug_macro 0x0000000000000000 0x102d ./Core/Src/stm32f3xx_it.o + .debug_macro 0x0000000000000000 0x11f ./Core/Src/stm32f3xx_it.o + .debug_macro 0x0000000000000000 0x11851 ./Core/Src/stm32f3xx_it.o + .debug_macro 0x0000000000000000 0x6d ./Core/Src/stm32f3xx_it.o + .debug_macro 0x0000000000000000 0x3540 ./Core/Src/stm32f3xx_it.o + .debug_macro 0x0000000000000000 0x174 ./Core/Src/stm32f3xx_it.o + .debug_macro 0x0000000000000000 0x55 ./Core/Src/stm32f3xx_it.o + .debug_macro 0x0000000000000000 0x962 ./Core/Src/stm32f3xx_it.o + .debug_macro 0x0000000000000000 0x4df ./Core/Src/stm32f3xx_it.o + .debug_macro 0x0000000000000000 0x1b6 ./Core/Src/stm32f3xx_it.o + .debug_macro 0x0000000000000000 0x174 ./Core/Src/stm32f3xx_it.o + .debug_macro 0x0000000000000000 0x1dc ./Core/Src/stm32f3xx_it.o + .debug_macro 0x0000000000000000 0x1bc ./Core/Src/stm32f3xx_it.o + .debug_macro 0x0000000000000000 0x30 ./Core/Src/stm32f3xx_it.o + .debug_macro 0x0000000000000000 0x3c ./Core/Src/stm32f3xx_it.o + .debug_macro 0x0000000000000000 0x236 ./Core/Src/stm32f3xx_it.o + .debug_macro 0x0000000000000000 0x408 ./Core/Src/stm32f3xx_it.o + .debug_macro 0x0000000000000000 0xc5 ./Core/Src/stm32f3xx_it.o + .debug_macro 0x0000000000000000 0x21d ./Core/Src/stm32f3xx_it.o + .debug_macro 0x0000000000000000 0x22c ./Core/Src/stm32f3xx_it.o + .debug_macro 0x0000000000000000 0x5b ./Core/Src/stm32f3xx_it.o + .debug_macro 0x0000000000000000 0xa5 ./Core/Src/stm32f3xx_it.o + .debug_macro 0x0000000000000000 0x81 ./Core/Src/stm32f3xx_it.o + .debug_macro 0x0000000000000000 0xd3 ./Core/Src/stm32f3xx_it.o + .debug_macro 0x0000000000000000 0x2fe ./Core/Src/stm32f3xx_it.o + .debug_macro 0x0000000000000000 0x213 ./Core/Src/stm32f3xx_it.o + .debug_macro 0x0000000000000000 0x58 ./Core/Src/stm32f3xx_it.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/syscalls.o + .text 0x0000000000000000 0x0 ./Core/Src/syscalls.o + .data 0x0000000000000000 0x0 ./Core/Src/syscalls.o + .bss 0x0000000000000000 0x0 ./Core/Src/syscalls.o + .bss.__env 0x0000000000000000 0x4 ./Core/Src/syscalls.o + .data.environ 0x0000000000000000 0x4 ./Core/Src/syscalls.o + .text.initialise_monitor_handles + 0x0000000000000000 0xe ./Core/Src/syscalls.o + .text._getpid 0x0000000000000000 0x10 ./Core/Src/syscalls.o + .text._kill 0x0000000000000000 0x20 ./Core/Src/syscalls.o + .text._exit 0x0000000000000000 0x14 ./Core/Src/syscalls.o + .text._read 0x0000000000000000 0x3a ./Core/Src/syscalls.o + .text._write 0x0000000000000000 0x38 ./Core/Src/syscalls.o + .text._close 0x0000000000000000 0x18 ./Core/Src/syscalls.o + .text._fstat 0x0000000000000000 0x20 ./Core/Src/syscalls.o + .text._isatty 0x0000000000000000 0x16 ./Core/Src/syscalls.o + .text._lseek 0x0000000000000000 0x1a ./Core/Src/syscalls.o + .text._open 0x0000000000000000 0x1c ./Core/Src/syscalls.o + .text._wait 0x0000000000000000 0x1e ./Core/Src/syscalls.o + .text._unlink 0x0000000000000000 0x1e ./Core/Src/syscalls.o + .text._times 0x0000000000000000 0x18 ./Core/Src/syscalls.o + .text._stat 0x0000000000000000 0x20 ./Core/Src/syscalls.o + .text._link 0x0000000000000000 0x20 ./Core/Src/syscalls.o + .text._fork 0x0000000000000000 0x16 ./Core/Src/syscalls.o + .text._execve 0x0000000000000000 0x22 ./Core/Src/syscalls.o + .debug_info 0x0000000000000000 0x6e0 ./Core/Src/syscalls.o + .debug_abbrev 0x0000000000000000 0x1b3 ./Core/Src/syscalls.o + .debug_aranges + 0x0000000000000000 0xa8 ./Core/Src/syscalls.o + .debug_ranges 0x0000000000000000 0x98 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x24c ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0xa78 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x22 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x4c ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x1e ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x94 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x3c ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x34 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x57 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x174 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x341 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x16 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x43 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x34 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x10 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x58 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x71 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x1c ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x12a ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x10 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x35 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x10 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x10 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x10 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x6a ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x1c ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x52 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x22 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x10 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x52 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0xd5 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x1c ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x3d ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x35 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x12c ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x16 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x16 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x29 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x10 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x241 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x1c ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x10 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x10 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x16 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x145 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x189 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0x16 ./Core/Src/syscalls.o + .debug_macro 0x0000000000000000 0xce ./Core/Src/syscalls.o + .debug_line 0x0000000000000000 0x7c7 ./Core/Src/syscalls.o + .debug_str 0x0000000000000000 0x8aa6 ./Core/Src/syscalls.o + .comment 0x0000000000000000 0x51 ./Core/Src/syscalls.o + .debug_frame 0x0000000000000000 0x2ac ./Core/Src/syscalls.o + .ARM.attributes + 0x0000000000000000 0x34 ./Core/Src/syscalls.o + .group 0x0000000000000000 0xc ./Core/Src/sysmem.o + .group 0x0000000000000000 0xc ./Core/Src/sysmem.o + .group 0x0000000000000000 0xc ./Core/Src/sysmem.o + .group 0x0000000000000000 0xc ./Core/Src/sysmem.o + .group 0x0000000000000000 0xc ./Core/Src/sysmem.o + .group 0x0000000000000000 0xc ./Core/Src/sysmem.o + .group 0x0000000000000000 0xc ./Core/Src/sysmem.o + .group 0x0000000000000000 0xc ./Core/Src/sysmem.o + .group 0x0000000000000000 0xc ./Core/Src/sysmem.o + .group 0x0000000000000000 0xc ./Core/Src/sysmem.o + .group 0x0000000000000000 0xc ./Core/Src/sysmem.o + .group 0x0000000000000000 0xc ./Core/Src/sysmem.o + .group 0x0000000000000000 0xc ./Core/Src/sysmem.o + .group 0x0000000000000000 0xc ./Core/Src/sysmem.o + .group 0x0000000000000000 0xc ./Core/Src/sysmem.o + .group 0x0000000000000000 0xc ./Core/Src/sysmem.o + .group 0x0000000000000000 0xc ./Core/Src/sysmem.o + .group 0x0000000000000000 0xc ./Core/Src/sysmem.o + .group 0x0000000000000000 0xc ./Core/Src/sysmem.o + .group 0x0000000000000000 0xc ./Core/Src/sysmem.o + .group 0x0000000000000000 0xc ./Core/Src/sysmem.o + .group 0x0000000000000000 0xc ./Core/Src/sysmem.o + .text 0x0000000000000000 0x0 ./Core/Src/sysmem.o + .data 0x0000000000000000 0x0 ./Core/Src/sysmem.o + .bss 0x0000000000000000 0x0 ./Core/Src/sysmem.o + .bss.__sbrk_heap_end + 0x0000000000000000 0x4 ./Core/Src/sysmem.o + .text._sbrk 0x0000000000000000 0x6c ./Core/Src/sysmem.o + .debug_info 0x0000000000000000 0x171 ./Core/Src/sysmem.o + .debug_abbrev 0x0000000000000000 0xbb ./Core/Src/sysmem.o + .debug_aranges + 0x0000000000000000 0x20 ./Core/Src/sysmem.o + .debug_ranges 0x0000000000000000 0x10 ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0xff ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0xa78 ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0x10 ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0x22 ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0x4c ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0x1e ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0x94 ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0x3c ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0x34 ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0x174 ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0x16 ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0x43 ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0x57 ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0x34 ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0x10 ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0x58 ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0x71 ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0x1c ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0x12a ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0x23b ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0x103 ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0x6a ./Core/Src/sysmem.o + .debug_macro 0x0000000000000000 0x1df ./Core/Src/sysmem.o + .debug_line 0x0000000000000000 0x4bd ./Core/Src/sysmem.o + .debug_str 0x0000000000000000 0x5de2 ./Core/Src/sysmem.o + .comment 0x0000000000000000 0x51 ./Core/Src/sysmem.o + .debug_frame 0x0000000000000000 0x34 ./Core/Src/sysmem.o + .ARM.attributes + 0x0000000000000000 0x34 ./Core/Src/sysmem.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f3xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f3xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f3xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f3xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f3xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f3xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f3xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f3xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f3xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f3xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f3xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f3xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f3xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f3xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f3xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f3xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f3xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f3xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f3xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f3xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f3xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f3xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f3xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f3xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f3xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f3xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f3xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f3xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f3xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f3xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f3xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f3xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f3xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f3xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f3xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f3xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f3xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f3xx.o + .group 0x0000000000000000 0xc ./Core/Src/system_stm32f3xx.o + .text 0x0000000000000000 0x0 ./Core/Src/system_stm32f3xx.o + .data 0x0000000000000000 0x0 ./Core/Src/system_stm32f3xx.o + .bss 0x0000000000000000 0x0 ./Core/Src/system_stm32f3xx.o + .rodata.APBPrescTable + 0x0000000000000000 0x8 ./Core/Src/system_stm32f3xx.o + .text.SystemCoreClockUpdate + 0x0000000000000000 0xe4 ./Core/Src/system_stm32f3xx.o + .debug_macro 0x0000000000000000 0xa78 ./Core/Src/system_stm32f3xx.o + .debug_macro 0x0000000000000000 0x2e ./Core/Src/system_stm32f3xx.o + .debug_macro 0x0000000000000000 0x28 ./Core/Src/system_stm32f3xx.o + .debug_macro 0x0000000000000000 0x22 ./Core/Src/system_stm32f3xx.o + .debug_macro 0x0000000000000000 0x8e ./Core/Src/system_stm32f3xx.o + .debug_macro 0x0000000000000000 0x51 ./Core/Src/system_stm32f3xx.o + .debug_macro 0x0000000000000000 0x103 ./Core/Src/system_stm32f3xx.o + .debug_macro 0x0000000000000000 0x6a ./Core/Src/system_stm32f3xx.o + .debug_macro 0x0000000000000000 0x1df ./Core/Src/system_stm32f3xx.o + .debug_macro 0x0000000000000000 0x1c ./Core/Src/system_stm32f3xx.o + .debug_macro 0x0000000000000000 0x22 ./Core/Src/system_stm32f3xx.o + .debug_macro 0x0000000000000000 0xd9 ./Core/Src/system_stm32f3xx.o + .debug_macro 0x0000000000000000 0x102d ./Core/Src/system_stm32f3xx.o + .debug_macro 0x0000000000000000 0x11f ./Core/Src/system_stm32f3xx.o + .debug_macro 0x0000000000000000 0x11851 ./Core/Src/system_stm32f3xx.o + .debug_macro 0x0000000000000000 0x6d ./Core/Src/system_stm32f3xx.o + .debug_macro 0x0000000000000000 0x157 ./Core/Src/system_stm32f3xx.o + .debug_macro 0x0000000000000000 0x3540 ./Core/Src/system_stm32f3xx.o + .debug_macro 0x0000000000000000 0x174 ./Core/Src/system_stm32f3xx.o + .debug_macro 0x0000000000000000 0x55 ./Core/Src/system_stm32f3xx.o + .debug_macro 0x0000000000000000 0x962 ./Core/Src/system_stm32f3xx.o + .debug_macro 0x0000000000000000 0x4df ./Core/Src/system_stm32f3xx.o + .debug_macro 0x0000000000000000 0x1b6 ./Core/Src/system_stm32f3xx.o + .debug_macro 0x0000000000000000 0x174 ./Core/Src/system_stm32f3xx.o + .debug_macro 0x0000000000000000 0x1dc ./Core/Src/system_stm32f3xx.o + .debug_macro 0x0000000000000000 0x1bc ./Core/Src/system_stm32f3xx.o + .debug_macro 0x0000000000000000 0x30 ./Core/Src/system_stm32f3xx.o + .debug_macro 0x0000000000000000 0x3c ./Core/Src/system_stm32f3xx.o + .debug_macro 0x0000000000000000 0x236 ./Core/Src/system_stm32f3xx.o + .debug_macro 0x0000000000000000 0x408 ./Core/Src/system_stm32f3xx.o + .debug_macro 0x0000000000000000 0xc5 ./Core/Src/system_stm32f3xx.o + .debug_macro 0x0000000000000000 0x21d ./Core/Src/system_stm32f3xx.o + .debug_macro 0x0000000000000000 0x22c ./Core/Src/system_stm32f3xx.o + .debug_macro 0x0000000000000000 0x5b ./Core/Src/system_stm32f3xx.o + .debug_macro 0x0000000000000000 0xa5 ./Core/Src/system_stm32f3xx.o + .debug_macro 0x0000000000000000 0x81 ./Core/Src/system_stm32f3xx.o + .debug_macro 0x0000000000000000 0xd3 ./Core/Src/system_stm32f3xx.o + .debug_macro 0x0000000000000000 0x2fe ./Core/Src/system_stm32f3xx.o + .debug_macro 0x0000000000000000 0x213 ./Core/Src/system_stm32f3xx.o + .text 0x0000000000000000 0x14 ./Core/Startup/startup_stm32f302cctx.o + .data 0x0000000000000000 0x0 ./Core/Startup/startup_stm32f302cctx.o + .bss 0x0000000000000000 0x0 ./Core/Startup/startup_stm32f302cctx.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .text 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .data 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .bss 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .text.HAL_DeInit + 0x0000000000000000 0x3c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .text.HAL_MspInit + 0x0000000000000000 0xe ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .text.HAL_MspDeInit + 0x0000000000000000 0xe ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .text.HAL_GetTickPrio + 0x0000000000000000 0x18 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .text.HAL_SetTickFreq + 0x0000000000000000 0x50 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .text.HAL_GetTickFreq + 0x0000000000000000 0x18 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .text.HAL_SuspendTick + 0x0000000000000000 0x20 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .text.HAL_ResumeTick + 0x0000000000000000 0x20 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .text.HAL_GetHalVersion + 0x0000000000000000 0x14 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .text.HAL_GetREVID + 0x0000000000000000 0x18 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .text.HAL_GetDEVID + 0x0000000000000000 0x1c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .text.HAL_GetUIDw0 + 0x0000000000000000 0x18 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .text.HAL_GetUIDw1 + 0x0000000000000000 0x18 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .text.HAL_GetUIDw2 + 0x0000000000000000 0x18 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .text.HAL_DBGMCU_EnableDBGSleepMode + 0x0000000000000000 0x20 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .text.HAL_DBGMCU_DisableDBGSleepMode + 0x0000000000000000 0x20 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .text.HAL_DBGMCU_EnableDBGStopMode + 0x0000000000000000 0x20 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .text.HAL_DBGMCU_DisableDBGStopMode + 0x0000000000000000 0x20 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .text.HAL_DBGMCU_EnableDBGStandbyMode + 0x0000000000000000 0x20 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .text.HAL_DBGMCU_DisableDBGStandbyMode + 0x0000000000000000 0x20 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_macro 0x0000000000000000 0xa78 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_macro 0x0000000000000000 0x157 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_macro 0x0000000000000000 0x28 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_macro 0x0000000000000000 0x8e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_macro 0x0000000000000000 0x51 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_macro 0x0000000000000000 0x103 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_macro 0x0000000000000000 0x6a ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_macro 0x0000000000000000 0x1df ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_macro 0x0000000000000000 0x1c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_macro 0x0000000000000000 0xd9 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_macro 0x0000000000000000 0x102d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_macro 0x0000000000000000 0x11f ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_macro 0x0000000000000000 0x11851 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_macro 0x0000000000000000 0x6d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_macro 0x0000000000000000 0x3540 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_macro 0x0000000000000000 0x55 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_macro 0x0000000000000000 0x962 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_macro 0x0000000000000000 0x4df ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_macro 0x0000000000000000 0x1b6 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_macro 0x0000000000000000 0x1dc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_macro 0x0000000000000000 0x1bc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_macro 0x0000000000000000 0x30 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_macro 0x0000000000000000 0x3c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_macro 0x0000000000000000 0x236 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_macro 0x0000000000000000 0x408 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_macro 0x0000000000000000 0xc5 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_macro 0x0000000000000000 0x21d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_macro 0x0000000000000000 0x22c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_macro 0x0000000000000000 0x5b ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_macro 0x0000000000000000 0xa5 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_macro 0x0000000000000000 0x81 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_macro 0x0000000000000000 0xd3 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_macro 0x0000000000000000 0x2fe ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_macro 0x0000000000000000 0x213 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .text 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .data 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .bss 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .text.HAL_CAN_DeInit + 0x0000000000000000 0x46 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .text.HAL_CAN_MspInit + 0x0000000000000000 0x14 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .text.HAL_CAN_MspDeInit + 0x0000000000000000 0x14 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .text.HAL_CAN_Stop + 0x0000000000000000 0x92 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .text.HAL_CAN_RequestSleep + 0x0000000000000000 0x4a ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .text.HAL_CAN_WakeUp + 0x0000000000000000 0x84 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .text.HAL_CAN_IsSleepActive + 0x0000000000000000 0x40 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .text.HAL_CAN_AbortTxRequest + 0x0000000000000000 0x8a ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .text.HAL_CAN_IsTxMessagePending + 0x0000000000000000 0x48 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .text.HAL_CAN_GetTxTimestamp + 0x0000000000000000 0x5c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .text.HAL_CAN_GetRxFifoFillLevel + 0x0000000000000000 0x50 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .text.HAL_CAN_DeactivateNotification + 0x0000000000000000 0x4e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .text.HAL_CAN_RxFifo0MsgPendingCallback + 0x0000000000000000 0x14 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .text.HAL_CAN_GetState + 0x0000000000000000 0x50 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .text.HAL_CAN_GetError + 0x0000000000000000 0x18 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .text.HAL_CAN_ResetError + 0x0000000000000000 0x46 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_macro 0x0000000000000000 0xa78 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_macro 0x0000000000000000 0x157 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_macro 0x0000000000000000 0x28 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_macro 0x0000000000000000 0x8e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_macro 0x0000000000000000 0x51 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_macro 0x0000000000000000 0x103 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_macro 0x0000000000000000 0x6a ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_macro 0x0000000000000000 0x1df ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_macro 0x0000000000000000 0x1c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_macro 0x0000000000000000 0xd9 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_macro 0x0000000000000000 0x102d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_macro 0x0000000000000000 0x11f ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_macro 0x0000000000000000 0x11851 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_macro 0x0000000000000000 0x6d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_macro 0x0000000000000000 0x3540 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_macro 0x0000000000000000 0x55 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_macro 0x0000000000000000 0x962 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_macro 0x0000000000000000 0x4df ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_macro 0x0000000000000000 0x1b6 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_macro 0x0000000000000000 0x1dc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_macro 0x0000000000000000 0x1bc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_macro 0x0000000000000000 0x30 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_macro 0x0000000000000000 0x3c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_macro 0x0000000000000000 0x236 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_macro 0x0000000000000000 0x408 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_macro 0x0000000000000000 0xc5 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_macro 0x0000000000000000 0x21d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_macro 0x0000000000000000 0x22c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_macro 0x0000000000000000 0x5b ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_macro 0x0000000000000000 0xa5 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_macro 0x0000000000000000 0x81 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_macro 0x0000000000000000 0xd3 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_macro 0x0000000000000000 0x2fe ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_macro 0x0000000000000000 0x213 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .text 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .data 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .bss 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .text.__NVIC_DisableIRQ + 0x0000000000000000 0x48 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .text.__NVIC_GetPendingIRQ + 0x0000000000000000 0x44 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .text.__NVIC_SetPendingIRQ + 0x0000000000000000 0x3c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .text.__NVIC_ClearPendingIRQ + 0x0000000000000000 0x3c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .text.__NVIC_GetActive + 0x0000000000000000 0x44 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .text.__NVIC_GetPriority + 0x0000000000000000 0x50 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .text.NVIC_DecodePriority + 0x0000000000000000 0x6e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .text.__NVIC_SystemReset + 0x0000000000000000 0x2c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .text.HAL_NVIC_DisableIRQ + 0x0000000000000000 0x1c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .text.HAL_NVIC_SystemReset + 0x0000000000000000 0x8 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .text.HAL_MPU_Disable + 0x0000000000000000 0x28 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .text.HAL_MPU_Enable + 0x0000000000000000 0x34 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .text.HAL_MPU_ConfigRegion + 0x0000000000000000 0x88 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .text.HAL_NVIC_GetPriorityGrouping + 0x0000000000000000 0xe ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .text.HAL_NVIC_GetPriority + 0x0000000000000000 0x2c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .text.HAL_NVIC_SetPendingIRQ + 0x0000000000000000 0x1c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .text.HAL_NVIC_GetPendingIRQ + 0x0000000000000000 0x1e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .text.HAL_NVIC_ClearPendingIRQ + 0x0000000000000000 0x1c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .text.HAL_NVIC_GetActive + 0x0000000000000000 0x1e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .text.HAL_SYSTICK_CLKSourceConfig + 0x0000000000000000 0x38 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .text.HAL_SYSTICK_IRQHandler + 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .text.HAL_SYSTICK_Callback + 0x0000000000000000 0xe ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_macro 0x0000000000000000 0xa78 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x157 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x28 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x8e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x51 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x103 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x6a ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x1df ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x1c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_macro 0x0000000000000000 0xd9 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x102d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x11f ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x11851 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x6d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x3540 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x55 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x962 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x4df ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x1b6 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x1dc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x1bc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x30 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x3c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x236 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x408 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_macro 0x0000000000000000 0xc5 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x21d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x22c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x5b ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_macro 0x0000000000000000 0xa5 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x81 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_macro 0x0000000000000000 0xd3 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x2fe ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_macro 0x0000000000000000 0x213 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .text 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .data 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .bss 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .text.HAL_DMA_Init + 0x0000000000000000 0x8e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .text.HAL_DMA_DeInit + 0x0000000000000000 0x90 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .text.HAL_DMA_Start + 0x0000000000000000 0x84 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .text.HAL_DMA_Start_IT + 0x0000000000000000 0xbe ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .text.HAL_DMA_Abort + 0x0000000000000000 0x72 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .text.HAL_DMA_Abort_IT + 0x0000000000000000 0x7c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .text.HAL_DMA_PollForTransfer + 0x0000000000000000 0x136 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .text.HAL_DMA_IRQHandler + 0x0000000000000000 0x146 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .text.HAL_DMA_RegisterCallback + 0x0000000000000000 0x90 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .text.HAL_DMA_UnRegisterCallback + 0x0000000000000000 0xac ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .text.HAL_DMA_GetState + 0x0000000000000000 0x1a ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .text.HAL_DMA_GetError + 0x0000000000000000 0x18 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .text.DMA_SetConfig + 0x0000000000000000 0x5c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .text.DMA_CalcBaseAndBitshift + 0x0000000000000000 0x78 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_info 0x0000000000000000 0x757 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_abbrev 0x0000000000000000 0x1fe ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_aranges + 0x0000000000000000 0x88 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_ranges 0x0000000000000000 0x78 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_macro 0x0000000000000000 0x1ce ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_macro 0x0000000000000000 0xa78 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_macro 0x0000000000000000 0x157 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_macro 0x0000000000000000 0x28 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_macro 0x0000000000000000 0x8e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_macro 0x0000000000000000 0x51 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_macro 0x0000000000000000 0x103 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_macro 0x0000000000000000 0x6a ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_macro 0x0000000000000000 0x1df ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_macro 0x0000000000000000 0x1c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_macro 0x0000000000000000 0xd9 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_macro 0x0000000000000000 0x102d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_macro 0x0000000000000000 0x11f ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_macro 0x0000000000000000 0x11851 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_macro 0x0000000000000000 0x6d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_macro 0x0000000000000000 0x3540 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_macro 0x0000000000000000 0x55 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_macro 0x0000000000000000 0x962 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_macro 0x0000000000000000 0x4df ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_macro 0x0000000000000000 0x1b6 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_macro 0x0000000000000000 0x1dc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_macro 0x0000000000000000 0x1bc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_macro 0x0000000000000000 0x30 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_macro 0x0000000000000000 0x3c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_macro 0x0000000000000000 0x236 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_macro 0x0000000000000000 0x408 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_macro 0x0000000000000000 0xc5 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_macro 0x0000000000000000 0x21d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_macro 0x0000000000000000 0x22c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_macro 0x0000000000000000 0x5b ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_macro 0x0000000000000000 0xa5 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_macro 0x0000000000000000 0x81 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_macro 0x0000000000000000 0xd3 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_macro 0x0000000000000000 0x2fe ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_macro 0x0000000000000000 0x213 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_line 0x0000000000000000 0xc64 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_str 0x0000000000000000 0x9e319 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .comment 0x0000000000000000 0x51 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .debug_frame 0x0000000000000000 0x224 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .ARM.attributes + 0x0000000000000000 0x34 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .text 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .data 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .bss 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .text.HAL_EXTI_SetConfigLine + 0x0000000000000000 0x1a0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .text.HAL_EXTI_GetConfigLine + 0x0000000000000000 0x144 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .text.HAL_EXTI_ClearConfigLine + 0x0000000000000000 0x110 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .text.HAL_EXTI_RegisterCallback + 0x0000000000000000 0x34 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .text.HAL_EXTI_GetHandle + 0x0000000000000000 0x28 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .text.HAL_EXTI_IRQHandler + 0x0000000000000000 0x64 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .text.HAL_EXTI_GetPending + 0x0000000000000000 0x58 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .text.HAL_EXTI_ClearPending + 0x0000000000000000 0x48 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .text.HAL_EXTI_GenerateSWI + 0x0000000000000000 0x44 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_info 0x0000000000000000 0x68f ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_abbrev 0x0000000000000000 0x197 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_aranges + 0x0000000000000000 0x60 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_ranges 0x0000000000000000 0x50 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_macro 0x0000000000000000 0x1da ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_macro 0x0000000000000000 0xa78 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_macro 0x0000000000000000 0x157 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_macro 0x0000000000000000 0x28 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_macro 0x0000000000000000 0x8e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_macro 0x0000000000000000 0x51 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_macro 0x0000000000000000 0x103 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_macro 0x0000000000000000 0x6a ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_macro 0x0000000000000000 0x1df ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_macro 0x0000000000000000 0x1c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_macro 0x0000000000000000 0xd9 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_macro 0x0000000000000000 0x102d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_macro 0x0000000000000000 0x11f ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_macro 0x0000000000000000 0x11851 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_macro 0x0000000000000000 0x6d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_macro 0x0000000000000000 0x3540 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_macro 0x0000000000000000 0x55 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_macro 0x0000000000000000 0x962 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_macro 0x0000000000000000 0x4df ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_macro 0x0000000000000000 0x1b6 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_macro 0x0000000000000000 0x1dc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_macro 0x0000000000000000 0x1bc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_macro 0x0000000000000000 0x30 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_macro 0x0000000000000000 0x3c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_macro 0x0000000000000000 0x236 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_macro 0x0000000000000000 0x408 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_macro 0x0000000000000000 0xc5 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_macro 0x0000000000000000 0x21d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_macro 0x0000000000000000 0x22c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_macro 0x0000000000000000 0x5b ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_macro 0x0000000000000000 0xa5 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_macro 0x0000000000000000 0x81 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_macro 0x0000000000000000 0xd3 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_macro 0x0000000000000000 0x2fe ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_macro 0x0000000000000000 0x213 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_line 0x0000000000000000 0xa17 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_str 0x0000000000000000 0x9e147 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .comment 0x0000000000000000 0x51 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .debug_frame 0x0000000000000000 0x174 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .ARM.attributes + 0x0000000000000000 0x34 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .text 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .data 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .bss 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .bss.pFlash 0x0000000000000000 0x20 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .text.HAL_FLASH_Program + 0x0000000000000000 0xe0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .text.HAL_FLASH_Program_IT + 0x0000000000000000 0x90 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .text.HAL_FLASH_IRQHandler + 0x0000000000000000 0x1c8 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .text.HAL_FLASH_EndOfOperationCallback + 0x0000000000000000 0x14 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .text.HAL_FLASH_OperationErrorCallback + 0x0000000000000000 0x14 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .text.HAL_FLASH_Unlock + 0x0000000000000000 0x4c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .text.HAL_FLASH_Lock + 0x0000000000000000 0x20 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .text.HAL_FLASH_OB_Unlock + 0x0000000000000000 0x38 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .text.HAL_FLASH_OB_Lock + 0x0000000000000000 0x20 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .text.HAL_FLASH_OB_Launch + 0x0000000000000000 0x24 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .text.HAL_FLASH_GetError + 0x0000000000000000 0x18 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .text.FLASH_Program_HalfWord + 0x0000000000000000 0x38 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .text.FLASH_WaitForLastOperation + 0x0000000000000000 0x80 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .text.FLASH_SetErrorCode + 0x0000000000000000 0x64 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_info 0x0000000000000000 0x53d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_abbrev 0x0000000000000000 0x250 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_aranges + 0x0000000000000000 0x88 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_ranges 0x0000000000000000 0x78 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_macro 0x0000000000000000 0x1ce ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_macro 0x0000000000000000 0xa78 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_macro 0x0000000000000000 0x157 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_macro 0x0000000000000000 0x28 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_macro 0x0000000000000000 0x8e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_macro 0x0000000000000000 0x51 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_macro 0x0000000000000000 0x103 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_macro 0x0000000000000000 0x6a ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_macro 0x0000000000000000 0x1df ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_macro 0x0000000000000000 0x1c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_macro 0x0000000000000000 0xd9 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_macro 0x0000000000000000 0x102d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_macro 0x0000000000000000 0x11f ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_macro 0x0000000000000000 0x11851 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_macro 0x0000000000000000 0x6d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_macro 0x0000000000000000 0x3540 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_macro 0x0000000000000000 0x55 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_macro 0x0000000000000000 0x962 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_macro 0x0000000000000000 0x4df ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_macro 0x0000000000000000 0x1b6 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_macro 0x0000000000000000 0x1dc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_macro 0x0000000000000000 0x1bc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_macro 0x0000000000000000 0x30 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_macro 0x0000000000000000 0x3c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_macro 0x0000000000000000 0x236 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_macro 0x0000000000000000 0x408 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_macro 0x0000000000000000 0xc5 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_macro 0x0000000000000000 0x21d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_macro 0x0000000000000000 0x22c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_macro 0x0000000000000000 0x5b ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_macro 0x0000000000000000 0xa5 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_macro 0x0000000000000000 0x81 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_macro 0x0000000000000000 0xd3 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_macro 0x0000000000000000 0x2fe ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_macro 0x0000000000000000 0x213 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_line 0x0000000000000000 0x9e8 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_str 0x0000000000000000 0x9e21e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .comment 0x0000000000000000 0x51 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .debug_frame 0x0000000000000000 0x20c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .ARM.attributes + 0x0000000000000000 0x34 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .text 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .data 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .bss 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .text.HAL_FLASHEx_Erase + 0x0000000000000000 0xd4 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .text.HAL_FLASHEx_Erase_IT + 0x0000000000000000 0x80 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .text.HAL_FLASHEx_OBErase + 0x0000000000000000 0x84 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .text.HAL_FLASHEx_OBProgram + 0x0000000000000000 0xf8 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .text.HAL_FLASHEx_OBGetConfig + 0x0000000000000000 0x38 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .text.HAL_FLASHEx_OBGetUserData + 0x0000000000000000 0x70 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .text.FLASH_MassErase + 0x0000000000000000 0x34 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .text.FLASH_OB_EnableWRP + 0x0000000000000000 0x144 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .text.FLASH_OB_DisableWRP + 0x0000000000000000 0x140 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .text.FLASH_OB_RDP_LevelConfig + 0x0000000000000000 0xa0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .text.FLASH_OB_UserConfig + 0x0000000000000000 0x70 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .text.FLASH_OB_ProgramData + 0x0000000000000000 0x68 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .text.FLASH_OB_GetWRP + 0x0000000000000000 0x18 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .text.FLASH_OB_GetRDP + 0x0000000000000000 0x3c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .text.FLASH_OB_GetUser + 0x0000000000000000 0x38 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .text.FLASH_PageErase + 0x0000000000000000 0x40 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_info 0x0000000000000000 0x83b ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_abbrev 0x0000000000000000 0x2a0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_aranges + 0x0000000000000000 0x98 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_ranges 0x0000000000000000 0x88 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x1e0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0xa78 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x157 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x28 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x8e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x51 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x103 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x6a ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x1df ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x1c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0xd9 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x102d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x11f ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x11851 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x6d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x3540 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x55 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x962 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x4df ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x1b6 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x1dc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x1bc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x30 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x3c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x236 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x408 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0xc5 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x21d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x22c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x5b ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0xa5 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x81 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0xd3 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x2fe ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_macro 0x0000000000000000 0x213 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_line 0x0000000000000000 0xb51 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_str 0x0000000000000000 0x9e41a ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .comment 0x0000000000000000 0x51 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .debug_frame 0x0000000000000000 0x258 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .ARM.attributes + 0x0000000000000000 0x34 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .text 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .data 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .bss 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .text.HAL_GPIO_DeInit + 0x0000000000000000 0x1b8 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .text.HAL_GPIO_ReadPin + 0x0000000000000000 0x30 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .text.HAL_GPIO_TogglePin + 0x0000000000000000 0x34 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .text.HAL_GPIO_LockPin + 0x0000000000000000 0x50 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .text.HAL_GPIO_EXTI_IRQHandler + 0x0000000000000000 0x30 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .text.HAL_GPIO_EXTI_Callback + 0x0000000000000000 0x16 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_macro 0x0000000000000000 0xa78 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x157 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x28 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x8e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x51 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x103 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x6a ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x1df ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x1c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_macro 0x0000000000000000 0xd9 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x102d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x11f ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x11851 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x6d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x3540 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x55 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x962 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x4df ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x1b6 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x1dc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x1bc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x30 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x3c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x236 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x408 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_macro 0x0000000000000000 0xc5 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x21d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x22c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x5b ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_macro 0x0000000000000000 0xa5 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x81 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_macro 0x0000000000000000 0xd3 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x2fe ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_macro 0x0000000000000000 0x213 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .data 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .bss 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2C_DeInit + 0x0000000000000000 0x5e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2C_MspInit + 0x0000000000000000 0x14 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2C_MspDeInit + 0x0000000000000000 0x14 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Slave_Transmit + 0x0000000000000000 0x212 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Slave_Receive + 0x0000000000000000 0x1fe ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Master_Transmit_IT + 0x0000000000000000 0xe0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Master_Receive_IT + 0x0000000000000000 0xe0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Slave_Transmit_IT + 0x0000000000000000 0xa0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Slave_Receive_IT + 0x0000000000000000 0xa0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Master_Transmit_DMA + 0x0000000000000000 0x1e0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Master_Receive_DMA + 0x0000000000000000 0x1e0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Slave_Transmit_DMA + 0x0000000000000000 0x16c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Slave_Receive_DMA + 0x0000000000000000 0x16c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Mem_Write_IT + 0x0000000000000000 0x128 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Mem_Read_IT + 0x0000000000000000 0x12c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Mem_Write_DMA + 0x0000000000000000 0x1ec ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Mem_Read_DMA + 0x0000000000000000 0x1f0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2C_IsDeviceReady + 0x0000000000000000 0x20e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Master_Seq_Transmit_IT + 0x0000000000000000 0x108 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Master_Seq_Transmit_DMA + 0x0000000000000000 0x208 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Master_Seq_Receive_IT + 0x0000000000000000 0x108 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Master_Seq_Receive_DMA + 0x0000000000000000 0x208 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Slave_Seq_Transmit_IT + 0x0000000000000000 0x148 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Slave_Seq_Transmit_DMA + 0x0000000000000000 0x270 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Slave_Seq_Receive_IT + 0x0000000000000000 0x148 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Slave_Seq_Receive_DMA + 0x0000000000000000 0x270 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2C_EnableListen_IT + 0x0000000000000000 0x40 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2C_DisableListen_IT + 0x0000000000000000 0x62 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Master_Abort_IT + 0x0000000000000000 0xa0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2C_EV_IRQHandler + 0x0000000000000000 0x34 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2C_ER_IRQHandler + 0x0000000000000000 0xc2 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2C_MasterTxCpltCallback + 0x0000000000000000 0x14 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2C_MasterRxCpltCallback + 0x0000000000000000 0x14 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2C_SlaveTxCpltCallback + 0x0000000000000000 0x14 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2C_SlaveRxCpltCallback + 0x0000000000000000 0x14 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2C_AddrCallback + 0x0000000000000000 0x1c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2C_ListenCpltCallback + 0x0000000000000000 0x14 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2C_MemTxCpltCallback + 0x0000000000000000 0x14 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2C_MemRxCpltCallback + 0x0000000000000000 0x14 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2C_ErrorCallback + 0x0000000000000000 0x14 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2C_AbortCpltCallback + 0x0000000000000000 0x14 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2C_GetState + 0x0000000000000000 0x1c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2C_GetMode + 0x0000000000000000 0x1c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2C_GetError + 0x0000000000000000 0x18 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.I2C_Master_ISR_IT + 0x0000000000000000 0x250 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.I2C_Slave_ISR_IT + 0x0000000000000000 0x206 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.I2C_Master_ISR_DMA + 0x0000000000000000 0x1e6 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.I2C_Slave_ISR_DMA + 0x0000000000000000 0x1c0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.I2C_ITAddrCplt + 0x0000000000000000 0x108 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.I2C_ITMasterSeqCplt + 0x0000000000000000 0x7a ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.I2C_ITSlaveSeqCplt + 0x0000000000000000 0xbc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.I2C_ITMasterCplt + 0x0000000000000000 0x194 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.I2C_ITSlaveCplt + 0x0000000000000000 0x214 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.I2C_ITListenCplt + 0x0000000000000000 0xac ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.I2C_ITError + 0x0000000000000000 0x1a0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.I2C_TreatErrorCallback + 0x0000000000000000 0x4e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.I2C_DMAMasterTransmitCplt + 0x0000000000000000 0x96 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.I2C_DMASlaveTransmitCplt + 0x0000000000000000 0x40 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.I2C_DMAMasterReceiveCplt + 0x0000000000000000 0x96 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.I2C_DMASlaveReceiveCplt + 0x0000000000000000 0x46 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.I2C_DMAError + 0x0000000000000000 0x2e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.I2C_DMAAbort + 0x0000000000000000 0x3c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.I2C_Enable_IRQ + 0x0000000000000000 0xc8 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.I2C_Disable_IRQ + 0x0000000000000000 0xbc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.I2C_ConvertOtherXferOptions + 0x0000000000000000 0x36 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_macro 0x0000000000000000 0xa78 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_macro 0x0000000000000000 0x157 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_macro 0x0000000000000000 0x28 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_macro 0x0000000000000000 0x8e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_macro 0x0000000000000000 0x51 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_macro 0x0000000000000000 0x103 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_macro 0x0000000000000000 0x6a ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_macro 0x0000000000000000 0x1df ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_macro 0x0000000000000000 0x1c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_macro 0x0000000000000000 0xd9 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_macro 0x0000000000000000 0x102d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_macro 0x0000000000000000 0x11f ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_macro 0x0000000000000000 0x11851 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_macro 0x0000000000000000 0x6d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_macro 0x0000000000000000 0x3540 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_macro 0x0000000000000000 0x55 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_macro 0x0000000000000000 0x962 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_macro 0x0000000000000000 0x4df ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_macro 0x0000000000000000 0x1b6 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_macro 0x0000000000000000 0x1dc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_macro 0x0000000000000000 0x1bc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_macro 0x0000000000000000 0x30 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_macro 0x0000000000000000 0x3c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_macro 0x0000000000000000 0x236 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_macro 0x0000000000000000 0x408 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_macro 0x0000000000000000 0xc5 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_macro 0x0000000000000000 0x21d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_macro 0x0000000000000000 0x22c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_macro 0x0000000000000000 0x5b ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_macro 0x0000000000000000 0xa5 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_macro 0x0000000000000000 0x81 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_macro 0x0000000000000000 0xd3 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_macro 0x0000000000000000 0x2fe ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_macro 0x0000000000000000 0x213 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .text 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .data 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .bss 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .text.HAL_I2CEx_EnableWakeUp + 0x0000000000000000 0x84 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .text.HAL_I2CEx_DisableWakeUp + 0x0000000000000000 0x84 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .text.HAL_I2CEx_EnableFastModePlus + 0x0000000000000000 0x40 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .text.HAL_I2CEx_DisableFastModePlus + 0x0000000000000000 0x44 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_macro 0x0000000000000000 0xa78 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_macro 0x0000000000000000 0x157 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_macro 0x0000000000000000 0x28 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_macro 0x0000000000000000 0x8e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_macro 0x0000000000000000 0x51 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_macro 0x0000000000000000 0x103 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_macro 0x0000000000000000 0x6a ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_macro 0x0000000000000000 0x1df ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_macro 0x0000000000000000 0x1c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_macro 0x0000000000000000 0xd9 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_macro 0x0000000000000000 0x102d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_macro 0x0000000000000000 0x11f ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_macro 0x0000000000000000 0x11851 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_macro 0x0000000000000000 0x6d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_macro 0x0000000000000000 0x3540 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_macro 0x0000000000000000 0x55 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_macro 0x0000000000000000 0x962 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_macro 0x0000000000000000 0x4df ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_macro 0x0000000000000000 0x1b6 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_macro 0x0000000000000000 0x1dc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_macro 0x0000000000000000 0x1bc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_macro 0x0000000000000000 0x30 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_macro 0x0000000000000000 0x3c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_macro 0x0000000000000000 0x236 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_macro 0x0000000000000000 0x408 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_macro 0x0000000000000000 0xc5 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_macro 0x0000000000000000 0x21d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_macro 0x0000000000000000 0x22c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_macro 0x0000000000000000 0x5b ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_macro 0x0000000000000000 0xa5 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_macro 0x0000000000000000 0x81 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_macro 0x0000000000000000 0xd3 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_macro 0x0000000000000000 0x2fe ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_macro 0x0000000000000000 0x213 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .text 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .data 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .bss 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .text.HAL_PWR_DeInit + 0x0000000000000000 0x2c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .text.HAL_PWR_EnableBkUpAccess + 0x0000000000000000 0x20 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .text.HAL_PWR_DisableBkUpAccess + 0x0000000000000000 0x20 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .text.HAL_PWR_EnableWakeUpPin + 0x0000000000000000 0x24 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .text.HAL_PWR_DisableWakeUpPin + 0x0000000000000000 0x28 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .text.HAL_PWR_EnterSLEEPMode + 0x0000000000000000 0x38 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .text.HAL_PWR_EnterSTOPMode + 0x0000000000000000 0x68 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .text.HAL_PWR_EnterSTANDBYMode + 0x0000000000000000 0x30 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .text.HAL_PWR_EnableSleepOnExit + 0x0000000000000000 0x20 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .text.HAL_PWR_DisableSleepOnExit + 0x0000000000000000 0x20 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .text.HAL_PWR_EnableSEVOnPend + 0x0000000000000000 0x20 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .text.HAL_PWR_DisableSEVOnPend + 0x0000000000000000 0x20 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_info 0x0000000000000000 0x4ca ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_abbrev 0x0000000000000000 0x13b ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_aranges + 0x0000000000000000 0x78 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_ranges 0x0000000000000000 0x68 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x1ce ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_macro 0x0000000000000000 0xa78 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x157 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x28 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x8e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x51 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x103 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x6a ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x1df ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x1c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_macro 0x0000000000000000 0xd9 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x102d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x11f ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x11851 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x6d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x3540 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x55 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x962 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x4df ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x1b6 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x1dc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x1bc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x30 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x3c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x236 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x408 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_macro 0x0000000000000000 0xc5 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x21d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x22c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x5b ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_macro 0x0000000000000000 0xa5 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x81 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_macro 0x0000000000000000 0xd3 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x2fe ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_macro 0x0000000000000000 0x213 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_line 0x0000000000000000 0x7ec ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_str 0x0000000000000000 0x9e0da ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .comment 0x0000000000000000 0x51 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .debug_frame 0x0000000000000000 0x1b0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .ARM.attributes + 0x0000000000000000 0x34 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .text 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .data 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .bss 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .text.HAL_PWR_ConfigPVD + 0x0000000000000000 0xc0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .text.HAL_PWR_EnablePVD + 0x0000000000000000 0x20 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .text.HAL_PWR_DisablePVD + 0x0000000000000000 0x20 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .text.HAL_PWR_PVD_IRQHandler + 0x0000000000000000 0x24 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .text.HAL_PWR_PVDCallback + 0x0000000000000000 0xe ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_info 0x0000000000000000 0x261 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_abbrev 0x0000000000000000 0x132 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_aranges + 0x0000000000000000 0x40 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_ranges 0x0000000000000000 0x30 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x1e6 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0xa78 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x157 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x28 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x8e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x51 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x103 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x6a ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x1df ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x1c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0xd9 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x102d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x11f ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x11851 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x6d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x3540 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x55 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x962 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x4df ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x1b6 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x1dc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x1bc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x30 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x3c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x236 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x408 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0xc5 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x21d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x22c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x5b ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0xa5 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x81 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0xd3 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x2fe ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_macro 0x0000000000000000 0x213 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_line 0x0000000000000000 0x745 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_str 0x0000000000000000 0x9e01a ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .comment 0x0000000000000000 0x51 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .debug_frame 0x0000000000000000 0xb4 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .ARM.attributes + 0x0000000000000000 0x34 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .text 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .data 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .bss 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .text.HAL_RCC_DeInit + 0x0000000000000000 0x148 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .text.HAL_RCC_MCOConfig + 0x0000000000000000 0x64 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .text.HAL_RCC_EnableCSS + 0x0000000000000000 0x38 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .text.HAL_RCC_DisableCSS + 0x0000000000000000 0x38 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .text.HAL_RCC_GetHCLKFreq + 0x0000000000000000 0x18 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .text.HAL_RCC_GetPCLK1Freq + 0x0000000000000000 0x44 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .text.HAL_RCC_GetPCLK2Freq + 0x0000000000000000 0x44 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .text.HAL_RCC_GetOscConfig + 0x0000000000000000 0x11c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .text.HAL_RCC_GetClockConfig + 0x0000000000000000 0x64 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .text.HAL_RCC_NMI_IRQHandler + 0x0000000000000000 0x28 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .text.HAL_RCC_CSSCallback + 0x0000000000000000 0xe ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_macro 0x0000000000000000 0xa78 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x157 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x28 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x8e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x51 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x103 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x6a ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x1df ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x1c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_macro 0x0000000000000000 0xd9 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x102d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x11f ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x11851 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x6d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x3540 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x55 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x962 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x4df ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x1b6 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x1dc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x1bc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x30 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x3c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x236 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x408 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_macro 0x0000000000000000 0xc5 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x21d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x22c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x5b ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_macro 0x0000000000000000 0xa5 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x81 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_macro 0x0000000000000000 0xd3 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x2fe ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_macro 0x0000000000000000 0x213 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .text 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .data 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .bss 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .text.HAL_RCCEx_GetPeriphCLKConfig + 0x0000000000000000 0xfc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .rodata 0x0000000000000000 0x20 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .text.HAL_RCCEx_GetPeriphCLKFreq + 0x0000000000000000 0x52c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .text.RCC_GetPLLCLKFreq + 0x0000000000000000 0x7c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0xa78 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x157 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x28 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x8e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x51 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x103 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x6a ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x1df ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x1c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0xd9 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x102d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x11f ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x11851 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x6d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x3540 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x55 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x962 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x4df ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x1b6 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x1dc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x1bc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x30 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x3c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x236 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x408 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0xc5 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x21d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x22c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x5b ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0xa5 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x81 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0xd3 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x2fe ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_macro 0x0000000000000000 0x213 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .data 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .bss 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.HAL_SPI_DeInit + 0x0000000000000000 0x50 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.HAL_SPI_MspInit + 0x0000000000000000 0x14 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.HAL_SPI_MspDeInit + 0x0000000000000000 0x14 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.HAL_SPI_Transmit + 0x0000000000000000 0x2dc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.HAL_SPI_Receive + 0x0000000000000000 0x260 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.HAL_SPI_Transmit_IT + 0x0000000000000000 0x11c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.HAL_SPI_Receive_IT + 0x0000000000000000 0x160 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.HAL_SPI_TransmitReceive_IT + 0x0000000000000000 0x160 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.HAL_SPI_Transmit_DMA + 0x0000000000000000 0x1e8 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.HAL_SPI_Receive_DMA + 0x0000000000000000 0x264 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.HAL_SPI_TransmitReceive_DMA + 0x0000000000000000 0x334 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.HAL_SPI_Abort + 0x0000000000000000 0x240 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.HAL_SPI_Abort_IT + 0x0000000000000000 0x1f4 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.HAL_SPI_DMAPause + 0x0000000000000000 0x44 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.HAL_SPI_DMAResume + 0x0000000000000000 0x44 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.HAL_SPI_DMAStop + 0x0000000000000000 0x7e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.HAL_SPI_IRQHandler + 0x0000000000000000 0x200 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.HAL_SPI_TxCpltCallback + 0x0000000000000000 0x14 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.HAL_SPI_RxCpltCallback + 0x0000000000000000 0x14 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.HAL_SPI_TxRxCpltCallback + 0x0000000000000000 0x14 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.HAL_SPI_TxHalfCpltCallback + 0x0000000000000000 0x14 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.HAL_SPI_RxHalfCpltCallback + 0x0000000000000000 0x14 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.HAL_SPI_TxRxHalfCpltCallback + 0x0000000000000000 0x14 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.HAL_SPI_ErrorCallback + 0x0000000000000000 0x14 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.HAL_SPI_AbortCpltCallback + 0x0000000000000000 0x14 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.HAL_SPI_GetState + 0x0000000000000000 0x1c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.HAL_SPI_GetError + 0x0000000000000000 0x18 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.SPI_DMATransmitCplt + 0x0000000000000000 0xa6 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.SPI_DMAReceiveCplt + 0x0000000000000000 0xa8 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.SPI_DMATransmitReceiveCplt + 0x0000000000000000 0x90 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.SPI_DMAHalfTransmitCplt + 0x0000000000000000 0x1c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.SPI_DMAHalfReceiveCplt + 0x0000000000000000 0x1c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.SPI_DMAHalfTransmitReceiveCplt + 0x0000000000000000 0x1c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.SPI_DMAError + 0x0000000000000000 0x40 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.SPI_DMAAbortOnError + 0x0000000000000000 0x2a ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.SPI_DMATxAbortCallback + 0x0000000000000000 0xde ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.SPI_DMARxAbortCallback + 0x0000000000000000 0xe2 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.SPI_2linesRxISR_8BIT + 0x0000000000000000 0xbe ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.SPI_2linesTxISR_8BIT + 0x0000000000000000 0x92 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.SPI_2linesRxISR_16BIT + 0x0000000000000000 0x66 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.SPI_2linesTxISR_16BIT + 0x0000000000000000 0x60 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.SPI_RxISR_8BIT + 0x0000000000000000 0x50 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.SPI_RxISR_16BIT + 0x0000000000000000 0x4c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.SPI_TxISR_8BIT + 0x0000000000000000 0x46 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.SPI_TxISR_16BIT + 0x0000000000000000 0x44 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.SPI_EndRxTransaction + 0x0000000000000000 0xb0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.SPI_CloseRxTx_ISR + 0x0000000000000000 0x84 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.SPI_CloseRx_ISR + 0x0000000000000000 0x60 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.SPI_CloseTx_ISR + 0x0000000000000000 0x7e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.SPI_AbortRx_ISR + 0x0000000000000000 0xc0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.SPI_AbortTx_ISR + 0x0000000000000000 0x144 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .debug_macro 0x0000000000000000 0xa78 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .debug_macro 0x0000000000000000 0x157 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .debug_macro 0x0000000000000000 0x28 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .debug_macro 0x0000000000000000 0x8e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .debug_macro 0x0000000000000000 0x51 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .debug_macro 0x0000000000000000 0x103 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .debug_macro 0x0000000000000000 0x6a ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .debug_macro 0x0000000000000000 0x1df ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .debug_macro 0x0000000000000000 0x1c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .debug_macro 0x0000000000000000 0xd9 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .debug_macro 0x0000000000000000 0x102d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .debug_macro 0x0000000000000000 0x11f ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .debug_macro 0x0000000000000000 0x11851 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .debug_macro 0x0000000000000000 0x6d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .debug_macro 0x0000000000000000 0x3540 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .debug_macro 0x0000000000000000 0x55 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .debug_macro 0x0000000000000000 0x962 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .debug_macro 0x0000000000000000 0x4df ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .debug_macro 0x0000000000000000 0x1b6 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .debug_macro 0x0000000000000000 0x1dc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .debug_macro 0x0000000000000000 0x1bc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .debug_macro 0x0000000000000000 0x30 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .debug_macro 0x0000000000000000 0x3c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .debug_macro 0x0000000000000000 0x236 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .debug_macro 0x0000000000000000 0x408 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .debug_macro 0x0000000000000000 0xc5 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .debug_macro 0x0000000000000000 0x21d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .debug_macro 0x0000000000000000 0x22c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .debug_macro 0x0000000000000000 0x5b ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .debug_macro 0x0000000000000000 0xa5 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .debug_macro 0x0000000000000000 0x81 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .debug_macro 0x0000000000000000 0xd3 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .debug_macro 0x0000000000000000 0x2fe ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .debug_macro 0x0000000000000000 0x213 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .text 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .data 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .bss 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .text.HAL_SPIEx_FlushRxFifo + 0x0000000000000000 0x44 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_info 0x0000000000000000 0x62a ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_abbrev 0x0000000000000000 0x141 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_aranges + 0x0000000000000000 0x20 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_ranges 0x0000000000000000 0x10 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_macro 0x0000000000000000 0x1d4 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_macro 0x0000000000000000 0xa78 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_macro 0x0000000000000000 0x157 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_macro 0x0000000000000000 0x28 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_macro 0x0000000000000000 0x8e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_macro 0x0000000000000000 0x51 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_macro 0x0000000000000000 0x103 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_macro 0x0000000000000000 0x6a ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_macro 0x0000000000000000 0x1df ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_macro 0x0000000000000000 0x1c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_macro 0x0000000000000000 0xd9 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_macro 0x0000000000000000 0x102d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_macro 0x0000000000000000 0x11f ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_macro 0x0000000000000000 0x11851 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_macro 0x0000000000000000 0x6d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_macro 0x0000000000000000 0x3540 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_macro 0x0000000000000000 0x55 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_macro 0x0000000000000000 0x962 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_macro 0x0000000000000000 0x4df ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_macro 0x0000000000000000 0x1b6 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_macro 0x0000000000000000 0x1dc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_macro 0x0000000000000000 0x1bc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_macro 0x0000000000000000 0x30 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_macro 0x0000000000000000 0x3c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_macro 0x0000000000000000 0x236 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_macro 0x0000000000000000 0x408 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_macro 0x0000000000000000 0xc5 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_macro 0x0000000000000000 0x21d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_macro 0x0000000000000000 0x22c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_macro 0x0000000000000000 0x5b ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_macro 0x0000000000000000 0xa5 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_macro 0x0000000000000000 0x81 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_macro 0x0000000000000000 0xd3 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_macro 0x0000000000000000 0x2fe ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_macro 0x0000000000000000 0x213 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_line 0x0000000000000000 0x6e2 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_str 0x0000000000000000 0x9e324 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .comment 0x0000000000000000 0x51 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .debug_frame 0x0000000000000000 0x38 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .ARM.attributes + 0x0000000000000000 0x34 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .text 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .data 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .bss 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_info 0x0000000000000000 0x6f ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_abbrev 0x0000000000000000 0x29 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_aranges + 0x0000000000000000 0x18 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_macro 0x0000000000000000 0x1cf ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_macro 0x0000000000000000 0xa78 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_macro 0x0000000000000000 0x157 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_macro 0x0000000000000000 0x28 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_macro 0x0000000000000000 0x8e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_macro 0x0000000000000000 0x51 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_macro 0x0000000000000000 0x103 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_macro 0x0000000000000000 0x6a ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_macro 0x0000000000000000 0x1df ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_macro 0x0000000000000000 0x1c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_macro 0x0000000000000000 0xd9 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_macro 0x0000000000000000 0x102d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_macro 0x0000000000000000 0x11f ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_macro 0x0000000000000000 0x11851 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_macro 0x0000000000000000 0x6d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_macro 0x0000000000000000 0x3540 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_macro 0x0000000000000000 0x55 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_macro 0x0000000000000000 0x962 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_macro 0x0000000000000000 0x4df ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_macro 0x0000000000000000 0x1b6 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_macro 0x0000000000000000 0x1dc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_macro 0x0000000000000000 0x1bc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_macro 0x0000000000000000 0x30 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_macro 0x0000000000000000 0x3c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_macro 0x0000000000000000 0x236 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_macro 0x0000000000000000 0x408 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_macro 0x0000000000000000 0xc5 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_macro 0x0000000000000000 0x21d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_macro 0x0000000000000000 0x22c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_macro 0x0000000000000000 0x5b ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_macro 0x0000000000000000 0xa5 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_macro 0x0000000000000000 0x81 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_macro 0x0000000000000000 0xd3 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_macro 0x0000000000000000 0x2fe ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_macro 0x0000000000000000 0x213 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_line 0x0000000000000000 0x69c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .debug_str 0x0000000000000000 0x9dea7 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .comment 0x0000000000000000 0x51 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .ARM.attributes + 0x0000000000000000 0x34 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .group 0x0000000000000000 0xc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .text 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .data 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .bss 0x0000000000000000 0x0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_info 0x0000000000000000 0x6f ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_abbrev 0x0000000000000000 0x29 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_aranges + 0x0000000000000000 0x18 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x1ce ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0xa78 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x157 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x2e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x28 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x8e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x51 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x103 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x6a ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x1df ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x1c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x22 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0xd9 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x102d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x11f ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x11851 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x6d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x3540 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x55 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x962 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x4df ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x1b6 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x174 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x1dc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x1bc ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x30 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x3c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x236 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x408 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0xc5 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x21d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x22c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x5b ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0xa5 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x81 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0xd3 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x2fe ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_macro 0x0000000000000000 0x213 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_line 0x0000000000000000 0x69f ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .debug_str 0x0000000000000000 0x9deaa ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .comment 0x0000000000000000 0x51 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .ARM.attributes + 0x0000000000000000 0x34 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o + .text 0x0000000000000000 0x0 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(lib_a-errno.o) + .data 0x0000000000000000 0x0 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(lib_a-errno.o) + .bss 0x0000000000000000 0x0 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(lib_a-errno.o) + .text.__errno 0x0000000000000000 0xc /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(lib_a-errno.o) + .debug_frame 0x0000000000000000 0x20 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(lib_a-errno.o) + .ARM.attributes + 0x0000000000000000 0x34 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(lib_a-errno.o) + .text 0x0000000000000000 0x0 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(lib_a-exit.o) + .data 0x0000000000000000 0x0 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(lib_a-exit.o) + .bss 0x0000000000000000 0x0 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(lib_a-exit.o) + .text.exit 0x0000000000000000 0x28 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(lib_a-exit.o) + .debug_frame 0x0000000000000000 0x28 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(lib_a-exit.o) + .ARM.attributes + 0x0000000000000000 0x34 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(lib_a-exit.o) + .text 0x0000000000000000 0x0 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(lib_a-impure.o) + .data 0x0000000000000000 0x0 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(lib_a-impure.o) + .bss 0x0000000000000000 0x0 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(lib_a-impure.o) + .data._impure_ptr + 0x0000000000000000 0x4 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(lib_a-impure.o) + .data.impure_data + 0x0000000000000000 0x60 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(lib_a-impure.o) + .rodata._global_impure_ptr + 0x0000000000000000 0x4 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(lib_a-impure.o) + .ARM.attributes + 0x0000000000000000 0x34 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(lib_a-impure.o) + .text 0x0000000000000000 0x0 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(lib_a-init.o) + .data 0x0000000000000000 0x0 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(lib_a-init.o) + .bss 0x0000000000000000 0x0 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(lib_a-init.o) + .text 0x0000000000000000 0x0 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(lib_a-memset.o) + .data 0x0000000000000000 0x0 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(lib_a-memset.o) + .bss 0x0000000000000000 0x0 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(lib_a-memset.o) + .text 0x0000000000000000 0x0 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtend.o + .data 0x0000000000000000 0x0 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtend.o + .bss 0x0000000000000000 0x0 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtend.o + .rodata 0x0000000000000000 0x24 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtend.o + .eh_frame 0x0000000000000000 0x4 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtend.o + .ARM.attributes + 0x0000000000000000 0x34 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtend.o + .text 0x0000000000000000 0x0 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtn.o + .data 0x0000000000000000 0x0 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtn.o + .bss 0x0000000000000000 0x0 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtn.o + +Memory Configuration + +Name Origin Length Attributes +RAM 0x0000000020000000 0x000000000000a000 xrw +FLASH 0x0000000008000000 0x0000000000040000 xr +*default* 0x0000000000000000 0xffffffffffffffff + +Linker script and memory map + +LOAD /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crti.o +LOAD /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtbegin.o +LOAD /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o +LOAD ./Core/Src/ADBMS_Abstraction.o +LOAD ./Core/Src/ADBMS_LL_Driver.o +LOAD ./Core/Src/AMS_CAN.o +LOAD ./Core/Src/AMS_HighLevel.o +LOAD ./Core/Src/Testbench.o +LOAD ./Core/Src/main.o +LOAD ./Core/Src/stm32f3xx_hal_msp.o +LOAD ./Core/Src/stm32f3xx_it.o +LOAD ./Core/Src/syscalls.o +LOAD ./Core/Src/sysmem.o +LOAD ./Core/Src/system_stm32f3xx.o +LOAD ./Core/Startup/startup_stm32f302cctx.o +LOAD ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o +LOAD ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o +LOAD ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o +LOAD ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.o +LOAD ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o +LOAD ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o +LOAD ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.o +LOAD ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o +LOAD ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o +LOAD ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o +LOAD ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.o +LOAD ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.o +LOAD ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o +LOAD ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o +LOAD ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o +LOAD ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.o +LOAD ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.o +LOAD ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.o +START GROUP +LOAD /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a +LOAD /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libm.a +END GROUP +START GROUP +LOAD /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/libgcc.a +LOAD /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a +END GROUP +START GROUP +LOAD /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/libgcc.a +LOAD /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a +LOAD /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libnosys.a +END GROUP +START GROUP +LOAD /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/libgcc.a +LOAD /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a +LOAD /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libnosys.a +END GROUP +LOAD /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtend.o +LOAD /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtn.o + 0x000000002000a000 _estack = (ORIGIN (RAM) + LENGTH (RAM)) + 0x0000000000000200 _Min_Heap_Size = 0x200 + 0x0000000000000400 _Min_Stack_Size = 0x400 + +.isr_vector 0x0000000008000000 0x188 + 0x0000000008000000 . = ALIGN (0x4) + *(.isr_vector) + .isr_vector 0x0000000008000000 0x188 ./Core/Startup/startup_stm32f302cctx.o + 0x0000000008000000 g_pfnVectors + 0x0000000008000188 . = ALIGN (0x4) + +.text 0x0000000008000188 0x6358 + 0x0000000008000188 . = ALIGN (0x4) + *(.text) + .text 0x0000000008000188 0x40 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtbegin.o + *(.text*) + .text.initAMS 0x00000000080001c8 0x54 ./Core/Src/ADBMS_Abstraction.o + 0x00000000080001c8 initAMS + .text.amsWakeUp + 0x000000000800021c 0x1c ./Core/Src/ADBMS_Abstraction.o + 0x000000000800021c amsWakeUp + .text.amsCellMeasurement + 0x0000000008000238 0x2e ./Core/Src/ADBMS_Abstraction.o + 0x0000000008000238 amsCellMeasurement + .text.amsAuxMeasurement + 0x0000000008000266 0x12a ./Core/Src/ADBMS_Abstraction.o + 0x0000000008000266 amsAuxMeasurement + .text.amsInternalStatusMeasurement + 0x0000000008000390 0x94 ./Core/Src/ADBMS_Abstraction.o + 0x0000000008000390 amsInternalStatusMeasurement + .text.amsConfigAuxMeasurement + 0x0000000008000424 0x60 ./Core/Src/ADBMS_Abstraction.o + 0x0000000008000424 amsConfigAuxMeasurement + .text.amsConfigBalancing + 0x0000000008000484 0xaa ./Core/Src/ADBMS_Abstraction.o + 0x0000000008000484 amsConfigBalancing + .text.amsStartBalancing + 0x000000000800052e 0x1e ./Core/Src/ADBMS_Abstraction.o + 0x000000000800052e amsStartBalancing + .text.amsStopBalancing + 0x000000000800054c 0x14 ./Core/Src/ADBMS_Abstraction.o + 0x000000000800054c amsStopBalancing + .text.amsConfigUnderVoltage + 0x0000000008000560 0x5a ./Core/Src/ADBMS_Abstraction.o + 0x0000000008000560 amsConfigUnderVoltage + .text.amsCheckUnderOverVoltage + 0x00000000080005ba 0x11c ./Core/Src/ADBMS_Abstraction.o + 0x00000000080005ba amsCheckUnderOverVoltage + .text.amsConfigOverVoltage + 0x00000000080006d6 0x58 ./Core/Src/ADBMS_Abstraction.o + 0x00000000080006d6 amsConfigOverVoltage + .text.amsClearAux + 0x000000000800072e 0x1e ./Core/Src/ADBMS_Abstraction.o + 0x000000000800072e amsClearAux + .text.amsClearWarning + 0x000000000800074c 0x10 ./Core/Src/ADBMS_Abstraction.o + 0x000000000800074c amsClearWarning + .text.amsReadCellVoltages + 0x000000000800075c 0x1ce ./Core/Src/ADBMS_Abstraction.o + 0x000000000800075c amsReadCellVoltages + *fill* 0x000000000800092a 0x2 + .text.adbmsDriverInit + 0x000000000800092c 0x2c ./Core/Src/ADBMS_LL_Driver.o + 0x000000000800092c adbmsDriverInit + .text.calculatePEC + 0x0000000008000958 0x90 ./Core/Src/ADBMS_LL_Driver.o + 0x0000000008000958 calculatePEC + .text.checkPEC + 0x00000000080009e8 0xa0 ./Core/Src/ADBMS_LL_Driver.o + 0x00000000080009e8 checkPEC + .text.updatePEC + 0x0000000008000a88 0x1ea ./Core/Src/ADBMS_LL_Driver.o + 0x0000000008000a88 updatePEC + .text.writeCMD + 0x0000000008000c72 0x112 ./Core/Src/ADBMS_LL_Driver.o + 0x0000000008000c72 writeCMD + .text.readCMD 0x0000000008000d84 0x164 ./Core/Src/ADBMS_LL_Driver.o + 0x0000000008000d84 readCMD + .text.mcuAdbmsCSLow + 0x0000000008000ee8 0x14 ./Core/Src/ADBMS_LL_Driver.o + 0x0000000008000ee8 mcuAdbmsCSLow + .text.mcuAdbmsCSHigh + 0x0000000008000efc 0x14 ./Core/Src/ADBMS_LL_Driver.o + 0x0000000008000efc mcuAdbmsCSHigh + .text.mcuSPITransmit + 0x0000000008000f10 0xa8 ./Core/Src/ADBMS_LL_Driver.o + 0x0000000008000f10 mcuSPITransmit + .text.mcuSPITransmitReceive + 0x0000000008000fb8 0x38 ./Core/Src/ADBMS_LL_Driver.o + 0x0000000008000fb8 mcuSPITransmitReceive + .text.mcuDelay + 0x0000000008000ff0 0x1a ./Core/Src/ADBMS_LL_Driver.o + 0x0000000008000ff0 mcuDelay + *fill* 0x000000000800100a 0x2 + .text.ams_can_init + 0x000000000800100c 0xc8 ./Core/Src/AMS_CAN.o + 0x000000000800100c ams_can_init + .text.HAL_CAN_RxFifo0MsgPendingCallback + 0x00000000080010d4 0x54 ./Core/Src/AMS_CAN.o + 0x00000000080010d4 HAL_CAN_RxFifo0MsgPendingCallback + .text.ams_can_handle_ams_msg + 0x0000000008001128 0x4c ./Core/Src/AMS_CAN.o + 0x0000000008001128 ams_can_handle_ams_msg + .text.ams_can_send_heartbeat + 0x0000000008001174 0xc8 ./Core/Src/AMS_CAN.o + 0x0000000008001174 ams_can_send_heartbeat + .text.ams_can_wait_for_free_mailboxes + 0x000000000800123c 0x42 ./Core/Src/AMS_CAN.o + 0x000000000800123c ams_can_wait_for_free_mailboxes + *fill* 0x000000000800127e 0x2 + .text.AMS_Init + 0x0000000008001280 0x6c ./Core/Src/AMS_HighLevel.o + 0x0000000008001280 AMS_Init + .text.AMS_Loop + 0x00000000080012ec 0xa8 ./Core/Src/AMS_HighLevel.o + 0x00000000080012ec AMS_Loop + .text.AMS_Idle_Loop + 0x0000000008001394 0x74 ./Core/Src/AMS_HighLevel.o + 0x0000000008001394 AMS_Idle_Loop + .text.AMS_Warning_Loop + 0x0000000008001408 0x74 ./Core/Src/AMS_HighLevel.o + 0x0000000008001408 AMS_Warning_Loop + .text.writeWarningLog + 0x000000000800147c 0x18 ./Core/Src/AMS_HighLevel.o + 0x000000000800147c writeWarningLog + .text.writeErrorLog + 0x0000000008001494 0x18 ./Core/Src/AMS_HighLevel.o + 0x0000000008001494 writeErrorLog + .text.integrateCurrent + 0x00000000080014ac 0x74 ./Core/Src/AMS_HighLevel.o + 0x00000000080014ac integrateCurrent + .text.canTestSendTemperatures + 0x0000000008001520 0x178 ./Core/Src/Testbench.o + 0x0000000008001520 canTestSendTemperatures + .text.canTestSendAnswer + 0x0000000008001698 0x54 ./Core/Src/Testbench.o + 0x0000000008001698 canTestSendAnswer + .text.resetData + 0x00000000080016ec 0x2e ./Core/Src/Testbench.o + 0x00000000080016ec resetData + .text.readTemperatures + 0x000000000800171a 0xac ./Core/Src/Testbench.o + 0x000000000800171a readTemperatures + *fill* 0x00000000080017c6 0x2 + .text.testLoop + 0x00000000080017c8 0x150 ./Core/Src/Testbench.o + 0x00000000080017c8 testLoop + .text.main 0x0000000008001918 0xb4 ./Core/Src/main.o + 0x0000000008001918 main + .text.SystemClock_Config + 0x00000000080019cc 0xaa ./Core/Src/main.o + 0x00000000080019cc SystemClock_Config + *fill* 0x0000000008001a76 0x2 + .text.MX_CAN_Init + 0x0000000008001a78 0x6c ./Core/Src/main.o + .text.MX_I2C1_Init + 0x0000000008001ae4 0x80 ./Core/Src/main.o + .text.MX_I2C2_Init + 0x0000000008001b64 0x80 ./Core/Src/main.o + .text.MX_SPI1_Init + 0x0000000008001be4 0x7c ./Core/Src/main.o + .text.MX_GPIO_Init + 0x0000000008001c60 0xc8 ./Core/Src/main.o + .text.sensor_init + 0x0000000008001d28 0x3c ./Core/Src/main.o + 0x0000000008001d28 sensor_init + .text.sensor_read + 0x0000000008001d64 0x60 ./Core/Src/main.o + 0x0000000008001d64 sensor_read + .text.readeeprom + 0x0000000008001dc4 0x38 ./Core/Src/main.o + 0x0000000008001dc4 readeeprom + .text.writeeeprom + 0x0000000008001dfc 0x3c ./Core/Src/main.o + 0x0000000008001dfc writeeeprom + .text.Error_Handler + 0x0000000008001e38 0xa ./Core/Src/main.o + 0x0000000008001e38 Error_Handler + *fill* 0x0000000008001e42 0x2 + .text.HAL_MspInit + 0x0000000008001e44 0x48 ./Core/Src/stm32f3xx_hal_msp.o + 0x0000000008001e44 HAL_MspInit + .text.HAL_CAN_MspInit + 0x0000000008001e8c 0x98 ./Core/Src/stm32f3xx_hal_msp.o + 0x0000000008001e8c HAL_CAN_MspInit + .text.HAL_I2C_MspInit + 0x0000000008001f24 0x128 ./Core/Src/stm32f3xx_hal_msp.o + 0x0000000008001f24 HAL_I2C_MspInit + .text.HAL_SPI_MspInit + 0x000000000800204c 0x84 ./Core/Src/stm32f3xx_hal_msp.o + 0x000000000800204c HAL_SPI_MspInit + .text.NMI_Handler + 0x00000000080020d0 0x6 ./Core/Src/stm32f3xx_it.o + 0x00000000080020d0 NMI_Handler + .text.HardFault_Handler + 0x00000000080020d6 0x6 ./Core/Src/stm32f3xx_it.o + 0x00000000080020d6 HardFault_Handler + .text.MemManage_Handler + 0x00000000080020dc 0x6 ./Core/Src/stm32f3xx_it.o + 0x00000000080020dc MemManage_Handler + .text.BusFault_Handler + 0x00000000080020e2 0x6 ./Core/Src/stm32f3xx_it.o + 0x00000000080020e2 BusFault_Handler + .text.UsageFault_Handler + 0x00000000080020e8 0x6 ./Core/Src/stm32f3xx_it.o + 0x00000000080020e8 UsageFault_Handler + .text.SVC_Handler + 0x00000000080020ee 0xe ./Core/Src/stm32f3xx_it.o + 0x00000000080020ee SVC_Handler + .text.DebugMon_Handler + 0x00000000080020fc 0xe ./Core/Src/stm32f3xx_it.o + 0x00000000080020fc DebugMon_Handler + .text.PendSV_Handler + 0x000000000800210a 0xe ./Core/Src/stm32f3xx_it.o + 0x000000000800210a PendSV_Handler + .text.SysTick_Handler + 0x0000000008002118 0xc ./Core/Src/stm32f3xx_it.o + 0x0000000008002118 SysTick_Handler + .text.USB_LP_CAN_RX0_IRQHandler + 0x0000000008002124 0x14 ./Core/Src/stm32f3xx_it.o + 0x0000000008002124 USB_LP_CAN_RX0_IRQHandler + .text.SystemInit + 0x0000000008002138 0x24 ./Core/Src/system_stm32f3xx.o + 0x0000000008002138 SystemInit + .text.Reset_Handler + 0x000000000800215c 0x50 ./Core/Startup/startup_stm32f302cctx.o + 0x000000000800215c Reset_Handler + .text.Default_Handler + 0x00000000080021ac 0x2 ./Core/Startup/startup_stm32f302cctx.o + 0x00000000080021ac RTC_Alarm_IRQHandler + 0x00000000080021ac TIM1_CC_IRQHandler + 0x00000000080021ac USB_HP_IRQHandler + 0x00000000080021ac PVD_IRQHandler + 0x00000000080021ac TAMP_STAMP_IRQHandler + 0x00000000080021ac EXTI3_IRQHandler + 0x00000000080021ac USB_HP_CAN_TX_IRQHandler + 0x00000000080021ac EXTI0_IRQHandler + 0x00000000080021ac I2C2_EV_IRQHandler + 0x00000000080021ac FPU_IRQHandler + 0x00000000080021ac TIM1_UP_TIM16_IRQHandler + 0x00000000080021ac ADC1_2_IRQHandler + 0x00000000080021ac SPI1_IRQHandler + 0x00000000080021ac CAN_SCE_IRQHandler + 0x00000000080021ac TIM6_DAC_IRQHandler + 0x00000000080021ac DMA2_Channel2_IRQHandler + 0x00000000080021ac DMA1_Channel4_IRQHandler + 0x00000000080021ac USART3_IRQHandler + 0x00000000080021ac DMA1_Channel7_IRQHandler + 0x00000000080021ac UART5_IRQHandler + 0x00000000080021ac TIM4_IRQHandler + 0x00000000080021ac CAN_RX1_IRQHandler + 0x00000000080021ac DMA2_Channel1_IRQHandler + 0x00000000080021ac I2C1_EV_IRQHandler + 0x00000000080021ac DMA1_Channel6_IRQHandler + 0x00000000080021ac UART4_IRQHandler + 0x00000000080021ac DMA2_Channel4_IRQHandler + 0x00000000080021ac TIM3_IRQHandler + 0x00000000080021ac RCC_IRQHandler + 0x00000000080021ac DMA1_Channel1_IRQHandler + 0x00000000080021ac Default_Handler + 0x00000000080021ac USBWakeUp_RMP_IRQHandler + 0x00000000080021ac EXTI15_10_IRQHandler + 0x00000000080021ac EXTI9_5_IRQHandler + 0x00000000080021ac RTC_WKUP_IRQHandler + 0x00000000080021ac SPI2_IRQHandler + 0x00000000080021ac DMA2_Channel5_IRQHandler + 0x00000000080021ac DMA1_Channel5_IRQHandler + 0x00000000080021ac USB_LP_IRQHandler + 0x00000000080021ac EXTI4_IRQHandler + 0x00000000080021ac COMP1_2_IRQHandler + 0x00000000080021ac TIM1_TRG_COM_TIM17_IRQHandler + 0x00000000080021ac DMA1_Channel3_IRQHandler + 0x00000000080021ac WWDG_IRQHandler + 0x00000000080021ac TIM2_IRQHandler + 0x00000000080021ac EXTI1_IRQHandler + 0x00000000080021ac COMP4_6_IRQHandler + 0x00000000080021ac USART2_IRQHandler + 0x00000000080021ac I2C2_ER_IRQHandler + 0x00000000080021ac DMA1_Channel2_IRQHandler + 0x00000000080021ac FLASH_IRQHandler + 0x00000000080021ac USART1_IRQHandler + 0x00000000080021ac SPI3_IRQHandler + 0x00000000080021ac I2C1_ER_IRQHandler + 0x00000000080021ac USBWakeUp_IRQHandler + 0x00000000080021ac DMA2_Channel3_IRQHandler + 0x00000000080021ac EXTI2_TSC_IRQHandler + 0x00000000080021ac TIM1_BRK_TIM15_IRQHandler + *fill* 0x00000000080021ae 0x2 + .text.HAL_Init + 0x00000000080021b0 0x2c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + 0x00000000080021b0 HAL_Init + .text.HAL_InitTick + 0x00000000080021dc 0x60 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + 0x00000000080021dc HAL_InitTick + .text.HAL_IncTick + 0x000000000800223c 0x28 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + 0x000000000800223c HAL_IncTick + .text.HAL_GetTick + 0x0000000008002264 0x18 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + 0x0000000008002264 HAL_GetTick + .text.HAL_Delay + 0x000000000800227c 0x48 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + 0x000000000800227c HAL_Delay + .text.HAL_CAN_Init + 0x00000000080022c4 0x1f6 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + 0x00000000080022c4 HAL_CAN_Init + .text.HAL_CAN_ConfigFilter + 0x00000000080024ba 0x194 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + 0x00000000080024ba HAL_CAN_ConfigFilter + .text.HAL_CAN_Start + 0x000000000800264e 0x88 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + 0x000000000800264e HAL_CAN_Start + .text.HAL_CAN_AddTxMessage + 0x00000000080026d6 0x1b6 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + 0x00000000080026d6 HAL_CAN_AddTxMessage + .text.HAL_CAN_GetTxMailboxesFreeLevel + 0x000000000800288c 0x6a ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + 0x000000000800288c HAL_CAN_GetTxMailboxesFreeLevel + .text.HAL_CAN_GetRxMessage + 0x00000000080028f6 0x224 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + 0x00000000080028f6 HAL_CAN_GetRxMessage + .text.HAL_CAN_ActivateNotification + 0x0000000008002b1a 0x4c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + 0x0000000008002b1a HAL_CAN_ActivateNotification + .text.HAL_CAN_IRQHandler + 0x0000000008002b66 0x36e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + 0x0000000008002b66 HAL_CAN_IRQHandler + .text.HAL_CAN_TxMailbox0CompleteCallback + 0x0000000008002ed4 0x14 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + 0x0000000008002ed4 HAL_CAN_TxMailbox0CompleteCallback + .text.HAL_CAN_TxMailbox1CompleteCallback + 0x0000000008002ee8 0x14 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + 0x0000000008002ee8 HAL_CAN_TxMailbox1CompleteCallback + .text.HAL_CAN_TxMailbox2CompleteCallback + 0x0000000008002efc 0x14 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + 0x0000000008002efc HAL_CAN_TxMailbox2CompleteCallback + .text.HAL_CAN_TxMailbox0AbortCallback + 0x0000000008002f10 0x14 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + 0x0000000008002f10 HAL_CAN_TxMailbox0AbortCallback + .text.HAL_CAN_TxMailbox1AbortCallback + 0x0000000008002f24 0x14 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + 0x0000000008002f24 HAL_CAN_TxMailbox1AbortCallback + .text.HAL_CAN_TxMailbox2AbortCallback + 0x0000000008002f38 0x14 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + 0x0000000008002f38 HAL_CAN_TxMailbox2AbortCallback + .text.HAL_CAN_RxFifo0FullCallback + 0x0000000008002f4c 0x14 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + 0x0000000008002f4c HAL_CAN_RxFifo0FullCallback + .text.HAL_CAN_RxFifo1MsgPendingCallback + 0x0000000008002f60 0x14 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + 0x0000000008002f60 HAL_CAN_RxFifo1MsgPendingCallback + .text.HAL_CAN_RxFifo1FullCallback + 0x0000000008002f74 0x14 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + 0x0000000008002f74 HAL_CAN_RxFifo1FullCallback + .text.HAL_CAN_SleepCallback + 0x0000000008002f88 0x14 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + 0x0000000008002f88 HAL_CAN_SleepCallback + .text.HAL_CAN_WakeUpFromRxMsgCallback + 0x0000000008002f9c 0x14 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + 0x0000000008002f9c HAL_CAN_WakeUpFromRxMsgCallback + .text.HAL_CAN_ErrorCallback + 0x0000000008002fb0 0x14 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + 0x0000000008002fb0 HAL_CAN_ErrorCallback + .text.__NVIC_SetPriorityGrouping + 0x0000000008002fc4 0x48 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .text.__NVIC_GetPriorityGrouping + 0x000000000800300c 0x1c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .text.__NVIC_EnableIRQ + 0x0000000008003028 0x3c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .text.__NVIC_SetPriority + 0x0000000008003064 0x54 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .text.NVIC_EncodePriority + 0x00000000080030b8 0x66 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + *fill* 0x000000000800311e 0x2 + .text.SysTick_Config + 0x0000000008003120 0x44 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .text.HAL_NVIC_SetPriorityGrouping + 0x0000000008003164 0x16 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + 0x0000000008003164 HAL_NVIC_SetPriorityGrouping + .text.HAL_NVIC_SetPriority + 0x000000000800317a 0x38 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + 0x000000000800317a HAL_NVIC_SetPriority + .text.HAL_NVIC_EnableIRQ + 0x00000000080031b2 0x1c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + 0x00000000080031b2 HAL_NVIC_EnableIRQ + .text.HAL_SYSTICK_Config + 0x00000000080031ce 0x18 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + 0x00000000080031ce HAL_SYSTICK_Config + *fill* 0x00000000080031e6 0x2 + .text.HAL_GPIO_Init + 0x00000000080031e8 0x2f4 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + 0x00000000080031e8 HAL_GPIO_Init + .text.HAL_GPIO_WritePin + 0x00000000080034dc 0x30 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + 0x00000000080034dc HAL_GPIO_WritePin + .text.HAL_I2C_Init + 0x000000000800350c 0x11e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + 0x000000000800350c HAL_I2C_Init + *fill* 0x000000000800362a 0x2 + .text.HAL_I2C_Master_Transmit + 0x000000000800362c 0x1e8 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + 0x000000000800362c HAL_I2C_Master_Transmit + .text.HAL_I2C_Master_Receive + 0x0000000008003814 0x1ec ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + 0x0000000008003814 HAL_I2C_Master_Receive + .text.HAL_I2C_Mem_Write + 0x0000000008003a00 0x228 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + 0x0000000008003a00 HAL_I2C_Mem_Write + .text.HAL_I2C_Mem_Read + 0x0000000008003c28 0x234 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + 0x0000000008003c28 HAL_I2C_Mem_Read + .text.I2C_RequestMemoryWrite + 0x0000000008003e5c 0xa8 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.I2C_RequestMemoryRead + 0x0000000008003f04 0xa8 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.I2C_Flush_TXDR + 0x0000000008003fac 0x48 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.I2C_WaitOnFlagUntilTimeout + 0x0000000008003ff4 0x80 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.I2C_WaitOnTXISFlagUntilTimeout + 0x0000000008004074 0x80 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.I2C_WaitOnSTOPFlagUntilTimeout + 0x00000000080040f4 0x78 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.I2C_WaitOnRXNEFlagUntilTimeout + 0x000000000800416c 0xd8 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.I2C_IsAcknowledgeFailed + 0x0000000008004244 0xec ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.I2C_TransferConfig + 0x0000000008004330 0x5c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .text.HAL_I2CEx_ConfigAnalogFilter + 0x000000000800438c 0x96 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + 0x000000000800438c HAL_I2CEx_ConfigAnalogFilter + .text.HAL_I2CEx_ConfigDigitalFilter + 0x0000000008004422 0x98 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + 0x0000000008004422 HAL_I2CEx_ConfigDigitalFilter + *fill* 0x00000000080044ba 0x2 + .text.HAL_RCC_OscConfig + 0x00000000080044bc 0x107c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + 0x00000000080044bc HAL_RCC_OscConfig + .text.HAL_RCC_ClockConfig + 0x0000000008005538 0x2f8 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + 0x0000000008005538 HAL_RCC_ClockConfig + .text.HAL_RCC_GetSysClockFreq + 0x0000000008005830 0xd8 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + 0x0000000008005830 HAL_RCC_GetSysClockFreq + .text.HAL_RCCEx_PeriphCLKConfig + 0x0000000008005908 0x324 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + 0x0000000008005908 HAL_RCCEx_PeriphCLKConfig + .text.HAL_SPI_Init + 0x0000000008005c2c 0x156 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + 0x0000000008005c2c HAL_SPI_Init + .text.HAL_SPI_TransmitReceive + 0x0000000008005d82 0x426 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + 0x0000000008005d82 HAL_SPI_TransmitReceive + .text.SPI_WaitFlagStateUntilTimeout + 0x00000000080061a8 0x110 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.SPI_WaitFifoStateUntilTimeout + 0x00000000080062b8 0x12c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.SPI_EndRxTxTransaction + 0x00000000080063e4 0x8c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .text.__libc_init_array + 0x0000000008006470 0x48 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(lib_a-init.o) + 0x0000000008006470 __libc_init_array + .text.memset 0x00000000080064b8 0x10 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(lib_a-memset.o) + 0x00000000080064b8 memset + *(.glue_7) + .glue_7 0x00000000080064c8 0x0 linker stubs + *(.glue_7t) + .glue_7t 0x00000000080064c8 0x0 linker stubs + *(.eh_frame) + .eh_frame 0x00000000080064c8 0x0 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtbegin.o + *(.init) + .init 0x00000000080064c8 0x4 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crti.o + 0x00000000080064c8 _init + .init 0x00000000080064cc 0x8 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtn.o + *(.fini) + .fini 0x00000000080064d4 0x4 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crti.o + 0x00000000080064d4 _fini + .fini 0x00000000080064d8 0x8 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtn.o + 0x00000000080064e0 . = ALIGN (0x4) + 0x00000000080064e0 _etext = . + +.vfp11_veneer 0x00000000080064e0 0x0 + .vfp11_veneer 0x00000000080064e0 0x0 linker stubs + +.v4_bx 0x00000000080064e0 0x0 + .v4_bx 0x00000000080064e0 0x0 linker stubs + +.iplt 0x00000000080064e0 0x0 + .iplt 0x00000000080064e0 0x0 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtbegin.o + +.rodata 0x00000000080064e0 0x30 + 0x00000000080064e0 . = ALIGN (0x4) + *(.rodata) + *(.rodata*) + .rodata.AHBPrescTable + 0x00000000080064e0 0x10 ./Core/Src/system_stm32f3xx.o + 0x00000000080064e0 AHBPrescTable + .rodata.aPLLMULFactorTable + 0x00000000080064f0 0x10 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + 0x00000000080064f0 aPLLMULFactorTable + .rodata.aPredivFactorTable + 0x0000000008006500 0x10 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + 0x0000000008006500 aPredivFactorTable + 0x0000000008006510 . = ALIGN (0x4) + +.rel.dyn 0x0000000008006510 0x0 + .rel.iplt 0x0000000008006510 0x0 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtbegin.o + +.ARM.extab 0x0000000008006510 0x0 + 0x0000000008006510 . = ALIGN (0x4) + *(.ARM.extab* .gnu.linkonce.armextab.*) + 0x0000000008006510 . = ALIGN (0x4) + +.ARM 0x0000000008006510 0x0 + 0x0000000008006510 . = ALIGN (0x4) + 0x0000000008006510 __exidx_start = . + *(.ARM.exidx*) + 0x0000000008006510 __exidx_end = . + 0x0000000008006510 . = ALIGN (0x4) + +.preinit_array 0x0000000008006510 0x0 + 0x0000000008006510 . = ALIGN (0x4) + 0x0000000008006510 PROVIDE (__preinit_array_start = .) + *(.preinit_array*) + 0x0000000008006510 PROVIDE (__preinit_array_end = .) + 0x0000000008006510 . = ALIGN (0x4) + +.init_array 0x0000000008006510 0x4 + 0x0000000008006510 . = ALIGN (0x4) + 0x0000000008006510 PROVIDE (__init_array_start = .) + *(SORT_BY_NAME(.init_array.*)) + *(.init_array*) + .init_array 0x0000000008006510 0x4 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtbegin.o + 0x0000000008006514 PROVIDE (__init_array_end = .) + 0x0000000008006514 . = ALIGN (0x4) + +.fini_array 0x0000000008006514 0x4 + 0x0000000008006514 . = ALIGN (0x4) + [!provide] PROVIDE (__fini_array_start = .) + *(SORT_BY_NAME(.fini_array.*)) + *(.fini_array*) + .fini_array 0x0000000008006514 0x4 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtbegin.o + [!provide] PROVIDE (__fini_array_end = .) + 0x0000000008006518 . = ALIGN (0x4) + 0x0000000008006518 _sidata = LOADADDR (.data) + +.data 0x0000000020000000 0x14 load address 0x0000000008006518 + 0x0000000020000000 . = ALIGN (0x4) + 0x0000000020000000 _sdata = . + *(.data) + *(.data*) + .data.numberofCells + 0x0000000020000000 0x1 ./Core/Src/AMS_HighLevel.o + 0x0000000020000000 numberofCells + *fill* 0x0000000020000001 0x3 + .data.channelstobalance.0 + 0x0000000020000004 0x4 ./Core/Src/AMS_HighLevel.o + .data.SystemCoreClock + 0x0000000020000008 0x4 ./Core/Src/system_stm32f3xx.o + 0x0000000020000008 SystemCoreClock + .data.uwTickPrio + 0x000000002000000c 0x4 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + 0x000000002000000c uwTickPrio + .data.uwTickFreq + 0x0000000020000010 0x1 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + 0x0000000020000010 uwTickFreq + *(.RamFunc) + *(.RamFunc*) + 0x0000000020000014 . = ALIGN (0x4) + *fill* 0x0000000020000011 0x3 + 0x0000000020000014 _edata = . + +.igot.plt 0x0000000020000014 0x0 load address 0x000000000800652c + .igot.plt 0x0000000020000014 0x0 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtbegin.o + 0x0000000020000014 . = ALIGN (0x4) + +.bss 0x0000000020000018 0x258 load address 0x000000000800652c + 0x0000000020000018 _sbss = . + 0x0000000020000018 __bss_start__ = _sbss + *(.bss) + .bss 0x0000000020000018 0x1c /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtbegin.o + *(.bss*) + .bss.numberofcells + 0x0000000020000034 0x1 ./Core/Src/ADBMS_Abstraction.o + 0x0000000020000034 numberofcells + .bss.numberofauxchannels + 0x0000000020000035 0x1 ./Core/Src/ADBMS_Abstraction.o + 0x0000000020000035 numberofauxchannels + *fill* 0x0000000020000036 0x2 + .bss.adbmsspi 0x0000000020000038 0x4 ./Core/Src/ADBMS_LL_Driver.o + 0x0000000020000038 adbmsspi + .bss.err_cnt.0 + 0x000000002000003c 0x4 ./Core/Src/ADBMS_LL_Driver.o + .bss.PENDING_MESSAGE_HANDLE + 0x0000000020000040 0x4 ./Core/Src/AMS_CAN.o + 0x0000000020000040 PENDING_MESSAGE_HANDLE + .bss.canTestData + 0x0000000020000044 0x8 ./Core/Src/AMS_CAN.o + 0x0000000020000044 canTestData + .bss.ams_can_handle + 0x000000002000004c 0x4 ./Core/Src/AMS_CAN.o + 0x000000002000004c ams_can_handle + .bss.cb_triggered + 0x0000000020000050 0x4 ./Core/Src/AMS_CAN.o + .bss.header.3 0x0000000020000054 0x1c ./Core/Src/AMS_CAN.o + .bss.data.2 0x0000000020000070 0x8 ./Core/Src/AMS_CAN.o + .bss.header.1 0x0000000020000078 0x18 ./Core/Src/AMS_CAN.o + .bss.data.0 0x0000000020000090 0x8 ./Core/Src/AMS_CAN.o + .bss.module 0x0000000020000098 0x60 ./Core/Src/AMS_HighLevel.o + 0x0000000020000098 module + .bss.currentintegrator + 0x00000000200000f8 0x8 ./Core/Src/AMS_HighLevel.o + 0x00000000200000f8 currentintegrator + .bss.lastticks + 0x0000000020000100 0x4 ./Core/Src/AMS_HighLevel.o + 0x0000000020000100 lastticks + .bss.currenttick + 0x0000000020000104 0x4 ./Core/Src/AMS_HighLevel.o + 0x0000000020000104 currenttick + .bss.eepromconfigured + 0x0000000020000108 0x1 ./Core/Src/AMS_HighLevel.o + 0x0000000020000108 eepromconfigured + *fill* 0x0000000020000109 0x1 + .bss.amsuv 0x000000002000010a 0x2 ./Core/Src/AMS_HighLevel.o + 0x000000002000010a amsuv + .bss.amsov 0x000000002000010c 0x2 ./Core/Src/AMS_HighLevel.o + 0x000000002000010c amsov + .bss.amserrorcode + 0x000000002000010e 0x1 ./Core/Src/AMS_HighLevel.o + 0x000000002000010e amserrorcode + .bss.numberofAux + 0x000000002000010f 0x1 ./Core/Src/AMS_HighLevel.o + 0x000000002000010f numberofAux + .bss.currentAMSState + 0x0000000020000110 0x1 ./Core/Src/AMS_HighLevel.o + 0x0000000020000110 currentAMSState + .bss.lastAMSState + 0x0000000020000111 0x1 ./Core/Src/AMS_HighLevel.o + 0x0000000020000111 lastAMSState + *fill* 0x0000000020000112 0x2 + .bss.header.1 0x0000000020000114 0x18 ./Core/Src/Testbench.o + .bss.header.0 0x000000002000012c 0x18 ./Core/Src/Testbench.o + .bss.hcan 0x0000000020000144 0x28 ./Core/Src/main.o + 0x0000000020000144 hcan + .bss.hi2c1 0x000000002000016c 0x4c ./Core/Src/main.o + 0x000000002000016c hi2c1 + .bss.hi2c2 0x00000000200001b8 0x4c ./Core/Src/main.o + 0x00000000200001b8 hi2c2 + .bss.hspi1 0x0000000020000204 0x64 ./Core/Src/main.o + 0x0000000020000204 hspi1 + .bss.last_error + 0x0000000020000268 0x4 ./Core/Src/main.o + .bss.uwTick 0x000000002000026c 0x4 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + 0x000000002000026c uwTick + *(COMMON) + 0x0000000020000270 . = ALIGN (0x4) + 0x0000000020000270 _ebss = . + 0x0000000020000270 __bss_end__ = _ebss + +._user_heap_stack + 0x0000000020000270 0x600 load address 0x000000000800652c + 0x0000000020000270 . = ALIGN (0x8) + [!provide] PROVIDE (end = .) + 0x0000000020000270 PROVIDE (_end = .) + 0x0000000020000470 . = (. + _Min_Heap_Size) + *fill* 0x0000000020000270 0x200 + 0x0000000020000870 . = (. + _Min_Stack_Size) + *fill* 0x0000000020000470 0x400 + 0x0000000020000870 . = ALIGN (0x8) + +/DISCARD/ + libc.a(*) + libm.a(*) + libgcc.a(*) + +.ARM.attributes + 0x0000000000000000 0x30 + *(.ARM.attributes) + .ARM.attributes + 0x0000000000000000 0x1e /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crti.o + .ARM.attributes + 0x000000000000001e 0x34 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtbegin.o + .ARM.attributes + 0x0000000000000052 0x34 ./Core/Src/ADBMS_Abstraction.o + .ARM.attributes + 0x0000000000000086 0x34 ./Core/Src/ADBMS_LL_Driver.o + .ARM.attributes + 0x00000000000000ba 0x34 ./Core/Src/AMS_CAN.o + .ARM.attributes + 0x00000000000000ee 0x34 ./Core/Src/AMS_HighLevel.o + .ARM.attributes + 0x0000000000000122 0x34 ./Core/Src/Testbench.o + .ARM.attributes + 0x0000000000000156 0x34 ./Core/Src/main.o + .ARM.attributes + 0x000000000000018a 0x34 ./Core/Src/stm32f3xx_hal_msp.o + .ARM.attributes + 0x00000000000001be 0x34 ./Core/Src/stm32f3xx_it.o + .ARM.attributes + 0x00000000000001f2 0x34 ./Core/Src/system_stm32f3xx.o + .ARM.attributes + 0x0000000000000226 0x21 ./Core/Startup/startup_stm32f302cctx.o + .ARM.attributes + 0x0000000000000247 0x34 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .ARM.attributes + 0x000000000000027b 0x34 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .ARM.attributes + 0x00000000000002af 0x34 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .ARM.attributes + 0x00000000000002e3 0x34 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .ARM.attributes + 0x0000000000000317 0x34 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .ARM.attributes + 0x000000000000034b 0x34 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .ARM.attributes + 0x000000000000037f 0x34 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .ARM.attributes + 0x00000000000003b3 0x34 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .ARM.attributes + 0x00000000000003e7 0x34 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .ARM.attributes + 0x000000000000041b 0x34 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(lib_a-init.o) + .ARM.attributes + 0x000000000000044f 0x34 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(lib_a-memset.o) + .ARM.attributes + 0x0000000000000483 0x1e /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/crtn.o +OUTPUT(BMS_Software.elf elf32-littlearm) +LOAD linker stubs +LOAD /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc.a +LOAD /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libm.a +LOAD /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+fp/hard/libgcc.a + +.debug_info 0x0000000000000000 0xf54c + .debug_info 0x0000000000000000 0xcee ./Core/Src/ADBMS_Abstraction.o + .debug_info 0x0000000000000cee 0xc8d ./Core/Src/ADBMS_LL_Driver.o + .debug_info 0x000000000000197b 0xa39 ./Core/Src/AMS_CAN.o + .debug_info 0x00000000000023b4 0xc1a ./Core/Src/AMS_HighLevel.o + .debug_info 0x0000000000002fce 0xa96 ./Core/Src/Testbench.o + .debug_info 0x0000000000003a64 0x1635 ./Core/Src/main.o + .debug_info 0x0000000000005099 0x12f6 ./Core/Src/stm32f3xx_hal_msp.o + .debug_info 0x000000000000638f 0x549 ./Core/Src/stm32f3xx_it.o + .debug_info 0x00000000000068d8 0x416 ./Core/Src/system_stm32f3xx.o + .debug_info 0x0000000000006cee 0x22 ./Core/Startup/startup_stm32f302cctx.o + .debug_info 0x0000000000006d10 0x7d7 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_info 0x00000000000074e7 0xfbb ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_info 0x00000000000084a2 0xd55 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_info 0x00000000000091f7 0x68a ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_info 0x0000000000009881 0x214e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_info 0x000000000000b9cf 0x891 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_info 0x000000000000c260 0x1586 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_info 0x000000000000d7e6 0x5da ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_info 0x000000000000ddc0 0x178c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + +.debug_abbrev 0x0000000000000000 0x2965 + .debug_abbrev 0x0000000000000000 0x2db ./Core/Src/ADBMS_Abstraction.o + .debug_abbrev 0x00000000000002db 0x259 ./Core/Src/ADBMS_LL_Driver.o + .debug_abbrev 0x0000000000000534 0x259 ./Core/Src/AMS_CAN.o + .debug_abbrev 0x000000000000078d 0x2b8 ./Core/Src/AMS_HighLevel.o + .debug_abbrev 0x0000000000000a45 0x268 ./Core/Src/Testbench.o + .debug_abbrev 0x0000000000000cad 0x370 ./Core/Src/main.o + .debug_abbrev 0x000000000000101d 0x228 ./Core/Src/stm32f3xx_hal_msp.o + .debug_abbrev 0x0000000000001245 0x183 ./Core/Src/stm32f3xx_it.o + .debug_abbrev 0x00000000000013c8 0x116 ./Core/Src/system_stm32f3xx.o + .debug_abbrev 0x00000000000014de 0x12 ./Core/Startup/startup_stm32f302cctx.o + .debug_abbrev 0x00000000000014f0 0x20e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_abbrev 0x00000000000016fe 0x21d ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_abbrev 0x000000000000191b 0x316 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_abbrev 0x0000000000001c31 0x1bb ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_abbrev 0x0000000000001dec 0x243 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_abbrev 0x000000000000202f 0x1b0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_abbrev 0x00000000000021df 0x30c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_abbrev 0x00000000000024eb 0x226 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_abbrev 0x0000000000002711 0x254 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + +.debug_aranges 0x0000000000000000 0xcc8 + .debug_aranges + 0x0000000000000000 0xe8 ./Core/Src/ADBMS_Abstraction.o + .debug_aranges + 0x00000000000000e8 0x78 ./Core/Src/ADBMS_LL_Driver.o + .debug_aranges + 0x0000000000000160 0x40 ./Core/Src/AMS_CAN.o + .debug_aranges + 0x00000000000001a0 0x70 ./Core/Src/AMS_HighLevel.o + .debug_aranges + 0x0000000000000210 0x40 ./Core/Src/Testbench.o + .debug_aranges + 0x0000000000000250 0x78 ./Core/Src/main.o + .debug_aranges + 0x00000000000002c8 0x50 ./Core/Src/stm32f3xx_hal_msp.o + .debug_aranges + 0x0000000000000318 0x68 ./Core/Src/stm32f3xx_it.o + .debug_aranges + 0x0000000000000380 0x28 ./Core/Src/system_stm32f3xx.o + .debug_aranges + 0x00000000000003a8 0x28 ./Core/Startup/startup_stm32f302cctx.o + .debug_aranges + 0x00000000000003d0 0xe0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_aranges + 0x00000000000004b0 0x138 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_aranges + 0x00000000000005e8 0x118 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_aranges + 0x0000000000000700 0x58 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_aranges + 0x0000000000000758 0x290 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_aranges + 0x00000000000009e8 0x48 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_aranges + 0x0000000000000a30 0x88 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_aranges + 0x0000000000000ab8 0x38 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_aranges + 0x0000000000000af0 0x1d8 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + +.debug_ranges 0x0000000000000000 0xbf0 + .debug_ranges 0x0000000000000000 0xd8 ./Core/Src/ADBMS_Abstraction.o + .debug_ranges 0x00000000000000d8 0x80 ./Core/Src/ADBMS_LL_Driver.o + .debug_ranges 0x0000000000000158 0x30 ./Core/Src/AMS_CAN.o + .debug_ranges 0x0000000000000188 0x98 ./Core/Src/AMS_HighLevel.o + .debug_ranges 0x0000000000000220 0x30 ./Core/Src/Testbench.o + .debug_ranges 0x0000000000000250 0x68 ./Core/Src/main.o + .debug_ranges 0x00000000000002b8 0x40 ./Core/Src/stm32f3xx_hal_msp.o + .debug_ranges 0x00000000000002f8 0x58 ./Core/Src/stm32f3xx_it.o + .debug_ranges 0x0000000000000350 0x18 ./Core/Src/system_stm32f3xx.o + .debug_ranges 0x0000000000000368 0x20 ./Core/Startup/startup_stm32f302cctx.o + .debug_ranges 0x0000000000000388 0xd0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_ranges 0x0000000000000458 0x128 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_ranges 0x0000000000000580 0x108 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_ranges 0x0000000000000688 0x48 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_ranges 0x00000000000006d0 0x280 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_ranges 0x0000000000000950 0x38 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_ranges 0x0000000000000988 0x78 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_ranges 0x0000000000000a00 0x28 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_ranges 0x0000000000000a28 0x1c8 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + +.debug_macro 0x0000000000000000 0x1c25c + .debug_macro 0x0000000000000000 0x1fe ./Core/Src/ADBMS_Abstraction.o + .debug_macro 0x00000000000001fe 0xa78 ./Core/Src/ADBMS_Abstraction.o + .debug_macro 0x0000000000000c76 0x10 ./Core/Src/ADBMS_Abstraction.o + .debug_macro 0x0000000000000c86 0x157 ./Core/Src/ADBMS_Abstraction.o + .debug_macro 0x0000000000000ddd 0x2e ./Core/Src/ADBMS_Abstraction.o + .debug_macro 0x0000000000000e0b 0x28 ./Core/Src/ADBMS_Abstraction.o + .debug_macro 0x0000000000000e33 0x22 ./Core/Src/ADBMS_Abstraction.o + .debug_macro 0x0000000000000e55 0x8e ./Core/Src/ADBMS_Abstraction.o + .debug_macro 0x0000000000000ee3 0x51 ./Core/Src/ADBMS_Abstraction.o + .debug_macro 0x0000000000000f34 0x103 ./Core/Src/ADBMS_Abstraction.o + .debug_macro 0x0000000000001037 0x6a ./Core/Src/ADBMS_Abstraction.o + .debug_macro 0x00000000000010a1 0x1df ./Core/Src/ADBMS_Abstraction.o + .debug_macro 0x0000000000001280 0x1c ./Core/Src/ADBMS_Abstraction.o + .debug_macro 0x000000000000129c 0x22 ./Core/Src/ADBMS_Abstraction.o + .debug_macro 0x00000000000012be 0xd9 ./Core/Src/ADBMS_Abstraction.o + .debug_macro 0x0000000000001397 0x102d ./Core/Src/ADBMS_Abstraction.o + .debug_macro 0x00000000000023c4 0x11f ./Core/Src/ADBMS_Abstraction.o + .debug_macro 0x00000000000024e3 0x11851 ./Core/Src/ADBMS_Abstraction.o + .debug_macro 0x0000000000013d34 0x6d ./Core/Src/ADBMS_Abstraction.o + .debug_macro 0x0000000000013da1 0x3540 ./Core/Src/ADBMS_Abstraction.o + .debug_macro 0x00000000000172e1 0x174 ./Core/Src/ADBMS_Abstraction.o + .debug_macro 0x0000000000017455 0x55 ./Core/Src/ADBMS_Abstraction.o + .debug_macro 0x00000000000174aa 0x962 ./Core/Src/ADBMS_Abstraction.o + .debug_macro 0x0000000000017e0c 0x4df ./Core/Src/ADBMS_Abstraction.o + .debug_macro 0x00000000000182eb 0x1b6 ./Core/Src/ADBMS_Abstraction.o + .debug_macro 0x00000000000184a1 0x174 ./Core/Src/ADBMS_Abstraction.o + .debug_macro 0x0000000000018615 0x1dc ./Core/Src/ADBMS_Abstraction.o + .debug_macro 0x00000000000187f1 0x1bc ./Core/Src/ADBMS_Abstraction.o + .debug_macro 0x00000000000189ad 0x30 ./Core/Src/ADBMS_Abstraction.o + .debug_macro 0x00000000000189dd 0x3c ./Core/Src/ADBMS_Abstraction.o + .debug_macro 0x0000000000018a19 0x236 ./Core/Src/ADBMS_Abstraction.o + .debug_macro 0x0000000000018c4f 0x408 ./Core/Src/ADBMS_Abstraction.o + .debug_macro 0x0000000000019057 0xc5 ./Core/Src/ADBMS_Abstraction.o + .debug_macro 0x000000000001911c 0x21d ./Core/Src/ADBMS_Abstraction.o + .debug_macro 0x0000000000019339 0x22c ./Core/Src/ADBMS_Abstraction.o + .debug_macro 0x0000000000019565 0x5b ./Core/Src/ADBMS_Abstraction.o + .debug_macro 0x00000000000195c0 0xa5 ./Core/Src/ADBMS_Abstraction.o + .debug_macro 0x0000000000019665 0x81 ./Core/Src/ADBMS_Abstraction.o + .debug_macro 0x00000000000196e6 0xd3 ./Core/Src/ADBMS_Abstraction.o + .debug_macro 0x00000000000197b9 0x2fe ./Core/Src/ADBMS_Abstraction.o + .debug_macro 0x0000000000019ab7 0x213 ./Core/Src/ADBMS_Abstraction.o + .debug_macro 0x0000000000019cca 0x58 ./Core/Src/ADBMS_Abstraction.o + .debug_macro 0x0000000000019d22 0x2d1 ./Core/Src/ADBMS_Abstraction.o + .debug_macro 0x0000000000019ff3 0x22 ./Core/Src/ADBMS_Abstraction.o + .debug_macro 0x000000000001a015 0x1f2 ./Core/Src/ADBMS_LL_Driver.o + .debug_macro 0x000000000001a207 0x22c ./Core/Src/AMS_CAN.o + .debug_macro 0x000000000001a433 0x2e ./Core/Src/AMS_CAN.o + .debug_macro 0x000000000001a461 0x10 ./Core/Src/AMS_CAN.o + .debug_macro 0x000000000001a471 0x208 ./Core/Src/AMS_HighLevel.o + .debug_macro 0x000000000001a679 0x235 ./Core/Src/Testbench.o + .debug_macro 0x000000000001a8ae 0x22 ./Core/Src/Testbench.o + .debug_macro 0x000000000001a8d0 0x34 ./Core/Src/Testbench.o + .debug_macro 0x000000000001a904 0x23c ./Core/Src/main.o + .debug_macro 0x000000000001ab40 0x28 ./Core/Src/main.o + .debug_macro 0x000000000001ab68 0x1dd ./Core/Src/stm32f3xx_hal_msp.o + .debug_macro 0x000000000001ad45 0x1e7 ./Core/Src/stm32f3xx_it.o + .debug_macro 0x000000000001af2c 0x1ce ./Core/Src/system_stm32f3xx.o + .debug_macro 0x000000000001b0fa 0x1f2 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_macro 0x000000000001b2ec 0x1d6 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_macro 0x000000000001b4c2 0x1ce ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_macro 0x000000000001b690 0x1d5 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_macro 0x000000000001b865 0x293 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_macro 0x000000000001baf8 0x1ce ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_macro 0x000000000001bcc6 0x1f2 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_macro 0x000000000001beb8 0x1ce ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_macro 0x000000000001c086 0x1d6 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + +.debug_line 0x0000000000000000 0xfeb9 + .debug_line 0x0000000000000000 0xdcd ./Core/Src/ADBMS_Abstraction.o + .debug_line 0x0000000000000dcd 0xa02 ./Core/Src/ADBMS_LL_Driver.o + .debug_line 0x00000000000017cf 0x89d ./Core/Src/AMS_CAN.o + .debug_line 0x000000000000206c 0x9ac ./Core/Src/AMS_HighLevel.o + .debug_line 0x0000000000002a18 0x949 ./Core/Src/Testbench.o + .debug_line 0x0000000000003361 0x9cb ./Core/Src/main.o + .debug_line 0x0000000000003d2c 0x7d5 ./Core/Src/stm32f3xx_hal_msp.o + .debug_line 0x0000000000004501 0x781 ./Core/Src/stm32f3xx_it.o + .debug_line 0x0000000000004c82 0x71d ./Core/Src/system_stm32f3xx.o + .debug_line 0x000000000000539f 0x88 ./Core/Startup/startup_stm32f302cctx.o + .debug_line 0x0000000000005427 0x952 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_line 0x0000000000005d79 0x10f1 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_line 0x0000000000006e6a 0xc17 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_line 0x0000000000007a81 0xab3 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_line 0x0000000000008534 0x3261 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_line 0x000000000000b795 0x8c4 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_line 0x000000000000c059 0x1330 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_line 0x000000000000d389 0xc21 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_line 0x000000000000dfaa 0x1f0f ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + +.debug_str 0x0000000000000000 0xa2242 + .debug_str 0x0000000000000000 0x9e7a5 ./Core/Src/ADBMS_Abstraction.o + 0x9eeab (size before relaxing) + .debug_str 0x000000000009e7a5 0x22b ./Core/Src/ADBMS_LL_Driver.o + 0x9e683 (size before relaxing) + .debug_str 0x000000000009e9d0 0x5d9 ./Core/Src/AMS_CAN.o + 0x9eeb6 (size before relaxing) + .debug_str 0x000000000009efa9 0x2bd ./Core/Src/AMS_HighLevel.o + 0x9efd0 (size before relaxing) + .debug_str 0x000000000009f266 0x117 ./Core/Src/Testbench.o + 0x9ee04 (size before relaxing) + .debug_str 0x000000000009f37d 0x672 ./Core/Src/main.o + 0x9f73f (size before relaxing) + .debug_str 0x000000000009f9ef 0x3ef ./Core/Src/stm32f3xx_hal_msp.o + 0x9ee9c (size before relaxing) + .debug_str 0x000000000009fdde 0xdc ./Core/Src/stm32f3xx_it.o + 0x9e36f (size before relaxing) + .debug_str 0x000000000009feba 0xdf ./Core/Src/system_stm32f3xx.o + 0x9dfd1 (size before relaxing) + .debug_str 0x000000000009ff99 0x36 ./Core/Startup/startup_stm32f302cctx.o + 0xa4 (size before relaxing) + .debug_str 0x000000000009ffcf 0x381 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + 0x9e7a8 (size before relaxing) + .debug_str 0x00000000000a0350 0x39a ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + 0x9e758 (size before relaxing) + .debug_str 0x00000000000a06ea 0x321 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + 0x9e7fa (size before relaxing) + .debug_str 0x00000000000a0a0b 0x130 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + 0x9e147 (size before relaxing) + .debug_str 0x00000000000a0b3b 0xd9b ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + 0x9f23a (size before relaxing) + .debug_str 0x00000000000a18d6 0xb8 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + 0x9e4e5 (size before relaxing) + .debug_str 0x00000000000a198e 0x2b8 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + 0x9e471 (size before relaxing) + .debug_str 0x00000000000a1c46 0xbe ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + 0x9e20e (size before relaxing) + .debug_str 0x00000000000a1d04 0x53e ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + 0x9e8f7 (size before relaxing) + +.comment 0x0000000000000000 0x50 + .comment 0x0000000000000000 0x50 ./Core/Src/ADBMS_Abstraction.o + 0x51 (size before relaxing) + .comment 0x0000000000000050 0x51 ./Core/Src/ADBMS_LL_Driver.o + .comment 0x0000000000000050 0x51 ./Core/Src/AMS_CAN.o + .comment 0x0000000000000050 0x51 ./Core/Src/AMS_HighLevel.o + .comment 0x0000000000000050 0x51 ./Core/Src/Testbench.o + .comment 0x0000000000000050 0x51 ./Core/Src/main.o + .comment 0x0000000000000050 0x51 ./Core/Src/stm32f3xx_hal_msp.o + .comment 0x0000000000000050 0x51 ./Core/Src/stm32f3xx_it.o + .comment 0x0000000000000050 0x51 ./Core/Src/system_stm32f3xx.o + .comment 0x0000000000000050 0x51 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .comment 0x0000000000000050 0x51 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .comment 0x0000000000000050 0x51 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .comment 0x0000000000000050 0x51 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .comment 0x0000000000000050 0x51 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .comment 0x0000000000000050 0x51 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .comment 0x0000000000000050 0x51 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .comment 0x0000000000000050 0x51 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .comment 0x0000000000000050 0x51 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + +.debug_frame 0x0000000000000000 0x33cc + .debug_frame 0x0000000000000000 0x3ac ./Core/Src/ADBMS_Abstraction.o + .debug_frame 0x00000000000003ac 0x1dc ./Core/Src/ADBMS_LL_Driver.o + .debug_frame 0x0000000000000588 0xc8 ./Core/Src/AMS_CAN.o + .debug_frame 0x0000000000000650 0x180 ./Core/Src/AMS_HighLevel.o + .debug_frame 0x00000000000007d0 0xd0 ./Core/Src/Testbench.o + .debug_frame 0x00000000000008a0 0x190 ./Core/Src/main.o + .debug_frame 0x0000000000000a30 0x110 ./Core/Src/stm32f3xx_hal_msp.o + .debug_frame 0x0000000000000b40 0x120 ./Core/Src/stm32f3xx_it.o + .debug_frame 0x0000000000000c60 0x58 ./Core/Src/system_stm32f3xx.o + .debug_frame 0x0000000000000cb8 0x334 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.o + .debug_frame 0x0000000000000fec 0x5a0 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.o + .debug_frame 0x000000000000158c 0x498 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.o + .debug_frame 0x0000000000001a24 0x14c ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.o + .debug_frame 0x0000000000001b70 0xbe8 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.o + .debug_frame 0x0000000000002758 0x100 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.o + .debug_frame 0x0000000000002858 0x214 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.o + .debug_frame 0x0000000000002a6c 0xb4 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.o + .debug_frame 0x0000000000002b20 0x860 ./Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.o + .debug_frame 0x0000000000003380 0x2c /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(lib_a-init.o) + .debug_frame 0x00000000000033ac 0x20 /opt/st/stm32cubeide_1.10.1/plugins/com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.10.3-2021.10.linux64_1.0.0.202111181127/tools/bin/../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(lib_a-memset.o) diff --git a/BMS_Testbench/BMS_Software_V1/Debug/Core/Src/ADBMS_Abstraction.d b/BMS_Testbench/BMS_Software_V1/Debug/Core/Src/ADBMS_Abstraction.d new file mode 100644 index 0000000..c5caccc --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Debug/Core/Src/ADBMS_Abstraction.d @@ -0,0 +1,65 @@ +Core/Src/ADBMS_Abstraction.o: ../Core/Src/ADBMS_Abstraction.c \ + ../Core/Inc/ADBMS_Abstraction.h ../Core/Inc/ADBMS_LL_Driver.h \ + ../Core/Inc/main.h ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h \ + ../Core/Inc/stm32f3xx_hal_conf.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h \ + ../Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h \ + ../Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h \ + ../Drivers/CMSIS/Include/core_cm4.h \ + ../Drivers/CMSIS/Include/cmsis_version.h \ + ../Drivers/CMSIS/Include/cmsis_compiler.h \ + ../Drivers/CMSIS/Include/cmsis_gcc.h \ + ../Drivers/CMSIS/Include/mpu_armv7.h \ + ../Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h \ + ../Core/Inc/ADBMS_CMD_MAKROS.h +../Core/Inc/ADBMS_Abstraction.h: +../Core/Inc/ADBMS_LL_Driver.h: +../Core/Inc/main.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h: +../Core/Inc/stm32f3xx_hal_conf.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h: +../Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h: +../Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h: +../Drivers/CMSIS/Include/core_cm4.h: +../Drivers/CMSIS/Include/cmsis_version.h: +../Drivers/CMSIS/Include/cmsis_compiler.h: +../Drivers/CMSIS/Include/cmsis_gcc.h: +../Drivers/CMSIS/Include/mpu_armv7.h: +../Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h: +../Core/Inc/ADBMS_CMD_MAKROS.h: diff --git a/BMS_Testbench/BMS_Software_V1/Debug/Core/Src/ADBMS_Abstraction.o b/BMS_Testbench/BMS_Software_V1/Debug/Core/Src/ADBMS_Abstraction.o new file mode 100644 index 0000000000000000000000000000000000000000..59d1dd206ade3bc0216566b4538167169db1e2f1 GIT binary patch literal 911232 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
nO@8B0@ichfwZy^ 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¬a|o7JzNjcm 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 h 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

L9^Pj@zWxaY5;6!(}L=pRTBo=d259)IOD8i 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

l^tuX!#0@+P_2sM7AGX`;XD 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

  • _F7w!WOhDX5@;TiCJcp1DF-VE=8 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�n)5Fs`ZP0xPl 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

    SPSp<9c>6TAkpbn-Q+UjCvSP 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

    a*Eo!+LW1xq0+A8 z6L(wr%QnF8C|y%wvs0Ov2=84=7G3LZr639ZdXzr&X!pSpE=a%95DA-il^f~n-+Ri3 zc`!Yo^iYBfDKGXwb6EKir6VIs{TNJ-D$`y8H>Qknf^1yrwHMwel&{b`XHvPh5ZsjV zpC4iDp;AuC$+XhpHvndouTTltNwt)6Z)eqs8pvE!{hz?fUR7uuOz%@|%txHAsugsC zyUY?mQ7;NN41Vp#sexFB`&_I9vvJVQu*wGX@6B1 zEjmY3W9=9`sv4sfykjZ}-I0N+0Dl02RsRG-c0wgh1v#ner=nAcNLHP;s5}79sTx}$i&Fh-0J)%I9>!p_ z>LPXNT~dY8ZX!mtl+F=iRbSAyGft(al6t&~>x#k4s)v&ZFhLc%6oXe(PhH1gqU!UX z;o++4b6QldsotPxIz`n_XNsw+cOOG!X(}6iQkt&HqtlNJ)to7K&s4eAg3D4Jr#e`+ zDvvf)IjYL1z~!p^Xd9TP5%;O&2UtqVpH~eL$&M>05?^4=`pNSz0eMoDpiOKDz{X= z8xTabYUCV9jVg-vo3*N>Z^6~6E^UU}dezn^!8NEp@c_J0Wuyz)q&mF|ku|G0R19cQ zvG#y#Rq<8l1m6_pE}hSR$SFj(+}XTE}?cn5A}KS;HmC^0i2im zyer&#t9?uW_^1n_Av>TRps(5wsuyO%rms4X2kwyiWvV(HR>w0bHOus|Z$t)FPo6eoK(Bf z0~?|)bO#rzUUUWADRoFEJe*d0(rHVWdJQE?;p#shfxifK#Ao2nsQ+-lY|p9}pFw1i z>XY;d!8vtjI3|5weUv^7h*Eb_CHR8+pV?4}R^O)j#6@*d5UgBMzpxY`#i*^+!xO76 zd=w;3ZKHG~UY&jj@XP8C>0l*6{iGa&SJd<9RgkE@V8o2Bsx>mGTvK;HjoButuTgC# zRc$^8S(88z7Ukb!v zzWSpdz!j)JYC!OX>I^Cg6{){n0}sXOMc=?}iF)A|7%Wx)M9o5F>Lb)VP_AB60>E{( zEE#Sq)bIWaazibqQ`wtp?=0Xd)w#4lRH>IY;_BW~hb)7?YW3fF7_3oiXJDmPy_c4Y zI`u`mz3bJ(RA*>VfBh9?jp{<$q&2C3pwzutEvBtWi~5gA09w@oN?6;}r`iB$SKlmx z_dDvZiV$_D`f?pqy3_?zkaerOzJ-+@^`;i6^s1X{VY*NK1TEtI>XkmwysN%PwflSO z9aIS(P`@?_ZczRD350ZCT~rJ*q)wre4DfgIJt2iDU5Ktof!7A-QNY--GPcq_{%1Pow?_ z#8q>j@^Uwg53QK{H3ffSw(go)6pM#u3AIUjYEo&T_R@Sw$)2|+xgIhf&3pck9nkbY z3AYC|&g&ra)x4nvIiztQe}^^O{)MKW=CcC`$zSvGSI|77@tg&fqnbbIkRU+wdpHJ< zX(CfV0yWzoB8VW32W`uaYnpF^3)Vc62XaF59kq0v)TGfyB}DTpl?_5QYi2NqQ<~6K z_~A}#z9<0+(`=?_vgX-~@Ry>w6%Es=8r!$9lCCMC9Cve%CnH$i|)y$=LT%M+$?yP)`a5hXAXm)LcN}(pj3#LmnU${f1R1-sg z1hGuB;Y$pbYlK#)RA|z;uz5q%Hwbc5^GpPOj!Mm|OQBMw(LIO3TN>t4%%N5zIuEW+ z^Edtc^_m5gFEwa3hl6X>Jh~i!Ce4u%z?(HU>CS4=sA$1$)vTZ|Gukv!+0bm)c=m(4 ztr;AJN{7b(B>?Vdex`h>Q?rQbU|kwU8Yb4Q`QDP38 z2xE6OmuX*oPh*t=FrazoD{zCFA3sE#_ca^WLuE)am;S8Pu*Ux_7#q=)Q^)+MMnSvQ zG0pky;KnuOv5-w@)M+q1rE#yo;6qIZUC3$8nu8de(FiE3bkaKi3rEh{4GW>-qD}b~ zxV_pms-x`Fu0IMDSMB;f47zFCy5V-eb_ZQZckSv=Ks>ZLy})^Dvll_rOFNI=sovUW zDj@UGcF_ubKzo&b>4Vw>)Bx|R&HfzRA?>5oJa<_8F}1JxY5k}`8=y_@fyy!ME~-lf zYFVFy1Zf``139kkp|WzYb^*0lp3uHZ`>_!1tgUbqstt06l~daMB`|$j8%4W;}2+#YAvk@a7-J%37QkywR96b&{nMlU{d=+ zBnGFnFXVxn);44#&Kd3ciy%(AU9|Id)VcVeTs{3aZRNQp0(PF$` zcXJS$9=eZz0q3a;j7HR6x>d_@>AZDk==bx{#ruIA)V)VF9bcV<`j8Ik{-c-aVclNp zh4a_Bc>!=lH|r$GQJv#fkO1Awiy=FvOM4bG3eu(1Il^(>Ff{-M>*BtKu@gGi4sfBm zEz9Bkyv{EJaYpH?sOoS*cb9q~qjkwtUc9J#NZXcJ-FuWr#_1UJyvOV2y?|IQ>prHR zDnaL!jEi+eCpG|=sN?Mi;Hob5EdZ|Rj?tzfNmu_GB1_hZtKct1cQpzssk)mzm`a*1 zm<~PDbxPVuXXuVmZ6;Iq%zGeNx~FLypRIeE`fzh}Ur>`~uCA9_a`JR5$Zfu^C;?o7 z&h{MOg}TTV0E%?Qa>$Bx@6jjECAxv_P$|{DPDyE*uH_mu%XObpoY!>?)ljL>eRmnM z8@j^`z;EhmsFqi$>yROcDxLH<4BpZ`e1O4f-G=vJtVZ|JS`60ec2PdqpgZ>p;Eg&p zoxL>aZe9dw)_qb7c#F=J9>Z4M+&Em2Hl2bx1KM?d^h@8??Vv;54xKd^*X54x6t$#w z>RzOJR+sKn4FKIb(@T)`=suhTpjUTa2!DOLZ|OL;U#DAvSnldx^M?0(I?HXi9nghR zL&Bi$d#VZC*WJwkU`Q8}0{E~_dli5Y-N>Jijp~+FfsE;XUIf6nZVjEwOz86e!Qcbk zAYIQ%o#TASrgWcDZu3y*L2s^U-JVQXnb8GWz&Yu^rsdvQKi2~Q7k#i0gM0O{J2ALV zzwK!dSN+!Y7cf#Tfdk7ex#2+tq+b4=xtJvgZduY zg!<|S>M(~xdgcZI4(rG1+4R$oy$I9(`t9F9c0~UdeYtQ{zk#|l1N23-=p56(xgCRn z`WKgj1nC#(;o-P`iVM@h`j-k}<%E8Os*@-6y??_>i2gw;xKO?KeE?4BcLjl**3aZZ z7N-BX6aK>W=DP?tLT}%JOK?X2&LOCr)wgW`E>i#DUZ|YYM=~&YUf+5fT$KJr2gGtg z|Lj6oiPqnvR+o$VZaS&Iq~AovxETEp)C3T#&!y9rIDOd;ka&HQ8&odqzX}8{LEmbG zu`Bx1$01A9pN@l-t9t$}$gb%d*zlL6UqC-xvi?pwa4CAhB)C+45*^Q^>Dy@^m#(k7 z0g|ETt%k8o{hw!HB};#h+U&CRZ=V8}qkpX#D!KZIOu+N>VG9Az*UzJqiUR$o$DmoP zKah#R68%r~E-uxFmx5f^d%S_mTA{CAfRJwJ|M~%gH}&arVXRVLKMYxw{wcc4Z|S*I z*sa!Iq_&0{{Up6pYxV3~uvw>H_B^wmLA^R~X11rHtiMgQA==wGCZ+^K&^KR}n>R{%h_{!Kca>(S@j z2I{5;^}`k+b}o6z&6kUh}fk4G$%`b)X^ji&Tj)a><8f0Z7} zX}xG8W;CNuq{Q0E5PTMz&W57D0CzE5_#MVv4M(2`=Vp*B1KDr*E()6NhIp!Ndl;hm z81ys@dSlSXu&Er}0YeMzpbr|{s5kVm;hGHo{0xG}A@esh(zAKQAf(RQqlUMB1s7m= z{}cen3{|w01RCa1X*|dfL<{wCgDX9F!G_mp_j1B8k9Msm4GY9j2{Dw7feSUX{{<_j z3{Or#^Ryu?0dB(#=e9y6++d?uR)paLI&C>)82%mPtfBvJOghr=Ml-l`hM%bhao$kD z!W^Ouf!`pO3x;>%K%x!1=z3l>?BRl3GMwEC4>5*f>QRa{JWh#VoPkB(GshdglEdv~ zgKY}91jF857`tM)6Awp;hQ9j%Ts5?ffLt@oivvkAxPA|kZ1~+D(@ZglX|YN*WL&^t znjyLzHq#AD!!Vd(7`O?NX&9i_M3&(zIxNjLyh4kAjv;OXJmeZOX>rUm)I0~3e8USj zz!ey-(@{gAVg5qcEHa#-*JrWePfu_qhU}eyml|B|VX(~5mVm)>!)z*)UpMTf#HGTp zlgb-63{lTPcGHk{0DwxvHG0si3}4Vkb2WzjwEd_xbW@qB&hQ(ZG}RlzXouNg*ewTX zH2h6vv?jwzI%sS*RCi;r#ju`Cw;F_ru+nA-roQHOLp3GOw+%TJ0CX7UW`et8=ud+8 zPQw!Vt7ct>*M7id?KXtH0F@rY(p@0EhR$m+-Dep49bCWRpJb@qH6(I?yJv8vm(74- z=Mqe8(BL~8PzvF{#aUdFz0XnGqD(gxhe zc!>JJ4j5${p?T2gLd^=k#sK=W5QmHs+R+|1?xpA5&-l|CIPy1cqzB=MaT|S`bkrD` z4=%uH{swU#Gk!(8!9e3%au^FTo_Y)ZjvG%r=$8&NhWbMm zZp@|^bcAs(t!I(OuZTNme4LKc&l~sbz+jZIj#Bpv#wc2zqK!+aq!44Av0)Ce#>c3n z5NGVz2SB`WzZvAR@$n~c2@;I!D51Mz9Hnx5qA})gkgLW|XsNtrbl8eml8jqMF~4Nv zFKra5o zH6Emc;ymNC^bXHAhE2djfw7A6-9n@Pli-SsllNh>*f>VDpb}$tJY=QDfOX)?jE~WW z0p-TuXMtQdCeW!ug>fSfQQt7CsWa!Mv0VTUmBuBZz*QNKehk?y;~e@lwA#395rU{O zCeg;I-uROYjv9=f-vQTXd?gpgnv4z|AkD_L@rb3x_#5rDTa9nu#bBH9+bNKCHnEX0a?ipuOAH;z1WgCnQ8q;3I{O%j|m*HW^_;efK!^RXkN*OV3SpqAg#^0#( zVZwNXD&!B0x$8hCjq;CSY}zP!3AhLkEbQ_?4ZUo*XS5Q9l3S1J}Kn=)$wPcd;GAf!~&!!MzdX1bLRE9s^bdVn%a zNk2fAX>zCSRhH>H+81Y=o~ANyj_JM|jOCgF{4s|-)ADIt&wSHHdR7Wd-`Fr%Xj)F| zQjzH{Rm_S_`EP-gn0}#5r_}TseKb&J`juLT%1x7TFm~NE$p=?q@}e)5DoqS(JgYVh z(HpkL6wAO=YE2s`d9E`Zx&+O7llyb<&|uKi+rVpt;*lfB$uiX~Y&km5a zn_i>>?QK&&wKsQ|j#^>!jw$jNSm`t^s0N_RwB-;qyG^@KL8Zs!w;ZN>O&3EkqdwD4 zDgxaz9idmiKz?omh9h-ujbY>t{Dcfr_%X?`6vADDva+m=bwJRUTs zO@-TGbH+654mc-sCM`O9%_}0o?K4kMW2CG3+l4UZZa%mcRy@oP3lWQ_xtEVi=VKnK z0y$ugp^l}4<`VkTPKV7;QAd`aIe#?<{movN;4i>@nij`n<^`Rw5@`N-6*Pm*pKn9d zC(Le3FnH2@_e+Ghf0`P6$Em|{7)5RXU)8;07RO3MgXGB*{8u>Fn{F( zN73d7EeJQpJSGM_)|}W1l{oXqRPRYJ-`$BTamAcQC(DWE7oNbRlgv9_1uohAD7_|9 z%uA!erJLWSnsJdig`S*Z^PDVLDKmHJfh#vJzYP!9%>my-R$-2zrsW%EtpVhwSwsig zmF7y?vQ?So4IsD7hkQV)&5J0Lt1+K6Ac$IX(*+FHnGFdb_2%Dbf7@XG<0Wv7=A@(0 zY%*8;2uIE4zh*F%7W2D7khPkXTEy9Aw$R~aySb5y2)E74C_(NpXM1Asj`;u`+;*C! z8UVV?U(=@}-R2)D@$51G`a6vEniET4y3d?I*>=C#NDUBo%~$EX|DJg>RrUtVnRL88 zXikWQ&HH99?f8bw@4taKhs|%%M+zh6HyO|zHJ9V@pEG6_JPU5z?BfdDgxR+YgAdF< zsK7lmFP#By+8jO~gEQtbCWw>er~;8WTeyF~n2V*y8{A&YtRMjPS+37RxUQC`X~W@W z>HYUgE0pW%M$8r^t5ca54T%>BbI0B;Qgp&f=*BaEZcqpcg!*w4tStt z2PLyXmX=4r9k+Zc#EgP1b^rTMI~IHygL~IfLYun~%YhdVOQ_|#1IQ^$A#IFKTk0l3 z!YnnfVldniPdVRNOCFUsA}z@rI67x}=Q(iaEi$@kqb$c;p>n};g|@lTmZg-iUbOu5 zH9TChoL&u;7|U5Ipu}31r2rmhIY?ic#anV(FtN*)%hw=Fu=H#N{EB5YReusK_jUt* z)iUuVxN8Fp*oB*!FQuQ}%-m#2@VzAQ^z6e~G#gjT8 zx-IK2fa|fiQ~yh^We=51`YZ`_aNBQ5qZID0<%Sz<-m{ccf(%&BTt^UtmX|otyl)9U z4{pd}aYneqmSGoo7_mJ67r0SNB5jk#ESEV5aNM#c1U4ru&o@Ekf#v7xAd{A7JfJyc zDa?eihZgN6aMPA@FW_b@#R?3%SpQuC_+D#rE8^T|Eu{t5)f#jkDsEOatzi4D^^M@% zt%YTnk%zS}5dcrCtPYVKwtgc6=VyKDFL3@=$wp`%u^yox=cx4wO3wqV21PZzjarO}%2F)@3s=cFOt-HTj*k zT1((B%=$GQcZFNyUWDlgtN0Pj_KekoHdJS=r_RAjr1hP77(8bkTL|2F>sNFuMp;i$ zJLd)KyL37bZB#LW+ zrCY~ICBwQo5XLgCOQ?>SWnIw(l5G{!rZC64QwV>#)*ZAL&9k;t0+(;SN4G|SHHNNk zp*1HL@FHs=Z7qwf&z*#3i8c3CXqH-+9Rew{<{ZIn%dMw2A+qb%lp>G{>($>tZdg~* zndwdIm(&ncX}z8fQf2+U3WK+--_rt7Z57g@T4(*9TD0q}<5Y!fu%4w=ztO6t8>Pu= z9)L=-wTW`D7V8^y9^PvG_#x)dW|fIB*lyi3g>Y|M<97hiVLf8UV2?HJ36Nf^nljZs zYgYk0^jmvr1Af;kqDG>7)@(YF9=4|L1a8Fo^HHdbTGQwdWXu|wg*l8{bE#rIVcqm9 zaMRYeoH00KEv6l&lP$6x0B2h;^+>qb%2Hr#udRVHBzIeUFE|fdFufZ+ZPWXp;$`b8 zMo8YabAiAew7v5gCgyAV&;ss|ZT5@c4%^y&py_A(j8bBM+jA?y9kGQLLUz=4ZZnJp z*rq-O;Fv9(;DNT!wu1!Oe)tuGA+}#=;}B|Nu0foqY)SN^p0;^+A>1%qCDq-+ZFeaV zJZIC>H@4?(pEiSwvZ*s5yI}ilE#T3%hm>t!v_;IqV7x7XzG%E`TSoa{f^8RVUa#1K z3II>Et-A!xtF{m$G*fL4_CuCtYsm&6-FAoe?-{nJ)rdON<`aona%|r?LzZjv*CV7n z+i?*tR=zEcKIJH|t)#4^(6*Dxl0~-HX#ZDidwV@(CAPOMs&q+giG58*Q_eLe^w^=OSdywtEGLti@(vz*wv8 zFDhKO+43k8=(KI`K)7ADfiJ*y+vXdf*<&lD-t1nRCK8eL*?u?&w}ZAqDiGbbtzHTE zknP7&7#p^Inh!@Kwo2+67`JWB0&c?Qe+V`o*xLEHN|QEL7jRRy=x1R1q3!m2(44ki zjeyM=+uW5PPWF)3Va(YcMvH)peco~a_S&OpukCLCmNvv5c0VqNr#+9ZnV0?jA0YF# zpP)ZuaL7K7UhIeMXWoR&&;CISWd8P@>5v_<2Ym|?WRIXy=W)BZ8?s=#?+?&CVZXBp zxRZ7jW$6SHZhuS#%?SG~D#D(zhtTQjS-X+)`R27T0KWB&cID4`eJjB~uVt~7B_oO^4!M^A*XkM|uNiW(& z`+PdMy=oWV0WQO?F~DY~ea>q5%d)rIFqmz>-w$Is_9fG}thx4%b`0j(1L(DsZ~top zGz;uzvRP=KvkqL5z4w3baQhk#a3%KR)C^o|Po&*$nLUI;x^DM=0#+*QJwC8LwaGa!}raXRw3Wlx~CjcWV;r!iP#kK{nJ&VG_!QuX%L>tM6NUjG>e8|~}gfo79E zpDOY#_T7(QVy$+E3=Fo}-=QaH<~{uu1BZ%aaC zz4o_Hz)GLJfsJexo}hGZE+5POBAA z8Q(du4=NKogZ*%^CU?I61S(TI<6JQIW~U)-iQn%0JO{#4BF-FWo)&GripcCmZgeM~ z5uKzJ&q1X87%GmU<8;(>60xr%7H3flr6OEJA^-n66iu5A6*p06Bm#67^|`{dhv){q zp*=+#=!f$bE&mgd`H1+QAikmnDa>4({Z9w>Trt}Z8;CkM3L_xaF<0DyAVr~$on^tWYO2%FnvX2 zHVkrA6hr5n6p^?OW2vI}JFt0Ow9_6WP4p$51JXspesCG0ls4GBDPsH%@0p_fZ{Rjd z)b>5bvPHwSAi1J}o4A5`qMWA)B44zk3h)Ba656KS68&fh4@II9(RJsT6h#p@6xho1?4_t+4hdywXqTiU%tP;KIhNEgxQYqjyBF8FlwW0-- zG`uG|auzCeqOYiyRWH)>0(W2Z#06swqV{qaYZO^!0`Nez>j#h~QSN1^G>Z}f0B8~2 z=R>7cG)PCUHqnn|z&#Y*4uSVaq5;a?w~IpW!)=GieGY_=MR~Mxb&B@)BitvVf)>D^ zicIM1u4kelIxRgHIjjTe5{**2wp$b!1Jf@=qxJCDBl?Suz`df`pMvy>D(F-Ge$h4h z!3RX<^bO9S=*}~cm!g7LSa~IyL#d=8QF=6Dc`f>j1-HYZ!HtM>M0D^qaHFFA)QvqM z8ll4bq-X_w+B+qBIvb|nh{79S<*lea3-D9oNXqP;7S9O6jO@i{=n9?@Z>J4`gZQ_r zaO5an`x7*s#7?vma25{~0N^5y_z3`4v3C_XH}Sd~xPtEDbo$)QLwtBTaGv7oW{i1> zmr$YKTb$|$;v?Qk4IaMYJ@mu*iI>r<`K)GJK#gZ#fxg@^O z4lY7mLkoMPc;o-*Q8ECs#JvY#EL%L!8DlwOF8#K-;%r(2^27%{Aj}t^ zr|&`v#FyOwxF!CPYFUNiVSQ*8iEsNtvs8SB+OThn=M6!4NBsM@P$?5n<-t+8*p`Km zD#X^bjj0sR5kXib4yJpsT73EnE>Dd({yIpl*pdNZo%lIrhU&%7w*YWoyek}I4dQR; zY|$uQK@ZRa@iqkD2)Ch& z)c6uExlF(GCCQ>903sy+%YaIxWTXlz(UNd_3B*W(7QsWTO4bRTB9K^Sdr#Z-&hql41Jc z(j`um>dcTFrV7AKNr4l_G9{PjSe+%=KtDjXWcM3zxsr|gh%8THRRu0z(maN-0!c5G zXKqQ>*8*24IYx==B8l%QXqHH>P!B<=B;*tv-IjDyh5xQ(NfO`{l0S_=DkWBO;Ho6Q zQ&PKHa$^!v*GjmbW9**fk8(s-C;7wx!g@(eE>!MIjtapwNGi8NrBQNw58zD_=5dTQ zOG^GjEG-hv?;x!bNeMLDB;V#i<&i}329dQ(Cg^GGknDO6_+!b(0~qU+9Jz$KKam9f ziU6NV-laofm&A!`eBF{f5dbeFvD9eVBRTsHxL(Pk`vCMw!uLa^U-A)s`Z^%_iUSXW zlFC$!y_AH}9r;S~3%!1aByDdo_FD2W{W!yt*+FnLA_=oafTNOC^!^-^tf3aeamnXY zIiHYhGK7^$$-+TcnUXkB+Te{O${2vRlBUy`?J4PQDnp!>UaNttR9ZoMn+wwPcEl1U^*;~5Md>#t;KHTXy5aVc zwAli}C}|8O?W3jV$}tur?VuGeR_a9;D^9xX0D_2@y8Hx3m!)DW0FtEd(zmk7(v*D| zyC%(QgfK;Vgv$4+(mZ;A(xlFPP)V1@&w-T;={nl_Wl32n5N1oOR=`+}ba4g3&6obS z5L|)u3+nc{B@Mrc;ESccAHqtB^fWD)rPBG-ZBQoNM(6%=Y2$j3yHYhZVpd5v@?f)C z`q5LU)JW~_fUA|}CV;yqRhq*}omB8Utkg@llj-}?WppZUkP3q_)+lwSTI2)i1U2t8 zN!O);Yn9qtLbFZU8V}8f(p6NO=#b|5fIOB)P^zU<%A^Xw6X{P>fqN=FvnN&nO z@#oUl7EtMuhSJAO-O}q+YIq^l--d8|q@IHi_DKtD!Sze)Pk|edPElTXP`aPqQZJ>e zX{8*Jdhdtn*HVo)#)hT;GlP{8>5T+LJt{p<$JH@uWDCZ|r7QR_HX&V3oobU(1!dZ% zqd4J!_^5PGdS%6{pBinDAR z^~}1+&c6eHuChh6J$IA+dlJUnWeZ(_^N>CM8=RLcQH?QgnI+|Pd}OoeZR0CbQ0m`L zwv&pbXJr9&4hWE)&jksT9ohq%=VhL|K!RjDwj#1%S>wo@OJvUU{w$S!KO1gu%jWt+ct^J9Fob2Y-b84Y%QpJJScOcVmV!!|O*kA? z$$Dr*S0fvE2~sO-r`Gj*vSvDH*2xaj*|1(#Zw+JjWlwj)bfYX~F^oNst)Z$=ldPXI z-OVyJwQ04;vYbI$Wg05@w#n8!hoeU_bK0%7%Opn;e246xFEQ3FYt2DqFJ$wmxX>dr z42Mdu%-0R1PxhF~_x-YDJ~RhpJ1AE&D2p~hxG!bf$}#pzHu5WQL$Zqukk_(AdM^#j zCg}`2BFjvI=BTWIIxWU!l{FAf$R>M1CS@5K0H$O=&;jm^ES2{S^p4L|*0r525mh0*qad8+7A(hRLf9p>k0kO`U(?at$?*MaX5eJ&2T# zE(0J+{wvjUqUBY~5p|5br5Y-+@>P_Wh?AH94%3P9C3I_Cme){XB1ztm3}eaiNEP5$ z_L=v`1M_vnW3w!C;H z;CJM|P(yl|JfD{Ga(Sf%+}@Q((Lu99zUe;*E9IAm0H~55qmyE_yo-LZ8hIrBsij)^ zI@S0IgYB{c{%47KlMn#7M85PW zLV7CqPJzlZc@-u2p3CP_HK|Mf-7$=H%Y!Kq@evx;tNHaVxbU{k6bGI`7^*P(7Zban_@2_{VT!wy(732L zN4Ide;$tcbUQ(D>Lo-5=M~!aLit5d<5~HZKhoe|UC9Mc?3Ii#Ek5?3VgG*4@(OW7} zvE(2kyR7iF07+6b?FKwqvCjdxD~cp4@?2HyeGKlJqWCKOr6?Y*0GFz;wuhDLimYl_ zxuIyi3SpX}HXmHNqLPXW8H%~|{M}SADY==c5KkibEJcq4NVcL@h_M`nFacw^3e{0? zd5U9HkjYmVQ!7D%B60xUZz+uFf)pyQn?a>W@%ur*ixsn|zEYxyWy4Xa!jyiv+X~MQ zp>jv@D;+J%6kop&u3X_j%|dq-yH^8Hp^$tIo0W<`wm_vy@$m-WsukPQL24Av^t!KA z+@yXk~6xOdP}51BEwj7Mc`G=;3Ns{6|I4 z7De?i;H`?ZcVMhdVPXjH4;7uDDSKc!$D*wnmQ?8&g3#6)toOKT+_{ z!RAv%)?8>lQ(U0;#B)Wk1B`Vk=2(JsD-P|3$_s^g8pe7Q$tys56@hLL_9>L5ApHux zCGaqysP_S2Q1Pk(-d`$e_JX`p-1EiQkm64jxYvpZKd1~V>M8p=qIgX&t5HQXZGXlT ziACVX6~zXyIidKFcE*#6bn1hjQcO|p`i-Kq6XdNTls~;1`p?y``ZD)`S~Ws0+a6n1cWLx=!={S%C!%m5~g&cs>wy=QeQXvh`1B#wugz5sgy@%HbhiIl+U61f@$8OeZQ2 z();DI(veLr3%DuFa&r%L^;Wk@Y8x6NP%JtNTl&g$h z1Yw?X?p_$nSBj~KRiNB=9l~46@BhU#3zhZ^cqmf#=R>7fxscBGCCb%iFkPygtA)SY z%CRbVxTEZ+hWj$*PU_PsSN4s7yQ}=Y2c$yT`3wA2DhFPGR4EyBS*w+ssVrBc48H(U zt6Y->)Ay87CjqZhN~!gvUKw5k)AyC?*_dC0vW8v>jmjJk2p=fD>9yUY{EdqMo0Yp5 zu+pM*zXj8+%5~KcwkiGJ0pOuBmQpQ`l$XLV)~?K?+q*-#j!ZvRdj1ZsQyD~U8&8z+ zlp=kqd`%n3F6EzezjQ0lEP~1lWjnPQ^eDef#2k8+#@8Y2Q{LJOT)(n^4q_Ql%JxHL zPIteO! zDsUyL^6AifSv7q(JS3^k2Eb;r%9nPPS5#FGL9VLaP>JH2>f8vp6qWK7yr-(V!@*rw zG5>?<8>;QJ2BfKeIEoDCxHb?c4 zw)MHH+U4N#RDE9~_7%XE0r)+PW2E#j2XeFjk@pZiGsy zs+m%Vw^c81LZw`_b~Wa3S2aO7;|kSdO3YWPW+=c_saCuX@71c85&&vc##D{3Rjuj( z;GSxfcGPvM9sK~*s}d>r`>OBx7;8|yrCd;>>YH2O9;nP-W2{Maeh`3WRqAnYEvnHb zcxY8!c7RHoYV{J3hpLNT!^0!h$Qih8S1qOUW`}B+8o?f`Eb4*lRL%Jwnom?0=m_;x zg};xARZV4N2=2M6kIn&Is%~1tyH#4MlD<$$3}CZIH7f=xy{d64d-SOk)VtiTN^6Is z0o9V{@Gz+Qkdpl`RdY;$d!<@>2bx2wZ?1v7R{avpHfV+B^K8S~U zl6L-{>a&!z@KTGl0C=m{(`w;xCMyQ>%g?^jD8$fD2Hs zprcoyntKB9^XirckRbJg7w{LX-b&r(A?lU;0SHw$90%Zn`sxL!gsF=exJnn*4YNVQ z)lMVua7kT9ufqtn?}xZpk!smakSKM43EqYO2h()%~ni#8zYO!ZHjVJu7i8!hwM>fd~! znWJ9$Ei`l0aRkUyZ=!N~zWUp8;0n|_D!SZKe;N$$h3XAdJSkF}Qs%2z?MlV<618kS zNU8e2_aVHkHm4reJL(6t11wVy9)X8)wSq44UG=Lrs8pzD(0RI2ed-r*RqB&7aV2Wi zRsQgBPhIyraCPec=p9+F{*qp}_tkpzj5Vmwd<4x#^`GPL@Ibwhb^=XmfhV|THU9y) z7WLY!{QuFE29#Yrrg_YOpJ9O+ER&Tb4zY+D*Mi?7aZ~Om6 zN*zV@s&Tb9?W`u$JEwu0RPUGp(^F~%ssx9Ukcr=HSOQXkT3&70*Q_L{j= zu|1=yNQWZ_O`#l`jv6Pr-JCSWGr>7)Og?~37tL|%g>%(}Q2(c!hOGs0*RXUTUYg*` z(Dc?EqkOB6Mqq;geKmD-A^kLl_Q0Lh`0a$hbDG&P2*O|UoGJhTnxo4A57hidXYKQv z_y2}wkS2xF6v3MJ9wCSjO+Yk^g=#+C2*3r6o)+*h&7Y5eyQpD=feY7UyF&AlCYmzx z5t+&rf+JF(yl90Gl!Z`vozc3q?oPgqDpU$=4n1AmaF-W zmgGE5DlK*S8u3n8DbVyQp>j)e$QHsvO|uDNDbg&YOn$LOybmfRny_;SsZ?XDhURSz zuLq9qXg1RP$}~plz?ExiC_7TA>0JO^mF5n;-KsSibVjJr{IUhOTFpVqo8HsZCxG17 ztfOOKgC>Yp(MHWzw17R(obbh1ljf=nrkgdzE)YJ{ypsSck2G>BDYt9RM+4WP;mpH~ z9&1iMgG#5SB?ck%xs+o8XV`G}AFpzQ0 z?qrNjX!N!4H>q(72REe&`w_<8Xx8Pz`&-Qm`d<5#_PcHvJFWer6)N`H0!yfz(ZrVa9zS@nS0Pd&VtbysXTD>CxoYOW+5sSaJofgah?LXAP z5UAx*S?;{n?GFfpw4c()uEE;NR9*|wdS3(y)tXaI=Yp0+$AK_y<0OO^wc(WR3)l8J zBfv}AP8s|~Xp6?75~=OD0k=`wm50GaYo}->iP0Wc02izMh3@h=?J|0)#%ql(0+*l_ zWt?ilxe>vK+Hh9m~Hq)CgPy5e8 zXy$7hyMQaun!CZ+E$xO6V60HPh93JOts%AN6>C4DnoWt;o6ZQO+STuX+}2i5vg(fZ zV@em5X*bscP_8{hIi0&&vrFJAv|lpep;8<1F}N!2Y}%t#Yd@#GO^w!q5-+t{R}%>D zX*G0N>$HPZNUhg)(U$+dwt+S$4O&xYkVdV(D*z9)d0jBpq&>J4Zkx3kERYuMdy@dP zY7burY18(R&4=1ApTby&_CKo9Jk~O3quZ$!oB{VtJCqE~=h|!@Cf23pDB)p1>ktal zgW8JkL0)Rpe#6)+?Ib;$L)x{Y0E}qAr~1mM)|S#YW7_fga5SzpCo2=$VRvXwYX7VQ zH>FLam)skzAKl4swGQ-s<0;)fHB`>%=5>KM>K3dGjd@O&z(p+ny1fOk8KB#_2|sb5 zj!A7P=XJHSAPmywUBeuLbtNAI5Tg5x1uLPt_gf*npgZ&kZo_ni3*h0B?zkK(5xTpX zuoA87HHI)o_f`pivAWZKz{TnQ4#OPcb&tA1F6*qRi7`pHV;WSh>T-qwxTf1KgfK-H z`~v`~y085(c3p?`JZ@TD3+=trbeUH0kgl7c_ux(4-aN`e$sHg>*C@~xzlFbBx`q2NR;-)sg}+i=%W(*A>sGG-?vBoy zjzVR+!_-$msj!tI;*k$6B?zNDo-KrwgG~txl()(`UV| zr4jJ^x-&)?Yt*5=6L+M}{tL{ZN#}nR-kWtB=(E@s-HB+7wd%@fQ`)9G=L7Dk&gl~1 z&vX_CVDq^ykXF1d-8)nP=+>24A&3{cb<{4`qx*9fet=$`ls0>Pxq@klbsXa}2m)-QEodVnoNMW8kQ6tsbn5>pV9CH=#S;0WzukY8N!$ z>M{!9=#*`w2*T60$LvAuZI!D*&e+cV6U4!`fR(43ooV}H6Kv+#K01jwZ`saKf-A9&UI@)Qw!=vf zR@z3EL0Dt^FRiKfY?FQfuF*EQ7_)t9`$G>@dTmXI02s1e;R4~9?a?x?|MLAy*ce#Lt7lTUG0=u^4ul32-7~h`c}cpxm|NU2QFyWV@lCP?b`Mi#*%l< zwZh!fc0Ht%Y0fV1LU2X9k_8yMz3X8xtW@s0LvPdCU7tk5bknXFYmBw;+P?)MJ>Qi@ zrQv~H@+oMJ?mE)}mAAWE-UH{fTc1k9Zo6BkO6s?J%pGn+cHim+E^@am6INn(e@o^2 zYrCUg!b-;OeGB2eZMWug!25Pr`~dQL_wOQjpWOZ8Bh1!mk2Aer-1eAKBbe8ouU$a;dSy@NZ-A%n`Qbdcv^{IyMG#qgJVOvt{+=y*Afh}b6A(oas>uDF;zUOx_xTkwQNQBCZJ&Tuu8`$%bDrqBooV+2N+7lfIa>{Nt zWx9RrIz^b6uibl>AoR22asW7Mx3w3h&)Lo4V$9#};(o*uU>B!?_dvTt{m?vbH%_f> zL3W~p00i4LQKvU}W|l{5{&zVxokM;i91TQ^$voAp9wcalUp>9Df( z!T0#@wu{T)@jKoGEPp>rFWl`)dN_831wgX%YdZ9c#sZ-!?&d)vIrSl|Nu4{PDf{Fl zRRqZI8_A5_}Wji6dipH`{&(vPJ1m=f&T6KU|PD?SQ|?H9Ct*gY5z{XIrhbhUG& zzLdRQlq=cy2X$=jf1i>!2e#3|ajZWOeoq8aBjJBvHA8Z8f?i#x^bDwj=(JvQD|GGk zzN9n48NEYJ(00(9oC}kVdIPCIx#}HX1via)3vJ=yiJpLxBv192^uis`Yx)IagL<16 zLHJVd^fi!IdQR_w4CzJx0n_+F>06Uwy+3}0=@GqT4#r0Hg3bW$KCNOAR6M4&?0_TB zX$MUanb)+A3fT0X*7ypX&$RXe0DPw{%LBk~S`~G8pPgn*JO6XjUglxUf7(~A@DMOf zZ#KBVX)Ro+oS!!HeQ?3k=1<2oL#9>#3`e2Uw$djc{tSy4zyla3?SKnpJf&8p^NfQD zPzhpO$N?ajvEeR+A&lQzK|&dG*C6-{j7Zu9hcW&~dG?D8_DX1mGfJF5E-~)JfkZF{ z^#8?c&rwk;P@dbU#5y!Z>9HHyB@i z3X;ZnUxTr9M#D?MGZ=H}oqUsFMs2Q{jFUbvmc>}x3Sl;5H=Xoz81vI{L2?;qXG0~A zkwh7Zd`4OW{1q@V=?1&S$lZ>R3K@C@@Lt5QWWsGRV;v>YOBi2Jj-`}wEg9Tx#t`Ln z?l7*$!e$vGKLlJkBl14R?lQ9UV7h`~LtivjGDKATs$y7C8m*eKhLS5ajQ$-kUCZ$M z3z6MpNGPRO$4JrxSI_XKYVLi;Tzha0jK6+_l}5&>8*DycET+s?6Jy^fNHb#vWsn~+ zDyXj3&gim-rqA@F3os+!=_7mK$ZvY!FK~Ny`aUNB&P|^~8v_67+v#;5F#WgLfCo-r zWDVi@>0OlixH4Ut0QlAEyb!>zP4}V$c*^v!`5@WT4?RN=In%qgL9=*zH~j!5)77g1 zcsBjte-Xs<>Gm1~(KS7V(&ppSlW9etm>x`DolZ_)M#YS`(_3hfa@OA&2;!nYjRj3t z{hRa{y6K;+1##D3n*yPSezpKAp7^JaaCyA+GiQVI)?Ymhk@@Nu(RR{LKa}>SXZ6Ew zAc%ANCBFjauYcz(00H_Dl~4)PpGCb*=k<3{PT;&j%}!VeGT1^%r(lDi0ceI8wCV$X z(ZH2DOv4R6p?bh2gCD3ZCBndr@)MU0is-r|8NAvDl58MN1i4~xe*!934Gw$c)9xd0^2FK~EjRywKIv8s*I7+=7%?A6=0p4OT{e4{d zHiH9KK^__eP<8H+!SeM`=`ir3X70xZl6Js54I1g5e`2tbj&ofG3+ZgwZQ$Al;R}Ob zoWYG6yg3CjW^j5K7<=Om;-*v@K!f)5r#{)!%C##s{dgQ(T26u&Jts&Ps?bW;rH}S zcD!LzKE@Ia^KW77vSA=K_9PqX4+DPHF!n2GUNhV`8zjZ>`b^BB#Bk+@z_l2@ks+j3 z!;N&U+YEQoPVS+hGo_Uu8NQhg(r&n;1Go;uPibfM*l^Bmx~zt?X|w*!uya~+#!!@*>95Z}p8iE)%ym1Mp zCk_8jfpE(3vvAmaV>t3JxVMJS`Z0&oMr&wcwl`9{W9*F4atGLSFdFWHilfodeGobu zrMSYFi%|}>Q@a{9_27cI8D04jV;)8)sN2WW=*auPc^P%IAqXF%FBQ=AH44~=F+Zb| zS{RElnk9jiSflxLVvjen+>PHM!RR3EhZ2qacY|CuihKf+Y~=9(xGP2-b?|V_D41I8 zQ;fc&Gf9@wWm+_{jlO;hl4E55F~)L@1fRfrp3&Gm!1IlwD1%jClu4EBTSf!aiBM=X z%@JcoMnM8tDK>JU+I59d0ws?sjc!m0wAyI1BSNY%I+6y{_l&mEmZZ+;)J0h7G4k(( zO0SWR8e{!NAzpN?jjl(78#D@Ch_RPO7St{I%4mKC07FIzKLh^S=%gbY4IBM6AC5+h z<{kuY)JQ?E`!S=hSRms@2kt_1!YFb2_5rmWRZ%l;bYi0pFs`GE6=s}3 z-O3k@O_Jdu+<1_B4=x!mya1aK#yiVlEYkSj(@=>r-bM>;v~em`KVpnkbn7P@e~|>u zGGhlBjFlUUDOGmQxRR>Qb;g#oNYxw1bwcyL@jJD^H5$)-4B-Rgxefp{8~d6A-eSCj zj@7NkeFe~LGu}TN!bis5`w&aJaoRZmI*g~+fjl-g9)*V|#;L2|;hFKONKEXx@!}%D zUm2fx3HXrl1{dIljki!=(1`JObhdwMT>b-Wx|sYt4P&k*jJtrlnWTwf)7@l!DXe&y zT%}#Pr->*8I4=`JS|+?rzGr~=n4FpqO<$7$1+0XaD35@Inhbfs^aYc{uK^D;8CwQ& z(ZtjqfN+xp52#!+*+5n22$P3&yofTHs)jJyq=&ZZF($Vb!%?h>2{oa{nT#F*i8pcG zf%zqv%urw~(PR;k%O-~@X_#a(J08Z8O{!=^aMfhR|G(=@vS$L9VsdvD+@_lRMBP)@ zO|&i$-Z1%I1b=BJeis2qH(5y~gA5b76gF>~=s7|q( zmN?hscnYpko(b<=*vvQijfFWBntV$?YLUrfM+l2eeldgTQj=Abe!FdQ=_zn`O!{fx zQ)Y4^5XQ<)2I+CSYciWoXB8&-rXcrCswfHDU=pT=W}}HaWtShA6w*Jg(rog@1&|gK zFZ$hEOB&DazZ}zbOA%+T>6kUV z-!e_0?_~;2^{L^o$kcTPj1`+EEP!UIsqPwtw@qb~lPfc2P;#@}^iLJY3)64ULfB)v zn)d9yrWUmj_L)|{2G?&owGLwgroMWxGH81GG{`H{5!#;(nJQx7cEt1r<*dd`6Muwo z+|)%4xSLrg9Twfq3Ua}DnCGp(pRTJX8Y-jxL~s_ zR1yg>3#S5Xs9Ei2m~@y~x(a{@Ga2C`%{pmai85PCpZ7$Y{X_YQ60-~{UY44f)9LQE znMWkZ9W#Sl5SEz*Z33X&teMKOcg>vs2B5<15#39bX1~rrfK_IhZ7^1CHuE4fYs?1z z0It^T-FR5JXQraWQk_{*EQIxD)BFK%FblGUu|~5J$_za)YjA-|lUX($p_k4W?s~A z@!YJ8-sN3p^84Vr%}!iE)Gy2~>4WPrn+S*7UbAdky!*}i&w`AabyEUt%xtqAJdB&| z{t`labN839>1MvP9sqaqS(I1wFyBS{Yfp3c&!OUNe(hHXea!!$h0oXAz!M()%olCI zG|!q(df8_@fV;<)SK&<&5ddA|+3%|u|v&ddFQ!PT2Ps$k{5xj7}48qB|^hJ;4* z#}bTnn14daqsQinYhk6+{97JyPt3J$i0r9(@JVpb%rlo^4$sY>^h4NXF3f}XZgcYy zjJ+@ydckIo`8NR&_L>L&fI0M;KZpP~VE*A!;0Db%Q_I*(^P+q3@XCA%Ekr}+0aSW> zZN8DVy~F0~X~i2c_sf9hsCj4~tc;lpe#F?g`B4=#C(P@PLS@qY-X?HU<}0ZZ`o{c} zKRmoO-!})sQ_Po_Aw12TMO{1gOx`>Q&oH-8Wzv!9B7rd{=HsUz&P+f0!qB~B^4MeW-6&dRl>}n_KQ+x;t2$Jn~6mdw<&XRGyrAHL$rM@XC6+6_q)uP zSimcoD_S9}WX690u8L_!CA4a$|3XAo!}Jq^yT_cMdUzeP_zU3bnVS?aeV=(^5~drN zFMkHEk?GzG@_<=@Hd*~9=2GhNYGyXl9n!+&e+BQY%v01R(#B*CLHLmQcL@NGm^?X5 zKW6?!DYi~#5cOw0VJ@RP?q zo`o$X$LcIv=?^H?TO6U^=)OhQ_i)=_QL_xj+AZ>E&(~q`sR-n$Mf{f_&n zy|Re>8GuO(ue|_FS!|=zi@T*Vljd%jNw0J-%RzdVdt1glgLfax2HHdWT9zh5^Q`64 zHrNca+(1Q_i_>Ix7NgsGWw#4BRx4z}+w@`UvX)_1@o?2GWYv!5dcIpp# zZmIYWV_lYiQBk+sl1B%)7nYJxOr^(iA5{Z;EjNDwW5br~cEaC?I8o z*4Qyv@ns2afb(NTQY-RVR(l`d=UDHXfb(ZPW&;<%8lgX&704QqgPdo{OAt#COHhTe zVAii$;6hlvOAtgTYr)U3d4V+*0GnZ~9O~V=$WqaMFq}1!fQemVU24LNB3L{ps6?{5 zKZVUGmg!+wiDn(!fUy`>5ffvvtiq2VjAMP~3zc}*CwJg4fmL@1RuWlnePQ!5tAmQH zNvtLwG?Q7iw8^-_vJxPct1N>u;I6R_4I+pX*7uYZOJxmFf$};lm`*P@SZPl%md3I# z0ZC`oQ(J8YYkLsjH(8C8FwJDyQr}Y+Ys(pM*{oMop2%T6`WS9=S%2OGAdj_~-bDGV z8??q1ur5$}<`(PU1lTNO4SWuG5oT^&}Qf^tIi5s1uKuz_?4_<^e(7kO`XBSs#&%lg4D3iQJ%e)^<4~X-eUz( zw{jh8E|tmZS;b<6d!N;N0Kx{=AHM<6$T~<9d%*IwhOmhhOG(jY*4NaE)xt9T2648s zrtQIu+E{a`xc-o3V-E6&_0Cp|wX>%E06+(8F%_5}vu5=I*U3sd2xCuJUsLV+DQj*6 z$TOA&CGnoK=Ft7w#Tvhh;JaBvcOZPh8g)V}JuLNgT!LQK?=Qghv7$U+te-WX8Z`!3 zy$1mpWYv4X(My(l6@;%?n+#xVh*cH|?ltSXT?lEIwX+c12&|)w-1hdCfFc!jovKxRSHv0HWB*KLQ@j?x9sChFwc}=vcOkE3Cw^?^4HLJUe0>xCFKt zoiG#GUv@)ynVm_0a3qO+`+XQoX8ZYoyTTr$T-Q~0BVCYd?Ddo!OJOfL2@k34<6@BO z>_}gz++f$zyDp6#e+*nYyI>0Q%V6t8gWO~*dO{nlcWV0Xm0-nQ8q=Zy1 zJGlsM^Vsh)LGsyireLLjZJZ06x7csK2Up1c{4oGUZ1WlbirGu*5K9RgsX;t{Y;7#a zZFViad+xB8P))du9Y$8l*$YiT?y}!31g?Vp=tFp@WCzi!q>9~f0b|wd2|t8X!~Wm~ zgthEbblkbeUPpV{IyRe%1oiBt*TLOq=iY-#1N$2~pf<9bMlkk(z3LLUCieB8L7Lg! z>)^eGz2G^xR`%!Lg0!*Ieu9UG?6%Jl#3S~CY^b!en`vLy!8RxWdCYck1LWPQWDkUW>?%6a z^s~FEY&F0hpi4K%4qA(`m+U4n#$K@-X973G{+eFYuh|L3xYon$q!s{1*kN0sGRpp9 zH-Z>rd(jO&&hDfOIl;d28H`P`_t5e(#ePCd$QyRq9dK{i;W7YDaZY!GoaTJ=1Y`Cb zhvRT`hO;;ToC7CQ0^-P#d;p;nCyu`VbLL#81BVM|T`Yod<(#5)gB#~ls#d#mc5gyR z9-Npc1mVf?*aOWA90Bc+?0Y{qh)P?0B&W7ZC1@fB)B`A!2=*=oQ(f)LCQH3 zksxkhM8I09) z9J0XO=cuSPv4NBG1hF)7KBbn22b_=T_1nbJoI?=JoG~Y8ws3wFLbH`~kg9=goZqO; z;33EC5rmI8wSNHK&bie9e;u4kI%GfQNNHQx$=TBe?g_`S58P8u3pIK_<2-nU;Gc7b z-iPTf&QVjSbaQ0?0{(*Yw{lFRKCBFJf?0_AHD|N~+%V@II&zP2UeaD_l(X(8G{-pJwAUZ!w9uPjf@6IQ zWRfGIdv}U6KzrdgoWr!PyyXOr0)C2{@)X8Sa~IEo(4HGk+pRO)^|aS;;M(Ls#gV(; z3Z|X7%cKxGbN_w_e=c168gQ;$GZp6G#^tO9&YdgWi!l%Gcl2WMuS^Wu)XK*gK; z-#1Y4;r?NPAbh!ps72e4>q#wKXSs!RWIM-QLzz;4u6hNy0PdgkOb2qWIn#`Wld=0&cA&f($QOQsmR#Pzrgn-ScF z&p;x%*QR4EiYueUOEkB&94awf<{pg2a^Ek*SRD7(bVMD`U9=rz3EcT~N>1c5scYjh z*J&}PnZ)&34R|t_^%rngxHsvre3jdhiO8;Tvr0fxxI!vnr*bZ+}md!1tUVt3#c4V&gbGghr@R!GJ zcY|g=SLX+n0&dI%$Sv;IlteG&KDrCJx(d13T~1XZY#N|ix62A_a7y^S96!X2hAGpAEmHT%UwV_ zmU~<)Pk5-~E)0UrdTx~g$bD}5DX27X7gPUWBliGR*&c8=FNEnPZp$nHnz{N}5Vmmd z(utv!J5UPKZQO5Y3-FM;>l^rc#5Ex+?c6v6jCF7q(w5^fmqDAaPVSv$P%Y`oAx<(Ii0||xJNEy4&B_j$AEjmT^R;p4|nMXxb5Zs<_^t1?)!8`@8@p& z6UGL(sp$xQklRc5(o1fBCCDpo*LMI6ahIQj2M1nQ42UDoyBNfY=Rv0zXWqNp5Rwb; zhhPX@c@6Wyx%1}NgY)41Kp%2>@-{kv^Ws%;;mDg;@i{mj-UeF)=*zpd7Ak(c1^*zx zv%E}0_&dkz-U^{V@7+sK3E+M44;%&ZhWBCYJg*@UQ3vsiePAq@r@jIb!h3cLB$W3d z<%KWswnsuUj5jwA!f>83J=2$XeXhVo@HSH)ZX|E31#Cv~m`9-*%{xh%*%)5XYFw9C z9+R@RalG6AAkKK+$CPnN;GG$UFp+0Mz2}#CmXrof;*C({E}7T!24h!vOX;V&%G*;3 z;WeJF3o0qR*YxA0@@8zp*mYhKADTCKPpQ@3}|NXZU!Kho4mydP|4)2 zc>gmem1(NqXUXKSzK95gr?FGCBDoo$v3EeT3LS8=|p^A92 z(GHb<^|FZ*U9^@0b@^iUmQS4PkC{xVEP%anYPQ%c}wV6*2P;z1(I&w#YB)7 zJUiN5^zf!Fgi0^Z?jfx7@!qZn>F51SH|7BEayqOG@{Fi!;3Y3S6M$E|&q4to;#qgW z=4+l*0>Cg2m1- zzV0orXg^d=@k<9WcA8)H3_^SUM{i*I41WW47CZ27P|n|xKeicTPW+1$pfmqI^-s9) ztqee1`HIEx;KonM!4-7pm(#AxgP%kPKTp0foqD|Zg|w^m=6^=}B_I9|AK|k4@?C=w ziyuEOAGovpmCIrJ96x}H>;8P!8o&ei z6c;O$pH0u^1%58=2gCTgeuRgM{9O7lC!9Y?kLV@-lGngR@ZG+Jhe*EuzZi?+e?afL zXnxOja4~#CDhI{#?~Oqvj{ogbaPj=YK#&A}HkGsz`F)gNzs%QP07prD1|{l}`5TX6 z>emWCYQux;?V||1FimIJye2=f8nZdu#MDREHk(7MTD}Rsor1A zpYa0#C48g9a9hgfrh?q&yGWsVhaW~=$7TFOv^^;2htqmg!QVtj?n?d(>Pf8Pv*j>W z&A$=~Qo}#`7lgI^D1wxE8+SyWm>+8~y{XjsHO-X8Vv|(E{Nk{>Mk*uY>z)kS$if~yc`9k{mW{Tfj2*4Y@;cAS%f5jWK6I{R{YW5e(a6?ydrDFjU+GKU06X zyC9_;Djove&v4`^V9v*N@e=$<8)R?6>So}41jV$q^%cCO*NmTFn+v?36`0aj=H~>= zo8bHf@e2`4fFOdJYXb#O=rD3#fL1a*T!JBbSp^GzKLbFB;CK=og$fkZdU8R)r#7E3 zK_GPuUKH%V4?wseK#AZl3AB_)i4Z8aVJuQm7XX`4g5^uVMGLadgNqT|ybeIDz>PXE z;{<86J%|@f(YriBuqp}gM8QZW0G9>x_ClB>aHvDL$pZT-0Imp*eFfoF!56eyzb2?o zg3S~`Hr=hMf&khlUl+99g7AjmuRvHy6L1VMmM%DW69Hxju9t(mDNue0%}l|o6R?>j zc<>3AWN9ui#W4|d+Dal5$65}c&@PhQ<%;ZI?z`>`N9hkP$>|aQ^Na}a2Yjs77Dl0 zLR2Jd)`$0EVF$e#N`x<{A+}WLO0|jG!n?ZwxFbxigUvEw{wDY<7k*63#9d)JwJlZ% ze|ra-mBQ@1h^$I@Fdo8c;TRQi>V>~o!)BwFfu_j@}*MK(*&(&hAMHo*{ zK&$YxCU)=TqUD>6qU$ zq4Px;doJ8}1Xj9)3!1=n3rp#(_(C{FeZM`z!zW;~SD3dRV|~Ki)M?Q#RJK4kAiVNE z+ztx6zk%jUA&(AJuY?_x!Wa@-P{Y$};nsQJhK09y2!2GUM+@et@T3xvjR`s75RMDC z9fg$%;RjS4niT$h3vo^fSJS@djqn?4ReCG@iCQ5~SuM_nO?xZuHxQn&O1FU(2di?* z>pNO~N!>+GR^D`AbhfHugSc3oJOb0MR+lNG>t^+CBjR+oa;A5rht-;SfO}f~L9cr+ ztB3QT>20NN%Z~L#<5dnZ984>>2WBaI^60Z6^<@h9sL6yBCM*~A&j)T%YiV;YCrWn z$5_?<2!F9w2dIo2XEjXS6!BL5?|>v&&7@RIqLnRmqF=VMoCYgNR`YFuOSWRPg1chX zOZ%*=Rx`N>;+j=rK1`=ral!#lwJLGI*mWx_`gZ(=)zwXyLz)%-yegg!tCD#zoniI< zJ1~9I>e@PtWm&}vfy=f^uK^&(s)AZUa;<_Xy_jcppOWwSRvaNnfz=i>02-`*?*yR3 z%7(gxI<0KyLi33gvjpU&)uBBI@U>M)KKzYZ?Ys`$gw^~xAaAVJ#(%<^ z%V;I>ww5`-n2+^U1&E*Z#|a4Vto7|-a2Kp2sO=`qy4w-BOV+U~fs3$Cq&HZk^$>OU zMO**;|6TFczfu}|#CjPm$)nc)qe{h?wFhlq$E`0?S!V)np)zTmP8~#VtQV4px7IZ> zjGeZrcB61@R&g**cbmf(A@s0WnhN4+BmNB+#LMOz4TWp7dKkpV#x?@peQm~RB?-2< zOznUnHtj9oLT!@Y2O!3#r3Asp+6cG6W}MB9#lXeeL{SHAqRk2F#YwW6kpN+`O?V36 zH*Mxg5N@VTkQ`RBY?LpcnQdc4i&U;nz<02cXY+3zaJOv2DKAxM<4mWXVw*3i6{N~$ zgbiVhjr}mJ)Y|N!4yk)K6^q28*@H{ zEjADS2VtvC=eL+co6R=z@X#h)2J*<}nF?{X+tmCGn~!ZgX`Sx0aeM*56PsB2iJ#hB ziURk{=674DJhwSm1)E(q=X=0)+ia^r@I5w1=nd9u^OhdwJ{#Gum}b9?&K6|A=0P?9 zgEsT2$K|CB`xQLAvN5F3JYL%@rqlee%@He*Q5)tPjE&jkumLzdv(g2`erDw#aO5!a zo9|)Tapqi4SaF^yr80}_%(gPj$Ze(py}I0IzIOwh$4q}FaGo>kHo}9~%zcK?^q#45 zMw~t~V?Twa@66z@AoQDgrx==NXMR43v2!zjF^BhnnR_Xzc5$YN-jU%mO)~zEy7vH+ zqRQe&r>eTAaa5KSG3?6P>Z-#kGTk%4VD9NKGtd+0?je|3gdylKurMgb#RvjM#Dogw z1m=K>V$L}$ikMN%ilQRE-|yU8)m7CEyZ`UK?|tvF>r~%+ZmN6FJ^9{3n^*S!=lSUN zs@{F5^<3TizNb;)n%+qsroXm#dp6GoWja5(fPLN4G)%!c9-s`B>V43A zyFW0_RlTq7j>m_+hl44~`KjI4?2S5=4_4yuzq(N)KGhgVU&?95vZIi9x-pY6ac3Ca z$%$qf@xLN-meG7WnmN-rlDuHHvDx2IWR5XpkyTc{!1#T06uH~TGqmF#V?0lP-D`Y8 zm)}z3p?gv9K4VxAnfDuSH=xZ2j8kYHS!UevCms(P-;y0ZWON;m(JwbHItlahuyMi} zoC>4%KPd93QBP(2G2<`y0QR`?{5$CVIb+y-v#k7cBTWVHH1oQ5Q1WzhIfFINFfTs? znKR8ZFGPh|X6sO-&NR=b%XYST(771y9P?quz0EbR8-NNxuLn@_Y;(s`G3s;7Z@IYV znjtz8&NJ7J#^Zc*MLJMczR*D?h_p!xflgT??*kwM=F-@iTnj+;jbCqWgh4ZJ^H@4_TdLjdD?x^sZ`RFh_-Y~bl5hYieYboV?U{=!Xzsh`!gZR+gP=(Y-W`It(FU{{RLyHN@O-IcPYtfx3d5RSug?e+W$=uv?t*$<( zFy9*XIbP*L>uv_vUSu6N1dT1SCUhZnrS-rGSf{J3OIDzjtF2SE1Z=T&CCTd&>-g)C zd5g9CKxE!)wGTxrORZgr;P+WKZG|2lwNkI5(;{SQSS}w%)J47(>mZfkE{&W;bZHF`6#l+iqK;Fm37f47~t2|vWJlQjkV!!RQT4~uMz|N z&I&}3`Mq`N_IUhYji+zyN9ztclzy_RsEV((=A8rB&sHr@vixFQ8vtybwJ+_dzgh|U z7ZwISorJM03PgsW%_{?UeT~Oefw#$PuMSis@S4{IrtgN#YXk4mJab*(N$N4z2M*)D zxFN8T6>bdt^Lq4fQ(zIDy*CFIccJ>?z}<99EeTBSK*?JI4I9wWeSuHtGrT`=0v$>Z z1j1M2u`IAKN*id0uS$ndD#%i zug2r#;2&`mIW@S?rD)~!;M5R$I3suyY0u2yUEAU@D>(Qrw0UN50i$bX2X8nWP0tCY zsT-XgJcyR%^Ml8|2-r=*@#_J*J@^rwR7->N>QH2PFt-~zdNMd=B;MhL;IZ9MH?S3*JKm!mq)tYmoU{@PmsnmNUv%El2gU%Kz~_>RnKNHSH@4%I^)J>8r{Y zFF`9emOpq9Qn!_VN)B;vdB^UkzPx-XQR?CH&yPaWkCg8Qo)CPr{68&kSw;28zrI9r+KW&J10=9UikoYtKgY zIiVL8U`TUAKdwgRS)s4#069CI%2K6ooZT=e` z^F#YyfTk}D#dbq07lrP90k3j#2;2e2q0o7Y0J}6acN?Ux3tb`dP-yQ}n2;MnfB768 z-59$24m5pJ=&c7(@8-}T8kH7@4muazE(u*qbI`4!bKd~$wou1-z-|vsJqnLILbLw_ z?9R}7N-}qamQbv{JM;-74ekjYwhC=N8p@By$A<1?Y}x#OMN1pkEA+q{$b37LUX3BW z6WVr5)O$DdM;6_#2t7w%Ee2`zG|-c%;4!t>SL{E_B`?yx8}ltG+{pA3}2uLxmqhr{w|r zDfAWXw?BvW-3z_{68du~9_vEYJL4UG4b@+T$8Vto9Vfqs%5Fi^>qGzPi^m_Kz`bZ? zL+JK9Fr=B?zNf2lR<}Lpps_Q%T{9g;W_LS)eu6pOE}(EUx7#E#qO-fb{Thm#)9osT z-<{j7o-=q}w~H8Yb$++mjMARh?NEATZ|Zg}WBG3Gwt;q_ySiQf1>WKDZueh{%;&mQ zy@qbrbUTogeZgkEUPJXYo4q{+ja^Z32)Xu+70n#(ofX{;6j@%e8C9KUD&9F3_1>x2 zCXFH=Ry0$g_^#sOTha8|iWLu_Q3ubKD^YL;eVQn+I2ioiZ;AVL3*8Vxvc*2-542frq8=pg?&l&$pU=*(! zPo08hUN`=rAp55AHremH#(>#q?NPHTiXtzXr}jgISIpP{gBI@&{bM#N+!K1T1CM({ zpUg(RrJ+3yl)NuAmumj~p$eY=cqp_N4|1;#t!8BI7ol#iVf0^y-lI8pP3YQ#koi@p z@1bb=>(GhRc)tm4`vNL_8(P5Q4&Q}VABaJGAKHQ<)eoV+-Gj^@LoachXI1PuA3dC1 zvG5e6&Z*d%0ZQjqyi$hDODZUoqr#GkZGOdAZmIa~L-c-Y#RqgY-d1tctEg~$#oc5H z_g4(2z4?KPR20+tSjA!rZ;w}ebv$4%RO~qu^99-Ir4NTit!%Gg0r`?q6_Ke(C(kVmR{Zso@yJAQGLIB(`0K0v(exQx{d@^p zS-n;FUa0roRxe!$*rJ}h^6rc)d**tg>8pC~@i89P^t|z1z^?5%Z463Y*YmPpFo=(O z?pTH4e%y2S(*gUW=g6H<^3$GojKNHN*7I~8r1`w(S&yU0>YgKbisZ|lFWro>tm%3C z)~Nnf&ya!MzwY@4jmh8i+@%SyZ+m{h0J`sbot)l4oS+9jL6j|M?b075ZMXxwD-7kBcupAZE^cvb1MZW6w5S?mY_o{pcbM{TI zwTyhcZkq>wLA@KcxvD=>w{Ei&iRVAJKu;GdwcsF?Uf&GA10n%y2A-v+pBh%w-jwY-ut-Qf||VDMolC)m=>?L znLD83u+b3|8Gc?l@<%*D>(j^s7NhP#7tj=O@Lqc&=a2={@b}Q$EDYkX9T%WhKK%)D z4*$=K7{RCqDv)!;pI6{TN1t>p>W+EzG5j4n;c%4cdYdF?TGa@YJo>BE=ZH zMlH=h7aGqnvhE^dCpvI1Hg;fy$717tx{vQN4BC>G8Do}UY>ykaah;wwX6FEV(^$&G z3U3*GUqR;EM)W1L`HnH>QndN5F_>EN3gdzgkb2Mf{@?0F65$Tq^>zG>ead*-y2Xr$i2v(uw4Hd5bsG*}hw_b0T+P9^_eZTETV9TwbT2<%dq7PM109EwnRy#<8e1;ycdp$PCrbgZ}yq-s#{4{n7s6alXT-&nY1u@sBe6 z9sLu-ddBSdK7O}e4QQeBn+#f;)Jid}>$WxM zYubK{JvsW(Ly>dL!VfUc>3!ct&WUBmBj=>(`6%h(Li(4 zOyg|^^UO7xIm>4m*OP*rZ7lf{ndcZQY2BV@tfv+5Vk1u+y~4;o3D{M}#DmewHAd&v z=-`>nuYT3kbN=o<$Updsm8fz^_89y<^w-@ns>6;v3bpe!wHU(T`}`YCjG9LK(-9Rk ze2kv`BXY)ULo-VINqp0>g9f1PxcMEZHGV0H!Gv9JMLS0>45QXjeRf1n#}%CONtew+ ze%CQH-%OjlE#7^47ia0jE>fqHhCPjTPBxxnMBf?4zj=D~Oyh5V;BlUD**AdAHwIIE zUuYaW5p}ONo~7~VW}|Iq6uHHi!myY-jcsQjb+7T;LwG!BR33}Io;6m|j`o~!9(UgJ z#z%}yc->e+PW6WI{#h8*o5p{rS-xd-e-o)y#+&2N^oPdSA261Wj7zRWD<2yz%>2~Y zdL5en+&F$Sq|Puup$llH`O{#eW|?Qvb9kotatQTio9B_~&M}R7$UN8VPIvHm=3|sz z&Nn~U8L4^Zp{L@-E-(jkNSB!NsMB9zzVkLJTw@}(1_ai8jjsNs=CHF-PSd`{2xJ;rVy;%y!>9_7+6Hzv`3 z_^@#*WxuD5i+;gyo-rPL9vwYvoI#9!)rf@gc+JSK1Z;)z(}{SzXYAhtZN6_*-;c&t z8k4rbyM1mPOgr#uwORQS9-1xQhmW-;Dc6n|?Q5p_6mHaV34Ee;6J6U`QK`%-tyRr*Z9Z z=yrzr#u^kk+5CDJ6gkCQ@)R;pHOFO9@-*{5pQ5AF%}EAeXP9m6=zXTSiUQ0mbHog! z&NM&z91}9zy#51Jm}9=S6{^oQ&mW4%LUR?Z*VmbMlfW!7k6eqA%gkqb;qkP&V-+5+ zn?LLe*n4K}9+qCa0dzkO99)h;4IZ)#%^aE`6`VYJKjfcjT$x1H#l|_9Tv_XjtQmBH zUt&!dipS;Fziz^v=@n-8AGQ?Y~yVKg-y3Kw+VbBLXv^AiI z{BjF`hoz{YAAZnzn93t8p5{C1!TT_hj>NZsPWzRy&`0n25{7(C`I~@FpLZ{YGsD=M z_Jos-d$vLCGmSguqws8F93_PFjm_yPoM(LY8A>iNMpq#7GNXAhidj3N&hm4~3QWk!4uU=JGo z7?t~w@yUsJEH^%(>EL1GOj=Esq-)hB2fkjMERt<4NNU z(u}8!c?{!y+IVXVlzhhMkJJjIbs}Kz8C#S3zi;eI6=|jM^(Dysz!)jv1( zyB2M(Hu@chcmKjzPwMieaXeiNYmC(o0QQy9_n)ZuwXt_!z`ikdpjlyw+3#XJ?lk{F zuh-q?+D25k*W7_DW10CQtptym=RSo|KWX0A2bs^9>(9mGd2^39ICyjQj(ERU%`YZwxl(VVJgAtUv*c@{#N?l?mXc)ZI+?)+9Ff9f*US_^X zrT%iWgZ%gkGsSD&7Mf?>h{qyxmuV<+rP)F~>?$+FEqS$hJ<0wxW`Ne$Yt7T?f4yUY)`M1YW@+PzGB8>lLa{vj~V)MBsq?VYYawu|(xt3P=JI%kH zh?2|9CA1wrXkJKJ_6f7cEEIXt+~pIr`INcEcPR3-8UH7`eZ{Qm0obc%lG@yB=CM1W z$m?e0T4cUwzOxe5-#53o6GK{Q{=F0RJ}_J9NLpnYyJ8R@n!6ti*hl85W0CsUJZlCj zd}6-!CYt`#Tyh9n`OF;nC@Oqz;#wT6ve{LQ#~0>ptC0DnxqLM$tTDHzzw}452ZfuT z%yl$euQk72jQ)N$*YAp{`^8*Cab}&_l*i*&a}7nh-^{1pMD6X)1sZ$9>Y@?$P3xX3Q2j0I_*>ER+twj; z%)Vn?cRhytu5}d8ysWTxrbYfe>!|IK`M&j76q&26-yTPsA6hHuYx&6f>%qwU*jhuw z^=HDAUzlxn}Qj-vegr8Pf+$Jf?QPayLf>&@R$2svR=|%le??$$?AHM(VV{3I?H^9=MVE;;g`}S7R(^ z2Hs(e)$G6{d!w;AfqT+;%nfX@1z^_(s%bI1H8AsKR9G4~mJa!c1EZfnV^0UZ<7WLl zP_{EF{1%+g;{&IaPf4N3tnx?c`kP&T(yJ(Pe)%WMP~pPz9w(s4MdfRrM(X175%d*Y zQvOm5@3)}*kZn-m^70euds$dsemmab%JL2GVDQ(J|GEsRYs<&Hi?Li+zSP3w`tsSN zmN%3?LR`A3{FY--|zOjzLcYhrEg2|NZkmXnD$f zqR`aA)Ur;PNPqo_@1B9*CoOvfC1)B#8T32Lc=BU(c&72t4gk$FzP%2a7Z@`rRL?hl zVA$V2g)&bX zGl{n^8guBy{#zszVT`rRaY9{oQn28FuHSJt~Qp80PG86*gsJcE|KNv z<45C|5qSJ$bkGsC)>z(w4t_QURU-9^0d1f1&#`Br-mk_)3OBzQe@?(#{BE2)2yL!6 zUN{gvK>qmwj}68SUm^2P<2(k7%rJX#vz}}w7_)V{`8-MQ8Rmx-XnLl3P!es zb*6dv)_C{X<~|RjzM%-Z|$INO}sh{nz_PrLw+bIs?+quzODi2lU$ z%|odL%rk!?@4mpCU5UnSHtQZm$;IXk@1f1x%o`S>Kv#7k!H!FarE zzWy_cykf?AUhrM>6xsw=n4`!qKQ{kL_3sn2f-Zrt%*Rhd>T7e`9AInBoBo21el|C3 zj>iUbCE4bm<^!joH4U*@5=_>x`#PL_^mb9}PmC z8;m1A#fWb-2DKt}lQAE{6ts|zA27JZMt5r2ONH z^B5Y7mY6#ng9^8p9aOz%;I(P$ux?*VK&eu^`<%hP!xH~e2+u= z!0b(X?ke-|XCQO6SxMad!n~2*=I>2wC3^V5Z2TKiznS~fF8jMV>v9a~RBJhB?=8WxY}FEUSSbR%cs#bMu~K4ZI#j&b9ueTE4*Q^CkMb%*q`p6P#(lt6X9AU?AZ_ z>u(d#(IRVE5=E}G!fP>>8?8Uc{%*2*vdx>Vzwd|CV(Z!Q=x>RYvQXg`E3qRoZ?)cE zfy~>i6t&&kt+Tn!@38(n505*oo2aheW$m&JV0T+@zKqO!tY!uv-fKPbGU_e0Ui%c| zeAQap3fRY1{U~JqXlrwC`U?)%TlBGE4_d$L z|4s|RT;uz(D0Gf-0)1cS8Sg?D6%qe~;5SdB>yLtuAC6`}4L0nD$2Y;g`{MC^Fm*O6 z{S-WvyYZLcL@wU%!6&G)&L}@Gip*K%BdvpKHp!|rnsBn3?$xAO6mT!GLQrDNSz7)g1vHa+j zwhd?6bmT{ZXQO6x??3Ukddlg1^M@y6nEOs@0yJ@8Ir>aKOB;Aoo~)+%d#a4Xs*c0o z;cp&>&PTjYQG4WB$D`J<;dLl^vhnCh0OlG&_HeFo{`)8}&v>3kcIO-MD{N)vc>0ra zQSz0x15d`thef#YhX3{v{*G8jk~wnj4CEj56s-yeUq?xBblWFrbj%&}NVacw7s`y? zdL0HiuK!Vhj?Z`E?}TddG1RdZ1t_J-|{df%AGrTo!2?Mt+>&bYPH zex-&w3kuMgygs-;I$MqK8w> zBezEnr8IARS3Jo2zKAUu@>@#Y->2Y8O0dtGyN*PKH_f}#7~orG8HNzUty?(M)1G6Ut^`)2K9p+dEABfDk)={?`Z>Ez#zW)`wKXf3u>L z-e(5>4doS=|5_vQSQPl^NVIZ&U^rF$djo&p0gs0QV`<8JBG6QZdT#~#pM!V!IPewO z)|$XY52EQG1CLyZ$M1o}jwo_+u*^V(GlP@PLh7<$lCH69g1geRx;Xe4)wR2W8%E>t zU~v1zcsv(upxN>@L|~!!6~X&oK+_)w!!+D{6?~6$`KMqHa6}<{d(Pbxb+R2_qsL+I zyaM3xA7Xg15&h`o9lM^k{PE8$!rvqBDZ}56S11y6E<6p;$?sCYnzE9D{jJ8u+_{e% z>rTMHo-$_bho;^!x-pdDHS>!5QS~iz&n+=6E6mwJRQ|x6z6d4Hv0kb}>RfBD9Z=*v z>uL#^vz{1^Hs@Jezl_WatZg|v7g`6NjMOdGGgPT=wLYGJ>UUZ%=h5w5);|Z}vDCVa zD|MeWYdiG*sP*R2$b8JICw{H6u6_-zd}zIL8eaHQ>*{fsozJWfw!`B~tC>i!#(MH% zl>F98(+c~Y)t|14pR9(D(BE2XTN(^ESi5|U)SuSZ;usH%`4mNF2adcHW0@D&g(AfT zfm>fgD;Ede?EvhOz);#EFAt36>|GJqz=+HH0&{3}ULJVjca(f8FzGJTTM_v824sF1 zc!YtaUj)X#fzLIP2i`&E6T6?2dY0(ekn8{+-AIGZBU`a zzPFxLiYZPYfP0Q!vy-RV|>&N2$@JR#L#I zUzfn|hR*}2+t_^GW@TlsK-ja&P6N`J#_!#?EHm)0tgH>S-OZA^Pvze$t3`c38kCss#C zPdlQ0!kG4aWUoloUXgy2JEo1B&^fi==t&dzn%af`>mqxh%w7{mPur_~dRP0D&QTp* zlO}ac-D_Ouw7&AI@7PIG`bufGQ{6XO6_pk{CUj1lKA;B8SK)um#lPA}Bs#F4)ay5D z%EZ2%lRDe`wvReuLca-Wi2Wvx8a;kO=l?H;I`!D8?&)`?JKqpX=hdQc=2=FTOaJyR z*Z(J%renep{l<+R?OP%)FAznq)c+5V>3>~`KeuFCUkZo0jbkzNR@Yz(k?0^ z8)U9PnWy*LvR7P2noPo)nduObpm@cjUjs@6@WGlq>PFurV1?S03&F{9tawbn45to74qLG zGlE+W309mM4DMC8EV%vh;NSM^7yNs_;Ew%*!G6b#3>tO58tYM`VhD?OOdzzIr@aMe z+-dIte|y30j}HE=U!i?8VEyC%;9sn9;b6sH!C;-g!ZAVPVUt|6Fyar8(EX1`^}i2B z^`mrk#7G(wedW(LT_eI9KI|Dm&^X@r2KS=8YJXzT$O|wYYtEYvZHHdco#E2m)t)aJYTR86ny-`1xrJ2D$j)#veFCX$aO;?bIXqA8Zo zG_{5|4w8m5@pwMgS{KP=bD4ZwER(CjFG9kVRnsGF>F~b$hD(=eoiw#iSuPvTH@3vG z@l3wHKYmq*i*lr!wrpKK*;t})-5$+tG9A~j(rm5J1p z$vi|Nc&Sufq}n$uA5g~A(i&@O&BwEud@kOUZ1&agLsgYwnS63svN;#V#N}J;R2fs* zp_yv@iA3`?G9OiHLcAbp#XXp)T0cGRs7ydUAImi5Q^{DaEtAY=W4UmotTCHUwKd0c zjV;X(3$nRbE?Fsm`(TCbU;FJBPBdm?b?IcE@ChdXpi3Y>*(}+8${I4c#-=>}OC-~= zk;z1BrX`n@b}`lISaUp?$S0G-1`Y~4C6k$aEMJ$8=l@HUvc}V;oUVvJPx#x6EQqd-I(;@iVrBQQhIA@ zNwlStc{TTmutHI_Z=)qK)PYG8zW2!_hvuu?Th04A1Uv7OvJtAk7r*+;T5!DF|M|hO zwp>ezmvI4IO;)SDB}nQTheBruC>8P~KG8g|Hl7~hOh8^_T9SwoP+7iMI@45_$v3nW zy=eg=9e7ApV>FIk?K*M~dG27T&pHC+0 zllfexvA#Z;3706U7S>(5tf{pvpGnqZo945P2PN~>(WW{NHbrVRHpv`=@`Cc1Ko5TKy z$I|J#SbRt}T-AozZOej9^mp~Drp(nT`ABhrG7_mIFtn{cT=*#~3Dn8Q$@?-Rat%J* z^};kJx{2w~x<*n{*|3<>!O50v*qv~2B~>l#)kUfV&7+#Vs9j~J3bpzxc$IHlQrCg$ zadnNKHt~pj9>XCY1l5Y?TGROm7cZ&^mOEcpB6Dw$`7B<)BAAUJiq~TvBLhnFdJjn6 zMz%sKhdD~+Y89iER4!ACWhHTwZJdcU*_&LCCs9d`1YqC&V-0o5=1h3EFq3(e%4bm} z+1#g37)&XX#Aee>J=v7WH)SGK3cH2bb78<$qxjQ54@m}$p|-#m9Ei+}%y5?bI~$Kg z)bcnsUb1msf?w|p?$}izUMBnOqqR1>_zC-Y)i`(IeAPbT6OS1WJBLUcvL1s3 zTcfoKEuxf8Ahq$Ws-uwkTiTk*)`1&2>IRke4-)ypZ_sj%pYl{HmIcEoBZp85#PCr^ zx5KzQF+OQpCrrQDu1S;0gg~cCmaySv@r*DKjzo#K}|I$LXD^M0i_c&?&)xnZ;}(lOLWaF^@Jt z`T|!Gh5+Rl#2Q)QN@3xLCX>Cb|i?f_{s2c*?2vb7-JPXfdQed?dSrO9W>6Z8q3Idf7 z{>5CNe(a`Lx(&^f#;^bdGrn;VKuijy>o%0Gsj@dwuNCzoCA!r4|D|ShBQ>KCO$1+* zfL>D7wm~veBp=l7p$-&rI4?|!y9nn%dnGh)@qnDRrKd!M4;A?;lT!Hsne>XhGfuy5qCP0UCjkkm?M$(VEOOwsLVP3yQ{~&^fA=Sjbnc@oat=cxj|85sT-C$A%^A zlg-Ht_6=0y=9WfS^=yDj+RBPYo9&NwY?2j4ADW_5N`gV4E)^!qJ1H4oV(ip06XP9| zMjw@J?`R+01xG+w@*>_$^_sOxNYQ4b2x)z+6|Em6q^lZAtVkt|qMcN0?F8A1C2+Nq znM@1ihCKLWM(i`3i-;O5Etv6UFd)F1G+TiZMq{jgotC=%@JuU|_WESDI+|;#R*H^l zf&BGiBd!W#2rwx|0(d0cp5zIHLR0 z(-N^ebYr&zbDctG#Hg&Kbq5v{tVbd_f>w0&9zG#V?LxN8uvl7DXqHpeQ`Ej>?UhNj zO6^mfkbM9tj=Z>Kc(cq?GMkN7a)$VWT%hoK-~GbkB+!UiRR!eItw+@M7*Gli9GJYl z&EH$<(k}ikc&Eh4cpOIm|3!=h4!VinfRvxA`Jqn#iBvYx6b14qeT=$(RCt*mK=u+X z%MOc=>gdQfW`=gk^3b;dgN2CVMg9Q3pRa(^Z&SP_qPuL!HY)B(^D6T5$Ph$IG{V3Q z`AN}< z)5Q+pIYSm48McOy?SeOYD$Oy8_OZ4aC32L;j$|%Fr43?ksf|#iP(d;h3CJ!j;tsGM z`?q9%^+xh*Y+?bnKq*-}4egYW3wf{Xa7sb)7e=(=EGY@wK71t*e`T#2n`spW9**kj znlj;tXpu9xIaX?p}>%WszFbLnA?ZP zh9uis!_05V)f1+23PlwDDyvgen_HqBB*{PIyL@Iukx=Ua$p~e_l*vZqJT8cv>)W70 zVU0fM(kpaIO9fzI;fVSmiu~)$nRd;|!g}CRP0>HjC*LEBmg6nWVn+33Xnujl;ns=(b zrX9RGA$XO~505uMf6qbWDudGniaeyJ5yUgdf{nQ(+&{U-VM(?IBb;DHnbHX1QX{vb zB_TuW5mkLbUD5d)28f|RAfD{9Tx%m(KK|xOox=a>6XtL6t*g<}+?7eCA-8kxXgN_1 z@Yebmro0&*;{33ts<4v@%aF=#Y#x?`OS!qevAMMkw&0d3B{2)~M*44Zs#2ILm-b(S z+J0MI5m?s3TlD;G*`mV1NRM$ATY$olw%d}lT2cFw z*;LwJB&xQ$opJ`3YplZN0V9#UL$X8c(GKfuvB9hWkpU|dcfw+9gE^H3lF}rE{&X^K z6WM_Uz0Zb7E5jLk5l_KHHy~X2ogd)#NH@1N)g?37lm3_>c}wlzi&U%EbdvI(q`{(R z!_8n1MY9JFNXEh(tZ=nn|5{=0oKHvAbwQn=ul0x$}^TR-_bs5Y8Q1i z#*jk18Uq`P)EKDtfx}zf?Aw7!2L-)?rgR;p@joi$629v7kWA(qbw4!Ta4FHa-J-idW8cNKU5vEF9dH$ z+)I7JANRs?ZoyMAkU|Ytq)ZvZ)D!JTOdFR^G|*&`WxRk2TZs&8vvHNLRXR>jg?2HL zg<*qAgrn&^(KrlIAC!$?LIezC#YVCLY6?{@&89MW${gaMD5T7g!XYWf(!*_1L;Wo= z9E+Q6gR#zj=+zKQo3h`evyJ(dW~JZby^w5a7WP3;T@=JC$syuD=p_ZQo{>6&b2JHH zu4x94(UZbcZY#K%{V3pv%7nFgliVRH{}^8B`f9$JrpkH zVPYPzw20RfV?8E2UX2(7y*5=c%=(a>;~m0vT8#UwK*oK%^@bxKCUG}TEvBhFcuaF0jtx- z!ZAxgg|2CHp|E@ho0SwN_D~7%f+`M)fP}z~rz8v`@^|Qp3{#d?Cp1hOURg(Ei=CX< zFcMDeGkCuwK)5=uupLUgBTIU~GKxarQMxX%iI5=$)dLs$)0%x~6pqkz;@f{Erb)nRW^Xch=b!%*<|Mw&Px z0~~!Qmc{FUh7HL&Z=~tDtueVvNN3aOjTCXie_0E zVQ|wDT$IQlg|#SMQnGYlvI=qp2)syb1{XIHfaXUoMAQhNgh>hFQ9bH?pkL8W$zVC6 zI;cC@MwlkO^w$F_Un~0IS8AtgA)~E0Ys6=$z%jxx+D3~Q|8I6dWW;naw?D5H6rd38=OiVIk_WBXxwiN~k^Dh_HlYzHUNSGtLme>O|~8=aLDg ztF2ZN;XzAihl8TaJTueu3p~sC~yx$SesZK;_0-#RG zMAeS>xHckUo54^E!KD2~$0M%mja1zu z3mihE0gV_+8l)T&8Nhucv`+bT;IEYwyg;eO`XVP-q-{MM+m1kc*>sG7O$?LFBGtlp^GWUB3m*gb1i8 zP()Y2n}Bf%hKeDaNC?@G;kTM>YKwvkAcNN)si^LFOz0T40Bx8&qX&OWz7BC2Aj_Y`6Wv}tRF(jj(-0JeC^lLu+g2B0sR%4Cn=BP&soLCXpCf$bQv)-X~hli_Hw2fexFzdO*I zTQp-;F}E90x*T8u8MR$cE0=akV^e)|8=`hINgfi;S56$Y=fnwpAc45DnHff|^e$&` zu$LUfwfQo3eF3JYfjg5l6C4@QDH{`VY@X~dQsxeTjaKDaaPr5tog?wb!9D`aZ;j9?0CR+>ke)GHRQwLU<>KY(C95w~w%J3e_P;%sV5QwDn3bpbI zc`yhZB1S-{7=Ca7l7^95g&~UQ4{OcRF(5Cm{gp13prJAZ&Na53E6&j!bO>i8U|_Zk zJd_vEsGzlzsDxzdU5gk{$YowyXYXhQ(`%fKHDZ{UTRUp0AierQ!WE$>)Q!v~qju=2 zmN~FRc)SoVps#h{Pn1>0J-OxqVS*ql@W7I*dgNQ3=WtrRPc#`F5cW`2*}}^00#i^y zL#B;}Jd$UNA>$QJ7c(J^Oy`YqLf`b%3i0OVPqP?Up#>Y7&;75w69Q5jpW-TY(Zza#83fx&AlG$Yt(%( z7g4f0?A335RbgupU~i(4LVDPr;S4pUuXfO{Vy6ml6+{^=8C&MSG`8ut^v06A6sD4J z4?1|UK_P=JaaHG=actHRz*JHOD%eOb9RqiPZnBH3DSFB-1{=U87(c4Bv%Lec%rtTd zvN#%!LO~}fZNjB$dzI8tb9V+-EK!GhBES=qBU(WcD*HyNqIM9zvR3#Va?+&@(i0|U zeoN~@evqRDK?(BnIT7jALF@ra?s9Rycw{iBxsVSi6@U^V_o70)ChO5Od>}n#twS2>a+R@6ePmDkiSiG^ zXDdOdlzOB{72yb9?E_DR3UE?pNr*+o1##+#LKEAp#!uE@X+fSe+HeyBIEZB(62!DP7H5=U|yWC9jW9` z?KmlhN+liF#!xfw;9LMHNbS|*TZZGsn(}_c2Z(9xi)-N#f#x%aE0EP94lt0iei6^c{(ey>msG zE!cmH-02!F?G<9*67{({4|e%LuI?RK((f5kqjQ0!5>!XtolsgH@`FI*C1_|sO?c;y zj-3lKiTmOgMbfybGsD}ITq!aKWovajFWZ50)cN!TTs_wbnkw!Z1xa=?h{A!;Bd>j# z$z)Tj3YLLe6M@AeE9u|l59-H--}{18$w^cwm#!NHQCByB|Zi=%>84os%sO*!?cT}?-YifAEir3XD(I^UgAl~$nC(ojU0YMr-bNn<6;b4v8t}ckhr$UUIPaW95ARlQe9I! zAX**iKd^m|>Z;n*fEvZblz3OtMP!2tE2Rw`B2k1Z?XcFI!|3!W8mfATqQ~(FNaiXi zM+r>+Of>|E&a{`59D@UsK`8Tj79q6FEzQ1g^y#jzqLgxIpKe9ZDSpY2QU%d1T^CO~GI%u4q?AyhDoWW@6v9P+us;!C zO1i5+N`VF?#^klu*V6@NOemSCS4q{I_gb{|GH+$BGRW|vkso~iyvN?6sH(P%;7Cyn}`#3z)}ea zfMY+2joP_NKs7^>84*g2!^$9XxL?VC5{1yd`?qFr9@7VN2R4X=;jyz7`@+c zTFS+wHer3P6`Lj-x0#bp%61?l3J!)Rs;sfg0 z6UMX&)uANZ8nz;E^E(8tRHG(U1cA0Qt#RHWH2P z0QK8s6F?%R>J$;HBA6J<5rr$Vc~uENTtN!Nby~{(Sfut+MpRH4f{8!1ywFJNvr*ZP$L{WT&-MS4`&4VO3H`E~qYMM{J@CkV-b>=qej+jwOwp$fza;2&CJ?eo)>zBILl8Mf;)m&1#4=l5VkoJ~VP-Zw!vrXZnCw1TmbVqx*a_7!TlXr$Q7{^Hm%;II|tKQn~V*?ym?NYAJabSC|iip2cEQ@%}&V#xcn+5OhtaE48`VUFq+y@ z5$1|ij`O87@VaSZ$Krmo_Rgu3rsU%j$5f7Xj<=qPyB12da*SzTE4{ftmn!}N^O#7 z+!ouIZHYHzTAEwhve-1daKa9VRZcn~ft14Kb`#q!G*FX=x@;sLsp9QpQdQYj$+4C5 zKZ2mw6GWe}(^XhTZL{OlJGa|HSJW~HFcy}1-F{9kH_X*5{HP>bbCDU|00yS(u^|_M zWtp{j?p$va_GQ4ns3d+x*Kk;d_^6Ckkgs^eMlp9B5qAgK_)hxRyw%0ry@qz7ms)ev z$HP2*iLj$px*`Xj4=67t%j1e)Q5?#ZA#1J7H9`S^=E;_L;RdBrnQAJO!tXkQiJ~N5 zKn90~c;~)E0X0ZC*!0<0TYnY0!@j+jLD(d*pbQt6ktWp}#c}^B!k>UpK&2t%`#Nrk z8&T&{9LP?ZHf40Xy39|p`xM@y36X#*?ozsSQT@0VEIo1{-kV&23*tLK_>vuE<167* zM1X_bAzxK8oOT@EtkaS_=_+)p92t^m}z zWng6tzo*mD6K!!Q z#t}U4c2gtPYOz+cB~Q6sb^MV|$h5H=Fl)I@bJS#hU?o1eqf1#waaTnlOLeSHJ4D?9 z1}-ZMlnr;uV6>fH)okKAKMX2!E-ayqUx1~Vuz$a}I3 zxk`Iziq(yp+D@Sgm+z`qV+ev|h|J?$^c4wn3m1|yQtln>fOre-K;G%~fMlF*jVkKV zsDum2RUVFzKD`bfT^PbsxBdXw5=EqW@Febt=4`eVMgl$@%aNUc46BRao*X!`wYki( z8*Q|lma)lwA@t(fEQU-Xpw3VE3J@8Rpp!nfTNC!AWcm~eDk;MbcF-w-7qkuBRf7v& zeCa|P`VRFPH6X_$EbTk6!jN=)Md_%60?=7C6%-%W6x%sb$t70zY((;M+@E*iGSE;W zLFmxew{SqDR{*^um6+gCii9AEVwm)6iYh~1l?cdSR=J+u31(%A!L0JKYR`G%Q^e^5 ze@AP3Cq5%J&ULERlga%+@r1j;MOB&WrmF5k*pP5|w8k~dATpRVc&ACn*pfuowq$WY zTJpu4?xGZBc#rAc{C>zFb}M8hYW&`uvl^bZv*yo(&OV6hLz)dk@%2-zJbd>D}a@upa~@ zZ%-vviCOZiI835M0ja1&U-4MoD@Z*vwl6i;M|Apj2?F zS?VV)FE5cNWAVL-xN(R)XeeAs9fL{=g8fBHlK^#PPy!uMw`Kw6HZieCnfgu*%`q*p zg#KJj62ge2Wz}7ml;C4S;N857sUX9-!16}!71q3vPV55L#xyubVl|<4e=VW(nOIix z-M8UeK)(=D1eVcx4RubPl4d-O%g(Yo8Wi!aEq48NbPCP@~g{*J1X3s3zt4^UsNHJqC-R77HH)$z&)^zy|LJm#ZF6<0P--T z6c+*)ZVanICiqNkc<1rscgF8na%0C}d=OCpT;E4xjG~@w*I@!*0hx1hE$@j4$g;x9 z+!`d0jPzH&d>p%jOxL9R(mJ7bGIV};&1r7%T&An$NPXC3W9Q*HMkrMN{;_4o?WG|FDPHxAYkoehMRkxLdhf z)Ry#tQ|w+)L&Yd)aa$*3QaF>2$$^m+E{tStoB@N=m|qjh;S8NNNnpqks;uh!9qJ+0 zCi|!M2J#M z+dIeMu3p%Iri|*G3RBrssX=fX7A2i*uE!-a0B2&&*%WApnl^2^3(FkpL;;ty98^;0 zabSYPQeS07wTx<~)KJBzBxdM=F1A?6D0J$MZsn9{lYk}w;yw}rpk|0KNZkV=$Ic5= z^*|bKReZ{#5az6sg$QRw{h~_97tEv_=82nBf*4GqiULM)ya!U0cF;OQ^8sZ-DDrT~ zO5kBgtX5BXmk7~LuA9QCWY;}YqS~mhqQHpda1lKLerRFdl@~msV;XS_kTNubVJ9=V z41wR+QeWFrZXX-nNbKEZV73`1ALa5C!$@(ygO?~4NNkZyXCoz0m-8T2P8b@|0$sDz z1HuJ}TXrZE0O4V%PYc-`F5Z)ylWHMyFq5JX0ksN;bu>9K$d4~J$URp)UEm{+^6i=t z7%S9W9Jy;o3>U9fP|fQbxl4v9IWXx!BqaKM8&mp(G!vQrBJY5Hwxrt_Fcyg(A>6u< zgR^3Fg}W-bLz^0NxQwYOi8aY(TGEga=(3lcn<2LsQ^x=yfI=wXV}b%5uSOKPPz5I` z`$}D%3++nSZ|kHfU18ygQdL4ivrSoN{?MxHMjZ!SctzU+u4z2bP2OC`kwyL1U>~rs z7D}ho;<`@Ac=4eV`I=DCf=E-0p-wh|%s449MERB*log&wfb!?OOhKY7z+?n675;!- ztxQHpf0YNxb(=f4zZ+IASr@rM7CW8F6PPoBT|_d z_Fy#zh7Pv97uwv19NLpT%2#W>6mn}_JdUil6?YJ>VJvK?Hs$AMPvp3?2uBbYTP;+} z^<6MG&{;?c8m`L>b==o3l3jpF@q)ZgwO`K+11$apYm57`ZCtxU&TU5sLCmbHL*Rz4 zp_zU}?Qi>#pH9gFhyZ2#F+P=qm(fXppf?~4FTO9h zOvvT<`T(ag>0xR6?Ij^EC^9f{JzhDwPk3~AmtDf?w6fX5PM6IMk%Lx(r8t7a5%ZKH zK09H%Y;5mW20m(hS~Z*e&yiHL~?yU$g5cW#(pjSsBA}5k@#E>FZNlld41FB(rmuX8h;_GTT*MapY zeuGt2Pg4iHd=3z8;M1r53pW?}Y`8d#PJ4v=CjxU8gdj9JgLI2 zQ21Ti+u*5mX5cweM(=QDdc{-}^HbO-MS#UelFmdSKr(w(w@h};e( zbW@&R1(r(o9UY`d*=j822xX0uB~%&Or7U(bY?c-s)S^UXNCTSnR^yX`(b{Nr&42;b zwf&>DwF3}4U7NB6L3xRilA4O9Rc;g|9y^Ei)#(q~Ckh@!P)@nFLl2)DWRQ^HBGK0m zQu{&#KbQ5!*5@e;U$1EuW->h6%y=mtQ13KV1h>a09)9d z5Cr7iZM;JRVcVIOFfQH^iisC*YRX2HBqSOWE7}nZZqKSaU%IocT8J}i23hjWoF6Jx zxKZpA8#v)Kyr8U!g+b&|U?8;d1azr9?g8-aEiE`k9ZSC2P|(S|f`Gie1Czc>3Zk_l zpzFhC5bgD;v%Oi*jlUxHf7c)I%-tww^VOkR7lJTzF95;tF{UU0^}(1FrHb6 z!!`sZ4e!&xji=?s;or%>{Gdr8C8&zimgJDUGfrRh&)=?#{!`jLZMz_pi%Naki#R3{ zXD+E-VDwZMELb`eCF&06)5apXS_YRhdV|aQL%o(DJ$!^>BX^3H0;5(+yS|GhNgu?% zxl6~VI+V4fVOxa1KJsNKn1a=qBfc?5gt~yRG_|Gi4NMWtk;)^9&%$!&W12h$t^S)f zX!W<%;;gjn9JAzYm##oP{^rR~$&|Ik(rV)bO$v~cOMGG*R*$B}Mjn}gppT0c!}_KR zPo~;T66+S@X%x}z<$MxC6L~s?rdv)rRoW5%%R!*(==1^?!NK6L2v@>VqVkraw-pSO z`ox1wCO0l_{ju$(>TrWv#ui>U1yYjBBa}^BqiC1c>Of-@9~p+~*NRI~_!=aXzC4*Y zAz^w;+NYD9WTAw1ah4>24s2ul5-}?FwuDG7J!T`&B(gXdSc0HBuma6cG(2FqNmbW zVc(IUIS;#|Wh9-0jGk%l7&U2(m^v2=BLRN*~xNJpG*G@?rp6T;jOng8! zFjy0G;2yuItI=OmU@8|bpj5Em4jOs9CS~8_N~e*eWfW=?3#)bZuuc`=+8^M#=Tcpn zqsSQyVx=u~LaKZ=)?_**HdT9`qcm$lxCEyMfsFRI1Nk6_*O4TVUFy5rVGMUTk4AMr z)S0QAL}|Bq!ksutcD|Y++EZxAAnEtg6Ye1gB!xLu;@0F5&RE)}oSJnD5pWK0=r3j! z(lVKh_K7uS(Cjd%$B5jv`z%CY6c>@cNk%-UBaw>%V0t`~!9X9E9jMKGatf(Fr|oL@t&yEo9XkS(R? zXi4C#MM1X(7JFaX*R!}bAT1R-)J}{Cl9q{b zledzbS(833&2uACj#2?#A`B}Mnh@)Y%4Pv2C@Yv+QLVqbUH@48Nanh=;kJk!W$_eEY+6l;tg;N`)0r`_bIpx+TP}3<@L^)2PB2bo5g3? zl<1#NP3W93b-eIrxi6=Xr#7SWrN1H*8;o!IBY@JXm=_=mz`u)&U~sXL^6M7}6=^a~ zE(%>e^M@=jchv29Q^ei|-A0q@yLM#Y8b~ z@CF8WlH%uZ3lTvPb(oEE6|aO6Asv@P`3A?0SX4yD$nN33w!fMvKF~}X?=7^yQQAj} zU^uCkVU0;#b!2NfLVHUqIr375q7dU{QV8t082}x0FgbNR%)bDb!8hbkJ z;6}cK8(eq`WsjhT?N%(vxk?t@cF%AO%ZLk^Z{V56yFc9fmf%3vH-)duw3*? zi8r?wRn$-}27YLCVOW$cK@M-@@o%XnH+&xdhKh<`Ed>mZb7 z$mLa{j;w-WoH`~)Cu9Y*Z;FyMD30y+aru96SC^gZc!@URJ^DZYX72x^?kQV#DO`8# z7Ep_!vJwsxfEb}Kc~Jr}PBj3@pqI!gD~Tp3^7P`6Ge4+Y+P&`wDV14=M+{Kb96RON z46rmcHQRCTP&OnfCGzBc%0D2~6$e1ze^3Y5Uj8Q{rK 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

    8+XRkCL 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򊗿r9Yp+qOp;ObZEo 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 literal 0 HcmV?d00001 diff --git a/BMS_Testbench/BMS_Software_V1/Debug/Core/Src/stm32f3xx_hal_msp.su b/BMS_Testbench/BMS_Software_V1/Debug/Core/Src/stm32f3xx_hal_msp.su new file mode 100644 index 0000000..cd6ab1b --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Debug/Core/Src/stm32f3xx_hal_msp.su @@ -0,0 +1,7 @@ +../Core/Src/stm32f3xx_hal_msp.c:63:6:HAL_MspInit 16 static +../Core/Src/stm32f3xx_hal_msp.c:85:6:HAL_CAN_MspInit 48 static +../Core/Src/stm32f3xx_hal_msp.c:124:6:HAL_CAN_MspDeInit 16 static +../Core/Src/stm32f3xx_hal_msp.c:155:6:HAL_I2C_MspInit 56 static +../Core/Src/stm32f3xx_hal_msp.c:223:6:HAL_I2C_MspDeInit 16 static +../Core/Src/stm32f3xx_hal_msp.c:274:6:HAL_SPI_MspInit 48 static +../Core/Src/stm32f3xx_hal_msp.c:311:6:HAL_SPI_MspDeInit 16 static diff --git a/BMS_Testbench/BMS_Software_V1/Debug/Core/Src/stm32f3xx_it.d b/BMS_Testbench/BMS_Software_V1/Debug/Core/Src/stm32f3xx_it.d new file mode 100644 index 0000000..c75aeef --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Debug/Core/Src/stm32f3xx_it.d @@ -0,0 +1,62 @@ +Core/Src/stm32f3xx_it.o: ../Core/Src/stm32f3xx_it.c ../Core/Inc/main.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h \ + ../Core/Inc/stm32f3xx_hal_conf.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h \ + ../Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h \ + ../Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h \ + ../Drivers/CMSIS/Include/core_cm4.h \ + ../Drivers/CMSIS/Include/cmsis_version.h \ + ../Drivers/CMSIS/Include/cmsis_compiler.h \ + ../Drivers/CMSIS/Include/cmsis_gcc.h \ + ../Drivers/CMSIS/Include/mpu_armv7.h \ + ../Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h \ + ../Core/Inc/stm32f3xx_it.h +../Core/Inc/main.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h: +../Core/Inc/stm32f3xx_hal_conf.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h: +../Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h: +../Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h: +../Drivers/CMSIS/Include/core_cm4.h: +../Drivers/CMSIS/Include/cmsis_version.h: +../Drivers/CMSIS/Include/cmsis_compiler.h: +../Drivers/CMSIS/Include/cmsis_gcc.h: +../Drivers/CMSIS/Include/mpu_armv7.h: +../Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h: +../Core/Inc/stm32f3xx_it.h: diff --git a/BMS_Testbench/BMS_Software_V1/Debug/Core/Src/stm32f3xx_it.o b/BMS_Testbench/BMS_Software_V1/Debug/Core/Src/stm32f3xx_it.o new file mode 100644 index 0000000000000000000000000000000000000000..9ddf4a7de23b9a0c21784e21258c4079359a90db GIT binary patch literal 893384 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

    9B{^hk_fyE)At?2 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 z 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 literal 0 HcmV?d00001 diff --git a/BMS_Testbench/BMS_Software_V1/Debug/Core/Src/syscalls.su b/BMS_Testbench/BMS_Software_V1/Debug/Core/Src/syscalls.su new file mode 100644 index 0000000..50b547a --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Debug/Core/Src/syscalls.su @@ -0,0 +1,18 @@ +../Core/Src/syscalls.c:44:6:initialise_monitor_handles 4 static +../Core/Src/syscalls.c:48:5:_getpid 4 static +../Core/Src/syscalls.c:53:5:_kill 16 static +../Core/Src/syscalls.c:61:6:_exit 16 static +../Core/Src/syscalls.c:67:27:_read 32 static +../Core/Src/syscalls.c:80:27:_write 32 static +../Core/Src/syscalls.c:92:5:_close 16 static +../Core/Src/syscalls.c:99:5:_fstat 16 static +../Core/Src/syscalls.c:106:5:_isatty 16 static +../Core/Src/syscalls.c:112:5:_lseek 24 static +../Core/Src/syscalls.c:120:5:_open 12 static +../Core/Src/syscalls.c:128:5:_wait 16 static +../Core/Src/syscalls.c:135:5:_unlink 16 static +../Core/Src/syscalls.c:142:5:_times 16 static +../Core/Src/syscalls.c:148:5:_stat 16 static +../Core/Src/syscalls.c:155:5:_link 16 static +../Core/Src/syscalls.c:163:5:_fork 8 static +../Core/Src/syscalls.c:169:5:_execve 24 static diff --git a/BMS_Testbench/BMS_Software_V1/Debug/Core/Src/sysmem.d b/BMS_Testbench/BMS_Software_V1/Debug/Core/Src/sysmem.d new file mode 100644 index 0000000..74fecf9 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Debug/Core/Src/sysmem.d @@ -0,0 +1 @@ +Core/Src/sysmem.o: ../Core/Src/sysmem.c diff --git a/BMS_Testbench/BMS_Software_V1/Debug/Core/Src/sysmem.o b/BMS_Testbench/BMS_Software_V1/Debug/Core/Src/sysmem.o new file mode 100644 index 0000000000000000000000000000000000000000..d92b19739e6eabae457cd1136f19ef57e208ecb8 GIT binary patch literal 46592 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⋘jtv@Wk-`GuTg<$jC7fdO(9yD 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 Ly|+}SGqy3d7A+(yv{))4Wh+U@5<-;r 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 z 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�r4F{5;E#h3H^;tZL{$e_nua62N{c?%#ow>)eq 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

    03OI;kU0FZL?kN=!NC=b><~ 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
    gzP4lepVMP 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�RWBk{f7e0mwUSS$7NZnv| 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
    G7?Cjt~$@iUy)27_w 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�V?V|9^0tdolLBnmC4o@nUMwF!ps&em_TFDRZ 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≥)Cg}mL(==l`M;!$8N{0fK614$6M&MEx5 zQ2N@oIcKb8lV`O-&1EMwh-5fbfYY`71^Bew5}mSqB4B4u#;0RAR|@nc73*< zcM8o5RMJK5tE{uI{FkmmCf$O+JtlcRo9$q*sZzJ@zWeL_-S_W5AqN=7)1&T6_=HK| zN_6YwGSI$Z%XFxxZ|*NY{rnw_?8ItpS++qEvd}9G;UWrAj9$`!`VyfX)qkt6Plm`= zVQ#a^*^cPlWAmF$mwDa8x3e>@Ap~-VdftMp@#!Q>A>za%P=AP77pKdY>D&UL zNJoJu8tvpq6HFtpty<>M=pTPEkp@UU2+}Yl$33Z};UXi+vDkCf(&IFPL&d&aKP{mA zgH%IgaaEzQG_R~Jf_DF=vh=}ZxkcTYi4j-F&c1jt(pDyj5+Z`;cE6zU_J4?eMb$vc$R+#`yo$E$y8kT%|QaAe}L8c9O)E z;5_#g&a>EgS*7BxDckBA_MVue-1EQZjrdlRlbqy<3Di#USwZ6X<>YhuYj zD!q=uo}_h=&!u1#VGJq7)fy7Z1k(a)EC6>m@P&l1$*lFX1RNRbq^Y$MV*#*TT6kvn z`#o*kswrcQW1*p(UkGZ<2Dj$Q(&!g7sfKB=X{SMbp7$Ab>0H-N4g(TOy^;6z(hGD% z0y7t5B#9|6^a3CoTrdW^cly^K8#aI%sHaJ6k5%e)s31;wOWLjhkH9)wHbgMTo+Pi)#8i3Z%RNlgy}8XFHU}16uK)CKHqaDnU97Bb36LJLJcTFWYP?>q;7`X4Q7oTp4d9tTFR)*;Cw;NqnjqubNR08p zO^;?B6$LDhAFjbV*jxi8DrI|GH1Y0!{Pz9#f1bSg_07jO@89|R1wslWZ6E9x7#o(C zTGpA_E;>nefbz>Nw7Jt+GC=A~>~Cn*R05FgrCROK#sHNZDSaUm@cY3jzyK�(0tm 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

    NKv#*0qv+tdOt&O@CB4{a(1PX<`@j0 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

    ^#tr$fceZbV+czLtOFw6n$Q?F{-(dKH( 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

    4BRv+HKMf8#U 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

    IFQCkW#xum*Cya3v ze4aGoQ_=V<#?rJ5_>@*uea-l2DcXPCXyUni-xxI+un&wIXd?Q;=%VxIOXCt+gT6A3 znvKzZZ5+~#4!$wo`5jW<8rRgKqwkD=9g2G28xaaOKNvA;YCjsw$DqxhjMg2|!_US; zpX28jW7eC<{MESQBm5j_K1C9Gkon|i=;2UvLz=!1GvE9f)ekoZZ;v*QFqhHVb)*@h zvE?Z91jgVTZEi`?_ZahfF6^=9u2?ZeovZf7>oauS^pu5 zJZ;|kXAJ3ObI*Ix-)eLC=@{qR=D#mQEB`j{c@>!-n>i4azA-mh z2S2}<7i^9mel-uKSa5h?H5LCO0{f9+oD-;Gl*qY(n_mej*=oeSqcGGJ#tVC+p-YS@ zqfzHliA$6yDM-3|6WnR4# zntsUK1|$Pc0Pw5zA$%K52+u_WsK(k(OiBKhIDXX zDOc~1z`Z<#hXy8YfO^LUX77ui;{q=-!tVIM>a$SfguqgY_Gbm&ejWXt9k{e43%un7 zOy%6bwSU0Rd4c=rI5(Kr;jAh765jODVxrGEnK@<5brUJ>}7*LklDe6b7qyDG3F znatIJmwtoHYXX}*iOg#Qr%~IzF7S9iVAlsG9*>_J0@JCkuMB+7lW}7p^(ZoL3e=Co zAZ`w9dq3*k5*YU~#`#RZp!fIfz^-G^=9hsRsfZn1J*gT$=TwiWLdkQh4}2IUudm*O z1p2n>45hHUt1lRdrXQ?+VX8$9YrjO7^>>oqM<(up`r~HOKDX@?AENwrKk-0}fBm1R zG-2US$k~3!Kj7aT4O*4kdfq_EV~jDhiyUvfN8i_p#wzHdBI3UuJnMFJ{Z_DTH#GZB zaGUY?`82q}cKBHnyy;+6`U+u)805FXTex{Y20uF=i+Ny8-CvM-M9q5ivmRZuA$<=g z)Lce-byCeu6ueHZ+3E`n>6DsvwnWKOYqs18jh$Yz?JLMUqb9o%Dx6hw--oDhPR$IRf&roBs1d-}&qP;0;ZCn$N4@o^^r#~6QM4<{I} zK8pg&jIXxGh)*%P&a#x51FuBm#a{B2t_u#t$fwNW!JFDoQ{l8bNHV8?LY-}=uV_`+ zc{wG)8C~?T&)kMS!JgHZqRgzNA7Nm#PudgEIk(fTFt?FBxi?Iy

    A_Ls*8hj1y_z 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%0D&JPvy*ao@%~Jyv`7Ekd3|$xOEc#E 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⪻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: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%0DH{? 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 z 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%0DD z=HKkV?(D~*9K*?+#f4nK_1wliJj_$P$Q!)Jr+mZD46-QDCp055CKE6@(=jV^vmlGH z3@foF>$4f#urqscAV+XKr*STqa5Xn^2lw+B&+-ay@gZOEJ-;#d;y|ZxjLJAn%v8+C z?99u;EWvWD%GzwimTb>%?8_k>%}Jce1zgT`+{)cN#FM%7Y+e9ce%$xurIogy*@ z<1-o4G7EFD0E@CTE3yXbu_;@#6MJ$1hjSdKat;@B6*qD__wgvt@G@`m0iW|7zcSd; zK%cOT!q`m2l+3_v%)>$~&a$k+zu1s1*p6M;k{|e;Ayx!Bg=aLzWfG=lCgxy17GX)2XEoMgWB$z!?9P51$}ybG zSzO2!T+eOX!^1qqi@d>me9AZc%pfZReL^!5V=@7gGaa)sHw&^D%diq_vOb%!4Lh?J z2XX|*a~kJz30HFycW^(C@hq?K79a8j-}4)TuL^Vu$Eb|M#7xDE%+9KA-U|zcA>! zK%X#-%vemw6im-w_$z@If2tTk4w3Ro4Jz*c%0{WmACnb zFZqGr8Df2)Q+P&WTqa>^W?~NJV-c2Qc~)Z`Hs;^#!0znFp&Y}>oW+G)!S&q6Jv_`) zyvQ58$ESS5&kV95&?ht_F(wl*InyyKbF(0eu?#D*ChM~q+psfxaUe%MF7|-$wZ}A~t@IAjV_{Kn|aE!`0Ow3fw$n4C^!YsjZtjgMK#FlK&ZtTk;9L-6b z$pu`_b==C`Jj9c{!0WurCw$FM{K-(80-Yi<2IDgs(=rQlu>gy*G%K#-?YvlDxA z0EcrNr*aM#a}_soJNNM@&+syD@&TXo9ltWz=0KmYjKbJV#FWgyY|O(#EY7m5!oS#% zE!d7-*@uHUiW515^SO*`xrMuUkSBPa*La7I`HCO;gCVyBIz?b~#$!^ZVP@uJe*Vr< ztibB5%O-5aj_kqy9LBMn!r5HJmE6F8xR*zGnwR)5@ADbo@(Y7*4fF}a$c)8=Ou_X0 zg}?GQ{=q+4nYGw}&DoY+*qehmk`p+c^SG32xS2b7fX8``S9zO{_>v#^oguabI)!I6 z#$^(wW+vufJ{Dm~mS;8AVPpQy4(!f;9Lh1A%voH>6#f!Ybdwj|_{LCQ# z1p0(#B*tU{CTBWkWo{N^F_vK^)?|G)V;gp6FAn4gj^{MaLk z7kHg_`Gl|ei9Z=?N1#(g#$bFVV_IfmE*4->mS#oPU_CZvYj$E!4&ZQ(<5bS!Vy@yw zZs$H8^j zI_GgI*Kjj;@&J$X9Ix^=AMqtW@H;~s4s;67XpGAwOwCNp!F(*jk}S_^ti#6qn;qDl z{Wz3kIGMA!kSn;J+qj2^d5RZ#gZKE9Z}^!(js*IIW+cXB0w!lVW@T;`WHFXuCDvqp zHe(xhW-kup2#)78&gBxW<|gjoejejlUg0f1R6ytM8;rzCSzJ= zVJ;S6QI=*!)?ht0Wovd~PY&R4j^k9$;bN}hMsDXm9_1Nc=1o4}bH3wO20I?;6P8gJ zn~9i`8JLZESct`0mR0x{8?pu4u`ByDG}Co8iS8?ZUsvI~225Jz$Xr*j^cat$|gClByA z&+#g6^ATV21HUuGsX(XjjK;W3!qm*f9L&ceEXne$#yV`wzuAG^*^fgxhLbsq3%P>p zxs7{xn5TG=H+YXv`G%hv_mAiR}CwYO_d6!T4nxFWSq0R<6MPv-dXELT`7Up6B7G-HxWDVA1 zQ?_O&_T&H#=QvK~94_W6Zsd0E<58aBW!~fiKIc1rWw3LBK4BS!v6+Y|nSt4uhlN<2 zWm$!Pu_0Tq9lNp*2XhoBat7yf8P{?Pckv)k@I0^a4j=OsKk^4do)2`2!03#}q)fxi z%*p)xouycT)mfKK*oqz5gZ(*-V>yMhxri&df&XwXkMJ}v@n7EOGrr{)2E7pI6NZr) ziwT*6>G=zPqU2ExWKc2XQ1Pa60F4Dc5i_ck%#_^Bk}8HXrdNKkz$4 zTnuyy&uEOxBuvdr%)xvt!jde{YOKS?{F@!vo&7kJV>p?!xR5Kjp4+&Ghk1$@d4u=( zlyCT%K`sUQgk~hhWCA8$C zSzh5SKI99&=Qjqw9Ox8|Q5lDcnTi>ioq1W9C0LGCS(}a6lI_`zeK~}qIf*m5fXlg# zTe+Kuc#;=*opaE{|t z&f#LN;zn-gJ|5*6Ugk|c;B&s?R|dNp=o6Mv7@LWhk{Otdd02?WS(a7!7aOt#+p#PA za4<)4B4=$#14c$lYnkvDjcPx*$Q8RXwUpU{lN zm`uRrOvkLu&4Mh(GOWa!tj}g_!_Mr*fgHi{oW{9a!qwcw9o)}jJj*M*#fN;s_x#4- zHv^r*F)HIQF;g)kvokLXvjoerDr>V5Te3a7u`h>kG$(N;7jQY(aVvN85Kr;~uk$XS z@HId2Cqvx|bc)CrjL&3D%Ph>r0xZhXtjHRy$EIw}PVC769L{l^$~j!jRouw!+{dFl z!^^zM2Yk+V{K{ar1AW3W3S%=7Q!)dyF%Ju|ILopM|6)V7U^{kY9}eayPUH;E=Q6J4 z7VhFfp5S?2;~hTcD}Lk;hP)H#6oJthk4c$^nVFOM`8!Lo0;{two3Ir-vIqNf7{_u7 zXLAu(as&V2ULN6TUgE#J&u4tgFARD&&?gKdGZqsv1=I5v{>tC@2mfSc)?x!TXIpk* zZw}%}PT+LT<5I5SX71zx9_Kk;EWn~H&5EqSdTh$p?8KfNz~LOnshq>bT*Zyt&V4+}GrY{3e8A^?$FB_b zD9|S?qcAoTF(orF8}qObi?b}N@GmxG3$|ld_TgZT;zZ8id@kc!Zs9H-Ya5filB{%RN?&T4l z<|Y2i`+UZ?{KBA50)4_TGGj3zQ!qV$;jjFSfACLMW-T^gbGBs{_U0gtyhjI)j za~2nJ1=n*M_wX=J@gi^V9-s0JKQqX)K%dZz#F$LLe;Lih{!Z9l2FfmgxBeOFv3$p~vu_|k` z5nHl7yRk2aa5N`zCKqry*KsR%^AJz+0v(kOv^0H#R4qK z(yYiDtjDHo%}(se0UXY8oXR;|%vIdT?cB$sJj2Vp$p?JScl^p=F9UtTG74ie5mPb) zvoQ|~u{g`J3jbn5wqQGUWgiaaC{E-I&gU|&z~JE}O6wJF*A+a~Q{R3TJZ>S8@aY;a(o$X#_-3u_Jr1KZkKFr*JkGaV0nKAMWK5p5`U~%lmxBxBSAOp8|ctFfwB?AyY6t zf8nqEjeqb@R%R_WU~{%*7xv~Lj^qSR=R7Xu8gAxJ9^i4F<5k|~BfjJZerJf!fllEW zjd7WTshNp6n2$wRlI2;Ab=a7Hvje-cABS=bCvz4Tas}6O8~5-qPw^se@E)J?4L>u; zmq4G;jKr8sz~oHFtjx`VEXFdd#G0(nW^BXG?8Si`!SS5Nxm?24+{7K+&tp8xE4;;r ze8Knp#^7HAox(9H<1jH(F(b1xFAK8-%dskJvk_aeJ-e|lhj26}aV8gVIoEM3ck>WW z@&d2(E}!rzWK7E}%*6sM%F?XJ8mz~rY|T#W$pIYBah%FIT+CJ6 z$nD(6qdddQyvYZA&UgIEVBZ6M!ZHeDGZ9lV1G6y?3$ZxMvI_rVL$+W$c4Z$9<|t0& z49@2=uH_c);z6F^d0yikKISWa={T&VC%qF`Ud#{sEotJOvQ}M&b%zl5-i86tj$Jj$@c8Vz8u2QoWz-2z~x-Wt=!E+Jjn~Z&bxfV z*Zjnv3>7@kDI#MqK9eymvoIG6uqaEjB5SZ7o3b@Ku_p&`ILC1+=WsDsaU-{LACK}3 zFY_iJ@HyY{D}#jy^a;x-jLk$$$qdZKJS@cGEXykViw)U=?bwxlIGCe2kux}-%ean&tGGw4r1V(2(CS@9CW=`hk?<~a%tj@Y@!dC3a9_-Iy9Lp)3 z%|%?v4g80Dd4#8ViU0CGpYbifFleYipD>KfSWL(iOwV8VD}Uo3{F9Ygiw)SEZP|sr zIfx@UfzvsUOSy)dxswNYoacCzxA}-K`GMaVB6Ofrct&GfCShu3Vh-kG5td|mR%0DD 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 literal 0 HcmV?d00001 diff --git a/BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.su b/BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.su new file mode 100644 index 0000000..c0e9f20 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.su @@ -0,0 +1,14 @@ +../Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c:137:19:HAL_DMA_Init 24 static +../Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c:199:19:HAL_DMA_DeInit 16 static +../Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c:281:19:HAL_DMA_Start 32 static +../Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c:328:19:HAL_DMA_Start_IT 32 static +../Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c:384:19:HAL_DMA_Abort 16 static +../Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c:422:19:HAL_DMA_Abort_IT 24 static +../Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c:468:19:HAL_DMA_PollForTransfer 32 static +../Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c:569:6:HAL_DMA_IRQHandler 24 static +../Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c:661:19:HAL_DMA_RegisterCallback 32 static +../Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c:712:19:HAL_DMA_UnRegisterCallback 24 static +../Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c:788:22:HAL_DMA_GetState 16 static +../Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c:799:10:HAL_DMA_GetError 16 static +../Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c:825:13:DMA_SetConfig 24 static +../Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c:859:13:DMA_CalcBaseAndBitshift 16 static diff --git a/BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.d b/BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.d new file mode 100644 index 0000000..d8bdd5e --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.d @@ -0,0 +1,60 @@ +Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o: \ + ../Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h \ + ../Core/Inc/stm32f3xx_hal_conf.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h \ + ../Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h \ + ../Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h \ + ../Drivers/CMSIS/Include/core_cm4.h \ + ../Drivers/CMSIS/Include/cmsis_version.h \ + ../Drivers/CMSIS/Include/cmsis_compiler.h \ + ../Drivers/CMSIS/Include/cmsis_gcc.h \ + ../Drivers/CMSIS/Include/mpu_armv7.h \ + ../Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h: +../Core/Inc/stm32f3xx_hal_conf.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h: +../Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h: +../Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h: +../Drivers/CMSIS/Include/core_cm4.h: +../Drivers/CMSIS/Include/cmsis_version.h: +../Drivers/CMSIS/Include/cmsis_compiler.h: +../Drivers/CMSIS/Include/cmsis_gcc.h: +../Drivers/CMSIS/Include/mpu_armv7.h: +../Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h: diff --git a/BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o b/BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.o new file mode 100644 index 0000000000000000000000000000000000000000..388232f03a2a741d8d4462671d470f08a6c05e49 GIT binary patch literal 894772 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¬OqTw-zedv=&@e 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�?jM&ar*Gwi0s+) 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

    )z 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 C;aaBv literal 0 HcmV?d00001 diff --git a/BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.su b/BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.su new file mode 100644 index 0000000..2714fa8 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.su @@ -0,0 +1,9 @@ +../Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c:144:19:HAL_EXTI_SetConfigLine 40 static +../Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c:265:19:HAL_EXTI_GetConfigLine 40 static +../Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c:358:19:HAL_EXTI_ClearConfigLine 40 static +../Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c:423:19:HAL_EXTI_RegisterCallback 32 static +../Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c:448:19:HAL_EXTI_GetHandle 16 static +../Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c:488:6:HAL_EXTI_IRQHandler 32 static +../Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c:525:10:HAL_EXTI_GetPending 40 static +../Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c:559:6:HAL_EXTI_ClearPending 32 static +../Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c:586:6:HAL_EXTI_GenerateSWI 32 static diff --git a/BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.d b/BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.d new file mode 100644 index 0000000..419d2db --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.d @@ -0,0 +1,60 @@ +Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o: \ + ../Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h \ + ../Core/Inc/stm32f3xx_hal_conf.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h \ + ../Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h \ + ../Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h \ + ../Drivers/CMSIS/Include/core_cm4.h \ + ../Drivers/CMSIS/Include/cmsis_version.h \ + ../Drivers/CMSIS/Include/cmsis_compiler.h \ + ../Drivers/CMSIS/Include/cmsis_gcc.h \ + ../Drivers/CMSIS/Include/mpu_armv7.h \ + ../Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h: +../Core/Inc/stm32f3xx_hal_conf.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h: +../Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h: +../Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h: +../Drivers/CMSIS/Include/core_cm4.h: +../Drivers/CMSIS/Include/cmsis_version.h: +../Drivers/CMSIS/Include/cmsis_compiler.h: +../Drivers/CMSIS/Include/cmsis_gcc.h: +../Drivers/CMSIS/Include/mpu_armv7.h: +../Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h: diff --git a/BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o b/BMS_Testbench/BMS_Software_V1/Debug/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.o new file mode 100644 index 0000000000000000000000000000000000000000..af4b25d690f5cdaed02230a0bdaed5414b95ff63 GIT binary patch literal 896588 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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F3xx_HAL_GPIO_H +#define __STM32F3xx_HAL_GPIO_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f3xx_hal_def.h" + +/** @addtogroup STM32F3xx_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 */ + + uint32_t Mode; /*!< Specifies the operating mode for the selected pins. + This parameter can be a value of @ref GPIO_mode */ + + 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 */ + + uint32_t Speed; /*!< Specifies the speed for the selected pins. + This parameter can be a value of @ref GPIO_speed */ + + uint32_t Alternate; /*!< Peripheral to be connected to the selected pins + This parameter can be a value of @ref GPIOEx_Alternate_function_selection */ +}GPIO_InitTypeDef; + +/** + * @brief GPIO Bit SET and Bit RESET enumeration + */ +typedef enum +{ + GPIO_PIN_RESET = 0U, + GPIO_PIN_SET +}GPIO_PinState; +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup GPIO_Exported_Constants GPIO Exported Constants + * @{ + */ +/** @defgroup GPIO_pins GPIO pins + * @{ + */ +#define GPIO_PIN_0 ((uint16_t)0x0001U) /* Pin 0 selected */ +#define GPIO_PIN_1 ((uint16_t)0x0002U) /* Pin 1 selected */ +#define GPIO_PIN_2 ((uint16_t)0x0004U) /* Pin 2 selected */ +#define GPIO_PIN_3 ((uint16_t)0x0008U) /* Pin 3 selected */ +#define GPIO_PIN_4 ((uint16_t)0x0010U) /* Pin 4 selected */ +#define GPIO_PIN_5 ((uint16_t)0x0020U) /* Pin 5 selected */ +#define GPIO_PIN_6 ((uint16_t)0x0040U) /* Pin 6 selected */ +#define GPIO_PIN_7 ((uint16_t)0x0080U) /* Pin 7 selected */ +#define GPIO_PIN_8 ((uint16_t)0x0100U) /* Pin 8 selected */ +#define GPIO_PIN_9 ((uint16_t)0x0200U) /* Pin 9 selected */ +#define GPIO_PIN_10 ((uint16_t)0x0400U) /* Pin 10 selected */ +#define GPIO_PIN_11 ((uint16_t)0x0800U) /* Pin 11 selected */ +#define GPIO_PIN_12 ((uint16_t)0x1000U) /* Pin 12 selected */ +#define GPIO_PIN_13 ((uint16_t)0x2000U) /* Pin 13 selected */ +#define GPIO_PIN_14 ((uint16_t)0x4000U) /* Pin 14 selected */ +#define GPIO_PIN_15 ((uint16_t)0x8000U) /* Pin 15 selected */ +#define GPIO_PIN_All ((uint16_t)0xFFFFU) /* All pins selected */ + +#define GPIO_PIN_MASK (0x0000FFFFU) /* PIN mask for assert test */ +/** + * @} + */ + +/** @defgroup GPIO_mode GPIO mode + * @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 GPIO speed + * @brief GPIO Output Maximum frequency + * @{ + */ +#define GPIO_SPEED_FREQ_LOW (0x00000000U) /*!< range up to 2 MHz, please refer to the product datasheet */ +#define GPIO_SPEED_FREQ_MEDIUM (0x00000001U) /*!< range 4 MHz to 10 MHz, please refer to the product datasheet */ +#define GPIO_SPEED_FREQ_HIGH (0x00000003U) /*!< range 10 MHz to 50 MHz, please refer to the product datasheet */ +/** + * @} + */ + + /** @defgroup GPIO_pull GPIO pull + * @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 Check 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 Clear 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 Check 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 Clear 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 Generate 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__)) + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @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) +#define TRIGGER_LEVEL (0x4uL << TRIGGER_MODE_Pos) +/** + * @} + */ + +/** @addtogroup GPIO_Private_Macros GPIO Private Macros + * @{ + */ +#define IS_GPIO_PIN_ACTION(ACTION) (((ACTION) == GPIO_PIN_RESET) || ((ACTION) == GPIO_PIN_SET)) + +#define IS_GPIO_PIN(__PIN__) (((((uint32_t)__PIN__) & GPIO_PIN_MASK) != 0x00U) &&\ + ((((uint32_t)__PIN__) & ~GPIO_PIN_MASK) == 0x00U)) + +#define IS_GPIO_MODE(__MODE__) (((__MODE__) == GPIO_MODE_INPUT) ||\ + ((__MODE__) == GPIO_MODE_OUTPUT_PP) ||\ + ((__MODE__) == GPIO_MODE_OUTPUT_OD) ||\ + ((__MODE__) == GPIO_MODE_AF_PP) ||\ + ((__MODE__) == GPIO_MODE_AF_OD) ||\ + ((__MODE__) == GPIO_MODE_IT_RISING) ||\ + ((__MODE__) == GPIO_MODE_IT_FALLING) ||\ + ((__MODE__) == GPIO_MODE_IT_RISING_FALLING) ||\ + ((__MODE__) == GPIO_MODE_EVT_RISING) ||\ + ((__MODE__) == GPIO_MODE_EVT_FALLING) ||\ + ((__MODE__) == GPIO_MODE_EVT_RISING_FALLING) ||\ + ((__MODE__) == GPIO_MODE_ANALOG)) + +#define IS_GPIO_SPEED(__SPEED__) (((__SPEED__) == GPIO_SPEED_FREQ_LOW) ||\ + ((__SPEED__) == GPIO_SPEED_FREQ_MEDIUM) ||\ + ((__SPEED__) == GPIO_SPEED_FREQ_HIGH)) + +#define IS_GPIO_PULL(__PULL__) (((__PULL__) == GPIO_NOPULL) ||\ + ((__PULL__) == GPIO_PULLUP) || \ + ((__PULL__) == GPIO_PULLDOWN)) +/** + * @} + */ + +/* Include GPIO HAL Extended module */ +#include "stm32f3xx_hal_gpio_ex.h" + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup GPIO_Exported_Functions GPIO Exported Functions + * @{ + */ + +/** @addtogroup GPIO_Exported_Functions_Group1 Initialization/de-initialization functions + * @brief Initialization and Configuration functions + * @{ + */ + +/* 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 + * @{ + */ + +/* 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); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F3xx_HAL_GPIO_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h new file mode 100644 index 0000000..f3b308c --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h @@ -0,0 +1,1522 @@ +/** + ****************************************************************************** + * @file stm32f3xx_hal_gpio_ex.h + * @author MCD Application Team + * @brief Header file of GPIO HAL Extended module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F3xx_HAL_GPIO_EX_H +#define __STM32F3xx_HAL_GPIO_EX_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f3xx_hal_def.h" + +/** @addtogroup STM32F3xx_HAL_Driver + * @{ + */ + +/** @defgroup GPIOEx GPIOEx + * @brief GPIO Extended HAL module driver + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/** @defgroup GPIOEx_Exported_Constants GPIOEx Exported Constants + * @{ + */ + +/** @defgroup GPIOEx_Alternate_function_selection GPIOEx Alternate function selection + * @{ + */ + +#if defined (STM32F302xC) +/*---------------------------------- STM32F302xC ------------------------------*/ +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00U) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00U) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00U) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00U) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00U) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01U) /* TIM2 Alternate Function mapping */ +#define GPIO_AF1_TIM15 ((uint8_t)0x01U) /* TIM15 Alternate Function mapping */ +#define GPIO_AF1_TIM16 ((uint8_t)0x01U) /* TIM16 Alternate Function mapping */ +#define GPIO_AF1_TIM17 ((uint8_t)0x01U) /* TIM17 Alternate Function mapping */ +#define GPIO_AF1_EVENTOUT ((uint8_t)0x01U) /* EVENTOUT Alternate Function mapping */ +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_TIM1 ((uint8_t)0x02U) /* TIM1 Alternate Function mapping */ +#define GPIO_AF2_TIM2 ((uint8_t)0x02U) /* TIM2 Alternate Function mapping */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02U) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02U) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM15 ((uint8_t)0x02U) /* TIM15 Alternate Function mapping */ +#define GPIO_AF2_COMP1 ((uint8_t)0x02U) /* COMP1 Alternate Function mapping */ +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TSC ((uint8_t)0x03U) /* TSC Alternate Function mapping */ +#define GPIO_AF3_TIM15 ((uint8_t)0x03U) /* TIM15 Alternate Function mapping */ + +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_TIM1 ((uint8_t)0x04U) /* TIM1 Alternate Function mapping */ +#define GPIO_AF4_TIM16 ((uint8_t)0x04U) /* TIM16 Alternate Function mapping */ +#define GPIO_AF4_TIM17 ((uint8_t)0x04U) /* TIM17 Alternate Function mapping */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04U) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04U) /* I2C2 Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05U) /* SPI1/I2S1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05U) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_SPI3 ((uint8_t)0x05U) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF5_I2S ((uint8_t)0x05U) /* I2S Alternate Function mapping */ +#define GPIO_AF5_I2S2ext ((uint8_t)0x05U) /* I2S2ext Alternate Function mapping */ +#define GPIO_AF5_IR ((uint8_t)0x05U) /* IR Alternate Function mapping */ +#define GPIO_AF5_UART4 ((uint8_t)0x05U) /* UART4 Alternate Function mapping */ +#define GPIO_AF5_UART5 ((uint8_t)0x05U) /* UART5 Alternate Function mapping */ +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_SPI2 ((uint8_t)0x06U) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06U) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_I2S3ext ((uint8_t)0x06U) /* I2S3ext Alternate Function mapping */ +#define GPIO_AF6_TIM1 ((uint8_t)0x06U) /* TIM1 Alternate Function mapping */ +#define GPIO_AF6_IR ((uint8_t)0x06U) /* IR Alternate Function mapping */ + +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_USART1 ((uint8_t)0x07U) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07U) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART3 ((uint8_t)0x07U) /* USART3 Alternate Function mapping */ +#define GPIO_AF7_COMP6 ((uint8_t)0x07U) /* COMP6 Alternate Function mapping */ +#define GPIO_AF7_CAN ((uint8_t)0x07U) /* CAN Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_COMP1 ((uint8_t)0x08U) /* COMP1 Alternate Function mapping */ +#define GPIO_AF8_COMP2 ((uint8_t)0x08U) /* COMP2 Alternate Function mapping */ +#define GPIO_AF8_COMP4 ((uint8_t)0x08U) /* COMP4 Alternate Function mapping */ +#define GPIO_AF8_COMP6 ((uint8_t)0x08U) /* COMP6 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_CAN ((uint8_t)0x09U) /* CAN Alternate Function mapping */ +#define GPIO_AF9_TIM1 ((uint8_t)0x09U) /* TIM1 Alternate Function mapping */ +#define GPIO_AF9_TIM15 ((uint8_t)0x09U) /* TIM15 Alternate Function mapping */ + +/** + * @brief AF 10 selection + */ +#define GPIO_AF10_TIM2 ((uint8_t)0xAU) /* TIM2 Alternate Function mapping */ +#define GPIO_AF10_TIM3 ((uint8_t)0xAU) /* TIM3 Alternate Function mapping */ +#define GPIO_AF10_TIM4 ((uint8_t)0xAU) /* TIM4 Alternate Function mapping */ +#define GPIO_AF10_TIM17 ((uint8_t)0xAU) /* TIM17 Alternate Function mapping */ +/** + * @brief AF 11 selection + */ +#define GPIO_AF11_TIM1 ((uint8_t)0x0BU) /* TIM1 Alternate Function mapping */ + +/** + * @brief AF 12 selection + */ +#define GPIO_AF12_TIM1 ((uint8_t)0xCU) /* TIM1 Alternate Function mapping */ + +/** + * @brief AF 14 selection + */ + +#define GPIO_AF14_USB ((uint8_t)0x0EU) /* USB Alternate Function mapping */ +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0FU) /* EVENTOUT Alternate Function mapping */ + +#define IS_GPIO_AF(AF) (((AF) <= (uint8_t)0x0CU) || ((AF) == (uint8_t)0x0EU) || ((AF) == (uint8_t)0x0FU)) +/*------------------------------------------------------------------------------------------*/ +#endif /* STM32F302xC */ + +#if defined (STM32F303xC) +/*---------------------------------- STM32F303xC ------------------------------*/ +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00U) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00U) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00U) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00U) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00U) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01U) /* TIM2 Alternate Function mapping */ +#define GPIO_AF1_TIM15 ((uint8_t)0x01U) /* TIM15 Alternate Function mapping */ +#define GPIO_AF1_TIM16 ((uint8_t)0x01U) /* TIM16 Alternate Function mapping */ +#define GPIO_AF1_TIM17 ((uint8_t)0x01U) /* TIM17 Alternate Function mapping */ +#define GPIO_AF1_EVENTOUT ((uint8_t)0x01U) /* EVENTOUT Alternate Function mapping */ +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_TIM1 ((uint8_t)0x02U) /* TIM1 Alternate Function mapping */ +#define GPIO_AF2_TIM2 ((uint8_t)0x02U) /* TIM2 Alternate Function mapping */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02U) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02U) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM8 ((uint8_t)0x02U) /* TIM8 Alternate Function mapping */ +#define GPIO_AF2_TIM15 ((uint8_t)0x02U) /* TIM15 Alternate Function mapping */ +#define GPIO_AF2_COMP1 ((uint8_t)0x02U) /* COMP1 Alternate Function mapping */ +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TSC ((uint8_t)0x03U) /* TSC Alternate Function mapping */ +#define GPIO_AF3_TIM8 ((uint8_t)0x03U) /* TIM8 Alternate Function mapping */ +#define GPIO_AF3_COMP7 ((uint8_t)0x03U) /* COMP7 Alternate Function mapping */ +#define GPIO_AF3_TIM15 ((uint8_t)0x03U) /* TIM15 Alternate Function mapping */ + +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_TIM1 ((uint8_t)0x04U) /* TIM1 Alternate Function mapping */ +#define GPIO_AF4_TIM8 ((uint8_t)0x04U) /* TIM8 Alternate Function mapping */ +#define GPIO_AF4_TIM16 ((uint8_t)0x04U) /* TIM16 Alternate Function mapping */ +#define GPIO_AF4_TIM17 ((uint8_t)0x04U) /* TIM17 Alternate Function mapping */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04U) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04U) /* I2C2 Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05U) /* SPI1/I2S1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05U) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_SPI3 ((uint8_t)0x05U) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF5_I2S ((uint8_t)0x05U) /* I2S Alternate Function mapping */ +#define GPIO_AF5_I2S2ext ((uint8_t)0x05U) /* I2S2ext Alternate Function mapping */ +#define GPIO_AF5_TIM8 ((uint8_t)0x05U) /* TIM8 Alternate Function mapping */ +#define GPIO_AF5_IR ((uint8_t)0x05U) /* IR Alternate Function mapping */ +#define GPIO_AF5_UART4 ((uint8_t)0x05U) /* UART4 Alternate Function mapping */ +#define GPIO_AF5_UART5 ((uint8_t)0x05U) /* UART5 Alternate Function mapping */ +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_SPI2 ((uint8_t)0x06U) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06U) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_I2S3ext ((uint8_t)0x06U) /* I2S3ext Alternate Function mapping */ +#define GPIO_AF6_TIM1 ((uint8_t)0x06U) /* TIM1 Alternate Function mapping */ +#define GPIO_AF6_TIM8 ((uint8_t)0x06U) /* TIM8 Alternate Function mapping */ +#define GPIO_AF6_IR ((uint8_t)0x06U) /* IR Alternate Function mapping */ + +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_USART1 ((uint8_t)0x07U) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07U) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART3 ((uint8_t)0x07U) /* USART3 Alternate Function mapping */ +#define GPIO_AF7_COMP3 ((uint8_t)0x07U) /* COMP3 Alternate Function mapping */ +#define GPIO_AF7_COMP5 ((uint8_t)0x07U) /* COMP5 Alternate Function mapping */ +#define GPIO_AF7_COMP6 ((uint8_t)0x07U) /* COMP6 Alternate Function mapping */ +#define GPIO_AF7_CAN ((uint8_t)0x07U) /* CAN Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_COMP1 ((uint8_t)0x08U) /* COMP1 Alternate Function mapping */ +#define GPIO_AF8_COMP2 ((uint8_t)0x08U) /* COMP2 Alternate Function mapping */ +#define GPIO_AF8_COMP3 ((uint8_t)0x08U) /* COMP3 Alternate Function mapping */ +#define GPIO_AF8_COMP4 ((uint8_t)0x08U) /* COMP4 Alternate Function mapping */ +#define GPIO_AF8_COMP5 ((uint8_t)0x08U) /* COMP5 Alternate Function mapping */ +#define GPIO_AF8_COMP6 ((uint8_t)0x08U) /* COMP6 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_CAN ((uint8_t)0x09U) /* CAN Alternate Function mapping */ +#define GPIO_AF9_TIM1 ((uint8_t)0x09U) /* TIM1 Alternate Function mapping */ +#define GPIO_AF9_TIM8 ((uint8_t)0x09U) /* TIM8 Alternate Function mapping */ +#define GPIO_AF9_TIM15 ((uint8_t)0x09U) /* TIM15 Alternate Function mapping */ + +/** + * @brief AF 10 selection + */ +#define GPIO_AF10_TIM2 ((uint8_t)0xAU) /* TIM2 Alternate Function mapping */ +#define GPIO_AF10_TIM3 ((uint8_t)0xAU) /* TIM3 Alternate Function mapping */ +#define GPIO_AF10_TIM4 ((uint8_t)0xAU) /* TIM4 Alternate Function mapping */ +#define GPIO_AF10_TIM8 ((uint8_t)0xAU) /* TIM8 Alternate Function mapping */ +#define GPIO_AF10_TIM17 ((uint8_t)0xAU) /* TIM17 Alternate Function mapping */ +/** + * @brief AF 11 selection + */ +#define GPIO_AF11_TIM1 ((uint8_t)0x0BU) /* TIM1 Alternate Function mapping */ +#define GPIO_AF11_TIM8 ((uint8_t)0x0BU) /* TIM8 Alternate Function mapping */ + +/** + * @brief AF 12 selection + */ +#define GPIO_AF12_TIM1 ((uint8_t)0xCU) /* TIM1 Alternate Function mapping */ + +/** + * @brief AF 14 selection + */ + +#define GPIO_AF14_USB ((uint8_t)0x0EU) /* USB Alternate Function mapping */ +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0FU) /* EVENTOUT Alternate Function mapping */ + +#define IS_GPIO_AF(AF) (((AF) <= (uint8_t)0x0CU) || ((AF) == (uint8_t)0x0EU) || ((AF) == (uint8_t)0x0FU)) +/*------------------------------------------------------------------------------------------*/ +#endif /* STM32F303xC */ + +#if defined (STM32F303xE) +/*---------------------------------- STM32F303xE ------------------------------*/ +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00U) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00U) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00U) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00U) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00U) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01U) /* TIM2 Alternate Function mapping */ +#define GPIO_AF1_TIM15 ((uint8_t)0x01U) /* TIM15 Alternate Function mapping */ +#define GPIO_AF1_TIM16 ((uint8_t)0x01U) /* TIM16 Alternate Function mapping */ +#define GPIO_AF1_TIM17 ((uint8_t)0x01U) /* TIM17 Alternate Function mapping */ +#define GPIO_AF1_EVENTOUT ((uint8_t)0x01U) /* EVENTOUT Alternate Function mapping */ + +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_TIM1 ((uint8_t)0x02U) /* TIM1 Alternate Function mapping */ +#define GPIO_AF2_TIM2 ((uint8_t)0x02U) /* TIM2 Alternate Function mapping */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02U) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02U) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM8 ((uint8_t)0x02U) /* TIM8 Alternate Function mapping */ +#define GPIO_AF2_TIM15 ((uint8_t)0x02U) /* TIM15 Alternate Function mapping */ +#define GPIO_AF2_COMP1 ((uint8_t)0x02U) /* COMP1 Alternate Function mapping */ +#define GPIO_AF2_I2C3 ((uint8_t)0x02U) /* I2C3 Alternate Function mapping */ +#define GPIO_AF2_TIM20 ((uint8_t)0x02U) /* TIM20 Alternate Function mapping */ + +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TSC ((uint8_t)0x03U) /* TSC Alternate Function mapping */ +#define GPIO_AF3_TIM8 ((uint8_t)0x03U) /* TIM8 Alternate Function mapping */ +#define GPIO_AF3_COMP7 ((uint8_t)0x03U) /* COMP7 Alternate Function mapping */ +#define GPIO_AF3_TIM15 ((uint8_t)0x03U) /* TIM15 Alternate Function mapping */ +#define GPIO_AF3_I2C3 ((uint8_t)0x03U) /* I2C3 Alternate Function mapping */ +#define GPIO_AF3_TIM20 ((uint8_t)0x03U) /* TIM20 Alternate Function mapping */ + +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_TIM1 ((uint8_t)0x04U) /* TIM1 Alternate Function mapping */ +#define GPIO_AF4_TIM8 ((uint8_t)0x04U) /* TIM8 Alternate Function mapping */ +#define GPIO_AF4_TIM16 ((uint8_t)0x04U) /* TIM16 Alternate Function mapping */ +#define GPIO_AF4_TIM17 ((uint8_t)0x04U) /* TIM17 Alternate Function mapping */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04U) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04U) /* I2C2 Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05U) /* SPI1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05U) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_SPI3 ((uint8_t)0x05U) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF5_I2S ((uint8_t)0x05U) /* I2S Alternate Function mapping */ +#define GPIO_AF5_I2S2ext ((uint8_t)0x05U) /* I2S2ext Alternate Function mapping */ +#define GPIO_AF5_TIM8 ((uint8_t)0x05U) /* TIM8 Alternate Function mapping */ +#define GPIO_AF5_IR ((uint8_t)0x05U) /* IR Alternate Function mapping */ +#define GPIO_AF5_UART4 ((uint8_t)0x05U) /* UART4 Alternate Function mapping */ +#define GPIO_AF5_UART5 ((uint8_t)0x05U) /* UART5 Alternate Function mapping */ +#define GPIO_AF5_SPI4 ((uint8_t)0x05U) /* SPI4 Alternate Function mapping */ + +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_SPI2 ((uint8_t)0x06U) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06U) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_I2S3ext ((uint8_t)0x06U) /* I2S3ext Alternate Function mapping */ +#define GPIO_AF6_TIM1 ((uint8_t)0x06U) /* TIM1 Alternate Function mapping */ +#define GPIO_AF6_TIM8 ((uint8_t)0x06U) /* TIM8 Alternate Function mapping */ +#define GPIO_AF6_IR ((uint8_t)0x06U) /* IR Alternate Function mapping */ +#define GPIO_AF6_TIM20 ((uint8_t)0x06U) /* TIM20 Alternate Function mapping */ + +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_USART1 ((uint8_t)0x07U) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07U) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART3 ((uint8_t)0x07U) /* USART3 Alternate Function mapping */ +#define GPIO_AF7_COMP3 ((uint8_t)0x07U) /* COMP3 Alternate Function mapping */ +#define GPIO_AF7_COMP5 ((uint8_t)0x07U) /* COMP5 Alternate Function mapping */ +#define GPIO_AF7_COMP6 ((uint8_t)0x07U) /* COMP6 Alternate Function mapping */ +#define GPIO_AF7_CAN ((uint8_t)0x07U) /* CAN Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_COMP1 ((uint8_t)0x08U) /* COMP1 Alternate Function mapping */ +#define GPIO_AF8_COMP2 ((uint8_t)0x08U) /* COMP2 Alternate Function mapping */ +#define GPIO_AF8_COMP3 ((uint8_t)0x08U) /* COMP3 Alternate Function mapping */ +#define GPIO_AF8_COMP4 ((uint8_t)0x08U) /* COMP4 Alternate Function mapping */ +#define GPIO_AF8_COMP5 ((uint8_t)0x08U) /* COMP5 Alternate Function mapping */ +#define GPIO_AF8_COMP6 ((uint8_t)0x08U) /* COMP6 Alternate Function mapping */ +#define GPIO_AF8_I2C3 ((uint8_t)0x08U) /* I2C3 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_CAN ((uint8_t)0x09U) /* CAN Alternate Function mapping */ +#define GPIO_AF9_TIM1 ((uint8_t)0x09U) /* TIM1 Alternate Function mapping */ +#define GPIO_AF9_TIM8 ((uint8_t)0x09U) /* TIM8 Alternate Function mapping */ +#define GPIO_AF9_TIM15 ((uint8_t)0x09U) /* TIM15 Alternate Function mapping */ + +/** + * @brief AF 10 selection + */ +#define GPIO_AF10_TIM2 ((uint8_t)0xAU) /* TIM2 Alternate Function mapping */ +#define GPIO_AF10_TIM3 ((uint8_t)0xAU) /* TIM3 Alternate Function mapping */ +#define GPIO_AF10_TIM4 ((uint8_t)0xAU) /* TIM4 Alternate Function mapping */ +#define GPIO_AF10_TIM8 ((uint8_t)0xAU) /* TIM8 Alternate Function mapping */ +#define GPIO_AF10_TIM17 ((uint8_t)0xAU) /* TIM17 Alternate Function mapping */ +/** + * @brief AF 11 selection + */ +#define GPIO_AF11_TIM1 ((uint8_t)0x0BU) /* TIM1 Alternate Function mapping */ +#define GPIO_AF11_TIM8 ((uint8_t)0x0BU) /* TIM8 Alternate Function mapping */ + +/** + * @brief AF 12 selection + */ +#define GPIO_AF12_TIM1 ((uint8_t)0xCU) /* TIM1 Alternate Function mapping */ +#define GPIO_AF12_FMC ((uint8_t)0xCU) /* FMC Alternate Function mapping */ +#define GPIO_AF12_SDIO ((uint8_t)0xCU) /* SDIO Alternate Function mapping */ + +/** + * @brief AF 14 selection + */ +#define GPIO_AF14_USB ((uint8_t)0x0EU) /* USB Alternate Function mapping */ + +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0FU) /* EVENTOUT Alternate Function mapping */ + +#define IS_GPIO_AF(AF) (((AF) <= (uint8_t)0x0CU) || ((AF) == (uint8_t)0x0EU) || ((AF) == (uint8_t)0x0FU)) +/*------------------------------------------------------------------------------------------*/ +#endif /* STM32F303xE */ + +#if defined (STM32F302xE) +/*---------------------------------- STM32F302xE ------------------------------*/ +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00U) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00U) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00U) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00U) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00U) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01U) /* TIM2 Alternate Function mapping */ +#define GPIO_AF1_TIM15 ((uint8_t)0x01U) /* TIM15 Alternate Function mapping */ +#define GPIO_AF1_TIM16 ((uint8_t)0x01U) /* TIM16 Alternate Function mapping */ +#define GPIO_AF1_TIM17 ((uint8_t)0x01U) /* TIM17 Alternate Function mapping */ +#define GPIO_AF1_EVENTOUT ((uint8_t)0x01U) /* EVENTOUT Alternate Function mapping */ + +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_TIM1 ((uint8_t)0x02U) /* TIM1 Alternate Function mapping */ +#define GPIO_AF2_TIM2 ((uint8_t)0x02U) /* TIM2 Alternate Function mapping */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02U) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02U) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM15 ((uint8_t)0x02U) /* TIM15 Alternate Function mapping */ +#define GPIO_AF2_COMP1 ((uint8_t)0x02U) /* COMP1 Alternate Function mapping */ +#define GPIO_AF2_I2C3 ((uint8_t)0x02U) /* I2C3 Alternate Function mapping */ + +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TSC ((uint8_t)0x03U) /* TSC Alternate Function mapping */ +#define GPIO_AF3_TIM15 ((uint8_t)0x03U) /* TIM15 Alternate Function mapping */ +#define GPIO_AF3_I2C3 ((uint8_t)0x03U) /* I2C3 Alternate Function mapping */ + +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_TIM1 ((uint8_t)0x04U) /* TIM1 Alternate Function mapping */ +#define GPIO_AF4_TIM16 ((uint8_t)0x04U) /* TIM16 Alternate Function mapping */ +#define GPIO_AF4_TIM17 ((uint8_t)0x04U) /* TIM17 Alternate Function mapping */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04U) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04U) /* I2C2 Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05U) /* SPI1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05U) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_SPI3 ((uint8_t)0x05U) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF5_I2S ((uint8_t)0x05U) /* I2S Alternate Function mapping */ +#define GPIO_AF5_I2S2ext ((uint8_t)0x05U) /* I2S2ext Alternate Function mapping */ +#define GPIO_AF5_IR ((uint8_t)0x05U) /* IR Alternate Function mapping */ +#define GPIO_AF5_UART4 ((uint8_t)0x05U) /* UART4 Alternate Function mapping */ +#define GPIO_AF5_UART5 ((uint8_t)0x05U) /* UART5 Alternate Function mapping */ +#define GPIO_AF5_SPI4 ((uint8_t)0x05U) /* SPI4 Alternate Function mapping */ + +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_SPI2 ((uint8_t)0x06U) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06U) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_I2S3ext ((uint8_t)0x06U) /* I2S3ext Alternate Function mapping */ +#define GPIO_AF6_TIM1 ((uint8_t)0x06U) /* TIM1 Alternate Function mapping */ +#define GPIO_AF6_IR ((uint8_t)0x06U) /* IR Alternate Function mapping */ + +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_USART1 ((uint8_t)0x07U) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07U) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART3 ((uint8_t)0x07U) /* USART3 Alternate Function mapping */ +#define GPIO_AF7_COMP6 ((uint8_t)0x07U) /* COMP6 Alternate Function mapping */ +#define GPIO_AF7_CAN ((uint8_t)0x07U) /* CAN Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_COMP1 ((uint8_t)0x08U) /* COMP1 Alternate Function mapping */ +#define GPIO_AF8_COMP2 ((uint8_t)0x08U) /* COMP2 Alternate Function mapping */ +#define GPIO_AF8_COMP4 ((uint8_t)0x08U) /* COMP4 Alternate Function mapping */ +#define GPIO_AF8_COMP6 ((uint8_t)0x08U) /* COMP6 Alternate Function mapping */ +#define GPIO_AF8_I2C3 ((uint8_t)0x08U) /* I2C3 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_CAN ((uint8_t)0x09U) /* CAN Alternate Function mapping */ +#define GPIO_AF9_TIM1 ((uint8_t)0x09U) /* TIM1 Alternate Function mapping */ +#define GPIO_AF9_TIM15 ((uint8_t)0x09U) /* TIM15 Alternate Function mapping */ + +/** + * @brief AF 10 selection + */ +#define GPIO_AF10_TIM2 ((uint8_t)0xAU) /* TIM2 Alternate Function mapping */ +#define GPIO_AF10_TIM3 ((uint8_t)0xAU) /* TIM3 Alternate Function mapping */ +#define GPIO_AF10_TIM4 ((uint8_t)0xAU) /* TIM4 Alternate Function mapping */ +#define GPIO_AF10_TIM17 ((uint8_t)0xAU) /* TIM17 Alternate Function mapping */ +/** + * @brief AF 11 selection + */ +#define GPIO_AF11_TIM1 ((uint8_t)0x0BU) /* TIM1 Alternate Function mapping */ + +/** + * @brief AF 12 selection + */ +#define GPIO_AF12_TIM1 ((uint8_t)0xCU) /* TIM1 Alternate Function mapping */ +#define GPIO_AF12_FMC ((uint8_t)0xCU) /* FMC Alternate Function mapping */ +#define GPIO_AF12_SDIO ((uint8_t)0xCU) /* SDIO Alternate Function mapping */ + +/** + * @brief AF 14 selection + */ +#define GPIO_AF14_USB ((uint8_t)0x0EU) /* USB Alternate Function mapping */ + +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0FU) /* EVENTOUT Alternate Function mapping */ + +#define IS_GPIO_AF(AF) (((AF) <= (uint8_t)0x0CU) || ((AF) == (uint8_t)0x0EU) || ((AF) == (uint8_t)0x0FU)) +/*------------------------------------------------------------------------------------------*/ +#endif /* STM32F302xE */ + +#if defined (STM32F398xx) +/*---------------------------------- STM32F398xx ------------------------------*/ +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00U) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00U) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00U) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00U) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00U) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01U) /* TIM2 Alternate Function mapping */ +#define GPIO_AF1_TIM15 ((uint8_t)0x01U) /* TIM15 Alternate Function mapping */ +#define GPIO_AF1_TIM16 ((uint8_t)0x01U) /* TIM16 Alternate Function mapping */ +#define GPIO_AF1_TIM17 ((uint8_t)0x01U) /* TIM17 Alternate Function mapping */ +#define GPIO_AF1_EVENTOUT ((uint8_t)0x01U) /* EVENTOUT Alternate Function mapping */ + +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_TIM1 ((uint8_t)0x02U) /* TIM1 Alternate Function mapping */ +#define GPIO_AF2_TIM2 ((uint8_t)0x02U) /* TIM2 Alternate Function mapping */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02U) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02U) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM8 ((uint8_t)0x02U) /* TIM8 Alternate Function mapping */ +#define GPIO_AF2_TIM15 ((uint8_t)0x02U) /* TIM15 Alternate Function mapping */ +#define GPIO_AF2_COMP1 ((uint8_t)0x02U) /* COMP1 Alternate Function mapping */ +#define GPIO_AF2_I2C3 ((uint8_t)0x02U) /* I2C3 Alternate Function mapping */ +#define GPIO_AF2_TIM20 ((uint8_t)0x02U) /* TIM20 Alternate Function mapping */ + +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TSC ((uint8_t)0x03U) /* TSC Alternate Function mapping */ +#define GPIO_AF3_TIM8 ((uint8_t)0x03U) /* TIM8 Alternate Function mapping */ +#define GPIO_AF3_COMP7 ((uint8_t)0x03U) /* COMP7 Alternate Function mapping */ +#define GPIO_AF3_TIM15 ((uint8_t)0x03U) /* TIM15 Alternate Function mapping */ +#define GPIO_AF3_I2C3 ((uint8_t)0x03U) /* I2C3 Alternate Function mapping */ +#define GPIO_AF3_TIM20 ((uint8_t)0x03U) /* TIM20 Alternate Function mapping */ + +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_TIM1 ((uint8_t)0x04U) /* TIM1 Alternate Function mapping */ +#define GPIO_AF4_TIM8 ((uint8_t)0x04U) /* TIM8 Alternate Function mapping */ +#define GPIO_AF4_TIM16 ((uint8_t)0x04U) /* TIM16 Alternate Function mapping */ +#define GPIO_AF4_TIM17 ((uint8_t)0x04U) /* TIM17 Alternate Function mapping */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04U) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04U) /* I2C2 Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05U) /* SPI1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05U) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_SPI3 ((uint8_t)0x05U) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF5_I2S ((uint8_t)0x05U) /* I2S Alternate Function mapping */ +#define GPIO_AF5_I2S2ext ((uint8_t)0x05U) /* I2S2ext Alternate Function mapping */ +#define GPIO_AF5_TIM8 ((uint8_t)0x05U) /* TIM8 Alternate Function mapping */ +#define GPIO_AF5_IR ((uint8_t)0x05U) /* IR Alternate Function mapping */ +#define GPIO_AF5_UART4 ((uint8_t)0x05U) /* UART4 Alternate Function mapping */ +#define GPIO_AF5_UART5 ((uint8_t)0x05U) /* UART5 Alternate Function mapping */ +#define GPIO_AF5_SPI4 ((uint8_t)0x05U) /* SPI4 Alternate Function mapping */ + +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_SPI2 ((uint8_t)0x06U) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06U) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_I2S3ext ((uint8_t)0x06U) /* I2S3ext Alternate Function mapping */ +#define GPIO_AF6_TIM1 ((uint8_t)0x06U) /* TIM1 Alternate Function mapping */ +#define GPIO_AF6_TIM8 ((uint8_t)0x06U) /* TIM8 Alternate Function mapping */ +#define GPIO_AF6_IR ((uint8_t)0x06U) /* IR Alternate Function mapping */ +#define GPIO_AF6_TIM20 ((uint8_t)0x06U) /* TIM20 Alternate Function mapping */ + +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_USART1 ((uint8_t)0x07U) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07U) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART3 ((uint8_t)0x07U) /* USART3 Alternate Function mapping */ +#define GPIO_AF7_COMP3 ((uint8_t)0x07U) /* COMP3 Alternate Function mapping */ +#define GPIO_AF7_COMP5 ((uint8_t)0x07U) /* COMP5 Alternate Function mapping */ +#define GPIO_AF7_COMP6 ((uint8_t)0x07U) /* COMP6 Alternate Function mapping */ +#define GPIO_AF7_CAN ((uint8_t)0x07U) /* CAN Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_COMP1 ((uint8_t)0x08U) /* COMP1 Alternate Function mapping */ +#define GPIO_AF8_COMP2 ((uint8_t)0x08U) /* COMP2 Alternate Function mapping */ +#define GPIO_AF8_COMP3 ((uint8_t)0x08U) /* COMP3 Alternate Function mapping */ +#define GPIO_AF8_COMP4 ((uint8_t)0x08U) /* COMP4 Alternate Function mapping */ +#define GPIO_AF8_COMP5 ((uint8_t)0x08U) /* COMP5 Alternate Function mapping */ +#define GPIO_AF8_COMP6 ((uint8_t)0x08U) /* COMP6 Alternate Function mapping */ +#define GPIO_AF8_I2C3 ((uint8_t)0x08U) /* I2C3 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_CAN ((uint8_t)0x09U) /* CAN Alternate Function mapping */ +#define GPIO_AF9_TIM1 ((uint8_t)0x09U) /* TIM1 Alternate Function mapping */ +#define GPIO_AF9_TIM8 ((uint8_t)0x09U) /* TIM8 Alternate Function mapping */ +#define GPIO_AF9_TIM15 ((uint8_t)0x09U) /* TIM15 Alternate Function mapping */ + +/** + * @brief AF 10 selection + */ +#define GPIO_AF10_TIM2 ((uint8_t)0xAU) /* TIM2 Alternate Function mapping */ +#define GPIO_AF10_TIM3 ((uint8_t)0xAU) /* TIM3 Alternate Function mapping */ +#define GPIO_AF10_TIM4 ((uint8_t)0xAU) /* TIM4 Alternate Function mapping */ +#define GPIO_AF10_TIM8 ((uint8_t)0xAU) /* TIM8 Alternate Function mapping */ +#define GPIO_AF10_TIM17 ((uint8_t)0xAU) /* TIM17 Alternate Function mapping */ +/** + * @brief AF 11 selection + */ +#define GPIO_AF11_TIM1 ((uint8_t)0x0BU) /* TIM1 Alternate Function mapping */ +#define GPIO_AF11_TIM8 ((uint8_t)0x0BU) /* TIM8 Alternate Function mapping */ + +/** + * @brief AF 12 selection + */ +#define GPIO_AF12_TIM1 ((uint8_t)0xCU) /* TIM1 Alternate Function mapping */ +#define GPIO_AF12_FMC ((uint8_t)0xCU) /* FMC Alternate Function mapping */ +#define GPIO_AF12_SDIO ((uint8_t)0xCU) /* SDIO Alternate Function mapping */ + +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0FU) /* EVENTOUT Alternate Function mapping */ + +#define IS_GPIO_AF(AF) (((AF) <= (uint8_t)0x0CU) || ((AF) == (uint8_t)0x0FU)) +/*------------------------------------------------------------------------------------------*/ +#endif /* STM32F398xx */ + +#if defined (STM32F358xx) +/*---------------------------------- STM32F358xx -------------------------------------------*/ +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00U) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00U) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00U) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00U) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00U) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01U) /* TIM2 Alternate Function mapping */ +#define GPIO_AF1_TIM15 ((uint8_t)0x01U) /* TIM15 Alternate Function mapping */ +#define GPIO_AF1_TIM16 ((uint8_t)0x01U) /* TIM16 Alternate Function mapping */ +#define GPIO_AF1_TIM17 ((uint8_t)0x01U) /* TIM17 Alternate Function mapping */ +#define GPIO_AF1_EVENTOUT ((uint8_t)0x01U) /* EVENTOUT Alternate Function mapping */ +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_TIM1 ((uint8_t)0x02U) /* TIM1 Alternate Function mapping */ +#define GPIO_AF2_TIM2 ((uint8_t)0x02U) /* TIM2 Alternate Function mapping */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02U) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02U) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM8 ((uint8_t)0x02U) /* TIM8 Alternate Function mapping */ +#define GPIO_AF2_TIM15 ((uint8_t)0x02U) /* TIM15 Alternate Function mapping */ +#define GPIO_AF2_COMP1 ((uint8_t)0x02U) /* COMP1 Alternate Function mapping */ +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TSC ((uint8_t)0x03U) /* TSC Alternate Function mapping */ +#define GPIO_AF3_TIM8 ((uint8_t)0x03U) /* TIM8 Alternate Function mapping */ +#define GPIO_AF3_COMP7 ((uint8_t)0x03U) /* COMP7 Alternate Function mapping */ +#define GPIO_AF3_TIM15 ((uint8_t)0x03U) /* TIM15 Alternate Function mapping */ + +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_TIM1 ((uint8_t)0x04U) /* TIM1 Alternate Function mapping */ +#define GPIO_AF4_TIM8 ((uint8_t)0x04U) /* TIM8 Alternate Function mapping */ +#define GPIO_AF4_TIM16 ((uint8_t)0x04U) /* TIM16 Alternate Function mapping */ +#define GPIO_AF4_TIM17 ((uint8_t)0x04U) /* TIM17 Alternate Function mapping */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04U) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04U) /* I2C2 Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05U) /* SPI1/I2S1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05U) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_SPI3 ((uint8_t)0x05U) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF5_I2S ((uint8_t)0x05U) /* I2S Alternate Function mapping */ +#define GPIO_AF5_I2S2ext ((uint8_t)0x05U) /* I2S2ext Alternate Function mapping */ +#define GPIO_AF5_TIM8 ((uint8_t)0x05U) /* TIM8 Alternate Function mapping */ +#define GPIO_AF5_IR ((uint8_t)0x05U) /* IR Alternate Function mapping */ +#define GPIO_AF5_UART4 ((uint8_t)0x05U) /* UART4 Alternate Function mapping */ +#define GPIO_AF5_UART5 ((uint8_t)0x05U) /* UART5 Alternate Function mapping */ +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_SPI2 ((uint8_t)0x06U) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06U) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_I2S3ext ((uint8_t)0x06U) /* I2S3ext Alternate Function mapping */ +#define GPIO_AF6_TIM1 ((uint8_t)0x06U) /* TIM1 Alternate Function mapping */ +#define GPIO_AF6_TIM8 ((uint8_t)0x06U) /* TIM8 Alternate Function mapping */ +#define GPIO_AF6_IR ((uint8_t)0x06U) /* IR Alternate Function mapping */ + +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_USART1 ((uint8_t)0x07U) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07U) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART3 ((uint8_t)0x07U) /* USART3 Alternate Function mapping */ +#define GPIO_AF7_COMP3 ((uint8_t)0x07U) /* COMP3 Alternate Function mapping */ +#define GPIO_AF7_COMP5 ((uint8_t)0x07U) /* COMP5 Alternate Function mapping */ +#define GPIO_AF7_COMP6 ((uint8_t)0x07U) /* COMP6 Alternate Function mapping */ +#define GPIO_AF7_CAN ((uint8_t)0x07U) /* CAN Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_COMP1 ((uint8_t)0x08U) /* COMP1 Alternate Function mapping */ +#define GPIO_AF8_COMP2 ((uint8_t)0x08U) /* COMP2 Alternate Function mapping */ +#define GPIO_AF8_COMP3 ((uint8_t)0x08U) /* COMP3 Alternate Function mapping */ +#define GPIO_AF8_COMP4 ((uint8_t)0x08U) /* COMP4 Alternate Function mapping */ +#define GPIO_AF8_COMP5 ((uint8_t)0x08U) /* COMP5 Alternate Function mapping */ +#define GPIO_AF8_COMP6 ((uint8_t)0x08U) /* COMP6 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_CAN ((uint8_t)0x09U) /* CAN Alternate Function mapping */ +#define GPIO_AF9_TIM1 ((uint8_t)0x09U) /* TIM1 Alternate Function mapping */ +#define GPIO_AF9_TIM8 ((uint8_t)0x09U) /* TIM8 Alternate Function mapping */ +#define GPIO_AF9_TIM15 ((uint8_t)0x09U) /* TIM15 Alternate Function mapping */ + +/** + * @brief AF 10 selection + */ +#define GPIO_AF10_TIM2 ((uint8_t)0xAU) /* TIM2 Alternate Function mapping */ +#define GPIO_AF10_TIM3 ((uint8_t)0xAU) /* TIM3 Alternate Function mapping */ +#define GPIO_AF10_TIM4 ((uint8_t)0xAU) /* TIM4 Alternate Function mapping */ +#define GPIO_AF10_TIM8 ((uint8_t)0xAU) /* TIM8 Alternate Function mapping */ +#define GPIO_AF10_TIM17 ((uint8_t)0xAU) /* TIM17 Alternate Function mapping */ +/** + * @brief AF 11 selection + */ +#define GPIO_AF11_TIM1 ((uint8_t)0x0BU) /* TIM1 Alternate Function mapping */ +#define GPIO_AF11_TIM8 ((uint8_t)0x0BU) /* TIM8 Alternate Function mapping */ + +/** + * @brief AF 12 selection + */ +#define GPIO_AF12_TIM1 ((uint8_t)0xCU) /* TIM1 Alternate Function mapping */ + +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0FU) /* EVENTOUT Alternate Function mapping */ + +#define IS_GPIO_AF(AF) (((AF) <= (uint8_t)0x0CU) || ((AF) == (uint8_t)0x0FU)) +/*------------------------------------------------------------------------------------------*/ +#endif /* STM32F358xx */ + +#if defined (STM32F373xC) +/*---------------------------------- STM32F373xC--------------------------------*/ +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00U) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00U) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00U) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00U) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00U) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01U) /* TIM2 Alternate Function mapping */ +#define GPIO_AF1_TIM15 ((uint8_t)0x01U) /* TIM15 Alternate Function mapping */ +#define GPIO_AF1_TIM16 ((uint8_t)0x01U) /* TIM16 Alternate Function mapping */ +#define GPIO_AF1_TIM17 ((uint8_t)0x01U) /* TIM17 Alternate Function mapping */ +#define GPIO_AF1_EVENTOUT ((uint8_t)0x01U) /* EVENTOUT Alternate Function mapping */ +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02U) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02U) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02U) /* TIM5 Alternate Function mapping */ +#define GPIO_AF2_TIM13 ((uint8_t)0x02U) /* TIM13 Alternate Function mapping */ +#define GPIO_AF2_TIM14 ((uint8_t)0x02U) /* TIM14 Alternate Function mapping */ +#define GPIO_AF2_TIM15 ((uint8_t)0x02U) /* TIM15 Alternate Function mapping */ +#define GPIO_AF2_TIM19 ((uint8_t)0x02U) /* TIM19 Alternate Function mapping */ + +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TSC ((uint8_t)0x03U) /* TSC Alternate Function mapping */ +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04U) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04U) /* I2C2 Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05U) /* SPI1/I2S1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05U) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_IR ((uint8_t)0x05U) /* IR Alternate Function mapping */ +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_SPI1 ((uint8_t)0x06U) /* SPI1/I2S1 Alternate Function mapping */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06U) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_IR ((uint8_t)0x06U) /* IR Alternate Function mapping */ +#define GPIO_AF6_CEC ((uint8_t)0x06U) /* CEC Alternate Function mapping */ +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_USART1 ((uint8_t)0x07U) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07U) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART3 ((uint8_t)0x07U) /* USART3 Alternate Function mapping */ +#define GPIO_AF7_CAN ((uint8_t)0x07U) /* CAN Alternate Function mapping */ +#define GPIO_AF7_CEC ((uint8_t)0x07U) /* CEC Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_COMP1 ((uint8_t)0x08U) /* COMP1 Alternate Function mapping */ +#define GPIO_AF8_COMP2 ((uint8_t)0x08U) /* COMP2 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_CAN ((uint8_t)0x09U) /* CAN Alternate Function mapping */ +#define GPIO_AF9_TIM12 ((uint8_t)0x09U) /* TIM12 Alternate Function mapping */ +#define GPIO_AF9_TIM13 ((uint8_t)0x09U) /* TIM13 Alternate Function mapping */ +#define GPIO_AF9_TIM14 ((uint8_t)0x09U) /* TIM14 Alternate Function mapping */ +#define GPIO_AF9_TIM15 ((uint8_t)0x09U) /* TIM15 Alternate Function mapping */ +/** + * @brief AF 10 selection + */ +#define GPIO_AF10_TIM2 ((uint8_t)0xAU) /* TIM2 Alternate Function mapping */ +#define GPIO_AF10_TIM3 ((uint8_t)0xAU) /* TIM3 Alternate Function mapping */ +#define GPIO_AF10_TIM4 ((uint8_t)0xAU) /* TIM4 Alternate Function mapping */ +#define GPIO_AF10_TIM12 ((uint8_t)0xAU) /* TIM12 Alternate Function mapping */ +#define GPIO_AF10_TIM17 ((uint8_t)0xAU) /* TIM17 Alternate Function mapping */ +/** + * @brief AF 11 selection + */ +#define GPIO_AF11_TIM19 ((uint8_t)0x0BU) /* TIM19 Alternate Function mapping */ + + +/** + * @brief AF 14 selection + */ +#define GPIO_AF14_USB ((uint8_t)0x0EU) /* USB Alternate Function mapping */ + +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0FU) /* EVENTOUT Alternate Function mapping */ + +#define IS_GPIO_AF(AF) (((AF) <= (uint8_t)0x0BU) || ((AF) == (uint8_t)0x0EU) || ((AF) == (uint8_t)0x0FU)) +/*------------------------------------------------------------------------------------------*/ +#endif /* STM32F373xC */ + + +#if defined (STM32F378xx) +/*---------------------------------------- STM32F378xx--------------------------------------*/ +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00U) /* RTC_50Hz Alternate Function mapping */ +#define GPIO_AF0_MCO ((uint8_t)0x00U) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00U) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00U) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00U) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01U) /* TIM2 Alternate Function mapping */ +#define GPIO_AF1_TIM15 ((uint8_t)0x01U) /* TIM15 Alternate Function mapping */ +#define GPIO_AF1_TIM16 ((uint8_t)0x01U) /* TIM16 Alternate Function mapping */ +#define GPIO_AF1_TIM17 ((uint8_t)0x01U) /* TIM17 Alternate Function mapping */ +#define GPIO_AF1_EVENTOUT ((uint8_t)0x01U) /* EVENTOUT Alternate Function mapping */ +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02U) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM4 ((uint8_t)0x02U) /* TIM4 Alternate Function mapping */ +#define GPIO_AF2_TIM5 ((uint8_t)0x02U) /* TIM5 Alternate Function mapping */ +#define GPIO_AF2_TIM13 ((uint8_t)0x02U) /* TIM13 Alternate Function mapping */ +#define GPIO_AF2_TIM14 ((uint8_t)0x02U) /* TIM14 Alternate Function mapping */ +#define GPIO_AF2_TIM15 ((uint8_t)0x02U) /* TIM15 Alternate Function mapping */ +#define GPIO_AF2_TIM19 ((uint8_t)0x02U) /* TIM19 Alternate Function mapping */ + +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TSC ((uint8_t)0x03U) /* TSC Alternate Function mapping */ +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04U) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04U) /* I2C2 Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05U) /* SPI1/I2S1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05U) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_IR ((uint8_t)0x05U) /* IR Alternate Function mapping */ + +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_SPI1 ((uint8_t)0x06U) /* SPI1/I2S1 Alternate Function mapping */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06U) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF6_IR ((uint8_t)0x06U) /* IR Alternate Function mapping */ +#define GPIO_AF6_CEC ((uint8_t)0x06U) /* CEC Alternate Function mapping */ + +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_USART1 ((uint8_t)0x07U) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07U) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART3 ((uint8_t)0x07U) /* USART3 Alternate Function mapping */ +#define GPIO_AF7_CAN ((uint8_t)0x07U) /* CAN Alternate Function mapping */ +#define GPIO_AF7_CEC ((uint8_t)0x07U) /* CEC Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_COMP1 ((uint8_t)0x08U) /* COMP1 Alternate Function mapping */ +#define GPIO_AF8_COMP2 ((uint8_t)0x08U) /* COMP2 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_CAN ((uint8_t)0x09U) /* CAN Alternate Function mapping */ +#define GPIO_AF9_TIM12 ((uint8_t)0x09U) /* TIM12 Alternate Function mapping */ +#define GPIO_AF9_TIM13 ((uint8_t)0x09U) /* TIM13 Alternate Function mapping */ +#define GPIO_AF9_TIM14 ((uint8_t)0x09U) /* TIM14 Alternate Function mapping */ +#define GPIO_AF9_TIM15 ((uint8_t)0x09U) /* TIM15 Alternate Function mapping */ + +/** + * @brief AF 10 selection + */ +#define GPIO_AF10_TIM2 ((uint8_t)0xAU) /* TIM2 Alternate Function mapping */ +#define GPIO_AF10_TIM3 ((uint8_t)0xAU) /* TIM3 Alternate Function mapping */ +#define GPIO_AF10_TIM4 ((uint8_t)0xAU) /* TIM4 Alternate Function mapping */ +#define GPIO_AF10_TIM12 ((uint8_t)0xAU) /* TIM12 Alternate Function mapping */ +#define GPIO_AF10_TIM17 ((uint8_t)0xAU) /* TIM17 Alternate Function mapping */ + +/** + * @brief AF 11 selection + */ +#define GPIO_AF11_TIM19 ((uint8_t)0x0BU) /* TIM19 Alternate Function mapping */ + +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0FU) /* EVENTOUT Alternate Function mapping */ + +#define IS_GPIO_AF(AF) (((AF) <= (uint8_t)0x0BU) || ((AF) == (uint8_t)0x0FU)) +/*------------------------------------------------------------------------------------------*/ +#endif /* STM32F378xx */ + +#if defined (STM32F303x8) +/*---------------------------------- STM32F303x8--------------------------------*/ +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_MCO ((uint8_t)0x00U) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00U) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00U) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00U) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01U) /* TIM2 Alternate Function mapping */ +#define GPIO_AF1_TIM15 ((uint8_t)0x01U) /* TIM15 Alternate Function mapping */ +#define GPIO_AF1_TIM16 ((uint8_t)0x01U) /* TIM16 Alternate Function mapping */ +#define GPIO_AF1_TIM17 ((uint8_t)0x01U) /* TIM17 Alternate Function mapping */ +#define GPIO_AF1_EVENTOUT ((uint8_t)0x01U) /* EVENTOUT Alternate Function mapping */ +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02U) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM1 ((uint8_t)0x02U) /* TIM1 Alternate Function mapping */ +#define GPIO_AF2_TIM15 ((uint8_t)0x02U) /* TIM15 Alternate Function mapping */ +#define GPIO_AF2_TIM16 ((uint8_t)0x02U) /* TIM16 Alternate Function mapping */ + +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TSC ((uint8_t)0x03U) /* TSC Alternate Function mapping */ + +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04U) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_TIM1 ((uint8_t)0x04U) /* TIM1 Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05U) /* SPI1 Alternate Function mapping */ +#define GPIO_AF5_IR ((uint8_t)0x05U) /* IR Alternate Function mapping */ +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_TIM1 ((uint8_t)0x06U) /* TIM1 Alternate Function mapping */ +#define GPIO_AF6_IR ((uint8_t)0x06U) /* IR Alternate Function mapping */ + +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_USART1 ((uint8_t)0x07U) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07U) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART3 ((uint8_t)0x07U) /* USART3 Alternate Function mapping */ +#define GPIO_AF7_GPCOMP6 ((uint8_t)0x07U) /* GPCOMP6 Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_GPCOMP2 ((uint8_t)0x08U) /* GPCOMP2 Alternate Function mapping */ +#define GPIO_AF8_GPCOMP4 ((uint8_t)0x08U) /* GPCOMP4 Alternate Function mapping */ +#define GPIO_AF8_GPCOMP6 ((uint8_t)0x08U) /* GPCOMP6 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_CAN ((uint8_t)0x09U) /* CAN Alternate Function mapping */ +#define GPIO_AF9_TIM1 ((uint8_t)0x09U) /* TIM1 Alternate Function mapping */ +#define GPIO_AF9_TIM15 ((uint8_t)0x09U) /* TIM15 Alternate Function mapping */ +/** + * @brief AF 10 selection + */ +#define GPIO_AF10_TIM2 ((uint8_t)0xAU) /* TIM2 Alternate Function mapping */ +#define GPIO_AF10_TIM3 ((uint8_t)0xAU) /* TIM3 Alternate Function mapping */ +#define GPIO_AF10_TIM17 ((uint8_t)0xAU) /* TIM17 Alternate Function mapping */ + +/** + * @brief AF 11 selection + */ +#define GPIO_AF11_TIM1 ((uint8_t)0x0BU) /* TIM1 Alternate Function mapping */ + +/** + * @brief AF 12 selection + */ +#define GPIO_AF12_TIM1 ((uint8_t)0x0CU) /* TIM1 Alternate Function mapping */ + +/** + * @brief AF 13 selection + */ +#define GPIO_AF13_OPAMP2 ((uint8_t)0x0DU) /* OPAMP2 Alternate Function mapping */ + +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0FU) /* EVENTOUT Alternate Function mapping */ + +#define IS_GPIO_AF(AF) (((AF) <= (uint8_t)0x0DU) || ((AF) == (uint8_t)0x0FU)) +/*------------------------------------------------------------------------------------------*/ +#endif /* STM32F303x8 */ + +#if defined (STM32F334x8) || defined (STM32F328xx) +/*---------------------------------- STM32F334x8/STM32F328xx -------------------------------*/ +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_MCO ((uint8_t)0x00U) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00U) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00U) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00U) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01U) /* TIM2 Alternate Function mapping */ +#define GPIO_AF1_TIM15 ((uint8_t)0x01U) /* TIM15 Alternate Function mapping */ +#define GPIO_AF1_TIM16 ((uint8_t)0x01U) /* TIM16 Alternate Function mapping */ +#define GPIO_AF1_TIM17 ((uint8_t)0x01U) /* TIM17 Alternate Function mapping */ +#define GPIO_AF1_EVENTOUT ((uint8_t)0x01U) /* EVENTOUT Alternate Function mapping */ +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_TIM3 ((uint8_t)0x02U) /* TIM3 Alternate Function mapping */ +#define GPIO_AF2_TIM1 ((uint8_t)0x02U) /* TIM1 Alternate Function mapping */ +#define GPIO_AF2_TIM15 ((uint8_t)0x02U) /* TIM15 Alternate Function mapping */ +#define GPIO_AF2_TIM16 ((uint8_t)0x02U) /* TIM16 Alternate Function mapping */ + +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TSC ((uint8_t)0x03U) /* TSC Alternate Function mapping */ +#define GPIO_AF3_HRTIM1 ((uint8_t)0x03U) /* HRTIM1 Alternate Function mapping */ + +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04U) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_TIM1 ((uint8_t)0x04U) /* TIM1 Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05U) /* SPI1 Alternate Function mapping */ +#define GPIO_AF5_IR ((uint8_t)0x05U) /* IR Alternate Function mapping */ +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_TIM1 ((uint8_t)0x06U) /* TIM1 Alternate Function mapping */ +#define GPIO_AF6_IR ((uint8_t)0x06U) /* IR Alternate Function mapping */ + +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_USART1 ((uint8_t)0x07U) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07U) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART3 ((uint8_t)0x07U) /* USART3 Alternate Function mapping */ +#define GPIO_AF7_GPCOMP6 ((uint8_t)0x07U) /* GPCOMP6 Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_GPCOMP2 ((uint8_t)0x08U) /* GPCOMP2 Alternate Function mapping */ +#define GPIO_AF8_GPCOMP4 ((uint8_t)0x08U) /* GPCOMP4 Alternate Function mapping */ +#define GPIO_AF8_GPCOMP6 ((uint8_t)0x08U) /* GPCOMP6 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_CAN ((uint8_t)0x09U) /* CAN Alternate Function mapping */ +#define GPIO_AF9_TIM1 ((uint8_t)0x09U) /* TIM1 Alternate Function mapping */ +#define GPIO_AF9_TIM15 ((uint8_t)0x09U) /* TIM15 Alternate Function mapping */ +/** + * @brief AF 10 selection + */ +#define GPIO_AF10_TIM2 ((uint8_t)0xAU) /* TIM2 Alternate Function mapping */ +#define GPIO_AF10_TIM3 ((uint8_t)0xAU) /* TIM3 Alternate Function mapping */ +#define GPIO_AF10_TIM17 ((uint8_t)0xAU) /* TIM17 Alternate Function mapping */ + +/** + * @brief AF 11 selection + */ +#define GPIO_AF11_TIM1 ((uint8_t)0x0BU) /* TIM1 Alternate Function mapping */ + +/** + * @brief AF 12 selection + */ +#define GPIO_AF12_TIM1 ((uint8_t)0x0CU) /* TIM1 Alternate Function mapping */ +#define GPIO_AF12_HRTIM1 ((uint8_t)0x0CU) /* HRTIM1 Alternate Function mapping */ + +/** + * @brief AF 13 selection + */ +#define GPIO_AF13_OPAMP2 ((uint8_t)0x0DU) /* OPAMP2 Alternate Function mapping */ +#define GPIO_AF13_HRTIM1 ((uint8_t)0x0DU) /* HRTIM1 Alternate Function mapping */ + +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0FU) /* EVENTOUT Alternate Function mapping */ + +#define IS_GPIO_AF(AF) (((AF) <= (uint8_t)0x0DU) || ((AF) == (uint8_t)0x0FU)) +/*------------------------------------------------------------------------------------------*/ +#endif /* STM32F334x8 || STM32F328xx */ + +#if defined (STM32F301x8) || defined (STM32F318xx) +/*---------------------------------- STM32F301x8 / STM32F318xx ------------------------------------------*/ +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_MCO ((uint8_t)0x00U) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00U) /* RTC Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00U) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00U) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00U) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01U) /* TIM2 Alternate Function mapping */ +#define GPIO_AF1_TIM15 ((uint8_t)0x01U) /* TIM15 Alternate Function mapping */ +#define GPIO_AF1_TIM16 ((uint8_t)0x01U) /* TIM16 Alternate Function mapping */ +#define GPIO_AF1_TIM17 ((uint8_t)0x01U) /* TIM17 Alternate Function mapping */ +#define GPIO_AF1_EVENTOUT ((uint8_t)0x01U) /* EVENTOUT Alternate Function mapping */ +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_I2C3 ((uint8_t)0x02U) /* I2C3 Alternate Function mapping */ +#define GPIO_AF2_TIM1 ((uint8_t)0x02U) /* TIM1 Alternate Function mapping */ +#define GPIO_AF2_TIM15 ((uint8_t)0x02U) /* TIM15 Alternate Function mapping */ +#define GPIO_AF2_TIM2 ((uint8_t)0x02U) /* TIM2 Alternate Function mapping */ + +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TSC ((uint8_t)0x03U) /* TSC Alternate Function mapping */ +#define GPIO_AF3_I2C3 ((uint8_t)0x03U) /* I2C3 Alternate Function mapping */ +#define GPIO_AF3_TIM15 ((uint8_t)0x03U) /* TIM15 Alternate Function mapping */ + +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04U) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04U) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_TIM1 ((uint8_t)0x04U) /* TIM1 Alternate Function mapping */ +#define GPIO_AF4_TIM16 ((uint8_t)0x04U) /* TIM16 Alternate Function mapping */ +#define GPIO_AF4_TIM17 ((uint8_t)0x04U) /* TIM17 Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05U) /* SPI1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05U) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_SPI3 ((uint8_t)0x05U) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF5_IR ((uint8_t)0x05U) /* IR Alternate Function mapping */ +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_TIM1 ((uint8_t)0x06U) /* TIM1 Alternate Function mapping */ +#define GPIO_AF6_IR ((uint8_t)0x06U) /* IR Alternate Function mapping */ +#define GPIO_AF6_SPI2 ((uint8_t)0x06U) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06U) /* SPI3/I2S3 Alternate Function mapping */ + +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_USART1 ((uint8_t)0x07U) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07U) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART3 ((uint8_t)0x07U) /* USART3 Alternate Function mapping */ +#define GPIO_AF7_GPCOMP6 ((uint8_t)0x07U) /* GPCOMP6 Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_I2C3 ((uint8_t)0x08U) /* I2C3 Alternate Function mapping */ +#define GPIO_AF8_GPCOMP2 ((uint8_t)0x08U) /* GPCOMP2 Alternate Function mapping */ +#define GPIO_AF8_GPCOMP4 ((uint8_t)0x08U) /* GPCOMP4 Alternate Function mapping */ +#define GPIO_AF8_GPCOMP6 ((uint8_t)0x08U) /* GPCOMP6 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_TIM1 ((uint8_t)0x09U) /* TIM1 Alternate Function mapping */ +#define GPIO_AF9_TIM15 ((uint8_t)0x09U) /* TIM15 Alternate Function mapping */ + +/** + * @brief AF 10 selection + */ +#define GPIO_AF10_TIM2 ((uint8_t)0xAU) /* TIM2 Alternate Function mapping */ +#define GPIO_AF10_TIM17 ((uint8_t)0xAU) /* TIM17 Alternate Function mapping */ + +/** + * @brief AF 11 selection + */ +#define GPIO_AF11_TIM1 ((uint8_t)0x0BU) /* TIM1 Alternate Function mapping */ + +/** + * @brief AF 12 selection + */ +#define GPIO_AF12_TIM1 ((uint8_t)0x0CU) /* TIM1 Alternate Function mapping */ + +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0FU) /* EVENTOUT Alternate Function mapping */ + +#define IS_GPIO_AF(AF) (((AF) <= (uint8_t)0x0CU) || ((AF) == (uint8_t)0x0FU)) +/*------------------------------------------------------------------------------------------*/ +#endif /* STM32F301x8 || STM32F318xx */ + +#if defined (STM32F302x8) +/*---------------------------------- STM32F302x8------------------------------------------*/ +/** + * @brief AF 0 selection + */ +#define GPIO_AF0_MCO ((uint8_t)0x00U) /* MCO (MCO1 and MCO2) Alternate Function mapping */ +#define GPIO_AF0_RTC_50Hz ((uint8_t)0x00U) /* RTC Alternate Function mapping */ +#define GPIO_AF0_TAMPER ((uint8_t)0x00U) /* TAMPER (TAMPER_1 and TAMPER_2) Alternate Function mapping */ +#define GPIO_AF0_SWJ ((uint8_t)0x00U) /* SWJ (SWD and JTAG) Alternate Function mapping */ +#define GPIO_AF0_TRACE ((uint8_t)0x00U) /* TRACE Alternate Function mapping */ + +/** + * @brief AF 1 selection + */ +#define GPIO_AF1_TIM2 ((uint8_t)0x01U) /* TIM2 Alternate Function mapping */ +#define GPIO_AF1_TIM15 ((uint8_t)0x01U) /* TIM15 Alternate Function mapping */ +#define GPIO_AF1_TIM16 ((uint8_t)0x01U) /* TIM16 Alternate Function mapping */ +#define GPIO_AF1_TIM17 ((uint8_t)0x01U) /* TIM17 Alternate Function mapping */ +#define GPIO_AF1_EVENTOUT ((uint8_t)0x01U) /* EVENTOUT Alternate Function mapping */ +/** + * @brief AF 2 selection + */ +#define GPIO_AF2_I2C3 ((uint8_t)0x02U) /* I2C3 Alternate Function mapping */ +#define GPIO_AF2_TIM1 ((uint8_t)0x02U) /* TIM1 Alternate Function mapping */ +#define GPIO_AF2_TIM15 ((uint8_t)0x02U) /* TIM15 Alternate Function mapping */ +#define GPIO_AF2_TIM2 ((uint8_t)0x02U) /* TIM2 Alternate Function mapping */ + +/** + * @brief AF 3 selection + */ +#define GPIO_AF3_TSC ((uint8_t)0x03U) /* TSC Alternate Function mapping */ +#define GPIO_AF3_I2C3 ((uint8_t)0x03U) /* I2C3 Alternate Function mapping */ +#define GPIO_AF3_TIM15 ((uint8_t)0x03U) /* TIM15 Alternate Function mapping */ + +/** + * @brief AF 4 selection + */ +#define GPIO_AF4_I2C1 ((uint8_t)0x04U) /* I2C1 Alternate Function mapping */ +#define GPIO_AF4_I2C2 ((uint8_t)0x04U) /* I2C2 Alternate Function mapping */ +#define GPIO_AF4_TIM1 ((uint8_t)0x04U) /* TIM1 Alternate Function mapping */ +#define GPIO_AF4_TIM16 ((uint8_t)0x04U) /* TIM16 Alternate Function mapping */ +#define GPIO_AF4_TIM17 ((uint8_t)0x04U) /* TIM17 Alternate Function mapping */ + +/** + * @brief AF 5 selection + */ +#define GPIO_AF5_SPI1 ((uint8_t)0x05U) /* SPI1 Alternate Function mapping */ +#define GPIO_AF5_SPI2 ((uint8_t)0x05U) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF5_SPI3 ((uint8_t)0x05U) /* SPI3/I2S3 Alternate Function mapping */ +#define GPIO_AF5_IR ((uint8_t)0x05U) /* IR Alternate Function mapping */ +/** + * @brief AF 6 selection + */ +#define GPIO_AF6_TIM1 ((uint8_t)0x06U) /* TIM1 Alternate Function mapping */ +#define GPIO_AF6_IR ((uint8_t)0x06U) /* IR Alternate Function mapping */ +#define GPIO_AF6_SPI2 ((uint8_t)0x06U) /* SPI2/I2S2 Alternate Function mapping */ +#define GPIO_AF6_SPI3 ((uint8_t)0x06U) /* SPI3/I2S3 Alternate Function mapping */ + +/** + * @brief AF 7 selection + */ +#define GPIO_AF7_USART1 ((uint8_t)0x07U) /* USART1 Alternate Function mapping */ +#define GPIO_AF7_USART2 ((uint8_t)0x07U) /* USART2 Alternate Function mapping */ +#define GPIO_AF7_USART3 ((uint8_t)0x07U) /* USART3 Alternate Function mapping */ +#define GPIO_AF7_GPCOMP6 ((uint8_t)0x07U) /* GPCOMP6 Alternate Function mapping */ +#define GPIO_AF7_CAN ((uint8_t)0x07U) /* CAN Alternate Function mapping */ + +/** + * @brief AF 8 selection + */ +#define GPIO_AF8_I2C3 ((uint8_t)0x08U) /* I2C3 Alternate Function mapping */ +#define GPIO_AF8_GPCOMP2 ((uint8_t)0x08U) /* GPCOMP2 Alternate Function mapping */ +#define GPIO_AF8_GPCOMP4 ((uint8_t)0x08U) /* GPCOMP4 Alternate Function mapping */ +#define GPIO_AF8_GPCOMP6 ((uint8_t)0x08U) /* GPCOMP6 Alternate Function mapping */ + +/** + * @brief AF 9 selection + */ +#define GPIO_AF9_TIM1 ((uint8_t)0x09U) /* TIM1 Alternate Function mapping */ +#define GPIO_AF9_TIM15 ((uint8_t)0x09U) /* TIM15 Alternate Function mapping */ +#define GPIO_AF9_CAN ((uint8_t)0x09U) /* CAN Alternate Function mapping */ + +/** + * @brief AF 10 selection + */ +#define GPIO_AF10_TIM2 ((uint8_t)0xAU) /* TIM2 Alternate Function mapping */ +#define GPIO_AF10_TIM17 ((uint8_t)0xAU) /* TIM17 Alternate Function mapping */ + +/** + * @brief AF 11 selection + */ +#define GPIO_AF11_TIM1 ((uint8_t)0x0BU) /* TIM1 Alternate Function mapping */ + +/** + * @brief AF 12 selection + */ +#define GPIO_AF12_TIM1 ((uint8_t)0x0CU) /* TIM1 Alternate Function mapping */ + +/** + * @brief AF 15 selection + */ +#define GPIO_AF15_EVENTOUT ((uint8_t)0x0FU) /* EVENTOUT Alternate Function mapping */ + +#define IS_GPIO_AF(AF) (((AF) <= (uint8_t)0x0CU) || ((AF) == (uint8_t)0x0FU)) +/*------------------------------------------------------------------------------------------*/ +#endif /* STM32F302x8 */ +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup GPIOEx_Exported_Macros GPIOEx Exported Macros + * @{ + */ + +/** @defgroup GPIOEx_Get_Port_Index GPIOEx_Get Port Index +* @{ + */ +#if defined(STM32F303x8) || defined(STM32F334x8) || defined(STM32F328xx) || \ + defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx) +#define GPIO_GET_INDEX(__GPIOx__) (((__GPIOx__) == (GPIOA))? 0U :\ + ((__GPIOx__) == (GPIOB))? 1U :\ + ((__GPIOx__) == (GPIOC))? 2U :\ + ((__GPIOx__) == (GPIOD))? 3U : 5U) +#endif /* STM32F303x8 || STM32F334x8 || STM32F328xx || */ + /* STM32F301x8 || STM32F302x8 || STM32F318xx */ + +#if defined(STM32F302xC) || defined(STM32F303xC) || defined(STM32F358xx) || \ + defined(STM32F373xC) || defined(STM32F378xx) +#define GPIO_GET_INDEX(__GPIOx__) (((__GPIOx__) == (GPIOA))? 0U :\ + ((__GPIOx__) == (GPIOB))? 1U :\ + ((__GPIOx__) == (GPIOC))? 2U :\ + ((__GPIOx__) == (GPIOD))? 3U :\ + ((__GPIOx__) == (GPIOE))? 4U : 5U) +#endif /* STM32F302xC || STM32F303xC || STM32F358xx || */ + /* STM32F373xC || STM32F378xx */ + +#if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx) +#define GPIO_GET_INDEX(__GPIOx__) (((__GPIOx__) == (GPIOA))? 0U :\ + ((__GPIOx__) == (GPIOB))? 1U :\ + ((__GPIOx__) == (GPIOC))? 2U :\ + ((__GPIOx__) == (GPIOD))? 3U :\ + ((__GPIOx__) == (GPIOE))? 4U :\ + ((__GPIOx__) == (GPIOF))? 5U :\ + ((__GPIOx__) == (GPIOG))? 6U : 7U) +#endif /* STM32F302xE || STM32F303xE || STM32F398xx */ + +/** + * @} + */ + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F3xx_HAL_GPIO_EX_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h new file mode 100644 index 0000000..5a4500e --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h @@ -0,0 +1,838 @@ +/** + ****************************************************************************** + * @file stm32f3xx_hal_i2c.h + * @author MCD Application Team + * @brief Header file of I2C HAL module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef STM32F3xx_HAL_I2C_H +#define STM32F3xx_HAL_I2C_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f3xx_hal_def.h" + +/** @addtogroup STM32F3xx_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 Timing; /*!< Specifies the I2C_TIMINGR_register value. + This parameter calculated by referring to I2C initialization section + in Reference manual */ + + 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 OwnAddress2Masks; /*!< Specifies the acknowledge mask address second device own address if dual addressing + mode is selected. + This parameter can be a value of @ref I2C_OWN_ADDRESS2_MASKS */ + + 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 :\n + * b7-b6 Error information\n + * 00 : No Error\n + * 01 : Abort (Abort user request on going)\n + * 10 : Timeout\n + * 11 : Error\n + * b5 Peripheral initialization status\n + * 0 : Reset (peripheral not initialized)\n + * 1 : Init done (peripheral initialized and ready to use. HAL I2C Init function called)\n + * b4 (not used)\n + * x : Should be set to 0\n + * b3\n + * 0 : Ready or Busy (No Listen mode ongoing)\n + * 1 : Listen (peripheral in Address Listen Mode)\n + * b2 Intrinsic process state\n + * 0 : Ready\n + * 1 : Busy (peripheral busy with some configuration or internal operations)\n + * b1 Rx state\n + * 0 : Ready (no Rx operation ongoing)\n + * 1 : Busy (Rx operation ongoing)\n + * b0 Tx state\n + * 0 : Ready (no Tx operation ongoing)\n + * 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) /*!< ACKF 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 */ +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) +#define HAL_I2C_ERROR_INVALID_CALLBACK (0x00000100U) /*!< Invalid Callback error */ +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ +#define HAL_I2C_ERROR_INVALID_PARAM (0x00000200U) /*!< Invalid Parameters error */ +/** + * @} + */ + +/** @defgroup I2C_handle_Structure_definition I2C handle Structure definition + * @brief I2C handle Structure definition + * @{ + */ +typedef struct __I2C_HandleTypeDef +{ + 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 sequantial transfer options, this parameter can + be a value of @ref I2C_XFEROPTIONS */ + + __IO uint32_t PreviousState; /*!< I2C communication Previous state */ + + HAL_StatusTypeDef(*XferISR)(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources); + /*!< I2C transfer IRQ handler function pointer */ + + 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 AddrEventCount; /*!< I2C Address 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_XFEROPTIONS I2C Sequential Transfer Options + * @{ + */ +#define I2C_FIRST_FRAME ((uint32_t)I2C_SOFTEND_MODE) +#define I2C_FIRST_AND_NEXT_FRAME ((uint32_t)(I2C_RELOAD_MODE | I2C_SOFTEND_MODE)) +#define I2C_NEXT_FRAME ((uint32_t)(I2C_RELOAD_MODE | I2C_SOFTEND_MODE)) +#define I2C_FIRST_AND_LAST_FRAME ((uint32_t)I2C_AUTOEND_MODE) +#define I2C_LAST_FRAME ((uint32_t)I2C_AUTOEND_MODE) +#define I2C_LAST_FRAME_NO_STOP ((uint32_t)I2C_SOFTEND_MODE) + +/* List of XferOptions in usage of : + * 1- Restart condition in all use cases (direction change or not) + */ +#define I2C_OTHER_FRAME (0x000000AAU) +#define I2C_OTHER_AND_LAST_FRAME (0x0000AA00U) +/** + * @} + */ + +/** @defgroup I2C_ADDRESSING_MODE I2C Addressing Mode + * @{ + */ +#define I2C_ADDRESSINGMODE_7BIT (0x00000001U) +#define I2C_ADDRESSINGMODE_10BIT (0x00000002U) +/** + * @} + */ + +/** @defgroup I2C_DUAL_ADDRESSING_MODE I2C Dual Addressing Mode + * @{ + */ +#define I2C_DUALADDRESS_DISABLE (0x00000000U) +#define I2C_DUALADDRESS_ENABLE I2C_OAR2_OA2EN +/** + * @} + */ + +/** @defgroup I2C_OWN_ADDRESS2_MASKS I2C Own Address2 Masks + * @{ + */ +#define I2C_OA2_NOMASK ((uint8_t)0x00U) +#define I2C_OA2_MASK01 ((uint8_t)0x01U) +#define I2C_OA2_MASK02 ((uint8_t)0x02U) +#define I2C_OA2_MASK03 ((uint8_t)0x03U) +#define I2C_OA2_MASK04 ((uint8_t)0x04U) +#define I2C_OA2_MASK05 ((uint8_t)0x05U) +#define I2C_OA2_MASK06 ((uint8_t)0x06U) +#define I2C_OA2_MASK07 ((uint8_t)0x07U) +/** + * @} + */ + +/** @defgroup I2C_GENERAL_CALL_ADDRESSING_MODE I2C General Call Addressing Mode + * @{ + */ +#define I2C_GENERALCALL_DISABLE (0x00000000U) +#define I2C_GENERALCALL_ENABLE I2C_CR1_GCEN +/** + * @} + */ + +/** @defgroup I2C_NOSTRETCH_MODE I2C No-Stretch 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 (0x00000002U) +/** + * @} + */ + +/** @defgroup I2C_XFERDIRECTION I2C Transfer Direction Master Point of View + * @{ + */ +#define I2C_DIRECTION_TRANSMIT (0x00000000U) +#define I2C_DIRECTION_RECEIVE (0x00000001U) +/** + * @} + */ + +/** @defgroup I2C_RELOAD_END_MODE I2C Reload End Mode + * @{ + */ +#define I2C_RELOAD_MODE I2C_CR2_RELOAD +#define I2C_AUTOEND_MODE I2C_CR2_AUTOEND +#define I2C_SOFTEND_MODE (0x00000000U) +/** + * @} + */ + +/** @defgroup I2C_START_STOP_MODE I2C Start or Stop Mode + * @{ + */ +#define I2C_NO_STARTSTOP (0x00000000U) +#define I2C_GENERATE_STOP (uint32_t)(0x80000000U | I2C_CR2_STOP) +#define I2C_GENERATE_START_READ (uint32_t)(0x80000000U | I2C_CR2_START | I2C_CR2_RD_WRN) +#define I2C_GENERATE_START_WRITE (uint32_t)(0x80000000U | I2C_CR2_START) +/** + * @} + */ + +/** @defgroup I2C_Interrupt_configuration_definition I2C Interrupt configuration definition + * @brief I2C Interrupt definition + * Elements values convention: 0xXXXXXXXX + * - XXXXXXXX : Interrupt control mask + * @{ + */ +#define I2C_IT_ERRI I2C_CR1_ERRIE +#define I2C_IT_TCI I2C_CR1_TCIE +#define I2C_IT_STOPI I2C_CR1_STOPIE +#define I2C_IT_NACKI I2C_CR1_NACKIE +#define I2C_IT_ADDRI I2C_CR1_ADDRIE +#define I2C_IT_RXI I2C_CR1_RXIE +#define I2C_IT_TXI I2C_CR1_TXIE +/** + * @} + */ + +/** @defgroup I2C_Flag_definition I2C Flag definition + * @{ + */ +#define I2C_FLAG_TXE I2C_ISR_TXE +#define I2C_FLAG_TXIS I2C_ISR_TXIS +#define I2C_FLAG_RXNE I2C_ISR_RXNE +#define I2C_FLAG_ADDR I2C_ISR_ADDR +#define I2C_FLAG_AF I2C_ISR_NACKF +#define I2C_FLAG_STOPF I2C_ISR_STOPF +#define I2C_FLAG_TC I2C_ISR_TC +#define I2C_FLAG_TCR I2C_ISR_TCR +#define I2C_FLAG_BERR I2C_ISR_BERR +#define I2C_FLAG_ARLO I2C_ISR_ARLO +#define I2C_FLAG_OVR I2C_ISR_OVR +#define I2C_FLAG_PECERR I2C_ISR_PECERR +#define I2C_FLAG_TIMEOUT I2C_ISR_TIMEOUT +#define I2C_FLAG_ALERT I2C_ISR_ALERT +#define I2C_FLAG_BUSY I2C_ISR_BUSY +#define I2C_FLAG_DIR I2C_ISR_DIR +/** + * @} + */ + +/** + * @} + */ + +/* 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 /* USE_HAL_I2C_REGISTER_CALLBACKS */ + +/** @brief Enable the specified I2C interrupt. + * @param __HANDLE__ specifies the I2C Handle. + * @param __INTERRUPT__ specifies the interrupt source to enable. + * This parameter can be one of the following values: + * @arg @ref I2C_IT_ERRI Errors interrupt enable + * @arg @ref I2C_IT_TCI Transfer complete interrupt enable + * @arg @ref I2C_IT_STOPI STOP detection interrupt enable + * @arg @ref I2C_IT_NACKI NACK received interrupt enable + * @arg @ref I2C_IT_ADDRI Address match interrupt enable + * @arg @ref I2C_IT_RXI RX interrupt enable + * @arg @ref I2C_IT_TXI TX interrupt enable + * + * @retval None + */ +#define __HAL_I2C_ENABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->CR1 |= (__INTERRUPT__)) + +/** @brief Disable the specified I2C interrupt. + * @param __HANDLE__ specifies the I2C Handle. + * @param __INTERRUPT__ specifies the interrupt source to disable. + * This parameter can be one of the following values: + * @arg @ref I2C_IT_ERRI Errors interrupt enable + * @arg @ref I2C_IT_TCI Transfer complete interrupt enable + * @arg @ref I2C_IT_STOPI STOP detection interrupt enable + * @arg @ref I2C_IT_NACKI NACK received interrupt enable + * @arg @ref I2C_IT_ADDRI Address match interrupt enable + * @arg @ref I2C_IT_RXI RX interrupt enable + * @arg @ref I2C_IT_TXI TX interrupt enable + * + * @retval None + */ +#define __HAL_I2C_DISABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->CR1 &= (~(__INTERRUPT__))) + +/** @brief Check whether the specified I2C interrupt source is enabled or not. + * @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 @ref I2C_IT_ERRI Errors interrupt enable + * @arg @ref I2C_IT_TCI Transfer complete interrupt enable + * @arg @ref I2C_IT_STOPI STOP detection interrupt enable + * @arg @ref I2C_IT_NACKI NACK received interrupt enable + * @arg @ref I2C_IT_ADDRI Address match interrupt enable + * @arg @ref I2C_IT_RXI RX interrupt enable + * @arg @ref I2C_IT_TXI TX interrupt enable + * + * @retval The new state of __INTERRUPT__ (SET or RESET). + */ +#define __HAL_I2C_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->CR1 & \ + (__INTERRUPT__)) == (__INTERRUPT__)) ? SET : RESET) + +/** @brief Check 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 @ref I2C_FLAG_TXE Transmit data register empty + * @arg @ref I2C_FLAG_TXIS Transmit interrupt status + * @arg @ref I2C_FLAG_RXNE Receive data register not empty + * @arg @ref I2C_FLAG_ADDR Address matched (slave mode) + * @arg @ref I2C_FLAG_AF Acknowledge failure received flag + * @arg @ref I2C_FLAG_STOPF STOP detection flag + * @arg @ref I2C_FLAG_TC Transfer complete (master mode) + * @arg @ref I2C_FLAG_TCR Transfer complete reload + * @arg @ref I2C_FLAG_BERR Bus error + * @arg @ref I2C_FLAG_ARLO Arbitration lost + * @arg @ref I2C_FLAG_OVR Overrun/Underrun + * @arg @ref I2C_FLAG_PECERR PEC error in reception + * @arg @ref I2C_FLAG_TIMEOUT Timeout or Tlow detection flag + * @arg @ref I2C_FLAG_ALERT SMBus alert + * @arg @ref I2C_FLAG_BUSY Bus busy + * @arg @ref I2C_FLAG_DIR Transfer direction (slave mode) + * + * @retval The new state of __FLAG__ (SET or RESET). + */ +#define I2C_FLAG_MASK (0x0001FFFFU) +#define __HAL_I2C_GET_FLAG(__HANDLE__, __FLAG__) (((((__HANDLE__)->Instance->ISR) & \ + (__FLAG__)) == (__FLAG__)) ? SET : RESET) + +/** @brief Clear the I2C pending flags which are cleared by writing 1 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 @ref I2C_FLAG_TXE Transmit data register empty + * @arg @ref I2C_FLAG_ADDR Address matched (slave mode) + * @arg @ref I2C_FLAG_AF Acknowledge failure received flag + * @arg @ref I2C_FLAG_STOPF STOP detection flag + * @arg @ref I2C_FLAG_BERR Bus error + * @arg @ref I2C_FLAG_ARLO Arbitration lost + * @arg @ref I2C_FLAG_OVR Overrun/Underrun + * @arg @ref I2C_FLAG_PECERR PEC error in reception + * @arg @ref I2C_FLAG_TIMEOUT Timeout or Tlow detection flag + * @arg @ref I2C_FLAG_ALERT SMBus alert + * + * @retval None + */ +#define __HAL_I2C_CLEAR_FLAG(__HANDLE__, __FLAG__) (((__FLAG__) == I2C_FLAG_TXE) ? \ + ((__HANDLE__)->Instance->ISR |= (__FLAG__)) : \ + ((__HANDLE__)->Instance->ICR = (__FLAG__))) + +/** @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)) + +/** @brief Generate a Non-Acknowledge I2C peripheral in Slave mode. + * @param __HANDLE__ specifies the I2C Handle. + * @retval None + */ +#define __HAL_I2C_GENERATE_NACK(__HANDLE__) (SET_BIT((__HANDLE__)->Instance->CR2, I2C_CR2_NACK)) +/** + * @} + */ + +/* Include I2C HAL Extended module */ +#include "stm32f3xx_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 constants ---------------------------------------------------------*/ +/** @defgroup I2C_Private_Constants I2C Private Constants + * @{ + */ + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup I2C_Private_Macro I2C Private Macros + * @{ + */ + +#define IS_I2C_ADDRESSING_MODE(MODE) (((MODE) == I2C_ADDRESSINGMODE_7BIT) || \ + ((MODE) == I2C_ADDRESSINGMODE_10BIT)) + +#define IS_I2C_DUAL_ADDRESS(ADDRESS) (((ADDRESS) == I2C_DUALADDRESS_DISABLE) || \ + ((ADDRESS) == I2C_DUALADDRESS_ENABLE)) + +#define IS_I2C_OWN_ADDRESS2_MASK(MASK) (((MASK) == I2C_OA2_NOMASK) || \ + ((MASK) == I2C_OA2_MASK01) || \ + ((MASK) == I2C_OA2_MASK02) || \ + ((MASK) == I2C_OA2_MASK03) || \ + ((MASK) == I2C_OA2_MASK04) || \ + ((MASK) == I2C_OA2_MASK05) || \ + ((MASK) == I2C_OA2_MASK06) || \ + ((MASK) == I2C_OA2_MASK07)) + +#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_TRANSFER_MODE(MODE) (((MODE) == I2C_RELOAD_MODE) || \ + ((MODE) == I2C_AUTOEND_MODE) || \ + ((MODE) == I2C_SOFTEND_MODE)) + +#define IS_TRANSFER_REQUEST(REQUEST) (((REQUEST) == I2C_GENERATE_STOP) || \ + ((REQUEST) == I2C_GENERATE_START_READ) || \ + ((REQUEST) == I2C_GENERATE_START_WRITE) || \ + ((REQUEST) == I2C_NO_STARTSTOP)) + +#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_RESET_CR2(__HANDLE__) ((__HANDLE__)->Instance->CR2 &= \ + (uint32_t)~((uint32_t)(I2C_CR2_SADD | I2C_CR2_HEAD10R | \ + I2C_CR2_NBYTES | I2C_CR2_RELOAD | \ + I2C_CR2_RD_WRN))) + +#define I2C_GET_ADDR_MATCH(__HANDLE__) ((uint16_t)(((__HANDLE__)->Instance->ISR & I2C_ISR_ADDCODE) \ + >> 16U)) +#define I2C_GET_DIR(__HANDLE__) ((uint8_t)(((__HANDLE__)->Instance->ISR & I2C_ISR_DIR) \ + >> 16U)) +#define I2C_GET_STOP_MODE(__HANDLE__) ((__HANDLE__)->Instance->CR2 & I2C_CR2_AUTOEND) +#define I2C_GET_OWN_ADDRESS1(__HANDLE__) ((uint16_t)((__HANDLE__)->Instance->OAR1 & I2C_OAR1_OA1)) +#define I2C_GET_OWN_ADDRESS2(__HANDLE__) ((uint16_t)((__HANDLE__)->Instance->OAR2 & I2C_OAR2_OA2)) + +#define IS_I2C_OWN_ADDRESS1(ADDRESS1) ((ADDRESS1) <= 0x000003FFU) +#define IS_I2C_OWN_ADDRESS2(ADDRESS2) ((ADDRESS2) <= (uint16_t)0x00FFU) + +#define I2C_MEM_ADD_MSB(__ADDRESS__) ((uint8_t)((uint16_t)(((uint16_t)((__ADDRESS__) & \ + (uint16_t)(0xFF00U))) >> 8U))) +#define I2C_MEM_ADD_LSB(__ADDRESS__) ((uint8_t)((uint16_t)((__ADDRESS__) & (uint16_t)(0x00FFU)))) + +#define I2C_GENERATE_START(__ADDMODE__,__ADDRESS__) (((__ADDMODE__) == I2C_ADDRESSINGMODE_7BIT) ? \ + (uint32_t)((((uint32_t)(__ADDRESS__) & (I2C_CR2_SADD)) | \ + (I2C_CR2_START) | (I2C_CR2_AUTOEND)) & \ + (~I2C_CR2_RD_WRN)) : \ + (uint32_t)((((uint32_t)(__ADDRESS__) & (I2C_CR2_SADD)) | \ + (I2C_CR2_ADD10) | (I2C_CR2_START)) & \ + (~I2C_CR2_RD_WRN))) + +#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 + * @{ + */ +/* Private functions are defined in stm32f3xx_hal_i2c.c file */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + + +#endif /* STM32F3xx_HAL_I2C_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h new file mode 100644 index 0000000..c6fcfc6 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h @@ -0,0 +1,180 @@ +/** + ****************************************************************************** + * @file stm32f3xx_hal_i2c_ex.h + * @author MCD Application Team + * @brief Header file of I2C HAL Extended module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef STM32F3xx_HAL_I2C_EX_H +#define STM32F3xx_HAL_I2C_EX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f3xx_hal_def.h" + +/** @addtogroup STM32F3xx_HAL_Driver + * @{ + */ + +/** @addtogroup I2CEx + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/** @defgroup I2CEx_Exported_Constants I2C Extended Exported Constants + * @{ + */ + +/** @defgroup I2CEx_Analog_Filter I2C Extended Analog Filter + * @{ + */ +#define I2C_ANALOGFILTER_ENABLE 0x00000000U +#define I2C_ANALOGFILTER_DISABLE I2C_CR1_ANFOFF +/** + * @} + */ + +/** @defgroup I2CEx_FastModePlus I2C Extended Fast Mode Plus + * @{ + */ +#define I2C_FMP_NOT_SUPPORTED 0xAAAA0000U /*!< Fast Mode Plus not supported */ +#define I2C_FASTMODEPLUS_PB6 SYSCFG_CFGR1_I2C_PB6_FMP /*!< Enable Fast Mode Plus on PB6 */ +#define I2C_FASTMODEPLUS_PB7 SYSCFG_CFGR1_I2C_PB7_FMP /*!< Enable Fast Mode Plus on PB7 */ +#define I2C_FASTMODEPLUS_PB8 SYSCFG_CFGR1_I2C_PB8_FMP /*!< Enable Fast Mode Plus on PB8 */ +#define I2C_FASTMODEPLUS_PB9 SYSCFG_CFGR1_I2C_PB9_FMP /*!< Enable Fast Mode Plus on PB9 */ +#define I2C_FASTMODEPLUS_I2C1 SYSCFG_CFGR1_I2C1_FMP /*!< Enable Fast Mode Plus on I2C1 pins */ +#if defined(SYSCFG_CFGR1_I2C2_FMP) +#define I2C_FASTMODEPLUS_I2C2 SYSCFG_CFGR1_I2C2_FMP /*!< Enable Fast Mode Plus on I2C2 pins */ +#else +#define I2C_FASTMODEPLUS_I2C2 (uint32_t)(0x00000200U | I2C_FMP_NOT_SUPPORTED) /*!< Fast Mode Plus I2C2 not supported */ +#endif /* SYSCFG_CFGR1_I2C2_FMP */ +#if defined(SYSCFG_CFGR1_I2C3_FMP) +#define I2C_FASTMODEPLUS_I2C3 SYSCFG_CFGR1_I2C3_FMP /*!< Enable Fast Mode Plus on I2C3 pins */ +#else +#define I2C_FASTMODEPLUS_I2C3 (uint32_t)(0x00000400U | I2C_FMP_NOT_SUPPORTED) /*!< Fast Mode Plus I2C3 not supported */ +#endif /* SYSCFG_CFGR1_I2C3_FMP */ +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup I2CEx_Exported_Macros I2C Extended Exported Macros + * @{ + */ + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup I2CEx_Exported_Functions I2C Extended Exported Functions + * @{ + */ + +/** @addtogroup I2CEx_Exported_Functions_Group1 Filter Mode Functions + * @{ + */ +/* 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); +/** + * @} + */ + +/** @addtogroup I2CEx_Exported_Functions_Group2 WakeUp Mode Functions + * @{ + */ +HAL_StatusTypeDef HAL_I2CEx_EnableWakeUp(I2C_HandleTypeDef *hi2c); +HAL_StatusTypeDef HAL_I2CEx_DisableWakeUp(I2C_HandleTypeDef *hi2c); +/** + * @} + */ + +/** @addtogroup I2CEx_Exported_Functions_Group3 Fast Mode Plus Functions + * @{ + */ +void HAL_I2CEx_EnableFastModePlus(uint32_t ConfigFastModePlus); +void HAL_I2CEx_DisableFastModePlus(uint32_t ConfigFastModePlus); +/** + * @} + */ + +/** + * @} + */ + +/* Private constants ---------------------------------------------------------*/ +/** @defgroup I2CEx_Private_Constants I2C Extended Private Constants + * @{ + */ + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup I2CEx_Private_Macro I2C Extended Private Macros + * @{ + */ +#define IS_I2C_ANALOG_FILTER(FILTER) (((FILTER) == I2C_ANALOGFILTER_ENABLE) || \ + ((FILTER) == I2C_ANALOGFILTER_DISABLE)) + +#define IS_I2C_DIGITAL_FILTER(FILTER) ((FILTER) <= 0x0000000FU) + +#define IS_I2C_FASTMODEPLUS(__CONFIG__) ((((__CONFIG__) & I2C_FMP_NOT_SUPPORTED) != I2C_FMP_NOT_SUPPORTED) && \ + ((((__CONFIG__) & (I2C_FASTMODEPLUS_PB6)) == I2C_FASTMODEPLUS_PB6) || \ + (((__CONFIG__) & (I2C_FASTMODEPLUS_PB7)) == I2C_FASTMODEPLUS_PB7) || \ + (((__CONFIG__) & (I2C_FASTMODEPLUS_PB8)) == I2C_FASTMODEPLUS_PB8) || \ + (((__CONFIG__) & (I2C_FASTMODEPLUS_PB9)) == I2C_FASTMODEPLUS_PB9) || \ + (((__CONFIG__) & (I2C_FASTMODEPLUS_I2C1)) == I2C_FASTMODEPLUS_I2C1) || \ + (((__CONFIG__) & (I2C_FASTMODEPLUS_I2C2)) == I2C_FASTMODEPLUS_I2C2) || \ + (((__CONFIG__) & (I2C_FASTMODEPLUS_I2C3)) == I2C_FASTMODEPLUS_I2C3))) +/** + * @} + */ + +/* Private Functions ---------------------------------------------------------*/ +/** @defgroup I2CEx_Private_Functions I2C Extended Private Functions + * @{ + */ +/* Private functions are defined in stm32f3xx_hal_i2c_ex.c file */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* STM32F3xx_HAL_I2C_EX_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h new file mode 100644 index 0000000..5f6d606 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h @@ -0,0 +1,219 @@ +/** + ****************************************************************************** + * @file stm32f3xx_hal_pwr.h + * @author MCD Application Team + * @brief Header file of PWR HAL module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F3xx_HAL_PWR_H +#define __STM32F3xx_HAL_PWR_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f3xx_hal_def.h" + +/** @addtogroup STM32F3xx_HAL_Driver + * @{ + */ + +/** @addtogroup PWR PWR + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/** @defgroup PWR_Exported_Constants PWR Exported Constants + * @{ + */ + +/** @defgroup PWR_WakeUp_Pins PWR WakeUp Pins + * @{ + */ + +#define PWR_WAKEUP_PIN1 ((uint32_t)PWR_CSR_EWUP1) /*!< Wakeup pin 1U */ +#define PWR_WAKEUP_PIN2 ((uint32_t)PWR_CSR_EWUP2) /*!< Wakeup pin 2U */ +#define PWR_WAKEUP_PIN3 ((uint32_t)PWR_CSR_EWUP3) /*!< Wakeup pin 3U */ +/** + * @} + */ + +/** @defgroup PWR_Regulator_state_in_STOP_mode PWR Regulator state in STOP mode + * @{ + */ +#define PWR_MAINREGULATOR_ON (0x00000000U) /*!< Voltage regulator on during STOP mode */ +#define PWR_LOWPOWERREGULATOR_ON PWR_CR_LPDS /*!< Voltage regulator in low-power mode during STOP mode */ +/** + * @} + */ + +/** @defgroup PWR_SLEEP_mode_entry PWR SLEEP mode entry + * @{ + */ +#define PWR_SLEEPENTRY_WFI ((uint8_t)0x01U) /*!< Wait For Interruption instruction to enter SLEEP mode */ +#define PWR_SLEEPENTRY_WFE ((uint8_t)0x02U) /*!< Wait For Event instruction to enter SLEEP mode */ +/** + * @} + */ + +/** @defgroup PWR_STOP_mode_entry PWR STOP mode entry + * @{ + */ +#define PWR_STOPENTRY_WFI ((uint8_t)0x01U) /*!< Wait For Interruption instruction to enter STOP mode */ +#define PWR_STOPENTRY_WFE ((uint8_t)0x02U) /*!< Wait For Event instruction to enter STOP mode */ +/** + * @} + */ + +/** @defgroup PWR_Flag PWR Flag + * @{ + */ +#define PWR_FLAG_WU PWR_CSR_WUF /*!< Wakeup event from wakeup pin or RTC alarm */ +#define PWR_FLAG_SB PWR_CSR_SBF /*!< Standby flag */ +#define PWR_FLAG_PVDO PWR_CSR_PVDO /*!< Power Voltage Detector output flag */ +#define PWR_FLAG_VREFINTRDY PWR_CSR_VREFINTRDYF /*!< VREFINT reference voltage ready */ +/** + * @} + */ + +/** + * @} + */ + +/* 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_VREFINTRDY: This flag indicates that the internal reference + * voltage VREFINT 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) + +/** + * @} + */ + +/* Private macros --------------------------------------------------------*/ +/** @addtogroup PWR_Private_Macros PWR Private Macros + * @{ + */ + +#define IS_PWR_WAKEUP_PIN(PIN) (((PIN) == PWR_WAKEUP_PIN1) || \ + ((PIN) == PWR_WAKEUP_PIN2) || \ + ((PIN) == PWR_WAKEUP_PIN3)) + +#define IS_PWR_REGULATOR(REGULATOR) (((REGULATOR) == PWR_MAINREGULATOR_ON) || \ + ((REGULATOR) == PWR_LOWPOWERREGULATOR_ON)) + +#define IS_PWR_SLEEP_ENTRY(ENTRY) (((ENTRY) == PWR_SLEEPENTRY_WFI) || ((ENTRY) == PWR_SLEEPENTRY_WFE)) + +#define IS_PWR_STOP_ENTRY(ENTRY) (((ENTRY) == PWR_STOPENTRY_WFI) || ((ENTRY) == PWR_STOPENTRY_WFE)) + +/** + * @} + */ + +/* Include PWR HAL Extended module */ +#include "stm32f3xx_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); + +/** + * @} + */ + +/** @addtogroup PWR_Exported_Functions_Group2 Peripheral Control functions + * @{ + */ + +/* Peripheral Control functions **********************************************/ +void HAL_PWR_EnableBkUpAccess(void); +void HAL_PWR_DisableBkUpAccess(void); + +/* WakeUp pins configuration functions ****************************************/ +void HAL_PWR_EnableWakeUpPin(uint32_t WakeUpPinx); +void HAL_PWR_DisableWakeUpPin(uint32_t WakeUpPinx); + +/* Low Power modes configuration functions ************************************/ +void HAL_PWR_EnterSTOPMode(uint32_t Regulator, uint8_t STOPEntry); +void HAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t SLEEPEntry); +void HAL_PWR_EnterSTANDBYMode(void); + +void HAL_PWR_EnableSleepOnExit(void); +void HAL_PWR_DisableSleepOnExit(void); +void HAL_PWR_EnableSEVOnPend(void); +void HAL_PWR_DisableSEVOnPend(void); +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + + +#endif /* __STM32F3xx_HAL_PWR_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h new file mode 100644 index 0000000..9f5b45d --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h @@ -0,0 +1,322 @@ +/** + ****************************************************************************** + * @file stm32f3xx_hal_pwr_ex.h + * @author MCD Application Team + * @brief Header file of PWR HAL Extended module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F3xx_HAL_PWR_EX_H +#define __STM32F3xx_HAL_PWR_EX_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f3xx_hal_def.h" + +/** @addtogroup STM32F3xx_HAL_Driver + * @{ + */ + +/** @addtogroup PWREx + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ + +/** @defgroup PWREx_Exported_Types PWR Extended Exported Types + * @{ + */ +#if defined(STM32F302xE) || defined(STM32F303xE) || \ + defined(STM32F302xC) || defined(STM32F303xC) || \ + defined(STM32F303x8) || defined(STM32F334x8) || \ + defined(STM32F301x8) || defined(STM32F302x8) || \ + defined(STM32F373xC) +/** + * @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 PWREx_PVD_detection_level */ + + uint32_t Mode; /*!< Mode: Specifies the operating mode for the selected pins. + This parameter can be a value of @ref PWREx_PVD_Mode */ +}PWR_PVDTypeDef; +#endif /* STM32F302xE || STM32F303xE || */ + /* STM32F302xC || STM32F303xC || */ + /* STM32F303x8 || STM32F334x8 || */ + /* STM32F301x8 || STM32F302x8 || */ + /* STM32F373xC */ + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup PWREx_Exported_Constants PWR Extended Exported Constants + * @{ + */ + +#if defined(STM32F302xE) || defined(STM32F303xE) || \ + defined(STM32F302xC) || defined(STM32F303xC) || \ + defined(STM32F303x8) || defined(STM32F334x8) || \ + defined(STM32F301x8) || defined(STM32F302x8) || \ + defined(STM32F373xC) + +/** @defgroup PWREx_PVD_detection_level PWR Extended PVD detection level + * @{ + */ +#define PWR_PVDLEVEL_0 PWR_CR_PLS_LEV0 /*!< PVD threshold around 2.2 V */ +#define PWR_PVDLEVEL_1 PWR_CR_PLS_LEV1 /*!< PVD threshold around 2.3 V */ +#define PWR_PVDLEVEL_2 PWR_CR_PLS_LEV2 /*!< PVD threshold around 2.4 V */ +#define PWR_PVDLEVEL_3 PWR_CR_PLS_LEV3 /*!< PVD threshold around 2.5 V */ +#define PWR_PVDLEVEL_4 PWR_CR_PLS_LEV4 /*!< PVD threshold around 2.6 V */ +#define PWR_PVDLEVEL_5 PWR_CR_PLS_LEV5 /*!< PVD threshold around 2.7 V */ +#define PWR_PVDLEVEL_6 PWR_CR_PLS_LEV6 /*!< PVD threshold around 2.8 V */ +#define PWR_PVDLEVEL_7 PWR_CR_PLS_LEV7 /*!< PVD threshold around 2.9 V */ +/** + * @} + */ + +/** @defgroup PWREx_PVD_Mode PWR Extended 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 */ +/** + * @} + */ + +#define PWR_EXTI_LINE_PVD EXTI_IMR_MR16 /*!< External interrupt line 16 Connected to the PVD EXTI Line */ + +#endif /* STM32F302xE || STM32F303xE || */ + /* STM32F302xC || STM32F303xC || */ + /* STM32F303x8 || STM32F334x8 || */ + /* STM32F301x8 || STM32F302x8 || */ + /* STM32F373xC */ + +#if defined(STM32F373xC) || defined(STM32F378xx) +/** @defgroup PWREx_SDADC_ANALOGx PWR Extended SDADC ANALOGx + * @{ + */ +#define PWR_SDADC_ANALOG1 ((uint32_t)PWR_CR_ENSD1) /*!< Enable SDADC1 */ +#define PWR_SDADC_ANALOG2 ((uint32_t)PWR_CR_ENSD2) /*!< Enable SDADC2 */ +#define PWR_SDADC_ANALOG3 ((uint32_t)PWR_CR_ENSD3) /*!< Enable SDADC3 */ +/** + * @} + */ +#endif /* STM32F373xC || STM32F378xx */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup PWREx_Exported_Macros PWR Extended Exported Macros + * @{ + */ + +#if defined(STM32F302xE) || defined(STM32F303xE) || \ + defined(STM32F302xC) || defined(STM32F303xC) || \ + defined(STM32F303x8) || defined(STM32F334x8) || \ + defined(STM32F301x8) || defined(STM32F302x8) || \ + defined(STM32F373xC) + +/** + * @brief Enable interrupt on PVD Exti Line 16. + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_ENABLE_IT() (EXTI->IMR |= (PWR_EXTI_LINE_PVD)) + +/** + * @brief Disable interrupt on PVD Exti Line 16. + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_DISABLE_IT() (EXTI->IMR &= ~(PWR_EXTI_LINE_PVD)) + +/** + * @brief Generate a Software interrupt on selected EXTI line. + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_GENERATE_SWIT() (EXTI->SWIER |= (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 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 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 Disable the PVD Extended Interrupt Rising & Falling Trigger. + * @retval None + */ +#define __HAL_PWR_PVD_EXTI_DISABLE_RISING_FALLING_EDGE() __HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE();__HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE(); + +/** + * @brief PVD EXTI line configuration: set falling edge trigger. + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE() EXTI->FTSR |= (PWR_EXTI_LINE_PVD) + +/** + * @brief PVD EXTI line configuration: set rising edge trigger. + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE() EXTI->RTSR |= (PWR_EXTI_LINE_PVD) + +/** + * @brief Enable the PVD Extended Interrupt Rising & Falling Trigger. + * @retval None + */ +#define __HAL_PWR_PVD_EXTI_ENABLE_RISING_FALLING_EDGE() __HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE();__HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE(); + +/** + * @brief Check whether the specified PVD EXTI interrupt flag is set or not. + * @retval EXTI PVD Line Status. + */ +#define __HAL_PWR_PVD_EXTI_GET_FLAG() (EXTI->PR & (PWR_EXTI_LINE_PVD)) + +/** + * @brief Clear the PVD EXTI flag. + * @retval None. + */ +#define __HAL_PWR_PVD_EXTI_CLEAR_FLAG() (EXTI->PR = (PWR_EXTI_LINE_PVD)) + +#endif /* STM32F302xE || STM32F303xE || */ + /* STM32F302xC || STM32F303xC || */ + /* STM32F303x8 || STM32F334x8 || */ + /* STM32F301x8 || STM32F302x8 || */ + /* STM32F373xC */ + +/** + * @} + */ + +/* Private macros --------------------------------------------------------*/ +/** @addtogroup PWREx_Private_Macros PWR Extended Private Macros + * @{ + */ + +#if defined(STM32F302xE) || defined(STM32F303xE) || \ + defined(STM32F302xC) || defined(STM32F303xC) || \ + defined(STM32F303x8) || defined(STM32F334x8) || \ + defined(STM32F301x8) || defined(STM32F302x8) || \ + defined(STM32F373xC) +#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)) +#endif /* STM32F302xE || STM32F303xE || */ + /* STM32F302xC || STM32F303xC || */ + /* STM32F303x8 || STM32F334x8 || */ + /* STM32F301x8 || STM32F302x8 || */ + /* STM32F373xC */ + +#if defined(STM32F373xC) || defined(STM32F378xx) +#define IS_PWR_SDADC_ANALOG(SDADC) (((SDADC) == PWR_SDADC_ANALOG1) || \ + ((SDADC) == PWR_SDADC_ANALOG2) || \ + ((SDADC) == PWR_SDADC_ANALOG3)) +#endif /* STM32F373xC || STM32F378xx */ + + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ + +/** @addtogroup PWREx_Exported_Functions PWR Extended Exported Functions + * @{ + */ + +/** @addtogroup PWREx_Exported_Functions_Group1 Peripheral Extended Control Functions + * @{ + */ +/* Peripheral Extended control functions **************************************/ +#if defined(STM32F302xE) || defined(STM32F303xE) || \ + defined(STM32F302xC) || defined(STM32F303xC) || \ + defined(STM32F303x8) || defined(STM32F334x8) || \ + defined(STM32F301x8) || defined(STM32F302x8) || \ + defined(STM32F373xC) +void HAL_PWR_ConfigPVD(PWR_PVDTypeDef *sConfigPVD); +void HAL_PWR_EnablePVD(void); +void HAL_PWR_DisablePVD(void); +void HAL_PWR_PVD_IRQHandler(void); +void HAL_PWR_PVDCallback(void); +#endif /* STM32F302xE || STM32F303xE || */ + /* STM32F302xC || STM32F303xC || */ + /* STM32F303x8 || STM32F334x8 || */ + /* STM32F301x8 || STM32F302x8 || */ + /* STM32F373xC */ + +#if defined(STM32F373xC) || defined(STM32F378xx) +void HAL_PWREx_EnableSDADC(uint32_t Analogx); +void HAL_PWREx_DisableSDADC(uint32_t Analogx); +#endif /* STM32F373xC || STM32F378xx */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F3xx_HAL_PWR_EX_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h new file mode 100644 index 0000000..b101ef0 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h @@ -0,0 +1,1740 @@ +/** + ****************************************************************************** + * @file stm32f3xx_hal_rcc.h + * @author MCD Application Team + * @brief Header file of RCC HAL module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F3xx_HAL_RCC_H +#define __STM32F3xx_HAL_RCC_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f3xx_hal_def.h" + +/** @addtogroup STM32F3xx_HAL_Driver + * @{ + */ + +/** @addtogroup RCC + * @{ + */ + +/** @addtogroup RCC_Private_Constants + * @{ + */ + +/** @defgroup RCC_Timeout RCC Timeout + * @{ + */ + +/* Disable Backup domain write protection state change timeout */ +#define RCC_DBP_TIMEOUT_VALUE (100U) /* 100 ms */ +/* LSE state change timeout */ +#define RCC_LSE_TIMEOUT_VALUE LSE_STARTUP_TIMEOUT +#define CLOCKSWITCH_TIMEOUT_VALUE (5000U) /* 5 s */ +#define HSE_TIMEOUT_VALUE HSE_STARTUP_TIMEOUT +#define HSI_TIMEOUT_VALUE (2U) /* 2 ms (minimum Tick + 1U) */ +#define LSI_TIMEOUT_VALUE (2U) /* 2 ms (minimum Tick + 1U) */ +#define PLL_TIMEOUT_VALUE (2U) /* 2 ms (minimum Tick + 1U) */ +/** + * @} + */ + +/** @defgroup RCC_Register_Offset Register offsets + * @{ + */ +#define RCC_OFFSET (RCC_BASE - PERIPH_BASE) +#define RCC_CR_OFFSET 0x00 +#define RCC_CFGR_OFFSET 0x04 +#define RCC_CIR_OFFSET 0x08 +#define RCC_BDCR_OFFSET 0x20 +#define RCC_CSR_OFFSET 0x24 + +/** + * @} + */ + +/** @defgroup RCC_BitAddress_AliasRegion BitAddress AliasRegion + * @brief RCC registers bit address in the alias region + * @{ + */ +#define RCC_CR_OFFSET_BB (RCC_OFFSET + RCC_CR_OFFSET) +#define RCC_CFGR_OFFSET_BB (RCC_OFFSET + RCC_CFGR_OFFSET) +#define RCC_CIR_OFFSET_BB (RCC_OFFSET + RCC_CIR_OFFSET) +#define RCC_BDCR_OFFSET_BB (RCC_OFFSET + RCC_BDCR_OFFSET) +#define RCC_CSR_OFFSET_BB (RCC_OFFSET + RCC_CSR_OFFSET) + +/* --- CR Register ---*/ +/* Alias word address of HSION bit */ +#define RCC_HSION_BIT_NUMBER POSITION_VAL(RCC_CR_HSION) +#define RCC_CR_HSION_BB ((uint32_t)(PERIPH_BB_BASE + (RCC_CR_OFFSET_BB * 32U) + (RCC_HSION_BIT_NUMBER * 4U))) +/* Alias word address of HSEON bit */ +#define RCC_HSEON_BIT_NUMBER POSITION_VAL(RCC_CR_HSEON) +#define RCC_CR_HSEON_BB ((uint32_t)(PERIPH_BB_BASE + (RCC_CR_OFFSET_BB * 32U) + (RCC_HSEON_BIT_NUMBER * 4U))) +/* Alias word address of CSSON bit */ +#define RCC_CSSON_BIT_NUMBER POSITION_VAL(RCC_CR_CSSON) +#define RCC_CR_CSSON_BB ((uint32_t)(PERIPH_BB_BASE + (RCC_CR_OFFSET_BB * 32U) + (RCC_CSSON_BIT_NUMBER * 4U))) +/* Alias word address of PLLON bit */ +#define RCC_PLLON_BIT_NUMBER POSITION_VAL(RCC_CR_PLLON) +#define RCC_CR_PLLON_BB ((uint32_t)(PERIPH_BB_BASE + (RCC_CR_OFFSET_BB * 32U) + (RCC_PLLON_BIT_NUMBER * 4U))) + +/* --- CSR Register ---*/ +/* Alias word address of LSION bit */ +#define RCC_LSION_BIT_NUMBER POSITION_VAL(RCC_CSR_LSION) +#define RCC_CSR_LSION_BB ((uint32_t)(PERIPH_BB_BASE + (RCC_CSR_OFFSET_BB * 32U) + (RCC_LSION_BIT_NUMBER * 4U))) + +/* Alias word address of RMVF bit */ +#define RCC_RMVF_BIT_NUMBER POSITION_VAL(RCC_CSR_RMVF) +#define RCC_CSR_RMVF_BB ((uint32_t)(PERIPH_BB_BASE + (RCC_CSR_OFFSET_BB * 32U) + (RCC_RMVF_BIT_NUMBER * 4U))) + +/* --- BDCR Registers ---*/ +/* Alias word address of LSEON bit */ +#define RCC_LSEON_BIT_NUMBER POSITION_VAL(RCC_BDCR_LSEON) +#define RCC_BDCR_LSEON_BB ((uint32_t)(PERIPH_BB_BASE + (RCC_BDCR_OFFSET_BB * 32U) + (RCC_LSEON_BIT_NUMBER * 4U))) + +/* Alias word address of LSEON bit */ +#define RCC_LSEBYP_BIT_NUMBER POSITION_VAL(RCC_BDCR_LSEBYP) +#define RCC_BDCR_LSEBYP_BB ((uint32_t)(PERIPH_BB_BASE + (RCC_BDCR_OFFSET_BB * 32U) + (RCC_LSEBYP_BIT_NUMBER * 4U))) + +/* Alias word address of RTCEN bit */ +#define RCC_RTCEN_BIT_NUMBER POSITION_VAL(RCC_BDCR_RTCEN) +#define RCC_BDCR_RTCEN_BB ((uint32_t)(PERIPH_BB_BASE + (RCC_BDCR_OFFSET_BB * 32U) + (RCC_RTCEN_BIT_NUMBER * 4U))) + +/* Alias word address of BDRST bit */ +#define RCC_BDRST_BIT_NUMBER POSITION_VAL(RCC_BDCR_BDRST) +#define RCC_BDCR_BDRST_BB ((uint32_t)(PERIPH_BB_BASE + (RCC_BDCR_OFFSET_BB * 32U) + (RCC_BDRST_BIT_NUMBER * 4U))) + +/** + * @} + */ + +/* CR register byte 2 (Bits[23:16]) base address */ +#define RCC_CR_BYTE2_ADDRESS ((uint32_t)(RCC_BASE + RCC_CR_OFFSET + 0x02U)) + +/* CIR register byte 1 (Bits[15:8]) base address */ +#define RCC_CIR_BYTE1_ADDRESS ((uint32_t)(RCC_BASE + RCC_CIR_OFFSET + 0x01U)) + +/* CIR register byte 2 (Bits[23:16]) base address */ +#define RCC_CIR_BYTE2_ADDRESS ((uint32_t)(RCC_BASE + RCC_CIR_OFFSET + 0x02U)) + +/* Defines used for Flags */ +#define CR_REG_INDEX ((uint8_t)1U) +#define BDCR_REG_INDEX ((uint8_t)2U) +#define CSR_REG_INDEX ((uint8_t)3U) +#define CFGR_REG_INDEX ((uint8_t)4U) + +#define RCC_FLAG_MASK ((uint8_t)0x1FU) + +/** + * @} + */ + +/** @addtogroup RCC_Private_Macros + * @{ + */ +#define IS_RCC_PLLSOURCE(__SOURCE__) (((__SOURCE__) == RCC_PLLSOURCE_HSI) || \ + ((__SOURCE__) == RCC_PLLSOURCE_HSE)) +#define IS_RCC_OSCILLATORTYPE(__OSCILLATOR__) (((__OSCILLATOR__) == RCC_OSCILLATORTYPE_NONE) || \ + (((__OSCILLATOR__) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE) || \ + (((__OSCILLATOR__) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI) || \ + (((__OSCILLATOR__) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI) || \ + (((__OSCILLATOR__) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE)) +#define IS_RCC_HSE(__HSE__) (((__HSE__) == RCC_HSE_OFF) || ((__HSE__) == RCC_HSE_ON) || \ + ((__HSE__) == RCC_HSE_BYPASS)) +#define IS_RCC_LSE(__LSE__) (((__LSE__) == RCC_LSE_OFF) || ((__LSE__) == RCC_LSE_ON) || \ + ((__LSE__) == RCC_LSE_BYPASS)) +#define IS_RCC_HSI(__HSI__) (((__HSI__) == RCC_HSI_OFF) || ((__HSI__) == RCC_HSI_ON)) +#define IS_RCC_CALIBRATION_VALUE(__VALUE__) ((__VALUE__) <= 0x1FU) +#define IS_RCC_LSI(__LSI__) (((__LSI__) == RCC_LSI_OFF) || ((__LSI__) == RCC_LSI_ON)) +#define IS_RCC_PLL(__PLL__) (((__PLL__) == RCC_PLL_NONE) || ((__PLL__) == RCC_PLL_OFF) || \ + ((__PLL__) == RCC_PLL_ON)) +#if defined(RCC_CFGR_PLLSRC_HSI_PREDIV) +#define IS_RCC_PREDIV(__PREDIV__) (((__PREDIV__) == RCC_PREDIV_DIV1) || ((__PREDIV__) == RCC_PREDIV_DIV2) || \ + ((__PREDIV__) == RCC_PREDIV_DIV3) || ((__PREDIV__) == RCC_PREDIV_DIV4) || \ + ((__PREDIV__) == RCC_PREDIV_DIV5) || ((__PREDIV__) == RCC_PREDIV_DIV6) || \ + ((__PREDIV__) == RCC_PREDIV_DIV7) || ((__PREDIV__) == RCC_PREDIV_DIV8) || \ + ((__PREDIV__) == RCC_PREDIV_DIV9) || ((__PREDIV__) == RCC_PREDIV_DIV10) || \ + ((__PREDIV__) == RCC_PREDIV_DIV11) || ((__PREDIV__) == RCC_PREDIV_DIV12) || \ + ((__PREDIV__) == RCC_PREDIV_DIV13) || ((__PREDIV__) == RCC_PREDIV_DIV14) || \ + ((__PREDIV__) == RCC_PREDIV_DIV15) || ((__PREDIV__) == RCC_PREDIV_DIV16)) +#else +#define IS_RCC_PLL_DIV(__DIV__) (((__DIV__) == RCC_PLL_DIV2) || \ + ((__DIV__) == RCC_PLL_DIV3) || ((__DIV__) == RCC_PLL_DIV4)) +#endif +#if defined(RCC_CFGR_PLLSRC_HSI_DIV2) +#define IS_RCC_HSE_PREDIV(DIV) (((DIV) == RCC_HSE_PREDIV_DIV1) || ((DIV) == RCC_HSE_PREDIV_DIV2) || \ + ((DIV) == RCC_HSE_PREDIV_DIV3) || ((DIV) == RCC_HSE_PREDIV_DIV4) || \ + ((DIV) == RCC_HSE_PREDIV_DIV5) || ((DIV) == RCC_HSE_PREDIV_DIV6) || \ + ((DIV) == RCC_HSE_PREDIV_DIV7) || ((DIV) == RCC_HSE_PREDIV_DIV8) || \ + ((DIV) == RCC_HSE_PREDIV_DIV9) || ((DIV) == RCC_HSE_PREDIV_DIV10) || \ + ((DIV) == RCC_HSE_PREDIV_DIV11) || ((DIV) == RCC_HSE_PREDIV_DIV12) || \ + ((DIV) == RCC_HSE_PREDIV_DIV13) || ((DIV) == RCC_HSE_PREDIV_DIV14) || \ + ((DIV) == RCC_HSE_PREDIV_DIV15) || ((DIV) == RCC_HSE_PREDIV_DIV16)) +#endif /* RCC_CFGR_PLLSRC_HSI_DIV2 */ + +#define IS_RCC_PLL_MUL(__MUL__) (((__MUL__) == RCC_PLL_MUL2) || ((__MUL__) == RCC_PLL_MUL3) || \ + ((__MUL__) == RCC_PLL_MUL4) || ((__MUL__) == RCC_PLL_MUL5) || \ + ((__MUL__) == RCC_PLL_MUL6) || ((__MUL__) == RCC_PLL_MUL7) || \ + ((__MUL__) == RCC_PLL_MUL8) || ((__MUL__) == RCC_PLL_MUL9) || \ + ((__MUL__) == RCC_PLL_MUL10) || ((__MUL__) == RCC_PLL_MUL11) || \ + ((__MUL__) == RCC_PLL_MUL12) || ((__MUL__) == RCC_PLL_MUL13) || \ + ((__MUL__) == RCC_PLL_MUL14) || ((__MUL__) == RCC_PLL_MUL15) || \ + ((__MUL__) == RCC_PLL_MUL16)) +#define IS_RCC_CLOCKTYPE(CLK) ((((CLK) & RCC_CLOCKTYPE_SYSCLK) == RCC_CLOCKTYPE_SYSCLK) || \ + (((CLK) & RCC_CLOCKTYPE_HCLK) == RCC_CLOCKTYPE_HCLK) || \ + (((CLK) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) || \ + (((CLK) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2)) +#define IS_RCC_SYSCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_SYSCLKSOURCE_HSI) || \ + ((__SOURCE__) == RCC_SYSCLKSOURCE_HSE) || \ + ((__SOURCE__) == RCC_SYSCLKSOURCE_PLLCLK)) +#define IS_RCC_SYSCLKSOURCE_STATUS(__SOURCE__) (((__SOURCE__) == RCC_SYSCLKSOURCE_STATUS_HSI) || \ + ((__SOURCE__) == RCC_SYSCLKSOURCE_STATUS_HSE) || \ + ((__SOURCE__) == RCC_SYSCLKSOURCE_STATUS_PLLCLK)) +#define IS_RCC_HCLK(__HCLK__) (((__HCLK__) == RCC_SYSCLK_DIV1) || ((__HCLK__) == RCC_SYSCLK_DIV2) || \ + ((__HCLK__) == RCC_SYSCLK_DIV4) || ((__HCLK__) == RCC_SYSCLK_DIV8) || \ + ((__HCLK__) == RCC_SYSCLK_DIV16) || ((__HCLK__) == RCC_SYSCLK_DIV64) || \ + ((__HCLK__) == RCC_SYSCLK_DIV128) || ((__HCLK__) == RCC_SYSCLK_DIV256) || \ + ((__HCLK__) == RCC_SYSCLK_DIV512)) +#define IS_RCC_PCLK(__PCLK__) (((__PCLK__) == RCC_HCLK_DIV1) || ((__PCLK__) == RCC_HCLK_DIV2) || \ + ((__PCLK__) == RCC_HCLK_DIV4) || ((__PCLK__) == RCC_HCLK_DIV8) || \ + ((__PCLK__) == RCC_HCLK_DIV16)) +#define IS_RCC_MCO(__MCO__) ((__MCO__) == RCC_MCO) +#define IS_RCC_RTCCLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_RTCCLKSOURCE_NO_CLK) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_LSE) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_LSI) || \ + ((__SOURCE__) == RCC_RTCCLKSOURCE_HSE_DIV32)) +#if defined(RCC_CFGR3_USART2SW) +#define IS_RCC_USART2CLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_USART2CLKSOURCE_PCLK1) || \ + ((__SOURCE__) == RCC_USART2CLKSOURCE_SYSCLK) || \ + ((__SOURCE__) == RCC_USART2CLKSOURCE_LSE) || \ + ((__SOURCE__) == RCC_USART2CLKSOURCE_HSI)) +#endif /* RCC_CFGR3_USART2SW */ +#if defined(RCC_CFGR3_USART3SW) +#define IS_RCC_USART3CLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_USART3CLKSOURCE_PCLK1) || \ + ((__SOURCE__) == RCC_USART3CLKSOURCE_SYSCLK) || \ + ((__SOURCE__) == RCC_USART3CLKSOURCE_LSE) || \ + ((__SOURCE__) == RCC_USART3CLKSOURCE_HSI)) +#endif /* RCC_CFGR3_USART3SW */ +#define IS_RCC_I2C1CLKSOURCE(__SOURCE__) (((__SOURCE__) == RCC_I2C1CLKSOURCE_HSI) || \ + ((__SOURCE__) == RCC_I2C1CLKSOURCE_SYSCLK)) + +/** + * @} + */ + +/* Exported types ------------------------------------------------------------*/ + +/** @defgroup RCC_Exported_Types RCC Exported Types + * @{ + */ + +/** + * @brief RCC PLL configuration structure definition + */ +typedef struct +{ + uint32_t PLLState; /*!< PLLState: The new state of the PLL. + This parameter can be a value of @ref RCC_PLL_Config */ + + uint32_t PLLSource; /*!< PLLSource: PLL entry clock source. + This parameter must be a value of @ref RCC_PLL_Clock_Source */ + + uint32_t PLLMUL; /*!< PLLMUL: Multiplication factor for PLL VCO input clock + This parameter must be a value of @ref RCC_PLL_Multiplication_Factor*/ + +#if defined(RCC_CFGR_PLLSRC_HSI_PREDIV) + uint32_t PREDIV; /*!< PREDIV: Predivision factor for PLL VCO input clock + This parameter must be a value of @ref RCC_PLL_Prediv_Factor */ + +#endif +} RCC_PLLInitTypeDef; + +/** + * @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 */ + +#if defined(RCC_CFGR_PLLSRC_HSI_DIV2) + uint32_t HSEPredivValue; /*!< The HSE predivision factor value. + This parameter can be a value of @ref RCC_PLL_HSE_Prediv_Factor */ + +#endif /* RCC_CFGR_PLLSRC_HSI_DIV2 */ + 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 = 0x1FU */ + + 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_PLL_Clock_Source PLL Clock Source + * @{ + */ + +#if defined(RCC_CFGR_PLLSRC_HSI_PREDIV) +#define RCC_PLLSOURCE_HSI RCC_CFGR_PLLSRC_HSI_PREDIV /*!< HSI clock selected as PLL entry clock source */ +#endif /* RCC_CFGR_PLLSRC_HSI_PREDIV */ +#if defined(RCC_CFGR_PLLSRC_HSI_DIV2) +#define RCC_PLLSOURCE_HSI RCC_CFGR_PLLSRC_HSI_DIV2 /*!< HSI clock divided by 2 selected as PLL entry clock source */ +#endif /* RCC_CFGR_PLLSRC_HSI_DIV2 */ +#define RCC_PLLSOURCE_HSE RCC_CFGR_PLLSRC_HSE_PREDIV /*!< HSE clock selected as PLL entry clock source */ + +/** + * @} + */ + +/** @defgroup RCC_Oscillator_Type Oscillator Type + * @{ + */ +#define RCC_OSCILLATORTYPE_NONE (0x00000000U) +#define RCC_OSCILLATORTYPE_HSE (0x00000001U) +#define RCC_OSCILLATORTYPE_HSI (0x00000002U) +#define RCC_OSCILLATORTYPE_LSE (0x00000004U) +#define RCC_OSCILLATORTYPE_LSI (0x00000008U) +/** + * @} + */ + +/** @defgroup RCC_HSE_Config HSE Config + * @{ + */ +#define RCC_HSE_OFF (0x00000000U) /*!< HSE clock deactivation */ +#define RCC_HSE_ON RCC_CR_HSEON /*!< HSE clock activation */ +#define RCC_HSE_BYPASS ((uint32_t)(RCC_CR_HSEBYP | RCC_CR_HSEON)) /*!< External clock source for HSE clock */ +/** + * @} + */ + +/** @defgroup RCC_LSE_Config LSE Config + * @{ + */ +#define RCC_LSE_OFF (0x00000000U) /*!< LSE clock deactivation */ +#define RCC_LSE_ON RCC_BDCR_LSEON /*!< LSE clock activation */ +#define RCC_LSE_BYPASS ((uint32_t)(RCC_BDCR_LSEBYP | RCC_BDCR_LSEON)) /*!< External clock source for LSE clock */ + +/** + * @} + */ + +/** @defgroup RCC_HSI_Config HSI Config + * @{ + */ +#define RCC_HSI_OFF (0x00000000U) /*!< HSI clock deactivation */ +#define RCC_HSI_ON RCC_CR_HSION /*!< HSI clock activation */ + +#define RCC_HSICALIBRATION_DEFAULT (0x10U) /* Default HSI calibration trimming value */ + +/** + * @} + */ + +/** @defgroup RCC_LSI_Config LSI Config + * @{ + */ +#define RCC_LSI_OFF (0x00000000U) /*!< LSI clock deactivation */ +#define RCC_LSI_ON RCC_CSR_LSION /*!< LSI clock activation */ + +/** + * @} + */ + +/** @defgroup RCC_PLL_Config PLL Config + * @{ + */ +#define RCC_PLL_NONE (0x00000000U) /*!< PLL is not configured */ +#define RCC_PLL_OFF (0x00000001U) /*!< PLL deactivation */ +#define RCC_PLL_ON (0x00000002U) /*!< PLL activation */ + +/** + * @} + */ + +/** @defgroup RCC_System_Clock_Type System Clock Type + * @{ + */ +#define RCC_CLOCKTYPE_SYSCLK (0x00000001U) /*!< SYSCLK to configure */ +#define RCC_CLOCKTYPE_HCLK (0x00000002U) /*!< HCLK to configure */ +#define RCC_CLOCKTYPE_PCLK1 (0x00000004U) /*!< PCLK1 to configure */ +#define RCC_CLOCKTYPE_PCLK2 (0x00000008U) /*!< PCLK2 to configure */ + +/** + * @} + */ + +/** @defgroup RCC_System_Clock_Source System Clock Source + * @{ + */ +#define RCC_SYSCLKSOURCE_HSI RCC_CFGR_SW_HSI /*!< HSI selected as system clock */ +#define RCC_SYSCLKSOURCE_HSE RCC_CFGR_SW_HSE /*!< HSE selected as system clock */ +#define RCC_SYSCLKSOURCE_PLLCLK RCC_CFGR_SW_PLL /*!< PLL selected as system clock */ + +/** + * @} + */ + +/** @defgroup RCC_System_Clock_Source_Status System Clock Source Status + * @{ + */ +#define RCC_SYSCLKSOURCE_STATUS_HSI RCC_CFGR_SWS_HSI /*!< HSI used as system clock */ +#define RCC_SYSCLKSOURCE_STATUS_HSE RCC_CFGR_SWS_HSE /*!< HSE used as system clock */ +#define RCC_SYSCLKSOURCE_STATUS_PLLCLK RCC_CFGR_SWS_PLL /*!< PLL used as system clock */ + +/** + * @} + */ + +/** @defgroup RCC_AHB_Clock_Source AHB Clock Source + * @{ + */ +#define RCC_SYSCLK_DIV1 RCC_CFGR_HPRE_DIV1 /*!< SYSCLK not divided */ +#define RCC_SYSCLK_DIV2 RCC_CFGR_HPRE_DIV2 /*!< SYSCLK divided by 2 */ +#define RCC_SYSCLK_DIV4 RCC_CFGR_HPRE_DIV4 /*!< SYSCLK divided by 4 */ +#define RCC_SYSCLK_DIV8 RCC_CFGR_HPRE_DIV8 /*!< SYSCLK divided by 8 */ +#define RCC_SYSCLK_DIV16 RCC_CFGR_HPRE_DIV16 /*!< SYSCLK divided by 16 */ +#define RCC_SYSCLK_DIV64 RCC_CFGR_HPRE_DIV64 /*!< SYSCLK divided by 64 */ +#define RCC_SYSCLK_DIV128 RCC_CFGR_HPRE_DIV128 /*!< SYSCLK divided by 128 */ +#define RCC_SYSCLK_DIV256 RCC_CFGR_HPRE_DIV256 /*!< SYSCLK divided by 256 */ +#define RCC_SYSCLK_DIV512 RCC_CFGR_HPRE_DIV512 /*!< SYSCLK divided by 512 */ + +/** + * @} + */ + +/** @defgroup RCC_APB1_APB2_Clock_Source APB1 APB2 Clock Source + * @{ + */ +#define RCC_HCLK_DIV1 RCC_CFGR_PPRE1_DIV1 /*!< HCLK not divided */ +#define RCC_HCLK_DIV2 RCC_CFGR_PPRE1_DIV2 /*!< HCLK divided by 2 */ +#define RCC_HCLK_DIV4 RCC_CFGR_PPRE1_DIV4 /*!< HCLK divided by 4 */ +#define RCC_HCLK_DIV8 RCC_CFGR_PPRE1_DIV8 /*!< HCLK divided by 8 */ +#define RCC_HCLK_DIV16 RCC_CFGR_PPRE1_DIV16 /*!< HCLK divided by 16 */ + +/** + * @} + */ + +/** @defgroup RCC_RTC_Clock_Source RTC Clock Source + * @{ + */ +#define RCC_RTCCLKSOURCE_NO_CLK RCC_BDCR_RTCSEL_NOCLOCK /*!< No clock */ +#define RCC_RTCCLKSOURCE_LSE RCC_BDCR_RTCSEL_LSE /*!< LSE oscillator clock used as RTC clock */ +#define RCC_RTCCLKSOURCE_LSI RCC_BDCR_RTCSEL_LSI /*!< LSI oscillator clock used as RTC clock */ +#define RCC_RTCCLKSOURCE_HSE_DIV32 RCC_BDCR_RTCSEL_HSE /*!< HSE oscillator clock divided by 32 used as RTC clock */ +/** + * @} + */ + +/** @defgroup RCC_PLL_Multiplication_Factor RCC PLL Multiplication Factor + * @{ + */ +#define RCC_PLL_MUL2 RCC_CFGR_PLLMUL2 +#define RCC_PLL_MUL3 RCC_CFGR_PLLMUL3 +#define RCC_PLL_MUL4 RCC_CFGR_PLLMUL4 +#define RCC_PLL_MUL5 RCC_CFGR_PLLMUL5 +#define RCC_PLL_MUL6 RCC_CFGR_PLLMUL6 +#define RCC_PLL_MUL7 RCC_CFGR_PLLMUL7 +#define RCC_PLL_MUL8 RCC_CFGR_PLLMUL8 +#define RCC_PLL_MUL9 RCC_CFGR_PLLMUL9 +#define RCC_PLL_MUL10 RCC_CFGR_PLLMUL10 +#define RCC_PLL_MUL11 RCC_CFGR_PLLMUL11 +#define RCC_PLL_MUL12 RCC_CFGR_PLLMUL12 +#define RCC_PLL_MUL13 RCC_CFGR_PLLMUL13 +#define RCC_PLL_MUL14 RCC_CFGR_PLLMUL14 +#define RCC_PLL_MUL15 RCC_CFGR_PLLMUL15 +#define RCC_PLL_MUL16 RCC_CFGR_PLLMUL16 + +/** + * @} + */ + +#if defined(RCC_CFGR_PLLSRC_HSI_PREDIV) +/** @defgroup RCC_PLL_Prediv_Factor RCC PLL Prediv Factor + * @{ + */ + +#define RCC_PREDIV_DIV1 RCC_CFGR2_PREDIV_DIV1 +#define RCC_PREDIV_DIV2 RCC_CFGR2_PREDIV_DIV2 +#define RCC_PREDIV_DIV3 RCC_CFGR2_PREDIV_DIV3 +#define RCC_PREDIV_DIV4 RCC_CFGR2_PREDIV_DIV4 +#define RCC_PREDIV_DIV5 RCC_CFGR2_PREDIV_DIV5 +#define RCC_PREDIV_DIV6 RCC_CFGR2_PREDIV_DIV6 +#define RCC_PREDIV_DIV7 RCC_CFGR2_PREDIV_DIV7 +#define RCC_PREDIV_DIV8 RCC_CFGR2_PREDIV_DIV8 +#define RCC_PREDIV_DIV9 RCC_CFGR2_PREDIV_DIV9 +#define RCC_PREDIV_DIV10 RCC_CFGR2_PREDIV_DIV10 +#define RCC_PREDIV_DIV11 RCC_CFGR2_PREDIV_DIV11 +#define RCC_PREDIV_DIV12 RCC_CFGR2_PREDIV_DIV12 +#define RCC_PREDIV_DIV13 RCC_CFGR2_PREDIV_DIV13 +#define RCC_PREDIV_DIV14 RCC_CFGR2_PREDIV_DIV14 +#define RCC_PREDIV_DIV15 RCC_CFGR2_PREDIV_DIV15 +#define RCC_PREDIV_DIV16 RCC_CFGR2_PREDIV_DIV16 + +/** + * @} + */ + +#endif +#if defined(RCC_CFGR_PLLSRC_HSI_DIV2) +/** @defgroup RCC_PLL_HSE_Prediv_Factor RCC PLL HSE Prediv Factor + * @{ + */ + +#define RCC_HSE_PREDIV_DIV1 RCC_CFGR2_PREDIV_DIV1 +#define RCC_HSE_PREDIV_DIV2 RCC_CFGR2_PREDIV_DIV2 +#define RCC_HSE_PREDIV_DIV3 RCC_CFGR2_PREDIV_DIV3 +#define RCC_HSE_PREDIV_DIV4 RCC_CFGR2_PREDIV_DIV4 +#define RCC_HSE_PREDIV_DIV5 RCC_CFGR2_PREDIV_DIV5 +#define RCC_HSE_PREDIV_DIV6 RCC_CFGR2_PREDIV_DIV6 +#define RCC_HSE_PREDIV_DIV7 RCC_CFGR2_PREDIV_DIV7 +#define RCC_HSE_PREDIV_DIV8 RCC_CFGR2_PREDIV_DIV8 +#define RCC_HSE_PREDIV_DIV9 RCC_CFGR2_PREDIV_DIV9 +#define RCC_HSE_PREDIV_DIV10 RCC_CFGR2_PREDIV_DIV10 +#define RCC_HSE_PREDIV_DIV11 RCC_CFGR2_PREDIV_DIV11 +#define RCC_HSE_PREDIV_DIV12 RCC_CFGR2_PREDIV_DIV12 +#define RCC_HSE_PREDIV_DIV13 RCC_CFGR2_PREDIV_DIV13 +#define RCC_HSE_PREDIV_DIV14 RCC_CFGR2_PREDIV_DIV14 +#define RCC_HSE_PREDIV_DIV15 RCC_CFGR2_PREDIV_DIV15 +#define RCC_HSE_PREDIV_DIV16 RCC_CFGR2_PREDIV_DIV16 + +/** + * @} + */ +#endif /* RCC_CFGR_PLLSRC_HSI_DIV2 */ + +#if defined(RCC_CFGR3_USART2SW) +/** @defgroup RCC_USART2_Clock_Source RCC USART2 Clock Source + * @{ + */ +#define RCC_USART2CLKSOURCE_PCLK1 RCC_CFGR3_USART2SW_PCLK +#define RCC_USART2CLKSOURCE_SYSCLK RCC_CFGR3_USART2SW_SYSCLK +#define RCC_USART2CLKSOURCE_LSE RCC_CFGR3_USART2SW_LSE +#define RCC_USART2CLKSOURCE_HSI RCC_CFGR3_USART2SW_HSI + +/** + * @} + */ +#endif /* RCC_CFGR3_USART2SW */ + +#if defined(RCC_CFGR3_USART3SW) +/** @defgroup RCC_USART3_Clock_Source RCC USART3 Clock Source + * @{ + */ +#define RCC_USART3CLKSOURCE_PCLK1 RCC_CFGR3_USART3SW_PCLK +#define RCC_USART3CLKSOURCE_SYSCLK RCC_CFGR3_USART3SW_SYSCLK +#define RCC_USART3CLKSOURCE_LSE RCC_CFGR3_USART3SW_LSE +#define RCC_USART3CLKSOURCE_HSI RCC_CFGR3_USART3SW_HSI + +/** + * @} + */ +#endif /* RCC_CFGR3_USART3SW */ + +/** @defgroup RCC_I2C1_Clock_Source RCC I2C1 Clock Source + * @{ + */ +#define RCC_I2C1CLKSOURCE_HSI RCC_CFGR3_I2C1SW_HSI +#define RCC_I2C1CLKSOURCE_SYSCLK RCC_CFGR3_I2C1SW_SYSCLK + +/** + * @} + */ +/** @defgroup RCC_MCO_Index MCO Index + * @{ + */ +#define RCC_MCO1 (0x00000000U) +#define RCC_MCO RCC_MCO1 /*!< MCO1 to be compliant with other families with 2 MCOs*/ + +/** + * @} + */ + +/** @defgroup RCC_Interrupt Interrupts + * @{ + */ +#define RCC_IT_LSIRDY ((uint8_t)RCC_CIR_LSIRDYF) /*!< LSI Ready Interrupt flag */ +#define RCC_IT_LSERDY ((uint8_t)RCC_CIR_LSERDYF) /*!< LSE Ready Interrupt flag */ +#define RCC_IT_HSIRDY ((uint8_t)RCC_CIR_HSIRDYF) /*!< HSI Ready Interrupt flag */ +#define RCC_IT_HSERDY ((uint8_t)RCC_CIR_HSERDYF) /*!< HSE Ready Interrupt flag */ +#define RCC_IT_PLLRDY ((uint8_t)RCC_CIR_PLLRDYF) /*!< PLL Ready Interrupt flag */ +#define RCC_IT_CSS ((uint8_t)RCC_CIR_CSSF) /*!< Clock Security System Interrupt flag */ +/** + * @} + */ + +/** @defgroup RCC_Flag Flags + * Elements values convention: XXXYYYYYb + * - YYYYY : Flag position in the register + * - XXX : Register index + * - 001: CR register + * - 010: BDCR register + * - 011: CSR register + * - 100: CFGR register + * @{ + */ +/* Flags in the CR register */ +#define RCC_FLAG_HSIRDY ((uint8_t)((CR_REG_INDEX << 5U) | POSITION_VAL(RCC_CR_HSIRDY))) /*!< Internal High Speed clock ready flag */ +#define RCC_FLAG_HSERDY ((uint8_t)((CR_REG_INDEX << 5U) | POSITION_VAL(RCC_CR_HSERDY))) /*!< External High Speed clock ready flag */ +#define RCC_FLAG_PLLRDY ((uint8_t)((CR_REG_INDEX << 5U) | POSITION_VAL(RCC_CR_PLLRDY))) /*!< PLL clock ready flag */ + +/* Flags in the CSR register */ +#define RCC_FLAG_LSIRDY ((uint8_t)((CSR_REG_INDEX << 5U) | POSITION_VAL(RCC_CSR_LSIRDY))) /*!< Internal Low Speed oscillator Ready */ +#if defined(RCC_CSR_V18PWRRSTF) +#define RCC_FLAG_V18PWRRST ((uint8_t)((CSR_REG_INDEX << 5U) | POSITION_VAL(RCC_CSR_V18PWRRSTF))) +#endif +#define RCC_FLAG_OBLRST ((uint8_t)((CSR_REG_INDEX << 5U) | POSITION_VAL(RCC_CSR_OBLRSTF))) /*!< Options bytes loading reset flag */ +#define RCC_FLAG_PINRST ((uint8_t)((CSR_REG_INDEX << 5U) | POSITION_VAL(RCC_CSR_PINRSTF))) /*!< PIN reset flag */ +#define RCC_FLAG_PORRST ((uint8_t)((CSR_REG_INDEX << 5U) | POSITION_VAL(RCC_CSR_PORRSTF))) /*!< POR/PDR reset flag */ +#define RCC_FLAG_SFTRST ((uint8_t)((CSR_REG_INDEX << 5U) | POSITION_VAL(RCC_CSR_SFTRSTF))) /*!< Software Reset flag */ +#define RCC_FLAG_IWDGRST ((uint8_t)((CSR_REG_INDEX << 5U) | POSITION_VAL(RCC_CSR_IWDGRSTF))) /*!< Independent Watchdog reset flag */ +#define RCC_FLAG_WWDGRST ((uint8_t)((CSR_REG_INDEX << 5U) | POSITION_VAL(RCC_CSR_WWDGRSTF))) /*!< Window watchdog reset flag */ +#define RCC_FLAG_LPWRRST ((uint8_t)((CSR_REG_INDEX << 5U) | POSITION_VAL(RCC_CSR_LPWRRSTF))) /*!< Low-Power reset flag */ + +/* Flags in the BDCR register */ +#define RCC_FLAG_LSERDY ((uint8_t)((BDCR_REG_INDEX << 5U) | POSITION_VAL(RCC_BDCR_LSERDY))) /*!< External Low Speed oscillator Ready */ + +/* Flags in the CFGR register */ +#if defined(RCC_CFGR_MCOF) +#define RCC_FLAG_MCO ((uint8_t)((CFGR_REG_INDEX << 5U) | POSITION_VAL(RCC_CFGR_MCOF))) /*!< Microcontroller Clock Output Flag */ +#endif /* RCC_CFGR_MCOF */ + +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ + +/** @defgroup RCC_Exported_Macros RCC Exported Macros + * @{ + */ + +/** @defgroup RCC_AHB_Clock_Enable_Disable RCC AHB Clock Enable Disable + * @brief Enable or disable the AHB peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_GPIOA_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->AHBENR, RCC_AHBENR_GPIOAEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHBENR, RCC_AHBENR_GPIOAEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOB_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->AHBENR, RCC_AHBENR_GPIOBEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHBENR, RCC_AHBENR_GPIOBEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->AHBENR, RCC_AHBENR_GPIOCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHBENR, RCC_AHBENR_GPIOCEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOD_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->AHBENR, RCC_AHBENR_GPIODEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHBENR, RCC_AHBENR_GPIODEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOF_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->AHBENR, RCC_AHBENR_GPIOFEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHBENR, RCC_AHBENR_GPIOFEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CRC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->AHBENR, RCC_AHBENR_CRCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHBENR, RCC_AHBENR_CRCEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_DMA1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->AHBENR, RCC_AHBENR_DMA1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHBENR, RCC_AHBENR_DMA1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SRAM_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->AHBENR, RCC_AHBENR_SRAMEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHBENR, RCC_AHBENR_SRAMEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_FLITF_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->AHBENR, RCC_AHBENR_FLITFEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHBENR, RCC_AHBENR_FLITFEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TSC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->AHBENR, RCC_AHBENR_TSCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHBENR, RCC_AHBENR_TSCEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_GPIOA_CLK_DISABLE() (RCC->AHBENR &= ~(RCC_AHBENR_GPIOAEN)) +#define __HAL_RCC_GPIOB_CLK_DISABLE() (RCC->AHBENR &= ~(RCC_AHBENR_GPIOBEN)) +#define __HAL_RCC_GPIOC_CLK_DISABLE() (RCC->AHBENR &= ~(RCC_AHBENR_GPIOCEN)) +#define __HAL_RCC_GPIOD_CLK_DISABLE() (RCC->AHBENR &= ~(RCC_AHBENR_GPIODEN)) +#define __HAL_RCC_GPIOF_CLK_DISABLE() (RCC->AHBENR &= ~(RCC_AHBENR_GPIOFEN)) +#define __HAL_RCC_CRC_CLK_DISABLE() (RCC->AHBENR &= ~(RCC_AHBENR_CRCEN)) +#define __HAL_RCC_DMA1_CLK_DISABLE() (RCC->AHBENR &= ~(RCC_AHBENR_DMA1EN)) +#define __HAL_RCC_SRAM_CLK_DISABLE() (RCC->AHBENR &= ~(RCC_AHBENR_SRAMEN)) +#define __HAL_RCC_FLITF_CLK_DISABLE() (RCC->AHBENR &= ~(RCC_AHBENR_FLITFEN)) +#define __HAL_RCC_TSC_CLK_DISABLE() (RCC->AHBENR &= ~(RCC_AHBENR_TSCEN)) +/** + * @} + */ + +/** @defgroup RCC_APB1_Clock_Enable_Disable RCC APB1 Clock Enable Disable + * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_TIM2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM6_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM6EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_WWDG_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_WWDGEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_WWDGEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_USART2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_USART3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USART3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_I2C1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_PWR_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_PWREN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_PWREN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_DAC1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DAC1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DAC1EN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_TIM2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM2EN)) +#define __HAL_RCC_TIM6_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM6EN)) +#define __HAL_RCC_WWDG_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_WWDGEN)) +#define __HAL_RCC_USART2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART2EN)) +#define __HAL_RCC_USART3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USART3EN)) +#define __HAL_RCC_I2C1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C1EN)) +#define __HAL_RCC_PWR_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_PWREN)) +#define __HAL_RCC_DAC1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DAC1EN)) +/** + * @} + */ + +/** @defgroup RCC_APB2_Clock_Enable_Disable RCC APB2 Clock Enable Disable + * @brief Enable or disable the High Speed APB (APB2) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_SYSCFG_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + 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_TIM15_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM15EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM15EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM16_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM16EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM16EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM17_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM17EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM17EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_USART1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_USART1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_USART1EN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_SYSCFG_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SYSCFGEN)) +#define __HAL_RCC_TIM15_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM15EN)) +#define __HAL_RCC_TIM16_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM16EN)) +#define __HAL_RCC_TIM17_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM17EN)) +#define __HAL_RCC_USART1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_USART1EN)) +/** + * @} + */ + +/** @defgroup RCC_AHB_Peripheral_Clock_Enable_Disable_Status AHB Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#define __HAL_RCC_GPIOA_IS_CLK_ENABLED() ((RCC->AHBENR & (RCC_AHBENR_GPIOAEN)) != RESET) +#define __HAL_RCC_GPIOB_IS_CLK_ENABLED() ((RCC->AHBENR & (RCC_AHBENR_GPIOBEN)) != RESET) +#define __HAL_RCC_GPIOC_IS_CLK_ENABLED() ((RCC->AHBENR & (RCC_AHBENR_GPIOCEN)) != RESET) +#define __HAL_RCC_GPIOD_IS_CLK_ENABLED() ((RCC->AHBENR & (RCC_AHBENR_GPIODEN)) != RESET) +#define __HAL_RCC_GPIOF_IS_CLK_ENABLED() ((RCC->AHBENR & (RCC_AHBENR_GPIOFEN)) != RESET) +#define __HAL_RCC_CRC_IS_CLK_ENABLED() ((RCC->AHBENR & (RCC_AHBENR_CRCEN)) != RESET) +#define __HAL_RCC_DMA1_IS_CLK_ENABLED() ((RCC->AHBENR & (RCC_AHBENR_DMA1EN)) != RESET) +#define __HAL_RCC_SRAM_IS_CLK_ENABLED() ((RCC->AHBENR & (RCC_AHBENR_SRAMEN)) != RESET) +#define __HAL_RCC_FLITF_IS_CLK_ENABLED() ((RCC->AHBENR & (RCC_AHBENR_FLITFEN)) != RESET) +#define __HAL_RCC_TSC_IS_CLK_ENABLED() ((RCC->AHBENR & (RCC_AHBENR_TSCEN)) != RESET) + +#define __HAL_RCC_GPIOA_IS_CLK_DISABLED() ((RCC->AHBENR & (RCC_AHBENR_GPIOAEN)) == RESET) +#define __HAL_RCC_GPIOB_IS_CLK_DISABLED() ((RCC->AHBENR & (RCC_AHBENR_GPIOBEN)) == RESET) +#define __HAL_RCC_GPIOC_IS_CLK_DISABLED() ((RCC->AHBENR & (RCC_AHBENR_GPIOCEN)) == RESET) +#define __HAL_RCC_GPIOD_IS_CLK_DISABLED() ((RCC->AHBENR & (RCC_AHBENR_GPIODEN)) == RESET) +#define __HAL_RCC_GPIOF_IS_CLK_DISABLED() ((RCC->AHBENR & (RCC_AHBENR_GPIOFEN)) == RESET) +#define __HAL_RCC_CRC_IS_CLK_DISABLED() ((RCC->AHBENR & (RCC_AHBENR_CRCEN)) == RESET) +#define __HAL_RCC_DMA1_IS_CLK_DISABLED() ((RCC->AHBENR & (RCC_AHBENR_DMA1EN)) == RESET) +#define __HAL_RCC_SRAM_IS_CLK_DISABLED() ((RCC->AHBENR & (RCC_AHBENR_SRAMEN)) == RESET) +#define __HAL_RCC_FLITF_IS_CLK_DISABLED() ((RCC->AHBENR & (RCC_AHBENR_FLITFEN)) == RESET) +#define __HAL_RCC_TSC_IS_CLK_DISABLED() ((RCC->AHBENR & (RCC_AHBENR_TSCEN)) == RESET) +/** + * @} + */ + +/** @defgroup RCC_APB1_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_TIM6_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) != RESET) +#define __HAL_RCC_WWDG_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_WWDGEN)) != RESET) +#define __HAL_RCC_USART2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART2EN)) != RESET) +#define __HAL_RCC_USART3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) != RESET) +#define __HAL_RCC_I2C1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C1EN)) != RESET) +#define __HAL_RCC_PWR_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_PWREN)) != RESET) +#define __HAL_RCC_DAC1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DAC1EN)) != RESET) + +#define __HAL_RCC_TIM2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM2EN)) == RESET) +#define __HAL_RCC_TIM6_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM6EN)) == RESET) +#define __HAL_RCC_WWDG_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_WWDGEN)) == RESET) +#define __HAL_RCC_USART2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART2EN)) == RESET) +#define __HAL_RCC_USART3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USART3EN)) == RESET) +#define __HAL_RCC_I2C1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C1EN)) == RESET) +#define __HAL_RCC_PWR_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_PWREN)) == RESET) +#define __HAL_RCC_DAC1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DAC1EN)) == RESET) +/** + * @} + */ + +/** @defgroup RCC_APB2_Clock_Enable_Disable_Status APB2 Peripheral Clock Enable Disable Status + * @brief EGet 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_SYSCFG_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SYSCFGEN)) != RESET) +#define __HAL_RCC_TIM15_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM15EN)) != RESET) +#define __HAL_RCC_TIM16_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM16EN)) != RESET) +#define __HAL_RCC_TIM17_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM17EN)) != RESET) +#define __HAL_RCC_USART1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_USART1EN)) != RESET) + +#define __HAL_RCC_SYSCFG_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SYSCFGEN)) == RESET) +#define __HAL_RCC_TIM15_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM15EN)) == RESET) +#define __HAL_RCC_TIM16_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM16EN)) == RESET) +#define __HAL_RCC_TIM17_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM17EN)) == RESET) +#define __HAL_RCC_USART1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_USART1EN)) == RESET) +/** + * @} + */ + +/** @defgroup RCC_AHB_Force_Release_Reset RCC AHB Force Release Reset + * @brief Force or release AHB peripheral reset. + * @{ + */ +#define __HAL_RCC_AHB_FORCE_RESET() (RCC->AHBRSTR = 0xFFFFFFFFU) +#define __HAL_RCC_GPIOA_FORCE_RESET() (RCC->AHBRSTR |= (RCC_AHBRSTR_GPIOARST)) +#define __HAL_RCC_GPIOB_FORCE_RESET() (RCC->AHBRSTR |= (RCC_AHBRSTR_GPIOBRST)) +#define __HAL_RCC_GPIOC_FORCE_RESET() (RCC->AHBRSTR |= (RCC_AHBRSTR_GPIOCRST)) +#define __HAL_RCC_GPIOD_FORCE_RESET() (RCC->AHBRSTR |= (RCC_AHBRSTR_GPIODRST)) +#define __HAL_RCC_GPIOF_FORCE_RESET() (RCC->AHBRSTR |= (RCC_AHBRSTR_GPIOFRST)) +#define __HAL_RCC_TSC_FORCE_RESET() (RCC->AHBRSTR |= (RCC_AHBRSTR_TSCRST)) + +#define __HAL_RCC_AHB_RELEASE_RESET() (RCC->AHBRSTR = 0x00000000U) +#define __HAL_RCC_GPIOA_RELEASE_RESET() (RCC->AHBRSTR &= ~(RCC_AHBRSTR_GPIOARST)) +#define __HAL_RCC_GPIOB_RELEASE_RESET() (RCC->AHBRSTR &= ~(RCC_AHBRSTR_GPIOBRST)) +#define __HAL_RCC_GPIOC_RELEASE_RESET() (RCC->AHBRSTR &= ~(RCC_AHBRSTR_GPIOCRST)) +#define __HAL_RCC_GPIOD_RELEASE_RESET() (RCC->AHBRSTR &= ~(RCC_AHBRSTR_GPIODRST)) +#define __HAL_RCC_GPIOF_RELEASE_RESET() (RCC->AHBRSTR &= ~(RCC_AHBRSTR_GPIOFRST)) +#define __HAL_RCC_TSC_RELEASE_RESET() (RCC->AHBRSTR &= ~(RCC_AHBRSTR_TSCRST)) +/** + * @} + */ + +/** @defgroup RCC_APB1_Force_Release_Reset RCC APB1 Force Release Reset + * @brief Force or release APB1 peripheral reset. + * @{ + */ +#define __HAL_RCC_APB1_FORCE_RESET() (RCC->APB1RSTR = 0xFFFFFFFFU) +#define __HAL_RCC_TIM2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM2RST)) +#define __HAL_RCC_TIM6_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM6RST)) +#define __HAL_RCC_WWDG_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_WWDGRST)) +#define __HAL_RCC_USART2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USART2RST)) +#define __HAL_RCC_USART3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USART3RST)) +#define __HAL_RCC_I2C1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C1RST)) +#define __HAL_RCC_PWR_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_PWRRST)) +#define __HAL_RCC_DAC1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DAC1RST)) + +#define __HAL_RCC_APB1_RELEASE_RESET() (RCC->APB1RSTR = 0x00000000U) +#define __HAL_RCC_TIM2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM2RST)) +#define __HAL_RCC_TIM6_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM6RST)) +#define __HAL_RCC_WWDG_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_WWDGRST)) +#define __HAL_RCC_USART2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USART2RST)) +#define __HAL_RCC_USART3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USART3RST)) +#define __HAL_RCC_I2C1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C1RST)) +#define __HAL_RCC_PWR_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_PWRRST)) +#define __HAL_RCC_DAC1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DAC1RST)) +/** + * @} + */ + +/** @defgroup RCC_APB2_Force_Release_Reset RCC APB2 Force Release Reset + * @brief Force or release APB2 peripheral reset. + * @{ + */ +#define __HAL_RCC_APB2_FORCE_RESET() (RCC->APB2RSTR = 0xFFFFFFFFU) +#define __HAL_RCC_SYSCFG_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SYSCFGRST)) +#define __HAL_RCC_TIM15_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM15RST)) +#define __HAL_RCC_TIM16_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM16RST)) +#define __HAL_RCC_TIM17_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM17RST)) +#define __HAL_RCC_USART1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_USART1RST)) + +#define __HAL_RCC_APB2_RELEASE_RESET() (RCC->APB2RSTR = 0x00000000U) +#define __HAL_RCC_SYSCFG_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SYSCFGRST)) +#define __HAL_RCC_TIM15_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM15RST)) +#define __HAL_RCC_TIM16_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM16RST)) +#define __HAL_RCC_TIM17_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM17RST)) +#define __HAL_RCC_USART1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_USART1RST)) +/** + * @} + */ + +/** @defgroup RCC_HSI_Configuration HSI Configuration + * @{ + */ + +/** @brief Macros to enable or disable the Internal High Speed oscillator (HSI). + * @note The HSI is stopped by hardware when entering STOP and STANDBY modes. + * It is used (enabled by hardware) as system clock source after startup + * from Reset, wakeup 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. + * @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_) << POSITION_VAL(RCC_CR_HSITRIM))) + +/** + * @} + */ + +/** @defgroup RCC_LSI_Configuration LSI Configuration + * @{ + */ + +/** @brief Macro to enable the Internal Low Speed oscillator (LSI). + * @note After enabling the LSI, the application software should wait on + * LSIRDY flag to be set indicating that LSI clock is stable and can + * be used to clock the IWDG and/or the RTC. + */ +#define __HAL_RCC_LSI_ENABLE() (*(__IO uint32_t *) RCC_CSR_LSION_BB = ENABLE) + +/** @brief Macro to disable the Internal Low Speed oscillator (LSI). + * @note LSI can not be disabled if the IWDG is running. + * @note When the LSI is stopped, LSIRDY flag goes low after 6 LSI oscillator + * clock cycles. + */ +#define __HAL_RCC_LSI_DISABLE() (*(__IO uint32_t *) RCC_CSR_LSION_BB = DISABLE) + +/** + * @} + */ + +/** @defgroup RCC_HSE_Configuration HSE Configuration + * @{ + */ + +/** + * @brief Macro to configure the External High Speed oscillator (HSE). + * @note Transition HSE Bypass to HSE On and HSE On to HSE Bypass are not + * supported by this macro. User should request a transition to HSE Off + * first and then HSE On or HSE Bypass. + * @note After enabling the HSE (RCC_HSE_ON or RCC_HSE_Bypass), the application + * software should wait on HSERDY flag to be set indicating that HSE clock + * is stable and can be used to clock the PLL and/or system clock. + * @note HSE state can not be changed if it is used directly or through the + * PLL as system clock. In this case, you have to select another source + * of the system clock then change the HSE state (ex. disable it). + * @note The HSE is stopped by hardware when entering STOP and STANDBY modes. + * @note This function reset the CSSON bit, so if the clock security system(CSS) + * was previously enabled you have to enable it again after calling this + * function. + * @param __STATE__ specifies the new state of the HSE. + * This parameter can be one of the following values: + * @arg @ref RCC_HSE_OFF turn OFF the HSE oscillator, HSERDY flag goes low after + * 6 HSE oscillator clock cycles. + * @arg @ref RCC_HSE_ON turn ON the HSE oscillator + * @arg @ref RCC_HSE_BYPASS HSE oscillator bypassed with external clock + */ +#define __HAL_RCC_HSE_CONFIG(__STATE__) \ + do{ \ + if ((__STATE__) == RCC_HSE_ON) \ + { \ + SET_BIT(RCC->CR, RCC_CR_HSEON); \ + } \ + else if ((__STATE__) == RCC_HSE_OFF) \ + { \ + CLEAR_BIT(RCC->CR, RCC_CR_HSEON); \ + CLEAR_BIT(RCC->CR, RCC_CR_HSEBYP); \ + } \ + else if ((__STATE__) == RCC_HSE_BYPASS) \ + { \ + SET_BIT(RCC->CR, RCC_CR_HSEBYP); \ + SET_BIT(RCC->CR, RCC_CR_HSEON); \ + } \ + else \ + { \ + CLEAR_BIT(RCC->CR, RCC_CR_HSEON); \ + CLEAR_BIT(RCC->CR, RCC_CR_HSEBYP); \ + } \ + }while(0U) + +/** + * @} + */ + +/** @defgroup RCC_LSE_Configuration LSE Configuration + * @{ + */ + +/** + * @brief Macro to configure the External Low Speed oscillator (LSE). + * @note Transitions LSE Bypass to LSE On and LSE On to LSE Bypass are not supported by this macro. + * @note As the LSE is in the Backup domain and write access is denied to + * this domain after reset, you have to enable write access using + * @ref HAL_PWR_EnableBkUpAccess() function before to configure the LSE + * (to be done once after reset). + * @note After enabling the LSE (RCC_LSE_ON or RCC_LSE_BYPASS), the application + * software should wait on LSERDY flag to be set indicating that LSE clock + * is stable and can be used to clock the RTC. + * @param __STATE__ specifies the new state of the LSE. + * This parameter can be one of the following values: + * @arg @ref RCC_LSE_OFF turn OFF the LSE oscillator, LSERDY flag goes low after + * 6 LSE oscillator clock cycles. + * @arg @ref RCC_LSE_ON turn ON the LSE oscillator. + * @arg @ref RCC_LSE_BYPASS LSE oscillator bypassed with external clock. + */ +#define __HAL_RCC_LSE_CONFIG(__STATE__) \ + do{ \ + if ((__STATE__) == RCC_LSE_ON) \ + { \ + SET_BIT(RCC->BDCR, RCC_BDCR_LSEON); \ + } \ + else if ((__STATE__) == RCC_LSE_OFF) \ + { \ + CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEON); \ + CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEBYP); \ + } \ + else if ((__STATE__) == RCC_LSE_BYPASS) \ + { \ + SET_BIT(RCC->BDCR, RCC_BDCR_LSEBYP); \ + SET_BIT(RCC->BDCR, RCC_BDCR_LSEON); \ + } \ + else \ + { \ + CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEON); \ + CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEBYP); \ + } \ + }while(0U) + +/** + * @} + */ + +/** @defgroup RCC_USARTx_Clock_Config RCC USARTx Clock Config + * @{ + */ + +/** @brief Macro to configure the USART1 clock (USART1CLK). + * @param __USART1CLKSOURCE__ specifies the USART1 clock source. + * This parameter can be one of the following values: + @if STM32F302xC + * @arg @ref RCC_USART1CLKSOURCE_PCLK2 PCLK2 selected as USART1 clock + @endif + @if STM32F303xC + * @arg @ref RCC_USART1CLKSOURCE_PCLK2 PCLK2 selected as USART1 clock + @endif + @if STM32F358xx + * @arg @ref RCC_USART1CLKSOURCE_PCLK2 PCLK2 selected as USART1 clock + @endif + @if STM32F302xE + * @arg @ref RCC_USART1CLKSOURCE_PCLK2 PCLK2 selected as USART1 clock + @endif + @if STM32F303xE + * @arg @ref RCC_USART1CLKSOURCE_PCLK2 PCLK2 selected as USART1 clock + @endif + @if STM32F398xx + * @arg @ref RCC_USART1CLKSOURCE_PCLK2 PCLK2 selected as USART1 clock + @endif + @if STM32F373xC + * @arg @ref RCC_USART1CLKSOURCE_PCLK2 PCLK2 selected as USART1 clock + @endif + @if STM32F378xx + * @arg @ref RCC_USART1CLKSOURCE_PCLK2 PCLK2 selected as USART1 clock + @endif + @if STM32F301x8 + * @arg @ref RCC_USART1CLKSOURCE_PCLK1 PCLK1 selected as USART1 clock + @endif + @if STM32F302x8 + * @arg @ref RCC_USART1CLKSOURCE_PCLK1 PCLK1 selected as USART1 clock + @endif + @if STM32F318xx + * @arg @ref RCC_USART1CLKSOURCE_PCLK1 PCLK1 selected as USART1 clock + @endif + @if STM32F303x8 + * @arg @ref RCC_USART1CLKSOURCE_PCLK1 PCLK1 selected as USART1 clock + @endif + @if STM32F334x8 + * @arg @ref RCC_USART1CLKSOURCE_PCLK1 PCLK1 selected as USART1 clock + @endif + @if STM32F328xx + * @arg @ref RCC_USART1CLKSOURCE_PCLK1 PCLK1 selected as USART1 clock + @endif + * @arg @ref RCC_USART1CLKSOURCE_HSI HSI selected as USART1 clock + * @arg @ref RCC_USART1CLKSOURCE_SYSCLK System Clock selected as USART1 clock + * @arg @ref RCC_USART1CLKSOURCE_LSE LSE selected as USART1 clock + */ +#define __HAL_RCC_USART1_CONFIG(__USART1CLKSOURCE__) \ + MODIFY_REG(RCC->CFGR3, RCC_CFGR3_USART1SW, (uint32_t)(__USART1CLKSOURCE__)) + +/** @brief Macro to get the USART1 clock source. + * @retval The clock source can be one of the following values: + @if STM32F302xC + * @arg @ref RCC_USART1CLKSOURCE_PCLK2 PCLK2 selected as USART1 clock + @endif + @if STM32F303xC + * @arg @ref RCC_USART1CLKSOURCE_PCLK2 PCLK2 selected as USART1 clock + @endif + @if STM32F358xx + * @arg @ref RCC_USART1CLKSOURCE_PCLK2 PCLK2 selected as USART1 clock + @endif + @if STM32F302xE + * @arg @ref RCC_USART1CLKSOURCE_PCLK2 PCLK2 selected as USART1 clock + @endif + @if STM32F303xE + * @arg @ref RCC_USART1CLKSOURCE_PCLK2 PCLK2 selected as USART1 clock + @endif + @if STM32F398xx + * @arg @ref RCC_USART1CLKSOURCE_PCLK2 PCLK2 selected as USART1 clock + @endif + @if STM32F373xC + * @arg @ref RCC_USART1CLKSOURCE_PCLK2 PCLK2 selected as USART1 clock + @endif + @if STM32F378xx + * @arg @ref RCC_USART1CLKSOURCE_PCLK2 PCLK2 selected as USART1 clock + @endif + @if STM32F301x8 + * @arg @ref RCC_USART1CLKSOURCE_PCLK1 PCLK1 selected as USART1 clock + @endif + @if STM32F302x8 + * @arg @ref RCC_USART1CLKSOURCE_PCLK1 PCLK1 selected as USART1 clock + @endif + @if STM32F318xx + * @arg @ref RCC_USART1CLKSOURCE_PCLK1 PCLK1 selected as USART1 clock + @endif + @if STM32F303x8 + * @arg @ref RCC_USART1CLKSOURCE_PCLK1 PCLK1 selected as USART1 clock + @endif + @if STM32F334x8 + * @arg @ref RCC_USART1CLKSOURCE_PCLK1 PCLK1 selected as USART1 clock + @endif + @if STM32F328xx + * @arg @ref RCC_USART1CLKSOURCE_PCLK1 PCLK1 selected as USART1 clock + @endif + * @arg @ref RCC_USART1CLKSOURCE_HSI HSI selected as USART1 clock + * @arg @ref RCC_USART1CLKSOURCE_SYSCLK System Clock selected as USART1 clock + * @arg @ref RCC_USART1CLKSOURCE_LSE LSE selected as USART1 clock + */ +#define __HAL_RCC_GET_USART1_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR3, RCC_CFGR3_USART1SW))) + +#if defined(RCC_CFGR3_USART2SW) +/** @brief Macro to configure the USART2 clock (USART2CLK). + * @param __USART2CLKSOURCE__ specifies the USART2 clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_USART2CLKSOURCE_PCLK1 PCLK1 selected as USART2 clock + * @arg @ref RCC_USART2CLKSOURCE_HSI HSI selected as USART2 clock + * @arg @ref RCC_USART2CLKSOURCE_SYSCLK System Clock selected as USART2 clock + * @arg @ref RCC_USART2CLKSOURCE_LSE LSE selected as USART2 clock + */ +#define __HAL_RCC_USART2_CONFIG(__USART2CLKSOURCE__) \ + MODIFY_REG(RCC->CFGR3, RCC_CFGR3_USART2SW, (uint32_t)(__USART2CLKSOURCE__)) + +/** @brief Macro to get the USART2 clock source. + * @retval The clock source can be one of the following values: + * @arg @ref RCC_USART2CLKSOURCE_PCLK1 PCLK1 selected as USART2 clock + * @arg @ref RCC_USART2CLKSOURCE_HSI HSI selected as USART2 clock + * @arg @ref RCC_USART2CLKSOURCE_SYSCLK System Clock selected as USART2 clock + * @arg @ref RCC_USART2CLKSOURCE_LSE LSE selected as USART2 clock + */ +#define __HAL_RCC_GET_USART2_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR3, RCC_CFGR3_USART2SW))) +#endif /* RCC_CFGR3_USART2SW */ + +#if defined(RCC_CFGR3_USART3SW) +/** @brief Macro to configure the USART3 clock (USART3CLK). + * @param __USART3CLKSOURCE__ specifies the USART3 clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_USART3CLKSOURCE_PCLK1 PCLK1 selected as USART3 clock + * @arg @ref RCC_USART3CLKSOURCE_HSI HSI selected as USART3 clock + * @arg @ref RCC_USART3CLKSOURCE_SYSCLK System Clock selected as USART3 clock + * @arg @ref RCC_USART3CLKSOURCE_LSE LSE selected as USART3 clock + */ +#define __HAL_RCC_USART3_CONFIG(__USART3CLKSOURCE__) \ + MODIFY_REG(RCC->CFGR3, RCC_CFGR3_USART3SW, (uint32_t)(__USART3CLKSOURCE__)) + +/** @brief Macro to get the USART3 clock source. + * @retval The clock source can be one of the following values: + * @arg @ref RCC_USART3CLKSOURCE_PCLK1 PCLK1 selected as USART3 clock + * @arg @ref RCC_USART3CLKSOURCE_HSI HSI selected as USART3 clock + * @arg @ref RCC_USART3CLKSOURCE_SYSCLK System Clock selected as USART3 clock + * @arg @ref RCC_USART3CLKSOURCE_LSE LSE selected as USART3 clock + */ +#define __HAL_RCC_GET_USART3_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR3, RCC_CFGR3_USART3SW))) +#endif /* RCC_CFGR3_USART2SW */ +/** + * @} + */ + +/** @defgroup RCC_I2Cx_Clock_Config RCC I2Cx Clock Config + * @{ + */ + +/** @brief Macro to configure the I2C1 clock (I2C1CLK). + * @param __I2C1CLKSOURCE__ specifies the I2C1 clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_I2C1CLKSOURCE_HSI HSI selected as I2C1 clock + * @arg @ref RCC_I2C1CLKSOURCE_SYSCLK System Clock selected as I2C1 clock + */ +#define __HAL_RCC_I2C1_CONFIG(__I2C1CLKSOURCE__) \ + MODIFY_REG(RCC->CFGR3, RCC_CFGR3_I2C1SW, (uint32_t)(__I2C1CLKSOURCE__)) + +/** @brief Macro to get the I2C1 clock source. + * @retval The clock source can be one of the following values: + * @arg @ref RCC_I2C1CLKSOURCE_HSI HSI selected as I2C1 clock + * @arg @ref RCC_I2C1CLKSOURCE_SYSCLK System Clock selected as I2C1 clock + */ +#define __HAL_RCC_GET_I2C1_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR3, RCC_CFGR3_I2C1SW))) +/** + * @} + */ + +/** @defgroup RCC_PLL_Configuration PLL Configuration + * @{ + */ + +/** @brief Macro to enable the main PLL. + * @note After enabling the main PLL, the application software should wait on + * PLLRDY flag to be set indicating that PLL clock is stable and can + * be used as system clock source. + * @note The main PLL is disabled by hardware when entering STOP and STANDBY modes. + */ +#define __HAL_RCC_PLL_ENABLE() (*(__IO uint32_t *) RCC_CR_PLLON_BB = ENABLE) + +/** @brief Macro to disable the main PLL. + * @note The main PLL can not be disabled if it is used as system clock source + */ +#define __HAL_RCC_PLL_DISABLE() (*(__IO uint32_t *) RCC_CR_PLLON_BB = DISABLE) + + +/** @brief Get oscillator clock selected as PLL input clock + * @retval The clock source used for PLL entry. The returned value can be one + * of the following: + * @arg @ref RCC_PLLSOURCE_HSI HSI oscillator clock selected as PLL input clock + * @arg @ref RCC_PLLSOURCE_HSE HSE oscillator clock selected as PLL input clock + */ +#define __HAL_RCC_GET_PLL_OSCSOURCE() ((uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_PLLSRC))) + +/** + * @} + */ + +/** @defgroup RCC_Get_Clock_source Get Clock source + * @{ + */ + +/** + * @brief Macro to configure the system clock source. + * @param __SYSCLKSOURCE__ specifies the system clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_SYSCLKSOURCE_HSI HSI oscillator is used as system clock source. + * @arg @ref RCC_SYSCLKSOURCE_HSE HSE oscillator is used as system clock source. + * @arg @ref RCC_SYSCLKSOURCE_PLLCLK PLL output is used as system clock source. + */ +#define __HAL_RCC_SYSCLK_CONFIG(__SYSCLKSOURCE__) \ + MODIFY_REG(RCC->CFGR, RCC_CFGR_SW, (__SYSCLKSOURCE__)) + +/** @brief Macro to get the clock source used as system clock. + * @retval The clock source used as system clock. The returned value can be one + * of the following: + * @arg @ref RCC_SYSCLKSOURCE_STATUS_HSI HSI used as system clock + * @arg @ref RCC_SYSCLKSOURCE_STATUS_HSE HSE used as system clock + * @arg @ref RCC_SYSCLKSOURCE_STATUS_PLLCLK PLL used as system clock + */ +#define __HAL_RCC_GET_SYSCLK_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR,RCC_CFGR_SWS))) + +/** + * @} + */ + +/** @defgroup RCCEx_MCOx_Clock_Config RCC Extended MCOx Clock Config + * @{ + */ + +#if defined(RCC_CFGR_MCOPRE) +/** @brief Macro to configure the MCO clock. + * @param __MCOCLKSOURCE__ specifies the MCO clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_MCO1SOURCE_NOCLOCK No clock selected as MCO clock + * @arg @ref RCC_MCO1SOURCE_SYSCLK System Clock selected as MCO clock + * @arg @ref RCC_MCO1SOURCE_HSI HSI oscillator clock selected as MCO clock + * @arg @ref RCC_MCO1SOURCE_HSE HSE selected as MCO clock + * @arg @ref RCC_MCO1SOURCE_LSI LSI selected as MCO clock + * @arg @ref RCC_MCO1SOURCE_LSE LSE selected as MCO clock + * @arg @ref RCC_MCO1SOURCE_PLLCLK_DIV2 PLLCLK Divided by 2 selected as MCO clock + * @param __MCODIV__ specifies the MCO clock prescaler. + * This parameter can be one of the following values: + * @arg @ref RCC_MCODIV_1 MCO clock source is divided by 1 + * @arg @ref RCC_MCODIV_2 MCO clock source is divided by 2 + * @arg @ref RCC_MCODIV_4 MCO clock source is divided by 4 + * @arg @ref RCC_MCODIV_8 MCO clock source is divided by 8 + * @arg @ref RCC_MCODIV_16 MCO clock source is divided by 16 + * @arg @ref RCC_MCODIV_32 MCO clock source is divided by 32 + * @arg @ref RCC_MCODIV_64 MCO clock source is divided by 64 + * @arg @ref RCC_MCODIV_128 MCO clock source is divided by 128 + */ +#else +/** @brief Macro to configure the MCO clock. + * @param __MCOCLKSOURCE__ specifies the MCO clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_MCO1SOURCE_NOCLOCK No clock selected as MCO clock + * @arg @ref RCC_MCO1SOURCE_SYSCLK System Clock selected as MCO clock + * @arg @ref RCC_MCO1SOURCE_HSI HSI selected as MCO clock + * @arg @ref RCC_MCO1SOURCE_HSE HSE selected as MCO clock + * @arg @ref RCC_MCO1SOURCE_LSI LSI selected as MCO clock + * @arg @ref RCC_MCO1SOURCE_LSE LSE selected as MCO clock + * @arg @ref RCC_MCO1SOURCE_PLLCLK_DIV2 PLLCLK Divided by 2 selected as MCO clock + * @param __MCODIV__ specifies the MCO clock prescaler. + * This parameter can be one of the following values: + * @arg @ref RCC_MCODIV_1 No division applied on MCO clock source + */ +#endif +#if defined(RCC_CFGR_MCOPRE) +#define __HAL_RCC_MCO1_CONFIG(__MCOCLKSOURCE__, __MCODIV__) \ + MODIFY_REG(RCC->CFGR, (RCC_CFGR_MCO | RCC_CFGR_MCOPRE), ((__MCOCLKSOURCE__) | (__MCODIV__))) +#else + +#define __HAL_RCC_MCO1_CONFIG(__MCOCLKSOURCE__, __MCODIV__) \ + MODIFY_REG(RCC->CFGR, RCC_CFGR_MCO, (__MCOCLKSOURCE__)) + +#endif + +/** + * @} + */ + + /** @defgroup RCC_RTC_Clock_Configuration RCC RTC Clock Configuration + * @{ + */ + +/** @brief Macro to configure the RTC clock (RTCCLK). + * @note As the RTC clock configuration bits are in the Backup domain and write + * access is denied to this domain after reset, you have to enable write + * access using the Power Backup Access macro before to configure + * the RTC clock source (to be done once after reset). + * @note Once the RTC clock is configured it cannot be changed unless the + * Backup domain is reset using @ref __HAL_RCC_BACKUPRESET_FORCE() macro, or by + * a Power On Reset (POR). + * + * @param __RTC_CLKSOURCE__ specifies the RTC clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_RTCCLKSOURCE_NO_CLK No clock selected as RTC clock + * @arg @ref RCC_RTCCLKSOURCE_LSE LSE selected as RTC clock + * @arg @ref RCC_RTCCLKSOURCE_LSI LSI selected as RTC clock + * @arg @ref RCC_RTCCLKSOURCE_HSE_DIV32 HSE clock divided by 32 + * @note If the LSE or LSI is used as RTC clock source, the RTC continues to + * work in STOP and STANDBY modes, and can be used as wakeup source. + * However, when the LSI clock and HSE clock divided by 32 is used as RTC clock source, + * the RTC cannot be used in STOP and STANDBY modes. + * @note The system must always be configured so as to get a PCLK frequency greater than or + * equal to the RTCCLK frequency for a proper operation of the RTC. + */ +#define __HAL_RCC_RTC_CONFIG(__RTC_CLKSOURCE__) MODIFY_REG(RCC->BDCR, RCC_BDCR_RTCSEL, (__RTC_CLKSOURCE__)) + +/** @brief Macro to get the RTC clock source. + * @retval The clock source can be one of the following values: + * @arg @ref RCC_RTCCLKSOURCE_NO_CLK No clock selected as RTC clock + * @arg @ref RCC_RTCCLKSOURCE_LSE LSE selected as RTC clock + * @arg @ref RCC_RTCCLKSOURCE_LSI LSI selected as RTC clock + * @arg @ref RCC_RTCCLKSOURCE_HSE_DIV32 HSE clock divided by 32 + */ +#define __HAL_RCC_GET_RTC_SOURCE() (READ_BIT(RCC->BDCR, RCC_BDCR_RTCSEL)) + +/** @brief Macro to enable the the RTC clock. + * @note These macros must be used only after the RTC clock source was selected. + */ +#define __HAL_RCC_RTC_ENABLE() (*(__IO uint32_t *) RCC_BDCR_RTCEN_BB = ENABLE) + +/** @brief Macro to disable the the RTC clock. + * @note These macros must be used only after the RTC clock source was selected. + */ +#define __HAL_RCC_RTC_DISABLE() (*(__IO uint32_t *) RCC_BDCR_RTCEN_BB = DISABLE) + +/** @brief Macro to force the Backup domain reset. + * @note This function resets the RTC peripheral (including the backup registers) + * and the RTC clock source selection in RCC_BDCR register. + */ +#define __HAL_RCC_BACKUPRESET_FORCE() (*(__IO uint32_t *) RCC_BDCR_BDRST_BB = ENABLE) + +/** @brief Macros to release the Backup domain reset. + */ +#define __HAL_RCC_BACKUPRESET_RELEASE() (*(__IO uint32_t *) RCC_BDCR_BDRST_BB = DISABLE) + +/** + * @} + */ + +/** @defgroup RCC_Flags_Interrupts_Management Flags Interrupts Management + * @brief macros to manage the specified RCC Flags and interrupts. + * @{ + */ + +/** @brief Enable RCC interrupt. + * @param __INTERRUPT__ specifies the RCC interrupt sources to be enabled. + * This parameter can be any combination of the following values: + * @arg @ref RCC_IT_LSIRDY LSI ready interrupt + * @arg @ref RCC_IT_LSERDY LSE ready interrupt + * @arg @ref RCC_IT_HSIRDY HSI ready interrupt + * @arg @ref RCC_IT_HSERDY HSE ready interrupt + * @arg @ref RCC_IT_PLLRDY main PLL ready interrupt + */ +#define __HAL_RCC_ENABLE_IT(__INTERRUPT__) (*(__IO uint8_t *) RCC_CIR_BYTE1_ADDRESS |= (__INTERRUPT__)) + +/** @brief Disable RCC interrupt. + * @param __INTERRUPT__ specifies the RCC interrupt sources to be disabled. + * This parameter can be any combination of the following values: + * @arg @ref RCC_IT_LSIRDY LSI ready interrupt + * @arg @ref RCC_IT_LSERDY LSE ready interrupt + * @arg @ref RCC_IT_HSIRDY HSI ready interrupt + * @arg @ref RCC_IT_HSERDY HSE ready interrupt + * @arg @ref RCC_IT_PLLRDY main PLL ready interrupt + */ +#define __HAL_RCC_DISABLE_IT(__INTERRUPT__) (*(__IO uint8_t *) RCC_CIR_BYTE1_ADDRESS &= (uint8_t)(~(__INTERRUPT__))) + +/** @brief Clear the RCC's interrupt pending bits. + * @param __INTERRUPT__ specifies the interrupt pending bit to clear. + * This parameter can be any combination of the following values: + * @arg @ref RCC_IT_LSIRDY LSI ready interrupt. + * @arg @ref RCC_IT_LSERDY LSE ready interrupt. + * @arg @ref RCC_IT_HSIRDY HSI ready interrupt. + * @arg @ref RCC_IT_HSERDY HSE ready interrupt. + * @arg @ref RCC_IT_PLLRDY Main PLL ready interrupt. + * @arg @ref RCC_IT_CSS Clock Security System interrupt + */ +#define __HAL_RCC_CLEAR_IT(__INTERRUPT__) (*(__IO uint8_t *) RCC_CIR_BYTE2_ADDRESS = (__INTERRUPT__)) + +/** @brief Check the RCC's interrupt has occurred or not. + * @param __INTERRUPT__ specifies the RCC interrupt source to check. + * This parameter can be one of the following values: + * @arg @ref RCC_IT_LSIRDY LSI ready interrupt. + * @arg @ref RCC_IT_LSERDY LSE ready interrupt. + * @arg @ref RCC_IT_HSIRDY HSI ready interrupt. + * @arg @ref RCC_IT_HSERDY HSE ready interrupt. + * @arg @ref RCC_IT_PLLRDY Main PLL ready interrupt. + * @arg @ref RCC_IT_CSS Clock Security System interrupt + * @retval The new state of __INTERRUPT__ (TRUE or FALSE). + */ +#define __HAL_RCC_GET_IT(__INTERRUPT__) ((RCC->CIR & (__INTERRUPT__)) == (__INTERRUPT__)) + +/** @brief Set RMVF bit to clear the reset flags. + * The reset flags are RCC_FLAG_PINRST, RCC_FLAG_PORRST, RCC_FLAG_SFTRST, + * RCC_FLAG_OBLRST, RCC_FLAG_IWDGRST, RCC_FLAG_WWDGRST, RCC_FLAG_LPWRRST + */ +#define __HAL_RCC_CLEAR_RESET_FLAGS() (*(__IO uint32_t *)RCC_CSR_RMVF_BB = ENABLE) + +/** @brief Check RCC flag is set or not. + * @param __FLAG__ specifies the flag to check. + * This parameter can be one of the following values: + * @arg @ref RCC_FLAG_HSIRDY HSI oscillator clock ready. + * @arg @ref RCC_FLAG_HSERDY HSE oscillator clock ready. + * @arg @ref RCC_FLAG_PLLRDY Main PLL clock ready. + * @arg @ref RCC_FLAG_LSERDY LSE oscillator clock ready. + * @arg @ref RCC_FLAG_LSIRDY LSI oscillator clock ready. + * @arg @ref RCC_FLAG_OBLRST Option Byte Load reset + * @arg @ref RCC_FLAG_PINRST Pin reset. + * @arg @ref RCC_FLAG_PORRST POR/PDR reset. + * @arg @ref RCC_FLAG_SFTRST Software reset. + * @arg @ref RCC_FLAG_IWDGRST Independent Watchdog reset. + * @arg @ref RCC_FLAG_WWDGRST Window Watchdog reset. + * @arg @ref RCC_FLAG_LPWRRST Low Power reset. + @if defined(STM32F301x8) + * @arg @ref RCC_FLAG_V18PWRRST Reset flag of the 1.8 V domain + @endif + @if defined(STM32F302x8) + * @arg @ref RCC_FLAG_V18PWRRST Reset flag of the 1.8 V domain + @endif + @if defined(STM32F302xC) + * @arg @ref RCC_FLAG_V18PWRRST Reset flag of the 1.8 V domain + * @arg @ref RCC_FLAG_MCO Microcontroller Clock Output + @endif + @if defined(STM32F302xE) + * @arg @ref RCC_FLAG_V18PWRRST Reset flag of the 1.8 V domain + @endif + @if defined(STM32F303x8) + * @arg @ref RCC_FLAG_V18PWRRST Reset flag of the 1.8 V domain + @endif + @if defined(STM32F303xC) + * @arg @ref RCC_FLAG_V18PWRRST Reset flag of the 1.8 V domain + * @arg @ref RCC_FLAG_MCO Microcontroller Clock Output + @endif + @if defined(STM32F303xE) + * @arg @ref RCC_FLAG_V18PWRRST Reset flag of the 1.8 V domain + @endif + @if defined(STM32F334x8) + * @arg @ref RCC_FLAG_V18PWRRST Reset flag of the 1.8 V domain + @endif + @if defined(STM32F358xx) + * @arg @ref RCC_FLAG_MCO Microcontroller Clock Output + @endif + @if defined(STM32F373xC) + * @arg @ref RCC_FLAG_V18PWRRST Reset flag of the 1.8 V domain + @endif + * @retval The new state of __FLAG__ (TRUE or FALSE). + */ +#define __HAL_RCC_GET_FLAG(__FLAG__) (((((__FLAG__) >> 5U) == CR_REG_INDEX) ? RCC->CR : \ + (((__FLAG__) >> 5U) == BDCR_REG_INDEX)? RCC->BDCR : \ + (((__FLAG__) >> 5U) == CFGR_REG_INDEX)? RCC->CFGR : \ + RCC->CSR) & (1U << ((__FLAG__) & RCC_FLAG_MASK))) + +/** + * @} + */ + +/** + * @} + */ + +/* Include RCC HAL Extension module */ +#include "stm32f3xx_hal_rcc_ex.h" + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup RCC_Exported_Functions + * @{ + */ + +/** @addtogroup RCC_Exported_Functions_Group1 + * @{ + */ + +/* Initialization and de-initialization functions ******************************/ +HAL_StatusTypeDef HAL_RCC_DeInit(void); +HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct); +HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t FLatency); + +/** + * @} + */ + +/** @addtogroup RCC_Exported_Functions_Group2 + * @{ + */ + +/* Peripheral Control functions ************************************************/ +void HAL_RCC_MCOConfig(uint32_t RCC_MCOx, uint32_t RCC_MCOSource, uint32_t RCC_MCODiv); +void HAL_RCC_EnableCSS(void); +/* CSS NMI IRQ handler */ +void HAL_RCC_NMI_IRQHandler(void); +/* User Callbacks in non blocking mode (IT mode) */ +void HAL_RCC_CSSCallback(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); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F3xx_HAL_RCC_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h new file mode 100644 index 0000000..37c9ced --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h @@ -0,0 +1,3827 @@ +/** + ****************************************************************************** + * @file stm32f3xx_hal_rcc_ex.h + * @author MCD Application Team + * @brief Header file of RCC HAL Extension module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F3xx_HAL_RCC_EX_H +#define __STM32F3xx_HAL_RCC_EX_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f3xx_hal_def.h" + +/** @addtogroup STM32F3xx_HAL_Driver + * @{ + */ + +/** @addtogroup RCCEx + * @{ + */ + +/** @addtogroup RCCEx_Private_Macros + * @{ + */ + +#if defined(RCC_CFGR_PLLNODIV) +#define IS_RCC_MCO1SOURCE(SOURCE) (((SOURCE) == RCC_MCO1SOURCE_NOCLOCK) || \ + ((SOURCE) == RCC_MCO1SOURCE_LSI) || \ + ((SOURCE) == RCC_MCO1SOURCE_LSE) || \ + ((SOURCE) == RCC_MCO1SOURCE_SYSCLK) || \ + ((SOURCE) == RCC_MCO1SOURCE_HSI) || \ + ((SOURCE) == RCC_MCO1SOURCE_HSE) || \ + ((SOURCE) == RCC_MCO1SOURCE_PLLCLK) || \ + ((SOURCE) == RCC_MCO1SOURCE_PLLCLK_DIV2)) +#else +#define IS_RCC_MCO1SOURCE(SOURCE) (((SOURCE) == RCC_MCO1SOURCE_NOCLOCK) || \ + ((SOURCE) == RCC_MCO1SOURCE_LSI) || \ + ((SOURCE) == RCC_MCO1SOURCE_LSE) || \ + ((SOURCE) == RCC_MCO1SOURCE_SYSCLK) || \ + ((SOURCE) == RCC_MCO1SOURCE_HSI) || \ + ((SOURCE) == RCC_MCO1SOURCE_HSE) || \ + ((SOURCE) == RCC_MCO1SOURCE_PLLCLK_DIV2)) +#endif /* RCC_CFGR_PLLNODIV */ + +#if defined(STM32F301x8) || defined(STM32F318xx) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((SELECTION) <= (RCC_PERIPHCLK_USART1 | \ + RCC_PERIPHCLK_I2C1 | RCC_PERIPHCLK_I2C2 | \ + RCC_PERIPHCLK_ADC1 | RCC_PERIPHCLK_I2S | \ + RCC_PERIPHCLK_I2C3 | RCC_PERIPHCLK_TIM1 | \ + RCC_PERIPHCLK_TIM15 | RCC_PERIPHCLK_TIM16 | \ + RCC_PERIPHCLK_TIM17 | RCC_PERIPHCLK_RTC)) +#endif /* STM32F301x8 || STM32F318xx */ +#if defined(STM32F302x8) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((SELECTION) <= (RCC_PERIPHCLK_USART1 | \ + RCC_PERIPHCLK_I2C1 | RCC_PERIPHCLK_I2C2 | \ + RCC_PERIPHCLK_ADC1 | RCC_PERIPHCLK_I2S | \ + RCC_PERIPHCLK_I2C3 | RCC_PERIPHCLK_TIM1 | \ + RCC_PERIPHCLK_RTC | RCC_PERIPHCLK_USB | \ + RCC_PERIPHCLK_TIM15 | RCC_PERIPHCLK_TIM16 | \ + RCC_PERIPHCLK_TIM17)) +#endif /* STM32F302x8 */ +#if defined(STM32F302xC) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((SELECTION) <= (RCC_PERIPHCLK_USART1 | RCC_PERIPHCLK_USART2 | RCC_PERIPHCLK_USART3 | \ + RCC_PERIPHCLK_UART4 | RCC_PERIPHCLK_UART5 | \ + RCC_PERIPHCLK_I2C1 | RCC_PERIPHCLK_I2C2 | \ + RCC_PERIPHCLK_ADC12 | RCC_PERIPHCLK_I2S | \ + RCC_PERIPHCLK_TIM1 | RCC_PERIPHCLK_RTC | \ + RCC_PERIPHCLK_USB)) +#endif /* STM32F302xC */ +#if defined(STM32F303xC) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((SELECTION) <= (RCC_PERIPHCLK_USART1 | RCC_PERIPHCLK_USART2 | RCC_PERIPHCLK_USART3 | \ + RCC_PERIPHCLK_UART4 | RCC_PERIPHCLK_UART5 | \ + RCC_PERIPHCLK_I2C1 | RCC_PERIPHCLK_I2C2 | \ + RCC_PERIPHCLK_ADC12 | RCC_PERIPHCLK_ADC34 | \ + RCC_PERIPHCLK_I2S | RCC_PERIPHCLK_TIM1 | \ + RCC_PERIPHCLK_TIM8 | RCC_PERIPHCLK_RTC | \ + RCC_PERIPHCLK_USB)) +#endif /* STM32F303xC */ +#if defined(STM32F302xE) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((SELECTION) <= (RCC_PERIPHCLK_USART1 | RCC_PERIPHCLK_USART2 | RCC_PERIPHCLK_USART3 | \ + RCC_PERIPHCLK_UART4 | RCC_PERIPHCLK_UART5 | \ + RCC_PERIPHCLK_I2C1 | RCC_PERIPHCLK_I2C2 | \ + RCC_PERIPHCLK_ADC12 | RCC_PERIPHCLK_I2S | \ + RCC_PERIPHCLK_TIM1 | RCC_PERIPHCLK_RTC | \ + RCC_PERIPHCLK_USB | RCC_PERIPHCLK_I2C3 | \ + RCC_PERIPHCLK_TIM2 | RCC_PERIPHCLK_TIM34 | \ + RCC_PERIPHCLK_TIM15 | RCC_PERIPHCLK_TIM16 | \ + RCC_PERIPHCLK_TIM17)) +#endif /* STM32F302xE */ +#if defined(STM32F303xE) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((SELECTION) <= (RCC_PERIPHCLK_USART1 | RCC_PERIPHCLK_USART2 | RCC_PERIPHCLK_USART3 | \ + RCC_PERIPHCLK_UART4 | RCC_PERIPHCLK_UART5 | \ + RCC_PERIPHCLK_I2C1 | RCC_PERIPHCLK_I2C2 | \ + RCC_PERIPHCLK_ADC12 | RCC_PERIPHCLK_ADC34 | \ + RCC_PERIPHCLK_I2S | RCC_PERIPHCLK_TIM1 | \ + RCC_PERIPHCLK_TIM8 | RCC_PERIPHCLK_RTC | \ + RCC_PERIPHCLK_USB | RCC_PERIPHCLK_I2C3 | \ + RCC_PERIPHCLK_TIM2 | RCC_PERIPHCLK_TIM34 | \ + RCC_PERIPHCLK_TIM15 | RCC_PERIPHCLK_TIM16 | \ + RCC_PERIPHCLK_TIM17 | RCC_PERIPHCLK_TIM20)) +#endif /* STM32F303xE */ +#if defined(STM32F398xx) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((SELECTION) <= (RCC_PERIPHCLK_USART1 | RCC_PERIPHCLK_USART2 | RCC_PERIPHCLK_USART3 | \ + RCC_PERIPHCLK_UART4 | RCC_PERIPHCLK_UART5 | \ + RCC_PERIPHCLK_I2C1 | RCC_PERIPHCLK_I2C2 | \ + RCC_PERIPHCLK_ADC12 | RCC_PERIPHCLK_ADC34 | \ + RCC_PERIPHCLK_I2S | RCC_PERIPHCLK_TIM1 | \ + RCC_PERIPHCLK_TIM8 | RCC_PERIPHCLK_RTC | \ + RCC_PERIPHCLK_I2C3 | RCC_PERIPHCLK_TIM2 | \ + RCC_PERIPHCLK_TIM34 | RCC_PERIPHCLK_TIM15 | \ + RCC_PERIPHCLK_TIM16 | RCC_PERIPHCLK_TIM17 | \ + RCC_PERIPHCLK_TIM20)) +#endif /* STM32F398xx */ +#if defined(STM32F358xx) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((SELECTION) <= (RCC_PERIPHCLK_USART1 | RCC_PERIPHCLK_USART2 | RCC_PERIPHCLK_USART3 | \ + RCC_PERIPHCLK_UART4 | RCC_PERIPHCLK_UART5 | \ + RCC_PERIPHCLK_I2C1 | RCC_PERIPHCLK_I2C2 | \ + RCC_PERIPHCLK_ADC12 | RCC_PERIPHCLK_ADC34 | \ + RCC_PERIPHCLK_I2S | RCC_PERIPHCLK_TIM1 | \ + RCC_PERIPHCLK_TIM8 | RCC_PERIPHCLK_RTC)) +#endif /* STM32F358xx */ +#if defined(STM32F303x8) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((SELECTION) <= (RCC_PERIPHCLK_USART1 | \ + RCC_PERIPHCLK_I2C1 | RCC_PERIPHCLK_ADC12 | \ + RCC_PERIPHCLK_TIM1 | RCC_PERIPHCLK_RTC)) +#endif /* STM32F303x8 */ +#if defined(STM32F334x8) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((SELECTION) <= (RCC_PERIPHCLK_USART1 | \ + RCC_PERIPHCLK_I2C1 | RCC_PERIPHCLK_ADC12 | \ + RCC_PERIPHCLK_TIM1 | RCC_PERIPHCLK_HRTIM1 | \ + RCC_PERIPHCLK_RTC)) +#endif /* STM32F334x8 */ +#if defined(STM32F328xx) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((SELECTION) <= (RCC_PERIPHCLK_USART1 | \ + RCC_PERIPHCLK_I2C1 | RCC_PERIPHCLK_ADC12 | \ + RCC_PERIPHCLK_TIM1 | RCC_PERIPHCLK_RTC)) +#endif /* STM32F328xx */ +#if defined(STM32F373xC) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((SELECTION) <= (RCC_PERIPHCLK_USART1 | RCC_PERIPHCLK_USART2 | RCC_PERIPHCLK_USART3 | \ + RCC_PERIPHCLK_I2C1 | RCC_PERIPHCLK_I2C2 | \ + RCC_PERIPHCLK_ADC1 | RCC_PERIPHCLK_SDADC | \ + RCC_PERIPHCLK_CEC | RCC_PERIPHCLK_RTC | \ + RCC_PERIPHCLK_USB)) +#endif /* STM32F373xC */ +#if defined(STM32F378xx) +#define IS_RCC_PERIPHCLOCK(SELECTION) ((SELECTION) <= (RCC_PERIPHCLK_USART1 | RCC_PERIPHCLK_USART2 | RCC_PERIPHCLK_USART3 | \ + RCC_PERIPHCLK_I2C1 | RCC_PERIPHCLK_I2C2 | \ + RCC_PERIPHCLK_ADC1 | RCC_PERIPHCLK_SDADC | \ + RCC_PERIPHCLK_CEC | RCC_PERIPHCLK_RTC)) +#endif /* STM32F378xx */ + +#if defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx) +#define IS_RCC_USART1CLKSOURCE(SOURCE) (((SOURCE) == RCC_USART1CLKSOURCE_PCLK1) || \ + ((SOURCE) == RCC_USART1CLKSOURCE_SYSCLK) || \ + ((SOURCE) == RCC_USART1CLKSOURCE_LSE) || \ + ((SOURCE) == RCC_USART1CLKSOURCE_HSI)) +#define IS_RCC_I2C2CLKSOURCE(SOURCE) (((SOURCE) == RCC_I2C2CLKSOURCE_HSI) || \ + ((SOURCE) == RCC_I2C2CLKSOURCE_SYSCLK)) +#define IS_RCC_I2C3CLKSOURCE(SOURCE) (((SOURCE) == RCC_I2C3CLKSOURCE_HSI) || \ + ((SOURCE) == RCC_I2C3CLKSOURCE_SYSCLK)) +#define IS_RCC_ADC1PLLCLK_DIV(ADCCLK) (((ADCCLK) == RCC_ADC1PLLCLK_OFF) || ((ADCCLK) == RCC_ADC1PLLCLK_DIV1) || \ + ((ADCCLK) == RCC_ADC1PLLCLK_DIV2) || ((ADCCLK) == RCC_ADC1PLLCLK_DIV4) || \ + ((ADCCLK) == RCC_ADC1PLLCLK_DIV6) || ((ADCCLK) == RCC_ADC1PLLCLK_DIV8) || \ + ((ADCCLK) == RCC_ADC1PLLCLK_DIV10) || ((ADCCLK) == RCC_ADC1PLLCLK_DIV12) || \ + ((ADCCLK) == RCC_ADC1PLLCLK_DIV16) || ((ADCCLK) == RCC_ADC1PLLCLK_DIV32) || \ + ((ADCCLK) == RCC_ADC1PLLCLK_DIV64) || ((ADCCLK) == RCC_ADC1PLLCLK_DIV128) || \ + ((ADCCLK) == RCC_ADC1PLLCLK_DIV256)) +#define IS_RCC_I2SCLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SCLKSOURCE_SYSCLK) || \ + ((SOURCE) == RCC_I2SCLKSOURCE_EXT)) +#define IS_RCC_TIM1CLKSOURCE(SOURCE) (((SOURCE) == RCC_TIM1CLK_HCLK) || \ + ((SOURCE) == RCC_TIM1CLK_PLLCLK)) +#define IS_RCC_TIM15CLKSOURCE(SOURCE) (((SOURCE) == RCC_TIM15CLK_HCLK) || \ + ((SOURCE) == RCC_TIM15CLK_PLLCLK)) +#define IS_RCC_TIM16CLKSOURCE(SOURCE) (((SOURCE) == RCC_TIM16CLK_HCLK) || \ + ((SOURCE) == RCC_TIM16CLK_PLLCLK)) +#define IS_RCC_TIM17CLKSOURCE(SOURCE) (((SOURCE) == RCC_TIM17CLK_HCLK) || \ + ((SOURCE) == RCC_TIM17CLK_PLLCLK)) +#endif /* STM32F301x8 || STM32F302x8 || STM32F318xx */ +#if defined(STM32F302xC) || defined(STM32F303xC) || defined(STM32F358xx) +#define IS_RCC_USART1CLKSOURCE(SOURCE) (((SOURCE) == RCC_USART1CLKSOURCE_PCLK2) || \ + ((SOURCE) == RCC_USART1CLKSOURCE_SYSCLK) || \ + ((SOURCE) == RCC_USART1CLKSOURCE_LSE) || \ + ((SOURCE) == RCC_USART1CLKSOURCE_HSI)) +#define IS_RCC_I2C2CLKSOURCE(SOURCE) (((SOURCE) == RCC_I2C2CLKSOURCE_HSI) || \ + ((SOURCE) == RCC_I2C2CLKSOURCE_SYSCLK)) +#define IS_RCC_ADC12PLLCLK_DIV(ADCCLK) (((ADCCLK) == RCC_ADC12PLLCLK_OFF) || ((ADCCLK) == RCC_ADC12PLLCLK_DIV1) || \ + ((ADCCLK) == RCC_ADC12PLLCLK_DIV2) || ((ADCCLK) == RCC_ADC12PLLCLK_DIV4) || \ + ((ADCCLK) == RCC_ADC12PLLCLK_DIV6) || ((ADCCLK) == RCC_ADC12PLLCLK_DIV8) || \ + ((ADCCLK) == RCC_ADC12PLLCLK_DIV10) || ((ADCCLK) == RCC_ADC12PLLCLK_DIV12) || \ + ((ADCCLK) == RCC_ADC12PLLCLK_DIV16) || ((ADCCLK) == RCC_ADC12PLLCLK_DIV32) || \ + ((ADCCLK) == RCC_ADC12PLLCLK_DIV64) || ((ADCCLK) == RCC_ADC12PLLCLK_DIV128) || \ + ((ADCCLK) == RCC_ADC12PLLCLK_DIV256)) +#define IS_RCC_I2SCLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SCLKSOURCE_SYSCLK) || \ + ((SOURCE) == RCC_I2SCLKSOURCE_EXT)) +#define IS_RCC_TIM1CLKSOURCE(SOURCE) (((SOURCE) == RCC_TIM1CLK_HCLK) || \ + ((SOURCE) == RCC_TIM1CLK_PLLCLK)) +#define IS_RCC_UART4CLKSOURCE(SOURCE) (((SOURCE) == RCC_UART4CLKSOURCE_PCLK1) || \ + ((SOURCE) == RCC_UART4CLKSOURCE_SYSCLK) || \ + ((SOURCE) == RCC_UART4CLKSOURCE_LSE) || \ + ((SOURCE) == RCC_UART4CLKSOURCE_HSI)) +#define IS_RCC_UART5CLKSOURCE(SOURCE) (((SOURCE) == RCC_UART5CLKSOURCE_PCLK1) || \ + ((SOURCE) == RCC_UART5CLKSOURCE_SYSCLK) || \ + ((SOURCE) == RCC_UART5CLKSOURCE_LSE) || \ + ((SOURCE) == RCC_UART5CLKSOURCE_HSI)) +#endif /* STM32F302xC || STM32F303xC || STM32F358xx */ +#if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx) +#define IS_RCC_USART1CLKSOURCE(SOURCE) (((SOURCE) == RCC_USART1CLKSOURCE_PCLK2) || \ + ((SOURCE) == RCC_USART1CLKSOURCE_SYSCLK) || \ + ((SOURCE) == RCC_USART1CLKSOURCE_LSE) || \ + ((SOURCE) == RCC_USART1CLKSOURCE_HSI)) +#define IS_RCC_I2C2CLKSOURCE(SOURCE) (((SOURCE) == RCC_I2C2CLKSOURCE_HSI) || \ + ((SOURCE) == RCC_I2C2CLKSOURCE_SYSCLK)) +#define IS_RCC_I2C3CLKSOURCE(SOURCE) (((SOURCE) == RCC_I2C3CLKSOURCE_HSI) || \ + ((SOURCE) == RCC_I2C3CLKSOURCE_SYSCLK)) +#define IS_RCC_ADC12PLLCLK_DIV(ADCCLK) (((ADCCLK) == RCC_ADC12PLLCLK_OFF) || ((ADCCLK) == RCC_ADC12PLLCLK_DIV1) || \ + ((ADCCLK) == RCC_ADC12PLLCLK_DIV2) || ((ADCCLK) == RCC_ADC12PLLCLK_DIV4) || \ + ((ADCCLK) == RCC_ADC12PLLCLK_DIV6) || ((ADCCLK) == RCC_ADC12PLLCLK_DIV8) || \ + ((ADCCLK) == RCC_ADC12PLLCLK_DIV10) || ((ADCCLK) == RCC_ADC12PLLCLK_DIV12) || \ + ((ADCCLK) == RCC_ADC12PLLCLK_DIV16) || ((ADCCLK) == RCC_ADC12PLLCLK_DIV32) || \ + ((ADCCLK) == RCC_ADC12PLLCLK_DIV64) || ((ADCCLK) == RCC_ADC12PLLCLK_DIV128) || \ + ((ADCCLK) == RCC_ADC12PLLCLK_DIV256)) +#define IS_RCC_I2SCLKSOURCE(SOURCE) (((SOURCE) == RCC_I2SCLKSOURCE_SYSCLK) || \ + ((SOURCE) == RCC_I2SCLKSOURCE_EXT)) +#define IS_RCC_TIM1CLKSOURCE(SOURCE) (((SOURCE) == RCC_TIM1CLK_HCLK) || \ + ((SOURCE) == RCC_TIM1CLK_PLLCLK)) +#define IS_RCC_TIM2CLKSOURCE(SOURCE) (((SOURCE) == RCC_TIM2CLK_HCLK) || \ + ((SOURCE) == RCC_TIM2CLK_PLLCLK)) +#define IS_RCC_TIM3CLKSOURCE(SOURCE) (((SOURCE) == RCC_TIM34CLK_HCLK) || \ + ((SOURCE) == RCC_TIM34CLK_PLLCLK)) +#define IS_RCC_TIM15CLKSOURCE(SOURCE) (((SOURCE) == RCC_TIM15CLK_HCLK) || \ + ((SOURCE) == RCC_TIM15CLK_PLLCLK)) +#define IS_RCC_TIM16CLKSOURCE(SOURCE) (((SOURCE) == RCC_TIM16CLK_HCLK) || \ + ((SOURCE) == RCC_TIM16CLK_PLLCLK)) +#define IS_RCC_TIM17CLKSOURCE(SOURCE) (((SOURCE) == RCC_TIM17CLK_HCLK) || \ + ((SOURCE) == RCC_TIM17CLK_PLLCLK)) +#define IS_RCC_UART4CLKSOURCE(SOURCE) (((SOURCE) == RCC_UART4CLKSOURCE_PCLK1) || \ + ((SOURCE) == RCC_UART4CLKSOURCE_SYSCLK) || \ + ((SOURCE) == RCC_UART4CLKSOURCE_LSE) || \ + ((SOURCE) == RCC_UART4CLKSOURCE_HSI)) +#define IS_RCC_UART5CLKSOURCE(SOURCE) (((SOURCE) == RCC_UART5CLKSOURCE_PCLK1) || \ + ((SOURCE) == RCC_UART5CLKSOURCE_SYSCLK) || \ + ((SOURCE) == RCC_UART5CLKSOURCE_LSE) || \ + ((SOURCE) == RCC_UART5CLKSOURCE_HSI)) +#endif /* STM32F302xE || STM32F303xE || STM32F398xx */ +#if defined(STM32F303xE) || defined(STM32F398xx) +#define IS_RCC_TIM20CLKSOURCE(SOURCE) (((SOURCE) == RCC_TIM20CLK_HCLK) || \ + ((SOURCE) == RCC_TIM20CLK_PLLCLK)) +#endif /* STM32F303xE || STM32F398xx */ +#if defined(STM32F303xE) || defined(STM32F398xx)\ + || defined(STM32F303xC) || defined(STM32F358xx) +#define IS_RCC_ADC34PLLCLK_DIV(ADCCLK) (((ADCCLK) == RCC_ADC34PLLCLK_OFF) || ((ADCCLK) == RCC_ADC34PLLCLK_DIV1) || \ + ((ADCCLK) == RCC_ADC34PLLCLK_DIV2) || ((ADCCLK) == RCC_ADC34PLLCLK_DIV4) || \ + ((ADCCLK) == RCC_ADC34PLLCLK_DIV6) || ((ADCCLK) == RCC_ADC34PLLCLK_DIV8) || \ + ((ADCCLK) == RCC_ADC34PLLCLK_DIV10) || ((ADCCLK) == RCC_ADC34PLLCLK_DIV12) || \ + ((ADCCLK) == RCC_ADC34PLLCLK_DIV16) || ((ADCCLK) == RCC_ADC34PLLCLK_DIV32) || \ + ((ADCCLK) == RCC_ADC34PLLCLK_DIV64) || ((ADCCLK) == RCC_ADC34PLLCLK_DIV128) || \ + ((ADCCLK) == RCC_ADC34PLLCLK_DIV256)) +#define IS_RCC_TIM8CLKSOURCE(SOURCE) (((SOURCE) == RCC_TIM8CLK_HCLK) || \ + ((SOURCE) == RCC_TIM8CLK_PLLCLK)) +#endif /* STM32F303xC || STM32F303xE || STM32F398xx || STM32F358xx */ +#if defined(STM32F303x8) || defined(STM32F334x8) || defined(STM32F328xx) +#define IS_RCC_USART1CLKSOURCE(SOURCE) (((SOURCE) == RCC_USART1CLKSOURCE_PCLK1) || \ + ((SOURCE) == RCC_USART1CLKSOURCE_SYSCLK) || \ + ((SOURCE) == RCC_USART1CLKSOURCE_LSE) || \ + ((SOURCE) == RCC_USART1CLKSOURCE_HSI)) +#define IS_RCC_ADC12PLLCLK_DIV(ADCCLK) (((ADCCLK) == RCC_ADC12PLLCLK_OFF) || ((ADCCLK) == RCC_ADC12PLLCLK_DIV1) || \ + ((ADCCLK) == RCC_ADC12PLLCLK_DIV2) || ((ADCCLK) == RCC_ADC12PLLCLK_DIV4) || \ + ((ADCCLK) == RCC_ADC12PLLCLK_DIV6) || ((ADCCLK) == RCC_ADC12PLLCLK_DIV8) || \ + ((ADCCLK) == RCC_ADC12PLLCLK_DIV10) || ((ADCCLK) == RCC_ADC12PLLCLK_DIV12) || \ + ((ADCCLK) == RCC_ADC12PLLCLK_DIV16) || ((ADCCLK) == RCC_ADC12PLLCLK_DIV32) || \ + ((ADCCLK) == RCC_ADC12PLLCLK_DIV64) || ((ADCCLK) == RCC_ADC12PLLCLK_DIV128) || \ + ((ADCCLK) == RCC_ADC12PLLCLK_DIV256)) +#define IS_RCC_TIM1CLKSOURCE(SOURCE) (((SOURCE) == RCC_TIM1CLK_HCLK) || \ + ((SOURCE) == RCC_TIM1CLK_PLLCLK)) +#endif /* STM32F303x8 || STM32F334x8 || STM32F328xx */ +#if defined(STM32F334x8) +#define IS_RCC_HRTIM1CLKSOURCE(SOURCE) (((SOURCE) == RCC_HRTIM1CLK_HCLK) || \ + ((SOURCE) == RCC_HRTIM1CLK_PLLCLK)) +#endif /* STM32F334x8 */ +#if defined(STM32F373xC) || defined(STM32F378xx) +#define IS_RCC_USART1CLKSOURCE(SOURCE) (((SOURCE) == RCC_USART1CLKSOURCE_PCLK2) || \ + ((SOURCE) == RCC_USART1CLKSOURCE_SYSCLK) || \ + ((SOURCE) == RCC_USART1CLKSOURCE_LSE) || \ + ((SOURCE) == RCC_USART1CLKSOURCE_HSI)) +#define IS_RCC_I2C2CLKSOURCE(SOURCE) (((SOURCE) == RCC_I2C2CLKSOURCE_HSI) || \ + ((SOURCE) == RCC_I2C2CLKSOURCE_SYSCLK)) +#define IS_RCC_ADC1PCLK2_DIV(ADCCLK) (((ADCCLK) == RCC_ADC1PCLK2_DIV2) || ((ADCCLK) == RCC_ADC1PCLK2_DIV4) || \ + ((ADCCLK) == RCC_ADC1PCLK2_DIV6) || ((ADCCLK) == RCC_ADC1PCLK2_DIV8)) +#define IS_RCC_CECCLKSOURCE(SOURCE) (((SOURCE) == RCC_CECCLKSOURCE_HSI) || \ + ((SOURCE) == RCC_CECCLKSOURCE_LSE)) +#define IS_RCC_SDADCSYSCLK_DIV(DIV) (((DIV) == RCC_SDADCSYSCLK_DIV1) || ((DIV) == RCC_SDADCSYSCLK_DIV2) || \ + ((DIV) == RCC_SDADCSYSCLK_DIV4) || ((DIV) == RCC_SDADCSYSCLK_DIV6) || \ + ((DIV) == RCC_SDADCSYSCLK_DIV8) || ((DIV) == RCC_SDADCSYSCLK_DIV10) || \ + ((DIV) == RCC_SDADCSYSCLK_DIV12) || ((DIV) == RCC_SDADCSYSCLK_DIV14) || \ + ((DIV) == RCC_SDADCSYSCLK_DIV16) || ((DIV) == RCC_SDADCSYSCLK_DIV20) || \ + ((DIV) == RCC_SDADCSYSCLK_DIV24) || ((DIV) == RCC_SDADCSYSCLK_DIV28) || \ + ((DIV) == RCC_SDADCSYSCLK_DIV32) || ((DIV) == RCC_SDADCSYSCLK_DIV36) || \ + ((DIV) == RCC_SDADCSYSCLK_DIV40) || ((DIV) == RCC_SDADCSYSCLK_DIV44) || \ + ((DIV) == RCC_SDADCSYSCLK_DIV48)) +#endif /* STM32F373xC || STM32F378xx */ +#if defined(STM32F302xE) || defined(STM32F303xE)\ + || defined(STM32F302xC) || defined(STM32F303xC)\ + || defined(STM32F302x8) \ + || defined(STM32F373xC) +#define IS_RCC_USBCLKSOURCE(SOURCE) (((SOURCE) == RCC_USBCLKSOURCE_PLL) || \ + ((SOURCE) == RCC_USBCLKSOURCE_PLL_DIV1_5)) +#endif /* STM32F302xE || STM32F303xE || */ + /* STM32F302xC || STM32F303xC || */ + /* STM32F302x8 || */ + /* STM32F373xC */ +#if defined(RCC_CFGR_MCOPRE) +#define IS_RCC_MCODIV(DIV) (((DIV) == RCC_MCODIV_1) || ((DIV) == RCC_MCODIV_2) || \ + ((DIV) == RCC_MCODIV_4) || ((DIV) == RCC_MCODIV_8) || \ + ((DIV) == RCC_MCODIV_16) || ((DIV) == RCC_MCODIV_32) || \ + ((DIV) == RCC_MCODIV_64) || ((DIV) == RCC_MCODIV_128)) +#else +#define IS_RCC_MCODIV(DIV) (((DIV) == RCC_MCODIV_1)) +#endif /* RCC_CFGR_MCOPRE */ + +#define IS_RCC_LSE_DRIVE(__DRIVE__) (((__DRIVE__) == RCC_LSEDRIVE_LOW) || \ + ((__DRIVE__) == RCC_LSEDRIVE_MEDIUMLOW) || \ + ((__DRIVE__) == RCC_LSEDRIVE_MEDIUMHIGH) || \ + ((__DRIVE__) == RCC_LSEDRIVE_HIGH)) + +/** + * @} + */ + +/* Exported types ------------------------------------------------------------*/ +/** @defgroup RCCEx_Exported_Types RCCEx Exported Types + * @{ + */ + +/** + * @brief RCC extended clocks structure definition + */ +#if defined(STM32F301x8) || defined(STM32F318xx) +typedef struct +{ + uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. + This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ + + uint32_t RTCClockSelection; /*!< Specifies RTC Clock Prescalers Selection + This parameter can be a value of @ref RCC_RTC_Clock_Source */ + + uint32_t Usart1ClockSelection; /*!< USART1 clock source + This parameter can be a value of @ref RCCEx_USART1_Clock_Source */ + + uint32_t I2c1ClockSelection; /*!< I2C1 clock source + This parameter can be a value of @ref RCC_I2C1_Clock_Source */ + + uint32_t I2c2ClockSelection; /*!< I2C2 clock source + This parameter can be a value of @ref RCCEx_I2C2_Clock_Source */ + + uint32_t I2c3ClockSelection; /*!< I2C3 clock source + This parameter can be a value of @ref RCCEx_I2C3_Clock_Source */ + + uint32_t Adc1ClockSelection; /*!< ADC1 clock source + This parameter can be a value of @ref RCCEx_ADC1_Clock_Source */ + + uint32_t I2sClockSelection; /*!< I2S clock source + This parameter can be a value of @ref RCCEx_I2S_Clock_Source */ + + uint32_t Tim1ClockSelection; /*!< TIM1 clock source + This parameter can be a value of @ref RCCEx_TIM1_Clock_Source */ + + uint32_t Tim15ClockSelection; /*!< TIM15 clock source + This parameter can be a value of @ref RCCEx_TIM15_Clock_Source */ + + uint32_t Tim16ClockSelection; /*!< TIM16 clock source + This parameter can be a value of @ref RCCEx_TIM16_Clock_Source */ + + uint32_t Tim17ClockSelection; /*!< TIM17 clock source + This parameter can be a value of @ref RCCEx_TIM17_Clock_Source */ +}RCC_PeriphCLKInitTypeDef; +#endif /* STM32F301x8 || STM32F318xx */ + +#if defined(STM32F302x8) +typedef struct +{ + uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. + This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ + + uint32_t RTCClockSelection; /*!< Specifies RTC Clock Prescalers Selection + This parameter can be a value of @ref RCC_RTC_Clock_Source */ + + uint32_t Usart1ClockSelection; /*!< USART1 clock source + This parameter can be a value of @ref RCCEx_USART1_Clock_Source */ + + uint32_t I2c1ClockSelection; /*!< I2C1 clock source + This parameter can be a value of @ref RCC_I2C1_Clock_Source */ + + uint32_t I2c2ClockSelection; /*!< I2C2 clock source + This parameter can be a value of @ref RCCEx_I2C2_Clock_Source */ + + uint32_t I2c3ClockSelection; /*!< I2C3 clock source + This parameter can be a value of @ref RCCEx_I2C3_Clock_Source */ + + uint32_t Adc1ClockSelection; /*!< ADC1 clock source + This parameter can be a value of @ref RCCEx_ADC1_Clock_Source */ + + uint32_t I2sClockSelection; /*!< I2S clock source + This parameter can be a value of @ref RCCEx_I2S_Clock_Source */ + + uint32_t Tim1ClockSelection; /*!< TIM1 clock source + This parameter can be a value of @ref RCCEx_TIM1_Clock_Source */ + + uint32_t Tim15ClockSelection; /*!< TIM15 clock source + This parameter can be a value of @ref RCCEx_TIM15_Clock_Source */ + + uint32_t Tim16ClockSelection; /*!< TIM16 clock source + This parameter can be a value of @ref RCCEx_TIM16_Clock_Source */ + + uint32_t Tim17ClockSelection; /*!< TIM17 clock source + This parameter can be a value of @ref RCCEx_TIM17_Clock_Source */ + + uint32_t USBClockSelection; /*!< USB clock source + This parameter can be a value of @ref RCCEx_USB_Clock_Source */ + +}RCC_PeriphCLKInitTypeDef; +#endif /* STM32F302x8 */ + +#if defined(STM32F302xC) +typedef struct +{ + uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. + This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ + + uint32_t RTCClockSelection; /*!< Specifies RTC Clock Prescalers Selection + This parameter can be a value of @ref RCC_RTC_Clock_Source */ + + uint32_t Usart1ClockSelection; /*!< USART1 clock source + This parameter can be a value of @ref RCCEx_USART1_Clock_Source */ + + uint32_t Usart2ClockSelection; /*!< USART2 clock source + This parameter can be a value of @ref RCC_USART2_Clock_Source */ + + uint32_t Usart3ClockSelection; /*!< USART3 clock source + This parameter can be a value of @ref RCC_USART3_Clock_Source */ + + uint32_t Uart4ClockSelection; /*!< UART4 clock source + This parameter can be a value of @ref RCCEx_UART4_Clock_Source */ + + uint32_t Uart5ClockSelection; /*!< UART5 clock source + This parameter can be a value of @ref RCCEx_UART5_Clock_Source */ + + uint32_t I2c1ClockSelection; /*!< I2C1 clock source + This parameter can be a value of @ref RCC_I2C1_Clock_Source */ + + uint32_t I2c2ClockSelection; /*!< I2C2 clock source + This parameter can be a value of @ref RCCEx_I2C2_Clock_Source */ + + uint32_t Adc12ClockSelection; /*!< ADC1 & ADC2 clock source + This parameter can be a value of @ref RCCEx_ADC12_Clock_Source */ + + uint32_t I2sClockSelection; /*!< I2S clock source + This parameter can be a value of @ref RCCEx_I2S_Clock_Source */ + + uint32_t Tim1ClockSelection; /*!< TIM1 clock source + This parameter can be a value of @ref RCCEx_TIM1_Clock_Source */ + + uint32_t USBClockSelection; /*!< USB clock source + This parameter can be a value of @ref RCCEx_USB_Clock_Source */ + +}RCC_PeriphCLKInitTypeDef; +#endif /* STM32F302xC */ + +#if defined(STM32F303xC) +typedef struct +{ + uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. + This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ + + uint32_t RTCClockSelection; /*!< Specifies RTC Clock Prescalers Selection + This parameter can be a value of @ref RCC_RTC_Clock_Source */ + + uint32_t Usart1ClockSelection; /*!< USART1 clock source + This parameter can be a value of @ref RCCEx_USART1_Clock_Source */ + + uint32_t Usart2ClockSelection; /*!< USART2 clock source + This parameter can be a value of @ref RCC_USART2_Clock_Source */ + + uint32_t Usart3ClockSelection; /*!< USART3 clock source + This parameter can be a value of @ref RCC_USART3_Clock_Source */ + + uint32_t Uart4ClockSelection; /*!< UART4 clock source + This parameter can be a value of @ref RCCEx_UART4_Clock_Source */ + + uint32_t Uart5ClockSelection; /*!< UART5 clock source + This parameter can be a value of @ref RCCEx_UART5_Clock_Source */ + + uint32_t I2c1ClockSelection; /*!< I2C1 clock source + This parameter can be a value of @ref RCC_I2C1_Clock_Source */ + + uint32_t I2c2ClockSelection; /*!< I2C2 clock source + This parameter can be a value of @ref RCCEx_I2C2_Clock_Source */ + + uint32_t Adc12ClockSelection; /*!< ADC1 & ADC2 clock source + This parameter can be a value of @ref RCCEx_ADC12_Clock_Source */ + + uint32_t Adc34ClockSelection; /*!< ADC3 & ADC4 clock source + This parameter can be a value of @ref RCCEx_ADC34_Clock_Source */ + + uint32_t I2sClockSelection; /*!< I2S clock source + This parameter can be a value of @ref RCCEx_I2S_Clock_Source */ + + uint32_t Tim1ClockSelection; /*!< TIM1 clock source + This parameter can be a value of @ref RCCEx_TIM1_Clock_Source */ + + uint32_t Tim8ClockSelection; /*!< TIM8 clock source + This parameter can be a value of @ref RCCEx_TIM8_Clock_Source */ + + uint32_t USBClockSelection; /*!< USB clock source + This parameter can be a value of @ref RCCEx_USB_Clock_Source */ + +}RCC_PeriphCLKInitTypeDef; +#endif /* STM32F303xC */ + +#if defined(STM32F302xE) +typedef struct +{ + uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. + This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ + + uint32_t RTCClockSelection; /*!< Specifies RTC Clock Prescalers Selection + This parameter can be a value of @ref RCC_RTC_Clock_Source */ + + uint32_t Usart1ClockSelection; /*!< USART1 clock source + This parameter can be a value of @ref RCCEx_USART1_Clock_Source */ + + uint32_t Usart2ClockSelection; /*!< USART2 clock source + This parameter can be a value of @ref RCC_USART2_Clock_Source */ + + uint32_t Usart3ClockSelection; /*!< USART3 clock source + This parameter can be a value of @ref RCC_USART3_Clock_Source */ + + uint32_t Uart4ClockSelection; /*!< UART4 clock source + This parameter can be a value of @ref RCCEx_UART4_Clock_Source */ + + uint32_t Uart5ClockSelection; /*!< UART5 clock source + This parameter can be a value of @ref RCCEx_UART5_Clock_Source */ + + uint32_t I2c1ClockSelection; /*!< I2C1 clock source + This parameter can be a value of @ref RCC_I2C1_Clock_Source */ + + uint32_t I2c2ClockSelection; /*!< I2C2 clock source + This parameter can be a value of @ref RCCEx_I2C2_Clock_Source */ + + uint32_t I2c3ClockSelection; /*!< I2C3 clock source + This parameter can be a value of @ref RCCEx_I2C3_Clock_Source */ + + uint32_t Adc12ClockSelection; /*!< ADC1 & ADC2 clock source + This parameter can be a value of @ref RCCEx_ADC12_Clock_Source */ + + uint32_t I2sClockSelection; /*!< I2S clock source + This parameter can be a value of @ref RCCEx_I2S_Clock_Source */ + + uint32_t Tim1ClockSelection; /*!< TIM1 clock source + This parameter can be a value of @ref RCCEx_TIM1_Clock_Source */ + + uint32_t Tim2ClockSelection; /*!< TIM2 clock source + This parameter can be a value of @ref RCCEx_TIM2_Clock_Source */ + + uint32_t Tim34ClockSelection; /*!< TIM3 & TIM4 clock source + This parameter can be a value of @ref RCCEx_TIM34_Clock_Source */ + + uint32_t Tim15ClockSelection; /*!< TIM15 clock source + This parameter can be a value of @ref RCCEx_TIM15_Clock_Source */ + + uint32_t Tim16ClockSelection; /*!< TIM16 clock source + This parameter can be a value of @ref RCCEx_TIM16_Clock_Source */ + + uint32_t Tim17ClockSelection; /*!< TIM17 clock source + This parameter can be a value of @ref RCCEx_TIM17_Clock_Source */ + + uint32_t USBClockSelection; /*!< USB clock source + This parameter can be a value of @ref RCCEx_USB_Clock_Source */ + +}RCC_PeriphCLKInitTypeDef; +#endif /* STM32F302xE */ + +#if defined(STM32F303xE) +typedef struct +{ + uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. + This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ + + uint32_t RTCClockSelection; /*!< Specifies RTC Clock Prescalers Selection + This parameter can be a value of @ref RCC_RTC_Clock_Source */ + + uint32_t Usart1ClockSelection; /*!< USART1 clock source + This parameter can be a value of @ref RCCEx_USART1_Clock_Source */ + + uint32_t Usart2ClockSelection; /*!< USART2 clock source + This parameter can be a value of @ref RCC_USART2_Clock_Source */ + + uint32_t Usart3ClockSelection; /*!< USART3 clock source + This parameter can be a value of @ref RCC_USART3_Clock_Source */ + + uint32_t Uart4ClockSelection; /*!< UART4 clock source + This parameter can be a value of @ref RCCEx_UART4_Clock_Source */ + + uint32_t Uart5ClockSelection; /*!< UART5 clock source + This parameter can be a value of @ref RCCEx_UART5_Clock_Source */ + + uint32_t I2c1ClockSelection; /*!< I2C1 clock source + This parameter can be a value of @ref RCC_I2C1_Clock_Source */ + + uint32_t I2c2ClockSelection; /*!< I2C2 clock source + This parameter can be a value of @ref RCCEx_I2C2_Clock_Source */ + + uint32_t I2c3ClockSelection; /*!< I2C3 clock source + This parameter can be a value of @ref RCCEx_I2C3_Clock_Source */ + + uint32_t Adc12ClockSelection; /*!< ADC1 & ADC2 clock source + This parameter can be a value of @ref RCCEx_ADC12_Clock_Source */ + + uint32_t Adc34ClockSelection; /*!< ADC3 & ADC4 clock source + This parameter can be a value of @ref RCCEx_ADC34_Clock_Source */ + + uint32_t I2sClockSelection; /*!< I2S clock source + This parameter can be a value of @ref RCCEx_I2S_Clock_Source */ + + uint32_t Tim1ClockSelection; /*!< TIM1 clock source + This parameter can be a value of @ref RCCEx_TIM1_Clock_Source */ + + uint32_t Tim2ClockSelection; /*!< TIM2 clock source + This parameter can be a value of @ref RCCEx_TIM2_Clock_Source */ + + uint32_t Tim34ClockSelection; /*!< TIM3 & TIM4 clock source + This parameter can be a value of @ref RCCEx_TIM34_Clock_Source */ + + uint32_t Tim8ClockSelection; /*!< TIM8 clock source + This parameter can be a value of @ref RCCEx_TIM8_Clock_Source */ + + uint32_t Tim15ClockSelection; /*!< TIM15 clock source + This parameter can be a value of @ref RCCEx_TIM15_Clock_Source */ + + uint32_t Tim16ClockSelection; /*!< TIM16 clock source + This parameter can be a value of @ref RCCEx_TIM16_Clock_Source */ + + uint32_t Tim17ClockSelection; /*!< TIM17 clock source + This parameter can be a value of @ref RCCEx_TIM17_Clock_Source */ + + uint32_t Tim20ClockSelection; /*!< TIM20 clock source + This parameter can be a value of @ref RCCEx_TIM20_Clock_Source */ + + uint32_t USBClockSelection; /*!< USB clock source + This parameter can be a value of @ref RCCEx_USB_Clock_Source */ + +}RCC_PeriphCLKInitTypeDef; +#endif /* STM32F303xE */ + +#if defined(STM32F398xx) +typedef struct +{ + uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. + This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ + + uint32_t RTCClockSelection; /*!< Specifies RTC Clock Prescalers Selection + This parameter can be a value of @ref RCC_RTC_Clock_Source */ + + uint32_t Usart1ClockSelection; /*!< USART1 clock source + This parameter can be a value of @ref RCCEx_USART1_Clock_Source */ + + uint32_t Usart2ClockSelection; /*!< USART2 clock source + This parameter can be a value of @ref RCC_USART2_Clock_Source */ + + uint32_t Usart3ClockSelection; /*!< USART3 clock source + This parameter can be a value of @ref RCC_USART3_Clock_Source */ + + uint32_t Uart4ClockSelection; /*!< UART4 clock source + This parameter can be a value of @ref RCCEx_UART4_Clock_Source */ + + uint32_t Uart5ClockSelection; /*!< UART5 clock source + This parameter can be a value of @ref RCCEx_UART5_Clock_Source */ + + uint32_t I2c1ClockSelection; /*!< I2C1 clock source + This parameter can be a value of @ref RCC_I2C1_Clock_Source */ + + uint32_t I2c2ClockSelection; /*!< I2C2 clock source + This parameter can be a value of @ref RCCEx_I2C2_Clock_Source */ + + uint32_t I2c3ClockSelection; /*!< I2C3 clock source + This parameter can be a value of @ref RCCEx_I2C3_Clock_Source */ + + uint32_t Adc12ClockSelection; /*!< ADC1 & ADC2 clock source + This parameter can be a value of @ref RCCEx_ADC12_Clock_Source */ + + uint32_t Adc34ClockSelection; /*!< ADC3 & ADC4 clock source + This parameter can be a value of @ref RCCEx_ADC34_Clock_Source */ + + uint32_t I2sClockSelection; /*!< I2S clock source + This parameter can be a value of @ref RCCEx_I2S_Clock_Source */ + + uint32_t Tim1ClockSelection; /*!< TIM1 clock source + This parameter can be a value of @ref RCCEx_TIM1_Clock_Source */ + + uint32_t Tim2ClockSelection; /*!< TIM2 clock source + This parameter can be a value of @ref RCCEx_TIM2_Clock_Source */ + + uint32_t Tim34ClockSelection; /*!< TIM3 & TIM4 clock source + This parameter can be a value of @ref RCCEx_TIM34_Clock_Source */ + + uint32_t Tim8ClockSelection; /*!< TIM8 clock source + This parameter can be a value of @ref RCCEx_TIM8_Clock_Source */ + + uint32_t Tim15ClockSelection; /*!< TIM15 clock source + This parameter can be a value of @ref RCCEx_TIM15_Clock_Source */ + + uint32_t Tim16ClockSelection; /*!< TIM16 clock source + This parameter can be a value of @ref RCCEx_TIM16_Clock_Source */ + + uint32_t Tim17ClockSelection; /*!< TIM17 clock source + This parameter can be a value of @ref RCCEx_TIM17_Clock_Source */ + + uint32_t Tim20ClockSelection; /*!< TIM20 clock source + This parameter can be a value of @ref RCCEx_TIM20_Clock_Source */ + +}RCC_PeriphCLKInitTypeDef; +#endif /* STM32F398xx */ + +#if defined(STM32F358xx) +typedef struct +{ + uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. + This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ + + uint32_t RTCClockSelection; /*!< Specifies RTC Clock Prescalers Selection + This parameter can be a value of @ref RCC_RTC_Clock_Source */ + + uint32_t Usart1ClockSelection; /*!< USART1 clock source + This parameter can be a value of @ref RCCEx_USART1_Clock_Source */ + + uint32_t Usart2ClockSelection; /*!< USART2 clock source + This parameter can be a value of @ref RCC_USART2_Clock_Source */ + + uint32_t Usart3ClockSelection; /*!< USART3 clock source + This parameter can be a value of @ref RCC_USART3_Clock_Source */ + + uint32_t Uart4ClockSelection; /*!< UART4 clock source + This parameter can be a value of @ref RCCEx_UART4_Clock_Source */ + + uint32_t Uart5ClockSelection; /*!< UART5 clock source + This parameter can be a value of @ref RCCEx_UART5_Clock_Source */ + + uint32_t I2c1ClockSelection; /*!< I2C1 clock source + This parameter can be a value of @ref RCC_I2C1_Clock_Source */ + + uint32_t I2c2ClockSelection; /*!< I2C2 clock source + This parameter can be a value of @ref RCCEx_I2C2_Clock_Source */ + + uint32_t Adc12ClockSelection; /*!< ADC1 & ADC2 clock source + This parameter can be a value of @ref RCCEx_ADC12_Clock_Source */ + + uint32_t Adc34ClockSelection; /*!< ADC3 & ADC4 clock source + This parameter can be a value of @ref RCCEx_ADC34_Clock_Source */ + + uint32_t I2sClockSelection; /*!< I2S clock source + This parameter can be a value of @ref RCCEx_I2S_Clock_Source */ + + uint32_t Tim1ClockSelection; /*!< TIM1 clock source + This parameter can be a value of @ref RCCEx_TIM1_Clock_Source */ + + uint32_t Tim8ClockSelection; /*!< TIM8 clock source + This parameter can be a value of @ref RCCEx_TIM8_Clock_Source */ + +}RCC_PeriphCLKInitTypeDef; +#endif /* STM32F358xx */ + +#if defined(STM32F303x8) +typedef struct +{ + uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. + This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ + + uint32_t RTCClockSelection; /*!< Specifies RTC Clock Prescalers Selection + This parameter can be a value of @ref RCC_RTC_Clock_Source */ + + uint32_t Usart1ClockSelection; /*!< USART1 clock source + This parameter can be a value of @ref RCCEx_USART1_Clock_Source */ + + uint32_t I2c1ClockSelection; /*!< I2C1 clock source + This parameter can be a value of @ref RCC_I2C1_Clock_Source */ + + uint32_t Adc12ClockSelection; /*!< ADC1 & ADC2 clock source + This parameter can be a value of @ref RCCEx_ADC12_Clock_Source */ + + uint32_t Tim1ClockSelection; /*!< TIM1 clock source + This parameter can be a value of @ref RCCEx_TIM1_Clock_Source */ + +}RCC_PeriphCLKInitTypeDef; +#endif /* STM32F303x8 */ + +#if defined(STM32F334x8) +typedef struct +{ + uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. + This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ + + uint32_t RTCClockSelection; /*!< Specifies RTC Clock Prescalers Selection + This parameter can be a value of @ref RCC_RTC_Clock_Source */ + + uint32_t Usart1ClockSelection; /*!< USART1 clock source + This parameter can be a value of @ref RCCEx_USART1_Clock_Source */ + + uint32_t I2c1ClockSelection; /*!< I2C1 clock source + This parameter can be a value of @ref RCC_I2C1_Clock_Source */ + + uint32_t Adc12ClockSelection; /*!< ADC1 & ADC2 clock source + This parameter can be a value of @ref RCCEx_ADC12_Clock_Source */ + + uint32_t Tim1ClockSelection; /*!< TIM1 clock source + This parameter can be a value of @ref RCCEx_TIM1_Clock_Source */ + + uint32_t Hrtim1ClockSelection; /*!< HRTIM1 clock source + This parameter can be a value of @ref RCCEx_HRTIM1_Clock_Source */ + +}RCC_PeriphCLKInitTypeDef; +#endif /* STM32F334x8 */ + +#if defined(STM32F328xx) +typedef struct +{ + uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. + This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ + + uint32_t RTCClockSelection; /*!< Specifies RTC Clock Prescalers Selection + This parameter can be a value of @ref RCC_RTC_Clock_Source */ + + uint32_t Usart1ClockSelection; /*!< USART1 clock source + This parameter can be a value of @ref RCCEx_USART1_Clock_Source */ + + uint32_t I2c1ClockSelection; /*!< I2C1 clock source + This parameter can be a value of @ref RCC_I2C1_Clock_Source */ + + uint32_t Adc12ClockSelection; /*!< ADC1 & ADC2 clock source + This parameter can be a value of @ref RCCEx_ADC12_Clock_Source */ + + uint32_t Tim1ClockSelection; /*!< TIM1 clock source + This parameter can be a value of @ref RCCEx_TIM1_Clock_Source */ + +}RCC_PeriphCLKInitTypeDef; +#endif /* STM32F328xx */ + +#if defined(STM32F373xC) +typedef struct +{ + uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. + This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ + + uint32_t RTCClockSelection; /*!< Specifies RTC Clock Prescalers Selection + This parameter can be a value of @ref RCC_RTC_Clock_Source */ + + uint32_t Usart1ClockSelection; /*!< USART1 clock source + This parameter can be a value of @ref RCCEx_USART1_Clock_Source */ + + uint32_t Usart2ClockSelection; /*!< USART2 clock source + This parameter can be a value of @ref RCC_USART2_Clock_Source */ + + uint32_t Usart3ClockSelection; /*!< USART3 clock source + This parameter can be a value of @ref RCC_USART3_Clock_Source */ + + uint32_t I2c1ClockSelection; /*!< I2C1 clock source + This parameter can be a value of @ref RCC_I2C1_Clock_Source */ + + uint32_t I2c2ClockSelection; /*!< I2C2 clock source + This parameter can be a value of @ref RCCEx_I2C2_Clock_Source */ + + uint32_t Adc1ClockSelection; /*!< ADC1 clock source + This parameter can be a value of @ref RCCEx_ADC1_Clock_Source */ + + uint32_t SdadcClockSelection; /*!< SDADC clock prescaler + This parameter can be a value of @ref RCCEx_SDADC_Clock_Prescaler */ + + uint32_t CecClockSelection; /*!< HDMI CEC clock source + This parameter can be a value of @ref RCCEx_CEC_Clock_Source */ + + uint32_t USBClockSelection; /*!< USB clock source + This parameter can be a value of @ref RCCEx_USB_Clock_Source */ + +}RCC_PeriphCLKInitTypeDef; +#endif /* STM32F373xC */ + +#if defined(STM32F378xx) +typedef struct +{ + uint32_t PeriphClockSelection; /*!< The Extended Clock to be configured. + This parameter can be a value of @ref RCCEx_Periph_Clock_Selection */ + + uint32_t RTCClockSelection; /*!< Specifies RTC Clock Prescalers Selection + This parameter can be a value of @ref RCC_RTC_Clock_Source */ + + uint32_t Usart1ClockSelection; /*!< USART1 clock source + This parameter can be a value of @ref RCCEx_USART1_Clock_Source */ + + uint32_t Usart2ClockSelection; /*!< USART2 clock source + This parameter can be a value of @ref RCC_USART2_Clock_Source */ + + uint32_t Usart3ClockSelection; /*!< USART3 clock source + This parameter can be a value of @ref RCC_USART3_Clock_Source */ + + uint32_t I2c1ClockSelection; /*!< I2C1 clock source + This parameter can be a value of @ref RCC_I2C1_Clock_Source */ + + uint32_t I2c2ClockSelection; /*!< I2C2 clock source + This parameter can be a value of @ref RCCEx_I2C2_Clock_Source */ + + uint32_t Adc1ClockSelection; /*!< ADC1 clock source + This parameter can be a value of @ref RCCEx_ADC1_Clock_Source */ + + uint32_t SdadcClockSelection; /*!< SDADC clock prescaler + This parameter can be a value of @ref RCCEx_SDADC_Clock_Prescaler */ + + uint32_t CecClockSelection; /*!< HDMI CEC clock source + This parameter can be a value of @ref RCCEx_CEC_Clock_Source */ + +}RCC_PeriphCLKInitTypeDef; +#endif /* STM32F378xx */ + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup RCCEx_Exported_Constants RCC Extended Exported Constants + * @{ + */ +/** @defgroup RCCEx_MCO_Clock_Source RCC Extended MCO Clock Source + * @{ + */ +#define RCC_MCO1SOURCE_NOCLOCK RCC_CFGR_MCO_NOCLOCK +#define RCC_MCO1SOURCE_LSI RCC_CFGR_MCO_LSI +#define RCC_MCO1SOURCE_LSE RCC_CFGR_MCO_LSE +#define RCC_MCO1SOURCE_SYSCLK RCC_CFGR_MCO_SYSCLK +#define RCC_MCO1SOURCE_HSI RCC_CFGR_MCO_HSI +#define RCC_MCO1SOURCE_HSE RCC_CFGR_MCO_HSE +#if defined(RCC_CFGR_PLLNODIV) +#define RCC_MCO1SOURCE_PLLCLK (RCC_CFGR_PLLNODIV | RCC_CFGR_MCO_PLL) +#endif /* RCC_CFGR_PLLNODIV */ +#define RCC_MCO1SOURCE_PLLCLK_DIV2 RCC_CFGR_MCO_PLL + +/** + * @} + */ + +/** @defgroup RCCEx_Periph_Clock_Selection RCC Extended Periph Clock Selection + * @{ + */ +#if defined(STM32F301x8) || defined(STM32F318xx) +#define RCC_PERIPHCLK_USART1 (0x00000001U) +#define RCC_PERIPHCLK_I2C1 (0x00000020U) +#define RCC_PERIPHCLK_I2C2 (0x00000040U) +#define RCC_PERIPHCLK_ADC1 (0x00000080U) +#define RCC_PERIPHCLK_I2S (0x00000200U) +#define RCC_PERIPHCLK_TIM1 (0x00001000U) +#define RCC_PERIPHCLK_I2C3 (0x00008000U) +#define RCC_PERIPHCLK_RTC (0x00010000U) +#define RCC_PERIPHCLK_TIM15 (0x00040000U) +#define RCC_PERIPHCLK_TIM16 (0x00080000U) +#define RCC_PERIPHCLK_TIM17 (0x00100000U) + +#endif /* STM32F301x8 || STM32F318xx */ + +#if defined(STM32F302x8) +#define RCC_PERIPHCLK_USART1 (0x00000001U) +#define RCC_PERIPHCLK_I2C1 (0x00000020U) +#define RCC_PERIPHCLK_I2C2 (0x00000040U) +#define RCC_PERIPHCLK_ADC1 (0x00000080U) +#define RCC_PERIPHCLK_I2S (0x00000200U) +#define RCC_PERIPHCLK_TIM1 (0x00001000U) +#define RCC_PERIPHCLK_I2C3 (0x00008000U) +#define RCC_PERIPHCLK_RTC (0x00010000U) +#define RCC_PERIPHCLK_USB (0x00020000U) +#define RCC_PERIPHCLK_TIM15 (0x00040000U) +#define RCC_PERIPHCLK_TIM16 (0x00080000U) +#define RCC_PERIPHCLK_TIM17 (0x00100000U) + + +#endif /* STM32F302x8 */ + +#if defined(STM32F302xC) +#define RCC_PERIPHCLK_USART1 (0x00000001U) +#define RCC_PERIPHCLK_USART2 (0x00000002U) +#define RCC_PERIPHCLK_USART3 (0x00000004U) +#define RCC_PERIPHCLK_UART4 (0x00000008U) +#define RCC_PERIPHCLK_UART5 (0x00000010U) +#define RCC_PERIPHCLK_I2C1 (0x00000020U) +#define RCC_PERIPHCLK_I2C2 (0x00000040U) +#define RCC_PERIPHCLK_ADC12 (0x00000080U) +#define RCC_PERIPHCLK_I2S (0x00000200U) +#define RCC_PERIPHCLK_TIM1 (0x00001000U) +#define RCC_PERIPHCLK_RTC (0x00010000U) +#define RCC_PERIPHCLK_USB (0x00020000U) + +#endif /* STM32F302xC */ + +#if defined(STM32F303xC) +#define RCC_PERIPHCLK_USART1 (0x00000001U) +#define RCC_PERIPHCLK_USART2 (0x00000002U) +#define RCC_PERIPHCLK_USART3 (0x00000004U) +#define RCC_PERIPHCLK_UART4 (0x00000008U) +#define RCC_PERIPHCLK_UART5 (0x00000010U) +#define RCC_PERIPHCLK_I2C1 (0x00000020U) +#define RCC_PERIPHCLK_I2C2 (0x00000040U) +#define RCC_PERIPHCLK_ADC12 (0x00000080U) +#define RCC_PERIPHCLK_ADC34 (0x00000100U) +#define RCC_PERIPHCLK_I2S (0x00000200U) +#define RCC_PERIPHCLK_TIM1 (0x00001000U) +#define RCC_PERIPHCLK_TIM8 (0x00002000U) +#define RCC_PERIPHCLK_RTC (0x00010000U) +#define RCC_PERIPHCLK_USB (0x00020000U) + +#endif /* STM32F303xC */ + +#if defined(STM32F302xE) +#define RCC_PERIPHCLK_USART1 (0x00000001U) +#define RCC_PERIPHCLK_USART2 (0x00000002U) +#define RCC_PERIPHCLK_USART3 (0x00000004U) +#define RCC_PERIPHCLK_UART4 (0x00000008U) +#define RCC_PERIPHCLK_UART5 (0x00000010U) +#define RCC_PERIPHCLK_I2C1 (0x00000020U) +#define RCC_PERIPHCLK_I2C2 (0x00000040U) +#define RCC_PERIPHCLK_ADC12 (0x00000080U) +#define RCC_PERIPHCLK_I2S (0x00000200U) +#define RCC_PERIPHCLK_TIM1 (0x00001000U) +#define RCC_PERIPHCLK_RTC (0x00010000U) +#define RCC_PERIPHCLK_USB (0x00020000U) +#define RCC_PERIPHCLK_I2C3 (0x00040000U) +#define RCC_PERIPHCLK_TIM2 (0x00100000U) +#define RCC_PERIPHCLK_TIM34 (0x00200000U) +#define RCC_PERIPHCLK_TIM15 (0x00400000U) +#define RCC_PERIPHCLK_TIM16 (0x00800000U) +#define RCC_PERIPHCLK_TIM17 (0x01000000U) + +#endif /* STM32F302xE */ + +#if defined(STM32F303xE) +#define RCC_PERIPHCLK_USART1 (0x00000001U) +#define RCC_PERIPHCLK_USART2 (0x00000002U) +#define RCC_PERIPHCLK_USART3 (0x00000004U) +#define RCC_PERIPHCLK_UART4 (0x00000008U) +#define RCC_PERIPHCLK_UART5 (0x00000010U) +#define RCC_PERIPHCLK_I2C1 (0x00000020U) +#define RCC_PERIPHCLK_I2C2 (0x00000040U) +#define RCC_PERIPHCLK_ADC12 (0x00000080U) +#define RCC_PERIPHCLK_ADC34 (0x00000100U) +#define RCC_PERIPHCLK_I2S (0x00000200U) +#define RCC_PERIPHCLK_TIM1 (0x00001000U) +#define RCC_PERIPHCLK_TIM8 (0x00002000U) +#define RCC_PERIPHCLK_RTC (0x00010000U) +#define RCC_PERIPHCLK_USB (0x00020000U) +#define RCC_PERIPHCLK_I2C3 (0x00040000U) +#define RCC_PERIPHCLK_TIM2 (0x00100000U) +#define RCC_PERIPHCLK_TIM34 (0x00200000U) +#define RCC_PERIPHCLK_TIM15 (0x00400000U) +#define RCC_PERIPHCLK_TIM16 (0x00800000U) +#define RCC_PERIPHCLK_TIM17 (0x01000000U) +#define RCC_PERIPHCLK_TIM20 (0x02000000U) + +#endif /* STM32F303xE */ + +#if defined(STM32F398xx) +#define RCC_PERIPHCLK_USART1 (0x00000001U) +#define RCC_PERIPHCLK_USART2 (0x00000002U) +#define RCC_PERIPHCLK_USART3 (0x00000004U) +#define RCC_PERIPHCLK_UART4 (0x00000008U) +#define RCC_PERIPHCLK_UART5 (0x00000010U) +#define RCC_PERIPHCLK_I2C1 (0x00000020U) +#define RCC_PERIPHCLK_I2C2 (0x00000040U) +#define RCC_PERIPHCLK_ADC12 (0x00000080U) +#define RCC_PERIPHCLK_ADC34 (0x00000100U) +#define RCC_PERIPHCLK_I2S (0x00000200U) +#define RCC_PERIPHCLK_TIM1 (0x00001000U) +#define RCC_PERIPHCLK_TIM8 (0x00002000U) +#define RCC_PERIPHCLK_RTC (0x00010000U) +#define RCC_PERIPHCLK_I2C3 (0x00040000U) +#define RCC_PERIPHCLK_TIM2 (0x00100000U) +#define RCC_PERIPHCLK_TIM34 (0x00200000U) +#define RCC_PERIPHCLK_TIM15 (0x00400000U) +#define RCC_PERIPHCLK_TIM16 (0x00800000U) +#define RCC_PERIPHCLK_TIM17 (0x01000000U) +#define RCC_PERIPHCLK_TIM20 (0x02000000U) + + +#endif /* STM32F398xx */ + +#if defined(STM32F358xx) +#define RCC_PERIPHCLK_USART1 (0x00000001U) +#define RCC_PERIPHCLK_USART2 (0x00000002U) +#define RCC_PERIPHCLK_USART3 (0x00000004U) +#define RCC_PERIPHCLK_UART4 (0x00000008U) +#define RCC_PERIPHCLK_UART5 (0x00000010U) +#define RCC_PERIPHCLK_I2C1 (0x00000020U) +#define RCC_PERIPHCLK_I2C2 (0x00000040U) +#define RCC_PERIPHCLK_ADC12 (0x00000080U) +#define RCC_PERIPHCLK_ADC34 (0x00000100U) +#define RCC_PERIPHCLK_I2S (0x00000200U) +#define RCC_PERIPHCLK_TIM1 (0x00001000U) +#define RCC_PERIPHCLK_TIM8 (0x00002000U) +#define RCC_PERIPHCLK_RTC (0x00010000U) + +#endif /* STM32F358xx */ + +#if defined(STM32F303x8) +#define RCC_PERIPHCLK_USART1 (0x00000001U) +#define RCC_PERIPHCLK_I2C1 (0x00000020U) +#define RCC_PERIPHCLK_ADC12 (0x00000080U) +#define RCC_PERIPHCLK_TIM1 (0x00001000U) +#define RCC_PERIPHCLK_RTC (0x00010000U) + +#endif /* STM32F303x8 */ + +#if defined(STM32F334x8) +#define RCC_PERIPHCLK_USART1 (0x00000001U) +#define RCC_PERIPHCLK_I2C1 (0x00000020U) +#define RCC_PERIPHCLK_ADC12 (0x00000080U) +#define RCC_PERIPHCLK_TIM1 (0x00001000U) +#define RCC_PERIPHCLK_HRTIM1 (0x00004000U) +#define RCC_PERIPHCLK_RTC (0x00010000U) + + +#endif /* STM32F334x8 */ + +#if defined(STM32F328xx) +#define RCC_PERIPHCLK_USART1 (0x00000001U) +#define RCC_PERIPHCLK_I2C1 (0x00000020U) +#define RCC_PERIPHCLK_ADC12 (0x00000080U) +#define RCC_PERIPHCLK_TIM1 (0x00001000U) +#define RCC_PERIPHCLK_RTC (0x00010000U) + +#endif /* STM32F328xx */ + +#if defined(STM32F373xC) +#define RCC_PERIPHCLK_USART1 (0x00000001U) +#define RCC_PERIPHCLK_USART2 (0x00000002U) +#define RCC_PERIPHCLK_USART3 (0x00000004U) +#define RCC_PERIPHCLK_I2C1 (0x00000020U) +#define RCC_PERIPHCLK_I2C2 (0x00000040U) +#define RCC_PERIPHCLK_ADC1 (0x00000080U) +#define RCC_PERIPHCLK_CEC (0x00000400U) +#define RCC_PERIPHCLK_SDADC (0x00000800U) +#define RCC_PERIPHCLK_RTC (0x00010000U) +#define RCC_PERIPHCLK_USB (0x00020000U) + +#endif /* STM32F373xC */ + +#if defined(STM32F378xx) +#define RCC_PERIPHCLK_USART1 (0x00000001U) +#define RCC_PERIPHCLK_USART2 (0x00000002U) +#define RCC_PERIPHCLK_USART3 (0x00000004U) +#define RCC_PERIPHCLK_I2C1 (0x00000020U) +#define RCC_PERIPHCLK_I2C2 (0x00000040U) +#define RCC_PERIPHCLK_ADC1 (0x00000080U) +#define RCC_PERIPHCLK_CEC (0x00000400U) +#define RCC_PERIPHCLK_SDADC (0x00000800U) +#define RCC_PERIPHCLK_RTC (0x00010000U) + +#endif /* STM32F378xx */ +/** + * @} + */ + +#if defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx) + +/** @defgroup RCCEx_USART1_Clock_Source RCC Extended USART1 Clock Source + * @{ + */ +#define RCC_USART1CLKSOURCE_PCLK1 RCC_CFGR3_USART1SW_PCLK1 +#define RCC_USART1CLKSOURCE_SYSCLK RCC_CFGR3_USART1SW_SYSCLK +#define RCC_USART1CLKSOURCE_LSE RCC_CFGR3_USART1SW_LSE +#define RCC_USART1CLKSOURCE_HSI RCC_CFGR3_USART1SW_HSI + +/** + * @} + */ + +/** @defgroup RCCEx_I2C2_Clock_Source RCC Extended I2C2 Clock Source + * @{ + */ +#define RCC_I2C2CLKSOURCE_HSI RCC_CFGR3_I2C2SW_HSI +#define RCC_I2C2CLKSOURCE_SYSCLK RCC_CFGR3_I2C2SW_SYSCLK + +/** + * @} + */ + +/** @defgroup RCCEx_I2C3_Clock_Source RCC Extended I2C3 Clock Source + * @{ + */ +#define RCC_I2C3CLKSOURCE_HSI RCC_CFGR3_I2C3SW_HSI +#define RCC_I2C3CLKSOURCE_SYSCLK RCC_CFGR3_I2C3SW_SYSCLK + +/** + * @} + */ + +/** @defgroup RCCEx_ADC1_Clock_Source RCC Extended ADC1 Clock Source + * @{ + */ +#define RCC_ADC1PLLCLK_OFF RCC_CFGR2_ADC1PRES_NO +#define RCC_ADC1PLLCLK_DIV1 RCC_CFGR2_ADC1PRES_DIV1 +#define RCC_ADC1PLLCLK_DIV2 RCC_CFGR2_ADC1PRES_DIV2 +#define RCC_ADC1PLLCLK_DIV4 RCC_CFGR2_ADC1PRES_DIV4 +#define RCC_ADC1PLLCLK_DIV6 RCC_CFGR2_ADC1PRES_DIV6 +#define RCC_ADC1PLLCLK_DIV8 RCC_CFGR2_ADC1PRES_DIV8 +#define RCC_ADC1PLLCLK_DIV10 RCC_CFGR2_ADC1PRES_DIV10 +#define RCC_ADC1PLLCLK_DIV12 RCC_CFGR2_ADC1PRES_DIV12 +#define RCC_ADC1PLLCLK_DIV16 RCC_CFGR2_ADC1PRES_DIV16 +#define RCC_ADC1PLLCLK_DIV32 RCC_CFGR2_ADC1PRES_DIV32 +#define RCC_ADC1PLLCLK_DIV64 RCC_CFGR2_ADC1PRES_DIV64 +#define RCC_ADC1PLLCLK_DIV128 RCC_CFGR2_ADC1PRES_DIV128 +#define RCC_ADC1PLLCLK_DIV256 RCC_CFGR2_ADC1PRES_DIV256 + +/** + * @} + */ + +/** @defgroup RCCEx_I2S_Clock_Source RCC Extended I2S Clock Source + * @{ + */ +#define RCC_I2SCLKSOURCE_SYSCLK RCC_CFGR_I2SSRC_SYSCLK +#define RCC_I2SCLKSOURCE_EXT RCC_CFGR_I2SSRC_EXT + +/** + * @} + */ + +/** @defgroup RCCEx_TIM1_Clock_Source RCC Extended TIM1 Clock Source + * @{ + */ +#define RCC_TIM1CLK_HCLK RCC_CFGR3_TIM1SW_HCLK +#define RCC_TIM1CLK_PLLCLK RCC_CFGR3_TIM1SW_PLL + +/** + * @} + */ + +/** @defgroup RCCEx_TIM15_Clock_Source RCC Extended TIM15 Clock Source + * @{ + */ +#define RCC_TIM15CLK_HCLK RCC_CFGR3_TIM15SW_HCLK +#define RCC_TIM15CLK_PLLCLK RCC_CFGR3_TIM15SW_PLL + +/** + * @} + */ + +/** @defgroup RCCEx_TIM16_Clock_Source RCC Extended TIM16 Clock Source + * @{ + */ +#define RCC_TIM16CLK_HCLK RCC_CFGR3_TIM16SW_HCLK +#define RCC_TIM16CLK_PLLCLK RCC_CFGR3_TIM16SW_PLL + +/** + * @} + */ + +/** @defgroup RCCEx_TIM17_Clock_Source RCC Extended TIM17 Clock Source + * @{ + */ +#define RCC_TIM17CLK_HCLK RCC_CFGR3_TIM17SW_HCLK +#define RCC_TIM17CLK_PLLCLK RCC_CFGR3_TIM17SW_PLL + +/** + * @} + */ + +#endif /* STM32F301x8 || STM32F302x8 || STM32F318xx */ + +#if defined(STM32F302xC) || defined(STM32F303xC) || defined(STM32F358xx) + +/** @defgroup RCCEx_USART1_Clock_Source RCC Extended USART1 Clock Source + * @{ + */ +#define RCC_USART1CLKSOURCE_PCLK2 RCC_CFGR3_USART1SW_PCLK2 +#define RCC_USART1CLKSOURCE_SYSCLK RCC_CFGR3_USART1SW_SYSCLK +#define RCC_USART1CLKSOURCE_LSE RCC_CFGR3_USART1SW_LSE +#define RCC_USART1CLKSOURCE_HSI RCC_CFGR3_USART1SW_HSI + +/** + * @} + */ + +/** @defgroup RCCEx_I2C2_Clock_Source RCC Extended I2C2 Clock Source + * @{ + */ +#define RCC_I2C2CLKSOURCE_HSI RCC_CFGR3_I2C2SW_HSI +#define RCC_I2C2CLKSOURCE_SYSCLK RCC_CFGR3_I2C2SW_SYSCLK + +/** + * @} + */ + +/** @defgroup RCCEx_ADC12_Clock_Source RCC Extended ADC12 Clock Source + * @{ + */ + +/* ADC1 & ADC2 */ +#define RCC_ADC12PLLCLK_OFF RCC_CFGR2_ADCPRE12_NO +#define RCC_ADC12PLLCLK_DIV1 RCC_CFGR2_ADCPRE12_DIV1 +#define RCC_ADC12PLLCLK_DIV2 RCC_CFGR2_ADCPRE12_DIV2 +#define RCC_ADC12PLLCLK_DIV4 RCC_CFGR2_ADCPRE12_DIV4 +#define RCC_ADC12PLLCLK_DIV6 RCC_CFGR2_ADCPRE12_DIV6 +#define RCC_ADC12PLLCLK_DIV8 RCC_CFGR2_ADCPRE12_DIV8 +#define RCC_ADC12PLLCLK_DIV10 RCC_CFGR2_ADCPRE12_DIV10 +#define RCC_ADC12PLLCLK_DIV12 RCC_CFGR2_ADCPRE12_DIV12 +#define RCC_ADC12PLLCLK_DIV16 RCC_CFGR2_ADCPRE12_DIV16 +#define RCC_ADC12PLLCLK_DIV32 RCC_CFGR2_ADCPRE12_DIV32 +#define RCC_ADC12PLLCLK_DIV64 RCC_CFGR2_ADCPRE12_DIV64 +#define RCC_ADC12PLLCLK_DIV128 RCC_CFGR2_ADCPRE12_DIV128 +#define RCC_ADC12PLLCLK_DIV256 RCC_CFGR2_ADCPRE12_DIV256 + +/** + * @} + */ + +/** @defgroup RCCEx_I2S_Clock_Source RCC Extended I2S Clock Source + * @{ + */ +#define RCC_I2SCLKSOURCE_SYSCLK RCC_CFGR_I2SSRC_SYSCLK +#define RCC_I2SCLKSOURCE_EXT RCC_CFGR_I2SSRC_EXT + +/** + * @} + */ +/** @defgroup RCCEx_TIM1_Clock_Source RCC Extended TIM1 Clock Source + * @{ + */ +#define RCC_TIM1CLK_HCLK RCC_CFGR3_TIM1SW_HCLK +#define RCC_TIM1CLK_PLLCLK RCC_CFGR3_TIM1SW_PLL + +/** + * @} + */ + +/** @defgroup RCCEx_UART4_Clock_Source RCC Extended UART4 Clock Source + * @{ + */ +#define RCC_UART4CLKSOURCE_PCLK1 RCC_CFGR3_UART4SW_PCLK +#define RCC_UART4CLKSOURCE_SYSCLK RCC_CFGR3_UART4SW_SYSCLK +#define RCC_UART4CLKSOURCE_LSE RCC_CFGR3_UART4SW_LSE +#define RCC_UART4CLKSOURCE_HSI RCC_CFGR3_UART4SW_HSI + +/** + * @} + */ + +/** @defgroup RCCEx_UART5_Clock_Source RCC Extended UART5 Clock Source + * @{ + */ +#define RCC_UART5CLKSOURCE_PCLK1 RCC_CFGR3_UART5SW_PCLK +#define RCC_UART5CLKSOURCE_SYSCLK RCC_CFGR3_UART5SW_SYSCLK +#define RCC_UART5CLKSOURCE_LSE RCC_CFGR3_UART5SW_LSE +#define RCC_UART5CLKSOURCE_HSI RCC_CFGR3_UART5SW_HSI + +/** + * @} + */ + +#endif /* STM32F302xC || STM32F303xC || STM32F358xx */ + +#if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx) + +/** @defgroup RCCEx_USART1_Clock_Source RCC Extended USART1 Clock Source + * @{ + */ +#define RCC_USART1CLKSOURCE_PCLK2 RCC_CFGR3_USART1SW_PCLK2 +#define RCC_USART1CLKSOURCE_SYSCLK RCC_CFGR3_USART1SW_SYSCLK +#define RCC_USART1CLKSOURCE_LSE RCC_CFGR3_USART1SW_LSE +#define RCC_USART1CLKSOURCE_HSI RCC_CFGR3_USART1SW_HSI + +/** + * @} + */ + +/** @defgroup RCCEx_I2C2_Clock_Source RCC Extended I2C2 Clock Source + * @{ + */ +#define RCC_I2C2CLKSOURCE_HSI RCC_CFGR3_I2C2SW_HSI +#define RCC_I2C2CLKSOURCE_SYSCLK RCC_CFGR3_I2C2SW_SYSCLK + +/** + * @} + */ + +/** @defgroup RCCEx_I2C3_Clock_Source RCC Extended I2C3 Clock Source + * @{ + */ +#define RCC_I2C3CLKSOURCE_HSI RCC_CFGR3_I2C3SW_HSI +#define RCC_I2C3CLKSOURCE_SYSCLK RCC_CFGR3_I2C3SW_SYSCLK + +/** + * @} + */ + +/** @defgroup RCCEx_ADC12_Clock_Source RCC Extended ADC12 Clock Source + * @{ + */ + +/* ADC1 & ADC2 */ +#define RCC_ADC12PLLCLK_OFF RCC_CFGR2_ADCPRE12_NO +#define RCC_ADC12PLLCLK_DIV1 RCC_CFGR2_ADCPRE12_DIV1 +#define RCC_ADC12PLLCLK_DIV2 RCC_CFGR2_ADCPRE12_DIV2 +#define RCC_ADC12PLLCLK_DIV4 RCC_CFGR2_ADCPRE12_DIV4 +#define RCC_ADC12PLLCLK_DIV6 RCC_CFGR2_ADCPRE12_DIV6 +#define RCC_ADC12PLLCLK_DIV8 RCC_CFGR2_ADCPRE12_DIV8 +#define RCC_ADC12PLLCLK_DIV10 RCC_CFGR2_ADCPRE12_DIV10 +#define RCC_ADC12PLLCLK_DIV12 RCC_CFGR2_ADCPRE12_DIV12 +#define RCC_ADC12PLLCLK_DIV16 RCC_CFGR2_ADCPRE12_DIV16 +#define RCC_ADC12PLLCLK_DIV32 RCC_CFGR2_ADCPRE12_DIV32 +#define RCC_ADC12PLLCLK_DIV64 RCC_CFGR2_ADCPRE12_DIV64 +#define RCC_ADC12PLLCLK_DIV128 RCC_CFGR2_ADCPRE12_DIV128 +#define RCC_ADC12PLLCLK_DIV256 RCC_CFGR2_ADCPRE12_DIV256 + +/** + * @} + */ + +/** @defgroup RCCEx_I2S_Clock_Source RCC Extended I2S Clock Source + * @{ + */ +#define RCC_I2SCLKSOURCE_SYSCLK RCC_CFGR_I2SSRC_SYSCLK +#define RCC_I2SCLKSOURCE_EXT RCC_CFGR_I2SSRC_EXT + +/** + * @} + */ + +/** @defgroup RCCEx_TIM1_Clock_Source RCC Extended TIM1 Clock Source + * @{ + */ +#define RCC_TIM1CLK_HCLK RCC_CFGR3_TIM1SW_HCLK +#define RCC_TIM1CLK_PLLCLK RCC_CFGR3_TIM1SW_PLL + +/** + * @} + */ + +/** @defgroup RCCEx_TIM2_Clock_Source RCC Extended TIM2 Clock Source + * @{ + */ +#define RCC_TIM2CLK_HCLK RCC_CFGR3_TIM2SW_HCLK +#define RCC_TIM2CLK_PLLCLK RCC_CFGR3_TIM2SW_PLL + +/** + * @} + */ + +/** @defgroup RCCEx_TIM34_Clock_Source RCC Extended TIM3 & TIM4 Clock Source + * @{ + */ +#define RCC_TIM34CLK_HCLK RCC_CFGR3_TIM34SW_HCLK +#define RCC_TIM34CLK_PLLCLK RCC_CFGR3_TIM34SW_PLL + +/** + * @} + */ + +/** @defgroup RCCEx_TIM15_Clock_Source RCC Extended TIM15 Clock Source + * @{ + */ +#define RCC_TIM15CLK_HCLK RCC_CFGR3_TIM15SW_HCLK +#define RCC_TIM15CLK_PLLCLK RCC_CFGR3_TIM15SW_PLL + +/** + * @} + */ + +/** @defgroup RCCEx_TIM16_Clock_Source RCC Extended TIM16 Clock Source + * @{ + */ +#define RCC_TIM16CLK_HCLK RCC_CFGR3_TIM16SW_HCLK +#define RCC_TIM16CLK_PLLCLK RCC_CFGR3_TIM16SW_PLL + +/** + * @} + */ + +/** @defgroup RCCEx_TIM17_Clock_Source RCC Extended TIM17 Clock Source + * @{ + */ +#define RCC_TIM17CLK_HCLK RCC_CFGR3_TIM17SW_HCLK +#define RCC_TIM17CLK_PLLCLK RCC_CFGR3_TIM17SW_PLL + +/** + * @} + */ + +/** @defgroup RCCEx_UART4_Clock_Source RCC Extended UART4 Clock Source + * @{ + */ +#define RCC_UART4CLKSOURCE_PCLK1 RCC_CFGR3_UART4SW_PCLK +#define RCC_UART4CLKSOURCE_SYSCLK RCC_CFGR3_UART4SW_SYSCLK +#define RCC_UART4CLKSOURCE_LSE RCC_CFGR3_UART4SW_LSE +#define RCC_UART4CLKSOURCE_HSI RCC_CFGR3_UART4SW_HSI + +/** + * @} + */ + +/** @defgroup RCCEx_UART5_Clock_Source RCC Extended UART5 Clock Source + * @{ + */ +#define RCC_UART5CLKSOURCE_PCLK1 RCC_CFGR3_UART5SW_PCLK +#define RCC_UART5CLKSOURCE_SYSCLK RCC_CFGR3_UART5SW_SYSCLK +#define RCC_UART5CLKSOURCE_LSE RCC_CFGR3_UART5SW_LSE +#define RCC_UART5CLKSOURCE_HSI RCC_CFGR3_UART5SW_HSI + +/** + * @} + */ + +#endif /* STM32F302xE || STM32F303xE || STM32F398xx */ + +#if defined(STM32F303xE) || defined(STM32F398xx) +/** @defgroup RCCEx_TIM20_Clock_Source RCC Extended TIM20 Clock Source + * @{ + */ +#define RCC_TIM20CLK_HCLK RCC_CFGR3_TIM20SW_HCLK +#define RCC_TIM20CLK_PLLCLK RCC_CFGR3_TIM20SW_PLL + +/** + * @} + */ +#endif /* STM32F303xE || STM32F398xx */ + +#if defined(STM32F303xE) || defined(STM32F398xx)\ + || defined(STM32F303xC) || defined(STM32F358xx) + +/** @defgroup RCCEx_ADC34_Clock_Source RCC Extended ADC34 Clock Source + * @{ + */ + +/* ADC3 & ADC4 */ +#define RCC_ADC34PLLCLK_OFF RCC_CFGR2_ADCPRE34_NO +#define RCC_ADC34PLLCLK_DIV1 RCC_CFGR2_ADCPRE34_DIV1 +#define RCC_ADC34PLLCLK_DIV2 RCC_CFGR2_ADCPRE34_DIV2 +#define RCC_ADC34PLLCLK_DIV4 RCC_CFGR2_ADCPRE34_DIV4 +#define RCC_ADC34PLLCLK_DIV6 RCC_CFGR2_ADCPRE34_DIV6 +#define RCC_ADC34PLLCLK_DIV8 RCC_CFGR2_ADCPRE34_DIV8 +#define RCC_ADC34PLLCLK_DIV10 RCC_CFGR2_ADCPRE34_DIV10 +#define RCC_ADC34PLLCLK_DIV12 RCC_CFGR2_ADCPRE34_DIV12 +#define RCC_ADC34PLLCLK_DIV16 RCC_CFGR2_ADCPRE34_DIV16 +#define RCC_ADC34PLLCLK_DIV32 RCC_CFGR2_ADCPRE34_DIV32 +#define RCC_ADC34PLLCLK_DIV64 RCC_CFGR2_ADCPRE34_DIV64 +#define RCC_ADC34PLLCLK_DIV128 RCC_CFGR2_ADCPRE34_DIV128 +#define RCC_ADC34PLLCLK_DIV256 RCC_CFGR2_ADCPRE34_DIV256 + +/** + * @} + */ + +/** @defgroup RCCEx_TIM8_Clock_Source RCC Extended TIM8 Clock Source + * @{ + */ +#define RCC_TIM8CLK_HCLK RCC_CFGR3_TIM8SW_HCLK +#define RCC_TIM8CLK_PLLCLK RCC_CFGR3_TIM8SW_PLL + +/** + * @} + */ + +#endif /* STM32F303xC || STM32F303xE || STM32F398xx || STM32F358xx */ + +#if defined(STM32F303x8) || defined(STM32F334x8) || defined(STM32F328xx) + +/** @defgroup RCCEx_USART1_Clock_Source RCC Extended USART1 Clock Source + * @{ + */ +#define RCC_USART1CLKSOURCE_PCLK1 RCC_CFGR3_USART1SW_PCLK1 +#define RCC_USART1CLKSOURCE_SYSCLK RCC_CFGR3_USART1SW_SYSCLK +#define RCC_USART1CLKSOURCE_LSE RCC_CFGR3_USART1SW_LSE +#define RCC_USART1CLKSOURCE_HSI RCC_CFGR3_USART1SW_HSI + +/** + * @} + */ + +/** @defgroup RCCEx_ADC12_Clock_Source RCC Extended ADC12 Clock Source + * @{ + */ +/* ADC1 & ADC2 */ +#define RCC_ADC12PLLCLK_OFF RCC_CFGR2_ADCPRE12_NO +#define RCC_ADC12PLLCLK_DIV1 RCC_CFGR2_ADCPRE12_DIV1 +#define RCC_ADC12PLLCLK_DIV2 RCC_CFGR2_ADCPRE12_DIV2 +#define RCC_ADC12PLLCLK_DIV4 RCC_CFGR2_ADCPRE12_DIV4 +#define RCC_ADC12PLLCLK_DIV6 RCC_CFGR2_ADCPRE12_DIV6 +#define RCC_ADC12PLLCLK_DIV8 RCC_CFGR2_ADCPRE12_DIV8 +#define RCC_ADC12PLLCLK_DIV10 RCC_CFGR2_ADCPRE12_DIV10 +#define RCC_ADC12PLLCLK_DIV12 RCC_CFGR2_ADCPRE12_DIV12 +#define RCC_ADC12PLLCLK_DIV16 RCC_CFGR2_ADCPRE12_DIV16 +#define RCC_ADC12PLLCLK_DIV32 RCC_CFGR2_ADCPRE12_DIV32 +#define RCC_ADC12PLLCLK_DIV64 RCC_CFGR2_ADCPRE12_DIV64 +#define RCC_ADC12PLLCLK_DIV128 RCC_CFGR2_ADCPRE12_DIV128 +#define RCC_ADC12PLLCLK_DIV256 RCC_CFGR2_ADCPRE12_DIV256 + +/** + * @} + */ + +/** @defgroup RCCEx_TIM1_Clock_Source RCC Extended TIM1 Clock Source + * @{ + */ +#define RCC_TIM1CLK_HCLK RCC_CFGR3_TIM1SW_HCLK +#define RCC_TIM1CLK_PLLCLK RCC_CFGR3_TIM1SW_PLL + +/** + * @} + */ + +#endif /* STM32F303x8 || STM32F334x8 || STM32F328xx */ + +#if defined(STM32F334x8) + +/** @defgroup RCCEx_HRTIM1_Clock_Source RCC Extended HRTIM1 Clock Source + * @{ + */ +#define RCC_HRTIM1CLK_HCLK RCC_CFGR3_HRTIM1SW_HCLK +#define RCC_HRTIM1CLK_PLLCLK RCC_CFGR3_HRTIM1SW_PLL + +/** + * @} + */ + +#endif /* STM32F334x8 */ + +#if defined(STM32F373xC) || defined(STM32F378xx) + +/** @defgroup RCCEx_USART1_Clock_Source RCC Extended USART1 Clock Source + * @{ + */ +#define RCC_USART1CLKSOURCE_PCLK2 RCC_CFGR3_USART1SW_PCLK2 +#define RCC_USART1CLKSOURCE_SYSCLK RCC_CFGR3_USART1SW_SYSCLK +#define RCC_USART1CLKSOURCE_LSE RCC_CFGR3_USART1SW_LSE +#define RCC_USART1CLKSOURCE_HSI RCC_CFGR3_USART1SW_HSI + +/** + * @} + */ + +/** @defgroup RCCEx_I2C2_Clock_Source RCC Extended I2C2 Clock Source + * @{ + */ +#define RCC_I2C2CLKSOURCE_HSI RCC_CFGR3_I2C2SW_HSI +#define RCC_I2C2CLKSOURCE_SYSCLK RCC_CFGR3_I2C2SW_SYSCLK + +/** + * @} + */ + +/** @defgroup RCCEx_ADC1_Clock_Source RCC Extended ADC1 Clock Source + * @{ + */ + +/* ADC1 */ +#define RCC_ADC1PCLK2_DIV2 RCC_CFGR_ADCPRE_DIV2 +#define RCC_ADC1PCLK2_DIV4 RCC_CFGR_ADCPRE_DIV4 +#define RCC_ADC1PCLK2_DIV6 RCC_CFGR_ADCPRE_DIV6 +#define RCC_ADC1PCLK2_DIV8 RCC_CFGR_ADCPRE_DIV8 + +/** + * @} + */ + +/** @defgroup RCCEx_CEC_Clock_Source RCC Extended CEC Clock Source + * @{ + */ +#define RCC_CECCLKSOURCE_HSI RCC_CFGR3_CECSW_HSI_DIV244 +#define RCC_CECCLKSOURCE_LSE RCC_CFGR3_CECSW_LSE + +/** + * @} + */ + +/** @defgroup RCCEx_SDADC_Clock_Prescaler RCC Extended SDADC Clock Prescaler + * @{ + */ +#define RCC_SDADCSYSCLK_DIV1 RCC_CFGR_SDPRE_DIV1 +#define RCC_SDADCSYSCLK_DIV2 RCC_CFGR_SDPRE_DIV2 +#define RCC_SDADCSYSCLK_DIV4 RCC_CFGR_SDPRE_DIV4 +#define RCC_SDADCSYSCLK_DIV6 RCC_CFGR_SDPRE_DIV6 +#define RCC_SDADCSYSCLK_DIV8 RCC_CFGR_SDPRE_DIV8 +#define RCC_SDADCSYSCLK_DIV10 RCC_CFGR_SDPRE_DIV10 +#define RCC_SDADCSYSCLK_DIV12 RCC_CFGR_SDPRE_DIV12 +#define RCC_SDADCSYSCLK_DIV14 RCC_CFGR_SDPRE_DIV14 +#define RCC_SDADCSYSCLK_DIV16 RCC_CFGR_SDPRE_DIV16 +#define RCC_SDADCSYSCLK_DIV20 RCC_CFGR_SDPRE_DIV20 +#define RCC_SDADCSYSCLK_DIV24 RCC_CFGR_SDPRE_DIV24 +#define RCC_SDADCSYSCLK_DIV28 RCC_CFGR_SDPRE_DIV28 +#define RCC_SDADCSYSCLK_DIV32 RCC_CFGR_SDPRE_DIV32 +#define RCC_SDADCSYSCLK_DIV36 RCC_CFGR_SDPRE_DIV36 +#define RCC_SDADCSYSCLK_DIV40 RCC_CFGR_SDPRE_DIV40 +#define RCC_SDADCSYSCLK_DIV44 RCC_CFGR_SDPRE_DIV44 +#define RCC_SDADCSYSCLK_DIV48 RCC_CFGR_SDPRE_DIV48 + +/** + * @} + */ + +#endif /* STM32F373xC || STM32F378xx */ + +#if defined(STM32F302xE) || defined(STM32F303xE)\ + || defined(STM32F302xC) || defined(STM32F303xC)\ + || defined(STM32F302x8) \ + || defined(STM32F373xC) +/** @defgroup RCCEx_USB_Clock_Source RCC Extended USB Clock Source + * @{ + */ + +#define RCC_USBCLKSOURCE_PLL RCC_CFGR_USBPRE_DIV1 +#define RCC_USBCLKSOURCE_PLL_DIV1_5 RCC_CFGR_USBPRE_DIV1_5 + +/** + * @} + */ + +#endif /* STM32F302xE || STM32F303xE || */ + /* STM32F302xC || STM32F303xC || */ + /* STM32F302x8 || */ + /* STM32F373xC */ + + +/** @defgroup RCCEx_MCOx_Clock_Prescaler RCC Extended MCOx Clock Prescaler + * @{ + */ +#if defined(RCC_CFGR_MCOPRE) + +#define RCC_MCODIV_1 (0x00000000U) +#define RCC_MCODIV_2 (0x10000000U) +#define RCC_MCODIV_4 (0x20000000U) +#define RCC_MCODIV_8 (0x30000000U) +#define RCC_MCODIV_16 (0x40000000U) +#define RCC_MCODIV_32 (0x50000000U) +#define RCC_MCODIV_64 (0x60000000U) +#define RCC_MCODIV_128 (0x70000000U) + +#else + +#define RCC_MCODIV_1 (0x00000000U) + +#endif /* RCC_CFGR_MCOPRE */ + +/** + * @} + */ + +/** @defgroup RCCEx_LSEDrive_Configuration RCC LSE Drive Configuration + * @{ + */ + +#define RCC_LSEDRIVE_LOW (0x00000000U) /*!< Xtal mode lower driving capability */ +#define RCC_LSEDRIVE_MEDIUMLOW RCC_BDCR_LSEDRV_1 /*!< Xtal mode medium low driving capability */ +#define RCC_LSEDRIVE_MEDIUMHIGH RCC_BDCR_LSEDRV_0 /*!< Xtal mode medium high driving capability */ +#define RCC_LSEDRIVE_HIGH RCC_BDCR_LSEDRV /*!< Xtal mode higher driving capability */ + +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup RCCEx_Exported_Macros RCC Extended Exported Macros + * @{ + */ + +/** @defgroup RCCEx_PLL_Configuration RCC Extended PLL Configuration + * @{ + */ +#if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx) +/** @brief Macro to configure the PLL clock source, multiplication and division factors. + * @note This macro must be used only when the PLL is disabled. + * + * @param __RCC_PLLSource__ specifies the PLL entry clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_PLLSOURCE_HSI HSI oscillator clock selected as PLL clock entry + * @arg @ref RCC_PLLSOURCE_HSE HSE oscillator clock selected as PLL clock entry + * @param __PREDIV__ specifies the predivider factor for PLL VCO input clock + * This parameter must be a number between RCC_PREDIV_DIV1 and RCC_PREDIV_DIV16. + * @param __PLLMUL__ specifies the multiplication factor for PLL VCO input clock + * This parameter must be a number between RCC_PLL_MUL2 and RCC_PLL_MUL16. + * + */ +#define __HAL_RCC_PLL_CONFIG(__RCC_PLLSource__ , __PREDIV__, __PLLMUL__) \ + do { \ + MODIFY_REG(RCC->CFGR2, RCC_CFGR2_PREDIV, (__PREDIV__)); \ + MODIFY_REG(RCC->CFGR, RCC_CFGR_PLLMUL | RCC_CFGR_PLLSRC, (uint32_t)((__PLLMUL__)|(__RCC_PLLSource__))); \ + } while(0U) +#endif /* STM32F302xE || STM32F303xE || STM32F398xx */ + +#if defined(STM32F302xC) || defined(STM32F303xC) || defined(STM32F358xx)\ + || defined(STM32F303x8) || defined(STM32F334x8) || defined(STM32F328xx)\ + || defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx)\ + || defined(STM32F373xC) || defined(STM32F378xx) +/** @brief Macro to configure the PLL clock source and multiplication factor. + * @note This macro must be used only when the PLL is disabled. + * + * @param __RCC_PLLSource__ specifies the PLL entry clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_PLLSOURCE_HSI HSI oscillator clock selected as PLL clock entry + * @arg @ref RCC_PLLSOURCE_HSE HSE oscillator clock selected as PLL clock entry + * @param __PLLMUL__ specifies the multiplication factor for PLL VCO input clock + * This parameter must be a number between RCC_PLL_MUL2 and RCC_PLL_MUL16. + * + */ +#define __HAL_RCC_PLL_CONFIG(__RCC_PLLSource__ , __PLLMUL__) \ + MODIFY_REG(RCC->CFGR, RCC_CFGR_PLLMUL | RCC_CFGR_PLLSRC, (uint32_t)((__PLLMUL__)|(__RCC_PLLSource__))) +#endif /* STM32F302xC || STM32F303xC || STM32F358xx || */ + /* STM32F303x8 || STM32F334x8 || STM32F328xx || */ + /* STM32F301x8 || STM32F302x8 || STM32F318xx */ + /* STM32F373xC || STM32F378xx */ +/** + * @} + */ + +#if defined(STM32F302xC) || defined(STM32F303xC) || defined(STM32F358xx)\ + || defined(STM32F303x8) || defined(STM32F334x8) || defined(STM32F328xx)\ + || defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx)\ + || defined(STM32F373xC) || defined(STM32F378xx) +/** @defgroup RCCEx_HSE_Configuration RCC Extended HSE Configuration + * @{ + */ + +/** + * @brief Macro to configure the External High Speed oscillator (HSE) Predivision factor for PLL. + * @note Predivision factor can not be changed if PLL is used as system clock + * In this case, you have to select another source of the system clock, disable the PLL and + * then change the HSE predivision factor. + * @param __HSE_PREDIV_VALUE__ specifies the division value applied to HSE. + * This parameter must be a number between RCC_HSE_PREDIV_DIV1 and RCC_HSE_PREDIV_DIV16. + */ +#define __HAL_RCC_HSE_PREDIV_CONFIG(__HSE_PREDIV_VALUE__) \ + MODIFY_REG(RCC->CFGR2, RCC_CFGR2_PREDIV, (uint32_t)(__HSE_PREDIV_VALUE__)) + +/** + * @brief Macro to get prediv1 factor for PLL. + */ +#define __HAL_RCC_HSE_GET_PREDIV() READ_BIT(RCC->CFGR2, RCC_CFGR2_PREDIV) + +/** + * @} + */ +#endif /* STM32F302xC || STM32F303xC || STM32F358xx || */ + /* STM32F303x8 || STM32F334x8 || STM32F328xx || */ + /* STM32F301x8 || STM32F302x8 || STM32F318xx */ + /* STM32F373xC || STM32F378xx */ + +/** @defgroup RCCEx_AHB_Clock_Enable_Disable RCC Extended AHB Clock Enable Disable + * @brief Enable or disable the AHB peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#if defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx) +#define __HAL_RCC_ADC1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->AHBENR, RCC_AHBENR_ADC1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHBENR, RCC_AHBENR_ADC1EN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_ADC1_CLK_DISABLE() (RCC->AHBENR &= ~(RCC_AHBENR_ADC1EN)) +#endif /* STM32F301x8 || STM32F302x8 || STM32F318xx */ + +#if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx)\ + || defined(STM32F302xC) || defined(STM32F303xC) || defined(STM32F358xx) +#define __HAL_RCC_DMA2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->AHBENR, RCC_AHBENR_DMA2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHBENR, RCC_AHBENR_DMA2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->AHBENR, RCC_AHBENR_GPIOEEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHBENR, RCC_AHBENR_GPIOEEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ADC12_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->AHBENR, RCC_AHBENR_ADC12EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHBENR, RCC_AHBENR_ADC12EN);\ + UNUSED(tmpreg); \ + } while(0U) +/* Aliases for STM32 F3 compatibility */ +#define __HAL_RCC_ADC1_CLK_ENABLE() __HAL_RCC_ADC12_CLK_ENABLE() +#define __HAL_RCC_ADC2_CLK_ENABLE() __HAL_RCC_ADC12_CLK_ENABLE() + +#define __HAL_RCC_DMA2_CLK_DISABLE() (RCC->AHBENR &= ~(RCC_AHBENR_DMA2EN)) +#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHBENR &= ~(RCC_AHBENR_GPIOEEN)) +#define __HAL_RCC_ADC12_CLK_DISABLE() (RCC->AHBENR &= ~(RCC_AHBENR_ADC12EN)) +/* Aliases for STM32 F3 compatibility */ +#define __HAL_RCC_ADC1_CLK_DISABLE() __HAL_RCC_ADC12_CLK_DISABLE() +#define __HAL_RCC_ADC2_CLK_DISABLE() __HAL_RCC_ADC12_CLK_DISABLE() +#endif /* STM32F302xE || STM32F303xE || STM32F398xx || */ + /* STM32F302xC || STM32F303xC || STM32F358xx */ + +#if defined(STM32F303xE) || defined(STM32F398xx)\ + || defined(STM32F303xC) || defined(STM32F358xx) +#define __HAL_RCC_ADC34_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->AHBENR, RCC_AHBENR_ADC34EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHBENR, RCC_AHBENR_ADC34EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_ADC34_CLK_DISABLE() (RCC->AHBENR &= ~(RCC_AHBENR_ADC34EN)) +#endif /* STM32F303xE || STM32F398xx || */ + /* STM32F303xC || STM32F358xx */ + +#if defined(STM32F303x8) || defined(STM32F334x8) || defined(STM32F328xx) +#define __HAL_RCC_ADC12_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->AHBENR, RCC_AHBENR_ADC12EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHBENR, RCC_AHBENR_ADC12EN);\ + UNUSED(tmpreg); \ + } while(0U) +/* Aliases for STM32 F3 compatibility */ +#define __HAL_RCC_ADC1_CLK_ENABLE() __HAL_RCC_ADC12_CLK_ENABLE() +#define __HAL_RCC_ADC2_CLK_ENABLE() __HAL_RCC_ADC12_CLK_ENABLE() + +#define __HAL_RCC_ADC12_CLK_DISABLE() (RCC->AHBENR &= ~(RCC_AHBENR_ADC12EN)) +/* Aliases for STM32 F3 compatibility */ +#define __HAL_RCC_ADC1_CLK_DISABLE() __HAL_RCC_ADC12_CLK_DISABLE() +#define __HAL_RCC_ADC2_CLK_DISABLE() __HAL_RCC_ADC12_CLK_DISABLE() +#endif /* STM32F303x8 || STM32F334x8 || STM32F328xx */ + +#if defined(STM32F373xC) || defined(STM32F378xx) +#define __HAL_RCC_DMA2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->AHBENR, RCC_AHBENR_DMA2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHBENR, RCC_AHBENR_DMA2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOE_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->AHBENR, RCC_AHBENR_GPIOEEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHBENR, RCC_AHBENR_GPIOEEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_DMA2_CLK_DISABLE() (RCC->AHBENR &= ~(RCC_AHBENR_DMA2EN)) +#define __HAL_RCC_GPIOE_CLK_DISABLE() (RCC->AHBENR &= ~(RCC_AHBENR_GPIOEEN)) +#endif /* STM32F373xC || STM32F378xx */ + +#if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx) +#define __HAL_RCC_FMC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->AHBENR, RCC_AHBENR_FMCEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHBENR, RCC_AHBENR_FMCEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOG_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->AHBENR, RCC_AHBENR_GPIOGEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHBENR, RCC_AHBENR_GPIOGEN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_GPIOH_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->AHBENR, RCC_AHBENR_GPIOHEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->AHBENR, RCC_AHBENR_GPIOHEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_FMC_CLK_DISABLE() (RCC->AHBENR &= ~(RCC_AHBENR_FMCEN)) +#define __HAL_RCC_GPIOG_CLK_DISABLE() (RCC->AHBENR &= ~(RCC_AHBENR_GPIOGEN)) +#define __HAL_RCC_GPIOH_CLK_DISABLE() (RCC->AHBENR &= ~(RCC_AHBENR_GPIOHEN)) +#endif /* STM32F302xE || STM32F303xE || STM32F398xx */ +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Clock_Enable_Disable RCC Extended APB1 Clock Enable Disable + * @brief Enable or disable the Low Speed APB (APB1) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#if defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx) +#define __HAL_RCC_SPI2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_I2C2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + 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_SPI2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI2EN)) +#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) +#define __HAL_RCC_I2C2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C2EN)) +#define __HAL_RCC_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) +#endif /* STM32F301x8 || STM32F302x8 || STM32F318xx */ + +#if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx)\ + || defined(STM32F302xC) || defined(STM32F303xC) || defined(STM32F358xx) +#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_UART4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_UART5_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_UART5EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_I2C2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C2EN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) +#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) +#define __HAL_RCC_SPI2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI2EN)) +#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) +#define __HAL_RCC_UART4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART4EN)) +#define __HAL_RCC_UART5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_UART5EN)) +#define __HAL_RCC_I2C2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C2EN)) +#endif /* STM32F302xE || STM32F303xE || STM32F398xx || */ + /* STM32F302xC || STM32F303xC || STM32F358xx */ + +#if defined(STM32F303x8) || defined(STM32F334x8) || defined(STM32F328xx) +#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_DAC2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DAC2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DAC2EN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) +#define __HAL_RCC_DAC2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DAC2EN)) +#endif /* STM32F303x8 || STM32F334x8 || STM32F328xx */ + +#if defined(STM32F373xC) || defined(STM32F378xx) +#define __HAL_RCC_TIM3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM4EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM5_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM5EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM5EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM12_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM12EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM13_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM13EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM14_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM14EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM18_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM18EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM18EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_SPI3EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_I2C2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_DAC2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_DAC2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_DAC2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_CEC_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CECEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CECEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_TIM3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM3EN)) +#define __HAL_RCC_TIM4_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM4EN)) +#define __HAL_RCC_TIM5_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM5EN)) +#define __HAL_RCC_TIM12_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM12EN)) +#define __HAL_RCC_TIM13_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM13EN)) +#define __HAL_RCC_TIM14_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM14EN)) +#define __HAL_RCC_TIM18_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM18EN)) +#define __HAL_RCC_SPI2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI2EN)) +#define __HAL_RCC_SPI3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_SPI3EN)) +#define __HAL_RCC_I2C2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C2EN)) +#define __HAL_RCC_DAC2_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_DAC2EN)) +#define __HAL_RCC_CEC_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CECEN)) +#endif /* STM32F373xC || STM32F378xx */ + +#if defined(STM32F303xE) || defined(STM32F398xx) \ + || defined(STM32F303xC) || defined(STM32F358xx) \ + || defined(STM32F303x8) || defined(STM32F334x8) || defined(STM32F328xx)\ + || defined(STM32F373xC) || defined(STM32F378xx) +#define __HAL_RCC_TIM7_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_TIM7EN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_TIM7_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_TIM7EN)) +#endif /* STM32F303xE || STM32F398xx || */ + /* STM32F303xC || STM32F358xx || */ + /* STM32F303x8 || STM32F334x8 || STM32F328xx || */ + /* STM32F373xC || STM32F378xx */ + +#if defined(STM32F302xE) || defined(STM32F303xE)\ + || defined(STM32F302xC) || defined(STM32F303xC)\ + || defined(STM32F302x8) \ + || defined(STM32F373xC) +#define __HAL_RCC_USB_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_USBEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_USBEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_USB_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_USBEN)) +#endif /* STM32F302xE || STM32F303xE || */ + /* STM32F302xC || STM32F303xC || */ + /* STM32F302x8 || */ + /* STM32F373xC */ + +#if !defined(STM32F301x8) +#define __HAL_RCC_CAN1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB1ENR, RCC_APB1ENR_CANEN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB1ENR, RCC_APB1ENR_CANEN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_CAN1_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_CANEN)) +#endif /* STM32F301x8*/ + +#if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx) +#define __HAL_RCC_I2C3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + 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_I2C3_CLK_DISABLE() (RCC->APB1ENR &= ~(RCC_APB1ENR_I2C3EN)) +#endif /* STM32F302xE || STM32F303xE || STM32F398xx */ +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Clock_Enable_Disable RCC Extended APB2 Clock Enable Disable + * @brief Enable or disable the High Speed APB (APB2) peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx)\ + || defined(STM32F302xC) || defined(STM32F303xC) || defined(STM32F358xx) +#define __HAL_RCC_SPI1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI1EN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_SPI1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI1EN)) +#endif /* STM32F302xE || STM32F303xE || STM32F398xx || */ + /* STM32F302xC || STM32F303xC || STM32F358xx */ + +#if defined(STM32F303xE) || defined(STM32F398xx)\ + || defined(STM32F303xC) || defined(STM32F358xx) +#define __HAL_RCC_TIM8_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM8EN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_TIM8_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM8EN)) +#endif /* STM32F303xE || STM32F398xx || */ + /* STM32F303xC || STM32F358xx */ + +#if defined(STM32F303x8) || defined(STM32F334x8) || defined(STM32F328xx) +#define __HAL_RCC_SPI1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI1EN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_SPI1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI1EN)) +#endif /* STM32F303x8 || STM32F334x8 || STM32F328xx */ + +#if defined(STM32F334x8) +#define __HAL_RCC_HRTIM1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_HRTIM1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_HRTIM1EN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_HRTIM1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_HRTIM1EN)) +#endif /* STM32F334x8 */ + +#if defined(STM32F373xC) || defined(STM32F378xx) +#define __HAL_RCC_ADC1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_ADC1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SPI1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SPI1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM19_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM19EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM19EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SDADC1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDADC1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDADC1EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SDADC2_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDADC2EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDADC2EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_SDADC3_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SDADC3EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SDADC3EN);\ + UNUSED(tmpreg); \ + } while(0U) + +#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_TIM19_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM19EN)) +#define __HAL_RCC_SDADC1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDADC1EN)) +#define __HAL_RCC_SDADC2_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDADC2EN)) +#define __HAL_RCC_SDADC3_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SDADC3EN)) +#endif /* STM32F373xC || STM32F378xx */ + +#if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx)\ + || defined(STM32F302xC) || defined(STM32F303xC) || defined(STM32F358xx)\ + || defined(STM32F303x8) || defined(STM32F334x8) || defined(STM32F328xx)\ + || defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx) +#define __HAL_RCC_TIM1_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM1EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM1EN);\ + UNUSED(tmpreg); \ + } while(0U) + +#define __HAL_RCC_TIM1_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM1EN)) +#endif /* STM32F302xE || STM32F303xE || STM32F398xx || */ + /* STM32F302xC || STM32F303xC || STM32F358xx || */ + /* STM32F303x8 || STM32F334x8 || STM32F328xx || */ + /* STM32F301x8 || STM32F302x8 || STM32F318xx */ + +#if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx) +#define __HAL_RCC_SPI4_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + 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_SPI4_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_SPI4EN)) +#endif /* STM32F302xE || STM32F303xE || STM32F398xx */ + +#if defined(STM32F303xE) || defined(STM32F398xx) +#define __HAL_RCC_TIM20_CLK_ENABLE() do { \ + __IO uint32_t tmpreg; \ + SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM20EN);\ + /* Delay after an RCC peripheral clock enabling */ \ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM20EN);\ + UNUSED(tmpreg); \ + } while(0U) +#define __HAL_RCC_TIM20_CLK_DISABLE() (RCC->APB2ENR &= ~(RCC_APB2ENR_TIM20EN)) +#endif /* STM32F303xE || STM32F398xx */ + +/** + * @} + */ + +/** @defgroup RCCEx_AHB_Peripheral_Clock_Enable_Disable_Status RCC Extended AHB Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the AHB peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#if defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx) +#define __HAL_RCC_ADC1_IS_CLK_ENABLED() ((RCC->AHBENR & (RCC_AHBENR_ADC1EN)) != RESET) + +#define __HAL_RCC_ADC1_IS_CLK_DISABLED() ((RCC->AHBENR & (RCC_AHBENR_ADC1EN)) == RESET) +#endif /* STM32F301x8 || STM32F302x8 || STM32F318xx */ + +#if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx)\ + || defined(STM32F302xC) || defined(STM32F303xC) || defined(STM32F358xx) +#define __HAL_RCC_DMA2_IS_CLK_ENABLED() ((RCC->AHBENR & (RCC_AHBENR_DMA2EN)) != RESET) +#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHBENR & (RCC_AHBENR_GPIOEEN)) != RESET) +#define __HAL_RCC_ADC12_IS_CLK_ENABLED() ((RCC->AHBENR & (RCC_AHBENR_ADC12EN)) != RESET) + +#define __HAL_RCC_DMA2_IS_CLK_DISABLED() ((RCC->AHBENR & (RCC_AHBENR_DMA2EN)) == RESET) +#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHBENR & (RCC_AHBENR_GPIOEEN)) == RESET) +#define __HAL_RCC_ADC12_IS_CLK_DISABLED() ((RCC->AHBENR & (RCC_AHBENR_ADC12EN)) == RESET) +#endif /* STM32F302xE || STM32F303xE || STM32F398xx || */ + /* STM32F302xC || STM32F303xC || STM32F358xx */ + +#if defined(STM32F303xE) || defined(STM32F398xx)\ + || defined(STM32F303xC) || defined(STM32F358xx) +#define __HAL_RCC_ADC34_IS_CLK_ENABLED() ((RCC->AHBENR & (RCC_AHBENR_ADC34EN)) != RESET) + +#define __HAL_RCC_ADC34_IS_CLK_DISABLED() ((RCC->AHBENR & (RCC_AHBENR_ADC34EN)) == RESET) +#endif /* STM32F303xE || STM32F398xx || */ + /* STM32F303xC || STM32F358xx */ + +#if defined(STM32F303x8) || defined(STM32F334x8) || defined(STM32F328xx) +#define __HAL_RCC_ADC12_IS_CLK_ENABLED() ((RCC->AHBENR & (RCC_AHBENR_ADC12EN)) != RESET) + +#define __HAL_RCC_ADC12_IS_CLK_DISABLED() ((RCC->AHBENR & (RCC_AHBENR_ADC12EN)) == RESET) +#endif /* STM32F303x8 || STM32F334x8 || STM32F328xx */ + +#if defined(STM32F373xC) || defined(STM32F378xx) +#define __HAL_RCC_DMA2_IS_CLK_ENABLED() ((RCC->AHBENR & (RCC_AHBENR_DMA2EN)) != RESET) +#define __HAL_RCC_GPIOE_IS_CLK_ENABLED() ((RCC->AHBENR & (RCC_AHBENR_GPIOEEN)) != RESET) + +#define __HAL_RCC_DMA2_IS_CLK_DISABLED() ((RCC->AHBENR & (RCC_AHBENR_DMA2EN)) == RESET) +#define __HAL_RCC_GPIOE_IS_CLK_DISABLED() ((RCC->AHBENR & (RCC_AHBENR_GPIOEEN)) == RESET) +#endif /* STM32F373xC || STM32F378xx */ + +#if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx) +#define __HAL_RCC_FMC_IS_CLK_ENABLED() ((RCC->AHBENR & (RCC_AHBENR_FMCEN)) != RESET) +#define __HAL_RCC_GPIOG_IS_CLK_ENABLED() ((RCC->AHBENR & (RCC_AHBENR_GPIOGEN)) != RESET) +#define __HAL_RCC_GPIOH_IS_CLK_ENABLED() ((RCC->AHBENR & (RCC_AHBENR_GPIOHEN)) != RESET) + +#define __HAL_RCC_FMC_IS_CLK_DISABLED() ((RCC->AHBENR & (RCC_AHBENR_FMCEN)) == RESET) +#define __HAL_RCC_GPIOG_IS_CLK_DISABLED() ((RCC->AHBENR & (RCC_AHBENR_GPIOGEN)) == RESET) +#define __HAL_RCC_GPIOH_IS_CLK_DISABLED() ((RCC->AHBENR & (RCC_AHBENR_GPIOHEN)) == RESET) +#endif /* STM32F302xE || STM32F303xE || STM32F398xx */ +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Clock_Enable_Disable_Status RCC Extended APB1 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB1 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#if defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx) +#define __HAL_RCC_SPI2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI2EN)) != RESET) +#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) +#define __HAL_RCC_I2C2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C2EN)) != RESET) +#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) + +#define __HAL_RCC_SPI2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI2EN)) == RESET) +#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) +#define __HAL_RCC_I2C2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C2EN)) == RESET) +#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) +#endif /* STM32F301x8 || STM32F302x8 || STM32F318xx */ + +#if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx)\ + || defined(STM32F302xC) || defined(STM32F303xC) || defined(STM32F358xx) +#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_SPI2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI2EN)) != RESET) +#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != 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_I2C2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C2EN)) != 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_SPI2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI2EN)) == RESET) +#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == 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_I2C2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C2EN)) == RESET) +#endif /* STM32F302xE || STM32F303xE || STM32F398xx || */ + /* STM32F302xC || STM32F303xC || STM32F358xx */ + +#if defined(STM32F303x8) || defined(STM32F334x8) || defined(STM32F328xx) +#define __HAL_RCC_TIM3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) != RESET) +#define __HAL_RCC_DAC2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DAC2EN)) != RESET) + +#define __HAL_RCC_TIM3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM3EN)) == RESET) +#define __HAL_RCC_DAC2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DAC2EN)) == RESET) +#endif /* STM32F303x8 || STM32F334x8 || STM32F328xx */ + +#if defined(STM32F373xC) || defined(STM32F378xx) +#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_TIM5_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM5EN)) != 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_TIM18_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM18EN)) != RESET) +#define __HAL_RCC_SPI2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI2EN)) != RESET) +#define __HAL_RCC_SPI3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) != RESET) +#define __HAL_RCC_I2C2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C2EN)) != RESET) +#define __HAL_RCC_DAC2_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DAC2EN)) != RESET) +#define __HAL_RCC_CEC_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CECEN)) != 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_TIM5_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM5EN)) == 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_TIM18_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM18EN)) == RESET) +#define __HAL_RCC_SPI2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI2EN)) == RESET) +#define __HAL_RCC_SPI3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_SPI3EN)) == RESET) +#define __HAL_RCC_I2C2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C2EN)) == RESET) +#define __HAL_RCC_DAC2_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_DAC2EN)) == RESET) +#define __HAL_RCC_CEC_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CECEN)) == RESET) +#endif /* STM32F373xC || STM32F378xx */ + +#if defined(STM32F303xE) || defined(STM32F398xx) \ + || defined(STM32F303xC) || defined(STM32F358xx) \ + || defined(STM32F303x8) || defined(STM32F334x8) || defined(STM32F328xx)\ + || defined(STM32F373xC) || defined(STM32F378xx) +#define __HAL_RCC_TIM7_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) != RESET) + +#define __HAL_RCC_TIM7_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_TIM7EN)) == RESET) +#endif /* STM32F303xE || STM32F398xx || */ + /* STM32F303xC || STM32F358xx || */ + /* STM32F303x8 || STM32F334x8 || STM32F328xx || */ + /* STM32F373xC || STM32F378xx */ + +#if defined(STM32F302xE) || defined(STM32F303xE)\ + || defined(STM32F302xC) || defined(STM32F303xC)\ + || defined(STM32F302x8) \ + || defined(STM32F373xC) +#define __HAL_RCC_USB_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USBEN)) != RESET) + +#define __HAL_RCC_USB_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_USBEN)) == RESET) +#endif /* STM32F302xE || STM32F303xE || */ + /* STM32F302xC || STM32F303xC || */ + /* STM32F302x8 || */ + /* STM32F373xC */ + +#if !defined(STM32F301x8) +#define __HAL_RCC_CAN1_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CANEN)) != RESET) + +#define __HAL_RCC_CAN1_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_CANEN)) == RESET) +#endif /* STM32F301x8*/ + +#if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx) +#define __HAL_RCC_I2C3_IS_CLK_ENABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) != RESET) + +#define __HAL_RCC_I2C3_IS_CLK_DISABLED() ((RCC->APB1ENR & (RCC_APB1ENR_I2C3EN)) == RESET) +#endif /* STM32F302xE || STM32F303xE || STM32F398xx */ +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Clock_Enable_Disable_Status RCC Extended APB2 Peripheral Clock Enable Disable Status + * @brief Get the enable or disable status of the APB2 peripheral clock. + * @note After reset, the peripheral clock (used for registers read/write access) + * is disabled and the application software has to enable this clock before + * using it. + * @{ + */ +#if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx)\ + || defined(STM32F302xC) || defined(STM32F303xC) || defined(STM32F358xx) +#define __HAL_RCC_SPI1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI1EN)) != RESET) + +#define __HAL_RCC_SPI1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI1EN)) == RESET) +#endif /* STM32F302xE || STM32F303xE || STM32F398xx || */ + /* STM32F302xC || STM32F303xC || STM32F358xx */ + +#if defined(STM32F303xE) || defined(STM32F398xx)\ + || defined(STM32F303xC) || defined(STM32F358xx) +#define __HAL_RCC_TIM8_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) != RESET) + +#define __HAL_RCC_TIM8_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM8EN)) == RESET) +#endif /* STM32F303xE || STM32F398xx || */ + /* STM32F303xC || STM32F358xx */ + +#if defined(STM32F303x8) || defined(STM32F334x8) || defined(STM32F328xx) +#define __HAL_RCC_SPI1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI1EN)) != RESET) + +#define __HAL_RCC_SPI1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI1EN)) == RESET) +#endif /* STM32F303x8 || STM32F334x8 || STM32F328xx */ + +#if defined(STM32F334x8) +#define __HAL_RCC_HRTIM1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_HRTIM1EN)) != RESET) + +#define __HAL_RCC_HRTIM1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_HRTIM1EN)) == RESET) +#endif /* STM32F334x8 */ + +#if defined(STM32F373xC) || defined(STM32F378xx) +#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_TIM19_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM19EN)) != RESET) +#define __HAL_RCC_SDADC1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDADC1EN)) != RESET) +#define __HAL_RCC_SDADC2_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDADC2EN)) != RESET) +#define __HAL_RCC_SDADC3_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDADC3EN)) != 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_TIM19_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM19EN)) == RESET) +#define __HAL_RCC_SDADC1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDADC1EN)) == RESET) +#define __HAL_RCC_SDADC2_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDADC2EN)) == RESET) +#define __HAL_RCC_SDADC3_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SDADC3EN)) == RESET) +#endif /* STM32F373xC || STM32F378xx */ + +#if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx)\ + || defined(STM32F302xC) || defined(STM32F303xC) || defined(STM32F358xx)\ + || defined(STM32F303x8) || defined(STM32F334x8) || defined(STM32F328xx)\ + || defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx) +#define __HAL_RCC_TIM1_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM1EN)) != RESET) + +#define __HAL_RCC_TIM1_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM1EN)) == RESET) +#endif /* STM32F302xE || STM32F303xE || STM32F398xx || */ + /* STM32F302xC || STM32F303xC || STM32F358xx || */ + /* STM32F303x8 || STM32F334x8 || STM32F328xx || */ + /* STM32F301x8 || STM32F302x8 || STM32F318xx */ + +#if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx) +#define __HAL_RCC_SPI4_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) != RESET) + +#define __HAL_RCC_SPI4_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_SPI4EN)) == RESET) +#endif /* STM32F302xE || STM32F303xE || STM32F398xx */ + +#if defined(STM32F303xE) || defined(STM32F398xx) +#define __HAL_RCC_TIM20_IS_CLK_ENABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM20EN)) != RESET) + +#define __HAL_RCC_TIM20_IS_CLK_DISABLED() ((RCC->APB2ENR & (RCC_APB2ENR_TIM20EN)) == RESET) +#endif /* STM32F303xE || STM32F398xx */ +/** + * @} + */ + +/** @defgroup RCCEx_AHB_Force_Release_Reset RCC Extended AHB Force Release Reset + * @brief Force or release AHB peripheral reset. + * @{ + */ +#if defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx) +#define __HAL_RCC_ADC1_FORCE_RESET() (RCC->AHBRSTR |= (RCC_AHBRSTR_ADC1RST)) + +#define __HAL_RCC_ADC1_RELEASE_RESET() (RCC->AHBRSTR &= ~(RCC_AHBRSTR_ADC1RST)) +#endif /* STM32F301x8 || STM32F302x8 || STM32F318xx */ + +#if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx)\ + || defined(STM32F302xC) || defined(STM32F303xC) || defined(STM32F358xx) +#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHBRSTR |= (RCC_AHBRSTR_GPIOERST)) +#define __HAL_RCC_ADC12_FORCE_RESET() (RCC->AHBRSTR |= (RCC_AHBRSTR_ADC12RST)) +/* Aliases for STM32 F3 compatibility */ +#define __HAL_RCC_ADC1_FORCE_RESET() __HAL_RCC_ADC12_FORCE_RESET() +#define __HAL_RCC_ADC2_FORCE_RESET() __HAL_RCC_ADC12_FORCE_RESET() + +#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHBRSTR &= ~(RCC_AHBRSTR_GPIOERST)) +#define __HAL_RCC_ADC12_RELEASE_RESET() (RCC->AHBRSTR &= ~(RCC_AHBRSTR_ADC12RST)) +/* Aliases for STM32 F3 compatibility */ +#define __HAL_RCC_ADC1_RELEASE_RESET() __HAL_RCC_ADC12_RELEASE_RESET() +#define __HAL_RCC_ADC2_RELEASE_RESET() __HAL_RCC_ADC12_RELEASE_RESET() +#endif /* STM32F302xE || STM32F303xE || STM32F398xx || */ + /* STM32F302xC || STM32F303xC || STM32F358xx */ + +#if defined(STM32F303xE) || defined(STM32F398xx)\ + || defined(STM32F303xC) || defined(STM32F358xx) +#define __HAL_RCC_ADC34_FORCE_RESET() (RCC->AHBRSTR |= (RCC_AHBRSTR_ADC34RST)) + +#define __HAL_RCC_ADC34_RELEASE_RESET() (RCC->AHBRSTR &= ~(RCC_AHBRSTR_ADC34RST)) +#endif /* STM32F303xE || STM32F398xx || */ + /* STM32F303xC || STM32F358xx */ + +#if defined(STM32F303x8) || defined(STM32F334x8) || defined(STM32F328xx) +#define __HAL_RCC_ADC12_FORCE_RESET() (RCC->AHBRSTR |= (RCC_AHBRSTR_ADC12RST)) +/* Aliases for STM32 F3 compatibility */ +#define __HAL_RCC_ADC1_FORCE_RESET() __HAL_RCC_ADC12_FORCE_RESET() +#define __HAL_RCC_ADC2_FORCE_RESET() __HAL_RCC_ADC12_FORCE_RESET() + +#define __HAL_RCC_ADC12_RELEASE_RESET() (RCC->AHBRSTR &= ~(RCC_AHBRSTR_ADC12RST)) +/* Aliases for STM32 F3 compatibility */ +#define __HAL_RCC_ADC1_RELEASE_RESET() __HAL_RCC_ADC12_RELEASE_RESET() +#define __HAL_RCC_ADC2_RELEASE_RESET() __HAL_RCC_ADC12_RELEASE_RESET() +#endif /* STM32F303x8 || STM32F334x8 || STM32F328xx */ + +#if defined(STM32F373xC) || defined(STM32F378xx) +#define __HAL_RCC_GPIOE_FORCE_RESET() (RCC->AHBRSTR |= (RCC_AHBRSTR_GPIOERST)) + +#define __HAL_RCC_GPIOE_RELEASE_RESET() (RCC->AHBRSTR &= ~(RCC_AHBRSTR_GPIOERST)) +#endif /* STM32F373xC || STM32F378xx */ + +#if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx) +#define __HAL_RCC_FMC_FORCE_RESET() (RCC->AHBRSTR |= (RCC_AHBRSTR_FMCRST)) +#define __HAL_RCC_GPIOG_FORCE_RESET() (RCC->AHBRSTR |= (RCC_AHBRSTR_GPIOGRST)) +#define __HAL_RCC_GPIOH_FORCE_RESET() (RCC->AHBRSTR |= (RCC_AHBRSTR_GPIOHRST)) + +#define __HAL_RCC_FMC_RELEASE_RESET() (RCC->AHBRSTR &= ~(RCC_AHBRSTR_FMCRST)) +#define __HAL_RCC_GPIOG_RELEASE_RESET() (RCC->AHBRSTR &= ~(RCC_AHBRSTR_GPIOGRST)) +#define __HAL_RCC_GPIOH_RELEASE_RESET() (RCC->AHBRSTR &= ~(RCC_AHBRSTR_GPIOHRST)) +#endif /* STM32F302xE || STM32F303xE || STM32F398xx */ +/** + * @} + */ + +/** @defgroup RCCEx_APB1_Force_Release_Reset RCC Extended APB1 Force Release Reset + * @brief Force or release APB1 peripheral reset. + * @{ + */ +#if defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx) +#define __HAL_RCC_SPI2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI2RST)) +#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) +#define __HAL_RCC_I2C2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C2RST)) +#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) + +#define __HAL_RCC_SPI2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI2RST)) +#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) +#define __HAL_RCC_I2C2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C2RST)) +#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) +#endif /* STM32F301x8 || STM32F302x8 || STM32F318xx */ + +#if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx)\ + || defined(STM32F302xC) || defined(STM32F303xC) || defined(STM32F358xx) +#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_SPI2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI2RST)) +#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) +#define __HAL_RCC_UART4_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART4RST)) +#define __HAL_RCC_UART5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_UART5RST)) +#define __HAL_RCC_I2C2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C2RST)) + +#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_SPI2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI2RST)) +#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) +#define __HAL_RCC_UART4_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART4RST)) +#define __HAL_RCC_UART5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_UART5RST)) +#define __HAL_RCC_I2C2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C2RST)) +#endif /* STM32F302xE || STM32F303xE || STM32F398xx || */ + /* STM32F302xC || STM32F303xC || STM32F358xx */ + +#if defined(STM32F303x8) || defined(STM32F334x8) || defined(STM32F328xx) +#define __HAL_RCC_TIM3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM3RST)) +#define __HAL_RCC_DAC2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DAC2RST)) + +#define __HAL_RCC_TIM3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM3RST)) +#define __HAL_RCC_DAC2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DAC2RST)) +#endif /* STM32F303x8 || STM32F334x8 || STM32F328xx */ + +#if defined(STM32F373xC) || defined(STM32F378xx) +#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_TIM5_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM5RST)) +#define __HAL_RCC_TIM12_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM12RST)) +#define __HAL_RCC_TIM13_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM13RST)) +#define __HAL_RCC_TIM14_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM14RST)) +#define __HAL_RCC_TIM18_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM18RST)) +#define __HAL_RCC_SPI2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI2RST)) +#define __HAL_RCC_SPI3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_SPI3RST)) +#define __HAL_RCC_I2C2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C2RST)) +#define __HAL_RCC_DAC2_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_DAC2RST)) +#define __HAL_RCC_CEC_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CECRST)) + +#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_TIM5_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM5RST)) +#define __HAL_RCC_TIM12_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM12RST)) +#define __HAL_RCC_TIM13_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM13RST)) +#define __HAL_RCC_TIM14_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM14RST)) +#define __HAL_RCC_TIM18_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM18RST)) +#define __HAL_RCC_SPI2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI2RST)) +#define __HAL_RCC_SPI3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_SPI3RST)) +#define __HAL_RCC_I2C2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C2RST)) +#define __HAL_RCC_DAC2_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_DAC2RST)) +#define __HAL_RCC_CEC_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CECRST)) +#endif /* STM32F373xC || STM32F378xx */ + +#if defined(STM32F303xE) || defined(STM32F398xx)\ + || defined(STM32F303xC) || defined(STM32F358xx)\ + || defined(STM32F303x8) || defined(STM32F334x8) || defined(STM32F328xx)\ + || defined(STM32F373xC) || defined(STM32F378xx) +#define __HAL_RCC_TIM7_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_TIM7RST)) + +#define __HAL_RCC_TIM7_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_TIM7RST)) +#endif /* STM32F303xE || STM32F398xx || */ + /* STM32F303xC || STM32F358xx || */ + /* STM32F303x8 || STM32F334x8 || STM32F328xx || */ + /* STM32F373xC || STM32F378xx */ + +#if defined(STM32F302xE) || defined(STM32F303xE)\ + || defined(STM32F302xC) || defined(STM32F303xC)\ + || defined(STM32F302x8) \ + || defined(STM32F373xC) +#define __HAL_RCC_USB_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_USBRST)) + +#define __HAL_RCC_USB_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_USBRST)) +#endif /* STM32F302xE || STM32F303xE || */ + /* STM32F302xC || STM32F303xC || */ + /* STM32F302x8 || */ + /* STM32F373xC */ + +#if !defined(STM32F301x8) +#define __HAL_RCC_CAN1_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_CANRST)) + +#define __HAL_RCC_CAN1_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_CANRST)) +#endif /* STM32F301x8*/ + +#if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx) +#define __HAL_RCC_I2C3_FORCE_RESET() (RCC->APB1RSTR |= (RCC_APB1RSTR_I2C3RST)) + +#define __HAL_RCC_I2C3_RELEASE_RESET() (RCC->APB1RSTR &= ~(RCC_APB1RSTR_I2C3RST)) +#endif /* STM32F302xE || STM32F303xE || STM32F398xx */ +/** + * @} + */ + +/** @defgroup RCCEx_APB2_Force_Release_Reset RCC Extended APB2 Force Release Reset + * @brief Force or release APB2 peripheral reset. + * @{ + */ +#if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx)\ + || defined(STM32F302xC) || defined(STM32F303xC) || defined(STM32F358xx) +#define __HAL_RCC_SPI1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI1RST)) + +#define __HAL_RCC_SPI1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI1RST)) +#endif /* STM32F302xE || STM32F303xE || STM32F398xx || */ + /* STM32F302xC || STM32F303xC || STM32F358xx */ + +#if defined(STM32F303xE) || defined(STM32F398xx)\ + || defined(STM32F303xC) || defined(STM32F358xx) +#define __HAL_RCC_TIM8_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM8RST)) + +#define __HAL_RCC_TIM8_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM8RST)) +#endif /* STM32F303xE || STM32F398xx || */ + /* STM32F303xC || STM32F358xx */ + +#if defined(STM32F303x8) || defined(STM32F334x8) || defined(STM32F328xx) +#define __HAL_RCC_SPI1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI1RST)) + +#define __HAL_RCC_SPI1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI1RST)) +#endif /* STM32F303x8 || STM32F334x8 || STM32F328xx */ + +#if defined(STM32F334x8) +#define __HAL_RCC_HRTIM1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_HRTIM1RST)) + +#define __HAL_RCC_HRTIM1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_HRTIM1RST)) +#endif /* STM32F334x8 */ + +#if defined(STM32F373xC) || defined(STM32F378xx) +#define __HAL_RCC_ADC1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_ADC1RST)) +#define __HAL_RCC_SPI1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI1RST)) +#define __HAL_RCC_TIM19_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM19RST)) +#define __HAL_RCC_SDADC1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDADC1RST)) +#define __HAL_RCC_SDADC2_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDADC2RST)) +#define __HAL_RCC_SDADC3_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SDADC3RST)) + +#define __HAL_RCC_ADC1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_ADC1RST)) +#define __HAL_RCC_SPI1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI1RST)) +#define __HAL_RCC_TIM19_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM19RST)) +#define __HAL_RCC_SDADC1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDADC1RST)) +#define __HAL_RCC_SDADC2_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDADC2RST)) +#define __HAL_RCC_SDADC3_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SDADC3RST)) +#endif /* STM32F373xC || STM32F378xx */ + +#if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx)\ + || defined(STM32F302xC) || defined(STM32F303xC) || defined(STM32F358xx)\ + || defined(STM32F303x8) || defined(STM32F334x8) || defined(STM32F328xx)\ + || defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx) +#define __HAL_RCC_TIM1_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM1RST)) + +#define __HAL_RCC_TIM1_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM1RST)) +#endif /* STM32F302xE || STM32F303xE || STM32F398xx || */ + /* STM32F302xC || STM32F303xC || STM32F358xx || */ + /* STM32F303x8 || STM32F334x8 || STM32F328xx || */ + /* STM32F301x8 || STM32F302x8 || STM32F318xx */ + +#if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx) +#define __HAL_RCC_SPI4_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_SPI4RST)) + +#define __HAL_RCC_SPI4_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_SPI4RST)) +#endif /* STM32F302xE || STM32F303xE || STM32F398xx */ + +#if defined(STM32F303xE) || defined(STM32F398xx) +#define __HAL_RCC_TIM20_FORCE_RESET() (RCC->APB2RSTR |= (RCC_APB2RSTR_TIM20RST)) + +#define __HAL_RCC_TIM20_RELEASE_RESET() (RCC->APB2RSTR &= ~(RCC_APB2RSTR_TIM20RST)) +#endif /* STM32F303xE || STM32F398xx */ + +/** + * @} + */ + +#if defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx) +/** @defgroup RCCEx_I2Cx_Clock_Config RCC Extended I2Cx Clock Config + * @{ + */ + +/** @brief Macro to configure the I2C2 clock (I2C2CLK). + * @param __I2C2CLKSource__ specifies the I2C2 clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_I2C2CLKSOURCE_HSI HSI selected as I2C2 clock + * @arg @ref RCC_I2C2CLKSOURCE_SYSCLK System Clock selected as I2C2 clock + */ +#define __HAL_RCC_I2C2_CONFIG(__I2C2CLKSource__) \ + MODIFY_REG(RCC->CFGR3, RCC_CFGR3_I2C2SW, (uint32_t)(__I2C2CLKSource__)) + +/** @brief Macro to get the I2C2 clock source. + * @retval The clock source can be one of the following values: + * @arg @ref RCC_I2C2CLKSOURCE_HSI HSI selected as I2C2 clock + * @arg @ref RCC_I2C2CLKSOURCE_SYSCLK System Clock selected as I2C2 clock + */ +#define __HAL_RCC_GET_I2C2_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR3, RCC_CFGR3_I2C2SW))) + +/** @brief Macro to configure the I2C3 clock (I2C3CLK). + * @param __I2C3CLKSource__ specifies the I2C3 clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_I2C3CLKSOURCE_HSI HSI selected as I2C3 clock + * @arg @ref RCC_I2C3CLKSOURCE_SYSCLK System Clock selected as I2C3 clock + */ +#define __HAL_RCC_I2C3_CONFIG(__I2C3CLKSource__) \ + MODIFY_REG(RCC->CFGR3, RCC_CFGR3_I2C3SW, (uint32_t)(__I2C3CLKSource__)) + +/** @brief Macro to get the I2C3 clock source. + * @retval The clock source can be one of the following values: + * @arg @ref RCC_I2C3CLKSOURCE_HSI HSI selected as I2C3 clock + * @arg @ref RCC_I2C3CLKSOURCE_SYSCLK System Clock selected as I2C3 clock + */ +#define __HAL_RCC_GET_I2C3_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR3, RCC_CFGR3_I2C3SW))) + +/** + * @} + */ + +/** @defgroup RCCEx_TIMx_Clock_Config RCC Extended TIMx Clock Config + * @{ + */ +/** @brief Macro to configure the TIM1 clock (TIM1CLK). + * @param __TIM1CLKSource__ specifies the TIM1 clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_TIM1CLK_HCLK HCLK selected as TIM1 clock + * @arg @ref RCC_TIM1CLK_PLLCLK PLL Clock selected as TIM1 clock + */ +#define __HAL_RCC_TIM1_CONFIG(__TIM1CLKSource__) \ + MODIFY_REG(RCC->CFGR3, RCC_CFGR3_TIM1SW, (uint32_t)(__TIM1CLKSource__)) + +/** @brief Macro to get the TIM1 clock (TIM1CLK). + * @retval The clock source can be one of the following values: + * @arg @ref RCC_TIM1CLK_HCLK HCLK selected as TIM1 clock + * @arg @ref RCC_TIM1CLK_PLLCLK PLL Clock selected as TIM1 clock + */ +#define __HAL_RCC_GET_TIM1_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR3, RCC_CFGR3_TIM1SW))) + +/** @brief Macro to configure the TIM15 clock (TIM15CLK). + * @param __TIM15CLKSource__ specifies the TIM15 clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_TIM15CLK_HCLK HCLK selected as TIM15 clock + * @arg @ref RCC_TIM15CLK_PLL PLL Clock selected as TIM15 clock + */ +#define __HAL_RCC_TIM15_CONFIG(__TIM15CLKSource__) \ + MODIFY_REG(RCC->CFGR3, RCC_CFGR3_TIM15SW, (uint32_t)(__TIM15CLKSource__)) + +/** @brief Macro to get the TIM15 clock (TIM15CLK). + * @retval The clock source can be one of the following values: + * @arg @ref RCC_TIM15CLK_HCLK HCLK selected as TIM15 clock + * @arg @ref RCC_TIM15CLK_PLL PLL Clock selected as TIM15 clock + */ +#define __HAL_RCC_GET_TIM15_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR3, RCC_CFGR3_TIM15SW))) + +/** @brief Macro to configure the TIM16 clock (TIM16CLK). + * @param __TIM16CLKSource__ specifies the TIM16 clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_TIM16CLK_HCLK HCLK selected as TIM16 clock + * @arg @ref RCC_TIM16CLK_PLL PLL Clock selected as TIM16 clock + */ +#define __HAL_RCC_TIM16_CONFIG(__TIM16CLKSource__) \ + MODIFY_REG(RCC->CFGR3, RCC_CFGR3_TIM16SW, (uint32_t)(__TIM16CLKSource__)) + +/** @brief Macro to get the TIM16 clock (TIM16CLK). + * @retval The clock source can be one of the following values: + * @arg @ref RCC_TIM16CLK_HCLK HCLK selected as TIM16 clock + * @arg @ref RCC_TIM16CLK_PLL PLL Clock selected as TIM16 clock + */ +#define __HAL_RCC_GET_TIM16_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR3, RCC_CFGR3_TIM16SW))) + +/** @brief Macro to configure the TIM17 clock (TIM17CLK). + * @param __TIM17CLKSource__ specifies the TIM17 clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_TIM17CLK_HCLK HCLK selected as TIM17 clock + * @arg @ref RCC_TIM17CLK_PLL PLL Clock selected as TIM17 clock + */ +#define __HAL_RCC_TIM17_CONFIG(__TIM17CLKSource__) \ + MODIFY_REG(RCC->CFGR3, RCC_CFGR3_TIM17SW, (uint32_t)(__TIM17CLKSource__)) + +/** @brief Macro to get the TIM17 clock (TIM17CLK). + * @retval The clock source can be one of the following values: + * @arg @ref RCC_TIM17CLK_HCLK HCLK selected as TIM17 clock + * @arg @ref RCC_TIM17CLK_PLL PLL Clock selected as TIM17 clock + */ +#define __HAL_RCC_GET_TIM17_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR3, RCC_CFGR3_TIM17SW))) + +/** + * @} + */ + +/** @defgroup RCCEx_I2Sx_Clock_Config RCC Extended I2Sx Clock Config + * @{ + */ +/** @brief Macro to configure the I2S clock source (I2SCLK). + * @note This function must be called before enabling the I2S APB clock. + * @param __I2SCLKSource__ specifies the I2S clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_I2SCLKSOURCE_SYSCLK SYSCLK 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_I2S_CONFIG(__I2SCLKSource__) \ + MODIFY_REG(RCC->CFGR, RCC_CFGR_I2SSRC, (uint32_t)(__I2SCLKSource__)) + +/** @brief Macro to get the I2S clock source (I2SCLK). + * @retval The clock source can be one of the following values: + * @arg @ref RCC_I2SCLKSOURCE_SYSCLK SYSCLK 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))) +/** + * @} + */ + +/** @defgroup RCCEx_ADCx_Clock_Config RCC Extended ADCx Clock Config + * @{ + */ + +/** @brief Macro to configure the ADC1 clock (ADC1CLK). + * @param __ADC1CLKSource__ specifies the ADC1 clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_ADC1PLLCLK_OFF ADC1 PLL clock disabled, ADC1 can use AHB clock + * @arg @ref RCC_ADC1PLLCLK_DIV1 PLL clock divided by 1 selected as ADC1 clock + * @arg @ref RCC_ADC1PLLCLK_DIV2 PLL clock divided by 2 selected as ADC1 clock + * @arg @ref RCC_ADC1PLLCLK_DIV4 PLL clock divided by 4 selected as ADC1 clock + * @arg @ref RCC_ADC1PLLCLK_DIV6 PLL clock divided by 6 selected as ADC1 clock + * @arg @ref RCC_ADC1PLLCLK_DIV8 PLL clock divided by 8 selected as ADC1 clock + * @arg @ref RCC_ADC1PLLCLK_DIV10 PLL clock divided by 10 selected as ADC1 clock + * @arg @ref RCC_ADC1PLLCLK_DIV12 PLL clock divided by 12 selected as ADC1 clock + * @arg @ref RCC_ADC1PLLCLK_DIV16 PLL clock divided by 16 selected as ADC1 clock + * @arg @ref RCC_ADC1PLLCLK_DIV32 PLL clock divided by 32 selected as ADC1 clock + * @arg @ref RCC_ADC1PLLCLK_DIV64 PLL clock divided by 64 selected as ADC1 clock + * @arg @ref RCC_ADC1PLLCLK_DIV128 PLL clock divided by 128 selected as ADC1 clock + * @arg @ref RCC_ADC1PLLCLK_DIV256 PLL clock divided by 256 selected as ADC1 clock + */ +#define __HAL_RCC_ADC1_CONFIG(__ADC1CLKSource__) \ + MODIFY_REG(RCC->CFGR2, RCC_CFGR2_ADC1PRES, (uint32_t)(__ADC1CLKSource__)) + +/** @brief Macro to get the ADC1 clock + * @retval The clock source can be one of the following values: + * @arg @ref RCC_ADC1PLLCLK_OFF ADC1 PLL clock disabled, ADC1 can use AHB clock + * @arg @ref RCC_ADC1PLLCLK_DIV1 PLL clock divided by 1 selected as ADC1 clock + * @arg @ref RCC_ADC1PLLCLK_DIV2 PLL clock divided by 2 selected as ADC1 clock + * @arg @ref RCC_ADC1PLLCLK_DIV4 PLL clock divided by 4 selected as ADC1 clock + * @arg @ref RCC_ADC1PLLCLK_DIV6 PLL clock divided by 6 selected as ADC1 clock + * @arg @ref RCC_ADC1PLLCLK_DIV8 PLL clock divided by 8 selected as ADC1 clock + * @arg @ref RCC_ADC1PLLCLK_DIV10 PLL clock divided by 10 selected as ADC1 clock + * @arg @ref RCC_ADC1PLLCLK_DIV12 PLL clock divided by 12 selected as ADC1 clock + * @arg @ref RCC_ADC1PLLCLK_DIV16 PLL clock divided by 16 selected as ADC1 clock + * @arg @ref RCC_ADC1PLLCLK_DIV32 PLL clock divided by 32 selected as ADC1 clock + * @arg @ref RCC_ADC1PLLCLK_DIV64 PLL clock divided by 64 selected as ADC1 clock + * @arg @ref RCC_ADC1PLLCLK_DIV128 PLL clock divided by 128 selected as ADC1 clock + * @arg @ref RCC_ADC1PLLCLK_DIV256 PLL clock divided by 256 selected as ADC1 clock + */ +#define __HAL_RCC_GET_ADC1_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR2, RCC_CFGR2_ADC1PRES))) +/** + * @} + */ + +#endif /* STM32F301x8 || STM32F302x8 || STM32F318xx */ + +#if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx)\ + || defined(STM32F302xC) || defined(STM32F303xC) || defined(STM32F358xx) +/** @defgroup RCCEx_I2Cx_Clock_Config RCC Extended I2Cx Clock Config + * @{ + */ + +/** @brief Macro to configure the I2C2 clock (I2C2CLK). + * @param __I2C2CLKSource__ specifies the I2C2 clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_I2C2CLKSOURCE_HSI HSI selected as I2C2 clock + * @arg @ref RCC_I2C2CLKSOURCE_SYSCLK System Clock selected as I2C2 clock + */ +#define __HAL_RCC_I2C2_CONFIG(__I2C2CLKSource__) \ + MODIFY_REG(RCC->CFGR3, RCC_CFGR3_I2C2SW, (uint32_t)(__I2C2CLKSource__)) + +/** @brief Macro to get the I2C2 clock source. + * @retval The clock source can be one of the following values: + * @arg @ref RCC_I2C2CLKSOURCE_HSI HSI selected as I2C2 clock + * @arg @ref RCC_I2C2CLKSOURCE_SYSCLK System Clock selected as I2C2 clock + */ +#define __HAL_RCC_GET_I2C2_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR3, RCC_CFGR3_I2C2SW))) +/** + * @} + */ + +/** @defgroup RCCEx_ADCx_Clock_Config RCC Extended ADCx Clock Config + * @{ + */ + +/** @brief Macro to configure the ADC1 & ADC2 clock (ADC12CLK). + * @param __ADC12CLKSource__ specifies the ADC1 & ADC2 clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_ADC12PLLCLK_OFF ADC1 & ADC2 PLL clock disabled, ADC1 & ADC2 can use AHB clock + * @arg @ref RCC_ADC12PLLCLK_DIV1 PLL clock divided by 1 selected as ADC1 & ADC2 clock + * @arg @ref RCC_ADC12PLLCLK_DIV2 PLL clock divided by 2 selected as ADC1 & ADC2 clock + * @arg @ref RCC_ADC12PLLCLK_DIV4 PLL clock divided by 4 selected as ADC1 & ADC2 clock + * @arg @ref RCC_ADC12PLLCLK_DIV6 PLL clock divided by 6 selected as ADC1 & ADC2 clock + * @arg @ref RCC_ADC12PLLCLK_DIV8 PLL clock divided by 8 selected as ADC1 & ADC2 clock + * @arg @ref RCC_ADC12PLLCLK_DIV10 PLL clock divided by 10 selected as ADC1 & ADC2 clock + * @arg @ref RCC_ADC12PLLCLK_DIV12 PLL clock divided by 12 selected as ADC1 & ADC2 clock + * @arg @ref RCC_ADC12PLLCLK_DIV16 PLL clock divided by 16 selected as ADC1 & ADC2 clock + * @arg @ref RCC_ADC12PLLCLK_DIV32 PLL clock divided by 32 selected as ADC1 & ADC2 clock + * @arg @ref RCC_ADC12PLLCLK_DIV64 PLL clock divided by 64 selected as ADC1 & ADC2 clock + * @arg @ref RCC_ADC12PLLCLK_DIV128 PLL clock divided by 128 selected as ADC1 & ADC2 clock + * @arg @ref RCC_ADC12PLLCLK_DIV256 PLL clock divided by 256 selected as ADC1 & ADC2 clock + */ +#define __HAL_RCC_ADC12_CONFIG(__ADC12CLKSource__) \ + MODIFY_REG(RCC->CFGR2, RCC_CFGR2_ADCPRE12, (uint32_t)(__ADC12CLKSource__)) + +/** @brief Macro to get the ADC1 & ADC2 clock + * @retval The clock source can be one of the following values: + * @arg @ref RCC_ADC12PLLCLK_OFF ADC1 & ADC2 PLL clock disabled, ADC1 & ADC2 can use AHB clock + * @arg @ref RCC_ADC12PLLCLK_DIV1 PLL clock divided by 1 selected as ADC1 & ADC2 clock + * @arg @ref RCC_ADC12PLLCLK_DIV2 PLL clock divided by 2 selected as ADC1 & ADC2 clock + * @arg @ref RCC_ADC12PLLCLK_DIV4 PLL clock divided by 4 selected as ADC1 & ADC2 clock + * @arg @ref RCC_ADC12PLLCLK_DIV6 PLL clock divided by 6 selected as ADC1 & ADC2 clock + * @arg @ref RCC_ADC12PLLCLK_DIV8 PLL clock divided by 8 selected as ADC1 & ADC2 clock + * @arg @ref RCC_ADC12PLLCLK_DIV10 PLL clock divided by 10 selected as ADC1 & ADC2 clock + * @arg @ref RCC_ADC12PLLCLK_DIV12 PLL clock divided by 12 selected as ADC1 & ADC2 clock + * @arg @ref RCC_ADC12PLLCLK_DIV16 PLL clock divided by 16 selected as ADC1 & ADC2 clock + * @arg @ref RCC_ADC12PLLCLK_DIV32 PLL clock divided by 32 selected as ADC1 & ADC2 clock + * @arg @ref RCC_ADC12PLLCLK_DIV64 PLL clock divided by 64 selected as ADC1 & ADC2 clock + * @arg @ref RCC_ADC12PLLCLK_DIV128 PLL clock divided by 128 selected as ADC1 & ADC2 clock + * @arg @ref RCC_ADC12PLLCLK_DIV256 PLL clock divided by 256 selected as ADC1 & ADC2 clock + */ +#define __HAL_RCC_GET_ADC12_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR2, RCC_CFGR2_ADCPRE12))) +/** + * @} + */ + +/** @defgroup RCCEx_TIMx_Clock_Config RCC Extended TIMx Clock Config + * @{ + */ + +/** @brief Macro to configure the TIM1 clock (TIM1CLK). + * @param __TIM1CLKSource__ specifies the TIM1 clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_TIM1CLK_HCLK HCLK selected as TIM1 clock + * @arg @ref RCC_TIM1CLK_PLLCLK PLL Clock selected as TIM1 clock + */ +#define __HAL_RCC_TIM1_CONFIG(__TIM1CLKSource__) \ + MODIFY_REG(RCC->CFGR3, RCC_CFGR3_TIM1SW, (uint32_t)(__TIM1CLKSource__)) + +/** @brief Macro to get the TIM1 clock (TIM1CLK). + * @retval The clock source can be one of the following values: + * @arg @ref RCC_TIM1CLK_HCLK HCLK selected as TIM1 clock + * @arg @ref RCC_TIM1CLK_PLLCLK PLL Clock selected as TIM1 clock + */ +#define __HAL_RCC_GET_TIM1_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR3, RCC_CFGR3_TIM1SW))) +/** + * @} + */ + +/** @defgroup RCCEx_I2Sx_Clock_Config RCC Extended I2Sx Clock Config + * @{ + */ + +/** @brief Macro to configure the I2S clock source (I2SCLK). + * @note This function must be called before enabling the I2S APB clock. + * @param __I2SCLKSource__ specifies the I2S clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_I2SCLKSOURCE_SYSCLK SYSCLK 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_I2S_CONFIG(__I2SCLKSource__) \ + MODIFY_REG(RCC->CFGR, RCC_CFGR_I2SSRC, (uint32_t)(__I2SCLKSource__)) + +/** @brief Macro to get the I2S clock source (I2SCLK). + * @retval The clock source can be one of the following values: + * @arg @ref RCC_I2SCLKSOURCE_SYSCLK SYSCLK 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))) +/** + * @} + */ + +/** @defgroup RCCEx_UARTx_Clock_Config RCC Extended UARTx Clock Config + * @{ + */ + +/** @brief Macro to configure the UART4 clock (UART4CLK). + * @param __UART4CLKSource__ specifies the UART4 clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_UART4CLKSOURCE_PCLK1 PCLK1 selected as UART4 clock + * @arg @ref RCC_UART4CLKSOURCE_HSI HSI selected as UART4 clock + * @arg @ref RCC_UART4CLKSOURCE_SYSCLK System Clock selected as UART4 clock + * @arg @ref RCC_UART4CLKSOURCE_LSE LSE selected as UART4 clock + */ +#define __HAL_RCC_UART4_CONFIG(__UART4CLKSource__) \ + MODIFY_REG(RCC->CFGR3, RCC_CFGR3_UART4SW, (uint32_t)(__UART4CLKSource__)) + +/** @brief Macro to get the UART4 clock source. + * @retval The clock source can be one of the following values: + * @arg @ref RCC_UART4CLKSOURCE_PCLK1 PCLK1 selected as UART4 clock + * @arg @ref RCC_UART4CLKSOURCE_HSI HSI selected as UART4 clock + * @arg @ref RCC_UART4CLKSOURCE_SYSCLK System Clock selected as UART4 clock + * @arg @ref RCC_UART4CLKSOURCE_LSE LSE selected as UART4 clock + */ +#define __HAL_RCC_GET_UART4_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR3, RCC_CFGR3_UART4SW))) + +/** @brief Macro to configure the UART5 clock (UART5CLK). + * @param __UART5CLKSource__ specifies the UART5 clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_UART5CLKSOURCE_PCLK1 PCLK1 selected as UART5 clock + * @arg @ref RCC_UART5CLKSOURCE_HSI HSI selected as UART5 clock + * @arg @ref RCC_UART5CLKSOURCE_SYSCLK System Clock selected as UART5 clock + * @arg @ref RCC_UART5CLKSOURCE_LSE LSE selected as UART5 clock + */ +#define __HAL_RCC_UART5_CONFIG(__UART5CLKSource__) \ + MODIFY_REG(RCC->CFGR3, RCC_CFGR3_UART5SW, (uint32_t)(__UART5CLKSource__)) + +/** @brief Macro to get the UART5 clock source. + * @retval The clock source can be one of the following values: + * @arg @ref RCC_UART5CLKSOURCE_PCLK1 PCLK1 selected as UART5 clock + * @arg @ref RCC_UART5CLKSOURCE_HSI HSI selected as UART5 clock + * @arg @ref RCC_UART5CLKSOURCE_SYSCLK System Clock selected as UART5 clock + * @arg @ref RCC_UART5CLKSOURCE_LSE LSE selected as UART5 clock + */ +#define __HAL_RCC_GET_UART5_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR3, RCC_CFGR3_UART5SW))) +/** + * @} + */ +#endif /* STM32F302xE || STM32F303xE || STM32F398xx || */ + /* STM32F302xC || STM32F303xC || STM32F358xx */ + +#if defined(STM32F303xE) || defined(STM32F398xx)\ + || defined(STM32F303xC) || defined(STM32F358xx) +/** @defgroup RCCEx_ADCx_Clock_Config RCC Extended ADCx Clock Config + * @{ + */ + +/** @brief Macro to configure the ADC3 & ADC4 clock (ADC34CLK). + * @param __ADC34CLKSource__ specifies the ADC3 & ADC4 clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_ADC34PLLCLK_OFF ADC3 & ADC4 PLL clock disabled, ADC3 & ADC4 can use AHB clock + * @arg @ref RCC_ADC34PLLCLK_DIV1 PLL clock divided by 1 selected as ADC3 & ADC4 clock + * @arg @ref RCC_ADC34PLLCLK_DIV2 PLL clock divided by 2 selected as ADC3 & ADC4 clock + * @arg @ref RCC_ADC34PLLCLK_DIV4 PLL clock divided by 4 selected as ADC3 & ADC4 clock + * @arg @ref RCC_ADC34PLLCLK_DIV6 PLL clock divided by 6 selected as ADC3 & ADC4 clock + * @arg @ref RCC_ADC34PLLCLK_DIV8 PLL clock divided by 8 selected as ADC3 & ADC4 clock + * @arg @ref RCC_ADC34PLLCLK_DIV10 PLL clock divided by 10 selected as ADC3 & ADC4 clock + * @arg @ref RCC_ADC34PLLCLK_DIV12 PLL clock divided by 12 selected as ADC3 & ADC4 clock + * @arg @ref RCC_ADC34PLLCLK_DIV16 PLL clock divided by 16 selected as ADC3 & ADC4 clock + * @arg @ref RCC_ADC34PLLCLK_DIV32 PLL clock divided by 32 selected as ADC3 & ADC4 clock + * @arg @ref RCC_ADC34PLLCLK_DIV64 PLL clock divided by 64 selected as ADC3 & ADC4 clock + * @arg @ref RCC_ADC34PLLCLK_DIV128 PLL clock divided by 128 selected as ADC3 & ADC4 clock + * @arg @ref RCC_ADC34PLLCLK_DIV256 PLL clock divided by 256 selected as ADC3 & ADC4 clock + */ +#define __HAL_RCC_ADC34_CONFIG(__ADC34CLKSource__) \ + MODIFY_REG(RCC->CFGR2, RCC_CFGR2_ADCPRE34, (uint32_t)(__ADC34CLKSource__)) + +/** @brief Macro to get the ADC3 & ADC4 clock + * @retval The clock source can be one of the following values: + * @arg @ref RCC_ADC34PLLCLK_OFF ADC3 & ADC4 PLL clock disabled, ADC3 & ADC4 can use AHB clock + * @arg @ref RCC_ADC34PLLCLK_DIV1 PLL clock divided by 1 selected as ADC3 & ADC4 clock + * @arg @ref RCC_ADC34PLLCLK_DIV2 PLL clock divided by 2 selected as ADC3 & ADC4 clock + * @arg @ref RCC_ADC34PLLCLK_DIV4 PLL clock divided by 4 selected as ADC3 & ADC4 clock + * @arg @ref RCC_ADC34PLLCLK_DIV6 PLL clock divided by 6 selected as ADC3 & ADC4 clock + * @arg @ref RCC_ADC34PLLCLK_DIV8 PLL clock divided by 8 selected as ADC3 & ADC4 clock + * @arg @ref RCC_ADC34PLLCLK_DIV10 PLL clock divided by 10 selected as ADC3 & ADC4 clock + * @arg @ref RCC_ADC34PLLCLK_DIV12 PLL clock divided by 12 selected as ADC3 & ADC4 clock + * @arg @ref RCC_ADC34PLLCLK_DIV16 PLL clock divided by 16 selected as ADC3 & ADC4 clock + * @arg @ref RCC_ADC34PLLCLK_DIV32 PLL clock divided by 32 selected as ADC3 & ADC4 clock + * @arg @ref RCC_ADC34PLLCLK_DIV64 PLL clock divided by 64 selected as ADC3 & ADC4 clock + * @arg @ref RCC_ADC34PLLCLK_DIV128 PLL clock divided by 128 selected as ADC3 & ADC4 clock + * @arg @ref RCC_ADC34PLLCLK_DIV256 PLL clock divided by 256 selected as ADC3 & ADC4 clock + */ +#define __HAL_RCC_GET_ADC34_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR2, RCC_CFGR2_ADCPRE34))) +/** + * @} + */ + +/** @defgroup RCCEx_TIMx_Clock_Config RCC Extended TIMx Clock Config + * @{ + */ + +/** @brief Macro to configure the TIM8 clock (TIM8CLK). + * @param __TIM8CLKSource__ specifies the TIM8 clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_TIM8CLK_HCLK HCLK selected as TIM8 clock + * @arg @ref RCC_TIM8CLK_PLLCLK PLL Clock selected as TIM8 clock + */ +#define __HAL_RCC_TIM8_CONFIG(__TIM8CLKSource__) \ + MODIFY_REG(RCC->CFGR3, RCC_CFGR3_TIM8SW, (uint32_t)(__TIM8CLKSource__)) + +/** @brief Macro to get the TIM8 clock (TIM8CLK). + * @retval The clock source can be one of the following values: + * @arg @ref RCC_TIM8CLK_HCLK HCLK selected as TIM8 clock + * @arg @ref RCC_TIM8CLK_PLLCLK PLL Clock selected as TIM8 clock + */ +#define __HAL_RCC_GET_TIM8_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR3, RCC_CFGR3_TIM8SW))) + +/** + * @} + */ +#endif /* STM32F303xE || STM32F398xx || */ + /* STM32F303xC || STM32F358xx */ + +#if defined(STM32F303x8) || defined(STM32F334x8) || defined(STM32F328xx) +/** @defgroup RCCEx_ADCx_Clock_Config RCC Extended ADCx Clock Config + * @{ + */ + +/** @brief Macro to configure the ADC1 & ADC2 clock (ADC12CLK). + * @param __ADC12CLKSource__ specifies the ADC1 & ADC2 clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_ADC12PLLCLK_OFF ADC1 & ADC2 PLL clock disabled, ADC1 & ADC2 can use AHB clock + * @arg @ref RCC_ADC12PLLCLK_DIV1 PLL clock divided by 1 selected as ADC1 & ADC2 clock + * @arg @ref RCC_ADC12PLLCLK_DIV2 PLL clock divided by 2 selected as ADC1 & ADC2 clock + * @arg @ref RCC_ADC12PLLCLK_DIV4 PLL clock divided by 4 selected as ADC1 & ADC2 clock + * @arg @ref RCC_ADC12PLLCLK_DIV6 PLL clock divided by 6 selected as ADC1 & ADC2 clock + * @arg @ref RCC_ADC12PLLCLK_DIV8 PLL clock divided by 8 selected as ADC1 & ADC2 clock + * @arg @ref RCC_ADC12PLLCLK_DIV10 PLL clock divided by 10 selected as ADC1 & ADC2 clock + * @arg @ref RCC_ADC12PLLCLK_DIV12 PLL clock divided by 12 selected as ADC1 & ADC2 clock + * @arg @ref RCC_ADC12PLLCLK_DIV16 PLL clock divided by 16 selected as ADC1 & ADC2 clock + * @arg @ref RCC_ADC12PLLCLK_DIV32 PLL clock divided by 32 selected as ADC1 & ADC2 clock + * @arg @ref RCC_ADC12PLLCLK_DIV64 PLL clock divided by 64 selected as ADC1 & ADC2 clock + * @arg @ref RCC_ADC12PLLCLK_DIV128 PLL clock divided by 128 selected as ADC1 & ADC2 clock + * @arg @ref RCC_ADC12PLLCLK_DIV256 PLL clock divided by 256 selected as ADC1 & ADC2 clock + */ +#define __HAL_RCC_ADC12_CONFIG(__ADC12CLKSource__) \ + MODIFY_REG(RCC->CFGR2, RCC_CFGR2_ADCPRE12, (uint32_t)(__ADC12CLKSource__)) + +/** @brief Macro to get the ADC1 & ADC2 clock + * @retval The clock source can be one of the following values: + * @arg @ref RCC_ADC12PLLCLK_OFF ADC1 & ADC2 PLL clock disabled, ADC1 & ADC2 can use AHB clock + * @arg @ref RCC_ADC12PLLCLK_DIV1 PLL clock divided by 1 selected as ADC1 & ADC2 clock + * @arg @ref RCC_ADC12PLLCLK_DIV2 PLL clock divided by 2 selected as ADC1 & ADC2 clock + * @arg @ref RCC_ADC12PLLCLK_DIV4 PLL clock divided by 4 selected as ADC1 & ADC2 clock + * @arg @ref RCC_ADC12PLLCLK_DIV6 PLL clock divided by 6 selected as ADC1 & ADC2 clock + * @arg @ref RCC_ADC12PLLCLK_DIV8 PLL clock divided by 8 selected as ADC1 & ADC2 clock + * @arg @ref RCC_ADC12PLLCLK_DIV10 PLL clock divided by 10 selected as ADC1 & ADC2 clock + * @arg @ref RCC_ADC12PLLCLK_DIV12 PLL clock divided by 12 selected as ADC1 & ADC2 clock + * @arg @ref RCC_ADC12PLLCLK_DIV16 PLL clock divided by 16 selected as ADC1 & ADC2 clock + * @arg @ref RCC_ADC12PLLCLK_DIV32 PLL clock divided by 32 selected as ADC1 & ADC2 clock + * @arg @ref RCC_ADC12PLLCLK_DIV64 PLL clock divided by 64 selected as ADC1 & ADC2 clock + * @arg @ref RCC_ADC12PLLCLK_DIV128 PLL clock divided by 128 selected as ADC1 & ADC2 clock + * @arg @ref RCC_ADC12PLLCLK_DIV256 PLL clock divided by 256 selected as ADC1 & ADC2 clock + */ +#define __HAL_RCC_GET_ADC12_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR2, RCC_CFGR2_ADCPRE12))) +/** + * @} + */ + +/** @defgroup RCCEx_TIMx_Clock_Config RCC Extended TIMx Clock Config + * @{ + */ +/** @brief Macro to configure the TIM1 clock (TIM1CLK). + * @param __TIM1CLKSource__ specifies the TIM1 clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_TIM1CLK_HCLK HCLK selected as TIM1 clock + * @arg @ref RCC_TIM1CLK_PLLCLK PLL Clock selected as TIM1 clock + */ +#define __HAL_RCC_TIM1_CONFIG(__TIM1CLKSource__) \ + MODIFY_REG(RCC->CFGR3, RCC_CFGR3_TIM1SW, (uint32_t)(__TIM1CLKSource__)) + +/** @brief Macro to get the TIM1 clock (TIM1CLK). + * @retval The clock source can be one of the following values: + * @arg @ref RCC_TIM1CLK_HCLK HCLK selected as TIM1 clock + * @arg @ref RCC_TIM1CLK_PLLCLK PLL Clock selected as TIM1 clock + */ +#define __HAL_RCC_GET_TIM1_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR3, RCC_CFGR3_TIM1SW))) +/** + * @} + */ +#endif /* STM32F303x8 || STM32F334x8 || STM32F328xx */ + +#if defined(STM32F334x8) +/** @defgroup RCCEx_HRTIMx_Clock_Config RCC Extended HRTIMx Clock Config + * @{ + */ +/** @brief Macro to configure the HRTIM1 clock. + * @param __HRTIM1CLKSource__ specifies the HRTIM1 clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_HRTIM1CLK_HCLK HCLK selected as HRTIM1 clock + * @arg @ref RCC_HRTIM1CLK_PLLCLK PLL Clock selected as HRTIM1 clock + */ +#define __HAL_RCC_HRTIM1_CONFIG(__HRTIM1CLKSource__) \ + MODIFY_REG(RCC->CFGR3, RCC_CFGR3_HRTIM1SW, (uint32_t)(__HRTIM1CLKSource__)) + +/** @brief Macro to get the HRTIM1 clock source. + * @retval The clock source can be one of the following values: + * @arg @ref RCC_HRTIM1CLK_HCLK HCLK selected as HRTIM1 clock + * @arg @ref RCC_HRTIM1CLK_PLLCLK PLL Clock selected as HRTIM1 clock + */ +#define __HAL_RCC_GET_HRTIM1_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR3, RCC_CFGR3_HRTIM1SW))) +/** + * @} + */ +#endif /* STM32F334x8 */ + +#if defined(STM32F373xC) || defined(STM32F378xx) +/** @defgroup RCCEx_I2Cx_Clock_Config RCC Extended I2Cx Clock Config + * @{ + */ +/** @brief Macro to configure the I2C2 clock (I2C2CLK). + * @param __I2C2CLKSource__ specifies the I2C2 clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_I2C2CLKSOURCE_HSI HSI selected as I2C2 clock + * @arg @ref RCC_I2C2CLKSOURCE_SYSCLK System Clock selected as I2C2 clock + */ +#define __HAL_RCC_I2C2_CONFIG(__I2C2CLKSource__) \ + MODIFY_REG(RCC->CFGR3, RCC_CFGR3_I2C2SW, (uint32_t)(__I2C2CLKSource__)) + +/** @brief Macro to get the I2C2 clock source. + * @retval The clock source can be one of the following values: + * @arg @ref RCC_I2C2CLKSOURCE_HSI HSI selected as I2C2 clock + * @arg @ref RCC_I2C2CLKSOURCE_SYSCLK System Clock selected as I2C2 clock + */ +#define __HAL_RCC_GET_I2C2_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR3, RCC_CFGR3_I2C2SW))) +/** + * @} + */ + +/** @defgroup RCCEx_ADCx_Clock_Config RCC Extended ADCx Clock Config + * @{ + */ +/** @brief Macro to configure the ADC1 clock (ADC1CLK). + * @param __ADC1CLKSource__ specifies the ADC1 clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_ADC1PCLK2_DIV2 PCLK2 clock divided by 2 selected as ADC1 clock + * @arg @ref RCC_ADC1PCLK2_DIV4 PCLK2 clock divided by 4 selected as ADC1 clock + * @arg @ref RCC_ADC1PCLK2_DIV6 PCLK2 clock divided by 6 selected as ADC1 clock + * @arg @ref RCC_ADC1PCLK2_DIV8 PCLK2 clock divided by 8 selected as ADC1 clock + */ +#define __HAL_RCC_ADC1_CONFIG(__ADC1CLKSource__) \ + MODIFY_REG(RCC->CFGR, RCC_CFGR_ADCPRE, (uint32_t)(__ADC1CLKSource__)) + +/** @brief Macro to get the ADC1 clock (ADC1CLK). + * @retval The clock source can be one of the following values: + * @arg @ref RCC_ADC1PCLK2_DIV2 PCLK2 clock divided by 2 selected as ADC1 clock + * @arg @ref RCC_ADC1PCLK2_DIV4 PCLK2 clock divided by 4 selected as ADC1 clock + * @arg @ref RCC_ADC1PCLK2_DIV6 PCLK2 clock divided by 6 selected as ADC1 clock + * @arg @ref RCC_ADC1PCLK2_DIV8 PCLK2 clock divided by 8 selected as ADC1 clock + */ +#define __HAL_RCC_GET_ADC1_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_ADCPRE))) +/** + * @} + */ + +/** @defgroup RCCEx_SDADCx_Clock_Config RCC Extended SDADCx Clock Config + * @{ + */ +/** @brief Macro to configure the SDADCx clock (SDADCxCLK). + * @param __SDADCPrescaler__ specifies the SDADCx system clock prescaler. + * This parameter can be one of the following values: + * @arg @ref RCC_SDADCSYSCLK_DIV1 SYSCLK clock selected as SDADCx clock + * @arg @ref RCC_SDADCSYSCLK_DIV2 SYSCLK clock divided by 2 selected as SDADCx clock + * @arg @ref RCC_SDADCSYSCLK_DIV4 SYSCLK clock divided by 4 selected as SDADCx clock + * @arg @ref RCC_SDADCSYSCLK_DIV6 SYSCLK clock divided by 6 selected as SDADCx clock + * @arg @ref RCC_SDADCSYSCLK_DIV8 SYSCLK clock divided by 8 selected as SDADCx clock + * @arg @ref RCC_SDADCSYSCLK_DIV10 SYSCLK clock divided by 10 selected as SDADCx clock + * @arg @ref RCC_SDADCSYSCLK_DIV12 SYSCLK clock divided by 12 selected as SDADCx clock + * @arg @ref RCC_SDADCSYSCLK_DIV14 SYSCLK clock divided by 14 selected as SDADCx clock + * @arg @ref RCC_SDADCSYSCLK_DIV16 SYSCLK clock divided by 16 selected as SDADCx clock + * @arg @ref RCC_SDADCSYSCLK_DIV20 SYSCLK clock divided by 20 selected as SDADCx clock + * @arg @ref RCC_SDADCSYSCLK_DIV24 SYSCLK clock divided by 24 selected as SDADCx clock + * @arg @ref RCC_SDADCSYSCLK_DIV28 SYSCLK clock divided by 28 selected as SDADCx clock + * @arg @ref RCC_SDADCSYSCLK_DIV32 SYSCLK clock divided by 32 selected as SDADCx clock + * @arg @ref RCC_SDADCSYSCLK_DIV36 SYSCLK clock divided by 36 selected as SDADCx clock + * @arg @ref RCC_SDADCSYSCLK_DIV40 SYSCLK clock divided by 40 selected as SDADCx clock + * @arg @ref RCC_SDADCSYSCLK_DIV44 SYSCLK clock divided by 44 selected as SDADCx clock + * @arg @ref RCC_SDADCSYSCLK_DIV48 SYSCLK clock divided by 48 selected as SDADCx clock + */ +#define __HAL_RCC_SDADC_CONFIG(__SDADCPrescaler__) \ + MODIFY_REG(RCC->CFGR, RCC_CFGR_SDPRE, (uint32_t)(__SDADCPrescaler__)) + +/** @brief Macro to get the SDADCx clock prescaler. + * @retval The clock source can be one of the following values: + * @arg @ref RCC_SDADCSYSCLK_DIV1 SYSCLK clock selected as SDADCx clock + * @arg @ref RCC_SDADCSYSCLK_DIV2 SYSCLK clock divided by 2 selected as SDADCx clock + * @arg @ref RCC_SDADCSYSCLK_DIV4 SYSCLK clock divided by 4 selected as SDADCx clock + * @arg @ref RCC_SDADCSYSCLK_DIV6 SYSCLK clock divided by 6 selected as SDADCx clock + * @arg @ref RCC_SDADCSYSCLK_DIV8 SYSCLK clock divided by 8 selected as SDADCx clock + * @arg @ref RCC_SDADCSYSCLK_DIV10 SYSCLK clock divided by 10 selected as SDADCx clock + * @arg @ref RCC_SDADCSYSCLK_DIV12 SYSCLK clock divided by 12 selected as SDADCx clock + * @arg @ref RCC_SDADCSYSCLK_DIV14 SYSCLK clock divided by 14 selected as SDADCx clock + * @arg @ref RCC_SDADCSYSCLK_DIV16 SYSCLK clock divided by 16 selected as SDADCx clock + * @arg @ref RCC_SDADCSYSCLK_DIV20 SYSCLK clock divided by 20 selected as SDADCx clock + * @arg @ref RCC_SDADCSYSCLK_DIV24 SYSCLK clock divided by 24 selected as SDADCx clock + * @arg @ref RCC_SDADCSYSCLK_DIV28 SYSCLK clock divided by 28 selected as SDADCx clock + * @arg @ref RCC_SDADCSYSCLK_DIV32 SYSCLK clock divided by 32 selected as SDADCx clock + * @arg @ref RCC_SDADCSYSCLK_DIV36 SYSCLK clock divided by 36 selected as SDADCx clock + * @arg @ref RCC_SDADCSYSCLK_DIV40 SYSCLK clock divided by 40 selected as SDADCx clock + * @arg @ref RCC_SDADCSYSCLK_DIV44 SYSCLK clock divided by 44 selected as SDADCx clock + * @arg @ref RCC_SDADCSYSCLK_DIV48 SYSCLK clock divided by 48 selected as SDADCx clock + */ +#define __HAL_RCC_GET_SDADC_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_SDPRE))) +/** + * @} + */ + +/** @defgroup RCCEx_CECx_Clock_Config RCC Extended CECx Clock Config + * @{ + */ +/** @brief Macro to configure the CEC clock. + * @param __CECCLKSource__ specifies the CEC clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_CECCLKSOURCE_HSI HSI selected as CEC clock + * @arg @ref RCC_CECCLKSOURCE_LSE LSE selected as CEC clock + */ +#define __HAL_RCC_CEC_CONFIG(__CECCLKSource__) \ + MODIFY_REG(RCC->CFGR3, RCC_CFGR3_CECSW, (uint32_t)(__CECCLKSource__)) + +/** @brief Macro to get the HDMI CEC clock source. + * @retval The clock source can be one of the following values: + * @arg @ref RCC_CECCLKSOURCE_HSI HSI selected as CEC clock + * @arg @ref RCC_CECCLKSOURCE_LSE LSE selected as CEC clock + */ +#define __HAL_RCC_GET_CEC_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR3, RCC_CFGR3_CECSW))) +/** + * @} + */ + +#endif /* STM32F373xC || STM32F378xx */ + +#if defined(STM32F302xE) || defined(STM32F303xE)\ + || defined(STM32F302xC) || defined(STM32F303xC)\ + || defined(STM32F302x8) \ + || defined(STM32F373xC) + +/** @defgroup RCCEx_USBx_Clock_Config RCC Extended USBx Clock Config + * @{ + */ +/** @brief Macro to configure the USB clock (USBCLK). + * @param __USBCLKSource__ specifies the USB clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_USBCLKSOURCE_PLL PLL Clock divided by 1 selected as USB clock + * @arg @ref RCC_USBCLKSOURCE_PLL_DIV1_5 PLL Clock divided by 1.5 selected as USB clock + */ +#define __HAL_RCC_USB_CONFIG(__USBCLKSource__) \ + MODIFY_REG(RCC->CFGR, RCC_CFGR_USBPRE, (uint32_t)(__USBCLKSource__)) + +/** @brief Macro to get the USB clock source. + * @retval The clock source can be one of the following values: + * @arg @ref RCC_USBCLKSOURCE_PLL PLL Clock divided by 1 selected as USB clock + * @arg @ref RCC_USBCLKSOURCE_PLL_DIV1_5 PLL Clock divided by 1.5 selected as USB clock + */ +#define __HAL_RCC_GET_USB_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_USBPRE))) +/** + * @} + */ + +#endif /* STM32F302xE || STM32F303xE || */ + /* STM32F302xC || STM32F303xC || */ + /* STM32F302x8 || */ + /* STM32F373xC */ + +#if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx) + +/** @defgroup RCCEx_I2Cx_Clock_Config RCC Extended I2Cx Clock Config + * @{ + */ +/** @brief Macro to configure the I2C3 clock (I2C3CLK). + * @param __I2C3CLKSource__ specifies the I2C3 clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_I2C3CLKSOURCE_HSI HSI selected as I2C3 clock + * @arg @ref RCC_I2C3CLKSOURCE_SYSCLK System Clock selected as I2C3 clock + */ +#define __HAL_RCC_I2C3_CONFIG(__I2C3CLKSource__) \ + MODIFY_REG(RCC->CFGR3, RCC_CFGR3_I2C3SW, (uint32_t)(__I2C3CLKSource__)) + +/** @brief Macro to get the I2C3 clock source. + * @retval The clock source can be one of the following values: + * @arg @ref RCC_I2C3CLKSOURCE_HSI HSI selected as I2C3 clock + * @arg @ref RCC_I2C3CLKSOURCE_SYSCLK System Clock selected as I2C3 clock + */ +#define __HAL_RCC_GET_I2C3_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR3, RCC_CFGR3_I2C3SW))) +/** + * @} + */ + +/** @defgroup RCCEx_TIMx_Clock_Config RCC Extended TIMx Clock Config + * @{ + */ +/** @brief Macro to configure the TIM2 clock (TIM2CLK). + * @param __TIM2CLKSource__ specifies the TIM2 clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_TIM2CLK_HCLK HCLK selected as TIM2 clock + * @arg @ref RCC_TIM2CLK_PLL PLL Clock selected as TIM2 clock + */ +#define __HAL_RCC_TIM2_CONFIG(__TIM2CLKSource__) \ + MODIFY_REG(RCC->CFGR3, RCC_CFGR3_TIM2SW, (uint32_t)(__TIM2CLKSource__)) + +/** @brief Macro to get the TIM2 clock (TIM2CLK). + * @retval The clock source can be one of the following values: + * @arg @ref RCC_TIM2CLK_HCLK HCLK selected as TIM2 clock + * @arg @ref RCC_TIM2CLK_PLL PLL Clock selected as TIM2 clock + */ +#define __HAL_RCC_GET_TIM2_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR3, RCC_CFGR3_TIM2SW))) + +/** @brief Macro to configure the TIM3 & TIM4 clock (TIM34CLK). + * @param __TIM34CLKSource__ specifies the TIM3 & TIM4 clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_TIM34CLK_HCLK HCLK selected as TIM3 & TIM4 clock + * @arg @ref RCC_TIM34CLK_PLL PLL Clock selected as TIM3 & TIM4 clock + */ +#define __HAL_RCC_TIM34_CONFIG(__TIM34CLKSource__) \ + MODIFY_REG(RCC->CFGR3, RCC_CFGR3_TIM34SW, (uint32_t)(__TIM34CLKSource__)) + +/** @brief Macro to get the TIM3 & TIM4 clock (TIM34CLK). + * @retval The clock source can be one of the following values: + * @arg @ref RCC_TIM34CLK_HCLK HCLK selected as TIM3 & TIM4 clock + * @arg @ref RCC_TIM34CLK_PLL PLL Clock selected as TIM3 & TIM4 clock + */ +#define __HAL_RCC_GET_TIM34_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR3, RCC_CFGR3_TIM34SW))) + +/** @brief Macro to configure the TIM15 clock (TIM15CLK). + * @param __TIM15CLKSource__ specifies the TIM15 clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_TIM15CLK_HCLK HCLK selected as TIM15 clock + * @arg @ref RCC_TIM15CLK_PLL PLL Clock selected as TIM15 clock + */ +#define __HAL_RCC_TIM15_CONFIG(__TIM15CLKSource__) \ + MODIFY_REG(RCC->CFGR3, RCC_CFGR3_TIM15SW, (uint32_t)(__TIM15CLKSource__)) + +/** @brief Macro to get the TIM15 clock (TIM15CLK). + * @retval The clock source can be one of the following values: + * @arg @ref RCC_TIM15CLK_HCLK HCLK selected as TIM15 clock + * @arg @ref RCC_TIM15CLK_PLL PLL Clock selected as TIM15 clock + */ +#define __HAL_RCC_GET_TIM15_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR3, RCC_CFGR3_TIM15SW))) + +/** @brief Macro to configure the TIM16 clock (TIM16CLK). + * @param __TIM16CLKSource__ specifies the TIM16 clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_TIM16CLK_HCLK HCLK selected as TIM16 clock + * @arg @ref RCC_TIM16CLK_PLL PLL Clock selected as TIM16 clock + */ +#define __HAL_RCC_TIM16_CONFIG(__TIM16CLKSource__) \ + MODIFY_REG(RCC->CFGR3, RCC_CFGR3_TIM16SW, (uint32_t)(__TIM16CLKSource__)) + +/** @brief Macro to get the TIM16 clock (TIM16CLK). + * @retval The clock source can be one of the following values: + * @arg @ref RCC_TIM16CLK_HCLK HCLK selected as TIM16 clock + * @arg @ref RCC_TIM16CLK_PLL PLL Clock selected as TIM16 clock + */ +#define __HAL_RCC_GET_TIM16_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR3, RCC_CFGR3_TIM16SW))) + +/** @brief Macro to configure the TIM17 clock (TIM17CLK). + * @param __TIM17CLKSource__ specifies the TIM17 clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_TIM17CLK_HCLK HCLK selected as TIM17 clock + * @arg @ref RCC_TIM17CLK_PLL PLL Clock selected as TIM17 clock + */ +#define __HAL_RCC_TIM17_CONFIG(__TIM17CLKSource__) \ + MODIFY_REG(RCC->CFGR3, RCC_CFGR3_TIM17SW, (uint32_t)(__TIM17CLKSource__)) + +/** @brief Macro to get the TIM17 clock (TIM17CLK). + * @retval The clock source can be one of the following values: + * @arg @ref RCC_TIM17CLK_HCLK HCLK selected as TIM17 clock + * @arg @ref RCC_TIM17CLK_PLL PLL Clock selected as TIM17 clock + */ +#define __HAL_RCC_GET_TIM17_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR3, RCC_CFGR3_TIM17SW))) + +/** + * @} + */ + +#endif /* STM32f302xE || STM32f303xE || STM32F398xx */ + +#if defined(STM32F303xE) || defined(STM32F398xx) +/** @addtogroup RCCEx_TIMx_Clock_Config RCC Extended TIMx Clock Config + * @{ + */ +/** @brief Macro to configure the TIM20 clock (TIM20CLK). + * @param __TIM20CLKSource__ specifies the TIM20 clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_TIM20CLK_HCLK HCLK selected as TIM20 clock + * @arg @ref RCC_TIM20CLK_PLL PLL Clock selected as TIM20 clock + */ +#define __HAL_RCC_TIM20_CONFIG(__TIM20CLKSource__) \ + MODIFY_REG(RCC->CFGR3, RCC_CFGR3_TIM20SW, (uint32_t)(__TIM20CLKSource__)) + +/** @brief Macro to get the TIM20 clock (TIM20CLK). + * @retval The clock source can be one of the following values: + * @arg @ref RCC_TIM20CLK_HCLK HCLK selected as TIM20 clock + * @arg @ref RCC_TIM20CLK_PLL PLL Clock selected as TIM20 clock + */ +#define __HAL_RCC_GET_TIM20_SOURCE() ((uint32_t)(READ_BIT(RCC->CFGR3, RCC_CFGR3_TIM20SW))) + +/** + * @} + */ +#endif /* STM32f303xE || STM32F398xx */ + +/** @defgroup RCCEx_LSE_Configuration LSE Drive Configuration + * @{ + */ + +/** + * @brief Macro to configure the External Low Speed oscillator (LSE) drive capability. + * @param __RCC_LSEDRIVE__ specifies the new state of the LSE drive capability. + * This parameter can be one of the following values: + * @arg @ref RCC_LSEDRIVE_LOW LSE oscillator low drive capability. + * @arg @ref RCC_LSEDRIVE_MEDIUMLOW LSE oscillator medium low drive capability. + * @arg @ref RCC_LSEDRIVE_MEDIUMHIGH LSE oscillator medium high drive capability. + * @arg @ref RCC_LSEDRIVE_HIGH LSE oscillator high drive capability. + * @retval None + */ +#define __HAL_RCC_LSEDRIVE_CONFIG(__RCC_LSEDRIVE__) (MODIFY_REG(RCC->BDCR,\ + RCC_BDCR_LSEDRV, (uint32_t)(__RCC_LSEDRIVE__) )) + +/** + * @} + */ + +/** + * @} + */ + +/* 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); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F3xx_HAL_RCC_EX_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h new file mode 100644 index 0000000..149cc17 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h @@ -0,0 +1,852 @@ +/** + ****************************************************************************** + * @file stm32f3xx_hal_spi.h + * @author MCD Application Team + * @brief Header file of SPI HAL module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef STM32F3xx_HAL_SPI_H +#define STM32F3xx_HAL_SPI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f3xx_hal_def.h" + +/** @addtogroup STM32F3xx_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 */ + + uint32_t CRCLength; /*!< Specifies the CRC Length used for the CRC calculation. + CRC Length is only used with Data8 and Data16, not other data size + This parameter can be a value of @ref SPI_CRC_length */ + + uint32_t NSSPMode; /*!< Specifies whether the NSSP signal is enabled or not . + This parameter can be a value of @ref SPI_NSSP_Mode + This mode is activated by the NSSP bit in the SPIx_CR2 register and + it takes effect only if the SPI interface is configured as Motorola SPI + master (FRF=0) with capture on the first edge (SPIx_CR1 CPHA = 0, + CPOL setting is ignored).. */ +} 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 */ + + 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 */ + + uint32_t CRCSize; /*!< SPI CRC size used for the transfer */ + + 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/FTLVL/FRLVL 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_4BIT (0x00000300U) +#define SPI_DATASIZE_5BIT (0x00000400U) +#define SPI_DATASIZE_6BIT (0x00000500U) +#define SPI_DATASIZE_7BIT (0x00000600U) +#define SPI_DATASIZE_8BIT (0x00000700U) +#define SPI_DATASIZE_9BIT (0x00000800U) +#define SPI_DATASIZE_10BIT (0x00000900U) +#define SPI_DATASIZE_11BIT (0x00000A00U) +#define SPI_DATASIZE_12BIT (0x00000B00U) +#define SPI_DATASIZE_13BIT (0x00000C00U) +#define SPI_DATASIZE_14BIT (0x00000D00U) +#define SPI_DATASIZE_15BIT (0x00000E00U) +#define SPI_DATASIZE_16BIT (0x00000F00U) +/** + * @} + */ + +/** @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_NSSP_Mode SPI NSS Pulse Mode + * @{ + */ +#define SPI_NSS_PULSE_ENABLE SPI_CR2_NSSP +#define SPI_NSS_PULSE_DISABLE (0x00000000U) +/** + * @} + */ + +/** @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_CRC_length SPI CRC Length + * @{ + * This parameter can be one of the following values: + * SPI_CRC_LENGTH_DATASIZE: aligned with the data size + * SPI_CRC_LENGTH_8BIT : CRC 8bit + * SPI_CRC_LENGTH_16BIT : CRC 16bit + */ +#define SPI_CRC_LENGTH_DATASIZE (0x00000000U) +#define SPI_CRC_LENGTH_8BIT (0x00000001U) +#define SPI_CRC_LENGTH_16BIT (0x00000002U) +/** + * @} + */ + +/** @defgroup SPI_FIFO_reception_threshold SPI FIFO Reception Threshold + * @{ + * This parameter can be one of the following values: + * SPI_RXFIFO_THRESHOLD or SPI_RXFIFO_THRESHOLD_QF : + * RXNE event is generated if the FIFO + * level is greater or equal to 1/4(8-bits). + * SPI_RXFIFO_THRESHOLD_HF: RXNE event is generated if the FIFO + * level is greater or equal to 1/2(16 bits). */ +#define SPI_RXFIFO_THRESHOLD SPI_CR2_FRXTH +#define SPI_RXFIFO_THRESHOLD_QF SPI_CR2_FRXTH +#define SPI_RXFIFO_THRESHOLD_HF (0x00000000U) +/** + * @} + */ + +/** @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_FTLVL SPI_SR_FTLVL /* SPI fifo transmission level */ +#define SPI_FLAG_FRLVL SPI_SR_FRLVL /* SPI fifo reception level */ +#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 | SPI_SR_FTLVL | SPI_SR_FRLVL) +/** + * @} + */ + +/** @defgroup SPI_transmission_fifo_status_level SPI Transmission FIFO Status Level + * @{ + */ +#define SPI_FTLVL_EMPTY (0x00000000U) +#define SPI_FTLVL_QUARTER_FULL (0x00000800U) +#define SPI_FTLVL_HALF_FULL (0x00001000U) +#define SPI_FTLVL_FULL (0x00001800U) + +/** + * @} + */ + +/** @defgroup SPI_reception_fifo_status_level SPI Reception FIFO Status Level + * @{ + */ +#define SPI_FRLVL_EMPTY (0x00000000U) +#define SPI_FRLVL_QUARTER_FULL (0x00000200U) +#define SPI_FRLVL_HALF_FULL (0x00000400U) +#define SPI_FRLVL_FULL (0x00000600U) +/** + * @} + */ + +/** + * @} + */ + +/* 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 + * @arg SPI_FLAG_FTLVL: SPI fifo transmission level + * @arg SPI_FLAG_FRLVL: SPI fifo reception level + * @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 + * @arg SPI_FLAG_FTLVL: SPI fifo transmission level + * @arg SPI_FLAG_FRLVL: SPI fifo reception level + * @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_15BIT) || \ + ((__DATASIZE__) == SPI_DATASIZE_14BIT) || \ + ((__DATASIZE__) == SPI_DATASIZE_13BIT) || \ + ((__DATASIZE__) == SPI_DATASIZE_12BIT) || \ + ((__DATASIZE__) == SPI_DATASIZE_11BIT) || \ + ((__DATASIZE__) == SPI_DATASIZE_10BIT) || \ + ((__DATASIZE__) == SPI_DATASIZE_9BIT) || \ + ((__DATASIZE__) == SPI_DATASIZE_8BIT) || \ + ((__DATASIZE__) == SPI_DATASIZE_7BIT) || \ + ((__DATASIZE__) == SPI_DATASIZE_6BIT) || \ + ((__DATASIZE__) == SPI_DATASIZE_5BIT) || \ + ((__DATASIZE__) == SPI_DATASIZE_4BIT)) + +/** @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 NSS Pulse parameter is in allowed range. + * @param __NSSP__ specifies the SPI NSS Pulse Mode parameter. + * This parameter can be a value of @ref SPI_NSSP_Mode + * @retval None + */ +#define IS_SPI_NSSP(__NSSP__) (((__NSSP__) == SPI_NSS_PULSE_ENABLE) || \ + ((__NSSP__) == SPI_NSS_PULSE_DISABLE)) + +/** @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 CRC length is in allowed range. + * @param __LENGTH__ specifies the SPI CRC length. + * This parameter can be a value of @ref SPI_CRC_length + * @retval None + */ +#define IS_SPI_CRC_LENGTH(__LENGTH__) (((__LENGTH__) == SPI_CRC_LENGTH_DATASIZE) || \ + ((__LENGTH__) == SPI_CRC_LENGTH_8BIT) || \ + ((__LENGTH__) == SPI_CRC_LENGTH_16BIT)) + +/** @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) + +/** + * @} + */ + +/* Include SPI HAL Extended module */ +#include "stm32f3xx_hal_spi_ex.h" + +/* 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, 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, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, + uint32_t Timeout); +HAL_StatusTypeDef HAL_SPI_Transmit_IT(SPI_HandleTypeDef *hspi, 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, uint8_t *pTxData, uint8_t *pRxData, + uint16_t Size); +HAL_StatusTypeDef HAL_SPI_Transmit_DMA(SPI_HandleTypeDef *hspi, 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, 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(SPI_HandleTypeDef *hspi); +uint32_t HAL_SPI_GetError(SPI_HandleTypeDef *hspi); +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* STM32F3xx_HAL_SPI_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h new file mode 100644 index 0000000..8f72788 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h @@ -0,0 +1,75 @@ +/** + ****************************************************************************** + * @file stm32f3xx_hal_spi_ex.h + * @author MCD Application Team + * @brief Header file of SPI HAL Extended module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef STM32F3xx_HAL_SPI_EX_H +#define STM32F3xx_HAL_SPI_EX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f3xx_hal_def.h" + +/** @addtogroup STM32F3xx_HAL_Driver + * @{ + */ + +/** @addtogroup SPIEx + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macros -----------------------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup SPIEx_Exported_Functions + * @{ + */ + +/* Initialization and de-initialization functions ****************************/ +/* IO operation functions *****************************************************/ +/** @addtogroup SPIEx_Exported_Functions_Group1 + * @{ + */ +HAL_StatusTypeDef HAL_SPIEx_FlushRxFifo(SPI_HandleTypeDef *hspi); +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* STM32F3xx_HAL_SPI_EX_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_tim.h b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_tim.h new file mode 100644 index 0000000..aa6a7ea --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_tim.h @@ -0,0 +1,2533 @@ +/** + ****************************************************************************** + * @file stm32f3xx_hal_tim.h + * @author MCD Application Team + * @brief Header file of TIM HAL module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef STM32F3xx_HAL_TIM_H +#define STM32F3xx_HAL_TIM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f3xx_hal_def.h" + +/** @addtogroup STM32F3xx_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 + * @note Advanced timers provide TRGO2 internal line which is redirected + * to the ADC + */ +typedef struct +{ + uint32_t MasterOutputTrigger; /*!< Trigger output (TRGO) selection + This parameter can be a value of @ref TIM_Master_Mode_Selection */ +#if defined(TIM_CR2_MMS2) + uint32_t MasterOutputTrigger2; /*!< Trigger output2 (TRGO2) selection + This parameter can be a value of @ref TIM_Master_Mode_Selection_2 */ +#endif /* TIM_CR2_MMS2 */ + 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 */ + +#if defined(TIM_BDTR_BK2E) + uint32_t Break2State; /*!< TIM Break2 State, This parameter can be a value of @ref TIM_Break2_Input_enable_disable */ + + uint32_t Break2Polarity; /*!< TIM Break2 input polarity, This parameter can be a value of @ref TIM_Break2_Polarity */ + + uint32_t Break2Filter; /*!< TIM break2 input filter.This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ + +#endif /*TIM_BDTR_BK2E */ + 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 */ +#if defined(TIM_CCER_CC5E) + HAL_TIM_ACTIVE_CHANNEL_5 = 0x10U, /*!< The active channel is 5 */ +#endif /* TIM_CCER_CC5E */ +#if defined(TIM_CCER_CC6E) + HAL_TIM_ACTIVE_CHANNEL_6 = 0x20U, /*!< The active channel is 6 */ +#endif /* TIM_CCER_CC6E */ + 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[6]; /*!< 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 */ +#if defined(TIM_BDTR_BK2E) + void (* Break2Callback)(struct __TIM_HandleTypeDef *htim); /*!< TIM Break2 Callback */ +#endif /* */ +#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 */ +#if defined(TIM_BDTR_BK2E) + , HAL_TIM_BREAK2_CB_ID = 0x1BU /*!< TIM Break2 Callback ID */ +#endif /* TIM_BDTR_BK2E */ +} 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 */ +#if defined(TIM_SMCR_OCCS) +#define TIM_CLEARINPUTSOURCE_OCREFCLR 0x00000002U /*!< OCREF_CLR is connected to OCREF_CLR_INT */ +#endif /* TIM_SMCR_OCCS */ +/** + * @} + */ + +/** @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 +#define TIM_DMABASE_OR 0x00000014U +#if defined(TIM_CCER_CC5E) && defined(TIM_CCER_CC6E) +#define TIM_DMABASE_CCMR3 0x00000015U +#define TIM_DMABASE_CCR5 0x00000016U +#define TIM_DMABASE_CCR6 0x00000017U +#endif /* TIM_CCER_CC5E && TIM_CCER_CC6E */ +/** + * @} + */ + +/** @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 */ +#if defined(TIM_EGR_B2G) +#define TIM_EVENTSOURCE_BREAK2 TIM_EGR_B2G /*!< A break 2 event is generated */ +#endif /* TIM_EGR_B2G */ +/** + * @} + */ + +/** @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 */ +/** + * @} + */ + +#if defined(TIM_CR1_UIFREMAP) +/** @defgroup TIM_Update_Interrupt_Flag_Remap TIM Update Interrupt Flag Remap + * @{ + */ +#define TIM_UIFREMAP_DISABLE 0x00000000U /*!< Update interrupt flag remap disabled */ +#define TIM_UIFREMAP_ENABLE TIM_CR1_UIFREMAP /*!< Update interrupt flag remap enabled */ +/** + * @} + */ + +#endif /* TIM_CR1_UIFREMAP */ +/** @defgroup TIM_ClockDivision TIM Clock Division + * @{ + */ +#define TIM_CLOCKDIVISION_DIV1 0x00000000U /*!< Clock division: tDTS=tCK_INT */ +#define TIM_CLOCKDIVISION_DIV2 TIM_CR1_CKD_0 /*!< Clock division: tDTS=2*tCK_INT */ +#define TIM_CLOCKDIVISION_DIV4 TIM_CR1_CKD_1 /*!< Clock division: tDTS=4*tCK_INT */ +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_State TIM Output Compare State + * @{ + */ +#define TIM_OUTPUTSTATE_DISABLE 0x00000000U /*!< Capture/Compare 1 output disabled */ +#define TIM_OUTPUTSTATE_ENABLE TIM_CCER_CC1E /*!< Capture/Compare 1 output enabled */ +/** + * @} + */ + +/** @defgroup TIM_AutoReloadPreload TIM Auto-Reload Preload + * @{ + */ +#define TIM_AUTORELOAD_PRELOAD_DISABLE 0x00000000U /*!< TIMx_ARR register is not buffered */ +#define TIM_AUTORELOAD_PRELOAD_ENABLE TIM_CR1_ARPE /*!< TIMx_ARR register is buffered */ + +/** + * @} + */ + +/** @defgroup TIM_Output_Fast_State TIM Output Fast State + * @{ + */ +#define TIM_OCFAST_DISABLE 0x00000000U /*!< Output Compare fast disable */ +#define TIM_OCFAST_ENABLE TIM_CCMR1_OC1FE /*!< Output Compare fast enable */ +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_N_State TIM Complementary Output Compare State + * @{ + */ +#define TIM_OUTPUTNSTATE_DISABLE 0x00000000U /*!< OCxN is disabled */ +#define TIM_OUTPUTNSTATE_ENABLE TIM_CCER_CC1NE /*!< OCxN is enabled */ +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_Polarity TIM Output Compare Polarity + * @{ + */ +#define TIM_OCPOLARITY_HIGH 0x00000000U /*!< Capture/Compare output polarity */ +#define TIM_OCPOLARITY_LOW TIM_CCER_CC1P /*!< Capture/Compare output polarity */ +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_N_Polarity TIM Complementary Output Compare Polarity + * @{ + */ +#define TIM_OCNPOLARITY_HIGH 0x00000000U /*!< Capture/Compare complementary output polarity */ +#define TIM_OCNPOLARITY_LOW TIM_CCER_CC1NP /*!< Capture/Compare complementary output polarity */ +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_Idle_State TIM Output Compare Idle State + * @{ + */ +#define TIM_OCIDLESTATE_SET TIM_CR2_OIS1 /*!< Output Idle state: OCx=1 when MOE=0 */ +#define TIM_OCIDLESTATE_RESET 0x00000000U /*!< Output Idle state: OCx=0 when MOE=0 */ +/** + * @} + */ + +/** @defgroup TIM_Output_Compare_N_Idle_State TIM Complementary Output Compare Idle State + * @{ + */ +#define TIM_OCNIDLESTATE_SET TIM_CR2_OIS1N /*!< Complementary output Idle state: OCxN=1 when MOE=0 */ +#define TIM_OCNIDLESTATE_RESET 0x00000000U /*!< Complementary output Idle state: OCxN=0 when MOE=0 */ +/** + * @} + */ + +/** @defgroup TIM_Input_Capture_Polarity TIM Input Capture Polarity + * @{ + */ +#define TIM_ICPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Capture triggered by rising edge on timer input */ +#define TIM_ICPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Capture triggered by falling edge on timer input */ +#define TIM_ICPOLARITY_BOTHEDGE TIM_INPUTCHANNELPOLARITY_BOTHEDGE /*!< Capture triggered by both rising and falling edges on timer input*/ +/** + * @} + */ + +/** @defgroup TIM_Encoder_Input_Polarity TIM Encoder Input Polarity + * @{ + */ +#define TIM_ENCODERINPUTPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Encoder input with rising edge polarity */ +#define TIM_ENCODERINPUTPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Encoder input with falling edge polarity */ +/** + * @} + */ + +/** @defgroup TIM_Input_Capture_Selection TIM Input Capture Selection + * @{ + */ +#define TIM_ICSELECTION_DIRECTTI TIM_CCMR1_CC1S_0 /*!< TIM Input 1, 2, 3 or 4 is selected to be connected to IC1, IC2, IC3 or IC4, respectively */ +#define TIM_ICSELECTION_INDIRECTTI TIM_CCMR1_CC1S_1 /*!< TIM Input 1, 2, 3 or 4 is selected to be connected to IC2, IC1, IC4 or IC3, respectively */ +#define TIM_ICSELECTION_TRC TIM_CCMR1_CC1S /*!< TIM Input 1, 2, 3 or 4 is selected to be connected to TRC */ +/** + * @} + */ + +/** @defgroup TIM_Input_Capture_Prescaler TIM Input Capture Prescaler + * @{ + */ +#define TIM_ICPSC_DIV1 0x00000000U /*!< Capture performed each time an edge is detected on the capture input */ +#define TIM_ICPSC_DIV2 TIM_CCMR1_IC1PSC_0 /*!< Capture performed once every 2 events */ +#define TIM_ICPSC_DIV4 TIM_CCMR1_IC1PSC_1 /*!< Capture performed once every 4 events */ +#define TIM_ICPSC_DIV8 TIM_CCMR1_IC1PSC /*!< Capture performed once every 8 events */ +/** + * @} + */ + +/** @defgroup TIM_One_Pulse_Mode TIM One Pulse Mode + * @{ + */ +#define TIM_OPMODE_SINGLE TIM_CR1_OPM /*!< Counter stops counting at the next update event */ +#define TIM_OPMODE_REPETITIVE 0x00000000U /*!< Counter is not stopped at update event */ +/** + * @} + */ + +/** @defgroup TIM_Encoder_Mode TIM Encoder Mode + * @{ + */ +#define TIM_ENCODERMODE_TI1 TIM_SMCR_SMS_0 /*!< Quadrature encoder mode 1, x2 mode, counts up/down on TI1FP1 edge depending on TI2FP2 level */ +#define TIM_ENCODERMODE_TI2 TIM_SMCR_SMS_1 /*!< Quadrature encoder mode 2, x2 mode, counts up/down on TI2FP2 edge depending on TI1FP1 level. */ +#define TIM_ENCODERMODE_TI12 (TIM_SMCR_SMS_1 | TIM_SMCR_SMS_0) /*!< Quadrature encoder mode 3, x4 mode, counts up/down on both TI1FP1 and TI2FP2 edges depending on the level of the other input. */ +/** + * @} + */ + +/** @defgroup TIM_Interrupt_definition TIM interrupt Definition + * @{ + */ +#define TIM_IT_UPDATE TIM_DIER_UIE /*!< Update interrupt */ +#define TIM_IT_CC1 TIM_DIER_CC1IE /*!< Capture/Compare 1 interrupt */ +#define TIM_IT_CC2 TIM_DIER_CC2IE /*!< Capture/Compare 2 interrupt */ +#define TIM_IT_CC3 TIM_DIER_CC3IE /*!< Capture/Compare 3 interrupt */ +#define TIM_IT_CC4 TIM_DIER_CC4IE /*!< Capture/Compare 4 interrupt */ +#define TIM_IT_COM TIM_DIER_COMIE /*!< Commutation interrupt */ +#define TIM_IT_TRIGGER TIM_DIER_TIE /*!< Trigger interrupt */ +#define TIM_IT_BREAK TIM_DIER_BIE /*!< Break interrupt */ +/** + * @} + */ + +/** @defgroup TIM_Commutation_Source TIM Commutation Source + * @{ + */ +#define TIM_COMMUTATION_TRGI TIM_CR2_CCUS /*!< When Capture/compare control bits are preloaded, they are updated by setting the COMG bit or when an rising edge occurs on trigger input */ +#define TIM_COMMUTATION_SOFTWARE 0x00000000U /*!< When Capture/compare control bits are preloaded, they are updated by setting the COMG bit */ +/** + * @} + */ + +/** @defgroup TIM_DMA_sources TIM DMA Sources + * @{ + */ +#define TIM_DMA_UPDATE TIM_DIER_UDE /*!< DMA request is triggered by the update event */ +#define TIM_DMA_CC1 TIM_DIER_CC1DE /*!< DMA request is triggered by the capture/compare macth 1 event */ +#define TIM_DMA_CC2 TIM_DIER_CC2DE /*!< DMA request is triggered by the capture/compare macth 2 event event */ +#define TIM_DMA_CC3 TIM_DIER_CC3DE /*!< DMA request is triggered by the capture/compare macth 3 event event */ +#define TIM_DMA_CC4 TIM_DIER_CC4DE /*!< DMA request is triggered by the capture/compare macth 4 event event */ +#define TIM_DMA_COM TIM_DIER_COMDE /*!< DMA request is triggered by the commutation event */ +#define TIM_DMA_TRIGGER TIM_DIER_TDE /*!< DMA request is triggered by the trigger event */ +/** + * @} + */ + +/** @defgroup TIM_Flag_definition TIM Flag Definition + * @{ + */ +#define TIM_FLAG_UPDATE TIM_SR_UIF /*!< Update interrupt flag */ +#define TIM_FLAG_CC1 TIM_SR_CC1IF /*!< Capture/Compare 1 interrupt flag */ +#define TIM_FLAG_CC2 TIM_SR_CC2IF /*!< Capture/Compare 2 interrupt flag */ +#define TIM_FLAG_CC3 TIM_SR_CC3IF /*!< Capture/Compare 3 interrupt flag */ +#define TIM_FLAG_CC4 TIM_SR_CC4IF /*!< Capture/Compare 4 interrupt flag */ +#if defined(TIM_SR_CC5IF) +#define TIM_FLAG_CC5 TIM_SR_CC5IF /*!< Capture/Compare 5 interrupt flag */ +#endif /* TIM_SR_CC5IF */ +#if defined(TIM_SR_CC6IF) +#define TIM_FLAG_CC6 TIM_SR_CC6IF /*!< Capture/Compare 6 interrupt flag */ +#endif /* TIM_SR_CC6IF */ +#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 */ +#if defined(TIM_SR_B2IF) +#define TIM_FLAG_BREAK2 TIM_SR_B2IF /*!< Break 2 interrupt flag */ +#endif /* TIM_SR_B2IF */ +#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 */ +#if defined(TIM_CCER_CC5E) +#define TIM_CHANNEL_5 0x00000010U /*!< Compare channel 5 identifier */ +#endif /* TIM_CCER_CC5E */ +#if defined(TIM_CCER_CC6E) +#define TIM_CHANNEL_6 0x00000014U /*!< Compare channel 6 identifier */ +#endif /* TIM_CCER_CC6E */ +#define TIM_CHANNEL_ALL 0x0000003CU /*!< Global Capture/compare channel identifier */ +/** + * @} + */ + +/** @defgroup TIM_Clock_Source TIM Clock Source + * @{ + */ +#define TIM_CLOCKSOURCE_ETRMODE2 TIM_SMCR_ETPS_1 /*!< External clock source mode 2 */ +#define TIM_CLOCKSOURCE_INTERNAL TIM_SMCR_ETPS_0 /*!< Internal clock source */ +#define TIM_CLOCKSOURCE_ITR0 TIM_TS_ITR0 /*!< External clock source mode 1 (ITR0) */ +#define TIM_CLOCKSOURCE_ITR1 TIM_TS_ITR1 /*!< External clock source mode 1 (ITR1) */ +#define TIM_CLOCKSOURCE_ITR2 TIM_TS_ITR2 /*!< External clock source mode 1 (ITR2) */ +#define TIM_CLOCKSOURCE_ITR3 TIM_TS_ITR3 /*!< External clock source mode 1 (ITR3) */ +#define TIM_CLOCKSOURCE_TI1ED TIM_TS_TI1F_ED /*!< External clock source mode 1 (TTI1FP1 + edge detect.) */ +#define TIM_CLOCKSOURCE_TI1 TIM_TS_TI1FP1 /*!< External clock source mode 1 (TTI1FP1) */ +#define TIM_CLOCKSOURCE_TI2 TIM_TS_TI2FP2 /*!< External clock source mode 1 (TTI2FP2) */ +#define TIM_CLOCKSOURCE_ETRMODE1 TIM_TS_ETRF /*!< External clock source mode 1 (ETRF) */ +/** + * @} + */ + +/** @defgroup TIM_Clock_Polarity TIM Clock Polarity + * @{ + */ +#define TIM_CLOCKPOLARITY_INVERTED TIM_ETRPOLARITY_INVERTED /*!< Polarity for ETRx clock sources */ +#define TIM_CLOCKPOLARITY_NONINVERTED TIM_ETRPOLARITY_NONINVERTED /*!< Polarity for ETRx clock sources */ +#define TIM_CLOCKPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Polarity for TIx clock sources */ +#define TIM_CLOCKPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Polarity for TIx clock sources */ +#define TIM_CLOCKPOLARITY_BOTHEDGE TIM_INPUTCHANNELPOLARITY_BOTHEDGE /*!< Polarity for TIx clock sources */ +/** + * @} + */ + +/** @defgroup TIM_Clock_Prescaler TIM Clock Prescaler + * @{ + */ +#define TIM_CLOCKPRESCALER_DIV1 TIM_ETRPRESCALER_DIV1 /*!< No prescaler is used */ +#define TIM_CLOCKPRESCALER_DIV2 TIM_ETRPRESCALER_DIV2 /*!< Prescaler for External ETR Clock: Capture performed once every 2 events. */ +#define TIM_CLOCKPRESCALER_DIV4 TIM_ETRPRESCALER_DIV4 /*!< Prescaler for External ETR Clock: Capture performed once every 4 events. */ +#define TIM_CLOCKPRESCALER_DIV8 TIM_ETRPRESCALER_DIV8 /*!< Prescaler for External ETR Clock: Capture performed once every 8 events. */ +/** + * @} + */ + +/** @defgroup TIM_ClearInput_Polarity TIM Clear Input Polarity + * @{ + */ +#define TIM_CLEARINPUTPOLARITY_INVERTED TIM_ETRPOLARITY_INVERTED /*!< Polarity for ETRx pin */ +#define TIM_CLEARINPUTPOLARITY_NONINVERTED TIM_ETRPOLARITY_NONINVERTED /*!< Polarity for ETRx pin */ +/** + * @} + */ + +/** @defgroup TIM_ClearInput_Prescaler TIM Clear Input Prescaler + * @{ + */ +#define TIM_CLEARINPUTPRESCALER_DIV1 TIM_ETRPRESCALER_DIV1 /*!< No prescaler is used */ +#define TIM_CLEARINPUTPRESCALER_DIV2 TIM_ETRPRESCALER_DIV2 /*!< Prescaler for External ETR pin: Capture performed once every 2 events. */ +#define TIM_CLEARINPUTPRESCALER_DIV4 TIM_ETRPRESCALER_DIV4 /*!< Prescaler for External ETR pin: Capture performed once every 4 events. */ +#define TIM_CLEARINPUTPRESCALER_DIV8 TIM_ETRPRESCALER_DIV8 /*!< Prescaler for External ETR pin: Capture performed once every 8 events. */ +/** + * @} + */ + +/** @defgroup TIM_OSSR_Off_State_Selection_for_Run_mode_state TIM OSSR OffState Selection for Run mode state + * @{ + */ +#define TIM_OSSR_ENABLE TIM_BDTR_OSSR /*!< When inactive, OC/OCN outputs are enabled (still controlled by the timer) */ +#define TIM_OSSR_DISABLE 0x00000000U /*!< When inactive, OC/OCN outputs are disabled (not controlled any longer by the timer) */ +/** + * @} + */ + +/** @defgroup TIM_OSSI_Off_State_Selection_for_Idle_mode_state TIM OSSI OffState Selection for Idle mode state + * @{ + */ +#define TIM_OSSI_ENABLE TIM_BDTR_OSSI /*!< When inactive, OC/OCN outputs are enabled (still controlled by the timer) */ +#define TIM_OSSI_DISABLE 0x00000000U /*!< When inactive, OC/OCN outputs are disabled (not controlled any longer by the timer) */ +/** + * @} + */ +/** @defgroup TIM_Lock_level TIM Lock level + * @{ + */ +#define TIM_LOCKLEVEL_OFF 0x00000000U /*!< LOCK OFF */ +#define TIM_LOCKLEVEL_1 TIM_BDTR_LOCK_0 /*!< LOCK Level 1 */ +#define TIM_LOCKLEVEL_2 TIM_BDTR_LOCK_1 /*!< LOCK Level 2 */ +#define TIM_LOCKLEVEL_3 TIM_BDTR_LOCK /*!< LOCK Level 3 */ +/** + * @} + */ + +/** @defgroup TIM_Break_Input_enable_disable TIM Break Input Enable + * @{ + */ +#define TIM_BREAK_ENABLE TIM_BDTR_BKE /*!< Break input BRK is enabled */ +#define TIM_BREAK_DISABLE 0x00000000U /*!< Break input BRK is disabled */ +/** + * @} + */ + +/** @defgroup TIM_Break_Polarity TIM Break Input Polarity + * @{ + */ +#define TIM_BREAKPOLARITY_LOW 0x00000000U /*!< Break input BRK is active low */ +#define TIM_BREAKPOLARITY_HIGH TIM_BDTR_BKP /*!< Break input BRK is active high */ +/** + * @} + */ + +#if defined(TIM_BDTR_BK2E) +/** @defgroup TIM_Break2_Input_enable_disable TIM Break input 2 Enable + * @{ + */ +#define TIM_BREAK2_DISABLE 0x00000000U /*!< Break input BRK2 is disabled */ +#define TIM_BREAK2_ENABLE TIM_BDTR_BK2E /*!< Break input BRK2 is enabled */ +/** + * @} + */ + +/** @defgroup TIM_Break2_Polarity TIM Break Input 2 Polarity + * @{ + */ +#define TIM_BREAK2POLARITY_LOW 0x00000000U /*!< Break input BRK2 is active low */ +#define TIM_BREAK2POLARITY_HIGH TIM_BDTR_BK2P /*!< Break input BRK2 is active high */ +/** + * @} + */ +#endif /* TIM_BDTR_BK2E */ + +/** @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) */ +/** + * @} + */ + +#if defined(TIM_CCR5_CCR5) +/** @defgroup TIM_Group_Channel5 TIM Group Channel 5 and Channel 1, 2 or 3 + * @{ + */ +#define TIM_GROUPCH5_NONE 0x00000000U /*!< No effect of OC5REF on OC1REFC, OC2REFC and OC3REFC */ +#define TIM_GROUPCH5_OC1REFC TIM_CCR5_GC5C1 /*!< OC1REFC is the logical AND of OC1REFC and OC5REF */ +#define TIM_GROUPCH5_OC2REFC TIM_CCR5_GC5C2 /*!< OC2REFC is the logical AND of OC2REFC and OC5REF */ +#define TIM_GROUPCH5_OC3REFC TIM_CCR5_GC5C3 /*!< OC3REFC is the logical AND of OC3REFC and OC5REF */ +/** + * @} + */ +#endif /* TIM_CCR5_CCR5 */ + +/** @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) */ +/** + * @} + */ + +#if defined(TIM_CR2_MMS2) +/** @defgroup TIM_Master_Mode_Selection_2 TIM Master Mode Selection 2 (TRGO2) + * @{ + */ +#define TIM_TRGO2_RESET 0x00000000U /*!< TIMx_EGR.UG bit is used as trigger output (TRGO2) */ +#define TIM_TRGO2_ENABLE TIM_CR2_MMS2_0 /*!< TIMx_CR1.CEN bit is used as trigger output (TRGO2) */ +#define TIM_TRGO2_UPDATE TIM_CR2_MMS2_1 /*!< Update event is used as trigger output (TRGO2) */ +#define TIM_TRGO2_OC1 (TIM_CR2_MMS2_1 | TIM_CR2_MMS2_0) /*!< Capture or a compare match 1 is used as trigger output (TRGO2) */ +#define TIM_TRGO2_OC1REF TIM_CR2_MMS2_2 /*!< OC1REF signal is used as trigger output (TRGO2) */ +#define TIM_TRGO2_OC2REF (TIM_CR2_MMS2_2 | TIM_CR2_MMS2_0) /*!< OC2REF signal is used as trigger output (TRGO2) */ +#define TIM_TRGO2_OC3REF (TIM_CR2_MMS2_2 | TIM_CR2_MMS2_1) /*!< OC3REF signal is used as trigger output (TRGO2) */ +#define TIM_TRGO2_OC4REF (TIM_CR2_MMS2_2 | TIM_CR2_MMS2_1 | TIM_CR2_MMS2_0) /*!< OC4REF signal is used as trigger output (TRGO2) */ +#define TIM_TRGO2_OC5REF TIM_CR2_MMS2_3 /*!< OC5REF signal is used as trigger output (TRGO2) */ +#define TIM_TRGO2_OC6REF (TIM_CR2_MMS2_3 | TIM_CR2_MMS2_0) /*!< OC6REF signal is used as trigger output (TRGO2) */ +#define TIM_TRGO2_OC4REF_RISINGFALLING (TIM_CR2_MMS2_3 | TIM_CR2_MMS2_1) /*!< OC4REF rising or falling edges generate pulses on TRGO2 */ +#define TIM_TRGO2_OC6REF_RISINGFALLING (TIM_CR2_MMS2_3 | TIM_CR2_MMS2_1 | TIM_CR2_MMS2_0) /*!< OC6REF rising or falling edges generate pulses on TRGO2 */ +#define TIM_TRGO2_OC4REF_RISING_OC6REF_RISING (TIM_CR2_MMS2_3 | TIM_CR2_MMS2_2) /*!< OC4REF or OC6REF rising edges generate pulses on TRGO2 */ +#define TIM_TRGO2_OC4REF_RISING_OC6REF_FALLING (TIM_CR2_MMS2_3 | TIM_CR2_MMS2_2 | TIM_CR2_MMS2_0) /*!< OC4REF rising or OC6REF falling edges generate pulses on TRGO2 */ +#define TIM_TRGO2_OC5REF_RISING_OC6REF_RISING (TIM_CR2_MMS2_3 | TIM_CR2_MMS2_2 |TIM_CR2_MMS2_1) /*!< OC5REF or OC6REF rising edges generate pulses on TRGO2 */ +#define TIM_TRGO2_OC5REF_RISING_OC6REF_FALLING (TIM_CR2_MMS2_3 | TIM_CR2_MMS2_2 | TIM_CR2_MMS2_1 | TIM_CR2_MMS2_0) /*!< OC5REF or OC6REF rising edges generate pulses on TRGO2 */ +/** + * @} + */ +#endif /* TIM_CR2_MMS2 */ + +/** @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 */ +#if defined (TIM_SMCR_SMS_3) +#define TIM_SLAVEMODE_COMBINED_RESETTRIGGER TIM_SMCR_SMS_3 /*!< Combined reset + trigger mode */ +#endif /* TIM_SMCR_SMS_3 */ +/** + * @} + */ + +/** @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 */ +#if defined(TIM_CCMR1_OC1M_3) +#define TIM_OCMODE_RETRIGERRABLE_OPM1 TIM_CCMR1_OC1M_3 /*!< Retrigerrable OPM mode 1 */ +#define TIM_OCMODE_RETRIGERRABLE_OPM2 (TIM_CCMR1_OC1M_3 | TIM_CCMR1_OC1M_0) /*!< Retrigerrable OPM mode 2 */ +#define TIM_OCMODE_COMBINED_PWM1 (TIM_CCMR1_OC1M_3 | TIM_CCMR1_OC1M_2) /*!< Combined PWM mode 1 */ +#define TIM_OCMODE_COMBINED_PWM2 (TIM_CCMR1_OC1M_3 | TIM_CCMR1_OC1M_0 | TIM_CCMR1_OC1M_2) /*!< Combined PWM mode 2 */ +#define TIM_OCMODE_ASSYMETRIC_PWM1 (TIM_CCMR1_OC1M_3 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2) /*!< Asymmetric PWM mode 1 */ +#define TIM_OCMODE_ASSYMETRIC_PWM2 TIM_CCMR1_OC1M /*!< Asymmetric PWM mode 2 */ +#endif /* TIM_CCMR1_OC1M_3 */ +/** + * @} + */ + +/** @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__)->ChannelState[4] = HAL_TIM_CHANNEL_STATE_RESET; \ + (__HANDLE__)->ChannelState[5] = 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__)->ChannelState[4] = HAL_TIM_CHANNEL_STATE_RESET; \ + (__HANDLE__)->ChannelState[5] = 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_CC5: Capture/Compare 5 interrupt flag (*) + * @arg TIM_FLAG_CC5: Capture/Compare 6 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_BREAK2: Break 2 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 + * (*) Value not defined for all devices + * @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_CC5: Capture/Compare 5 interrupt flag (*) + * @arg TIM_FLAG_CC5: Capture/Compare 6 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_BREAK2: Break 2 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 + * (*) Value not defined for all devices + * @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__)) +#if defined(TIM_CR1_UIFREMAP) + +/** + * @brief Force a continuous copy of the update interrupt flag (UIF) into the timer counter register (bit 31). + * @note This allows both the counter value and a potential roll-over condition signalled by the UIFCPY flag to be read + * in an atomic way. + * @param __HANDLE__ TIM handle. + * @retval None +mode. + */ +#define __HAL_TIM_UIFREMAP_ENABLE(__HANDLE__) (((__HANDLE__)->Instance->CR1 |= TIM_CR1_UIFREMAP)) + +/** + * @brief Disable update interrupt flag (UIF) remapping. + * @param __HANDLE__ TIM handle. + * @retval None +mode. + */ +#define __HAL_TIM_UIFREMAP_DISABLE(__HANDLE__) (((__HANDLE__)->Instance->CR1 &= ~TIM_CR1_UIFREMAP)) + +/** + * @brief Get update interrupt flag (UIF) copy status. + * @param __COUNTER__ Counter value. + * @retval The state of UIFCPY (TRUE or FALSE). +mode. + */ +#define __HAL_TIM_GET_UIFCPY(__COUNTER__) (((__COUNTER__) & (TIM_CNT_UIFCPY)) == (TIM_CNT_UIFCPY)) +#endif /* TIM_CR1_UIFREMAP */ + +/** + * @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. + * Note Please check if the bit 31 of CNT register is used as UIF copy or not, this may affect the counter range in + * case of 32 bits counter TIM instance. + * Bit 31 of CNT can be enabled/disabled using __HAL_TIM_UIFREMAP_ENABLE()/__HAL_TIM_UIFREMAP_DISABLE() macros. + * @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 + * @arg TIM_CHANNEL_5: TIM Channel 5 selected (*) + * @arg TIM_CHANNEL_6: TIM Channel 6 selected (*) + * (*) Value not defined for all devices + * @param __COMPARE__ specifies the Capture Compare register new value. + * @retval None + */ +#if defined(TIM_CCER_CC5E) && defined(TIM_CCER_CC6E) +#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__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCR4 = (__COMPARE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCR5 = (__COMPARE__)) :\ + ((__HANDLE__)->Instance->CCR6 = (__COMPARE__))) +#else +#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__))) +#endif /* TIM_CCER_CC5E && TIM_CCER_CC6E */ + +/** + * @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 + * @arg TIM_CHANNEL_5: get capture/compare 5 register value (*) + * @arg TIM_CHANNEL_6: get capture/compare 6 register value (*) + * (*) Value not defined for all devices + * @retval 16-bit or 32-bit value of the capture/compare register (TIMx_CCRy) + */ +#if defined(TIM_CCER_CC5E) && defined(TIM_CCER_CC6E) +#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) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCR4) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCR5) :\ + ((__HANDLE__)->Instance->CCR6)) +#else +#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)) +#endif /* TIM_CCER_CC5E && TIM_CCER_CC6E */ + +/** + * @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 + * @arg TIM_CHANNEL_5: TIM Channel 5 selected (*) + * @arg TIM_CHANNEL_6: TIM Channel 6 selected (*) + * (*) Value not defined for all devices + * @retval None + */ +#if defined(TIM_CCER_CC5E) && defined(TIM_CCER_CC6E) +#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) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC5PE) :\ + ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC6PE)) +#else +#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)) +#endif /* TIM_CCER_CC5E && TIM_CCER_CC6E */ + +/** + * @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 + * @arg TIM_CHANNEL_5: TIM Channel 5 selected (*) + * @arg TIM_CHANNEL_6: TIM Channel 6 selected (*) + * (*) Value not defined for all devices + * @retval None + */ +#if defined(TIM_CCER_CC5E) && defined(TIM_CCER_CC6E) +#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) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC4PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 &= ~TIM_CCMR3_OC5PE) :\ + ((__HANDLE__)->Instance->CCMR3 &= ~TIM_CCMR3_OC6PE)) +#else +#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)) +#endif /* TIM_CCER_CC5E && TIM_CCER_CC6E */ + +/** + * @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 + * @arg TIM_CHANNEL_5: TIM Channel 5 selected (*) + * @arg TIM_CHANNEL_6: TIM Channel 6 selected (*) + * (*) Value not defined for all devices + * @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 + */ +#if defined(TIM_CCER_CC5E) && defined(TIM_CCER_CC6E) +#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) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC5FE) :\ + ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC6FE)) +#else +#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)) +#endif /* TIM_CCER_CC5E && TIM_CCER_CC6E */ + +/** + * @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 + * @arg TIM_CHANNEL_5: TIM Channel 5 selected (*) + * @arg TIM_CHANNEL_6: TIM Channel 6 selected (*) + * (*) Value not defined for all devices + * @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 + */ +#if defined(TIM_CCER_CC5E) && defined(TIM_CCER_CC6E) +#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) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC4FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 &= ~TIM_CCMR3_OC5FE) :\ + ((__HANDLE__)->Instance->CCMR3 &= ~TIM_CCMR3_OC6FE)) +#else +#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)) +#endif /* TIM_CCER_CC5E && TIM_CCER_CC6E */ + +/** + * @brief Set the Update Request Source (URS) bit of the TIMx_CR1 register. + * @param __HANDLE__ TIM handle. + * @note When the URS bit of the TIMx_CR1 register is set, only counter + * overflow/underflow generates an update interrupt or DMA request (if + * enabled) + * @retval None + */ +#define __HAL_TIM_URS_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1|= TIM_CR1_URS) + +/** + * @brief Reset the Update Request Source (URS) bit of the TIMx_CR1 register. + * @param __HANDLE__ TIM handle. + * @note When the URS bit of the TIMx_CR1 register is reset, any of the + * following events generate an update interrupt or DMA request (if + * enabled): + * _ Counter overflow underflow + * _ Setting the UG bit + * _ Update generation through the slave mode controller + * @retval None + */ +#define __HAL_TIM_URS_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1&=~TIM_CR1_URS) + +/** + * @brief Set the TIM Capture x input polarity on runtime. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @param __POLARITY__ Polarity for TIx source + * @arg TIM_INPUTCHANNELPOLARITY_RISING: Rising Edge + * @arg TIM_INPUTCHANNELPOLARITY_FALLING: Falling Edge + * @arg TIM_INPUTCHANNELPOLARITY_BOTHEDGE: Rising and Falling Edge + * @retval None + */ +#define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \ + do{ \ + TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__)); \ + TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \ + }while(0) + +/** + * @} + */ +/* End of exported macros ----------------------------------------------------*/ + +/* Private constants ---------------------------------------------------------*/ +/** @defgroup TIM_Private_Constants TIM Private Constants + * @{ + */ +/* The counter of a timer instance is disabled only if all the CCx and CCxN + channels have been disabled */ +#define TIM_CCER_CCxE_MASK ((uint32_t)(TIM_CCER_CC1E | TIM_CCER_CC2E | TIM_CCER_CC3E | TIM_CCER_CC4E)) +#define TIM_CCER_CCxNE_MASK ((uint32_t)(TIM_CCER_CC1NE | TIM_CCER_CC2NE | TIM_CCER_CC3NE)) +/** + * @} + */ +/* End of private constants --------------------------------------------------*/ + +/* Private macros ------------------------------------------------------------*/ +/** @defgroup TIM_Private_Macros TIM Private Macros + * @{ + */ +#if defined(TIM_SMCR_OCCS) +#define IS_TIM_CLEARINPUT_SOURCE(__MODE__) (((__MODE__) == TIM_CLEARINPUTSOURCE_NONE) || \ + ((__MODE__) == TIM_CLEARINPUTSOURCE_ETR) || \ + ((__MODE__) == TIM_CLEARINPUTSOURCE_OCREFCLR)) +#else +#define IS_TIM_CLEARINPUT_SOURCE(__MODE__) (((__MODE__) == TIM_CLEARINPUTSOURCE_NONE) || \ + ((__MODE__) == TIM_CLEARINPUTSOURCE_ETR)) +#endif /* TIM_SMCR_OCCS */ + +#if defined(TIM_CCER_CC5E) && defined(TIM_CCER_CC6E) +#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) || \ + ((__BASE__) == TIM_DMABASE_CCMR3) || \ + ((__BASE__) == TIM_DMABASE_CCR5) || \ + ((__BASE__) == TIM_DMABASE_CCR6) || \ + ((__BASE__) == TIM_DMABASE_OR)) +#else +#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) || \ + ((__BASE__) == TIM_DMABASE_OR)) +#endif /* TIM_CCER_CC5E && TIM_CCER_CC6E */ + +#if defined(TIM_EGR_B2G) +#define IS_TIM_EVENT_SOURCE(__SOURCE__) ((((__SOURCE__) & 0xFFFFFE00U) == 0x00000000U) && ((__SOURCE__) != 0x00000000U)) +#else +#define IS_TIM_EVENT_SOURCE(__SOURCE__) ((((__SOURCE__) & 0xFFFFFF00U) == 0x00000000U) && ((__SOURCE__) != 0x00000000U)) +#endif /* TIM_EGR_B2G */ + +#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)) + +#if defined(TIM_CR1_UIFREMAP) +#define IS_TIM_UIFREMAP_MODE(__MODE__) (((__MODE__) == TIM_UIFREMAP_DISABLE) || \ + ((__MODE__) == TIM_UIFREMAP_ENALE)) + +#endif /* TIM_CR1_UIFREMAP */ +#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)) + +#if defined(TIM_CCER_CC5E) && defined(TIM_CCER_CC6E) +#define IS_TIM_CHANNELS(__CHANNEL__) (((__CHANNEL__) == TIM_CHANNEL_1) || \ + ((__CHANNEL__) == TIM_CHANNEL_2) || \ + ((__CHANNEL__) == TIM_CHANNEL_3) || \ + ((__CHANNEL__) == TIM_CHANNEL_4) || \ + ((__CHANNEL__) == TIM_CHANNEL_5) || \ + ((__CHANNEL__) == TIM_CHANNEL_6) || \ + ((__CHANNEL__) == TIM_CHANNEL_ALL)) +#else +#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)) +#endif /* TIM_CCER_CC5E &&TIM_CCER_CC6E */ + +#define IS_TIM_OPM_CHANNELS(__CHANNEL__) (((__CHANNEL__) == TIM_CHANNEL_1) || \ + ((__CHANNEL__) == TIM_CHANNEL_2)) + +#define IS_TIM_COMPLEMENTARY_CHANNELS(__CHANNEL__) (((__CHANNEL__) == TIM_CHANNEL_1) || \ + ((__CHANNEL__) == TIM_CHANNEL_2) || \ + ((__CHANNEL__) == TIM_CHANNEL_3)) + +#define IS_TIM_CLOCKSOURCE(__CLOCK__) (((__CLOCK__) == TIM_CLOCKSOURCE_INTERNAL) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_ETRMODE2) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_ITR0) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_ITR1) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_ITR2) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_ITR3) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_TI1ED) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_TI1) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_TI2) || \ + ((__CLOCK__) == TIM_CLOCKSOURCE_ETRMODE1)) + +#define IS_TIM_CLOCKPOLARITY(__POLARITY__) (((__POLARITY__) == TIM_CLOCKPOLARITY_INVERTED) || \ + ((__POLARITY__) == TIM_CLOCKPOLARITY_NONINVERTED) || \ + ((__POLARITY__) == TIM_CLOCKPOLARITY_RISING) || \ + ((__POLARITY__) == TIM_CLOCKPOLARITY_FALLING) || \ + ((__POLARITY__) == TIM_CLOCKPOLARITY_BOTHEDGE)) + +#define IS_TIM_CLOCKPRESCALER(__PRESCALER__) (((__PRESCALER__) == TIM_CLOCKPRESCALER_DIV1) || \ + ((__PRESCALER__) == TIM_CLOCKPRESCALER_DIV2) || \ + ((__PRESCALER__) == TIM_CLOCKPRESCALER_DIV4) || \ + ((__PRESCALER__) == TIM_CLOCKPRESCALER_DIV8)) + +#define IS_TIM_CLOCKFILTER(__ICFILTER__) ((__ICFILTER__) <= 0xFU) + +#define IS_TIM_CLEARINPUT_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_CLEARINPUTPOLARITY_INVERTED) || \ + ((__POLARITY__) == TIM_CLEARINPUTPOLARITY_NONINVERTED)) + +#define IS_TIM_CLEARINPUT_PRESCALER(__PRESCALER__) (((__PRESCALER__) == TIM_CLEARINPUTPRESCALER_DIV1) || \ + ((__PRESCALER__) == TIM_CLEARINPUTPRESCALER_DIV2) || \ + ((__PRESCALER__) == TIM_CLEARINPUTPRESCALER_DIV4) || \ + ((__PRESCALER__) == TIM_CLEARINPUTPRESCALER_DIV8)) + +#define IS_TIM_CLEARINPUT_FILTER(__ICFILTER__) ((__ICFILTER__) <= 0xFU) + +#define IS_TIM_OSSR_STATE(__STATE__) (((__STATE__) == TIM_OSSR_ENABLE) || \ + ((__STATE__) == TIM_OSSR_DISABLE)) + +#define IS_TIM_OSSI_STATE(__STATE__) (((__STATE__) == TIM_OSSI_ENABLE) || \ + ((__STATE__) == TIM_OSSI_DISABLE)) + +#define IS_TIM_LOCK_LEVEL(__LEVEL__) (((__LEVEL__) == TIM_LOCKLEVEL_OFF) || \ + ((__LEVEL__) == TIM_LOCKLEVEL_1) || \ + ((__LEVEL__) == TIM_LOCKLEVEL_2) || \ + ((__LEVEL__) == TIM_LOCKLEVEL_3)) + +#define IS_TIM_BREAK_FILTER(__BRKFILTER__) ((__BRKFILTER__) <= 0xFUL) + + +#define IS_TIM_BREAK_STATE(__STATE__) (((__STATE__) == TIM_BREAK_ENABLE) || \ + ((__STATE__) == TIM_BREAK_DISABLE)) + +#define IS_TIM_BREAK_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_BREAKPOLARITY_LOW) || \ + ((__POLARITY__) == TIM_BREAKPOLARITY_HIGH)) + +#if defined(TIM_BDTR_BK2E) +#define IS_TIM_BREAK2_STATE(__STATE__) (((__STATE__) == TIM_BREAK2_ENABLE) || \ + ((__STATE__) == TIM_BREAK2_DISABLE)) + +#define IS_TIM_BREAK2_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_BREAK2POLARITY_LOW) || \ + ((__POLARITY__) == TIM_BREAK2POLARITY_HIGH)) +#endif /* TIM_BDTR_BK2E */ + +#define IS_TIM_AUTOMATIC_OUTPUT_STATE(__STATE__) (((__STATE__) == TIM_AUTOMATICOUTPUT_ENABLE) || \ + ((__STATE__) == TIM_AUTOMATICOUTPUT_DISABLE)) + +#if defined(TIM_CCR5_CCR5) +#define IS_TIM_GROUPCH5(__OCREF__) ((((__OCREF__) & 0x1FFFFFFFU) == 0x00000000U)) +#endif /* TIM_CCR5_CCR5 */ + +#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)) + +#if defined(TIM_CR2_MMS2) +#define IS_TIM_TRGO2_SOURCE(__SOURCE__) (((__SOURCE__) == TIM_TRGO2_RESET) || \ + ((__SOURCE__) == TIM_TRGO2_ENABLE) || \ + ((__SOURCE__) == TIM_TRGO2_UPDATE) || \ + ((__SOURCE__) == TIM_TRGO2_OC1) || \ + ((__SOURCE__) == TIM_TRGO2_OC1REF) || \ + ((__SOURCE__) == TIM_TRGO2_OC2REF) || \ + ((__SOURCE__) == TIM_TRGO2_OC3REF) || \ + ((__SOURCE__) == TIM_TRGO2_OC3REF) || \ + ((__SOURCE__) == TIM_TRGO2_OC4REF) || \ + ((__SOURCE__) == TIM_TRGO2_OC5REF) || \ + ((__SOURCE__) == TIM_TRGO2_OC6REF) || \ + ((__SOURCE__) == TIM_TRGO2_OC4REF_RISINGFALLING) || \ + ((__SOURCE__) == TIM_TRGO2_OC6REF_RISINGFALLING) || \ + ((__SOURCE__) == TIM_TRGO2_OC4REF_RISING_OC6REF_RISING) || \ + ((__SOURCE__) == TIM_TRGO2_OC4REF_RISING_OC6REF_FALLING) || \ + ((__SOURCE__) == TIM_TRGO2_OC5REF_RISING_OC6REF_RISING) || \ + ((__SOURCE__) == TIM_TRGO2_OC5REF_RISING_OC6REF_FALLING)) +#endif /* TIM_CR2_MMS2 */ + +#define IS_TIM_MSM_STATE(__STATE__) (((__STATE__) == TIM_MASTERSLAVEMODE_ENABLE) || \ + ((__STATE__) == TIM_MASTERSLAVEMODE_DISABLE)) + +#if defined (TIM_SMCR_SMS_3) +#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) || \ + ((__MODE__) == TIM_SLAVEMODE_COMBINED_RESETTRIGGER)) +#else +#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)) +#endif /* TIM_SMCR_SMS_3 */ + +#if defined(TIM_CCMR1_OC1M_3) +#define IS_TIM_PWM_MODE(__MODE__) (((__MODE__) == TIM_OCMODE_PWM1) || \ + ((__MODE__) == TIM_OCMODE_PWM2) || \ + ((__MODE__) == TIM_OCMODE_COMBINED_PWM1) || \ + ((__MODE__) == TIM_OCMODE_COMBINED_PWM2) || \ + ((__MODE__) == TIM_OCMODE_ASSYMETRIC_PWM1) || \ + ((__MODE__) == TIM_OCMODE_ASSYMETRIC_PWM2)) +#else +#define IS_TIM_PWM_MODE(__MODE__) (((__MODE__) == TIM_OCMODE_PWM1) || \ + ((__MODE__) == TIM_OCMODE_PWM2)) +#endif /* TIM_CCMR1_OC1M_3 */ + +#if defined(TIM_CCMR1_OC1M_3) +#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) || \ + ((__MODE__) == TIM_OCMODE_RETRIGERRABLE_OPM1) || \ + ((__MODE__) == TIM_OCMODE_RETRIGERRABLE_OPM2)) +#else +#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)) +#endif /* TIM_CCMR1_OC1M_3 */ + +#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) + +#if defined (TIM_SMCR_SMS_3) +#define IS_TIM_SLAVEMODE_TRIGGER_ENABLED(__TRIGGER__) (((__TRIGGER__) == TIM_SLAVEMODE_TRIGGER) || \ + ((__TRIGGER__) == TIM_SLAVEMODE_COMBINED_RESETTRIGGER)) +#else +#define IS_TIM_SLAVEMODE_TRIGGER_ENABLED(__TRIGGER__) ((__TRIGGER__) == TIM_SLAVEMODE_TRIGGER) +#endif /* TIM_SMCR_SMS_3 */ + +#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))) + +#if defined(TIM_CCER_CC5E) && defined(TIM_CCER_CC6E) +#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] :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? (__HANDLE__)->ChannelState[3] :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? (__HANDLE__)->ChannelState[4] :\ + (__HANDLE__)->ChannelState[5]) + +#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__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->ChannelState[3] = (__CHANNEL_STATE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->ChannelState[4] = (__CHANNEL_STATE__)) :\ + ((__HANDLE__)->ChannelState[5] = (__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__); \ + (__HANDLE__)->ChannelState[4] = \ + (__CHANNEL_STATE__); \ + (__HANDLE__)->ChannelState[5] = \ + (__CHANNEL_STATE__); \ + } while(0) +#else +#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) +#endif /* TIM_CCER_CC5E && TIM_CCER_CC6E */ + +#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 "stm32f3xx_hal_tim_ex.h" + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup TIM_Exported_Functions TIM Exported Functions + * @{ + */ + +/** @addtogroup TIM_Exported_Functions_Group1 TIM Time Base functions + * @brief Time Base functions + * @{ + */ +/* Time Base functions ********************************************************/ +HAL_StatusTypeDef HAL_TIM_Base_Init(TIM_HandleTypeDef *htim); +HAL_StatusTypeDef HAL_TIM_Base_DeInit(TIM_HandleTypeDef *htim); +void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim); +void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *htim); +/* Blocking mode: Polling */ +HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim); +HAL_StatusTypeDef HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim); +/* Non-Blocking mode: Interrupt */ +HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim); +HAL_StatusTypeDef HAL_TIM_Base_Stop_IT(TIM_HandleTypeDef *htim); +/* Non-Blocking mode: DMA */ +HAL_StatusTypeDef HAL_TIM_Base_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length); +HAL_StatusTypeDef HAL_TIM_Base_Stop_DMA(TIM_HandleTypeDef *htim); +/** + * @} + */ + +/** @addtogroup TIM_Exported_Functions_Group2 TIM Output Compare functions + * @brief TIM Output Compare functions + * @{ + */ +/* Timer Output Compare functions *********************************************/ +HAL_StatusTypeDef HAL_TIM_OC_Init(TIM_HandleTypeDef *htim); +HAL_StatusTypeDef HAL_TIM_OC_DeInit(TIM_HandleTypeDef *htim); +void HAL_TIM_OC_MspInit(TIM_HandleTypeDef *htim); +void HAL_TIM_OC_MspDeInit(TIM_HandleTypeDef *htim); +/* Blocking mode: Polling */ +HAL_StatusTypeDef HAL_TIM_OC_Start(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_OC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); +/* Non-Blocking mode: Interrupt */ +HAL_StatusTypeDef HAL_TIM_OC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_OC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); +/* Non-Blocking mode: DMA */ +HAL_StatusTypeDef HAL_TIM_OC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length); +HAL_StatusTypeDef HAL_TIM_OC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); +/** + * @} + */ + +/** @addtogroup TIM_Exported_Functions_Group3 TIM PWM functions + * @brief TIM PWM functions + * @{ + */ +/* Timer PWM functions ********************************************************/ +HAL_StatusTypeDef HAL_TIM_PWM_Init(TIM_HandleTypeDef *htim); +HAL_StatusTypeDef HAL_TIM_PWM_DeInit(TIM_HandleTypeDef *htim); +void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim); +void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef *htim); +/* Blocking mode: Polling */ +HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_PWM_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); +/* Non-Blocking mode: Interrupt */ +HAL_StatusTypeDef HAL_TIM_PWM_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_PWM_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); +/* Non-Blocking mode: DMA */ +HAL_StatusTypeDef HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length); +HAL_StatusTypeDef HAL_TIM_PWM_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); +/** + * @} + */ + +/** @addtogroup TIM_Exported_Functions_Group4 TIM Input Capture functions + * @brief TIM Input Capture functions + * @{ + */ +/* Timer Input Capture functions **********************************************/ +HAL_StatusTypeDef HAL_TIM_IC_Init(TIM_HandleTypeDef *htim); +HAL_StatusTypeDef HAL_TIM_IC_DeInit(TIM_HandleTypeDef *htim); +void HAL_TIM_IC_MspInit(TIM_HandleTypeDef *htim); +void HAL_TIM_IC_MspDeInit(TIM_HandleTypeDef *htim); +/* Blocking mode: Polling */ +HAL_StatusTypeDef HAL_TIM_IC_Start(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_IC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); +/* Non-Blocking mode: Interrupt */ +HAL_StatusTypeDef HAL_TIM_IC_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_IC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); +/* Non-Blocking mode: DMA */ +HAL_StatusTypeDef HAL_TIM_IC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length); +HAL_StatusTypeDef HAL_TIM_IC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); +/** + * @} + */ + +/** @addtogroup TIM_Exported_Functions_Group5 TIM One Pulse functions + * @brief TIM One Pulse functions + * @{ + */ +/* Timer One Pulse functions **************************************************/ +HAL_StatusTypeDef HAL_TIM_OnePulse_Init(TIM_HandleTypeDef *htim, uint32_t OnePulseMode); +HAL_StatusTypeDef HAL_TIM_OnePulse_DeInit(TIM_HandleTypeDef *htim); +void HAL_TIM_OnePulse_MspInit(TIM_HandleTypeDef *htim); +void HAL_TIM_OnePulse_MspDeInit(TIM_HandleTypeDef *htim); +/* Blocking mode: Polling */ +HAL_StatusTypeDef HAL_TIM_OnePulse_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel); +HAL_StatusTypeDef HAL_TIM_OnePulse_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel); +/* Non-Blocking mode: Interrupt */ +HAL_StatusTypeDef HAL_TIM_OnePulse_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel); +HAL_StatusTypeDef HAL_TIM_OnePulse_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel); +/** + * @} + */ + +/** @addtogroup TIM_Exported_Functions_Group6 TIM Encoder functions + * @brief TIM Encoder functions + * @{ + */ +/* Timer Encoder functions ****************************************************/ +HAL_StatusTypeDef HAL_TIM_Encoder_Init(TIM_HandleTypeDef *htim, TIM_Encoder_InitTypeDef *sConfig); +HAL_StatusTypeDef HAL_TIM_Encoder_DeInit(TIM_HandleTypeDef *htim); +void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef *htim); +void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef *htim); +/* Blocking mode: Polling */ +HAL_StatusTypeDef HAL_TIM_Encoder_Start(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); +/* Non-Blocking mode: Interrupt */ +HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); +/* Non-Blocking mode: DMA */ +HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, + uint32_t *pData2, uint16_t Length); +HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); +/** + * @} + */ + +/** @addtogroup TIM_Exported_Functions_Group7 TIM IRQ handler management + * @brief IRQ handler management + * @{ + */ +/* Interrupt Handler functions ***********************************************/ +void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim); +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group8 TIM Peripheral Control functions + * @brief Peripheral Control functions + * @{ + */ +/* Control functions *********************************************************/ +HAL_StatusTypeDef HAL_TIM_OC_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfig, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfig, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_IC_ConfigChannel(TIM_HandleTypeDef *htim, TIM_IC_InitTypeDef *sConfig, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, + uint32_t OutputChannel, uint32_t InputChannel); +HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, TIM_ClearInputConfigTypeDef *sClearInputConfig, + uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_ConfigClockSource(TIM_HandleTypeDef *htim, TIM_ClockConfigTypeDef *sClockSourceConfig); +HAL_StatusTypeDef HAL_TIM_ConfigTI1Input(TIM_HandleTypeDef *htim, uint32_t TI1_Selection); +HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, TIM_SlaveConfigTypeDef *sSlaveConfig); +HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim, TIM_SlaveConfigTypeDef *sSlaveConfig); +HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength); +HAL_StatusTypeDef HAL_TIM_DMABurst_MultiWriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, + uint32_t BurstLength, uint32_t DataLength); +HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc); +HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength); +HAL_StatusTypeDef HAL_TIM_DMABurst_MultiReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, + uint32_t BurstLength, uint32_t DataLength); +HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc); +HAL_StatusTypeDef HAL_TIM_GenerateEvent(TIM_HandleTypeDef *htim, uint32_t EventSource); +uint32_t HAL_TIM_ReadCapturedValue(TIM_HandleTypeDef *htim, uint32_t Channel); +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group9 TIM Callbacks functions + * @brief TIM Callbacks functions + * @{ + */ +/* Callback in non blocking modes (Interrupt and DMA) *************************/ +void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim); +void HAL_TIM_PeriodElapsedHalfCpltCallback(TIM_HandleTypeDef *htim); +void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim); +void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim); +void HAL_TIM_IC_CaptureHalfCpltCallback(TIM_HandleTypeDef *htim); +void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim); +void HAL_TIM_PWM_PulseFinishedHalfCpltCallback(TIM_HandleTypeDef *htim); +void HAL_TIM_TriggerCallback(TIM_HandleTypeDef *htim); +void HAL_TIM_TriggerHalfCpltCallback(TIM_HandleTypeDef *htim); +void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim); + +/* Callbacks Register/UnRegister functions ***********************************/ +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) +HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, + pTIM_CallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_TIM_UnRegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + +/** + * @} + */ + +/** @defgroup TIM_Exported_Functions_Group10 TIM Peripheral State functions + * @brief Peripheral State functions + * @{ + */ +/* Peripheral State functions ************************************************/ +HAL_TIM_StateTypeDef HAL_TIM_Base_GetState(TIM_HandleTypeDef *htim); +HAL_TIM_StateTypeDef HAL_TIM_OC_GetState(TIM_HandleTypeDef *htim); +HAL_TIM_StateTypeDef HAL_TIM_PWM_GetState(TIM_HandleTypeDef *htim); +HAL_TIM_StateTypeDef HAL_TIM_IC_GetState(TIM_HandleTypeDef *htim); +HAL_TIM_StateTypeDef HAL_TIM_OnePulse_GetState(TIM_HandleTypeDef *htim); +HAL_TIM_StateTypeDef HAL_TIM_Encoder_GetState(TIM_HandleTypeDef *htim); + +/* Peripheral Channel state functions ************************************************/ +HAL_TIM_ActiveChannel HAL_TIM_GetActiveChannel(TIM_HandleTypeDef *htim); +HAL_TIM_ChannelStateTypeDef HAL_TIM_GetChannelState(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_TIM_DMABurstStateTypeDef HAL_TIM_DMABurstState(TIM_HandleTypeDef *htim); +/** + * @} + */ + +/** + * @} + */ +/* End of exported functions -------------------------------------------------*/ + +/* Private functions----------------------------------------------------------*/ +/** @defgroup TIM_Private_Functions TIM Private Functions + * @{ + */ +void TIM_Base_SetConfig(TIM_TypeDef *TIMx, TIM_Base_InitTypeDef *Structure); +void TIM_TI1_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, uint32_t TIM_ICFilter); +void TIM_OC2_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config); +void TIM_ETR_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ExtTRGPrescaler, + uint32_t TIM_ExtTRGPolarity, uint32_t ExtTRGFilter); + +void TIM_DMADelayPulseHalfCplt(DMA_HandleTypeDef *hdma); +void TIM_DMAError(DMA_HandleTypeDef *hdma); +void TIM_DMACaptureCplt(DMA_HandleTypeDef *hdma); +void TIM_DMACaptureHalfCplt(DMA_HandleTypeDef *hdma); +void TIM_CCxChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelState); + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) +void TIM_ResetCallback(TIM_HandleTypeDef *htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + +/** + * @} + */ +/* End of private functions --------------------------------------------------*/ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* STM32F3xx_HAL_TIM_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_tim_ex.h b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_tim_ex.h new file mode 100644 index 0000000..80c2df1 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_tim_ex.h @@ -0,0 +1,343 @@ +/** + ****************************************************************************** + * @file stm32f3xx_hal_tim_ex.h + * @author MCD Application Team + * @brief Header file of TIM HAL Extended module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef STM32F3xx_HAL_TIM_EX_H +#define STM32F3xx_HAL_TIM_EX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f3xx_hal_def.h" + +/** @addtogroup STM32F3xx_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(TIM1) +#define TIM_TIM1_ADC1_NONE (0x00000000U) /*!< TIM1_ETR is not connected to any AWD (analog watchdog)*/ +#define TIM_TIM1_ADC1_AWD1 (0x00000001U) /*!< TIM1_ETR is connected to ADC1 AWD1 */ +#define TIM_TIM1_ADC1_AWD2 (0x00000002U) /*!< TIM1_ETR is connected to ADC1 AWD2 */ +#define TIM_TIM1_ADC1_AWD3 (0x00000003U) /*!< TIM1_ETR is connected to ADC1 AWD3 */ + +#if defined(ADC4) +#define TIM_TIM1_ADC4_NONE (0x00000000U) /*!< TIM1_ETR is not connected to any AWD (analog watchdog)*/ +#define TIM_TIM1_ADC4_AWD1 (0x00000004U) /*!< TIM1_ETR is connected to ADC4 AWD1 */ +#define TIM_TIM1_ADC4_AWD2 (0x00000008U) /*!< TIM1_ETR is connected to ADC4 AWD2 */ +#define TIM_TIM1_ADC4_AWD3 (0x0000000CU) /*!< TIM1_ETR is connected to ADC4 AWD3 */ +#elif defined(ADC2) +#define TIM_TIM1_ADC2_NONE (0x00000000U) /*!< TIM1_ETR is not connected to any AWD (analog watchdog)*/ +#define TIM_TIM1_ADC2_AWD1 (0x00000004U) /*!< TIM1_ETR is connected to ADC2 AWD1 */ +#define TIM_TIM1_ADC2_AWD2 (0x00000008U) /*!< TIM1_ETR is connected to ADC2 AWD2 */ +#define TIM_TIM1_ADC2_AWD3 (0x0000000CU) /*!< TIM1_ETR is connected to ADC2 AWD3 */ +#endif /* ADC4 */ +#endif /* TIM1 */ + +#if defined(TIM8) +#define TIM_TIM8_ADC2_NONE (0x00000000U) /*!< TIM8_ETR is not connected to any AWD (analog watchdog) */ +#define TIM_TIM8_ADC2_AWD1 (0x00000001U) /*!< TIM8_ETR is connected to ADC2 AWD1 */ +#define TIM_TIM8_ADC2_AWD2 (0x00000002U) /*!< TIM8_ETR is connected to ADC2 AWD2 */ +#define TIM_TIM8_ADC2_AWD3 (0x00000003U) /*!< TIM8_ETR is connected to ADC2 AWD3 */ + +#define TIM_TIM8_ADC3_NONE (0x00000000U) /*!< TIM8_ETR is not connected to any AWD (analog watchdog) */ +#define TIM_TIM8_ADC3_AWD1 (0x00000004U) /*!< TIM8_ETR is connected to ADC3 AWD1 */ +#define TIM_TIM8_ADC3_AWD2 (0x00000008U) /*!< TIM8_ETR is connected to ADC3 AWD2 */ +#define TIM_TIM8_ADC3_AWD3 (0x0000000CU) /*!< TIM8_ETR is connected to ADC3 AWD3 */ +#endif /* TIM8 */ + +#if defined(TIM14) +#define TIM_TIM14_GPIO (0x00000000U) /*!< TIM14 TI1 is connected to GPIO */ +#define TIM_TIM14_RTC (0x00000001U) /*!< TIM14 TI1 is connected to RTC_clock */ +#define TIM_TIM14_HSE (0x00000002U) /*!< TIM14 TI1 is connected to HSE/32U */ +#define TIM_TIM14_MCO (0x00000003U) /*!< TIM14 TI1 is connected to MCO */ +#endif /* TIM14 */ + +#if defined(TIM16) +#define TIM_TIM16_GPIO (0x00000000U) /*!< TIM16 TI1 is connected to GPIO */ +#define TIM_TIM16_RTC (0x00000001U) /*!< TIM16 TI1 is connected to RTC_clock */ +#define TIM_TIM16_HSE (0x00000002U) /*!< TIM16 TI1 is connected to HSE/32 */ +#define TIM_TIM16_MCO (0x00000003U) /*!< TIM16 TI1 is connected to MCO */ +#endif /* TIM16 */ + +#if defined(TIM20) +#define TIM_TIM20_ADC3_NONE (0x00000000U) /*!< TIM20_ETR is not connected to any AWD (analog watchdog) */ +#define TIM_TIM20_ADC3_AWD1 (0x00000001U) /*!< TIM20_ETR is connected to ADC3 AWD1 */ +#define TIM_TIM20_ADC3_AWD2 (0x00000002U) /*!< TIM20_ETR is connected to ADC3 AWD2 */ +#define TIM_TIM20_ADC3_AWD3 (0x00000003U) /*!< TIM20_ETR is connected to ADC3 AWD3 */ + +#define TIM_TIM20_ADC4_NONE (0x00000000U) /*!< TIM20_ETR is not connected to any AWD (analog watchdog) */ +#define TIM_TIM20_ADC4_AWD1 (0x00000004U) /*!< TIM20_ETR is connected to ADC4 AWD1 */ +#define TIM_TIM20_ADC4_AWD2 (0x00000008U) /*!< TIM20_ETR is connected to ADC4 AWD2 */ +#define TIM_TIM20_ADC4_AWD3 (0x0000000CU) /*!< TIM20_ETR is connected to ADC4 AWD3 */ +#endif /* TIM20 */ +/** + * @} + */ + +/** + * @} + */ +/* 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(TIM1) && defined(TIM8) && defined(TIM20) && defined(TIM16) +#define IS_TIM_REMAP(__INSTANCE__, __REMAP__) \ + ((((__INSTANCE__) == TIM1) && ((((__REMAP__) & 0xFFFFFFF0U) == 0x00000000U))) \ + || (((__INSTANCE__) == TIM8) && ((((__REMAP__) & 0xFFFFFFF0U) == 0x00000000U))) \ + || (((__INSTANCE__) == TIM20) && ((((__REMAP__) & 0xFFFFFFF0U) == 0x00000000U))) \ + || (((__INSTANCE__) == TIM16) && ((((__REMAP__) & 0xFFFFFFFCU) == 0x00000000U)))) +#elif defined(TIM1) && defined(TIM8) && defined(TIM16) +#define IS_TIM_REMAP(__INSTANCE__, __REMAP__) \ + ((((__INSTANCE__) == TIM1) && ((((__REMAP__) & 0xFFFFFFF0U) == 0x00000000U))) \ + || (((__INSTANCE__) == TIM8) && ((((__REMAP__) & 0xFFFFFFF0U) == 0x00000000U))) \ + || (((__INSTANCE__) == TIM16) && ((((__REMAP__) & 0xFFFFFFFCU) == 0x00000000U)))) +#elif defined(TIM1) && defined(TIM16) +#define IS_TIM_REMAP(__INSTANCE__, __REMAP__) \ + ((((__INSTANCE__) == TIM1) && ((((__REMAP__) & 0xFFFFFFF0U) == 0x00000000U))) \ + || (((__INSTANCE__) == TIM16) && ((((__REMAP__) & 0xFFFFFFFCU) == 0x00000000U)))) +#elif defined(TIM14) +#define IS_TIM_REMAP(__INSTANCE__, __REMAP__) \ + (((__INSTANCE__) == TIM14) && (((__REMAP__) & 0xFFFFFFFCU) == 0x00000000U)) +#endif /* TIM1 && TIM8 && TIM20 && TIM16 */ + +/** + * @} + */ +/* End of private macro ------------------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @addtogroup TIMEx_Exported_Functions TIM Extended Exported Functions + * @{ + */ + +/** @addtogroup TIMEx_Exported_Functions_Group1 Extended Timer Hall Sensor functions + * @brief Timer Hall Sensor functions + * @{ + */ +/* Timer Hall Sensor functions **********************************************/ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Init(TIM_HandleTypeDef *htim, TIM_HallSensor_InitTypeDef *sConfig); +HAL_StatusTypeDef HAL_TIMEx_HallSensor_DeInit(TIM_HandleTypeDef *htim); + +void HAL_TIMEx_HallSensor_MspInit(TIM_HandleTypeDef *htim); +void HAL_TIMEx_HallSensor_MspDeInit(TIM_HandleTypeDef *htim); + +/* Blocking mode: Polling */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start(TIM_HandleTypeDef *htim); +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop(TIM_HandleTypeDef *htim); +/* Non-Blocking mode: Interrupt */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_IT(TIM_HandleTypeDef *htim); +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_IT(TIM_HandleTypeDef *htim); +/* Non-Blocking mode: DMA */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length); +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_DMA(TIM_HandleTypeDef *htim); +/** + * @} + */ + +/** @addtogroup TIMEx_Exported_Functions_Group2 Extended Timer Complementary Output Compare functions + * @brief Timer Complementary Output Compare functions + * @{ + */ +/* Timer Complementary Output Compare functions *****************************/ +/* Blocking mode: Polling */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Start(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIMEx_OCN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); + +/* Non-Blocking mode: Interrupt */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); + +/* Non-Blocking mode: DMA */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length); +HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); +/** + * @} + */ + +/** @addtogroup TIMEx_Exported_Functions_Group3 Extended Timer Complementary PWM functions + * @brief Timer Complementary PWM functions + * @{ + */ +/* Timer Complementary PWM functions ****************************************/ +/* Blocking mode: Polling */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Start(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel); + +/* Non-Blocking mode: Interrupt */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); +HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); +/* Non-Blocking mode: DMA */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length); +HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); +/** + * @} + */ + +/** @addtogroup TIMEx_Exported_Functions_Group4 Extended Timer Complementary One Pulse functions + * @brief Timer Complementary One Pulse functions + * @{ + */ +/* Timer Complementary One Pulse functions **********************************/ +/* Blocking mode: Polling */ +HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel); +HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop(TIM_HandleTypeDef *htim, uint32_t OutputChannel); + +/* Non-Blocking mode: Interrupt */ +HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel); +HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t OutputChannel); +/** + * @} + */ + +/** @addtogroup TIMEx_Exported_Functions_Group5 Extended Peripheral Control functions + * @brief Peripheral Control functions + * @{ + */ +/* Extended Control functions ************************************************/ +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource); +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource); +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource); +HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, + TIM_MasterConfigTypeDef *sMasterConfig); +HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, + TIM_BreakDeadTimeConfigTypeDef *sBreakDeadTimeConfig); +#if defined(TIM_CCR5_CCR5) +HAL_StatusTypeDef HAL_TIMEx_GroupChannel5(TIM_HandleTypeDef *htim, uint32_t Channels); +#endif /* TIM_CCR5_CCR5 */ +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); +#if defined(TIM_BDTR_BK2E) +void HAL_TIMEx_Break2Callback(TIM_HandleTypeDef *htim); +#endif /* TIM_BDTR_BK2E */ +/** + * @} + */ + +/** @addtogroup TIMEx_Exported_Functions_Group7 Extended Peripheral State functions + * @brief Extended Peripheral State functions + * @{ + */ +/* Extended Peripheral State functions ***************************************/ +HAL_TIM_StateTypeDef HAL_TIMEx_HallSensor_GetState(TIM_HandleTypeDef *htim); +HAL_TIM_ChannelStateTypeDef HAL_TIMEx_GetChannelNState(TIM_HandleTypeDef *htim, uint32_t ChannelN); +/** + * @} + */ + +/** + * @} + */ +/* End of exported functions -------------------------------------------------*/ + +/* Private functions----------------------------------------------------------*/ +/** @addtogroup TIMEx_Private_Functions TIMEx Private Functions + * @{ + */ +void TIMEx_DMACommutationCplt(DMA_HandleTypeDef *hdma); +void TIMEx_DMACommutationHalfCplt(DMA_HandleTypeDef *hdma); +/** + * @} + */ +/* End of private functions --------------------------------------------------*/ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + + +#endif /* STM32F3xx_HAL_TIM_EX_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_bus.h b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_bus.h new file mode 100644 index 0000000..c0058c4 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_bus.h @@ -0,0 +1,1063 @@ +/** + ****************************************************************************** + * @file stm32f3xx_ll_bus.h + * @author MCD Application Team + * @brief Header file of BUS LL module. + + @verbatim + ##### RCC Limitations ##### + ============================================================================== + [..] + A delay between an RCC peripheral clock enable and the effective peripheral + enabling should be taken into account in order to manage the peripheral read/write + from/to registers. + (+) This delay depends on the peripheral mapping. + (++) AHB & APB peripherals, 1 dummy read is necessary + + [..] + Workarounds: + (#) For AHB & APB peripherals, a dummy read to the peripheral register has been + inserted in each LL_{BUS}_GRP{x}_EnableClock() function. + + @endverbatim + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F3xx_LL_BUS_H +#define __STM32F3xx_LL_BUS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f3xx.h" + +/** @addtogroup STM32F3xx_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 (uint32_t)0xFFFFFFFFU +#define LL_AHB1_GRP1_PERIPH_DMA1 RCC_AHBENR_DMA1EN +#if defined(DMA2) +#define LL_AHB1_GRP1_PERIPH_DMA2 RCC_AHBENR_DMA2EN +#endif /*DMA2*/ +#define LL_AHB1_GRP1_PERIPH_SRAM RCC_AHBENR_SRAMEN +#define LL_AHB1_GRP1_PERIPH_FLASH RCC_AHBENR_FLITFEN +#if defined(FMC_Bank1) +#define LL_AHB1_GRP1_PERIPH_FMC RCC_AHBENR_FMCEN +#endif /*FMC_Bank1*/ +#define LL_AHB1_GRP1_PERIPH_CRC RCC_AHBENR_CRCEN +#if defined(GPIOH) +#define LL_AHB1_GRP1_PERIPH_GPIOH RCC_AHBENR_GPIOHEN +#endif /*GPIOH*/ +#define LL_AHB1_GRP1_PERIPH_GPIOA RCC_AHBENR_GPIOAEN +#define LL_AHB1_GRP1_PERIPH_GPIOB RCC_AHBENR_GPIOBEN +#define LL_AHB1_GRP1_PERIPH_GPIOC RCC_AHBENR_GPIOCEN +#define LL_AHB1_GRP1_PERIPH_GPIOD RCC_AHBENR_GPIODEN +#if defined(GPIOE) +#define LL_AHB1_GRP1_PERIPH_GPIOE RCC_AHBENR_GPIOEEN +#endif /*GPIOE*/ +#define LL_AHB1_GRP1_PERIPH_GPIOF RCC_AHBENR_GPIOFEN +#if defined(GPIOG) +#define LL_AHB1_GRP1_PERIPH_GPIOG RCC_AHBENR_GPIOGEN +#endif /*GPIOH*/ +#define LL_AHB1_GRP1_PERIPH_TSC RCC_AHBENR_TSCEN +#if defined(RCC_AHBENR_ADC1EN) +#define LL_AHB1_GRP1_PERIPH_ADC1 RCC_AHBENR_ADC1EN +#endif /*RCC_AHBENR_ADC1EN*/ +#if defined(ADC1_2_COMMON) +#define LL_AHB1_GRP1_PERIPH_ADC12 RCC_AHBENR_ADC12EN +#endif /*ADC1_2_COMMON*/ +#if defined(ADC3_4_COMMON) +#define LL_AHB1_GRP1_PERIPH_ADC34 RCC_AHBENR_ADC34EN +#endif /*ADC3_4_COMMON*/ +/** + * @} + */ + +/** @defgroup BUS_LL_EC_APB1_GRP1_PERIPH APB1 GRP1 PERIPH + * @{ + */ +#define LL_APB1_GRP1_PERIPH_ALL (uint32_t)0xFFFFFFFFU +#define LL_APB1_GRP1_PERIPH_TIM2 RCC_APB1ENR_TIM2EN +#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*/ +#if defined(TIM5) +#define LL_APB1_GRP1_PERIPH_TIM5 RCC_APB1ENR_TIM5EN +#endif /*TIM5*/ +#define LL_APB1_GRP1_PERIPH_TIM6 RCC_APB1ENR_TIM6EN +#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(TIM18) +#define LL_APB1_GRP1_PERIPH_TIM18 RCC_APB1ENR_TIM18EN +#endif /*TIM18*/ +#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*/ +#define LL_APB1_GRP1_PERIPH_USART2 RCC_APB1ENR_USART2EN +#define LL_APB1_GRP1_PERIPH_USART3 RCC_APB1ENR_USART3EN +#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 +#if defined(I2C2) +#define LL_APB1_GRP1_PERIPH_I2C2 RCC_APB1ENR_I2C2EN +#endif /*I2C2*/ +#if defined(USB) +#define LL_APB1_GRP1_PERIPH_USB RCC_APB1ENR_USBEN +#endif /*USB*/ +#if defined(CAN) +#define LL_APB1_GRP1_PERIPH_CAN RCC_APB1ENR_CANEN +#endif /*CAN*/ +#if defined(DAC2) +#define LL_APB1_GRP1_PERIPH_DAC2 RCC_APB1ENR_DAC2EN +#endif /*DAC2*/ +#define LL_APB1_GRP1_PERIPH_PWR RCC_APB1ENR_PWREN +#define LL_APB1_GRP1_PERIPH_DAC1 RCC_APB1ENR_DAC1EN +#if defined(CEC) +#define LL_APB1_GRP1_PERIPH_CEC RCC_APB1ENR_CECEN +#endif /*CEC*/ +#if defined(I2C3) +#define LL_APB1_GRP1_PERIPH_I2C3 RCC_APB1ENR_I2C3EN +#endif /*I2C3*/ +/** + * @} + */ + +/** @defgroup BUS_LL_EC_APB2_GRP1_PERIPH APB2 GRP1 PERIPH + * @{ + */ +#define LL_APB2_GRP1_PERIPH_ALL (uint32_t)0xFFFFFFFFU +#define LL_APB2_GRP1_PERIPH_SYSCFG RCC_APB2ENR_SYSCFGEN +#if defined(RCC_APB2ENR_ADC1EN) +#define LL_APB2_GRP1_PERIPH_ADC1 RCC_APB2ENR_ADC1EN +#endif /*RCC_APB2ENR_ADC1EN*/ +#if defined(TIM1) +#define LL_APB2_GRP1_PERIPH_TIM1 RCC_APB2ENR_TIM1EN +#endif /*TIM1*/ +#if defined(SPI1) +#define LL_APB2_GRP1_PERIPH_SPI1 RCC_APB2ENR_SPI1EN +#endif /*SPI1*/ +#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(SPI4) +#define LL_APB2_GRP1_PERIPH_SPI4 RCC_APB2ENR_SPI4EN +#endif /*SPI4*/ +#define LL_APB2_GRP1_PERIPH_TIM15 RCC_APB2ENR_TIM15EN +#define LL_APB2_GRP1_PERIPH_TIM16 RCC_APB2ENR_TIM16EN +#define LL_APB2_GRP1_PERIPH_TIM17 RCC_APB2ENR_TIM17EN +#if defined(TIM19) +#define LL_APB2_GRP1_PERIPH_TIM19 RCC_APB2ENR_TIM19EN +#endif /*TIM19*/ +#if defined(TIM20) +#define LL_APB2_GRP1_PERIPH_TIM20 RCC_APB2ENR_TIM20EN +#endif /*TIM20*/ +#if defined(HRTIM1) +#define LL_APB2_GRP1_PERIPH_HRTIM1 RCC_APB2ENR_HRTIM1EN +#endif /*HRTIM1*/ +#if defined(SDADC1) +#define LL_APB2_GRP1_PERIPH_SDADC1 RCC_APB2ENR_SDADC1EN +#endif /*SDADC1*/ +#if defined(SDADC2) +#define LL_APB2_GRP1_PERIPH_SDADC2 RCC_APB2ENR_SDADC2EN +#endif /*SDADC2*/ +#if defined(SDADC3) +#define LL_APB2_GRP1_PERIPH_SDADC3 RCC_APB2ENR_SDADC3EN +#endif /*SDADC3*/ +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup BUS_LL_Exported_Functions BUS Exported Functions + * @{ + */ + +/** @defgroup BUS_LL_EF_AHB1 AHB1 + * @{ + */ + +/** + * @brief Enable AHB1 peripherals clock. + * @rmtoll AHBENR DMA1EN LL_AHB1_GRP1_EnableClock\n + * AHBENR DMA2EN LL_AHB1_GRP1_EnableClock\n + * AHBENR SRAMEN LL_AHB1_GRP1_EnableClock\n + * AHBENR FLITFEN LL_AHB1_GRP1_EnableClock\n + * AHBENR FMCEN LL_AHB1_GRP1_EnableClock\n + * AHBENR CRCEN LL_AHB1_GRP1_EnableClock\n + * AHBENR GPIOHEN LL_AHB1_GRP1_EnableClock\n + * AHBENR GPIOAEN LL_AHB1_GRP1_EnableClock\n + * AHBENR GPIOBEN LL_AHB1_GRP1_EnableClock\n + * AHBENR GPIOCEN LL_AHB1_GRP1_EnableClock\n + * AHBENR GPIODEN LL_AHB1_GRP1_EnableClock\n + * AHBENR GPIOEEN LL_AHB1_GRP1_EnableClock\n + * AHBENR GPIOFEN LL_AHB1_GRP1_EnableClock\n + * AHBENR GPIOGEN LL_AHB1_GRP1_EnableClock\n + * AHBENR TSCEN LL_AHB1_GRP1_EnableClock\n + * AHBENR ADC1EN LL_AHB1_GRP1_EnableClock\n + * AHBENR ADC12EN LL_AHB1_GRP1_EnableClock\n + * AHBENR ADC34EN LL_AHB1_GRP1_EnableClock + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA1 + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2 (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_SRAM + * @arg @ref LL_AHB1_GRP1_PERIPH_FLASH + * @arg @ref LL_AHB1_GRP1_PERIPH_FMC (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_CRC + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOH (*) + * @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_TSC + * @arg @ref LL_AHB1_GRP1_PERIPH_ADC1 (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ADC12 (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ADC34 (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_AHB1_GRP1_EnableClock(uint32_t Periphs) +{ + __IO uint32_t tmpreg; + SET_BIT(RCC->AHBENR, Periphs); + /* Delay after an RCC peripheral clock enabling */ + tmpreg = READ_BIT(RCC->AHBENR, Periphs); + (void)tmpreg; +} + +/** + * @brief Check if AHB1 peripheral clock is enabled or not + * @rmtoll AHBENR DMA1EN LL_AHB1_GRP1_IsEnabledClock\n + * AHBENR DMA2EN LL_AHB1_GRP1_IsEnabledClock\n + * AHBENR SRAMEN LL_AHB1_GRP1_IsEnabledClock\n + * AHBENR FLITFEN LL_AHB1_GRP1_IsEnabledClock\n + * AHBENR FMCEN LL_AHB1_GRP1_IsEnabledClock\n + * AHBENR CRCEN LL_AHB1_GRP1_IsEnabledClock\n + * AHBENR GPIOHEN LL_AHB1_GRP1_IsEnabledClock\n + * AHBENR GPIOAEN LL_AHB1_GRP1_IsEnabledClock\n + * AHBENR GPIOBEN LL_AHB1_GRP1_IsEnabledClock\n + * AHBENR GPIOCEN LL_AHB1_GRP1_IsEnabledClock\n + * AHBENR GPIODEN LL_AHB1_GRP1_IsEnabledClock\n + * AHBENR GPIOEEN LL_AHB1_GRP1_IsEnabledClock\n + * AHBENR GPIOFEN LL_AHB1_GRP1_IsEnabledClock\n + * AHBENR GPIOGEN LL_AHB1_GRP1_IsEnabledClock\n + * AHBENR TSCEN LL_AHB1_GRP1_IsEnabledClock\n + * AHBENR ADC1EN LL_AHB1_GRP1_IsEnabledClock\n + * AHBENR ADC12EN LL_AHB1_GRP1_IsEnabledClock\n + * AHBENR ADC34EN LL_AHB1_GRP1_IsEnabledClock + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA1 + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2 (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_SRAM + * @arg @ref LL_AHB1_GRP1_PERIPH_FLASH + * @arg @ref LL_AHB1_GRP1_PERIPH_FMC (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_CRC + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOH (*) + * @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_TSC + * @arg @ref LL_AHB1_GRP1_PERIPH_ADC1 (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ADC12 (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ADC34 (*) + * + * (*) value not defined in all devices. + * @retval State of Periphs (1 or 0). +*/ +__STATIC_INLINE uint32_t LL_AHB1_GRP1_IsEnabledClock(uint32_t Periphs) +{ + return (READ_BIT(RCC->AHBENR, Periphs) == Periphs); +} + +/** + * @brief Disable AHB1 peripherals clock. + * @rmtoll AHBENR DMA1EN LL_AHB1_GRP1_DisableClock\n + * AHBENR DMA2EN LL_AHB1_GRP1_DisableClock\n + * AHBENR SRAMEN LL_AHB1_GRP1_DisableClock\n + * AHBENR FLITFEN LL_AHB1_GRP1_DisableClock\n + * AHBENR FMCEN LL_AHB1_GRP1_DisableClock\n + * AHBENR CRCEN LL_AHB1_GRP1_DisableClock\n + * AHBENR GPIOHEN LL_AHB1_GRP1_DisableClock\n + * AHBENR GPIOAEN LL_AHB1_GRP1_DisableClock\n + * AHBENR GPIOBEN LL_AHB1_GRP1_DisableClock\n + * AHBENR GPIOCEN LL_AHB1_GRP1_DisableClock\n + * AHBENR GPIODEN LL_AHB1_GRP1_DisableClock\n + * AHBENR GPIOEEN LL_AHB1_GRP1_DisableClock\n + * AHBENR GPIOFEN LL_AHB1_GRP1_DisableClock\n + * AHBENR GPIOGEN LL_AHB1_GRP1_DisableClock\n + * AHBENR TSCEN LL_AHB1_GRP1_DisableClock\n + * AHBENR ADC1EN LL_AHB1_GRP1_DisableClock\n + * AHBENR ADC12EN LL_AHB1_GRP1_DisableClock\n + * AHBENR ADC34EN LL_AHB1_GRP1_DisableClock + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA1 + * @arg @ref LL_AHB1_GRP1_PERIPH_DMA2 (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_SRAM + * @arg @ref LL_AHB1_GRP1_PERIPH_FLASH + * @arg @ref LL_AHB1_GRP1_PERIPH_FMC (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_CRC + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOH (*) + * @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_TSC + * @arg @ref LL_AHB1_GRP1_PERIPH_ADC1 (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ADC12 (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ADC34 (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_AHB1_GRP1_DisableClock(uint32_t Periphs) +{ + CLEAR_BIT(RCC->AHBENR, Periphs); +} + +/** + * @brief Force AHB1 peripherals reset. + * @rmtoll AHBRSTR FMCRST LL_AHB1_GRP1_ForceReset\n + * AHBRSTR GPIOHRST LL_AHB1_GRP1_ForceReset\n + * AHBRSTR GPIOARST LL_AHB1_GRP1_ForceReset\n + * AHBRSTR GPIOBRST LL_AHB1_GRP1_ForceReset\n + * AHBRSTR GPIOCRST LL_AHB1_GRP1_ForceReset\n + * AHBRSTR GPIODRST LL_AHB1_GRP1_ForceReset\n + * AHBRSTR GPIOERST LL_AHB1_GRP1_ForceReset\n + * AHBRSTR GPIOFRST LL_AHB1_GRP1_ForceReset\n + * AHBRSTR GPIOGRST LL_AHB1_GRP1_ForceReset\n + * AHBRSTR TSCRST LL_AHB1_GRP1_ForceReset\n + * AHBRSTR ADC1RST LL_AHB1_GRP1_ForceReset\n + * AHBRSTR ADC12RST LL_AHB1_GRP1_ForceReset\n + * AHBRSTR ADC34RST 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_FMC (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOH (*) + * @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_TSC + * @arg @ref LL_AHB1_GRP1_PERIPH_ADC1 (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ADC12 (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ADC34 (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_AHB1_GRP1_ForceReset(uint32_t Periphs) +{ + SET_BIT(RCC->AHBRSTR, Periphs); +} + +/** + * @brief Release AHB1 peripherals reset. + * @rmtoll AHBRSTR FMCRST LL_AHB1_GRP1_ReleaseReset\n + * AHBRSTR GPIOHRST LL_AHB1_GRP1_ReleaseReset\n + * AHBRSTR GPIOARST LL_AHB1_GRP1_ReleaseReset\n + * AHBRSTR GPIOBRST LL_AHB1_GRP1_ReleaseReset\n + * AHBRSTR GPIOCRST LL_AHB1_GRP1_ReleaseReset\n + * AHBRSTR GPIODRST LL_AHB1_GRP1_ReleaseReset\n + * AHBRSTR GPIOERST LL_AHB1_GRP1_ReleaseReset\n + * AHBRSTR GPIOFRST LL_AHB1_GRP1_ReleaseReset\n + * AHBRSTR GPIOGRST LL_AHB1_GRP1_ReleaseReset\n + * AHBRSTR TSCRST LL_AHB1_GRP1_ReleaseReset\n + * AHBRSTR ADC1RST LL_AHB1_GRP1_ReleaseReset\n + * AHBRSTR ADC12RST LL_AHB1_GRP1_ReleaseReset\n + * AHBRSTR ADC34RST 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_FMC (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_GPIOH (*) + * @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_TSC + * @arg @ref LL_AHB1_GRP1_PERIPH_ADC1 (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ADC12 (*) + * @arg @ref LL_AHB1_GRP1_PERIPH_ADC34 (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_AHB1_GRP1_ReleaseReset(uint32_t Periphs) +{ + CLEAR_BIT(RCC->AHBRSTR, Periphs); +} + +/** + * @} + */ + +/** @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 TIM18EN 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 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 USBEN LL_APB1_GRP1_EnableClock\n + * APB1ENR CANEN LL_APB1_GRP1_EnableClock\n + * APB1ENR DAC2EN LL_APB1_GRP1_EnableClock\n + * APB1ENR PWREN LL_APB1_GRP1_EnableClock\n + * APB1ENR DAC1EN LL_APB1_GRP1_EnableClock\n + * APB1ENR CECEN LL_APB1_GRP1_EnableClock\n + * APB1ENR I2C3EN 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_TIM18 (*) + * @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_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_USB (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN (*) + * @arg @ref LL_APB1_GRP1_PERIPH_DAC2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_PWR + * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 + * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) + * @arg @ref LL_APB1_GRP1_PERIPH_I2C3 (*) + * + * (*) 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 TIM18EN 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 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 USBEN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR CANEN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR DAC2EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR PWREN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR DAC1EN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR CECEN LL_APB1_GRP1_IsEnabledClock\n + * APB1ENR I2C3EN 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_TIM18 (*) + * @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_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_USB (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN (*) + * @arg @ref LL_APB1_GRP1_PERIPH_DAC2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_PWR + * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 + * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) + * @arg @ref LL_APB1_GRP1_PERIPH_I2C3 (*) + * + * (*) 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 TIM18EN 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 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 USBEN LL_APB1_GRP1_DisableClock\n + * APB1ENR CANEN LL_APB1_GRP1_DisableClock\n + * APB1ENR DAC2EN LL_APB1_GRP1_DisableClock\n + * APB1ENR PWREN LL_APB1_GRP1_DisableClock\n + * APB1ENR DAC1EN LL_APB1_GRP1_DisableClock\n + * APB1ENR CECEN LL_APB1_GRP1_DisableClock\n + * APB1ENR I2C3EN 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_TIM18 (*) + * @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_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_USB (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN (*) + * @arg @ref LL_APB1_GRP1_PERIPH_DAC2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_PWR + * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 + * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) + * @arg @ref LL_APB1_GRP1_PERIPH_I2C3 (*) + * + * (*) 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 TIM18RST 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 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 USBRST LL_APB1_GRP1_ForceReset\n + * APB1RSTR CANRST LL_APB1_GRP1_ForceReset\n + * APB1RSTR DAC2RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR PWRRST LL_APB1_GRP1_ForceReset\n + * APB1RSTR DAC1RST LL_APB1_GRP1_ForceReset\n + * APB1RSTR CECRST LL_APB1_GRP1_ForceReset\n + * APB1RSTR I2C3RST LL_APB1_GRP1_ForceReset + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_APB1_GRP1_PERIPH_ALL + * @arg @ref LL_APB1_GRP1_PERIPH_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_TIM18 (*) + * @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_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_USB (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN (*) + * @arg @ref LL_APB1_GRP1_PERIPH_DAC2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_PWR + * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 + * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) + * @arg @ref LL_APB1_GRP1_PERIPH_I2C3 (*) + * + * (*) 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 TIM18RST 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 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 USBRST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR CANRST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR DAC2RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR PWRRST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR DAC1RST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR CECRST LL_APB1_GRP1_ReleaseReset\n + * APB1RSTR I2C3RST LL_APB1_GRP1_ReleaseReset + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_APB1_GRP1_PERIPH_ALL + * @arg @ref LL_APB1_GRP1_PERIPH_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_TIM18 (*) + * @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_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_USB (*) + * @arg @ref LL_APB1_GRP1_PERIPH_CAN (*) + * @arg @ref LL_APB1_GRP1_PERIPH_DAC2 (*) + * @arg @ref LL_APB1_GRP1_PERIPH_PWR + * @arg @ref LL_APB1_GRP1_PERIPH_DAC1 + * @arg @ref LL_APB1_GRP1_PERIPH_CEC (*) + * @arg @ref LL_APB1_GRP1_PERIPH_I2C3 (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_APB1_GRP1_ReleaseReset(uint32_t Periphs) +{ + CLEAR_BIT(RCC->APB1RSTR, Periphs); +} + +/** + * @} + */ + +/** @defgroup BUS_LL_EF_APB2 APB2 + * @{ + */ + +/** + * @brief Enable APB2 peripherals clock. + * @rmtoll APB2ENR SYSCFGEN LL_APB2_GRP1_EnableClock\n + * APB2ENR ADC1EN LL_APB2_GRP1_EnableClock\n + * APB2ENR TIM1EN LL_APB2_GRP1_EnableClock\n + * APB2ENR SPI1EN LL_APB2_GRP1_EnableClock\n + * APB2ENR TIM8EN LL_APB2_GRP1_EnableClock\n + * APB2ENR USART1EN LL_APB2_GRP1_EnableClock\n + * APB2ENR SPI4EN LL_APB2_GRP1_EnableClock\n + * APB2ENR TIM15EN LL_APB2_GRP1_EnableClock\n + * APB2ENR TIM16EN LL_APB2_GRP1_EnableClock\n + * APB2ENR TIM17EN LL_APB2_GRP1_EnableClock\n + * APB2ENR TIM19EN LL_APB2_GRP1_EnableClock\n + * APB2ENR TIM20EN LL_APB2_GRP1_EnableClock\n + * APB2ENR HRTIM1EN LL_APB2_GRP1_EnableClock\n + * APB2ENR SDADC1EN LL_APB2_GRP1_EnableClock\n + * APB2ENR SDADC2EN LL_APB2_GRP1_EnableClock\n + * APB2ENR SDADC3EN LL_APB2_GRP1_EnableClock + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_APB2_GRP1_PERIPH_SYSCFG + * @arg @ref LL_APB2_GRP1_PERIPH_ADC1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_USART1 + * @arg @ref LL_APB2_GRP1_PERIPH_SPI4 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM15 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM16 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM17 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM19 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM20 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_HRTIM1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SDADC1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SDADC2 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SDADC3 (*) + * + * (*) 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 SYSCFGEN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR ADC1EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR TIM1EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR SPI1EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR TIM8EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR USART1EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR SPI4EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR TIM15EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR TIM16EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR TIM17EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR TIM19EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR TIM20EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR HRTIM1EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR SDADC1EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR SDADC2EN LL_APB2_GRP1_IsEnabledClock\n + * APB2ENR SDADC3EN LL_APB2_GRP1_IsEnabledClock + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_APB2_GRP1_PERIPH_SYSCFG + * @arg @ref LL_APB2_GRP1_PERIPH_ADC1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_USART1 + * @arg @ref LL_APB2_GRP1_PERIPH_SPI4 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM15 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM16 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM17 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM19 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM20 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_HRTIM1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SDADC1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SDADC2 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SDADC3 (*) + * + * (*) 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 SYSCFGEN LL_APB2_GRP1_DisableClock\n + * APB2ENR ADC1EN LL_APB2_GRP1_DisableClock\n + * APB2ENR TIM1EN LL_APB2_GRP1_DisableClock\n + * APB2ENR SPI1EN LL_APB2_GRP1_DisableClock\n + * APB2ENR TIM8EN LL_APB2_GRP1_DisableClock\n + * APB2ENR USART1EN LL_APB2_GRP1_DisableClock\n + * APB2ENR SPI4EN LL_APB2_GRP1_DisableClock\n + * APB2ENR TIM15EN LL_APB2_GRP1_DisableClock\n + * APB2ENR TIM16EN LL_APB2_GRP1_DisableClock\n + * APB2ENR TIM17EN LL_APB2_GRP1_DisableClock\n + * APB2ENR TIM19EN LL_APB2_GRP1_DisableClock\n + * APB2ENR TIM20EN LL_APB2_GRP1_DisableClock\n + * APB2ENR HRTIM1EN LL_APB2_GRP1_DisableClock\n + * APB2ENR SDADC1EN LL_APB2_GRP1_DisableClock\n + * APB2ENR SDADC2EN LL_APB2_GRP1_DisableClock\n + * APB2ENR SDADC3EN LL_APB2_GRP1_DisableClock + * @param Periphs This parameter can be a combination of the following values: + * @arg @ref LL_APB2_GRP1_PERIPH_SYSCFG + * @arg @ref LL_APB2_GRP1_PERIPH_ADC1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_USART1 + * @arg @ref LL_APB2_GRP1_PERIPH_SPI4 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM15 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM16 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM17 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM19 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM20 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_HRTIM1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SDADC1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SDADC2 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SDADC3 (*) + * + * (*) 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 SYSCFGRST LL_APB2_GRP1_ForceReset\n + * APB2RSTR ADC1RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR TIM1RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR SPI1RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR TIM8RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR USART1RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR SPI4RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR TIM15RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR TIM16RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR TIM17RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR TIM19RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR TIM20RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR HRTIM1RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR SDADC1RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR SDADC2RST LL_APB2_GRP1_ForceReset\n + * APB2RSTR SDADC3RST 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_SYSCFG + * @arg @ref LL_APB2_GRP1_PERIPH_ADC1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_USART1 + * @arg @ref LL_APB2_GRP1_PERIPH_SPI4 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM15 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM16 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM17 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM19 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM20 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_HRTIM1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SDADC1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SDADC2 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SDADC3 (*) + * + * (*) 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 SYSCFGRST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR ADC1RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR TIM1RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR SPI1RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR TIM8RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR USART1RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR SPI4RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR TIM15RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR TIM16RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR TIM17RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR TIM19RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR TIM20RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR HRTIM1RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR SDADC1RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR SDADC2RST LL_APB2_GRP1_ReleaseReset\n + * APB2RSTR SDADC3RST 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_SYSCFG + * @arg @ref LL_APB2_GRP1_PERIPH_ADC1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SPI1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM8 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_USART1 + * @arg @ref LL_APB2_GRP1_PERIPH_SPI4 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM15 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM16 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM17 + * @arg @ref LL_APB2_GRP1_PERIPH_TIM19 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_TIM20 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_HRTIM1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SDADC1 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SDADC2 (*) + * @arg @ref LL_APB2_GRP1_PERIPH_SDADC3 (*) + * + * (*) value not defined in all devices. + * @retval None +*/ +__STATIC_INLINE void LL_APB2_GRP1_ReleaseReset(uint32_t Periphs) +{ + CLEAR_BIT(RCC->APB2RSTR, Periphs); +} + +/** + * @} + */ + + +/** + * @} + */ + +/** + * @} + */ + +#endif /* defined(RCC) */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F3xx_LL_BUS_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_cortex.h b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_cortex.h new file mode 100644 index 0000000..33d6af6 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_cortex.h @@ -0,0 +1,640 @@ +/** + ****************************************************************************** + * @file stm32f3xx_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) 2016 STMicroelectronics. + * All rights reserved.

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F3xx_LL_CORTEX_H +#define __STM32F3xx_LL_CORTEX_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f3xx.h" + +/** @addtogroup STM32F3xx_LL_Driver + * @{ + */ + +/** @defgroup CORTEX_LL CORTEX + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ + +/* Private constants ---------------------------------------------------------*/ + +/* Private macros ------------------------------------------------------------*/ + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/** @defgroup CORTEX_LL_Exported_Constants CORTEX Exported Constants + * @{ + */ + +/** @defgroup CORTEX_LL_EC_CLKSOURCE_HCLK SYSTICK Clock Source + * @{ + */ +#define LL_SYSTICK_CLKSOURCE_HCLK_DIV8 0x00000000U /*!< AHB clock divided by 8 selected as SysTick clock source.*/ +#define LL_SYSTICK_CLKSOURCE_HCLK SysTick_CTRL_CLKSOURCE_Msk /*!< AHB clock selected as SysTick clock source. */ +/** + * @} + */ + +/** @defgroup CORTEX_LL_EC_FAULT Handler Fault type + * @{ + */ +#define LL_HANDLER_FAULT_USG SCB_SHCSR_USGFAULTENA_Msk /*!< Usage fault */ +#define LL_HANDLER_FAULT_BUS SCB_SHCSR_BUSFAULTENA_Msk /*!< Bus fault */ +#define LL_HANDLER_FAULT_MEM SCB_SHCSR_MEMFAULTENA_Msk /*!< Memory management fault */ +/** + * @} + */ + +#if __MPU_PRESENT + +/** @defgroup CORTEX_LL_EC_CTRL_HFNMI_PRIVDEF MPU Control + * @{ + */ +#define LL_MPU_CTRL_HFNMI_PRIVDEF_NONE 0x00000000U /*!< Disable NMI and privileged SW access */ +#define LL_MPU_CTRL_HARDFAULT_NMI MPU_CTRL_HFNMIENA_Msk /*!< Enables the operation of MPU during hard fault, NMI, and FAULTMASK handlers */ +#define LL_MPU_CTRL_PRIVILEGED_DEFAULT MPU_CTRL_PRIVDEFENA_Msk /*!< Enable privileged software access to default memory map */ +#define LL_MPU_CTRL_HFNMI_PRIVDEF (MPU_CTRL_HFNMIENA_Msk | MPU_CTRL_PRIVDEFENA_Msk) /*!< Enable NMI and privileged SW access */ +/** + * @} + */ + +/** @defgroup CORTEX_LL_EC_REGION MPU Region Number + * @{ + */ +#define LL_MPU_REGION_NUMBER0 0x00U /*!< REGION Number 0 */ +#define LL_MPU_REGION_NUMBER1 0x01U /*!< REGION Number 1 */ +#define LL_MPU_REGION_NUMBER2 0x02U /*!< REGION Number 2 */ +#define LL_MPU_REGION_NUMBER3 0x03U /*!< REGION Number 3 */ +#define LL_MPU_REGION_NUMBER4 0x04U /*!< REGION Number 4 */ +#define LL_MPU_REGION_NUMBER5 0x05U /*!< REGION Number 5 */ +#define LL_MPU_REGION_NUMBER6 0x06U /*!< REGION Number 6 */ +#define LL_MPU_REGION_NUMBER7 0x07U /*!< REGION Number 7 */ +/** + * @} + */ + +/** @defgroup CORTEX_LL_EC_REGION_SIZE MPU Region Size + * @{ + */ +#define LL_MPU_REGION_SIZE_32B (0x04U << MPU_RASR_SIZE_Pos) /*!< 32B Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_64B (0x05U << MPU_RASR_SIZE_Pos) /*!< 64B Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_128B (0x06U << MPU_RASR_SIZE_Pos) /*!< 128B Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_256B (0x07U << MPU_RASR_SIZE_Pos) /*!< 256B Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_512B (0x08U << MPU_RASR_SIZE_Pos) /*!< 512B Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_1KB (0x09U << MPU_RASR_SIZE_Pos) /*!< 1KB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_2KB (0x0AU << MPU_RASR_SIZE_Pos) /*!< 2KB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_4KB (0x0BU << MPU_RASR_SIZE_Pos) /*!< 4KB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_8KB (0x0CU << MPU_RASR_SIZE_Pos) /*!< 8KB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_16KB (0x0DU << MPU_RASR_SIZE_Pos) /*!< 16KB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_32KB (0x0EU << MPU_RASR_SIZE_Pos) /*!< 32KB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_64KB (0x0FU << MPU_RASR_SIZE_Pos) /*!< 64KB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_128KB (0x10U << MPU_RASR_SIZE_Pos) /*!< 128KB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_256KB (0x11U << MPU_RASR_SIZE_Pos) /*!< 256KB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_512KB (0x12U << MPU_RASR_SIZE_Pos) /*!< 512KB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_1MB (0x13U << MPU_RASR_SIZE_Pos) /*!< 1MB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_2MB (0x14U << MPU_RASR_SIZE_Pos) /*!< 2MB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_4MB (0x15U << MPU_RASR_SIZE_Pos) /*!< 4MB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_8MB (0x16U << MPU_RASR_SIZE_Pos) /*!< 8MB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_16MB (0x17U << MPU_RASR_SIZE_Pos) /*!< 16MB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_32MB (0x18U << MPU_RASR_SIZE_Pos) /*!< 32MB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_64MB (0x19U << MPU_RASR_SIZE_Pos) /*!< 64MB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_128MB (0x1AU << MPU_RASR_SIZE_Pos) /*!< 128MB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_256MB (0x1BU << MPU_RASR_SIZE_Pos) /*!< 256MB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_512MB (0x1CU << MPU_RASR_SIZE_Pos) /*!< 512MB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_1GB (0x1DU << MPU_RASR_SIZE_Pos) /*!< 1GB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_2GB (0x1EU << MPU_RASR_SIZE_Pos) /*!< 2GB Size of the MPU protection region */ +#define LL_MPU_REGION_SIZE_4GB (0x1FU << MPU_RASR_SIZE_Pos) /*!< 4GB Size of the MPU protection region */ +/** + * @} + */ + +/** @defgroup CORTEX_LL_EC_REGION_PRIVILEDGES MPU Region Privileges + * @{ + */ +#define LL_MPU_REGION_NO_ACCESS (0x00U << MPU_RASR_AP_Pos) /*!< No access*/ +#define LL_MPU_REGION_PRIV_RW (0x01U << MPU_RASR_AP_Pos) /*!< RW privileged (privileged access only)*/ +#define LL_MPU_REGION_PRIV_RW_URO (0x02U << MPU_RASR_AP_Pos) /*!< RW privileged - RO user (Write in a user program generates a fault) */ +#define LL_MPU_REGION_FULL_ACCESS (0x03U << MPU_RASR_AP_Pos) /*!< RW privileged & user (Full access) */ +#define LL_MPU_REGION_PRIV_RO (0x05U << MPU_RASR_AP_Pos) /*!< RO privileged (privileged read only)*/ +#define LL_MPU_REGION_PRIV_RO_URO (0x06U << MPU_RASR_AP_Pos) /*!< RO privileged & user (read only) */ +/** + * @} + */ + +/** @defgroup CORTEX_LL_EC_TEX MPU TEX Level + * @{ + */ +#define LL_MPU_TEX_LEVEL0 (0x00U << MPU_RASR_TEX_Pos) /*!< b000 for TEX bits */ +#define LL_MPU_TEX_LEVEL1 (0x01U << MPU_RASR_TEX_Pos) /*!< b001 for TEX bits */ +#define LL_MPU_TEX_LEVEL2 (0x02U << MPU_RASR_TEX_Pos) /*!< b010 for TEX bits */ +#define LL_MPU_TEX_LEVEL4 (0x04U << MPU_RASR_TEX_Pos) /*!< b100 for TEX bits */ +/** + * @} + */ + +/** @defgroup CORTEX_LL_EC_INSTRUCTION_ACCESS MPU Instruction Access + * @{ + */ +#define LL_MPU_INSTRUCTION_ACCESS_ENABLE 0x00U /*!< Instruction fetches enabled */ +#define LL_MPU_INSTRUCTION_ACCESS_DISABLE MPU_RASR_XN_Msk /*!< Instruction fetches disabled*/ +/** + * @} + */ + +/** @defgroup CORTEX_LL_EC_SHAREABLE_ACCESS MPU Shareable Access + * @{ + */ +#define LL_MPU_ACCESS_SHAREABLE MPU_RASR_S_Msk /*!< Shareable memory attribute */ +#define LL_MPU_ACCESS_NOT_SHAREABLE 0x00U /*!< Not Shareable memory attribute */ +/** + * @} + */ + +/** @defgroup CORTEX_LL_EC_CACHEABLE_ACCESS MPU Cacheable Access + * @{ + */ +#define LL_MPU_ACCESS_CACHEABLE MPU_RASR_C_Msk /*!< Cacheable memory attribute */ +#define LL_MPU_ACCESS_NOT_CACHEABLE 0x00U /*!< Not Cacheable memory attribute */ +/** + * @} + */ + +/** @defgroup CORTEX_LL_EC_BUFFERABLE_ACCESS MPU Bufferable Access + * @{ + */ +#define LL_MPU_ACCESS_BUFFERABLE MPU_RASR_B_Msk /*!< Bufferable memory attribute */ +#define LL_MPU_ACCESS_NOT_BUFFERABLE 0x00U /*!< Not Bufferable memory attribute */ +/** + * @} + */ +#endif /* __MPU_PRESENT */ +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup CORTEX_LL_Exported_Functions CORTEX Exported Functions + * @{ + */ + +/** @defgroup CORTEX_LL_EF_SYSTICK SYSTICK + * @{ + */ + +/** + * @brief This function checks if the Systick counter flag is active or not. + * @note It can be used in timeout function on application side. + * @rmtoll STK_CTRL COUNTFLAG LL_SYSTICK_IsActiveCounterFlag + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SYSTICK_IsActiveCounterFlag(void) +{ + return ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == (SysTick_CTRL_COUNTFLAG_Msk)); +} + +/** + * @brief Configures the SysTick clock source + * @rmtoll STK_CTRL CLKSOURCE LL_SYSTICK_SetClkSource + * @param Source This parameter can be one of the following values: + * @arg @ref LL_SYSTICK_CLKSOURCE_HCLK_DIV8 + * @arg @ref LL_SYSTICK_CLKSOURCE_HCLK + * @retval None + */ +__STATIC_INLINE void LL_SYSTICK_SetClkSource(uint32_t Source) +{ + if (Source == LL_SYSTICK_CLKSOURCE_HCLK) + { + SET_BIT(SysTick->CTRL, LL_SYSTICK_CLKSOURCE_HCLK); + } + else + { + CLEAR_BIT(SysTick->CTRL, LL_SYSTICK_CLKSOURCE_HCLK); + } +} + +/** + * @brief Get the SysTick clock source + * @rmtoll STK_CTRL CLKSOURCE LL_SYSTICK_GetClkSource + * @retval Returned value can be one of the following values: + * @arg @ref LL_SYSTICK_CLKSOURCE_HCLK_DIV8 + * @arg @ref LL_SYSTICK_CLKSOURCE_HCLK + */ +__STATIC_INLINE uint32_t LL_SYSTICK_GetClkSource(void) +{ + return READ_BIT(SysTick->CTRL, LL_SYSTICK_CLKSOURCE_HCLK); +} + +/** + * @brief Enable SysTick exception request + * @rmtoll STK_CTRL TICKINT LL_SYSTICK_EnableIT + * @retval None + */ +__STATIC_INLINE void LL_SYSTICK_EnableIT(void) +{ + SET_BIT(SysTick->CTRL, SysTick_CTRL_TICKINT_Msk); +} + +/** + * @brief Disable SysTick exception request + * @rmtoll STK_CTRL TICKINT LL_SYSTICK_DisableIT + * @retval None + */ +__STATIC_INLINE void LL_SYSTICK_DisableIT(void) +{ + CLEAR_BIT(SysTick->CTRL, SysTick_CTRL_TICKINT_Msk); +} + +/** + * @brief Checks if the SYSTICK interrupt is enabled or disabled. + * @rmtoll STK_CTRL TICKINT LL_SYSTICK_IsEnabledIT + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SYSTICK_IsEnabledIT(void) +{ + return (READ_BIT(SysTick->CTRL, SysTick_CTRL_TICKINT_Msk) == (SysTick_CTRL_TICKINT_Msk)); +} + +/** + * @} + */ + +/** @defgroup CORTEX_LL_EF_LOW_POWER_MODE LOW POWER MODE + * @{ + */ + +/** + * @brief Processor uses sleep as its low power mode + * @rmtoll SCB_SCR SLEEPDEEP LL_LPM_EnableSleep + * @retval None + */ +__STATIC_INLINE void LL_LPM_EnableSleep(void) +{ + /* Clear SLEEPDEEP bit of Cortex System Control Register */ + CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); +} + +/** + * @brief Processor uses deep sleep as its low power mode + * @rmtoll SCB_SCR SLEEPDEEP LL_LPM_EnableDeepSleep + * @retval None + */ +__STATIC_INLINE void LL_LPM_EnableDeepSleep(void) +{ + /* Set SLEEPDEEP bit of Cortex System Control Register */ + SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPDEEP_Msk)); +} + +/** + * @brief Configures sleep-on-exit when returning from Handler mode to Thread mode. + * @note Setting this bit to 1 enables an interrupt-driven application to avoid returning to an + * empty main application. + * @rmtoll SCB_SCR SLEEPONEXIT LL_LPM_EnableSleepOnExit + * @retval None + */ +__STATIC_INLINE void LL_LPM_EnableSleepOnExit(void) +{ + /* Set SLEEPONEXIT bit of Cortex System Control Register */ + SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk)); +} + +/** + * @brief Do not sleep when returning to Thread mode. + * @rmtoll SCB_SCR SLEEPONEXIT LL_LPM_DisableSleepOnExit + * @retval None + */ +__STATIC_INLINE void LL_LPM_DisableSleepOnExit(void) +{ + /* Clear SLEEPONEXIT bit of Cortex System Control Register */ + CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk)); +} + +/** + * @brief Enabled events and all interrupts, including disabled interrupts, can wakeup the + * processor. + * @rmtoll SCB_SCR SEVEONPEND LL_LPM_EnableEventOnPend + * @retval None + */ +__STATIC_INLINE void LL_LPM_EnableEventOnPend(void) +{ + /* Set SEVEONPEND bit of Cortex System Control Register */ + SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk)); +} + +/** + * @brief Only enabled interrupts or events can wakeup the processor, disabled interrupts are + * excluded + * @rmtoll SCB_SCR SEVEONPEND LL_LPM_DisableEventOnPend + * @retval None + */ +__STATIC_INLINE void LL_LPM_DisableEventOnPend(void) +{ + /* Clear SEVEONPEND bit of Cortex System Control Register */ + CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk)); +} + +/** + * @} + */ + +/** @defgroup CORTEX_LL_EF_HANDLER HANDLER + * @{ + */ + +/** + * @brief Enable a fault in System handler control register (SHCSR) + * @rmtoll SCB_SHCSR MEMFAULTENA LL_HANDLER_EnableFault + * @param Fault This parameter can be a combination of the following values: + * @arg @ref LL_HANDLER_FAULT_USG + * @arg @ref LL_HANDLER_FAULT_BUS + * @arg @ref LL_HANDLER_FAULT_MEM + * @retval None + */ +__STATIC_INLINE void LL_HANDLER_EnableFault(uint32_t Fault) +{ + /* Enable the system handler fault */ + SET_BIT(SCB->SHCSR, Fault); +} + +/** + * @brief Disable a fault in System handler control register (SHCSR) + * @rmtoll SCB_SHCSR MEMFAULTENA LL_HANDLER_DisableFault + * @param Fault This parameter can be a combination of the following values: + * @arg @ref LL_HANDLER_FAULT_USG + * @arg @ref LL_HANDLER_FAULT_BUS + * @arg @ref LL_HANDLER_FAULT_MEM + * @retval None + */ +__STATIC_INLINE void LL_HANDLER_DisableFault(uint32_t Fault) +{ + /* Disable the system handler fault */ + CLEAR_BIT(SCB->SHCSR, Fault); +} + +/** + * @} + */ + +/** @defgroup CORTEX_LL_EF_MCU_INFO MCU INFO + * @{ + */ + +/** + * @brief Get Implementer code + * @rmtoll SCB_CPUID IMPLEMENTER LL_CPUID_GetImplementer + * @retval Value should be equal to 0x41 for ARM + */ +__STATIC_INLINE uint32_t LL_CPUID_GetImplementer(void) +{ + return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_IMPLEMENTER_Msk) >> SCB_CPUID_IMPLEMENTER_Pos); +} + +/** + * @brief Get Variant number (The r value in the rnpn product revision identifier) + * @rmtoll SCB_CPUID VARIANT LL_CPUID_GetVariant + * @retval Value between 0 and 255 (0x0: revision 0) + */ +__STATIC_INLINE uint32_t LL_CPUID_GetVariant(void) +{ + return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_VARIANT_Msk) >> SCB_CPUID_VARIANT_Pos); +} + +/** + * @brief Get Constant number + * @rmtoll SCB_CPUID ARCHITECTURE LL_CPUID_GetConstant + * @retval Value should be equal to 0xF for Cortex-M4 devices + */ +__STATIC_INLINE uint32_t LL_CPUID_GetConstant(void) +{ + return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_ARCHITECTURE_Msk) >> SCB_CPUID_ARCHITECTURE_Pos); +} + +/** + * @brief Get Part number + * @rmtoll SCB_CPUID PARTNO LL_CPUID_GetParNo + * @retval Value should be equal to 0xC24 for Cortex-M4 + */ +__STATIC_INLINE uint32_t LL_CPUID_GetParNo(void) +{ + return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_PARTNO_Msk) >> SCB_CPUID_PARTNO_Pos); +} + +/** + * @brief Get Revision number (The p value in the rnpn product revision identifier, indicates patch release) + * @rmtoll SCB_CPUID REVISION LL_CPUID_GetRevision + * @retval Value between 0 and 255 (0x1: patch 1) + */ +__STATIC_INLINE uint32_t LL_CPUID_GetRevision(void) +{ + return (uint32_t)(READ_BIT(SCB->CPUID, SCB_CPUID_REVISION_Msk) >> SCB_CPUID_REVISION_Pos); +} + +/** + * @} + */ + +#if __MPU_PRESENT +/** @defgroup CORTEX_LL_EF_MPU MPU + * @{ + */ + +/** + * @brief Enable MPU with input options + * @rmtoll MPU_CTRL ENABLE LL_MPU_Enable + * @param Options This parameter can be one of the following values: + * @arg @ref LL_MPU_CTRL_HFNMI_PRIVDEF_NONE + * @arg @ref LL_MPU_CTRL_HARDFAULT_NMI + * @arg @ref LL_MPU_CTRL_PRIVILEGED_DEFAULT + * @arg @ref LL_MPU_CTRL_HFNMI_PRIVDEF + * @retval None + */ +__STATIC_INLINE void LL_MPU_Enable(uint32_t Options) +{ + /* Enable the MPU*/ + WRITE_REG(MPU->CTRL, (MPU_CTRL_ENABLE_Msk | Options)); + /* Ensure MPU settings take effects */ + __DSB(); + /* Sequence instruction fetches using update settings */ + __ISB(); +} + +/** + * @brief Disable MPU + * @rmtoll MPU_CTRL ENABLE LL_MPU_Disable + * @retval None + */ +__STATIC_INLINE void LL_MPU_Disable(void) +{ + /* Make sure outstanding transfers are done */ + __DMB(); + /* Disable MPU*/ + WRITE_REG(MPU->CTRL, 0U); +} + +/** + * @brief Check if MPU is enabled or not + * @rmtoll MPU_CTRL ENABLE LL_MPU_IsEnabled + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_MPU_IsEnabled(void) +{ + return (READ_BIT(MPU->CTRL, MPU_CTRL_ENABLE_Msk) == (MPU_CTRL_ENABLE_Msk)); +} + +/** + * @brief Enable a MPU region + * @rmtoll MPU_RASR ENABLE LL_MPU_EnableRegion + * @param Region This parameter can be one of the following values: + * @arg @ref LL_MPU_REGION_NUMBER0 + * @arg @ref LL_MPU_REGION_NUMBER1 + * @arg @ref LL_MPU_REGION_NUMBER2 + * @arg @ref LL_MPU_REGION_NUMBER3 + * @arg @ref LL_MPU_REGION_NUMBER4 + * @arg @ref LL_MPU_REGION_NUMBER5 + * @arg @ref LL_MPU_REGION_NUMBER6 + * @arg @ref LL_MPU_REGION_NUMBER7 + * @retval None + */ +__STATIC_INLINE void LL_MPU_EnableRegion(uint32_t Region) +{ + /* Set Region number */ + WRITE_REG(MPU->RNR, Region); + /* Enable the MPU region */ + SET_BIT(MPU->RASR, MPU_RASR_ENABLE_Msk); +} + +/** + * @brief Configure and enable a region + * @rmtoll MPU_RNR REGION LL_MPU_ConfigRegion\n + * MPU_RBAR REGION LL_MPU_ConfigRegion\n + * MPU_RBAR ADDR LL_MPU_ConfigRegion\n + * MPU_RASR XN LL_MPU_ConfigRegion\n + * MPU_RASR AP LL_MPU_ConfigRegion\n + * MPU_RASR S LL_MPU_ConfigRegion\n + * MPU_RASR C LL_MPU_ConfigRegion\n + * MPU_RASR B LL_MPU_ConfigRegion\n + * MPU_RASR SIZE LL_MPU_ConfigRegion + * @param Region This parameter can be one of the following values: + * @arg @ref LL_MPU_REGION_NUMBER0 + * @arg @ref LL_MPU_REGION_NUMBER1 + * @arg @ref LL_MPU_REGION_NUMBER2 + * @arg @ref LL_MPU_REGION_NUMBER3 + * @arg @ref LL_MPU_REGION_NUMBER4 + * @arg @ref LL_MPU_REGION_NUMBER5 + * @arg @ref LL_MPU_REGION_NUMBER6 + * @arg @ref LL_MPU_REGION_NUMBER7 + * @param Address Value of region base address + * @param SubRegionDisable Sub-region disable value between Min_Data = 0x00 and Max_Data = 0xFF + * @param Attributes This parameter can be a combination of the following values: + * @arg @ref LL_MPU_REGION_SIZE_32B or @ref LL_MPU_REGION_SIZE_64B or @ref LL_MPU_REGION_SIZE_128B or @ref LL_MPU_REGION_SIZE_256B or @ref LL_MPU_REGION_SIZE_512B + * or @ref LL_MPU_REGION_SIZE_1KB or @ref LL_MPU_REGION_SIZE_2KB or @ref LL_MPU_REGION_SIZE_4KB or @ref LL_MPU_REGION_SIZE_8KB or @ref LL_MPU_REGION_SIZE_16KB + * or @ref LL_MPU_REGION_SIZE_32KB or @ref LL_MPU_REGION_SIZE_64KB or @ref LL_MPU_REGION_SIZE_128KB or @ref LL_MPU_REGION_SIZE_256KB or @ref LL_MPU_REGION_SIZE_512KB + * or @ref LL_MPU_REGION_SIZE_1MB or @ref LL_MPU_REGION_SIZE_2MB or @ref LL_MPU_REGION_SIZE_4MB or @ref LL_MPU_REGION_SIZE_8MB or @ref LL_MPU_REGION_SIZE_16MB + * or @ref LL_MPU_REGION_SIZE_32MB or @ref LL_MPU_REGION_SIZE_64MB or @ref LL_MPU_REGION_SIZE_128MB or @ref LL_MPU_REGION_SIZE_256MB or @ref LL_MPU_REGION_SIZE_512MB + * or @ref LL_MPU_REGION_SIZE_1GB or @ref LL_MPU_REGION_SIZE_2GB or @ref LL_MPU_REGION_SIZE_4GB + * @arg @ref LL_MPU_REGION_NO_ACCESS or @ref LL_MPU_REGION_PRIV_RW or @ref LL_MPU_REGION_PRIV_RW_URO or @ref LL_MPU_REGION_FULL_ACCESS + * or @ref LL_MPU_REGION_PRIV_RO or @ref LL_MPU_REGION_PRIV_RO_URO + * @arg @ref LL_MPU_TEX_LEVEL0 or @ref LL_MPU_TEX_LEVEL1 or @ref LL_MPU_TEX_LEVEL2 or @ref LL_MPU_TEX_LEVEL4 + * @arg @ref LL_MPU_INSTRUCTION_ACCESS_ENABLE or @ref LL_MPU_INSTRUCTION_ACCESS_DISABLE + * @arg @ref LL_MPU_ACCESS_SHAREABLE or @ref LL_MPU_ACCESS_NOT_SHAREABLE + * @arg @ref LL_MPU_ACCESS_CACHEABLE or @ref LL_MPU_ACCESS_NOT_CACHEABLE + * @arg @ref LL_MPU_ACCESS_BUFFERABLE or @ref LL_MPU_ACCESS_NOT_BUFFERABLE + * @retval None + */ +__STATIC_INLINE void LL_MPU_ConfigRegion(uint32_t Region, uint32_t SubRegionDisable, uint32_t Address, uint32_t Attributes) +{ + /* Set Region number */ + WRITE_REG(MPU->RNR, Region); + /* Set base address */ + WRITE_REG(MPU->RBAR, (Address & 0xFFFFFFE0U)); + /* Configure MPU */ + WRITE_REG(MPU->RASR, (MPU_RASR_ENABLE_Msk | Attributes | SubRegionDisable << MPU_RASR_SRD_Pos)); +} + +/** + * @brief Disable a region + * @rmtoll MPU_RNR REGION LL_MPU_DisableRegion\n + * MPU_RASR ENABLE LL_MPU_DisableRegion + * @param Region This parameter can be one of the following values: + * @arg @ref LL_MPU_REGION_NUMBER0 + * @arg @ref LL_MPU_REGION_NUMBER1 + * @arg @ref LL_MPU_REGION_NUMBER2 + * @arg @ref LL_MPU_REGION_NUMBER3 + * @arg @ref LL_MPU_REGION_NUMBER4 + * @arg @ref LL_MPU_REGION_NUMBER5 + * @arg @ref LL_MPU_REGION_NUMBER6 + * @arg @ref LL_MPU_REGION_NUMBER7 + * @retval None + */ +__STATIC_INLINE void LL_MPU_DisableRegion(uint32_t Region) +{ + /* Set Region number */ + WRITE_REG(MPU->RNR, Region); + /* Disable the MPU region */ + CLEAR_BIT(MPU->RASR, MPU_RASR_ENABLE_Msk); +} + +/** + * @} + */ + +#endif /* __MPU_PRESENT */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F3xx_LL_CORTEX_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_dma.h b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_dma.h new file mode 100644 index 0000000..7a21e12 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_dma.h @@ -0,0 +1,1996 @@ +/** + ****************************************************************************** + * @file stm32f3xx_ll_dma.h + * @author MCD Application Team + * @brief Header file of DMA LL module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F3xx_LL_DMA_H +#define __STM32F3xx_LL_DMA_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f3xx.h" + +/** @addtogroup STM32F3xx_LL_Driver + * @{ + */ + +#if defined (DMA1) || defined (DMA2) + +/** @defgroup DMA_LL DMA + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/** @defgroup DMA_LL_Private_Variables DMA Private Variables + * @{ + */ +/* Array used to get the DMA channel register offset versus channel index LL_DMA_CHANNEL_x */ +static const uint8_t CHANNEL_OFFSET_TAB[] = +{ + (uint8_t)(DMA1_Channel1_BASE - DMA1_BASE), + (uint8_t)(DMA1_Channel2_BASE - DMA1_BASE), + (uint8_t)(DMA1_Channel3_BASE - DMA1_BASE), + (uint8_t)(DMA1_Channel4_BASE - DMA1_BASE), + (uint8_t)(DMA1_Channel5_BASE - DMA1_BASE), + (uint8_t)(DMA1_Channel6_BASE - DMA1_BASE), + (uint8_t)(DMA1_Channel7_BASE - DMA1_BASE) +}; +/** + * @} + */ + +/* Private constants ---------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup DMA_LL_Private_Macros DMA Private Macros + * @{ + */ +/** + * @} + */ +#endif /*USE_FULL_LL_DRIVER*/ + +/* Exported types ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup DMA_LL_ES_INIT DMA Exported Init structure + * @{ + */ +typedef struct +{ + uint32_t PeriphOrM2MSrcAddress; /*!< Specifies the peripheral base address for DMA transfer + or as Source base address in case of memory to memory transfer direction. + + This parameter must be a value between Min_Data = 0 and Max_Data = 0xFFFFFFFF. */ + + uint32_t MemoryOrM2MDstAddress; /*!< Specifies the memory base address for DMA transfer + or as Destination base address in case of memory to memory transfer direction. + + This parameter must be a value between Min_Data = 0 and Max_Data = 0xFFFFFFFF. */ + + uint32_t Direction; /*!< Specifies if the data will be transferred from memory to peripheral, + from memory to memory or from peripheral to memory. + This parameter can be a value of @ref DMA_LL_EC_DIRECTION + + This feature can be modified afterwards using unitary function @ref LL_DMA_SetDataTransferDirection(). */ + + uint32_t Mode; /*!< Specifies the normal or circular operation mode. + This parameter can be a value of @ref DMA_LL_EC_MODE + @note: The circular buffer mode cannot be used if the memory to memory + data transfer direction is configured on the selected Channel + + This feature can be modified afterwards using unitary function @ref LL_DMA_SetMode(). */ + + uint32_t PeriphOrM2MSrcIncMode; /*!< Specifies whether the Peripheral address or Source address in case of memory to memory transfer direction + is incremented or not. + This parameter can be a value of @ref DMA_LL_EC_PERIPH + + This feature can be modified afterwards using unitary function @ref LL_DMA_SetPeriphIncMode(). */ + + uint32_t MemoryOrM2MDstIncMode; /*!< Specifies whether the Memory address or Destination address in case of memory to memory transfer direction + is incremented or not. + This parameter can be a value of @ref DMA_LL_EC_MEMORY + + This feature can be modified afterwards using unitary function @ref LL_DMA_SetMemoryIncMode(). */ + + uint32_t PeriphOrM2MSrcDataSize; /*!< Specifies the Peripheral data size alignment or Source data size alignment (byte, half word, word) + in case of memory to memory transfer direction. + This parameter can be a value of @ref DMA_LL_EC_PDATAALIGN + + This feature can be modified afterwards using unitary function @ref LL_DMA_SetPeriphSize(). */ + + uint32_t MemoryOrM2MDstDataSize; /*!< Specifies the Memory data size alignment or Destination data size alignment (byte, half word, word) + in case of memory to memory transfer direction. + This parameter can be a value of @ref DMA_LL_EC_MDATAALIGN + + This feature can be modified afterwards using unitary function @ref LL_DMA_SetMemorySize(). */ + + uint32_t NbData; /*!< Specifies the number of data to transfer, in data unit. + The data unit is equal to the source buffer configuration set in PeripheralSize + or MemorySize parameters depending in the transfer direction. + This parameter must be a value between Min_Data = 0 and Max_Data = 0x0000FFFF + + This feature can be modified afterwards using unitary function @ref LL_DMA_SetDataLength(). */ + + uint32_t Priority; /*!< Specifies the channel priority level. + This parameter can be a value of @ref DMA_LL_EC_PRIORITY + + This feature can be modified afterwards using unitary function @ref LL_DMA_SetChannelPriorityLevel(). */ + +} LL_DMA_InitTypeDef; +/** + * @} + */ +#endif /*USE_FULL_LL_DRIVER*/ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup DMA_LL_Exported_Constants DMA Exported Constants + * @{ + */ +/** @defgroup DMA_LL_EC_CLEAR_FLAG Clear Flags Defines + * @brief Flags defines which can be used with LL_DMA_WriteReg function + * @{ + */ +#define LL_DMA_IFCR_CGIF1 DMA_IFCR_CGIF1 /*!< Channel 1 global flag */ +#define LL_DMA_IFCR_CTCIF1 DMA_IFCR_CTCIF1 /*!< Channel 1 transfer complete flag */ +#define LL_DMA_IFCR_CHTIF1 DMA_IFCR_CHTIF1 /*!< Channel 1 half transfer flag */ +#define LL_DMA_IFCR_CTEIF1 DMA_IFCR_CTEIF1 /*!< Channel 1 transfer error flag */ +#define LL_DMA_IFCR_CGIF2 DMA_IFCR_CGIF2 /*!< Channel 2 global flag */ +#define LL_DMA_IFCR_CTCIF2 DMA_IFCR_CTCIF2 /*!< Channel 2 transfer complete flag */ +#define LL_DMA_IFCR_CHTIF2 DMA_IFCR_CHTIF2 /*!< Channel 2 half transfer flag */ +#define LL_DMA_IFCR_CTEIF2 DMA_IFCR_CTEIF2 /*!< Channel 2 transfer error flag */ +#define LL_DMA_IFCR_CGIF3 DMA_IFCR_CGIF3 /*!< Channel 3 global flag */ +#define LL_DMA_IFCR_CTCIF3 DMA_IFCR_CTCIF3 /*!< Channel 3 transfer complete flag */ +#define LL_DMA_IFCR_CHTIF3 DMA_IFCR_CHTIF3 /*!< Channel 3 half transfer flag */ +#define LL_DMA_IFCR_CTEIF3 DMA_IFCR_CTEIF3 /*!< Channel 3 transfer error flag */ +#define LL_DMA_IFCR_CGIF4 DMA_IFCR_CGIF4 /*!< Channel 4 global flag */ +#define LL_DMA_IFCR_CTCIF4 DMA_IFCR_CTCIF4 /*!< Channel 4 transfer complete flag */ +#define LL_DMA_IFCR_CHTIF4 DMA_IFCR_CHTIF4 /*!< Channel 4 half transfer flag */ +#define LL_DMA_IFCR_CTEIF4 DMA_IFCR_CTEIF4 /*!< Channel 4 transfer error flag */ +#define LL_DMA_IFCR_CGIF5 DMA_IFCR_CGIF5 /*!< Channel 5 global flag */ +#define LL_DMA_IFCR_CTCIF5 DMA_IFCR_CTCIF5 /*!< Channel 5 transfer complete flag */ +#define LL_DMA_IFCR_CHTIF5 DMA_IFCR_CHTIF5 /*!< Channel 5 half transfer flag */ +#define LL_DMA_IFCR_CTEIF5 DMA_IFCR_CTEIF5 /*!< Channel 5 transfer error flag */ +#define LL_DMA_IFCR_CGIF6 DMA_IFCR_CGIF6 /*!< Channel 6 global flag */ +#define LL_DMA_IFCR_CTCIF6 DMA_IFCR_CTCIF6 /*!< Channel 6 transfer complete flag */ +#define LL_DMA_IFCR_CHTIF6 DMA_IFCR_CHTIF6 /*!< Channel 6 half transfer flag */ +#define LL_DMA_IFCR_CTEIF6 DMA_IFCR_CTEIF6 /*!< Channel 6 transfer error flag */ +#define LL_DMA_IFCR_CGIF7 DMA_IFCR_CGIF7 /*!< Channel 7 global flag */ +#define LL_DMA_IFCR_CTCIF7 DMA_IFCR_CTCIF7 /*!< Channel 7 transfer complete flag */ +#define LL_DMA_IFCR_CHTIF7 DMA_IFCR_CHTIF7 /*!< Channel 7 half transfer flag */ +#define LL_DMA_IFCR_CTEIF7 DMA_IFCR_CTEIF7 /*!< Channel 7 transfer error flag */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_GET_FLAG Get Flags Defines + * @brief Flags defines which can be used with LL_DMA_ReadReg function + * @{ + */ +#define LL_DMA_ISR_GIF1 DMA_ISR_GIF1 /*!< Channel 1 global flag */ +#define LL_DMA_ISR_TCIF1 DMA_ISR_TCIF1 /*!< Channel 1 transfer complete flag */ +#define LL_DMA_ISR_HTIF1 DMA_ISR_HTIF1 /*!< Channel 1 half transfer flag */ +#define LL_DMA_ISR_TEIF1 DMA_ISR_TEIF1 /*!< Channel 1 transfer error flag */ +#define LL_DMA_ISR_GIF2 DMA_ISR_GIF2 /*!< Channel 2 global flag */ +#define LL_DMA_ISR_TCIF2 DMA_ISR_TCIF2 /*!< Channel 2 transfer complete flag */ +#define LL_DMA_ISR_HTIF2 DMA_ISR_HTIF2 /*!< Channel 2 half transfer flag */ +#define LL_DMA_ISR_TEIF2 DMA_ISR_TEIF2 /*!< Channel 2 transfer error flag */ +#define LL_DMA_ISR_GIF3 DMA_ISR_GIF3 /*!< Channel 3 global flag */ +#define LL_DMA_ISR_TCIF3 DMA_ISR_TCIF3 /*!< Channel 3 transfer complete flag */ +#define LL_DMA_ISR_HTIF3 DMA_ISR_HTIF3 /*!< Channel 3 half transfer flag */ +#define LL_DMA_ISR_TEIF3 DMA_ISR_TEIF3 /*!< Channel 3 transfer error flag */ +#define LL_DMA_ISR_GIF4 DMA_ISR_GIF4 /*!< Channel 4 global flag */ +#define LL_DMA_ISR_TCIF4 DMA_ISR_TCIF4 /*!< Channel 4 transfer complete flag */ +#define LL_DMA_ISR_HTIF4 DMA_ISR_HTIF4 /*!< Channel 4 half transfer flag */ +#define LL_DMA_ISR_TEIF4 DMA_ISR_TEIF4 /*!< Channel 4 transfer error flag */ +#define LL_DMA_ISR_GIF5 DMA_ISR_GIF5 /*!< Channel 5 global flag */ +#define LL_DMA_ISR_TCIF5 DMA_ISR_TCIF5 /*!< Channel 5 transfer complete flag */ +#define LL_DMA_ISR_HTIF5 DMA_ISR_HTIF5 /*!< Channel 5 half transfer flag */ +#define LL_DMA_ISR_TEIF5 DMA_ISR_TEIF5 /*!< Channel 5 transfer error flag */ +#define LL_DMA_ISR_GIF6 DMA_ISR_GIF6 /*!< Channel 6 global flag */ +#define LL_DMA_ISR_TCIF6 DMA_ISR_TCIF6 /*!< Channel 6 transfer complete flag */ +#define LL_DMA_ISR_HTIF6 DMA_ISR_HTIF6 /*!< Channel 6 half transfer flag */ +#define LL_DMA_ISR_TEIF6 DMA_ISR_TEIF6 /*!< Channel 6 transfer error flag */ +#define LL_DMA_ISR_GIF7 DMA_ISR_GIF7 /*!< Channel 7 global flag */ +#define LL_DMA_ISR_TCIF7 DMA_ISR_TCIF7 /*!< Channel 7 transfer complete flag */ +#define LL_DMA_ISR_HTIF7 DMA_ISR_HTIF7 /*!< Channel 7 half transfer flag */ +#define LL_DMA_ISR_TEIF7 DMA_ISR_TEIF7 /*!< Channel 7 transfer error flag */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_IT IT Defines + * @brief IT defines which can be used with LL_DMA_ReadReg and LL_DMA_WriteReg functions + * @{ + */ +#define LL_DMA_CCR_TCIE DMA_CCR_TCIE /*!< Transfer complete interrupt */ +#define LL_DMA_CCR_HTIE DMA_CCR_HTIE /*!< Half Transfer interrupt */ +#define LL_DMA_CCR_TEIE DMA_CCR_TEIE /*!< Transfer error interrupt */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_CHANNEL CHANNEL + * @{ + */ +#define LL_DMA_CHANNEL_1 0x00000001U /*!< DMA Channel 1 */ +#define LL_DMA_CHANNEL_2 0x00000002U /*!< DMA Channel 2 */ +#define LL_DMA_CHANNEL_3 0x00000003U /*!< DMA Channel 3 */ +#define LL_DMA_CHANNEL_4 0x00000004U /*!< DMA Channel 4 */ +#define LL_DMA_CHANNEL_5 0x00000005U /*!< DMA Channel 5 */ +#define LL_DMA_CHANNEL_6 0x00000006U /*!< DMA Channel 6 */ +#define LL_DMA_CHANNEL_7 0x00000007U /*!< DMA Channel 7 */ +#if defined(USE_FULL_LL_DRIVER) +#define LL_DMA_CHANNEL_ALL 0xFFFF0000U /*!< DMA Channel all (used only for function @ref LL_DMA_DeInit(). */ +#endif /*USE_FULL_LL_DRIVER*/ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_DIRECTION Transfer Direction + * @{ + */ +#define LL_DMA_DIRECTION_PERIPH_TO_MEMORY 0x00000000U /*!< Peripheral to memory direction */ +#define LL_DMA_DIRECTION_MEMORY_TO_PERIPH DMA_CCR_DIR /*!< Memory to peripheral direction */ +#define LL_DMA_DIRECTION_MEMORY_TO_MEMORY DMA_CCR_MEM2MEM /*!< Memory to memory direction */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_MODE Transfer mode + * @{ + */ +#define LL_DMA_MODE_NORMAL 0x00000000U /*!< Normal Mode */ +#define LL_DMA_MODE_CIRCULAR DMA_CCR_CIRC /*!< Circular Mode */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_PERIPH Peripheral increment mode + * @{ + */ +#define LL_DMA_PERIPH_INCREMENT DMA_CCR_PINC /*!< Peripheral increment mode Enable */ +#define LL_DMA_PERIPH_NOINCREMENT 0x00000000U /*!< Peripheral increment mode Disable */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_MEMORY Memory increment mode + * @{ + */ +#define LL_DMA_MEMORY_INCREMENT DMA_CCR_MINC /*!< Memory increment mode Enable */ +#define LL_DMA_MEMORY_NOINCREMENT 0x00000000U /*!< Memory increment mode Disable */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_PDATAALIGN Peripheral data alignment + * @{ + */ +#define LL_DMA_PDATAALIGN_BYTE 0x00000000U /*!< Peripheral data alignment : Byte */ +#define LL_DMA_PDATAALIGN_HALFWORD DMA_CCR_PSIZE_0 /*!< Peripheral data alignment : HalfWord */ +#define LL_DMA_PDATAALIGN_WORD DMA_CCR_PSIZE_1 /*!< Peripheral data alignment : Word */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_MDATAALIGN Memory data alignment + * @{ + */ +#define LL_DMA_MDATAALIGN_BYTE 0x00000000U /*!< Memory data alignment : Byte */ +#define LL_DMA_MDATAALIGN_HALFWORD DMA_CCR_MSIZE_0 /*!< Memory data alignment : HalfWord */ +#define LL_DMA_MDATAALIGN_WORD DMA_CCR_MSIZE_1 /*!< Memory data alignment : Word */ +/** + * @} + */ + +/** @defgroup DMA_LL_EC_PRIORITY Transfer Priority level + * @{ + */ +#define LL_DMA_PRIORITY_LOW 0x00000000U /*!< Priority level : Low */ +#define LL_DMA_PRIORITY_MEDIUM DMA_CCR_PL_0 /*!< Priority level : Medium */ +#define LL_DMA_PRIORITY_HIGH DMA_CCR_PL_1 /*!< Priority level : High */ +#define LL_DMA_PRIORITY_VERYHIGH DMA_CCR_PL /*!< Priority level : Very_High */ +/** + * @} + */ + + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup DMA_LL_Exported_Macros DMA Exported Macros + * @{ + */ + +/** @defgroup DMA_LL_EM_WRITE_READ Common Write and read registers macros + * @{ + */ +/** + * @brief Write a value in DMA register + * @param __INSTANCE__ DMA Instance + * @param __REG__ Register to be written + * @param __VALUE__ Value to be written in the register + * @retval None + */ +#define LL_DMA_WriteReg(__INSTANCE__, __REG__, __VALUE__) WRITE_REG(__INSTANCE__->__REG__, (__VALUE__)) + +/** + * @brief Read a value in DMA register + * @param __INSTANCE__ DMA Instance + * @param __REG__ Register to be read + * @retval Register value + */ +#define LL_DMA_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__) +/** + * @} + */ + +/** @defgroup DMA_LL_EM_CONVERT_DMAxCHANNELy Convert DMAxChannely + * @{ + */ +/** + * @brief Convert DMAx_Channely into DMAx + * @param __CHANNEL_INSTANCE__ DMAx_Channely + * @retval DMAx + */ +#if defined(DMA2) +#define __LL_DMA_GET_INSTANCE(__CHANNEL_INSTANCE__) \ +(((uint32_t)(__CHANNEL_INSTANCE__) > ((uint32_t)DMA1_Channel7)) ? DMA2 : DMA1) +#else +#define __LL_DMA_GET_INSTANCE(__CHANNEL_INSTANCE__) (DMA1) +#endif + +/** + * @brief Convert DMAx_Channely into LL_DMA_CHANNEL_y + * @param __CHANNEL_INSTANCE__ DMAx_Channely + * @retval LL_DMA_CHANNEL_y + */ +#if defined (DMA2) +#if defined (DMA2_Channel6) && defined (DMA2_Channel7) +#define __LL_DMA_GET_CHANNEL(__CHANNEL_INSTANCE__) \ +(((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA1_Channel1)) ? LL_DMA_CHANNEL_1 : \ + ((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA2_Channel1)) ? LL_DMA_CHANNEL_1 : \ + ((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA1_Channel2)) ? LL_DMA_CHANNEL_2 : \ + ((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA2_Channel2)) ? LL_DMA_CHANNEL_2 : \ + ((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA1_Channel3)) ? LL_DMA_CHANNEL_3 : \ + ((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA2_Channel3)) ? LL_DMA_CHANNEL_3 : \ + ((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA1_Channel4)) ? LL_DMA_CHANNEL_4 : \ + ((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA2_Channel4)) ? LL_DMA_CHANNEL_4 : \ + ((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA1_Channel5)) ? LL_DMA_CHANNEL_5 : \ + ((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA2_Channel5)) ? LL_DMA_CHANNEL_5 : \ + ((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA1_Channel6)) ? LL_DMA_CHANNEL_6 : \ + ((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA2_Channel6)) ? LL_DMA_CHANNEL_6 : \ + LL_DMA_CHANNEL_7) +#else +#define __LL_DMA_GET_CHANNEL(__CHANNEL_INSTANCE__) \ +(((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA1_Channel1)) ? LL_DMA_CHANNEL_1 : \ + ((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA2_Channel1)) ? LL_DMA_CHANNEL_1 : \ + ((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA1_Channel2)) ? LL_DMA_CHANNEL_2 : \ + ((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA2_Channel2)) ? LL_DMA_CHANNEL_2 : \ + ((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA1_Channel3)) ? LL_DMA_CHANNEL_3 : \ + ((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA2_Channel3)) ? LL_DMA_CHANNEL_3 : \ + ((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA1_Channel4)) ? LL_DMA_CHANNEL_4 : \ + ((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA2_Channel4)) ? LL_DMA_CHANNEL_4 : \ + ((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA1_Channel5)) ? LL_DMA_CHANNEL_5 : \ + ((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA2_Channel5)) ? LL_DMA_CHANNEL_5 : \ + ((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA1_Channel6)) ? LL_DMA_CHANNEL_6 : \ + LL_DMA_CHANNEL_7) +#endif +#else +#define __LL_DMA_GET_CHANNEL(__CHANNEL_INSTANCE__) \ +(((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA1_Channel1)) ? LL_DMA_CHANNEL_1 : \ + ((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA1_Channel2)) ? LL_DMA_CHANNEL_2 : \ + ((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA1_Channel3)) ? LL_DMA_CHANNEL_3 : \ + ((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA1_Channel4)) ? LL_DMA_CHANNEL_4 : \ + ((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA1_Channel5)) ? LL_DMA_CHANNEL_5 : \ + ((uint32_t)(__CHANNEL_INSTANCE__) == ((uint32_t)DMA1_Channel6)) ? LL_DMA_CHANNEL_6 : \ + LL_DMA_CHANNEL_7) +#endif + +/** + * @brief Convert DMA Instance DMAx and LL_DMA_CHANNEL_y into DMAx_Channely + * @param __DMA_INSTANCE__ DMAx + * @param __CHANNEL__ LL_DMA_CHANNEL_y + * @retval DMAx_Channely + */ +#if defined (DMA2) +#if defined (DMA2_Channel6) && defined (DMA2_Channel7) +#define __LL_DMA_GET_CHANNEL_INSTANCE(__DMA_INSTANCE__, __CHANNEL__) \ +((((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_1))) ? DMA1_Channel1 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_1))) ? DMA2_Channel1 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_2))) ? DMA1_Channel2 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_2))) ? DMA2_Channel2 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_3))) ? DMA1_Channel3 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_3))) ? DMA2_Channel3 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_4))) ? DMA1_Channel4 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_4))) ? DMA2_Channel4 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_5))) ? DMA1_Channel5 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_5))) ? DMA2_Channel5 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_6))) ? DMA1_Channel6 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_6))) ? DMA2_Channel6 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_7))) ? DMA1_Channel7 : \ + DMA2_Channel7) +#else +#define __LL_DMA_GET_CHANNEL_INSTANCE(__DMA_INSTANCE__, __CHANNEL__) \ +((((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_1))) ? DMA1_Channel1 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_1))) ? DMA2_Channel1 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_2))) ? DMA1_Channel2 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_2))) ? DMA2_Channel2 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_3))) ? DMA1_Channel3 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_3))) ? DMA2_Channel3 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_4))) ? DMA1_Channel4 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_4))) ? DMA2_Channel4 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_5))) ? DMA1_Channel5 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA2)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_5))) ? DMA2_Channel5 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_6))) ? DMA1_Channel6 : \ + DMA1_Channel7) +#endif +#else +#define __LL_DMA_GET_CHANNEL_INSTANCE(__DMA_INSTANCE__, __CHANNEL__) \ +((((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_1))) ? DMA1_Channel1 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_2))) ? DMA1_Channel2 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_3))) ? DMA1_Channel3 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_4))) ? DMA1_Channel4 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_5))) ? DMA1_Channel5 : \ + (((uint32_t)(__DMA_INSTANCE__) == ((uint32_t)DMA1)) && ((uint32_t)(__CHANNEL__) == ((uint32_t)LL_DMA_CHANNEL_6))) ? DMA1_Channel6 : \ + DMA1_Channel7) +#endif + +/** + * @} + */ + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup DMA_LL_Exported_Functions DMA Exported Functions + * @{ + */ + +/** @defgroup DMA_LL_EF_Configuration Configuration + * @{ + */ +/** + * @brief Enable DMA channel. + * @rmtoll CCR EN LL_DMA_EnableChannel + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_EnableChannel(DMA_TypeDef *DMAx, uint32_t Channel) +{ + SET_BIT(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, DMA_CCR_EN); +} + +/** + * @brief Disable DMA channel. + * @rmtoll CCR EN LL_DMA_DisableChannel + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_DisableChannel(DMA_TypeDef *DMAx, uint32_t Channel) +{ + CLEAR_BIT(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, DMA_CCR_EN); +} + +/** + * @brief Check if DMA channel is enabled or disabled. + * @rmtoll CCR EN LL_DMA_IsEnabledChannel + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsEnabledChannel(DMA_TypeDef *DMAx, uint32_t Channel) +{ + return (READ_BIT(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, + DMA_CCR_EN) == (DMA_CCR_EN)); +} + +/** + * @brief Configure all parameters link to DMA transfer. + * @rmtoll CCR DIR LL_DMA_ConfigTransfer\n + * CCR MEM2MEM LL_DMA_ConfigTransfer\n + * CCR CIRC LL_DMA_ConfigTransfer\n + * CCR PINC LL_DMA_ConfigTransfer\n + * CCR MINC LL_DMA_ConfigTransfer\n + * CCR PSIZE LL_DMA_ConfigTransfer\n + * CCR MSIZE LL_DMA_ConfigTransfer\n + * CCR PL LL_DMA_ConfigTransfer + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @param Configuration This parameter must be a combination of all the following values: + * @arg @ref LL_DMA_DIRECTION_PERIPH_TO_MEMORY or @ref LL_DMA_DIRECTION_MEMORY_TO_PERIPH or @ref LL_DMA_DIRECTION_MEMORY_TO_MEMORY + * @arg @ref LL_DMA_MODE_NORMAL or @ref LL_DMA_MODE_CIRCULAR + * @arg @ref LL_DMA_PERIPH_INCREMENT or @ref LL_DMA_PERIPH_NOINCREMENT + * @arg @ref LL_DMA_MEMORY_INCREMENT or @ref LL_DMA_MEMORY_NOINCREMENT + * @arg @ref LL_DMA_PDATAALIGN_BYTE or @ref LL_DMA_PDATAALIGN_HALFWORD or @ref LL_DMA_PDATAALIGN_WORD + * @arg @ref LL_DMA_MDATAALIGN_BYTE or @ref LL_DMA_MDATAALIGN_HALFWORD or @ref LL_DMA_MDATAALIGN_WORD + * @arg @ref LL_DMA_PRIORITY_LOW or @ref LL_DMA_PRIORITY_MEDIUM or @ref LL_DMA_PRIORITY_HIGH or @ref LL_DMA_PRIORITY_VERYHIGH + * @retval None + */ +__STATIC_INLINE void LL_DMA_ConfigTransfer(DMA_TypeDef *DMAx, uint32_t Channel, uint32_t Configuration) +{ + MODIFY_REG(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, + DMA_CCR_DIR | DMA_CCR_MEM2MEM | DMA_CCR_CIRC | DMA_CCR_PINC | DMA_CCR_MINC | DMA_CCR_PSIZE | DMA_CCR_MSIZE | DMA_CCR_PL, + Configuration); +} + +/** + * @brief Set Data transfer direction (read from peripheral or from memory). + * @rmtoll CCR DIR LL_DMA_SetDataTransferDirection\n + * CCR MEM2MEM LL_DMA_SetDataTransferDirection + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @param Direction This parameter can be one of the following values: + * @arg @ref LL_DMA_DIRECTION_PERIPH_TO_MEMORY + * @arg @ref LL_DMA_DIRECTION_MEMORY_TO_PERIPH + * @arg @ref LL_DMA_DIRECTION_MEMORY_TO_MEMORY + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetDataTransferDirection(DMA_TypeDef *DMAx, uint32_t Channel, uint32_t Direction) +{ + MODIFY_REG(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, + DMA_CCR_DIR | DMA_CCR_MEM2MEM, Direction); +} + +/** + * @brief Get Data transfer direction (read from peripheral or from memory). + * @rmtoll CCR DIR LL_DMA_GetDataTransferDirection\n + * CCR MEM2MEM LL_DMA_GetDataTransferDirection + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA_DIRECTION_PERIPH_TO_MEMORY + * @arg @ref LL_DMA_DIRECTION_MEMORY_TO_PERIPH + * @arg @ref LL_DMA_DIRECTION_MEMORY_TO_MEMORY + */ +__STATIC_INLINE uint32_t LL_DMA_GetDataTransferDirection(DMA_TypeDef *DMAx, uint32_t Channel) +{ + return (READ_BIT(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, + DMA_CCR_DIR | DMA_CCR_MEM2MEM)); +} + +/** + * @brief Set DMA mode circular or normal. + * @note The circular buffer mode cannot be used if the memory-to-memory + * data transfer is configured on the selected Channel. + * @rmtoll CCR CIRC LL_DMA_SetMode + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @param Mode This parameter can be one of the following values: + * @arg @ref LL_DMA_MODE_NORMAL + * @arg @ref LL_DMA_MODE_CIRCULAR + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetMode(DMA_TypeDef *DMAx, uint32_t Channel, uint32_t Mode) +{ + MODIFY_REG(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, DMA_CCR_CIRC, + Mode); +} + +/** + * @brief Get DMA mode circular or normal. + * @rmtoll CCR CIRC LL_DMA_GetMode + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA_MODE_NORMAL + * @arg @ref LL_DMA_MODE_CIRCULAR + */ +__STATIC_INLINE uint32_t LL_DMA_GetMode(DMA_TypeDef *DMAx, uint32_t Channel) +{ + return (READ_BIT(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, + DMA_CCR_CIRC)); +} + +/** + * @brief Set Peripheral increment mode. + * @rmtoll CCR PINC LL_DMA_SetPeriphIncMode + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @param PeriphOrM2MSrcIncMode This parameter can be one of the following values: + * @arg @ref LL_DMA_PERIPH_INCREMENT + * @arg @ref LL_DMA_PERIPH_NOINCREMENT + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetPeriphIncMode(DMA_TypeDef *DMAx, uint32_t Channel, uint32_t PeriphOrM2MSrcIncMode) +{ + MODIFY_REG(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, DMA_CCR_PINC, + PeriphOrM2MSrcIncMode); +} + +/** + * @brief Get Peripheral increment mode. + * @rmtoll CCR PINC LL_DMA_GetPeriphIncMode + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA_PERIPH_INCREMENT + * @arg @ref LL_DMA_PERIPH_NOINCREMENT + */ +__STATIC_INLINE uint32_t LL_DMA_GetPeriphIncMode(DMA_TypeDef *DMAx, uint32_t Channel) +{ + return (READ_BIT(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, + DMA_CCR_PINC)); +} + +/** + * @brief Set Memory increment mode. + * @rmtoll CCR MINC LL_DMA_SetMemoryIncMode + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @param MemoryOrM2MDstIncMode This parameter can be one of the following values: + * @arg @ref LL_DMA_MEMORY_INCREMENT + * @arg @ref LL_DMA_MEMORY_NOINCREMENT + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetMemoryIncMode(DMA_TypeDef *DMAx, uint32_t Channel, uint32_t MemoryOrM2MDstIncMode) +{ + MODIFY_REG(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, DMA_CCR_MINC, + MemoryOrM2MDstIncMode); +} + +/** + * @brief Get Memory increment mode. + * @rmtoll CCR MINC LL_DMA_GetMemoryIncMode + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA_MEMORY_INCREMENT + * @arg @ref LL_DMA_MEMORY_NOINCREMENT + */ +__STATIC_INLINE uint32_t LL_DMA_GetMemoryIncMode(DMA_TypeDef *DMAx, uint32_t Channel) +{ + return (READ_BIT(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, + DMA_CCR_MINC)); +} + +/** + * @brief Set Peripheral size. + * @rmtoll CCR PSIZE LL_DMA_SetPeriphSize + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @param PeriphOrM2MSrcDataSize This parameter can be one of the following values: + * @arg @ref LL_DMA_PDATAALIGN_BYTE + * @arg @ref LL_DMA_PDATAALIGN_HALFWORD + * @arg @ref LL_DMA_PDATAALIGN_WORD + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetPeriphSize(DMA_TypeDef *DMAx, uint32_t Channel, uint32_t PeriphOrM2MSrcDataSize) +{ + MODIFY_REG(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, DMA_CCR_PSIZE, + PeriphOrM2MSrcDataSize); +} + +/** + * @brief Get Peripheral size. + * @rmtoll CCR PSIZE LL_DMA_GetPeriphSize + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA_PDATAALIGN_BYTE + * @arg @ref LL_DMA_PDATAALIGN_HALFWORD + * @arg @ref LL_DMA_PDATAALIGN_WORD + */ +__STATIC_INLINE uint32_t LL_DMA_GetPeriphSize(DMA_TypeDef *DMAx, uint32_t Channel) +{ + return (READ_BIT(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, + DMA_CCR_PSIZE)); +} + +/** + * @brief Set Memory size. + * @rmtoll CCR MSIZE LL_DMA_SetMemorySize + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @param MemoryOrM2MDstDataSize This parameter can be one of the following values: + * @arg @ref LL_DMA_MDATAALIGN_BYTE + * @arg @ref LL_DMA_MDATAALIGN_HALFWORD + * @arg @ref LL_DMA_MDATAALIGN_WORD + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetMemorySize(DMA_TypeDef *DMAx, uint32_t Channel, uint32_t MemoryOrM2MDstDataSize) +{ + MODIFY_REG(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, DMA_CCR_MSIZE, + MemoryOrM2MDstDataSize); +} + +/** + * @brief Get Memory size. + * @rmtoll CCR MSIZE LL_DMA_GetMemorySize + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA_MDATAALIGN_BYTE + * @arg @ref LL_DMA_MDATAALIGN_HALFWORD + * @arg @ref LL_DMA_MDATAALIGN_WORD + */ +__STATIC_INLINE uint32_t LL_DMA_GetMemorySize(DMA_TypeDef *DMAx, uint32_t Channel) +{ + return (READ_BIT(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, + DMA_CCR_MSIZE)); +} + +/** + * @brief Set Channel priority level. + * @rmtoll CCR PL LL_DMA_SetChannelPriorityLevel + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @param Priority This parameter can be one of the following values: + * @arg @ref LL_DMA_PRIORITY_LOW + * @arg @ref LL_DMA_PRIORITY_MEDIUM + * @arg @ref LL_DMA_PRIORITY_HIGH + * @arg @ref LL_DMA_PRIORITY_VERYHIGH + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetChannelPriorityLevel(DMA_TypeDef *DMAx, uint32_t Channel, uint32_t Priority) +{ + MODIFY_REG(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, DMA_CCR_PL, + Priority); +} + +/** + * @brief Get Channel priority level. + * @rmtoll CCR PL LL_DMA_GetChannelPriorityLevel + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval Returned value can be one of the following values: + * @arg @ref LL_DMA_PRIORITY_LOW + * @arg @ref LL_DMA_PRIORITY_MEDIUM + * @arg @ref LL_DMA_PRIORITY_HIGH + * @arg @ref LL_DMA_PRIORITY_VERYHIGH + */ +__STATIC_INLINE uint32_t LL_DMA_GetChannelPriorityLevel(DMA_TypeDef *DMAx, uint32_t Channel) +{ + return (READ_BIT(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, + DMA_CCR_PL)); +} + +/** + * @brief Set Number of data to transfer. + * @note This action has no effect if + * channel is enabled. + * @rmtoll CNDTR NDT LL_DMA_SetDataLength + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @param NbData Between Min_Data = 0 and Max_Data = 0x0000FFFF + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetDataLength(DMA_TypeDef *DMAx, uint32_t Channel, uint32_t NbData) +{ + MODIFY_REG(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CNDTR, + DMA_CNDTR_NDT, NbData); +} + +/** + * @brief Get Number of data to transfer. + * @note Once the channel is enabled, the return value indicate the + * remaining bytes to be transmitted. + * @rmtoll CNDTR NDT LL_DMA_GetDataLength + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval Between Min_Data = 0 and Max_Data = 0xFFFFFFFF + */ +__STATIC_INLINE uint32_t LL_DMA_GetDataLength(DMA_TypeDef *DMAx, uint32_t Channel) +{ + return (READ_BIT(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CNDTR, + DMA_CNDTR_NDT)); +} + +/** + * @brief Configure the Source and Destination addresses. + * @note This API must not be called when the DMA channel is enabled. + * @note Each IP using DMA provides an API to get directly the register adress (LL_PPP_DMA_GetRegAddr). + * @rmtoll CPAR PA LL_DMA_ConfigAddresses\n + * CMAR MA LL_DMA_ConfigAddresses + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @param SrcAddress Between Min_Data = 0 and Max_Data = 0xFFFFFFFF + * @param DstAddress Between Min_Data = 0 and Max_Data = 0xFFFFFFFF + * @param Direction This parameter can be one of the following values: + * @arg @ref LL_DMA_DIRECTION_PERIPH_TO_MEMORY + * @arg @ref LL_DMA_DIRECTION_MEMORY_TO_PERIPH + * @arg @ref LL_DMA_DIRECTION_MEMORY_TO_MEMORY + * @retval None + */ +__STATIC_INLINE void LL_DMA_ConfigAddresses(DMA_TypeDef *DMAx, uint32_t Channel, uint32_t SrcAddress, + uint32_t DstAddress, uint32_t Direction) +{ + /* Direction Memory to Periph */ + if (Direction == LL_DMA_DIRECTION_MEMORY_TO_PERIPH) + { + WRITE_REG(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CMAR, SrcAddress); + WRITE_REG(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CPAR, DstAddress); + } + /* Direction Periph to Memory and Memory to Memory */ + else + { + WRITE_REG(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CPAR, SrcAddress); + WRITE_REG(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CMAR, DstAddress); + } +} + +/** + * @brief Set the Memory address. + * @note Interface used for direction LL_DMA_DIRECTION_PERIPH_TO_MEMORY or LL_DMA_DIRECTION_MEMORY_TO_PERIPH only. + * @note This API must not be called when the DMA channel is enabled. + * @rmtoll CMAR MA LL_DMA_SetMemoryAddress + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @param MemoryAddress Between Min_Data = 0 and Max_Data = 0xFFFFFFFF + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetMemoryAddress(DMA_TypeDef *DMAx, uint32_t Channel, uint32_t MemoryAddress) +{ + WRITE_REG(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CMAR, MemoryAddress); +} + +/** + * @brief Set the Peripheral address. + * @note Interface used for direction LL_DMA_DIRECTION_PERIPH_TO_MEMORY or LL_DMA_DIRECTION_MEMORY_TO_PERIPH only. + * @note This API must not be called when the DMA channel is enabled. + * @rmtoll CPAR PA LL_DMA_SetPeriphAddress + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @param PeriphAddress Between Min_Data = 0 and Max_Data = 0xFFFFFFFF + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetPeriphAddress(DMA_TypeDef *DMAx, uint32_t Channel, uint32_t PeriphAddress) +{ + WRITE_REG(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CPAR, PeriphAddress); +} + +/** + * @brief Get Memory address. + * @note Interface used for direction LL_DMA_DIRECTION_PERIPH_TO_MEMORY or LL_DMA_DIRECTION_MEMORY_TO_PERIPH only. + * @rmtoll CMAR MA LL_DMA_GetMemoryAddress + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval Between Min_Data = 0 and Max_Data = 0xFFFFFFFF + */ +__STATIC_INLINE uint32_t LL_DMA_GetMemoryAddress(DMA_TypeDef *DMAx, uint32_t Channel) +{ + return (READ_REG(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CMAR)); +} + +/** + * @brief Get Peripheral address. + * @note Interface used for direction LL_DMA_DIRECTION_PERIPH_TO_MEMORY or LL_DMA_DIRECTION_MEMORY_TO_PERIPH only. + * @rmtoll CPAR PA LL_DMA_GetPeriphAddress + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval Between Min_Data = 0 and Max_Data = 0xFFFFFFFF + */ +__STATIC_INLINE uint32_t LL_DMA_GetPeriphAddress(DMA_TypeDef *DMAx, uint32_t Channel) +{ + return (READ_REG(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CPAR)); +} + +/** + * @brief Set the Memory to Memory Source address. + * @note Interface used for direction LL_DMA_DIRECTION_MEMORY_TO_MEMORY only. + * @note This API must not be called when the DMA channel is enabled. + * @rmtoll CPAR PA LL_DMA_SetM2MSrcAddress + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @param MemoryAddress Between Min_Data = 0 and Max_Data = 0xFFFFFFFF + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetM2MSrcAddress(DMA_TypeDef *DMAx, uint32_t Channel, uint32_t MemoryAddress) +{ + WRITE_REG(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CPAR, MemoryAddress); +} + +/** + * @brief Set the Memory to Memory Destination address. + * @note Interface used for direction LL_DMA_DIRECTION_MEMORY_TO_MEMORY only. + * @note This API must not be called when the DMA channel is enabled. + * @rmtoll CMAR MA LL_DMA_SetM2MDstAddress + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @param MemoryAddress Between Min_Data = 0 and Max_Data = 0xFFFFFFFF + * @retval None + */ +__STATIC_INLINE void LL_DMA_SetM2MDstAddress(DMA_TypeDef *DMAx, uint32_t Channel, uint32_t MemoryAddress) +{ + WRITE_REG(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CMAR, MemoryAddress); +} + +/** + * @brief Get the Memory to Memory Source address. + * @note Interface used for direction LL_DMA_DIRECTION_MEMORY_TO_MEMORY only. + * @rmtoll CPAR PA LL_DMA_GetM2MSrcAddress + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval Between Min_Data = 0 and Max_Data = 0xFFFFFFFF + */ +__STATIC_INLINE uint32_t LL_DMA_GetM2MSrcAddress(DMA_TypeDef *DMAx, uint32_t Channel) +{ + return (READ_REG(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CPAR)); +} + +/** + * @brief Get the Memory to Memory Destination address. + * @note Interface used for direction LL_DMA_DIRECTION_MEMORY_TO_MEMORY only. + * @rmtoll CMAR MA LL_DMA_GetM2MDstAddress + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval Between Min_Data = 0 and Max_Data = 0xFFFFFFFF + */ +__STATIC_INLINE uint32_t LL_DMA_GetM2MDstAddress(DMA_TypeDef *DMAx, uint32_t Channel) +{ + return (READ_REG(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CMAR)); +} + + +/** + * @} + */ + +/** @defgroup DMA_LL_EF_FLAG_Management FLAG_Management + * @{ + */ + +/** + * @brief Get Channel 1 global interrupt flag. + * @rmtoll ISR GIF1 LL_DMA_IsActiveFlag_GI1 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_GI1(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->ISR, DMA_ISR_GIF1) == (DMA_ISR_GIF1)); +} + +/** + * @brief Get Channel 2 global interrupt flag. + * @rmtoll ISR GIF2 LL_DMA_IsActiveFlag_GI2 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_GI2(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->ISR, DMA_ISR_GIF2) == (DMA_ISR_GIF2)); +} + +/** + * @brief Get Channel 3 global interrupt flag. + * @rmtoll ISR GIF3 LL_DMA_IsActiveFlag_GI3 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_GI3(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->ISR, DMA_ISR_GIF3) == (DMA_ISR_GIF3)); +} + +/** + * @brief Get Channel 4 global interrupt flag. + * @rmtoll ISR GIF4 LL_DMA_IsActiveFlag_GI4 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_GI4(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->ISR, DMA_ISR_GIF4) == (DMA_ISR_GIF4)); +} + +/** + * @brief Get Channel 5 global interrupt flag. + * @rmtoll ISR GIF5 LL_DMA_IsActiveFlag_GI5 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_GI5(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->ISR, DMA_ISR_GIF5) == (DMA_ISR_GIF5)); +} + +/** + * @brief Get Channel 6 global interrupt flag. + * @rmtoll ISR GIF6 LL_DMA_IsActiveFlag_GI6 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_GI6(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->ISR, DMA_ISR_GIF6) == (DMA_ISR_GIF6)); +} + +/** + * @brief Get Channel 7 global interrupt flag. + * @rmtoll ISR GIF7 LL_DMA_IsActiveFlag_GI7 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_GI7(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->ISR, DMA_ISR_GIF7) == (DMA_ISR_GIF7)); +} + +/** + * @brief Get Channel 1 transfer complete flag. + * @rmtoll ISR TCIF1 LL_DMA_IsActiveFlag_TC1 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC1(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->ISR, DMA_ISR_TCIF1) == (DMA_ISR_TCIF1)); +} + +/** + * @brief Get Channel 2 transfer complete flag. + * @rmtoll ISR TCIF2 LL_DMA_IsActiveFlag_TC2 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC2(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->ISR, DMA_ISR_TCIF2) == (DMA_ISR_TCIF2)); +} + +/** + * @brief Get Channel 3 transfer complete flag. + * @rmtoll ISR TCIF3 LL_DMA_IsActiveFlag_TC3 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC3(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->ISR, DMA_ISR_TCIF3) == (DMA_ISR_TCIF3)); +} + +/** + * @brief Get Channel 4 transfer complete flag. + * @rmtoll ISR TCIF4 LL_DMA_IsActiveFlag_TC4 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC4(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->ISR, DMA_ISR_TCIF4) == (DMA_ISR_TCIF4)); +} + +/** + * @brief Get Channel 5 transfer complete flag. + * @rmtoll ISR TCIF5 LL_DMA_IsActiveFlag_TC5 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC5(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->ISR, DMA_ISR_TCIF5) == (DMA_ISR_TCIF5)); +} + +/** + * @brief Get Channel 6 transfer complete flag. + * @rmtoll ISR TCIF6 LL_DMA_IsActiveFlag_TC6 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC6(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->ISR, DMA_ISR_TCIF6) == (DMA_ISR_TCIF6)); +} + +/** + * @brief Get Channel 7 transfer complete flag. + * @rmtoll ISR TCIF7 LL_DMA_IsActiveFlag_TC7 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TC7(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->ISR, DMA_ISR_TCIF7) == (DMA_ISR_TCIF7)); +} + +/** + * @brief Get Channel 1 half transfer flag. + * @rmtoll ISR HTIF1 LL_DMA_IsActiveFlag_HT1 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT1(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->ISR, DMA_ISR_HTIF1) == (DMA_ISR_HTIF1)); +} + +/** + * @brief Get Channel 2 half transfer flag. + * @rmtoll ISR HTIF2 LL_DMA_IsActiveFlag_HT2 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT2(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->ISR, DMA_ISR_HTIF2) == (DMA_ISR_HTIF2)); +} + +/** + * @brief Get Channel 3 half transfer flag. + * @rmtoll ISR HTIF3 LL_DMA_IsActiveFlag_HT3 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT3(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->ISR, DMA_ISR_HTIF3) == (DMA_ISR_HTIF3)); +} + +/** + * @brief Get Channel 4 half transfer flag. + * @rmtoll ISR HTIF4 LL_DMA_IsActiveFlag_HT4 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT4(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->ISR, DMA_ISR_HTIF4) == (DMA_ISR_HTIF4)); +} + +/** + * @brief Get Channel 5 half transfer flag. + * @rmtoll ISR HTIF5 LL_DMA_IsActiveFlag_HT5 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT5(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->ISR, DMA_ISR_HTIF5) == (DMA_ISR_HTIF5)); +} + +/** + * @brief Get Channel 6 half transfer flag. + * @rmtoll ISR HTIF6 LL_DMA_IsActiveFlag_HT6 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT6(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->ISR, DMA_ISR_HTIF6) == (DMA_ISR_HTIF6)); +} + +/** + * @brief Get Channel 7 half transfer flag. + * @rmtoll ISR HTIF7 LL_DMA_IsActiveFlag_HT7 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_HT7(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->ISR, DMA_ISR_HTIF7) == (DMA_ISR_HTIF7)); +} + +/** + * @brief Get Channel 1 transfer error flag. + * @rmtoll ISR TEIF1 LL_DMA_IsActiveFlag_TE1 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE1(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->ISR, DMA_ISR_TEIF1) == (DMA_ISR_TEIF1)); +} + +/** + * @brief Get Channel 2 transfer error flag. + * @rmtoll ISR TEIF2 LL_DMA_IsActiveFlag_TE2 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE2(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->ISR, DMA_ISR_TEIF2) == (DMA_ISR_TEIF2)); +} + +/** + * @brief Get Channel 3 transfer error flag. + * @rmtoll ISR TEIF3 LL_DMA_IsActiveFlag_TE3 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE3(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->ISR, DMA_ISR_TEIF3) == (DMA_ISR_TEIF3)); +} + +/** + * @brief Get Channel 4 transfer error flag. + * @rmtoll ISR TEIF4 LL_DMA_IsActiveFlag_TE4 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE4(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->ISR, DMA_ISR_TEIF4) == (DMA_ISR_TEIF4)); +} + +/** + * @brief Get Channel 5 transfer error flag. + * @rmtoll ISR TEIF5 LL_DMA_IsActiveFlag_TE5 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE5(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->ISR, DMA_ISR_TEIF5) == (DMA_ISR_TEIF5)); +} + +/** + * @brief Get Channel 6 transfer error flag. + * @rmtoll ISR TEIF6 LL_DMA_IsActiveFlag_TE6 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE6(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->ISR, DMA_ISR_TEIF6) == (DMA_ISR_TEIF6)); +} + +/** + * @brief Get Channel 7 transfer error flag. + * @rmtoll ISR TEIF7 LL_DMA_IsActiveFlag_TE7 + * @param DMAx DMAx Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsActiveFlag_TE7(DMA_TypeDef *DMAx) +{ + return (READ_BIT(DMAx->ISR, DMA_ISR_TEIF7) == (DMA_ISR_TEIF7)); +} + +/** + * @brief Clear Channel 1 global interrupt flag. + * @rmtoll IFCR CGIF1 LL_DMA_ClearFlag_GI1 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_GI1(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CGIF1); +} + +/** + * @brief Clear Channel 2 global interrupt flag. + * @rmtoll IFCR CGIF2 LL_DMA_ClearFlag_GI2 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_GI2(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CGIF2); +} + +/** + * @brief Clear Channel 3 global interrupt flag. + * @rmtoll IFCR CGIF3 LL_DMA_ClearFlag_GI3 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_GI3(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CGIF3); +} + +/** + * @brief Clear Channel 4 global interrupt flag. + * @rmtoll IFCR CGIF4 LL_DMA_ClearFlag_GI4 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_GI4(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CGIF4); +} + +/** + * @brief Clear Channel 5 global interrupt flag. + * @rmtoll IFCR CGIF5 LL_DMA_ClearFlag_GI5 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_GI5(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CGIF5); +} + +/** + * @brief Clear Channel 6 global interrupt flag. + * @rmtoll IFCR CGIF6 LL_DMA_ClearFlag_GI6 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_GI6(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CGIF6); +} + +/** + * @brief Clear Channel 7 global interrupt flag. + * @rmtoll IFCR CGIF7 LL_DMA_ClearFlag_GI7 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_GI7(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CGIF7); +} + +/** + * @brief Clear Channel 1 transfer complete flag. + * @rmtoll IFCR CTCIF1 LL_DMA_ClearFlag_TC1 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TC1(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CTCIF1); +} + +/** + * @brief Clear Channel 2 transfer complete flag. + * @rmtoll IFCR CTCIF2 LL_DMA_ClearFlag_TC2 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TC2(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CTCIF2); +} + +/** + * @brief Clear Channel 3 transfer complete flag. + * @rmtoll IFCR CTCIF3 LL_DMA_ClearFlag_TC3 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TC3(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CTCIF3); +} + +/** + * @brief Clear Channel 4 transfer complete flag. + * @rmtoll IFCR CTCIF4 LL_DMA_ClearFlag_TC4 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TC4(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CTCIF4); +} + +/** + * @brief Clear Channel 5 transfer complete flag. + * @rmtoll IFCR CTCIF5 LL_DMA_ClearFlag_TC5 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TC5(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CTCIF5); +} + +/** + * @brief Clear Channel 6 transfer complete flag. + * @rmtoll IFCR CTCIF6 LL_DMA_ClearFlag_TC6 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TC6(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CTCIF6); +} + +/** + * @brief Clear Channel 7 transfer complete flag. + * @rmtoll IFCR CTCIF7 LL_DMA_ClearFlag_TC7 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TC7(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CTCIF7); +} + +/** + * @brief Clear Channel 1 half transfer flag. + * @rmtoll IFCR CHTIF1 LL_DMA_ClearFlag_HT1 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_HT1(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CHTIF1); +} + +/** + * @brief Clear Channel 2 half transfer flag. + * @rmtoll IFCR CHTIF2 LL_DMA_ClearFlag_HT2 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_HT2(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CHTIF2); +} + +/** + * @brief Clear Channel 3 half transfer flag. + * @rmtoll IFCR CHTIF3 LL_DMA_ClearFlag_HT3 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_HT3(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CHTIF3); +} + +/** + * @brief Clear Channel 4 half transfer flag. + * @rmtoll IFCR CHTIF4 LL_DMA_ClearFlag_HT4 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_HT4(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CHTIF4); +} + +/** + * @brief Clear Channel 5 half transfer flag. + * @rmtoll IFCR CHTIF5 LL_DMA_ClearFlag_HT5 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_HT5(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CHTIF5); +} + +/** + * @brief Clear Channel 6 half transfer flag. + * @rmtoll IFCR CHTIF6 LL_DMA_ClearFlag_HT6 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_HT6(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CHTIF6); +} + +/** + * @brief Clear Channel 7 half transfer flag. + * @rmtoll IFCR CHTIF7 LL_DMA_ClearFlag_HT7 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_HT7(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CHTIF7); +} + +/** + * @brief Clear Channel 1 transfer error flag. + * @rmtoll IFCR CTEIF1 LL_DMA_ClearFlag_TE1 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TE1(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CTEIF1); +} + +/** + * @brief Clear Channel 2 transfer error flag. + * @rmtoll IFCR CTEIF2 LL_DMA_ClearFlag_TE2 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TE2(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CTEIF2); +} + +/** + * @brief Clear Channel 3 transfer error flag. + * @rmtoll IFCR CTEIF3 LL_DMA_ClearFlag_TE3 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TE3(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CTEIF3); +} + +/** + * @brief Clear Channel 4 transfer error flag. + * @rmtoll IFCR CTEIF4 LL_DMA_ClearFlag_TE4 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TE4(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CTEIF4); +} + +/** + * @brief Clear Channel 5 transfer error flag. + * @rmtoll IFCR CTEIF5 LL_DMA_ClearFlag_TE5 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TE5(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CTEIF5); +} + +/** + * @brief Clear Channel 6 transfer error flag. + * @rmtoll IFCR CTEIF6 LL_DMA_ClearFlag_TE6 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TE6(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CTEIF6); +} + +/** + * @brief Clear Channel 7 transfer error flag. + * @rmtoll IFCR CTEIF7 LL_DMA_ClearFlag_TE7 + * @param DMAx DMAx Instance + * @retval None + */ +__STATIC_INLINE void LL_DMA_ClearFlag_TE7(DMA_TypeDef *DMAx) +{ + WRITE_REG(DMAx->IFCR, DMA_IFCR_CTEIF7); +} + +/** + * @} + */ + +/** @defgroup DMA_LL_EF_IT_Management IT_Management + * @{ + */ +/** + * @brief Enable Transfer complete interrupt. + * @rmtoll CCR TCIE LL_DMA_EnableIT_TC + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_EnableIT_TC(DMA_TypeDef *DMAx, uint32_t Channel) +{ + SET_BIT(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, DMA_CCR_TCIE); +} + +/** + * @brief Enable Half transfer interrupt. + * @rmtoll CCR HTIE LL_DMA_EnableIT_HT + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_EnableIT_HT(DMA_TypeDef *DMAx, uint32_t Channel) +{ + SET_BIT(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, DMA_CCR_HTIE); +} + +/** + * @brief Enable Transfer error interrupt. + * @rmtoll CCR TEIE LL_DMA_EnableIT_TE + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_EnableIT_TE(DMA_TypeDef *DMAx, uint32_t Channel) +{ + SET_BIT(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, DMA_CCR_TEIE); +} + +/** + * @brief Disable Transfer complete interrupt. + * @rmtoll CCR TCIE LL_DMA_DisableIT_TC + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_DisableIT_TC(DMA_TypeDef *DMAx, uint32_t Channel) +{ + CLEAR_BIT(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, DMA_CCR_TCIE); +} + +/** + * @brief Disable Half transfer interrupt. + * @rmtoll CCR HTIE LL_DMA_DisableIT_HT + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_DisableIT_HT(DMA_TypeDef *DMAx, uint32_t Channel) +{ + CLEAR_BIT(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, DMA_CCR_HTIE); +} + +/** + * @brief Disable Transfer error interrupt. + * @rmtoll CCR TEIE LL_DMA_DisableIT_TE + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval None + */ +__STATIC_INLINE void LL_DMA_DisableIT_TE(DMA_TypeDef *DMAx, uint32_t Channel) +{ + CLEAR_BIT(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, DMA_CCR_TEIE); +} + +/** + * @brief Check if Transfer complete Interrupt is enabled. + * @rmtoll CCR TCIE LL_DMA_IsEnabledIT_TC + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsEnabledIT_TC(DMA_TypeDef *DMAx, uint32_t Channel) +{ + return (READ_BIT(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, + DMA_CCR_TCIE) == (DMA_CCR_TCIE)); +} + +/** + * @brief Check if Half transfer Interrupt is enabled. + * @rmtoll CCR HTIE LL_DMA_IsEnabledIT_HT + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsEnabledIT_HT(DMA_TypeDef *DMAx, uint32_t Channel) +{ + return (READ_BIT(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, + DMA_CCR_HTIE) == (DMA_CCR_HTIE)); +} + +/** + * @brief Check if Transfer error Interrupt is enabled. + * @rmtoll CCR TEIE LL_DMA_IsEnabledIT_TE + * @param DMAx DMAx Instance + * @param Channel This parameter can be one of the following values: + * @arg @ref LL_DMA_CHANNEL_1 + * @arg @ref LL_DMA_CHANNEL_2 + * @arg @ref LL_DMA_CHANNEL_3 + * @arg @ref LL_DMA_CHANNEL_4 + * @arg @ref LL_DMA_CHANNEL_5 + * @arg @ref LL_DMA_CHANNEL_6 + * @arg @ref LL_DMA_CHANNEL_7 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_DMA_IsEnabledIT_TE(DMA_TypeDef *DMAx, uint32_t Channel) +{ + return (READ_BIT(((DMA_Channel_TypeDef *)((uint32_t)((uint32_t)DMAx + CHANNEL_OFFSET_TAB[Channel - 1U])))->CCR, + DMA_CCR_TEIE) == (DMA_CCR_TEIE)); +} + +/** + * @} + */ + +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup DMA_LL_EF_Init Initialization and de-initialization functions + * @{ + */ + +uint32_t LL_DMA_Init(DMA_TypeDef *DMAx, uint32_t Channel, LL_DMA_InitTypeDef *DMA_InitStruct); +uint32_t LL_DMA_DeInit(DMA_TypeDef *DMAx, uint32_t Channel); +void LL_DMA_StructInit(LL_DMA_InitTypeDef *DMA_InitStruct); + +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* DMA1 || DMA2 */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F3xx_LL_DMA_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_exti.h b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_exti.h new file mode 100644 index 0000000..6d09d63 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_exti.h @@ -0,0 +1,1383 @@ +/** + ****************************************************************************** + * @file stm32f3xx_ll_exti.h + * @author MCD Application Team + * @brief Header file of EXTI LL module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F3xx_LL_EXTI_H +#define __STM32F3xx_LL_EXTI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f3xx.h" + +/** @addtogroup STM32F3xx_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 */ +#if defined(EXTI_32_63_SUPPORT) + + uint32_t Line_32_63; /*!< Specifies the EXTI lines to be enabled or disabled for Lines in range 32 to 63 + This parameter can be any combination of @ref EXTI_LL_EC_LINE */ +#endif + + 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 +#define LL_EXTI_LINE_23 EXTI_IMR_IM23 /*!< Extended line 23 */ +#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*/ + +#if defined(EXTI_32_63_SUPPORT) +#define LL_EXTI_LINE_32 EXTI_IMR2_IM32 /*!< Extended line 32 */ +#if defined(EXTI_IMR2_IM33) +#define LL_EXTI_LINE_33 EXTI_IMR2_IM33 /*!< Extended line 33 */ +#endif +#if defined(EXTI_IMR2_IM34) +#define LL_EXTI_LINE_34 EXTI_IMR2_IM34 /*!< Extended line 34 */ +#endif +#if defined(EXTI_IMR2_IM35) +#define LL_EXTI_LINE_35 EXTI_IMR2_IM35 /*!< Extended line 35 */ +#endif +#if defined(EXTI_IMR2_IM36) +#define LL_EXTI_LINE_36 EXTI_IMR2_IM36 /*!< Extended line 36 */ +#endif +#if defined(EXTI_IMR2_IM37) +#define LL_EXTI_LINE_37 EXTI_IMR2_IM37 /*!< Extended line 37 */ +#endif +#if defined(EXTI_IMR2_IM38) +#define LL_EXTI_LINE_38 EXTI_IMR2_IM38 /*!< Extended line 38 */ +#endif +#if defined(EXTI_IMR2_IM39) +#define LL_EXTI_LINE_39 EXTI_IMR2_IM39 /*!< Extended line 39 */ +#endif +#if defined(EXTI_IMR2_IM40) +#define LL_EXTI_LINE_40 EXTI_IMR2_IM40 /*!< Extended line 40 */ +#endif +#define LL_EXTI_LINE_ALL_32_63 EXTI_IMR2_IM /*!< All Extended line not reserved*/ + +#endif + +#define LL_EXTI_LINE_ALL (0xFFFFFFFFU) /*!< All Extended line */ + +#if defined(USE_FULL_LL_DRIVER) +#define LL_EXTI_LINE_NONE (0x00000000U) /*!< None Extended line */ +#endif /*USE_FULL_LL_DRIVER*/ + +/** + * @} + */ +#if defined(USE_FULL_LL_DRIVER) + +/** @defgroup EXTI_LL_EC_MODE Mode + * @{ + */ +#define LL_EXTI_MODE_IT ((uint8_t)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_24 + * @arg @ref LL_EXTI_LINE_25 + * @arg @ref LL_EXTI_LINE_26 + * @arg @ref LL_EXTI_LINE_27 + * @arg @ref LL_EXTI_LINE_28 + * @arg @ref LL_EXTI_LINE_29 + * @arg @ref LL_EXTI_LINE_30 + * @arg @ref LL_EXTI_LINE_31 + * @arg @ref LL_EXTI_LINE_ALL_0_31 + * @note Please check each device line mapping for EXTI Line availability + * @retval None + */ +__STATIC_INLINE void LL_EXTI_EnableIT_0_31(uint32_t ExtiLine) +{ + SET_BIT(EXTI->IMR, ExtiLine); +} +#if defined(EXTI_32_63_SUPPORT) +/** + * @brief Enable ExtiLine Interrupt request for Lines in range 32 to 63 + * @note The reset value for the direct lines (lines from 32 to 34, line + * 39) is set to 1 in order to enable the interrupt by default. + * Bits are set automatically at Power on. + * @rmtoll IMR2 IMx LL_EXTI_EnableIT_32_63 + * @param ExtiLine This parameter can be one of the following values: + * @arg @ref LL_EXTI_LINE_32 + * @arg @ref LL_EXTI_LINE_33 + * @arg @ref LL_EXTI_LINE_34 + * @arg @ref LL_EXTI_LINE_35 + * @arg @ref LL_EXTI_LINE_36 + * @arg @ref LL_EXTI_LINE_37 + * @arg @ref LL_EXTI_LINE_38 + * @arg @ref LL_EXTI_LINE_39 + * @arg @ref LL_EXTI_LINE_ALL_32_63 + * @retval None + */ +__STATIC_INLINE void LL_EXTI_EnableIT_32_63(uint32_t ExtiLine) +{ + SET_BIT(EXTI->IMR2, ExtiLine); +} +#endif + +/** + * @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_24 + * @arg @ref LL_EXTI_LINE_25 + * @arg @ref LL_EXTI_LINE_26 + * @arg @ref LL_EXTI_LINE_27 + * @arg @ref LL_EXTI_LINE_28 + * @arg @ref LL_EXTI_LINE_29 + * @arg @ref LL_EXTI_LINE_30 + * @arg @ref LL_EXTI_LINE_31 + * @arg @ref LL_EXTI_LINE_ALL_0_31 + * @note Please check each device line mapping for EXTI Line availability + * @retval None + */ +__STATIC_INLINE void LL_EXTI_DisableIT_0_31(uint32_t ExtiLine) +{ + CLEAR_BIT(EXTI->IMR, ExtiLine); +} + +#if defined(EXTI_32_63_SUPPORT) +/** + * @brief Disable ExtiLine Interrupt request for Lines in range 32 to 63 + * @note The reset value for the direct lines (lines from 32 to 34, line + * 39) is set to 1 in order to enable the interrupt by default. + * Bits are set automatically at Power on. + * @rmtoll IMR2 IMx LL_EXTI_DisableIT_32_63 + * @param ExtiLine This parameter can be one of the following values: + * @arg @ref LL_EXTI_LINE_32 + * @arg @ref LL_EXTI_LINE_33 + * @arg @ref LL_EXTI_LINE_34 + * @arg @ref LL_EXTI_LINE_35 + * @arg @ref LL_EXTI_LINE_36 + * @arg @ref LL_EXTI_LINE_37 + * @arg @ref LL_EXTI_LINE_38 + * @arg @ref LL_EXTI_LINE_39 + * @arg @ref LL_EXTI_LINE_ALL_32_63 + * @retval None + */ +__STATIC_INLINE void LL_EXTI_DisableIT_32_63(uint32_t ExtiLine) +{ + CLEAR_BIT(EXTI->IMR2, ExtiLine); +} +#endif + +/** + * @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_24 + * @arg @ref LL_EXTI_LINE_25 + * @arg @ref LL_EXTI_LINE_26 + * @arg @ref LL_EXTI_LINE_27 + * @arg @ref LL_EXTI_LINE_28 + * @arg @ref LL_EXTI_LINE_29 + * @arg @ref LL_EXTI_LINE_30 + * @arg @ref LL_EXTI_LINE_31 + * @arg @ref LL_EXTI_LINE_ALL_0_31 + * @note Please check each device line mapping for EXTI Line availability + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_EXTI_IsEnabledIT_0_31(uint32_t ExtiLine) +{ + return (READ_BIT(EXTI->IMR, ExtiLine) == (ExtiLine)); +} + +#if defined(EXTI_32_63_SUPPORT) +/** + * @brief Indicate if ExtiLine Interrupt request is enabled for Lines in range 32 to 63 + * @note The reset value for the direct lines (lines from 32 to 34, line + * 39) is set to 1 in order to enable the interrupt by default. + * Bits are set automatically at Power on. + * @rmtoll IMR2 IMx LL_EXTI_IsEnabledIT_32_63 + * @param ExtiLine This parameter can be one of the following values: + * @arg @ref LL_EXTI_LINE_32 + * @arg @ref LL_EXTI_LINE_33 + * @arg @ref LL_EXTI_LINE_34 + * @arg @ref LL_EXTI_LINE_35 + * @arg @ref LL_EXTI_LINE_36 + * @arg @ref LL_EXTI_LINE_37 + * @arg @ref LL_EXTI_LINE_38 + * @arg @ref LL_EXTI_LINE_39 + * @arg @ref LL_EXTI_LINE_ALL_32_63 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_EXTI_IsEnabledIT_32_63(uint32_t ExtiLine) +{ + return (READ_BIT(EXTI->IMR2, ExtiLine) == (ExtiLine)); +} +#endif + +/** + * @} + */ + +/** @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_24 + * @arg @ref LL_EXTI_LINE_25 + * @arg @ref LL_EXTI_LINE_26 + * @arg @ref LL_EXTI_LINE_27 + * @arg @ref LL_EXTI_LINE_28 + * @arg @ref LL_EXTI_LINE_29 + * @arg @ref LL_EXTI_LINE_30 + * @arg @ref LL_EXTI_LINE_31 + * @arg @ref LL_EXTI_LINE_ALL_0_31 + * @note Please check each device line mapping for EXTI Line availability + * @retval None + */ +__STATIC_INLINE void LL_EXTI_EnableEvent_0_31(uint32_t ExtiLine) +{ + SET_BIT(EXTI->EMR, ExtiLine); + +} + +#if defined(EXTI_32_63_SUPPORT) +/** + * @brief Enable ExtiLine Event request for Lines in range 32 to 63 + * @rmtoll EMR2 EMx LL_EXTI_EnableEvent_32_63 + * @param ExtiLine This parameter can be a combination of the following values: + * @arg @ref LL_EXTI_LINE_32 + * @arg @ref LL_EXTI_LINE_33 + * @arg @ref LL_EXTI_LINE_34 + * @arg @ref LL_EXTI_LINE_35 + * @arg @ref LL_EXTI_LINE_36 + * @arg @ref LL_EXTI_LINE_37 + * @arg @ref LL_EXTI_LINE_38 + * @arg @ref LL_EXTI_LINE_39 + * @arg @ref LL_EXTI_LINE_ALL_32_63 + * @retval None + */ +__STATIC_INLINE void LL_EXTI_EnableEvent_32_63(uint32_t ExtiLine) +{ + SET_BIT(EXTI->EMR2, ExtiLine); +} +#endif + +/** + * @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_24 + * @arg @ref LL_EXTI_LINE_25 + * @arg @ref LL_EXTI_LINE_26 + * @arg @ref LL_EXTI_LINE_27 + * @arg @ref LL_EXTI_LINE_28 + * @arg @ref LL_EXTI_LINE_29 + * @arg @ref LL_EXTI_LINE_30 + * @arg @ref LL_EXTI_LINE_31 + * @arg @ref LL_EXTI_LINE_ALL_0_31 + * @note Please check each device line mapping for EXTI Line availability + * @retval None + */ +__STATIC_INLINE void LL_EXTI_DisableEvent_0_31(uint32_t ExtiLine) +{ + CLEAR_BIT(EXTI->EMR, ExtiLine); +} + +#if defined(EXTI_32_63_SUPPORT) +/** + * @brief Disable ExtiLine Event request for Lines in range 32 to 63 + * @rmtoll EMR2 EMx LL_EXTI_DisableEvent_32_63 + * @param ExtiLine This parameter can be a combination of the following values: + * @arg @ref LL_EXTI_LINE_32 + * @arg @ref LL_EXTI_LINE_33 + * @arg @ref LL_EXTI_LINE_34 + * @arg @ref LL_EXTI_LINE_35 + * @arg @ref LL_EXTI_LINE_36 + * @arg @ref LL_EXTI_LINE_37 + * @arg @ref LL_EXTI_LINE_38 + * @arg @ref LL_EXTI_LINE_39 + * @arg @ref LL_EXTI_LINE_ALL_32_63 + * @retval None + */ +__STATIC_INLINE void LL_EXTI_DisableEvent_32_63(uint32_t ExtiLine) +{ + CLEAR_BIT(EXTI->EMR2, ExtiLine); +} +#endif + +/** + * @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_24 + * @arg @ref LL_EXTI_LINE_25 + * @arg @ref LL_EXTI_LINE_26 + * @arg @ref LL_EXTI_LINE_27 + * @arg @ref LL_EXTI_LINE_28 + * @arg @ref LL_EXTI_LINE_29 + * @arg @ref LL_EXTI_LINE_30 + * @arg @ref LL_EXTI_LINE_31 + * @arg @ref LL_EXTI_LINE_ALL_0_31 + * @note Please check each device line mapping for EXTI Line availability + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_EXTI_IsEnabledEvent_0_31(uint32_t ExtiLine) +{ + return (READ_BIT(EXTI->EMR, ExtiLine) == (ExtiLine)); + +} + +#if defined(EXTI_32_63_SUPPORT) +/** + * @brief Indicate if ExtiLine Event request is enabled for Lines in range 32 to 63 + * @rmtoll EMR2 EMx LL_EXTI_IsEnabledEvent_32_63 + * @param ExtiLine This parameter can be a combination of the following values: + * @arg @ref LL_EXTI_LINE_32 + * @arg @ref LL_EXTI_LINE_33 + * @arg @ref LL_EXTI_LINE_34 + * @arg @ref LL_EXTI_LINE_35 + * @arg @ref LL_EXTI_LINE_36 + * @arg @ref LL_EXTI_LINE_37 + * @arg @ref LL_EXTI_LINE_38 + * @arg @ref LL_EXTI_LINE_39 + * @arg @ref LL_EXTI_LINE_ALL_32_63 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_EXTI_IsEnabledEvent_32_63(uint32_t ExtiLine) +{ + return (READ_BIT(EXTI->EMR2, ExtiLine) == (ExtiLine)); +} +#endif + +/** + * @} + */ + +/** @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 + * @arg @ref LL_EXTI_LINE_29 + * @arg @ref LL_EXTI_LINE_30 + * @arg @ref LL_EXTI_LINE_31 + * @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); + +} + +#if defined(EXTI_32_63_SUPPORT) +/** + * @brief Enable ExtiLine Rising Edge Trigger for Lines in range 32 to 63 + * @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 RTSR2 RTx LL_EXTI_EnableRisingTrig_32_63 + * @param ExtiLine This parameter can be a combination of the following values: + * @arg @ref LL_EXTI_LINE_35 + * @arg @ref LL_EXTI_LINE_36 + * @arg @ref LL_EXTI_LINE_37 + * @arg @ref LL_EXTI_LINE_38 + * @retval None + */ +__STATIC_INLINE void LL_EXTI_EnableRisingTrig_32_63(uint32_t ExtiLine) +{ + SET_BIT(EXTI->RTSR2, ExtiLine); +} +#endif + +/** + * @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 + * @arg @ref LL_EXTI_LINE_29 + * @arg @ref LL_EXTI_LINE_30 + * @arg @ref LL_EXTI_LINE_31 + * @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); + +} + +#if defined(EXTI_32_63_SUPPORT) +/** + * @brief Disable ExtiLine Rising Edge Trigger for Lines in range 32 to 63 + * @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 RTSR2 RTx LL_EXTI_DisableRisingTrig_32_63 + * @param ExtiLine This parameter can be a combination of the following values: + * @arg @ref LL_EXTI_LINE_35 + * @arg @ref LL_EXTI_LINE_36 + * @arg @ref LL_EXTI_LINE_37 + * @arg @ref LL_EXTI_LINE_38 + * @retval None + */ +__STATIC_INLINE void LL_EXTI_DisableRisingTrig_32_63(uint32_t ExtiLine) +{ + CLEAR_BIT(EXTI->RTSR2, ExtiLine); +} +#endif + +/** + * @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 + * @arg @ref LL_EXTI_LINE_29 + * @arg @ref LL_EXTI_LINE_30 + * @arg @ref LL_EXTI_LINE_31 + * @note Please check each device line mapping for EXTI Line availability + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_EXTI_IsEnabledRisingTrig_0_31(uint32_t ExtiLine) +{ + return (READ_BIT(EXTI->RTSR, ExtiLine) == (ExtiLine)); +} + +#if defined(EXTI_32_63_SUPPORT) +/** + * @brief Check if rising edge trigger is enabled for Lines in range 32 to 63 + * @rmtoll RTSR2 RTx LL_EXTI_IsEnabledRisingTrig_32_63 + * @param ExtiLine This parameter can be a combination of the following values: + * @arg @ref LL_EXTI_LINE_35 + * @arg @ref LL_EXTI_LINE_36 + * @arg @ref LL_EXTI_LINE_37 + * @arg @ref LL_EXTI_LINE_38 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_EXTI_IsEnabledRisingTrig_32_63(uint32_t ExtiLine) +{ + return (READ_BIT(EXTI->RTSR2, ExtiLine) == (ExtiLine)); +} +#endif + +/** + * @} + */ + +/** @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 + * @arg @ref LL_EXTI_LINE_29 + * @arg @ref LL_EXTI_LINE_30 + * @arg @ref LL_EXTI_LINE_31 + * @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); +} + +#if defined(EXTI_32_63_SUPPORT) +/** + * @brief Enable ExtiLine Falling Edge Trigger for Lines in range 32 to 63 + * @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 FTSR2 FTx LL_EXTI_EnableFallingTrig_32_63 + * @param ExtiLine This parameter can be a combination of the following values: + * @arg @ref LL_EXTI_LINE_35 + * @arg @ref LL_EXTI_LINE_36 + * @arg @ref LL_EXTI_LINE_37 + * @arg @ref LL_EXTI_LINE_38 + * @retval None + */ +__STATIC_INLINE void LL_EXTI_EnableFallingTrig_32_63(uint32_t ExtiLine) +{ + SET_BIT(EXTI->FTSR2, ExtiLine); +} +#endif + +/** + * @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 + * @arg @ref LL_EXTI_LINE_29 + * @arg @ref LL_EXTI_LINE_30 + * @arg @ref LL_EXTI_LINE_31 + * @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); +} + +#if defined(EXTI_32_63_SUPPORT) +/** + * @brief Disable ExtiLine Falling Edge Trigger for Lines in range 32 to 63 + * @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 FTSR2 FTx LL_EXTI_DisableFallingTrig_32_63 + * @param ExtiLine This parameter can be a combination of the following values: + * @arg @ref LL_EXTI_LINE_35 + * @arg @ref LL_EXTI_LINE_36 + * @arg @ref LL_EXTI_LINE_37 + * @arg @ref LL_EXTI_LINE_38 + * @retval None + */ +__STATIC_INLINE void LL_EXTI_DisableFallingTrig_32_63(uint32_t ExtiLine) +{ + CLEAR_BIT(EXTI->FTSR2, ExtiLine); +} +#endif + +/** + * @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 + * @arg @ref LL_EXTI_LINE_29 + * @arg @ref LL_EXTI_LINE_30 + * @arg @ref LL_EXTI_LINE_31 + * @note Please check each device line mapping for EXTI Line availability + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_EXTI_IsEnabledFallingTrig_0_31(uint32_t ExtiLine) +{ + return (READ_BIT(EXTI->FTSR, ExtiLine) == (ExtiLine)); +} + +#if defined(EXTI_32_63_SUPPORT) +/** + * @brief Check if falling edge trigger is enabled for Lines in range 32 to 63 + * @rmtoll FTSR2 FTx LL_EXTI_IsEnabledFallingTrig_32_63 + * @param ExtiLine This parameter can be a combination of the following values: + * @arg @ref LL_EXTI_LINE_35 + * @arg @ref LL_EXTI_LINE_36 + * @arg @ref LL_EXTI_LINE_37 + * @arg @ref LL_EXTI_LINE_38 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_EXTI_IsEnabledFallingTrig_32_63(uint32_t ExtiLine) +{ + return (READ_BIT(EXTI->FTSR2, ExtiLine) == (ExtiLine)); +} +#endif + +/** + * @} + */ + +/** @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 + * @arg @ref LL_EXTI_LINE_29 + * @arg @ref LL_EXTI_LINE_30 + * @arg @ref LL_EXTI_LINE_31 + * @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); +} + +#if defined(EXTI_32_63_SUPPORT) +/** + * @brief Generate a software Interrupt Event for Lines in range 32 to 63 + * @note If the interrupt is enabled on this line in the EXTI_IMR2, writing a 1 to + * this bit when it is at '0' sets the corresponding pending bit in EXTI_PR2 + * resulting in an interrupt request generation. + * This bit is cleared by clearing the corresponding bit in the EXTI_PR2 + * register (by writing a 1 into the bit) + * @rmtoll SWIER2 SWIx LL_EXTI_GenerateSWI_32_63 + * @param ExtiLine This parameter can be a combination of the following values: + * @arg @ref LL_EXTI_LINE_35 + * @arg @ref LL_EXTI_LINE_36 + * @arg @ref LL_EXTI_LINE_37 + * @arg @ref LL_EXTI_LINE_38 + * @retval None + */ +__STATIC_INLINE void LL_EXTI_GenerateSWI_32_63(uint32_t ExtiLine) +{ + SET_BIT(EXTI->SWIER2, ExtiLine); +} +#endif + +/** + * @} + */ + +/** @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 + * @arg @ref LL_EXTI_LINE_29 + * @arg @ref LL_EXTI_LINE_30 + * @arg @ref LL_EXTI_LINE_31 + * @note Please check each device line mapping for EXTI Line availability + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_EXTI_IsActiveFlag_0_31(uint32_t ExtiLine) +{ + return (READ_BIT(EXTI->PR, ExtiLine) == (ExtiLine)); +} + +#if defined(EXTI_32_63_SUPPORT) +/** + * @brief Check if the ExtLine Flag is set or not for Lines in range 32 to 63 + * @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 PR2 PIFx LL_EXTI_IsActiveFlag_32_63 + * @param ExtiLine This parameter can be a combination of the following values: + * @arg @ref LL_EXTI_LINE_35 + * @arg @ref LL_EXTI_LINE_36 + * @arg @ref LL_EXTI_LINE_37 + * @arg @ref LL_EXTI_LINE_38 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_EXTI_IsActiveFlag_32_63(uint32_t ExtiLine) +{ + return (READ_BIT(EXTI->PR2, ExtiLine) == (ExtiLine)); +} +#endif + +/** + * @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 + * @arg @ref LL_EXTI_LINE_29 + * @arg @ref LL_EXTI_LINE_30 + * @arg @ref LL_EXTI_LINE_31 + * @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)); +} + +#if defined(EXTI_32_63_SUPPORT) + +/** + * @brief Read ExtLine Combination Flag for Lines in range 32 to 63 + * @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 PR2 PIFx LL_EXTI_ReadFlag_32_63 + * @param ExtiLine This parameter can be a combination of the following values: + * @arg @ref LL_EXTI_LINE_35 + * @arg @ref LL_EXTI_LINE_36 + * @arg @ref LL_EXTI_LINE_37 + * @arg @ref LL_EXTI_LINE_38 + * @retval @note This bit is set when the selected edge event arrives on the interrupt + */ +__STATIC_INLINE uint32_t LL_EXTI_ReadFlag_32_63(uint32_t ExtiLine) +{ + return (uint32_t)(READ_BIT(EXTI->PR2, ExtiLine)); +} +#endif + +/** + * @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 + * @arg @ref LL_EXTI_LINE_29 + * @arg @ref LL_EXTI_LINE_30 + * @arg @ref LL_EXTI_LINE_31 + * @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(EXTI_32_63_SUPPORT) +/** + * @brief Clear ExtLine Flags for Lines in range 32 to 63 + * @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 PR2 PIFx LL_EXTI_ClearFlag_32_63 + * @param ExtiLine This parameter can be a combination of the following values: + * @arg @ref LL_EXTI_LINE_35 + * @arg @ref LL_EXTI_LINE_36 + * @arg @ref LL_EXTI_LINE_37 + * @arg @ref LL_EXTI_LINE_38 + * @retval None + */ +__STATIC_INLINE void LL_EXTI_ClearFlag_32_63(uint32_t ExtiLine) +{ + WRITE_REG(EXTI->PR2, ExtiLine); +} +#endif + +/** + * @} + */ + +#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 /* __STM32F3xx_LL_EXTI_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_gpio.h b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_gpio.h new file mode 100644 index 0000000..80edfc4 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_gpio.h @@ -0,0 +1,980 @@ +/** + ****************************************************************************** + * @file stm32f3xx_ll_gpio.h + * @author MCD Application Team + * @brief Header file of GPIO LL module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F3xx_LL_GPIO_H +#define __STM32F3xx_LL_GPIO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f3xx.h" + +/** @addtogroup STM32F3xx_LL_Driver + * @{ + */ + +#if defined (GPIOA) || defined (GPIOB) || defined (GPIOC) || defined (GPIOD) || defined (GPIOE) || defined (GPIOF) || defined (GPIOG) || defined (GPIOH) + +/** @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 /*!< 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 + * @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 + */ +__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_AFRL0 << (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_AFRL0 << (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_AFRH0 << (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_AFRH0 << (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 BRR BRy LL_GPIO_ResetOutputPin + * @param GPIOx GPIO Port + * @param PinMask This parameter can be a combination of the following values: + * @arg @ref LL_GPIO_PIN_0 + * @arg @ref LL_GPIO_PIN_1 + * @arg @ref LL_GPIO_PIN_2 + * @arg @ref LL_GPIO_PIN_3 + * @arg @ref LL_GPIO_PIN_4 + * @arg @ref LL_GPIO_PIN_5 + * @arg @ref LL_GPIO_PIN_6 + * @arg @ref LL_GPIO_PIN_7 + * @arg @ref LL_GPIO_PIN_8 + * @arg @ref LL_GPIO_PIN_9 + * @arg @ref LL_GPIO_PIN_10 + * @arg @ref LL_GPIO_PIN_11 + * @arg @ref LL_GPIO_PIN_12 + * @arg @ref LL_GPIO_PIN_13 + * @arg @ref LL_GPIO_PIN_14 + * @arg @ref LL_GPIO_PIN_15 + * @arg @ref LL_GPIO_PIN_ALL + * @retval None + */ +__STATIC_INLINE void LL_GPIO_ResetOutputPin(GPIO_TypeDef *GPIOx, uint32_t PinMask) +{ + WRITE_REG(GPIOx->BRR, PinMask); +} + +/** + * @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) */ +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F3xx_LL_GPIO_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_i2c.h b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_i2c.h new file mode 100644 index 0000000..4d164cc --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_i2c.h @@ -0,0 +1,2275 @@ +/** + ****************************************************************************** + * @file stm32f3xx_ll_i2c.h + * @author MCD Application Team + * @brief Header file of I2C LL module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef STM32F3xx_LL_I2C_H +#define STM32F3xx_LL_I2C_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f3xx.h" + +/** @addtogroup STM32F3xx_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 + * @{ + */ +/** + * @} + */ + +/* 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 Timing; /*!< Specifies the SDA setup, hold time and the SCL high, low period values. + This parameter must be set by referring to the STM32CubeMX Tool and + the helper macro @ref __LL_I2C_CONVERT_TIMINGS(). + + This feature can be modified afterwards using unitary function + @ref LL_I2C_SetTiming(). */ + + 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(). */ + + 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_CLEAR_FLAG Clear Flags Defines + * @brief Flags defines which can be used with LL_I2C_WriteReg function + * @{ + */ +#define LL_I2C_ICR_ADDRCF I2C_ICR_ADDRCF /*!< Address Matched flag */ +#define LL_I2C_ICR_NACKCF I2C_ICR_NACKCF /*!< Not Acknowledge flag */ +#define LL_I2C_ICR_STOPCF I2C_ICR_STOPCF /*!< Stop detection flag */ +#define LL_I2C_ICR_BERRCF I2C_ICR_BERRCF /*!< Bus error flag */ +#define LL_I2C_ICR_ARLOCF I2C_ICR_ARLOCF /*!< Arbitration Lost flag */ +#define LL_I2C_ICR_OVRCF I2C_ICR_OVRCF /*!< Overrun/Underrun flag */ +#define LL_I2C_ICR_PECCF I2C_ICR_PECCF /*!< PEC error flag */ +#define LL_I2C_ICR_TIMOUTCF I2C_ICR_TIMOUTCF /*!< Timeout detection flag */ +#define LL_I2C_ICR_ALERTCF I2C_ICR_ALERTCF /*!< Alert flag */ +/** + * @} + */ + +/** @defgroup I2C_LL_EC_GET_FLAG Get Flags Defines + * @brief Flags defines which can be used with LL_I2C_ReadReg function + * @{ + */ +#define LL_I2C_ISR_TXE I2C_ISR_TXE /*!< Transmit data register empty */ +#define LL_I2C_ISR_TXIS I2C_ISR_TXIS /*!< Transmit interrupt status */ +#define LL_I2C_ISR_RXNE I2C_ISR_RXNE /*!< Receive data register not empty */ +#define LL_I2C_ISR_ADDR I2C_ISR_ADDR /*!< Address matched (slave mode) */ +#define LL_I2C_ISR_NACKF I2C_ISR_NACKF /*!< Not Acknowledge received flag */ +#define LL_I2C_ISR_STOPF I2C_ISR_STOPF /*!< Stop detection flag */ +#define LL_I2C_ISR_TC I2C_ISR_TC /*!< Transfer Complete (master mode) */ +#define LL_I2C_ISR_TCR I2C_ISR_TCR /*!< Transfer Complete Reload */ +#define LL_I2C_ISR_BERR I2C_ISR_BERR /*!< Bus error */ +#define LL_I2C_ISR_ARLO I2C_ISR_ARLO /*!< Arbitration lost */ +#define LL_I2C_ISR_OVR I2C_ISR_OVR /*!< Overrun/Underrun (slave mode) */ +#define LL_I2C_ISR_PECERR I2C_ISR_PECERR /*!< PEC Error in reception (SMBus mode) */ +#define LL_I2C_ISR_TIMEOUT I2C_ISR_TIMEOUT /*!< Timeout detection flag (SMBus mode) */ +#define LL_I2C_ISR_ALERT I2C_ISR_ALERT /*!< SMBus alert (SMBus mode) */ +#define LL_I2C_ISR_BUSY I2C_ISR_BUSY /*!< Bus busy */ +/** + * @} + */ + +/** @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_CR1_TXIE I2C_CR1_TXIE /*!< TX Interrupt enable */ +#define LL_I2C_CR1_RXIE I2C_CR1_RXIE /*!< RX Interrupt enable */ +#define LL_I2C_CR1_ADDRIE I2C_CR1_ADDRIE /*!< Address match Interrupt enable (slave only) */ +#define LL_I2C_CR1_NACKIE I2C_CR1_NACKIE /*!< Not acknowledge received Interrupt enable */ +#define LL_I2C_CR1_STOPIE I2C_CR1_STOPIE /*!< STOP detection Interrupt enable */ +#define LL_I2C_CR1_TCIE I2C_CR1_TCIE /*!< Transfer Complete interrupt enable */ +#define LL_I2C_CR1_ERRIE I2C_CR1_ERRIE /*!< Error interrupts enable */ +/** + * @} + */ + +/** @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 I2C_CR1_SMBHEN /*!< SMBus Host address acknowledge */ +#define LL_I2C_MODE_SMBUS_DEVICE 0x00000000U /*!< SMBus Device default mode + (Default address not acknowledge) */ +#define LL_I2C_MODE_SMBUS_DEVICE_ARP I2C_CR1_SMBDEN /*!< SMBus Device Default address acknowledge */ +/** + * @} + */ + +/** @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_CR1_ANFOFF /*!< Analog filter is disabled. */ +/** + * @} + */ + +/** @defgroup I2C_LL_EC_ADDRESSING_MODE Master Addressing Mode + * @{ + */ +#define LL_I2C_ADDRESSING_MODE_7BIT 0x00000000U /*!< Master operates in 7-bit addressing mode. */ +#define LL_I2C_ADDRESSING_MODE_10BIT I2C_CR2_ADD10 /*!< Master operates in 10-bit addressing mode.*/ +/** + * @} + */ + +/** @defgroup I2C_LL_EC_OWNADDRESS1 Own Address 1 Length + * @{ + */ +#define LL_I2C_OWNADDRESS1_7BIT 0x00000000U /*!< Own address 1 is a 7-bit address. */ +#define LL_I2C_OWNADDRESS1_10BIT I2C_OAR1_OA1MODE /*!< Own address 1 is a 10-bit address.*/ +/** + * @} + */ + +/** @defgroup I2C_LL_EC_OWNADDRESS2 Own Address 2 Masks + * @{ + */ +#define LL_I2C_OWNADDRESS2_NOMASK I2C_OAR2_OA2NOMASK /*!< Own Address2 No mask. */ +#define LL_I2C_OWNADDRESS2_MASK01 I2C_OAR2_OA2MASK01 /*!< Only Address2 bits[7:2] are compared. */ +#define LL_I2C_OWNADDRESS2_MASK02 I2C_OAR2_OA2MASK02 /*!< Only Address2 bits[7:3] are compared. */ +#define LL_I2C_OWNADDRESS2_MASK03 I2C_OAR2_OA2MASK03 /*!< Only Address2 bits[7:4] are compared. */ +#define LL_I2C_OWNADDRESS2_MASK04 I2C_OAR2_OA2MASK04 /*!< Only Address2 bits[7:5] are compared. */ +#define LL_I2C_OWNADDRESS2_MASK05 I2C_OAR2_OA2MASK05 /*!< Only Address2 bits[7:6] are compared. */ +#define LL_I2C_OWNADDRESS2_MASK06 I2C_OAR2_OA2MASK06 /*!< Only Address2 bits[7] are compared. */ +#define LL_I2C_OWNADDRESS2_MASK07 I2C_OAR2_OA2MASK07 /*!< No comparison is done. + All Address2 are acknowledged. */ +/** + * @} + */ + +/** @defgroup I2C_LL_EC_I2C_ACKNOWLEDGE Acknowledge Generation + * @{ + */ +#define LL_I2C_ACK 0x00000000U /*!< ACK is sent after current received byte. */ +#define LL_I2C_NACK I2C_CR2_NACK /*!< NACK is sent after current received byte.*/ +/** + * @} + */ + +/** @defgroup I2C_LL_EC_ADDRSLAVE Slave Address Length + * @{ + */ +#define LL_I2C_ADDRSLAVE_7BIT 0x00000000U /*!< Slave Address in 7-bit. */ +#define LL_I2C_ADDRSLAVE_10BIT I2C_CR2_ADD10 /*!< Slave Address in 10-bit.*/ +/** + * @} + */ + +/** @defgroup I2C_LL_EC_REQUEST Transfer Request Direction + * @{ + */ +#define LL_I2C_REQUEST_WRITE 0x00000000U /*!< Master request a write transfer. */ +#define LL_I2C_REQUEST_READ I2C_CR2_RD_WRN /*!< Master request a read transfer. */ +/** + * @} + */ + +/** @defgroup I2C_LL_EC_MODE Transfer End Mode + * @{ + */ +#define LL_I2C_MODE_RELOAD I2C_CR2_RELOAD /*!< Enable I2C Reload mode. */ +#define LL_I2C_MODE_AUTOEND I2C_CR2_AUTOEND /*!< Enable I2C Automatic end mode + with no HW PEC comparison. */ +#define LL_I2C_MODE_SOFTEND 0x00000000U /*!< Enable I2C Software end mode + with no HW PEC comparison. */ +#define LL_I2C_MODE_SMBUS_RELOAD LL_I2C_MODE_RELOAD /*!< Enable SMBUS Automatic end mode + with HW PEC comparison. */ +#define LL_I2C_MODE_SMBUS_AUTOEND_NO_PEC LL_I2C_MODE_AUTOEND /*!< Enable SMBUS Automatic end mode + with HW PEC comparison. */ +#define LL_I2C_MODE_SMBUS_SOFTEND_NO_PEC LL_I2C_MODE_SOFTEND /*!< Enable SMBUS Software end mode + with HW PEC comparison. */ +#define LL_I2C_MODE_SMBUS_AUTOEND_WITH_PEC (uint32_t)(LL_I2C_MODE_AUTOEND | I2C_CR2_PECBYTE) +/*!< Enable SMBUS Automatic end mode with HW PEC comparison. */ +#define LL_I2C_MODE_SMBUS_SOFTEND_WITH_PEC (uint32_t)(LL_I2C_MODE_SOFTEND | I2C_CR2_PECBYTE) +/*!< Enable SMBUS Software end mode with HW PEC comparison. */ +/** + * @} + */ + +/** @defgroup I2C_LL_EC_GENERATE Start And Stop Generation + * @{ + */ +#define LL_I2C_GENERATE_NOSTARTSTOP 0x00000000U +/*!< Don't Generate Stop and Start condition. */ +#define LL_I2C_GENERATE_STOP (uint32_t)(0x80000000U | I2C_CR2_STOP) +/*!< Generate Stop condition (Size should be set to 0). */ +#define LL_I2C_GENERATE_START_READ (uint32_t)(0x80000000U | I2C_CR2_START | I2C_CR2_RD_WRN) +/*!< Generate Start for read request. */ +#define LL_I2C_GENERATE_START_WRITE (uint32_t)(0x80000000U | I2C_CR2_START) +/*!< Generate Start for write request. */ +#define LL_I2C_GENERATE_RESTART_7BIT_READ (uint32_t)(0x80000000U | I2C_CR2_START | I2C_CR2_RD_WRN) +/*!< Generate Restart for read request, slave 7Bit address. */ +#define LL_I2C_GENERATE_RESTART_7BIT_WRITE (uint32_t)(0x80000000U | I2C_CR2_START) +/*!< Generate Restart for write request, slave 7Bit address. */ +#define LL_I2C_GENERATE_RESTART_10BIT_READ (uint32_t)(0x80000000U | I2C_CR2_START | \ + I2C_CR2_RD_WRN | I2C_CR2_HEAD10R) +/*!< Generate Restart for read request, slave 10Bit address. */ +#define LL_I2C_GENERATE_RESTART_10BIT_WRITE (uint32_t)(0x80000000U | I2C_CR2_START) +/*!< Generate Restart for write request, slave 10Bit address.*/ +/** + * @} + */ + +/** @defgroup I2C_LL_EC_DIRECTION Read Write Direction + * @{ + */ +#define LL_I2C_DIRECTION_WRITE 0x00000000U /*!< Write transfer request by master, + slave enters receiver mode. */ +#define LL_I2C_DIRECTION_READ I2C_ISR_DIR /*!< Read transfer request by master, + slave enters transmitter mode.*/ +/** + * @} + */ + +/** @defgroup I2C_LL_EC_DMA_REG_DATA DMA Register Data + * @{ + */ +#define LL_I2C_DMA_REG_DATA_TRANSMIT 0x00000000U /*!< Get address of data register used for + transmission */ +#define LL_I2C_DMA_REG_DATA_RECEIVE 0x00000001U /*!< Get address of data register used for + reception */ +/** + * @} + */ + +/** @defgroup I2C_LL_EC_SMBUS_TIMEOUTA_MODE SMBus TimeoutA Mode SCL SDA Timeout + * @{ + */ +#define LL_I2C_SMBUS_TIMEOUTA_MODE_SCL_LOW 0x00000000U /*!< TimeoutA is used to detect + SCL low level timeout. */ +#define LL_I2C_SMBUS_TIMEOUTA_MODE_SDA_SCL_HIGH I2C_TIMEOUTR_TIDLE /*!< TimeoutA is used to detect + both SCL and SDA high level timeout.*/ +/** + * @} + */ + +/** @defgroup I2C_LL_EC_SMBUS_TIMEOUT_SELECTION SMBus Timeout Selection + * @{ + */ +#define LL_I2C_SMBUS_TIMEOUTA I2C_TIMEOUTR_TIMOUTEN /*!< TimeoutA enable bit */ +#define LL_I2C_SMBUS_TIMEOUTB I2C_TIMEOUTR_TEXTEN /*!< TimeoutB (extended clock) + enable bit */ +#define LL_I2C_SMBUS_ALL_TIMEOUT (uint32_t)(I2C_TIMEOUTR_TIMOUTEN | \ + I2C_TIMEOUTR_TEXTEN) /*!< TimeoutA and TimeoutB +(extended clock) enable bits */ +/** + * @} + */ + +/** + * @} + */ + +/* 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_CONVERT_TIMINGS Convert SDA SCL timings + * @{ + */ +/** + * @brief Configure the SDA setup, hold time and the SCL high, low period. + * @param __PRESCALER__ This parameter must be a value between Min_Data=0 and Max_Data=0xF. + * @param __SETUP_TIME__ This parameter must be a value between Min_Data=0 and Max_Data=0xF. + (tscldel = (SCLDEL+1)xtpresc) + * @param __HOLD_TIME__ This parameter must be a value between Min_Data=0 and Max_Data=0xF. + (tsdadel = SDADELxtpresc) + * @param __SCLH_PERIOD__ This parameter must be a value between Min_Data=0 and Max_Data=0xFF. + (tsclh = (SCLH+1)xtpresc) + * @param __SCLL_PERIOD__ This parameter must be a value between Min_Data=0 and Max_Data=0xFF. + (tscll = (SCLL+1)xtpresc) + * @retval Value between Min_Data=0 and Max_Data=0xFFFFFFFF + */ +#define __LL_I2C_CONVERT_TIMINGS(__PRESCALER__, __SETUP_TIME__, __HOLD_TIME__, __SCLH_PERIOD__, __SCLL_PERIOD__) \ + ((((uint32_t)(__PRESCALER__) << I2C_TIMINGR_PRESC_Pos) & I2C_TIMINGR_PRESC) | \ + (((uint32_t)(__SETUP_TIME__) << I2C_TIMINGR_SCLDEL_Pos) & I2C_TIMINGR_SCLDEL) | \ + (((uint32_t)(__HOLD_TIME__) << I2C_TIMINGR_SDADEL_Pos) & I2C_TIMINGR_SDADEL) | \ + (((uint32_t)(__SCLH_PERIOD__) << I2C_TIMINGR_SCLH_Pos) & I2C_TIMINGR_SCLH) | \ + (((uint32_t)(__SCLL_PERIOD__) << I2C_TIMINGR_SCLL_Pos) & I2C_TIMINGR_SCLL)) +/** + * @} + */ + +/** + * @} + */ + +/* 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). + * @note When PE = 0, the I2C SCL and SDA lines are released. + * Internal state machines and status bits are put back to their reset value. + * When cleared, PE must be kept low for at least 3 APB clock cycles. + * @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)) ? 1UL : 0UL); +} + +/** + * @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 CR1 ANFOFF LL_I2C_ConfigFilters\n + * CR1 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*ti2cclk). + * This parameter is used to configure the digital noise filter on SDA and SCL input. + * The digital filter will filter spikes with a length of up to DNF[3:0]*ti2cclk. + * @retval None + */ +__STATIC_INLINE void LL_I2C_ConfigFilters(I2C_TypeDef *I2Cx, uint32_t AnalogFilter, uint32_t DigitalFilter) +{ + MODIFY_REG(I2Cx->CR1, I2C_CR1_ANFOFF | I2C_CR1_DNF, AnalogFilter | (DigitalFilter << I2C_CR1_DNF_Pos)); +} + +/** + * @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 CR1 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*ti2cclk). + * This parameter is used to configure the digital noise filter on SDA and SCL input. + * The digital filter will filter spikes with a length of up to DNF[3:0]*ti2cclk. + * @retval None + */ +__STATIC_INLINE void LL_I2C_SetDigitalFilter(I2C_TypeDef *I2Cx, uint32_t DigitalFilter) +{ + MODIFY_REG(I2Cx->CR1, I2C_CR1_DNF, DigitalFilter << I2C_CR1_DNF_Pos); +} + +/** + * @brief Get the current Digital Noise Filter configuration. + * @rmtoll CR1 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->CR1, I2C_CR1_DNF) >> I2C_CR1_DNF_Pos); +} + +/** + * @brief Enable Analog Noise Filter. + * @note This filter can only be programmed when the I2C is disabled (PE = 0). + * @rmtoll CR1 ANFOFF LL_I2C_EnableAnalogFilter + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableAnalogFilter(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR1, I2C_CR1_ANFOFF); +} + +/** + * @brief Disable Analog Noise Filter. + * @note This filter can only be programmed when the I2C is disabled (PE = 0). + * @rmtoll CR1 ANFOFF LL_I2C_DisableAnalogFilter + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableAnalogFilter(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR1, I2C_CR1_ANFOFF); +} + +/** + * @brief Check if Analog Noise Filter is enabled or disabled. + * @rmtoll CR1 ANFOFF 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->CR1, I2C_CR1_ANFOFF) != (I2C_CR1_ANFOFF)) ? 1UL : 0UL); +} + +/** + * @brief Enable DMA transmission requests. + * @rmtoll CR1 TXDMAEN LL_I2C_EnableDMAReq_TX + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableDMAReq_TX(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR1, I2C_CR1_TXDMAEN); +} + +/** + * @brief Disable DMA transmission requests. + * @rmtoll CR1 TXDMAEN LL_I2C_DisableDMAReq_TX + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableDMAReq_TX(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR1, I2C_CR1_TXDMAEN); +} + +/** + * @brief Check if DMA transmission requests are enabled or disabled. + * @rmtoll CR1 TXDMAEN 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->CR1, I2C_CR1_TXDMAEN) == (I2C_CR1_TXDMAEN)) ? 1UL : 0UL); +} + +/** + * @brief Enable DMA reception requests. + * @rmtoll CR1 RXDMAEN LL_I2C_EnableDMAReq_RX + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableDMAReq_RX(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR1, I2C_CR1_RXDMAEN); +} + +/** + * @brief Disable DMA reception requests. + * @rmtoll CR1 RXDMAEN LL_I2C_DisableDMAReq_RX + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableDMAReq_RX(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR1, I2C_CR1_RXDMAEN); +} + +/** + * @brief Check if DMA reception requests are enabled or disabled. + * @rmtoll CR1 RXDMAEN 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->CR1, I2C_CR1_RXDMAEN) == (I2C_CR1_RXDMAEN)) ? 1UL : 0UL); +} + +/** + * @brief Get the data register address used for DMA transfer + * @rmtoll TXDR TXDATA LL_I2C_DMA_GetRegAddr\n + * RXDR RXDATA LL_I2C_DMA_GetRegAddr + * @param I2Cx I2C Instance + * @param Direction This parameter can be one of the following values: + * @arg @ref LL_I2C_DMA_REG_DATA_TRANSMIT + * @arg @ref LL_I2C_DMA_REG_DATA_RECEIVE + * @retval Address of data register + */ +__STATIC_INLINE uint32_t LL_I2C_DMA_GetRegAddr(I2C_TypeDef *I2Cx, uint32_t Direction) +{ + uint32_t data_reg_addr; + + if (Direction == LL_I2C_DMA_REG_DATA_TRANSMIT) + { + /* return address of TXDR register */ + data_reg_addr = (uint32_t) &(I2Cx->TXDR); + } + else + { + /* return address of RXDR register */ + data_reg_addr = (uint32_t) &(I2Cx->RXDR); + } + + return data_reg_addr; +} + +/** + * @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)) ? 1UL : 0UL); +} + +/** + * @brief Enable hardware byte control in slave mode. + * @rmtoll CR1 SBC LL_I2C_EnableSlaveByteControl + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableSlaveByteControl(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR1, I2C_CR1_SBC); +} + +/** + * @brief Disable hardware byte control in slave mode. + * @rmtoll CR1 SBC LL_I2C_DisableSlaveByteControl + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableSlaveByteControl(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR1, I2C_CR1_SBC); +} + +/** + * @brief Check if hardware byte control in slave mode is enabled or disabled. + * @rmtoll CR1 SBC LL_I2C_IsEnabledSlaveByteControl + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabledSlaveByteControl(I2C_TypeDef *I2Cx) +{ + return ((READ_BIT(I2Cx->CR1, I2C_CR1_SBC) == (I2C_CR1_SBC)) ? 1UL : 0UL); +} + +/** + * @brief Enable Wakeup from STOP. + * @note The macro IS_I2C_WAKEUP_FROMSTOP_INSTANCE(I2Cx) can be used to check whether or not + * WakeUpFromStop feature is supported by the I2Cx Instance. + * @note This bit can only be programmed when Digital Filter is disabled. + * @rmtoll CR1 WUPEN LL_I2C_EnableWakeUpFromStop + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableWakeUpFromStop(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR1, I2C_CR1_WUPEN); +} + +/** + * @brief Disable Wakeup from STOP. + * @note The macro IS_I2C_WAKEUP_FROMSTOP_INSTANCE(I2Cx) can be used to check whether or not + * WakeUpFromStop feature is supported by the I2Cx Instance. + * @rmtoll CR1 WUPEN LL_I2C_DisableWakeUpFromStop + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableWakeUpFromStop(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR1, I2C_CR1_WUPEN); +} + +/** + * @brief Check if Wakeup from STOP is enabled or disabled. + * @note The macro IS_I2C_WAKEUP_FROMSTOP_INSTANCE(I2Cx) can be used to check whether or not + * WakeUpFromStop feature is supported by the I2Cx Instance. + * @rmtoll CR1 WUPEN LL_I2C_IsEnabledWakeUpFromStop + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabledWakeUpFromStop(I2C_TypeDef *I2Cx) +{ + return ((READ_BIT(I2Cx->CR1, I2C_CR1_WUPEN) == (I2C_CR1_WUPEN)) ? 1UL : 0UL); +} + +/** + * @brief Enable General Call. + * @note When enabled the Address 0x00 is ACKed. + * @rmtoll CR1 GCEN LL_I2C_EnableGeneralCall + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableGeneralCall(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR1, I2C_CR1_GCEN); +} + +/** + * @brief Disable General Call. + * @note When disabled the Address 0x00 is NACKed. + * @rmtoll CR1 GCEN LL_I2C_DisableGeneralCall + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableGeneralCall(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR1, I2C_CR1_GCEN); +} + +/** + * @brief Check if General Call is enabled or disabled. + * @rmtoll CR1 GCEN 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_GCEN) == (I2C_CR1_GCEN)) ? 1UL : 0UL); +} + +/** + * @brief Configure the Master to operate in 7-bit or 10-bit addressing mode. + * @note Changing this bit is not allowed, when the START bit is set. + * @rmtoll CR2 ADD10 LL_I2C_SetMasterAddressingMode + * @param I2Cx I2C Instance. + * @param AddressingMode This parameter can be one of the following values: + * @arg @ref LL_I2C_ADDRESSING_MODE_7BIT + * @arg @ref LL_I2C_ADDRESSING_MODE_10BIT + * @retval None + */ +__STATIC_INLINE void LL_I2C_SetMasterAddressingMode(I2C_TypeDef *I2Cx, uint32_t AddressingMode) +{ + MODIFY_REG(I2Cx->CR2, I2C_CR2_ADD10, AddressingMode); +} + +/** + * @brief Get the Master addressing mode. + * @rmtoll CR2 ADD10 LL_I2C_GetMasterAddressingMode + * @param I2Cx I2C Instance. + * @retval Returned value can be one of the following values: + * @arg @ref LL_I2C_ADDRESSING_MODE_7BIT + * @arg @ref LL_I2C_ADDRESSING_MODE_10BIT + */ +__STATIC_INLINE uint32_t LL_I2C_GetMasterAddressingMode(I2C_TypeDef *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->CR2, I2C_CR2_ADD10)); +} + +/** + * @brief Set the Own Address1. + * @rmtoll OAR1 OA1 LL_I2C_SetOwnAddress1\n + * OAR1 OA1MODE 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_OA1 | I2C_OAR1_OA1MODE, OwnAddress1 | OwnAddrSize); +} + +/** + * @brief Enable acknowledge on Own Address1 match address. + * @rmtoll OAR1 OA1EN LL_I2C_EnableOwnAddress1 + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableOwnAddress1(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->OAR1, I2C_OAR1_OA1EN); +} + +/** + * @brief Disable acknowledge on Own Address1 match address. + * @rmtoll OAR1 OA1EN LL_I2C_DisableOwnAddress1 + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableOwnAddress1(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->OAR1, I2C_OAR1_OA1EN); +} + +/** + * @brief Check if Own Address1 acknowledge is enabled or disabled. + * @rmtoll OAR1 OA1EN LL_I2C_IsEnabledOwnAddress1 + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabledOwnAddress1(I2C_TypeDef *I2Cx) +{ + return ((READ_BIT(I2Cx->OAR1, I2C_OAR1_OA1EN) == (I2C_OAR1_OA1EN)) ? 1UL : 0UL); +} + +/** + * @brief Set the 7bits Own Address2. + * @note This action has no effect if own address2 is enabled. + * @rmtoll OAR2 OA2 LL_I2C_SetOwnAddress2\n + * OAR2 OA2MSK LL_I2C_SetOwnAddress2 + * @param I2Cx I2C Instance. + * @param OwnAddress2 Value between Min_Data=0 and Max_Data=0x7F. + * @param OwnAddrMask This parameter can be one of the following values: + * @arg @ref LL_I2C_OWNADDRESS2_NOMASK + * @arg @ref LL_I2C_OWNADDRESS2_MASK01 + * @arg @ref LL_I2C_OWNADDRESS2_MASK02 + * @arg @ref LL_I2C_OWNADDRESS2_MASK03 + * @arg @ref LL_I2C_OWNADDRESS2_MASK04 + * @arg @ref LL_I2C_OWNADDRESS2_MASK05 + * @arg @ref LL_I2C_OWNADDRESS2_MASK06 + * @arg @ref LL_I2C_OWNADDRESS2_MASK07 + * @retval None + */ +__STATIC_INLINE void LL_I2C_SetOwnAddress2(I2C_TypeDef *I2Cx, uint32_t OwnAddress2, uint32_t OwnAddrMask) +{ + MODIFY_REG(I2Cx->OAR2, I2C_OAR2_OA2 | I2C_OAR2_OA2MSK, OwnAddress2 | OwnAddrMask); +} + +/** + * @brief Enable acknowledge on Own Address2 match address. + * @rmtoll OAR2 OA2EN LL_I2C_EnableOwnAddress2 + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableOwnAddress2(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->OAR2, I2C_OAR2_OA2EN); +} + +/** + * @brief Disable acknowledge on Own Address2 match address. + * @rmtoll OAR2 OA2EN LL_I2C_DisableOwnAddress2 + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableOwnAddress2(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->OAR2, I2C_OAR2_OA2EN); +} + +/** + * @brief Check if Own Address1 acknowledge is enabled or disabled. + * @rmtoll OAR2 OA2EN 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_OA2EN) == (I2C_OAR2_OA2EN)) ? 1UL : 0UL); +} + +/** + * @brief Configure the SDA setup, hold time and the SCL high, low period. + * @note This bit can only be programmed when the I2C is disabled (PE = 0). + * @rmtoll TIMINGR TIMINGR LL_I2C_SetTiming + * @param I2Cx I2C Instance. + * @param Timing This parameter must be a value between Min_Data=0 and Max_Data=0xFFFFFFFF. + * @note This parameter is computed with the STM32CubeMX Tool. + * @retval None + */ +__STATIC_INLINE void LL_I2C_SetTiming(I2C_TypeDef *I2Cx, uint32_t Timing) +{ + WRITE_REG(I2Cx->TIMINGR, Timing); +} + +/** + * @brief Get the Timing Prescaler setting. + * @rmtoll TIMINGR PRESC LL_I2C_GetTimingPrescaler + * @param I2Cx I2C Instance. + * @retval Value between Min_Data=0x0 and Max_Data=0xF + */ +__STATIC_INLINE uint32_t LL_I2C_GetTimingPrescaler(I2C_TypeDef *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->TIMINGR, I2C_TIMINGR_PRESC) >> I2C_TIMINGR_PRESC_Pos); +} + +/** + * @brief Get the SCL low period setting. + * @rmtoll TIMINGR SCLL LL_I2C_GetClockLowPeriod + * @param I2Cx I2C Instance. + * @retval Value between Min_Data=0x00 and Max_Data=0xFF + */ +__STATIC_INLINE uint32_t LL_I2C_GetClockLowPeriod(I2C_TypeDef *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->TIMINGR, I2C_TIMINGR_SCLL) >> I2C_TIMINGR_SCLL_Pos); +} + +/** + * @brief Get the SCL high period setting. + * @rmtoll TIMINGR SCLH LL_I2C_GetClockHighPeriod + * @param I2Cx I2C Instance. + * @retval Value between Min_Data=0x00 and Max_Data=0xFF + */ +__STATIC_INLINE uint32_t LL_I2C_GetClockHighPeriod(I2C_TypeDef *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->TIMINGR, I2C_TIMINGR_SCLH) >> I2C_TIMINGR_SCLH_Pos); +} + +/** + * @brief Get the SDA hold time. + * @rmtoll TIMINGR SDADEL LL_I2C_GetDataHoldTime + * @param I2Cx I2C Instance. + * @retval Value between Min_Data=0x0 and Max_Data=0xF + */ +__STATIC_INLINE uint32_t LL_I2C_GetDataHoldTime(I2C_TypeDef *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->TIMINGR, I2C_TIMINGR_SDADEL) >> I2C_TIMINGR_SDADEL_Pos); +} + +/** + * @brief Get the SDA setup time. + * @rmtoll TIMINGR SCLDEL LL_I2C_GetDataSetupTime + * @param I2Cx I2C Instance. + * @retval Value between Min_Data=0x0 and Max_Data=0xF + */ +__STATIC_INLINE uint32_t LL_I2C_GetDataSetupTime(I2C_TypeDef *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->TIMINGR, I2C_TIMINGR_SCLDEL) >> I2C_TIMINGR_SCLDEL_Pos); +} + +/** + * @brief Configure peripheral mode. + * @note The macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll CR1 SMBHEN LL_I2C_SetMode\n + * CR1 SMBDEN 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_SMBHEN | I2C_CR1_SMBDEN, PeripheralMode); +} + +/** + * @brief Get peripheral mode. + * @note The macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll CR1 SMBHEN LL_I2C_GetMode\n + * CR1 SMBDEN 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_SMBHEN | I2C_CR1_SMBDEN)); +} + +/** + * @brief Enable SMBus alert (Host or Device mode) + * @note The 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 ALERTEN LL_I2C_EnableSMBusAlert + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableSMBusAlert(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR1, I2C_CR1_ALERTEN); +} + +/** + * @brief Disable SMBus alert (Host or Device mode) + * @note The 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 ALERTEN LL_I2C_DisableSMBusAlert + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableSMBusAlert(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR1, I2C_CR1_ALERTEN); +} + +/** + * @brief Check if SMBus alert (Host or Device mode) is enabled or disabled. + * @note The macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll CR1 ALERTEN 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_ALERTEN) == (I2C_CR1_ALERTEN)) ? 1UL : 0UL); +} + +/** + * @brief Enable SMBus Packet Error Calculation (PEC). + * @note The macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll CR1 PECEN LL_I2C_EnableSMBusPEC + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableSMBusPEC(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR1, I2C_CR1_PECEN); +} + +/** + * @brief Disable SMBus Packet Error Calculation (PEC). + * @note The macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll CR1 PECEN LL_I2C_DisableSMBusPEC + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableSMBusPEC(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR1, I2C_CR1_PECEN); +} + +/** + * @brief Check if SMBus Packet Error Calculation (PEC) is enabled or disabled. + * @note The macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll CR1 PECEN 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_PECEN) == (I2C_CR1_PECEN)) ? 1UL : 0UL); +} + +/** + * @brief Configure the SMBus Clock Timeout. + * @note The macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @note This configuration can only be programmed when associated Timeout is disabled (TimeoutA and/orTimeoutB). + * @rmtoll TIMEOUTR TIMEOUTA LL_I2C_ConfigSMBusTimeout\n + * TIMEOUTR TIDLE LL_I2C_ConfigSMBusTimeout\n + * TIMEOUTR TIMEOUTB LL_I2C_ConfigSMBusTimeout + * @param I2Cx I2C Instance. + * @param TimeoutA This parameter must be a value between Min_Data=0 and Max_Data=0xFFF. + * @param TimeoutAMode This parameter can be one of the following values: + * @arg @ref LL_I2C_SMBUS_TIMEOUTA_MODE_SCL_LOW + * @arg @ref LL_I2C_SMBUS_TIMEOUTA_MODE_SDA_SCL_HIGH + * @param TimeoutB + * @retval None + */ +__STATIC_INLINE void LL_I2C_ConfigSMBusTimeout(I2C_TypeDef *I2Cx, uint32_t TimeoutA, uint32_t TimeoutAMode, + uint32_t TimeoutB) +{ + MODIFY_REG(I2Cx->TIMEOUTR, I2C_TIMEOUTR_TIMEOUTA | I2C_TIMEOUTR_TIDLE | I2C_TIMEOUTR_TIMEOUTB, + TimeoutA | TimeoutAMode | (TimeoutB << I2C_TIMEOUTR_TIMEOUTB_Pos)); +} + +/** + * @brief Configure the SMBus Clock TimeoutA (SCL low timeout or SCL and SDA high timeout depends on TimeoutA mode). + * @note The macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @note These bits can only be programmed when TimeoutA is disabled. + * @rmtoll TIMEOUTR TIMEOUTA LL_I2C_SetSMBusTimeoutA + * @param I2Cx I2C Instance. + * @param TimeoutA This parameter must be a value between Min_Data=0 and Max_Data=0xFFF. + * @retval None + */ +__STATIC_INLINE void LL_I2C_SetSMBusTimeoutA(I2C_TypeDef *I2Cx, uint32_t TimeoutA) +{ + WRITE_REG(I2Cx->TIMEOUTR, TimeoutA); +} + +/** + * @brief Get the SMBus Clock TimeoutA setting. + * @note The macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll TIMEOUTR TIMEOUTA LL_I2C_GetSMBusTimeoutA + * @param I2Cx I2C Instance. + * @retval Value between Min_Data=0 and Max_Data=0xFFF + */ +__STATIC_INLINE uint32_t LL_I2C_GetSMBusTimeoutA(I2C_TypeDef *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->TIMEOUTR, I2C_TIMEOUTR_TIMEOUTA)); +} + +/** + * @brief Set the SMBus Clock TimeoutA mode. + * @note The macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @note This bit can only be programmed when TimeoutA is disabled. + * @rmtoll TIMEOUTR TIDLE LL_I2C_SetSMBusTimeoutAMode + * @param I2Cx I2C Instance. + * @param TimeoutAMode This parameter can be one of the following values: + * @arg @ref LL_I2C_SMBUS_TIMEOUTA_MODE_SCL_LOW + * @arg @ref LL_I2C_SMBUS_TIMEOUTA_MODE_SDA_SCL_HIGH + * @retval None + */ +__STATIC_INLINE void LL_I2C_SetSMBusTimeoutAMode(I2C_TypeDef *I2Cx, uint32_t TimeoutAMode) +{ + WRITE_REG(I2Cx->TIMEOUTR, TimeoutAMode); +} + +/** + * @brief Get the SMBus Clock TimeoutA mode. + * @note The macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll TIMEOUTR TIDLE LL_I2C_GetSMBusTimeoutAMode + * @param I2Cx I2C Instance. + * @retval Returned value can be one of the following values: + * @arg @ref LL_I2C_SMBUS_TIMEOUTA_MODE_SCL_LOW + * @arg @ref LL_I2C_SMBUS_TIMEOUTA_MODE_SDA_SCL_HIGH + */ +__STATIC_INLINE uint32_t LL_I2C_GetSMBusTimeoutAMode(I2C_TypeDef *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->TIMEOUTR, I2C_TIMEOUTR_TIDLE)); +} + +/** + * @brief Configure the SMBus Extended Cumulative Clock TimeoutB (Master or Slave mode). + * @note The macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @note These bits can only be programmed when TimeoutB is disabled. + * @rmtoll TIMEOUTR TIMEOUTB LL_I2C_SetSMBusTimeoutB + * @param I2Cx I2C Instance. + * @param TimeoutB This parameter must be a value between Min_Data=0 and Max_Data=0xFFF. + * @retval None + */ +__STATIC_INLINE void LL_I2C_SetSMBusTimeoutB(I2C_TypeDef *I2Cx, uint32_t TimeoutB) +{ + WRITE_REG(I2Cx->TIMEOUTR, TimeoutB << I2C_TIMEOUTR_TIMEOUTB_Pos); +} + +/** + * @brief Get the SMBus Extended Cumulative Clock TimeoutB setting. + * @note The macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll TIMEOUTR TIMEOUTB LL_I2C_GetSMBusTimeoutB + * @param I2Cx I2C Instance. + * @retval Value between Min_Data=0 and Max_Data=0xFFF + */ +__STATIC_INLINE uint32_t LL_I2C_GetSMBusTimeoutB(I2C_TypeDef *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->TIMEOUTR, I2C_TIMEOUTR_TIMEOUTB) >> I2C_TIMEOUTR_TIMEOUTB_Pos); +} + +/** + * @brief Enable the SMBus Clock Timeout. + * @note The macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll TIMEOUTR TIMOUTEN LL_I2C_EnableSMBusTimeout\n + * TIMEOUTR TEXTEN LL_I2C_EnableSMBusTimeout + * @param I2Cx I2C Instance. + * @param ClockTimeout This parameter can be one of the following values: + * @arg @ref LL_I2C_SMBUS_TIMEOUTA + * @arg @ref LL_I2C_SMBUS_TIMEOUTB + * @arg @ref LL_I2C_SMBUS_ALL_TIMEOUT + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableSMBusTimeout(I2C_TypeDef *I2Cx, uint32_t ClockTimeout) +{ + SET_BIT(I2Cx->TIMEOUTR, ClockTimeout); +} + +/** + * @brief Disable the SMBus Clock Timeout. + * @note The macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll TIMEOUTR TIMOUTEN LL_I2C_DisableSMBusTimeout\n + * TIMEOUTR TEXTEN LL_I2C_DisableSMBusTimeout + * @param I2Cx I2C Instance. + * @param ClockTimeout This parameter can be one of the following values: + * @arg @ref LL_I2C_SMBUS_TIMEOUTA + * @arg @ref LL_I2C_SMBUS_TIMEOUTB + * @arg @ref LL_I2C_SMBUS_ALL_TIMEOUT + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableSMBusTimeout(I2C_TypeDef *I2Cx, uint32_t ClockTimeout) +{ + CLEAR_BIT(I2Cx->TIMEOUTR, ClockTimeout); +} + +/** + * @brief Check if the SMBus Clock Timeout is enabled or disabled. + * @note The macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll TIMEOUTR TIMOUTEN LL_I2C_IsEnabledSMBusTimeout\n + * TIMEOUTR TEXTEN LL_I2C_IsEnabledSMBusTimeout + * @param I2Cx I2C Instance. + * @param ClockTimeout This parameter can be one of the following values: + * @arg @ref LL_I2C_SMBUS_TIMEOUTA + * @arg @ref LL_I2C_SMBUS_TIMEOUTB + * @arg @ref LL_I2C_SMBUS_ALL_TIMEOUT + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabledSMBusTimeout(I2C_TypeDef *I2Cx, uint32_t ClockTimeout) +{ + return ((READ_BIT(I2Cx->TIMEOUTR, (I2C_TIMEOUTR_TIMOUTEN | I2C_TIMEOUTR_TEXTEN)) == \ + (ClockTimeout)) ? 1UL : 0UL); +} + +/** + * @} + */ + +/** @defgroup I2C_LL_EF_IT_Management IT_Management + * @{ + */ + +/** + * @brief Enable TXIS interrupt. + * @rmtoll CR1 TXIE LL_I2C_EnableIT_TX + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableIT_TX(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR1, I2C_CR1_TXIE); +} + +/** + * @brief Disable TXIS interrupt. + * @rmtoll CR1 TXIE LL_I2C_DisableIT_TX + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableIT_TX(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR1, I2C_CR1_TXIE); +} + +/** + * @brief Check if the TXIS Interrupt is enabled or disabled. + * @rmtoll CR1 TXIE 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->CR1, I2C_CR1_TXIE) == (I2C_CR1_TXIE)) ? 1UL : 0UL); +} + +/** + * @brief Enable RXNE interrupt. + * @rmtoll CR1 RXIE LL_I2C_EnableIT_RX + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableIT_RX(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR1, I2C_CR1_RXIE); +} + +/** + * @brief Disable RXNE interrupt. + * @rmtoll CR1 RXIE LL_I2C_DisableIT_RX + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableIT_RX(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR1, I2C_CR1_RXIE); +} + +/** + * @brief Check if the RXNE Interrupt is enabled or disabled. + * @rmtoll CR1 RXIE 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->CR1, I2C_CR1_RXIE) == (I2C_CR1_RXIE)) ? 1UL : 0UL); +} + +/** + * @brief Enable Address match interrupt (slave mode only). + * @rmtoll CR1 ADDRIE LL_I2C_EnableIT_ADDR + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableIT_ADDR(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR1, I2C_CR1_ADDRIE); +} + +/** + * @brief Disable Address match interrupt (slave mode only). + * @rmtoll CR1 ADDRIE LL_I2C_DisableIT_ADDR + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableIT_ADDR(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR1, I2C_CR1_ADDRIE); +} + +/** + * @brief Check if Address match interrupt is enabled or disabled. + * @rmtoll CR1 ADDRIE LL_I2C_IsEnabledIT_ADDR + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabledIT_ADDR(I2C_TypeDef *I2Cx) +{ + return ((READ_BIT(I2Cx->CR1, I2C_CR1_ADDRIE) == (I2C_CR1_ADDRIE)) ? 1UL : 0UL); +} + +/** + * @brief Enable Not acknowledge received interrupt. + * @rmtoll CR1 NACKIE LL_I2C_EnableIT_NACK + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableIT_NACK(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR1, I2C_CR1_NACKIE); +} + +/** + * @brief Disable Not acknowledge received interrupt. + * @rmtoll CR1 NACKIE LL_I2C_DisableIT_NACK + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableIT_NACK(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR1, I2C_CR1_NACKIE); +} + +/** + * @brief Check if Not acknowledge received interrupt is enabled or disabled. + * @rmtoll CR1 NACKIE LL_I2C_IsEnabledIT_NACK + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabledIT_NACK(I2C_TypeDef *I2Cx) +{ + return ((READ_BIT(I2Cx->CR1, I2C_CR1_NACKIE) == (I2C_CR1_NACKIE)) ? 1UL : 0UL); +} + +/** + * @brief Enable STOP detection interrupt. + * @rmtoll CR1 STOPIE LL_I2C_EnableIT_STOP + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableIT_STOP(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR1, I2C_CR1_STOPIE); +} + +/** + * @brief Disable STOP detection interrupt. + * @rmtoll CR1 STOPIE LL_I2C_DisableIT_STOP + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableIT_STOP(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR1, I2C_CR1_STOPIE); +} + +/** + * @brief Check if STOP detection interrupt is enabled or disabled. + * @rmtoll CR1 STOPIE LL_I2C_IsEnabledIT_STOP + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabledIT_STOP(I2C_TypeDef *I2Cx) +{ + return ((READ_BIT(I2Cx->CR1, I2C_CR1_STOPIE) == (I2C_CR1_STOPIE)) ? 1UL : 0UL); +} + +/** + * @brief Enable Transfer Complete interrupt. + * @note Any of these events will generate interrupt : + * Transfer Complete (TC) + * Transfer Complete Reload (TCR) + * @rmtoll CR1 TCIE LL_I2C_EnableIT_TC + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableIT_TC(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR1, I2C_CR1_TCIE); +} + +/** + * @brief Disable Transfer Complete interrupt. + * @note Any of these events will generate interrupt : + * Transfer Complete (TC) + * Transfer Complete Reload (TCR) + * @rmtoll CR1 TCIE LL_I2C_DisableIT_TC + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableIT_TC(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR1, I2C_CR1_TCIE); +} + +/** + * @brief Check if Transfer Complete interrupt is enabled or disabled. + * @rmtoll CR1 TCIE LL_I2C_IsEnabledIT_TC + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabledIT_TC(I2C_TypeDef *I2Cx) +{ + return ((READ_BIT(I2Cx->CR1, I2C_CR1_TCIE) == (I2C_CR1_TCIE)) ? 1UL : 0UL); +} + +/** + * @brief Enable Error interrupts. + * @note The 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 : + * Arbitration Loss (ARLO) + * Bus Error detection (BERR) + * Overrun/Underrun (OVR) + * SMBus Timeout detection (TIMEOUT) + * SMBus PEC error detection (PECERR) + * SMBus Alert pin event detection (ALERT) + * @rmtoll CR1 ERRIE LL_I2C_EnableIT_ERR + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableIT_ERR(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR1, I2C_CR1_ERRIE); +} + +/** + * @brief Disable Error interrupts. + * @note The 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 : + * Arbitration Loss (ARLO) + * Bus Error detection (BERR) + * Overrun/Underrun (OVR) + * SMBus Timeout detection (TIMEOUT) + * SMBus PEC error detection (PECERR) + * SMBus Alert pin event detection (ALERT) + * @rmtoll CR1 ERRIE LL_I2C_DisableIT_ERR + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableIT_ERR(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR1, I2C_CR1_ERRIE); +} + +/** + * @brief Check if Error interrupts are enabled or disabled. + * @rmtoll CR1 ERRIE 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->CR1, I2C_CR1_ERRIE) == (I2C_CR1_ERRIE)) ? 1UL : 0UL); +} + +/** + * @} + */ + +/** @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 ISR 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->ISR, I2C_ISR_TXE) == (I2C_ISR_TXE)) ? 1UL : 0UL); +} + +/** + * @brief Indicate the status of Transmit interrupt flag. + * @note RESET: When next data is written in Transmit data register. + * SET: When Transmit data register is empty. + * @rmtoll ISR TXIS LL_I2C_IsActiveFlag_TXIS + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_TXIS(I2C_TypeDef *I2Cx) +{ + return ((READ_BIT(I2Cx->ISR, I2C_ISR_TXIS) == (I2C_ISR_TXIS)) ? 1UL : 0UL); +} + +/** + * @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 ISR 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->ISR, I2C_ISR_RXNE) == (I2C_ISR_RXNE)) ? 1UL : 0UL); +} + +/** + * @brief Indicate the status of Address matched flag (slave mode). + * @note RESET: Clear default value. + * SET: When the received slave address matched with one of the enabled slave address. + * @rmtoll ISR 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->ISR, I2C_ISR_ADDR) == (I2C_ISR_ADDR)) ? 1UL : 0UL); +} + +/** + * @brief Indicate the status of Not Acknowledge received flag. + * @note RESET: Clear default value. + * SET: When a NACK is received after a byte transmission. + * @rmtoll ISR NACKF LL_I2C_IsActiveFlag_NACK + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_NACK(I2C_TypeDef *I2Cx) +{ + return ((READ_BIT(I2Cx->ISR, I2C_ISR_NACKF) == (I2C_ISR_NACKF)) ? 1UL : 0UL); +} + +/** + * @brief Indicate the status of Stop detection flag. + * @note RESET: Clear default value. + * SET: When a Stop condition is detected. + * @rmtoll ISR 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->ISR, I2C_ISR_STOPF) == (I2C_ISR_STOPF)) ? 1UL : 0UL); +} + +/** + * @brief Indicate the status of Transfer complete flag (master mode). + * @note RESET: Clear default value. + * SET: When RELOAD=0, AUTOEND=0 and NBYTES date have been transferred. + * @rmtoll ISR TC LL_I2C_IsActiveFlag_TC + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_TC(I2C_TypeDef *I2Cx) +{ + return ((READ_BIT(I2Cx->ISR, I2C_ISR_TC) == (I2C_ISR_TC)) ? 1UL : 0UL); +} + +/** + * @brief Indicate the status of Transfer complete flag (master mode). + * @note RESET: Clear default value. + * SET: When RELOAD=1 and NBYTES date have been transferred. + * @rmtoll ISR TCR LL_I2C_IsActiveFlag_TCR + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsActiveFlag_TCR(I2C_TypeDef *I2Cx) +{ + return ((READ_BIT(I2Cx->ISR, I2C_ISR_TCR) == (I2C_ISR_TCR)) ? 1UL : 0UL); +} + +/** + * @brief Indicate the status of Bus error flag. + * @note RESET: Clear default value. + * SET: When a misplaced Start or Stop condition is detected. + * @rmtoll ISR 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->ISR, I2C_ISR_BERR) == (I2C_ISR_BERR)) ? 1UL : 0UL); +} + +/** + * @brief Indicate the status of Arbitration lost flag. + * @note RESET: Clear default value. + * SET: When arbitration lost. + * @rmtoll ISR 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->ISR, I2C_ISR_ARLO) == (I2C_ISR_ARLO)) ? 1UL : 0UL); +} + +/** + * @brief Indicate the status of Overrun/Underrun flag (slave mode). + * @note RESET: Clear default value. + * SET: When an overrun/underrun error occurs (Clock Stretching Disabled). + * @rmtoll ISR 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->ISR, I2C_ISR_OVR) == (I2C_ISR_OVR)) ? 1UL : 0UL); +} + +/** + * @brief Indicate the status of SMBus PEC error flag in reception. + * @note The macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @note RESET: Clear default value. + * SET: When the received PEC does not match with the PEC register content. + * @rmtoll ISR 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->ISR, I2C_ISR_PECERR) == (I2C_ISR_PECERR)) ? 1UL : 0UL); +} + +/** + * @brief Indicate the status of SMBus Timeout detection flag. + * @note The macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @note RESET: Clear default value. + * SET: When a timeout or extended clock timeout occurs. + * @rmtoll ISR 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->ISR, I2C_ISR_TIMEOUT) == (I2C_ISR_TIMEOUT)) ? 1UL : 0UL); +} + +/** + * @brief Indicate the status of SMBus alert flag. + * @note The macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @note RESET: Clear default value. + * SET: When SMBus host configuration, SMBus alert enabled and + * a falling edge event occurs on SMBA pin. + * @rmtoll ISR ALERT 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->ISR, I2C_ISR_ALERT) == (I2C_ISR_ALERT)) ? 1UL : 0UL); +} + +/** + * @brief Indicate the status of Bus Busy flag. + * @note RESET: Clear default value. + * SET: When a Start condition is detected. + * @rmtoll ISR 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->ISR, I2C_ISR_BUSY) == (I2C_ISR_BUSY)) ? 1UL : 0UL); +} + +/** + * @brief Clear Address Matched flag. + * @rmtoll ICR ADDRCF LL_I2C_ClearFlag_ADDR + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_ClearFlag_ADDR(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->ICR, I2C_ICR_ADDRCF); +} + +/** + * @brief Clear Not Acknowledge flag. + * @rmtoll ICR NACKCF LL_I2C_ClearFlag_NACK + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_ClearFlag_NACK(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->ICR, I2C_ICR_NACKCF); +} + +/** + * @brief Clear Stop detection flag. + * @rmtoll ICR STOPCF LL_I2C_ClearFlag_STOP + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_ClearFlag_STOP(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->ICR, I2C_ICR_STOPCF); +} + +/** + * @brief Clear Transmit data register empty flag (TXE). + * @note This bit can be clear by software in order to flush the transmit data register (TXDR). + * @rmtoll ISR TXE LL_I2C_ClearFlag_TXE + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_ClearFlag_TXE(I2C_TypeDef *I2Cx) +{ + WRITE_REG(I2Cx->ISR, I2C_ISR_TXE); +} + +/** + * @brief Clear Bus error flag. + * @rmtoll ICR BERRCF LL_I2C_ClearFlag_BERR + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_ClearFlag_BERR(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->ICR, I2C_ICR_BERRCF); +} + +/** + * @brief Clear Arbitration lost flag. + * @rmtoll ICR ARLOCF LL_I2C_ClearFlag_ARLO + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_ClearFlag_ARLO(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->ICR, I2C_ICR_ARLOCF); +} + +/** + * @brief Clear Overrun/Underrun flag. + * @rmtoll ICR OVRCF LL_I2C_ClearFlag_OVR + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_ClearFlag_OVR(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->ICR, I2C_ICR_OVRCF); +} + +/** + * @brief Clear SMBus PEC error flag. + * @note The macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll ICR PECCF LL_I2C_ClearSMBusFlag_PECERR + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_ClearSMBusFlag_PECERR(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->ICR, I2C_ICR_PECCF); +} + +/** + * @brief Clear SMBus Timeout detection flag. + * @note The macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll ICR TIMOUTCF LL_I2C_ClearSMBusFlag_TIMEOUT + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_ClearSMBusFlag_TIMEOUT(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->ICR, I2C_ICR_TIMOUTCF); +} + +/** + * @brief Clear SMBus Alert flag. + * @note The macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll ICR ALERTCF LL_I2C_ClearSMBusFlag_ALERT + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_ClearSMBusFlag_ALERT(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->ICR, I2C_ICR_ALERTCF); +} + +/** + * @} + */ + +/** @defgroup I2C_LL_EF_Data_Management Data_Management + * @{ + */ + +/** + * @brief Enable automatic STOP condition generation (master mode). + * @note Automatic end mode : a STOP condition is automatically sent when NBYTES data are transferred. + * This bit has no effect in slave mode or when RELOAD bit is set. + * @rmtoll CR2 AUTOEND LL_I2C_EnableAutoEndMode + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableAutoEndMode(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR2, I2C_CR2_AUTOEND); +} + +/** + * @brief Disable automatic STOP condition generation (master mode). + * @note Software end mode : TC flag is set when NBYTES data are transferre, stretching SCL low. + * @rmtoll CR2 AUTOEND LL_I2C_DisableAutoEndMode + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableAutoEndMode(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR2, I2C_CR2_AUTOEND); +} + +/** + * @brief Check if automatic STOP condition is enabled or disabled. + * @rmtoll CR2 AUTOEND LL_I2C_IsEnabledAutoEndMode + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabledAutoEndMode(I2C_TypeDef *I2Cx) +{ + return ((READ_BIT(I2Cx->CR2, I2C_CR2_AUTOEND) == (I2C_CR2_AUTOEND)) ? 1UL : 0UL); +} + +/** + * @brief Enable reload mode (master mode). + * @note The transfer is not completed after the NBYTES data transfer, NBYTES will be reloaded when TCR flag is set. + * @rmtoll CR2 RELOAD LL_I2C_EnableReloadMode + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableReloadMode(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR2, I2C_CR2_RELOAD); +} + +/** + * @brief Disable reload mode (master mode). + * @note The transfer is completed after the NBYTES data transfer(STOP or RESTART will follow). + * @rmtoll CR2 RELOAD LL_I2C_DisableReloadMode + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableReloadMode(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR2, I2C_CR2_RELOAD); +} + +/** + * @brief Check if reload mode is enabled or disabled. + * @rmtoll CR2 RELOAD LL_I2C_IsEnabledReloadMode + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabledReloadMode(I2C_TypeDef *I2Cx) +{ + return ((READ_BIT(I2Cx->CR2, I2C_CR2_RELOAD) == (I2C_CR2_RELOAD)) ? 1UL : 0UL); +} + +/** + * @brief Configure the number of bytes for transfer. + * @note Changing these bits when START bit is set is not allowed. + * @rmtoll CR2 NBYTES LL_I2C_SetTransferSize + * @param I2Cx I2C Instance. + * @param TransferSize This parameter must be a value between Min_Data=0x00 and Max_Data=0xFF. + * @retval None + */ +__STATIC_INLINE void LL_I2C_SetTransferSize(I2C_TypeDef *I2Cx, uint32_t TransferSize) +{ + MODIFY_REG(I2Cx->CR2, I2C_CR2_NBYTES, TransferSize << I2C_CR2_NBYTES_Pos); +} + +/** + * @brief Get the number of bytes configured for transfer. + * @rmtoll CR2 NBYTES LL_I2C_GetTransferSize + * @param I2Cx I2C Instance. + * @retval Value between Min_Data=0x0 and Max_Data=0xFF + */ +__STATIC_INLINE uint32_t LL_I2C_GetTransferSize(I2C_TypeDef *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->CR2, I2C_CR2_NBYTES) >> I2C_CR2_NBYTES_Pos); +} + +/** + * @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 mode only. + * @rmtoll CR2 NACK 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->CR2, I2C_CR2_NACK, 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 CR2 START LL_I2C_GenerateStartCondition + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_GenerateStartCondition(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR2, I2C_CR2_START); +} + +/** + * @brief Generate a STOP condition after the current byte transfer (master mode). + * @rmtoll CR2 STOP LL_I2C_GenerateStopCondition + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_GenerateStopCondition(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR2, I2C_CR2_STOP); +} + +/** + * @brief Enable automatic RESTART Read request condition for 10bit address header (master mode). + * @note The master sends the complete 10bit slave address read sequence : + * Start + 2 bytes 10bit address in Write direction + Restart + first 7 bits of 10bit address + in Read direction. + * @rmtoll CR2 HEAD10R LL_I2C_EnableAuto10BitRead + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableAuto10BitRead(I2C_TypeDef *I2Cx) +{ + CLEAR_BIT(I2Cx->CR2, I2C_CR2_HEAD10R); +} + +/** + * @brief Disable automatic RESTART Read request condition for 10bit address header (master mode). + * @note The master only sends the first 7 bits of 10bit address in Read direction. + * @rmtoll CR2 HEAD10R LL_I2C_DisableAuto10BitRead + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_DisableAuto10BitRead(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR2, I2C_CR2_HEAD10R); +} + +/** + * @brief Check if automatic RESTART Read request condition for 10bit address header is enabled or disabled. + * @rmtoll CR2 HEAD10R LL_I2C_IsEnabledAuto10BitRead + * @param I2Cx I2C Instance. + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_I2C_IsEnabledAuto10BitRead(I2C_TypeDef *I2Cx) +{ + return ((READ_BIT(I2Cx->CR2, I2C_CR2_HEAD10R) != (I2C_CR2_HEAD10R)) ? 1UL : 0UL); +} + +/** + * @brief Configure the transfer direction (master mode). + * @note Changing these bits when START bit is set is not allowed. + * @rmtoll CR2 RD_WRN LL_I2C_SetTransferRequest + * @param I2Cx I2C Instance. + * @param TransferRequest This parameter can be one of the following values: + * @arg @ref LL_I2C_REQUEST_WRITE + * @arg @ref LL_I2C_REQUEST_READ + * @retval None + */ +__STATIC_INLINE void LL_I2C_SetTransferRequest(I2C_TypeDef *I2Cx, uint32_t TransferRequest) +{ + MODIFY_REG(I2Cx->CR2, I2C_CR2_RD_WRN, TransferRequest); +} + +/** + * @brief Get the transfer direction requested (master mode). + * @rmtoll CR2 RD_WRN LL_I2C_GetTransferRequest + * @param I2Cx I2C Instance. + * @retval Returned value can be one of the following values: + * @arg @ref LL_I2C_REQUEST_WRITE + * @arg @ref LL_I2C_REQUEST_READ + */ +__STATIC_INLINE uint32_t LL_I2C_GetTransferRequest(I2C_TypeDef *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->CR2, I2C_CR2_RD_WRN)); +} + +/** + * @brief Configure the slave address for transfer (master mode). + * @note Changing these bits when START bit is set is not allowed. + * @rmtoll CR2 SADD LL_I2C_SetSlaveAddr + * @param I2Cx I2C Instance. + * @param SlaveAddr This parameter must be a value between Min_Data=0x00 and Max_Data=0x3F. + * @retval None + */ +__STATIC_INLINE void LL_I2C_SetSlaveAddr(I2C_TypeDef *I2Cx, uint32_t SlaveAddr) +{ + MODIFY_REG(I2Cx->CR2, I2C_CR2_SADD, SlaveAddr); +} + +/** + * @brief Get the slave address programmed for transfer. + * @rmtoll CR2 SADD LL_I2C_GetSlaveAddr + * @param I2Cx I2C Instance. + * @retval Value between Min_Data=0x0 and Max_Data=0x3F + */ +__STATIC_INLINE uint32_t LL_I2C_GetSlaveAddr(I2C_TypeDef *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->CR2, I2C_CR2_SADD)); +} + +/** + * @brief Handles I2Cx communication when starting transfer or during transfer (TC or TCR flag are set). + * @rmtoll CR2 SADD LL_I2C_HandleTransfer\n + * CR2 ADD10 LL_I2C_HandleTransfer\n + * CR2 RD_WRN LL_I2C_HandleTransfer\n + * CR2 START LL_I2C_HandleTransfer\n + * CR2 STOP LL_I2C_HandleTransfer\n + * CR2 RELOAD LL_I2C_HandleTransfer\n + * CR2 NBYTES LL_I2C_HandleTransfer\n + * CR2 AUTOEND LL_I2C_HandleTransfer\n + * CR2 HEAD10R LL_I2C_HandleTransfer + * @param I2Cx I2C Instance. + * @param SlaveAddr Specifies the slave address to be programmed. + * @param SlaveAddrSize This parameter can be one of the following values: + * @arg @ref LL_I2C_ADDRSLAVE_7BIT + * @arg @ref LL_I2C_ADDRSLAVE_10BIT + * @param TransferSize Specifies the number of bytes to be programmed. + * This parameter must be a value between Min_Data=0 and Max_Data=255. + * @param EndMode This parameter can be one of the following values: + * @arg @ref LL_I2C_MODE_RELOAD + * @arg @ref LL_I2C_MODE_AUTOEND + * @arg @ref LL_I2C_MODE_SOFTEND + * @arg @ref LL_I2C_MODE_SMBUS_RELOAD + * @arg @ref LL_I2C_MODE_SMBUS_AUTOEND_NO_PEC + * @arg @ref LL_I2C_MODE_SMBUS_SOFTEND_NO_PEC + * @arg @ref LL_I2C_MODE_SMBUS_AUTOEND_WITH_PEC + * @arg @ref LL_I2C_MODE_SMBUS_SOFTEND_WITH_PEC + * @param Request This parameter can be one of the following values: + * @arg @ref LL_I2C_GENERATE_NOSTARTSTOP + * @arg @ref LL_I2C_GENERATE_STOP + * @arg @ref LL_I2C_GENERATE_START_READ + * @arg @ref LL_I2C_GENERATE_START_WRITE + * @arg @ref LL_I2C_GENERATE_RESTART_7BIT_READ + * @arg @ref LL_I2C_GENERATE_RESTART_7BIT_WRITE + * @arg @ref LL_I2C_GENERATE_RESTART_10BIT_READ + * @arg @ref LL_I2C_GENERATE_RESTART_10BIT_WRITE + * @retval None + */ +__STATIC_INLINE void LL_I2C_HandleTransfer(I2C_TypeDef *I2Cx, uint32_t SlaveAddr, uint32_t SlaveAddrSize, + uint32_t TransferSize, uint32_t EndMode, uint32_t Request) +{ + MODIFY_REG(I2Cx->CR2, I2C_CR2_SADD | I2C_CR2_ADD10 | + (I2C_CR2_RD_WRN & (uint32_t)(Request >> (31U - I2C_CR2_RD_WRN_Pos))) | + I2C_CR2_START | I2C_CR2_STOP | I2C_CR2_RELOAD | + I2C_CR2_NBYTES | I2C_CR2_AUTOEND | I2C_CR2_HEAD10R, + SlaveAddr | SlaveAddrSize | (TransferSize << I2C_CR2_NBYTES_Pos) | EndMode | Request); +} + +/** + * @brief Indicate the value of transfer direction (slave mode). + * @note RESET: Write transfer, Slave enters in receiver mode. + * SET: Read transfer, Slave enters in transmitter mode. + * @rmtoll ISR DIR 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->ISR, I2C_ISR_DIR)); +} + +/** + * @brief Return the slave matched address. + * @rmtoll ISR ADDCODE LL_I2C_GetAddressMatchCode + * @param I2Cx I2C Instance. + * @retval Value between Min_Data=0x00 and Max_Data=0x3F + */ +__STATIC_INLINE uint32_t LL_I2C_GetAddressMatchCode(I2C_TypeDef *I2Cx) +{ + return (uint32_t)(READ_BIT(I2Cx->ISR, I2C_ISR_ADDCODE) >> I2C_ISR_ADDCODE_Pos << 1); +} + +/** + * @brief Enable internal comparison of the SMBus Packet Error byte (transmission or reception mode). + * @note The 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 when a STOP condition + or an Address Matched is received. + * This bit has no effect when RELOAD bit is set. + * This bit has no effect in device mode when SBC bit is not set. + * @rmtoll CR2 PECBYTE LL_I2C_EnableSMBusPECCompare + * @param I2Cx I2C Instance. + * @retval None + */ +__STATIC_INLINE void LL_I2C_EnableSMBusPECCompare(I2C_TypeDef *I2Cx) +{ + SET_BIT(I2Cx->CR2, I2C_CR2_PECBYTE); +} + +/** + * @brief Check if the SMBus Packet Error byte internal comparison is requested or not. + * @note The macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll CR2 PECBYTE 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->CR2, I2C_CR2_PECBYTE) == (I2C_CR2_PECBYTE)) ? 1UL : 0UL); +} + +/** + * @brief Get the SMBus Packet Error byte calculated. + * @note The macro IS_SMBUS_ALL_INSTANCE(I2Cx) can be used to check whether or not + * SMBus feature is supported by the I2Cx Instance. + * @rmtoll PECR 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->PECR, I2C_PECR_PEC)); +} + +/** + * @brief Read Receive Data register. + * @rmtoll RXDR RXDATA LL_I2C_ReceiveData8 + * @param I2Cx I2C Instance. + * @retval Value between Min_Data=0x00 and Max_Data=0xFF + */ +__STATIC_INLINE uint8_t LL_I2C_ReceiveData8(I2C_TypeDef *I2Cx) +{ + return (uint8_t)(READ_BIT(I2Cx->RXDR, I2C_RXDR_RXDATA)); +} + +/** + * @brief Write in Transmit Data Register . + * @rmtoll TXDR TXDATA LL_I2C_TransmitData8 + * @param I2Cx I2C Instance. + * @param Data Value between Min_Data=0x00 and Max_Data=0xFF + * @retval None + */ +__STATIC_INLINE void LL_I2C_TransmitData8(I2C_TypeDef *I2Cx, uint8_t Data) +{ + WRITE_REG(I2Cx->TXDR, Data); +} + +/** + * @} + */ + +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup I2C_LL_EF_Init Initialization and de-initialization functions + * @{ + */ + +ErrorStatus LL_I2C_Init(I2C_TypeDef *I2Cx, LL_I2C_InitTypeDef *I2C_InitStruct); +ErrorStatus 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 /* STM32F3xx_LL_I2C_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_pwr.h b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_pwr.h new file mode 100644 index 0000000..9f900d6 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_pwr.h @@ -0,0 +1,554 @@ +/** + ****************************************************************************** + * @file stm32f3xx_ll_pwr.h + * @author MCD Application Team + * @brief Header file of PWR LL module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F3xx_LL_PWR_H +#define __STM32F3xx_LL_PWR_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f3xx.h" + +/** @addtogroup STM32F3xx_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 */ +#if defined(PWR_PVD_SUPPORT) +#define LL_PWR_CSR_PVDO PWR_CSR_PVDO /*!< Power voltage detector output flag */ +#endif /* PWR_PVD_SUPPORT */ +#if defined(PWR_CSR_VREFINTRDYF) +#define LL_PWR_CSR_VREFINTRDYF PWR_CSR_VREFINTRDYF /*!< VREFINT ready flag */ +#endif /* PWR_CSR_VREFINTRDYF */ +#define LL_PWR_CSR_EWUP1 PWR_CSR_EWUP1 /*!< Enable WKUP pin 1 */ +#define LL_PWR_CSR_EWUP2 PWR_CSR_EWUP2 /*!< Enable WKUP pin 2 */ +#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_MODE_PWR Mode Power + * @{ + */ +#define LL_PWR_MODE_STOP_MAINREGU 0x00000000U /*!< Enter Stop mode when the CPU enters deepsleep */ +#define LL_PWR_MODE_STOP_LPREGU (PWR_CR_LPDS) /*!< Enter Stop mode (with low power Regulator ON) when the CPU enters deepsleep */ +#define LL_PWR_MODE_STANDBY (PWR_CR_PDDS) /*!< Enter Standby mode when the CPU enters deepsleep */ +/** + * @} + */ + +#if defined(PWR_CR_LPDS) +/** @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 */ +/** + * @} + */ +#endif /* PWR_CR_LPDS */ + +#if defined(PWR_PVD_SUPPORT) +/** @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 */ +/** + * @} + */ +#endif /* PWR_PVD_SUPPORT */ +/** @defgroup PWR_LL_EC_WAKEUP_PIN Wakeup Pins + * @{ + */ +#define LL_PWR_WAKEUP_PIN1 (PWR_CSR_EWUP1) /*!< WKUP pin 1 : PA0 */ +#define LL_PWR_WAKEUP_PIN2 (PWR_CSR_EWUP2) /*!< WKUP pin 2 : PC13 */ +#if defined(PWR_CSR_EWUP3) +#define LL_PWR_WAKEUP_PIN3 (PWR_CSR_EWUP3) /*!< WKUP pin 3 : PE6 or PA2 according to device */ +#endif /* PWR_CSR_EWUP3 */ +/** + * @} + */ + +/** @defgroup PWR_LL_EC_SDADC_ANALOG_X SDADC Analogx + * @{ + */ +#if defined(SDADC1) +#define LL_PWR_SDADC_ANALOG1 (PWR_CR_ENSD1) /*!< Enable SDADC1 */ +#endif /* SDADC1 */ +#if defined(SDADC2) +#define LL_PWR_SDADC_ANALOG2 (PWR_CR_ENSD2) /*!< Enable SDADC2 */ +#endif /* SDADC2 */ +#if defined(SDADC3) +#define LL_PWR_SDADC_ANALOG3 (PWR_CR_ENSD3) /*!< Enable SDADC3 */ +#endif /* SDADC3 */ +/** + * @} + */ +/** + * @} + */ + + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup PWR_LL_Exported_Macros PWR Exported Macros + * @{ + */ + +/** @defgroup PWR_LL_EM_WRITE_READ Common write and read registers Macros + * @{ + */ + +/** + * @brief Write a value in PWR register + * @param __REG__ Register to be written + * @param __VALUE__ Value to be written in the register + * @retval None + */ +#define LL_PWR_WriteReg(__REG__, __VALUE__) WRITE_REG(PWR->__REG__, (__VALUE__)) + +/** + * @brief Read a value in PWR register + * @param __REG__ Register to be read + * @retval Register value + */ +#define LL_PWR_ReadReg(__REG__) READ_REG(PWR->__REG__) +/** + * @} + */ + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup PWR_LL_Exported_Functions PWR Exported Functions + * @{ + */ + +/** @defgroup PWR_LL_EF_Configuration Configuration + * @{ + */ +/** + * @brief Enables the SDADC peripheral functionality + * @rmtoll CR ENSD1 LL_PWR_EnableSDADC\n + * CR ENSD2 LL_PWR_EnableSDADC\n + * CR ENSD3 LL_PWR_EnableSDADC + * @param Analogx This parameter can be a combination of the following values: + * @arg @ref LL_PWR_SDADC_ANALOG1 + * @arg @ref LL_PWR_SDADC_ANALOG2 + * @arg @ref LL_PWR_SDADC_ANALOG3 + * @retval None + */ +__STATIC_INLINE void LL_PWR_EnableSDADC(uint32_t Analogx) +{ + SET_BIT(PWR->CR, Analogx); +} + +/** + * @brief Disables the SDADC peripheral functionality + * @rmtoll CR ENSD1 LL_PWR_EnableSDADC\n + * CR ENSD2 LL_PWR_EnableSDADC\n + * CR ENSD3 LL_PWR_EnableSDADC + * @param Analogx This parameter can be a combination of the following values: + * @arg @ref LL_PWR_SDADC_ANALOG1 + * @arg @ref LL_PWR_SDADC_ANALOG2 + * @arg @ref LL_PWR_SDADC_ANALOG3 + * @retval None + */ +__STATIC_INLINE void LL_PWR_DisableSDADC(uint32_t Analogx) +{ + CLEAR_BIT(PWR->CR, Analogx); +} + +/** + * @brief Check if SDADCx has been enabled or not + * @rmtoll CR ENSD1 LL_PWR_IsEnabledSDADC\n + * CR ENSD2 LL_PWR_IsEnabledSDADC\n + * CR ENSD3 LL_PWR_IsEnabledSDADC + * @param Analogx This parameter can be a combination of the following values: + * @arg @ref LL_PWR_SDADC_ANALOG1 + * @arg @ref LL_PWR_SDADC_ANALOG2 + * @arg @ref LL_PWR_SDADC_ANALOG3 + * @retval None + */ +__STATIC_INLINE uint32_t LL_PWR_IsEnabledSDADC(uint32_t Analogx) +{ + return (READ_BIT(PWR->CR, Analogx) == (Analogx)); +} + +/** + * @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)); +} + +#if defined(PWR_CR_LPDS) +/** + * @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)); +} +#endif /* PWR_CR_LPDS */ + +/** + * @brief Set Power Down mode when CPU enters deepsleep + * @rmtoll CR PDDS LL_PWR_SetPowerMode\n + * @rmtoll CR LPDS LL_PWR_SetPowerMode + * @param PDMode This parameter can be one of the following values: + * @arg @ref LL_PWR_MODE_STOP_MAINREGU + * @arg @ref LL_PWR_MODE_STOP_LPREGU + * @arg @ref LL_PWR_MODE_STANDBY + * @retval None + */ +__STATIC_INLINE void LL_PWR_SetPowerMode(uint32_t PDMode) +{ + MODIFY_REG(PWR->CR, (PWR_CR_PDDS| PWR_CR_LPDS), PDMode); +} + +/** + * @brief Get Power Down mode when CPU enters deepsleep + * @rmtoll CR PDDS LL_PWR_GetPowerMode\n + * @rmtoll CR LPDS LL_PWR_GetPowerMode + * @retval Returned value can be one of the following values: + * @arg @ref LL_PWR_MODE_STOP_MAINREGU + * @arg @ref LL_PWR_MODE_STOP_LPREGU + * @arg @ref LL_PWR_MODE_STANDBY + */ +__STATIC_INLINE uint32_t LL_PWR_GetPowerMode(void) +{ + return (uint32_t)(READ_BIT(PWR->CR, (PWR_CR_PDDS| PWR_CR_LPDS))); +} + +#if defined(PWR_PVD_SUPPORT) +/** + * @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)); +} +#endif /* PWR_PVD_SUPPORT */ + +/** + * @brief Enable the WakeUp PINx functionality + * @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 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 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)); +} + +#if defined(PWR_PVD_SUPPORT) +/** + * @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)); +} +#endif /* PWR_PVD_SUPPORT */ + +#if defined(PWR_CSR_VREFINTRDYF) +/** + * @brief Get Internal Reference VrefInt Flag + * @rmtoll CSR VREFINTRDYF LL_PWR_IsActiveFlag_VREFINTRDY + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_PWR_IsActiveFlag_VREFINTRDY(void) +{ + return (READ_BIT(PWR->CSR, PWR_CSR_VREFINTRDYF) == (PWR_CSR_VREFINTRDYF)); +} +#endif /* PWR_CSR_VREFINTRDYF */ +/** + * @brief Clear Standby Flag + * @rmtoll CR CSBF LL_PWR_ClearFlag_SB + * @retval None + */ +__STATIC_INLINE void LL_PWR_ClearFlag_SB(void) +{ + SET_BIT(PWR->CR, PWR_CR_CSBF); +} + +/** + * @brief Clear Wake-up Flags + * @rmtoll CR CWUF LL_PWR_ClearFlag_WU + * @retval None + */ +__STATIC_INLINE void LL_PWR_ClearFlag_WU(void) +{ + SET_BIT(PWR->CR, PWR_CR_CWUF); +} + +/** + * @} + */ + +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup PWR_LL_EF_Init De-initialization function + * @{ + */ +ErrorStatus LL_PWR_DeInit(void); +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* defined(PWR) */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F3xx_LL_PWR_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_rcc.h b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_rcc.h new file mode 100644 index 0000000..6426832 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_rcc.h @@ -0,0 +1,2842 @@ +/** + ****************************************************************************** + * @file stm32f3xx_ll_rcc.h + * @author MCD Application Team + * @brief Header file of RCC LL module. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F3xx_LL_RCC_H +#define __STM32F3xx_LL_RCC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f3xx.h" + +/** @addtogroup STM32F3xx_LL_Driver + * @{ + */ + +#if defined(RCC) + +/** @defgroup RCC_LL RCC + * @{ + */ + +/* Private types -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private constants ---------------------------------------------------------*/ +/** @defgroup RCC_LL_Private_Constants RCC Private Constants + * @{ + */ +/* Defines used for the bit position in the register and perform offsets*/ +#define RCC_POSITION_HPRE (uint32_t)POSITION_VAL(RCC_CFGR_HPRE) /*!< field position in register RCC_CFGR */ +#define RCC_POSITION_PPRE1 (uint32_t)POSITION_VAL(RCC_CFGR_PPRE1) /*!< field position in register RCC_CFGR */ +#define RCC_POSITION_PPRE2 (uint32_t)POSITION_VAL(RCC_CFGR_PPRE2) /*!< field position in register RCC_CFGR */ +#define RCC_POSITION_HSICAL (uint32_t)POSITION_VAL(RCC_CR_HSICAL) /*!< field position in register RCC_CR */ +#define RCC_POSITION_HSITRIM (uint32_t)POSITION_VAL(RCC_CR_HSITRIM) /*!< field position in register RCC_CR */ +#define RCC_POSITION_PLLMUL (uint32_t)POSITION_VAL(RCC_CFGR_PLLMUL) /*!< field position in register RCC_CFGR */ +#define RCC_POSITION_USART1SW (uint32_t)0U /*!< field position in register RCC_CFGR3 */ +#define RCC_POSITION_USART2SW (uint32_t)16U /*!< field position in register RCC_CFGR3 */ +#define RCC_POSITION_USART3SW (uint32_t)18U /*!< field position in register RCC_CFGR3 */ +#define RCC_POSITION_TIM1SW (uint32_t)8U /*!< field position in register RCC_CFGR3 */ +#define RCC_POSITION_TIM8SW (uint32_t)9U /*!< field position in register RCC_CFGR3 */ +#define RCC_POSITION_TIM15SW (uint32_t)10U /*!< field position in register RCC_CFGR3 */ +#define RCC_POSITION_TIM16SW (uint32_t)11U /*!< field position in register RCC_CFGR3 */ +#define RCC_POSITION_TIM17SW (uint32_t)13U /*!< field position in register RCC_CFGR3 */ +#define RCC_POSITION_TIM20SW (uint32_t)15U /*!< field position in register RCC_CFGR3 */ +#define RCC_POSITION_TIM2SW (uint32_t)24U /*!< field position in register RCC_CFGR3 */ +#define RCC_POSITION_TIM34SW (uint32_t)25U /*!< field position in register RCC_CFGR3 */ + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup RCC_LL_Private_Macros RCC Private Macros + * @{ + */ +/** + * @} + */ +#endif /*USE_FULL_LL_DRIVER*/ +/* Exported types ------------------------------------------------------------*/ +#if defined(USE_FULL_LL_DRIVER) +/** @defgroup RCC_LL_Exported_Types RCC Exported Types + * @{ + */ + +/** @defgroup LL_ES_CLOCK_FREQ Clocks Frequency Structure + * @{ + */ + +/** + * @brief RCC Clocks Frequency Structure + */ +typedef struct +{ + uint32_t SYSCLK_Frequency; /*!< SYSCLK clock frequency */ + uint32_t HCLK_Frequency; /*!< HCLK clock frequency */ + uint32_t PCLK1_Frequency; /*!< PCLK1 clock frequency */ + uint32_t PCLK2_Frequency; /*!< PCLK2 clock frequency */ +} LL_RCC_ClocksTypeDef; + +/** + * @} + */ + +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup RCC_LL_Exported_Constants RCC Exported Constants + * @{ + */ + +/** @defgroup RCC_LL_EC_OSC_VALUES Oscillator Values adaptation + * @brief Defines used to adapt values of different oscillators + * @note These values could be modified in the user environment according to + * HW set-up. + * @{ + */ +#if !defined (HSE_VALUE) +#define HSE_VALUE 8000000U /*!< Value of the HSE oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSI_VALUE) +#define HSI_VALUE 8000000U /*!< Value of the HSI oscillator in Hz */ +#endif /* HSI_VALUE */ + +#if !defined (LSE_VALUE) +#define LSE_VALUE 32768U /*!< Value of the LSE oscillator in Hz */ +#endif /* LSE_VALUE */ + +#if !defined (LSI_VALUE) +#define LSI_VALUE 40000U /*!< Value of the LSI oscillator in Hz */ +#endif /* LSI_VALUE */ + +#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 */ +#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_CFGR_MCOF RCC_CFGR_MCOF /*!< MCO flag */ +#define LL_RCC_CIR_PLLRDYF RCC_CIR_PLLRDYF /*!< PLL Ready Interrupt flag */ +#define LL_RCC_CIR_CSSF RCC_CIR_CSSF /*!< Clock Security System Interrupt flag */ +#define LL_RCC_CSR_OBLRSTF RCC_CSR_OBLRSTF /*!< OBL 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 */ +#define LL_RCC_CSR_LPWRRSTF RCC_CSR_LPWRRSTF /*!< Low-Power reset flag */ +#if defined(RCC_CSR_V18PWRRSTF) +#define LL_RCC_CSR_V18PWRRSTF RCC_CSR_V18PWRRSTF /*!< Reset flag of the 1.8 V domain. */ +#endif /* RCC_CSR_V18PWRRSTF */ +/** + * @} + */ + +/** @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 */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_LSEDRIVE LSE oscillator drive capability + * @{ + */ +#define LL_RCC_LSEDRIVE_LOW ((uint32_t)0x00000000U) /*!< Xtal mode lower driving capability */ +#define LL_RCC_LSEDRIVE_MEDIUMLOW RCC_BDCR_LSEDRV_1 /*!< Xtal mode medium low driving capability */ +#define LL_RCC_LSEDRIVE_MEDIUMHIGH RCC_BDCR_LSEDRV_0 /*!< Xtal mode medium high driving capability */ +#define LL_RCC_LSEDRIVE_HIGH RCC_BDCR_LSEDRV /*!< Xtal mode higher driving capability */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_SYS_CLKSOURCE System clock switch + * @{ + */ +#define LL_RCC_SYS_CLKSOURCE_HSI RCC_CFGR_SW_HSI /*!< HSI selection as system clock */ +#define LL_RCC_SYS_CLKSOURCE_HSE RCC_CFGR_SW_HSE /*!< HSE selection as system clock */ +#define LL_RCC_SYS_CLKSOURCE_PLL RCC_CFGR_SW_PLL /*!< PLL selection as system clock */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_SYS_CLKSOURCE_STATUS System clock switch status + * @{ + */ +#define LL_RCC_SYS_CLKSOURCE_STATUS_HSI RCC_CFGR_SWS_HSI /*!< HSI used as system clock */ +#define LL_RCC_SYS_CLKSOURCE_STATUS_HSE RCC_CFGR_SWS_HSE /*!< HSE used as system clock */ +#define LL_RCC_SYS_CLKSOURCE_STATUS_PLL RCC_CFGR_SWS_PLL /*!< PLL used as system clock */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_SYSCLK_DIV AHB prescaler + * @{ + */ +#define LL_RCC_SYSCLK_DIV_1 RCC_CFGR_HPRE_DIV1 /*!< SYSCLK not divided */ +#define LL_RCC_SYSCLK_DIV_2 RCC_CFGR_HPRE_DIV2 /*!< SYSCLK divided by 2 */ +#define LL_RCC_SYSCLK_DIV_4 RCC_CFGR_HPRE_DIV4 /*!< SYSCLK divided by 4 */ +#define LL_RCC_SYSCLK_DIV_8 RCC_CFGR_HPRE_DIV8 /*!< SYSCLK divided by 8 */ +#define LL_RCC_SYSCLK_DIV_16 RCC_CFGR_HPRE_DIV16 /*!< SYSCLK divided by 16 */ +#define LL_RCC_SYSCLK_DIV_64 RCC_CFGR_HPRE_DIV64 /*!< SYSCLK divided by 64 */ +#define LL_RCC_SYSCLK_DIV_128 RCC_CFGR_HPRE_DIV128 /*!< SYSCLK divided by 128 */ +#define LL_RCC_SYSCLK_DIV_256 RCC_CFGR_HPRE_DIV256 /*!< SYSCLK divided by 256 */ +#define LL_RCC_SYSCLK_DIV_512 RCC_CFGR_HPRE_DIV512 /*!< SYSCLK divided by 512 */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_APB1_DIV APB low-speed prescaler (APB1) + * @{ + */ +#define LL_RCC_APB1_DIV_1 RCC_CFGR_PPRE1_DIV1 /*!< HCLK not divided */ +#define LL_RCC_APB1_DIV_2 RCC_CFGR_PPRE1_DIV2 /*!< HCLK divided by 2 */ +#define LL_RCC_APB1_DIV_4 RCC_CFGR_PPRE1_DIV4 /*!< HCLK divided by 4 */ +#define LL_RCC_APB1_DIV_8 RCC_CFGR_PPRE1_DIV8 /*!< HCLK divided by 8 */ +#define LL_RCC_APB1_DIV_16 RCC_CFGR_PPRE1_DIV16 /*!< HCLK divided by 16 */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_APB2_DIV APB high-speed prescaler (APB2) + * @{ + */ +#define LL_RCC_APB2_DIV_1 RCC_CFGR_PPRE2_DIV1 /*!< HCLK not divided */ +#define LL_RCC_APB2_DIV_2 RCC_CFGR_PPRE2_DIV2 /*!< HCLK divided by 2 */ +#define LL_RCC_APB2_DIV_4 RCC_CFGR_PPRE2_DIV4 /*!< HCLK divided by 4 */ +#define LL_RCC_APB2_DIV_8 RCC_CFGR_PPRE2_DIV8 /*!< HCLK divided by 8 */ +#define LL_RCC_APB2_DIV_16 RCC_CFGR_PPRE2_DIV16 /*!< HCLK divided by 16 */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_MCO1SOURCE MCO1 SOURCE selection + * @{ + */ +#define LL_RCC_MCO1SOURCE_NOCLOCK RCC_CFGR_MCOSEL_NOCLOCK /*!< MCO output disabled, no clock on MCO */ +#define LL_RCC_MCO1SOURCE_SYSCLK RCC_CFGR_MCOSEL_SYSCLK /*!< SYSCLK selection as MCO source */ +#define LL_RCC_MCO1SOURCE_HSI RCC_CFGR_MCOSEL_HSI /*!< HSI selection as MCO source */ +#define LL_RCC_MCO1SOURCE_HSE RCC_CFGR_MCOSEL_HSE /*!< HSE selection as MCO source */ +#define LL_RCC_MCO1SOURCE_LSI RCC_CFGR_MCOSEL_LSI /*!< LSI selection as MCO source */ +#define LL_RCC_MCO1SOURCE_LSE RCC_CFGR_MCOSEL_LSE /*!< LSE selection as MCO source */ +#define LL_RCC_MCO1SOURCE_PLLCLK_DIV_2 RCC_CFGR_MCOSEL_PLL_DIV2 /*!< PLL clock divided by 2*/ +#if defined(RCC_CFGR_PLLNODIV) +#define LL_RCC_MCO1SOURCE_PLLCLK (RCC_CFGR_MCOSEL_PLL_DIV2 | RCC_CFGR_PLLNODIV) /*!< PLL clock selected*/ +#endif /* RCC_CFGR_PLLNODIV */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_MCO1_DIV MCO1 prescaler + * @{ + */ +#define LL_RCC_MCO1_DIV_1 ((uint32_t)0x00000000U)/*!< MCO Clock divided by 1 */ +#if defined(RCC_CFGR_MCOPRE) +#define LL_RCC_MCO1_DIV_2 RCC_CFGR_MCOPRE_DIV2 /*!< MCO Clock divided by 2 */ +#define LL_RCC_MCO1_DIV_4 RCC_CFGR_MCOPRE_DIV4 /*!< MCO Clock divided by 4 */ +#define LL_RCC_MCO1_DIV_8 RCC_CFGR_MCOPRE_DIV8 /*!< MCO Clock divided by 8 */ +#define LL_RCC_MCO1_DIV_16 RCC_CFGR_MCOPRE_DIV16 /*!< MCO Clock divided by 16 */ +#define LL_RCC_MCO1_DIV_32 RCC_CFGR_MCOPRE_DIV32 /*!< MCO Clock divided by 32 */ +#define LL_RCC_MCO1_DIV_64 RCC_CFGR_MCOPRE_DIV64 /*!< MCO Clock divided by 64 */ +#define LL_RCC_MCO1_DIV_128 RCC_CFGR_MCOPRE_DIV128 /*!< MCO Clock divided by 128 */ +#endif /* RCC_CFGR_MCOPRE */ +/** + * @} + */ + +#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 */ + +/** @defgroup RCC_LL_EC_USART1_CLKSOURCE Peripheral USART clock source selection + * @{ + */ +#if defined(RCC_CFGR3_USART1SW_PCLK1) +#define LL_RCC_USART1_CLKSOURCE_PCLK1 (uint32_t)((RCC_POSITION_USART1SW << 24U) | RCC_CFGR3_USART1SW_PCLK1) /*!< PCLK1 clock used as USART1 clock source */ +#else +#define LL_RCC_USART1_CLKSOURCE_PCLK2 (uint32_t)((RCC_POSITION_USART1SW << 24U) | RCC_CFGR3_USART1SW_PCLK2) /*!< PCLK2 clock used as USART1 clock source */ +#endif /*RCC_CFGR3_USART1SW_PCLK1*/ +#define LL_RCC_USART1_CLKSOURCE_SYSCLK (uint32_t)((RCC_POSITION_USART1SW << 24U) | RCC_CFGR3_USART1SW_SYSCLK) /*!< System clock selected as USART1 clock source */ +#define LL_RCC_USART1_CLKSOURCE_LSE (uint32_t)((RCC_POSITION_USART1SW << 24U) | RCC_CFGR3_USART1SW_LSE) /*!< LSE oscillator clock used as USART1 clock source */ +#define LL_RCC_USART1_CLKSOURCE_HSI (uint32_t)((RCC_POSITION_USART1SW << 24U) | RCC_CFGR3_USART1SW_HSI) /*!< HSI oscillator clock used as USART1 clock source */ +#if defined(RCC_CFGR3_USART2SW) +#define LL_RCC_USART2_CLKSOURCE_PCLK1 (uint32_t)((RCC_POSITION_USART2SW << 24U) | RCC_CFGR3_USART2SW_PCLK) /*!< PCLK1 clock used as USART2 clock source */ +#define LL_RCC_USART2_CLKSOURCE_SYSCLK (uint32_t)((RCC_POSITION_USART2SW << 24U) | RCC_CFGR3_USART2SW_SYSCLK) /*!< System clock selected as USART2 clock source */ +#define LL_RCC_USART2_CLKSOURCE_LSE (uint32_t)((RCC_POSITION_USART2SW << 24U) | RCC_CFGR3_USART2SW_LSE) /*!< LSE oscillator clock used as USART2 clock source */ +#define LL_RCC_USART2_CLKSOURCE_HSI (uint32_t)((RCC_POSITION_USART2SW << 24U) | RCC_CFGR3_USART2SW_HSI) /*!< HSI oscillator clock used as USART2 clock source */ +#endif /* RCC_CFGR3_USART2SW */ +#if defined(RCC_CFGR3_USART3SW) +#define LL_RCC_USART3_CLKSOURCE_PCLK1 (uint32_t)((RCC_POSITION_USART3SW << 24U) | RCC_CFGR3_USART3SW_PCLK) /*!< PCLK1 clock used as USART3 clock source */ +#define LL_RCC_USART3_CLKSOURCE_SYSCLK (uint32_t)((RCC_POSITION_USART3SW << 24U) | RCC_CFGR3_USART3SW_SYSCLK) /*!< System clock selected as USART3 clock source */ +#define LL_RCC_USART3_CLKSOURCE_LSE (uint32_t)((RCC_POSITION_USART3SW << 24U) | RCC_CFGR3_USART3SW_LSE) /*!< LSE oscillator clock used as USART3 clock source */ +#define LL_RCC_USART3_CLKSOURCE_HSI (uint32_t)((RCC_POSITION_USART3SW << 24U) | RCC_CFGR3_USART3SW_HSI) /*!< HSI oscillator clock used as USART3 clock source */ +#endif /* RCC_CFGR3_USART3SW */ +/** + * @} + */ + +#if defined(RCC_CFGR3_UART4SW) || defined(RCC_CFGR3_UART5SW) +/** @defgroup RCC_LL_EC_UART4_CLKSOURCE Peripheral UART clock source selection + * @{ + */ +#define LL_RCC_UART4_CLKSOURCE_PCLK1 (uint32_t)((RCC_CFGR3_UART4SW >> 8U) | RCC_CFGR3_UART4SW_PCLK) /*!< PCLK1 clock used as UART4 clock source */ +#define LL_RCC_UART4_CLKSOURCE_SYSCLK (uint32_t)((RCC_CFGR3_UART4SW >> 8U) | RCC_CFGR3_UART4SW_SYSCLK) /*!< System clock selected as UART4 clock source */ +#define LL_RCC_UART4_CLKSOURCE_LSE (uint32_t)((RCC_CFGR3_UART4SW >> 8U) | RCC_CFGR3_UART4SW_LSE) /*!< LSE oscillator clock used as UART4 clock source */ +#define LL_RCC_UART4_CLKSOURCE_HSI (uint32_t)((RCC_CFGR3_UART4SW >> 8U) | RCC_CFGR3_UART4SW_HSI) /*!< HSI oscillator clock used as UART4 clock source */ +#define LL_RCC_UART5_CLKSOURCE_PCLK1 (uint32_t)((RCC_CFGR3_UART5SW >> 8U) | RCC_CFGR3_UART5SW_PCLK) /*!< PCLK1 clock used as UART5 clock source */ +#define LL_RCC_UART5_CLKSOURCE_SYSCLK (uint32_t)((RCC_CFGR3_UART5SW >> 8U) | RCC_CFGR3_UART5SW_SYSCLK) /*!< System clock selected as UART5 clock source */ +#define LL_RCC_UART5_CLKSOURCE_LSE (uint32_t)((RCC_CFGR3_UART5SW >> 8U) | RCC_CFGR3_UART5SW_LSE) /*!< LSE oscillator clock used as UART5 clock source */ +#define LL_RCC_UART5_CLKSOURCE_HSI (uint32_t)((RCC_CFGR3_UART5SW >> 8U) | RCC_CFGR3_UART5SW_HSI) /*!< HSI oscillator clock used as UART5 clock source */ +/** + * @} + */ + +#endif /* RCC_CFGR3_UART4SW || RCC_CFGR3_UART5SW */ + +/** @defgroup RCC_LL_EC_I2C1_CLKSOURCE Peripheral I2C clock source selection + * @{ + */ +#define LL_RCC_I2C1_CLKSOURCE_HSI (uint32_t)((RCC_CFGR3_I2C1SW << 24U) | RCC_CFGR3_I2C1SW_HSI) /*!< HSI oscillator clock used as I2C1 clock source */ +#define LL_RCC_I2C1_CLKSOURCE_SYSCLK (uint32_t)((RCC_CFGR3_I2C1SW << 24U) | RCC_CFGR3_I2C1SW_SYSCLK) /*!< System clock selected as I2C1 clock source */ +#if defined(RCC_CFGR3_I2C2SW) +#define LL_RCC_I2C2_CLKSOURCE_HSI (uint32_t)((RCC_CFGR3_I2C2SW << 24U) | RCC_CFGR3_I2C2SW_HSI) /*!< HSI oscillator clock used as I2C2 clock source */ +#define LL_RCC_I2C2_CLKSOURCE_SYSCLK (uint32_t)((RCC_CFGR3_I2C2SW << 24U) | RCC_CFGR3_I2C2SW_SYSCLK) /*!< System clock selected as I2C2 clock source */ +#endif /*RCC_CFGR3_I2C2SW*/ +#if defined(RCC_CFGR3_I2C3SW) +#define LL_RCC_I2C3_CLKSOURCE_HSI (uint32_t)((RCC_CFGR3_I2C3SW << 24U) | RCC_CFGR3_I2C3SW_HSI) /*!< HSI oscillator clock used as I2C3 clock source */ +#define LL_RCC_I2C3_CLKSOURCE_SYSCLK (uint32_t)((RCC_CFGR3_I2C3SW << 24U) | RCC_CFGR3_I2C3SW_SYSCLK) /*!< System clock selected as I2C3 clock source */ +#endif /*RCC_CFGR3_I2C3SW*/ +/** + * @} + */ + +#if defined(RCC_CFGR_I2SSRC) +/** @defgroup RCC_LL_EC_I2S_CLKSOURCE Peripheral I2S clock source selection + * @{ + */ +#define LL_RCC_I2S_CLKSOURCE_SYSCLK RCC_CFGR_I2SSRC_SYSCLK /*!< System clock selected as I2S clock source */ +#define LL_RCC_I2S_CLKSOURCE_PIN RCC_CFGR_I2SSRC_EXT /*!< External clock selected as I2S clock source */ +/** + * @} + */ + +#endif /* RCC_CFGR_I2SSRC */ + +#if defined(RCC_CFGR3_TIMSW) +/** @defgroup RCC_LL_EC_TIM1_CLKSOURCE Peripheral TIM clock source selection + * @{ + */ +#define LL_RCC_TIM1_CLKSOURCE_PCLK2 (uint32_t)(((RCC_POSITION_TIM1SW - RCC_POSITION_TIM1SW) << 27U) | RCC_CFGR3_TIM1SW_PCLK2) /*!< PCLK2 used as TIM1 clock source */ +#define LL_RCC_TIM1_CLKSOURCE_PLL (uint32_t)(((RCC_POSITION_TIM1SW - RCC_POSITION_TIM1SW) << 27U) | RCC_CFGR3_TIM1SW_PLL) /*!< PLL clock used as TIM1 clock source */ +#if defined(RCC_CFGR3_TIM8SW) +#define LL_RCC_TIM8_CLKSOURCE_PCLK2 (uint32_t)(((RCC_POSITION_TIM8SW - RCC_POSITION_TIM1SW) << 27U) | RCC_CFGR3_TIM8SW_PCLK2) /*!< PCLK2 used as TIM8 clock source */ +#define LL_RCC_TIM8_CLKSOURCE_PLL (uint32_t)(((RCC_POSITION_TIM8SW - RCC_POSITION_TIM1SW) << 27U) | RCC_CFGR3_TIM8SW_PLL) /*!< PLL clock used as TIM8 clock source */ +#endif /*RCC_CFGR3_TIM8SW*/ +#if defined(RCC_CFGR3_TIM15SW) +#define LL_RCC_TIM15_CLKSOURCE_PCLK2 (uint32_t)(((RCC_POSITION_TIM15SW - RCC_POSITION_TIM1SW) << 27U) | RCC_CFGR3_TIM15SW_PCLK2) /*!< PCLK2 used as TIM15 clock source */ +#define LL_RCC_TIM15_CLKSOURCE_PLL (uint32_t)(((RCC_POSITION_TIM15SW - RCC_POSITION_TIM1SW) << 27U) | RCC_CFGR3_TIM15SW_PLL) /*!< PLL clock used as TIM15 clock source */ +#endif /*RCC_CFGR3_TIM15SW*/ +#if defined(RCC_CFGR3_TIM16SW) +#define LL_RCC_TIM16_CLKSOURCE_PCLK2 (uint32_t)(((RCC_POSITION_TIM16SW - RCC_POSITION_TIM1SW) << 27U) | RCC_CFGR3_TIM16SW_PCLK2) /*!< PCLK2 used as TIM16 clock source */ +#define LL_RCC_TIM16_CLKSOURCE_PLL (uint32_t)(((RCC_POSITION_TIM16SW - RCC_POSITION_TIM1SW) << 27U) | RCC_CFGR3_TIM16SW_PLL) /*!< PLL clock used as TIM16 clock source */ +#endif /*RCC_CFGR3_TIM16SW*/ +#if defined(RCC_CFGR3_TIM17SW) +#define LL_RCC_TIM17_CLKSOURCE_PCLK2 (uint32_t)(((RCC_POSITION_TIM17SW - RCC_POSITION_TIM1SW) << 27U) | RCC_CFGR3_TIM17SW_PCLK2) /*!< PCLK2 used as TIM17 clock source */ +#define LL_RCC_TIM17_CLKSOURCE_PLL (uint32_t)(((RCC_POSITION_TIM17SW - RCC_POSITION_TIM1SW) << 27U) | RCC_CFGR3_TIM17SW_PLL) /*!< PLL clock used as TIM17 clock source */ +#endif /*RCC_CFGR3_TIM17SW*/ +#if defined(RCC_CFGR3_TIM20SW) +#define LL_RCC_TIM20_CLKSOURCE_PCLK2 (uint32_t)(((RCC_POSITION_TIM20SW - RCC_POSITION_TIM1SW) << 27U) | RCC_CFGR3_TIM20SW_PCLK2) /*!< PCLK2 used as TIM20 clock source */ +#define LL_RCC_TIM20_CLKSOURCE_PLL (uint32_t)(((RCC_POSITION_TIM20SW - RCC_POSITION_TIM1SW) << 27U) | RCC_CFGR3_TIM20SW_PLL) /*!< PLL clock used as TIM20 clock source */ +#endif /*RCC_CFGR3_TIM20SW*/ +#if defined(RCC_CFGR3_TIM2SW) +#define LL_RCC_TIM2_CLKSOURCE_PCLK1 (uint32_t)(((RCC_POSITION_TIM2SW - RCC_POSITION_TIM1SW) << 27U) | RCC_CFGR3_TIM2SW_PCLK1) /*!< PCLK1 used as TIM2 clock source */ +#define LL_RCC_TIM2_CLKSOURCE_PLL (uint32_t)(((RCC_POSITION_TIM2SW - RCC_POSITION_TIM1SW) << 27U) | RCC_CFGR3_TIM2SW_PLL) /*!< PLL clock used as TIM2 clock source */ +#endif /*RCC_CFGR3_TIM2SW*/ +#if defined(RCC_CFGR3_TIM34SW) +#define LL_RCC_TIM34_CLKSOURCE_PCLK1 (uint32_t)(((RCC_POSITION_TIM34SW - RCC_POSITION_TIM1SW) << 27U) | RCC_CFGR3_TIM34SW_PCLK1) /*!< PCLK1 used as TIM3/4 clock source */ +#define LL_RCC_TIM34_CLKSOURCE_PLL (uint32_t)(((RCC_POSITION_TIM34SW - RCC_POSITION_TIM1SW) << 27U) | RCC_CFGR3_TIM34SW_PLL) /*!< PLL clock used as TIM3/4 clock source */ +#endif /*RCC_CFGR3_TIM34SW*/ +/** + * @} + */ + +#endif /* RCC_CFGR3_TIMSW */ + +#if defined(HRTIM1) +/** @defgroup RCC_LL_EC_HRTIM1_CLKSOURCE Peripheral HRTIM1 clock source selection + * @{ + */ +#define LL_RCC_HRTIM1_CLKSOURCE_PCLK2 RCC_CFGR3_HRTIM1SW_PCLK2 /*!< PCLK2 used as HRTIM1 clock source */ +#define LL_RCC_HRTIM1_CLKSOURCE_PLL RCC_CFGR3_HRTIM1SW_PLL /*!< PLL clock used as HRTIM1 clock source */ +/** + * @} + */ + +#endif /* HRTIM1 */ + +#if defined(CEC) +/** @defgroup RCC_LL_EC_CEC_CLKSOURCE Peripheral CEC clock source selection + * @{ + */ +#define LL_RCC_CEC_CLKSOURCE_HSI_DIV244 RCC_CFGR3_CECSW_HSI_DIV244 /*!< HSI clock divided by 244 selected as HDMI CEC entry clock source */ +#define LL_RCC_CEC_CLKSOURCE_LSE RCC_CFGR3_CECSW_LSE /*!< LSE clock selected as HDMI CEC entry clock source */ +/** + * @} + */ + +#endif /* CEC */ + +#if defined(USB) +/** @defgroup RCC_LL_EC_USB_CLKSOURCE Peripheral USB clock source selection + * @{ + */ +#define LL_RCC_USB_CLKSOURCE_PLL RCC_CFGR_USBPRE_DIV1 /*!< USB prescaler is PLL clock divided by 1 */ +#define LL_RCC_USB_CLKSOURCE_PLL_DIV_1_5 RCC_CFGR_USBPRE_DIV1_5 /*!< USB prescaler is PLL clock divided by 1.5 */ +/** + * @} + */ + +#endif /* USB */ + +#if defined(RCC_CFGR_ADCPRE) +/** @defgroup RCC_LL_EC_ADC_CLKSOURCE Peripheral ADC clock source selection + * @{ + */ +#define LL_RCC_ADC_CLKSRC_PCLK2_DIV_2 RCC_CFGR_ADCPRE_DIV2 /*!< ADC prescaler PCLK divided by 2 */ +#define LL_RCC_ADC_CLKSRC_PCLK2_DIV_4 RCC_CFGR_ADCPRE_DIV4 /*!< ADC prescaler PCLK divided by 4 */ +#define LL_RCC_ADC_CLKSRC_PCLK2_DIV_6 RCC_CFGR_ADCPRE_DIV6 /*!< ADC prescaler PCLK divided by 6 */ +#define LL_RCC_ADC_CLKSRC_PCLK2_DIV_8 RCC_CFGR_ADCPRE_DIV8 /*!< ADC prescaler PCLK divided by 8 */ +/** + * @} + */ + +#elif defined(RCC_CFGR2_ADC1PRES) +/** @defgroup RCC_LL_EC_ADC1_CLKSOURCE Peripheral ADC clock source selection + * @{ + */ +#define LL_RCC_ADC1_CLKSRC_HCLK RCC_CFGR2_ADC1PRES_NO /*!< ADC1 clock disabled, ADC1 can use AHB clock */ +#define LL_RCC_ADC1_CLKSRC_PLL_DIV_1 RCC_CFGR2_ADC1PRES_DIV1 /*!< ADC1 PLL clock divided by 1 */ +#define LL_RCC_ADC1_CLKSRC_PLL_DIV_2 RCC_CFGR2_ADC1PRES_DIV2 /*!< ADC1 PLL clock divided by 2 */ +#define LL_RCC_ADC1_CLKSRC_PLL_DIV_4 RCC_CFGR2_ADC1PRES_DIV4 /*!< ADC1 PLL clock divided by 4 */ +#define LL_RCC_ADC1_CLKSRC_PLL_DIV_6 RCC_CFGR2_ADC1PRES_DIV6 /*!< ADC1 PLL clock divided by 6 */ +#define LL_RCC_ADC1_CLKSRC_PLL_DIV_8 RCC_CFGR2_ADC1PRES_DIV8 /*!< ADC1 PLL clock divided by 8 */ +#define LL_RCC_ADC1_CLKSRC_PLL_DIV_10 RCC_CFGR2_ADC1PRES_DIV10 /*!< ADC1 PLL clock divided by 10 */ +#define LL_RCC_ADC1_CLKSRC_PLL_DIV_12 RCC_CFGR2_ADC1PRES_DIV12 /*!< ADC1 PLL clock divided by 12 */ +#define LL_RCC_ADC1_CLKSRC_PLL_DIV_16 RCC_CFGR2_ADC1PRES_DIV16 /*!< ADC1 PLL clock divided by 16 */ +#define LL_RCC_ADC1_CLKSRC_PLL_DIV_32 RCC_CFGR2_ADC1PRES_DIV32 /*!< ADC1 PLL clock divided by 32 */ +#define LL_RCC_ADC1_CLKSRC_PLL_DIV_64 RCC_CFGR2_ADC1PRES_DIV64 /*!< ADC1 PLL clock divided by 64 */ +#define LL_RCC_ADC1_CLKSRC_PLL_DIV_128 RCC_CFGR2_ADC1PRES_DIV128 /*!< ADC1 PLL clock divided by 128 */ +#define LL_RCC_ADC1_CLKSRC_PLL_DIV_256 RCC_CFGR2_ADC1PRES_DIV256 /*!< ADC1 PLL clock divided by 256 */ +/** + * @} + */ + +#elif defined(RCC_CFGR2_ADCPRE12) || defined(RCC_CFGR2_ADCPRE34) +#if defined(RCC_CFGR2_ADCPRE12) && defined(RCC_CFGR2_ADCPRE34) +/** @defgroup RCC_LL_EC_ADC12_CLKSOURCE Peripheral ADC12 clock source selection + * @{ + */ +#define LL_RCC_ADC12_CLKSRC_HCLK (uint32_t)((RCC_CFGR2_ADCPRE12 << 16U) | RCC_CFGR2_ADCPRE12_NO) /*!< ADC12 clock disabled, ADC12 can use AHB clock */ +#define LL_RCC_ADC12_CLKSRC_PLL_DIV_1 (uint32_t)((RCC_CFGR2_ADCPRE12 << 16U) | RCC_CFGR2_ADCPRE12_DIV1) /*!< ADC12 PLL clock divided by 1 */ +#define LL_RCC_ADC12_CLKSRC_PLL_DIV_2 (uint32_t)((RCC_CFGR2_ADCPRE12 << 16U) | RCC_CFGR2_ADCPRE12_DIV2) /*!< ADC12 PLL clock divided by 2 */ +#define LL_RCC_ADC12_CLKSRC_PLL_DIV_4 (uint32_t)((RCC_CFGR2_ADCPRE12 << 16U) | RCC_CFGR2_ADCPRE12_DIV4) /*!< ADC12 PLL clock divided by 4 */ +#define LL_RCC_ADC12_CLKSRC_PLL_DIV_6 (uint32_t)((RCC_CFGR2_ADCPRE12 << 16U) | RCC_CFGR2_ADCPRE12_DIV6) /*!< ADC12 PLL clock divided by 6 */ +#define LL_RCC_ADC12_CLKSRC_PLL_DIV_8 (uint32_t)((RCC_CFGR2_ADCPRE12 << 16U) | RCC_CFGR2_ADCPRE12_DIV8) /*!< ADC12 PLL clock divided by 8 */ +#define LL_RCC_ADC12_CLKSRC_PLL_DIV_10 (uint32_t)((RCC_CFGR2_ADCPRE12 << 16U) | RCC_CFGR2_ADCPRE12_DIV10) /*!< ADC12 PLL clock divided by 10 */ +#define LL_RCC_ADC12_CLKSRC_PLL_DIV_12 (uint32_t)((RCC_CFGR2_ADCPRE12 << 16U) | RCC_CFGR2_ADCPRE12_DIV12) /*!< ADC12 PLL clock divided by 12 */ +#define LL_RCC_ADC12_CLKSRC_PLL_DIV_16 (uint32_t)((RCC_CFGR2_ADCPRE12 << 16U) | RCC_CFGR2_ADCPRE12_DIV16) /*!< ADC12 PLL clock divided by 16 */ +#define LL_RCC_ADC12_CLKSRC_PLL_DIV_32 (uint32_t)((RCC_CFGR2_ADCPRE12 << 16U) | RCC_CFGR2_ADCPRE12_DIV32) /*!< ADC12 PLL clock divided by 32 */ +#define LL_RCC_ADC12_CLKSRC_PLL_DIV_64 (uint32_t)((RCC_CFGR2_ADCPRE12 << 16U) | RCC_CFGR2_ADCPRE12_DIV64) /*!< ADC12 PLL clock divided by 64 */ +#define LL_RCC_ADC12_CLKSRC_PLL_DIV_128 (uint32_t)((RCC_CFGR2_ADCPRE12 << 16U) | RCC_CFGR2_ADCPRE12_DIV128) /*!< ADC12 PLL clock divided by 128 */ +#define LL_RCC_ADC12_CLKSRC_PLL_DIV_256 (uint32_t)((RCC_CFGR2_ADCPRE12 << 16U) | RCC_CFGR2_ADCPRE12_DIV256) /*!< ADC12 PLL clock divided by 256 */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_ADC34_CLKSOURCE Peripheral ADC34 clock source selection + * @{ + */ +#define LL_RCC_ADC34_CLKSRC_HCLK (uint32_t)((RCC_CFGR2_ADCPRE34 << 16U) | RCC_CFGR2_ADCPRE34_NO) /*!< ADC34 clock disabled, ADC34 can use AHB clock */ +#define LL_RCC_ADC34_CLKSRC_PLL_DIV_1 (uint32_t)((RCC_CFGR2_ADCPRE34 << 16U) | RCC_CFGR2_ADCPRE34_DIV1) /*!< ADC34 PLL clock divided by 1 */ +#define LL_RCC_ADC34_CLKSRC_PLL_DIV_2 (uint32_t)((RCC_CFGR2_ADCPRE34 << 16U) | RCC_CFGR2_ADCPRE34_DIV2) /*!< ADC34 PLL clock divided by 2 */ +#define LL_RCC_ADC34_CLKSRC_PLL_DIV_4 (uint32_t)((RCC_CFGR2_ADCPRE34 << 16U) | RCC_CFGR2_ADCPRE34_DIV4) /*!< ADC34 PLL clock divided by 4 */ +#define LL_RCC_ADC34_CLKSRC_PLL_DIV_6 (uint32_t)((RCC_CFGR2_ADCPRE34 << 16U) | RCC_CFGR2_ADCPRE34_DIV6) /*!< ADC34 PLL clock divided by 6 */ +#define LL_RCC_ADC34_CLKSRC_PLL_DIV_8 (uint32_t)((RCC_CFGR2_ADCPRE34 << 16U) | RCC_CFGR2_ADCPRE34_DIV8) /*!< ADC34 PLL clock divided by 8 */ +#define LL_RCC_ADC34_CLKSRC_PLL_DIV_10 (uint32_t)((RCC_CFGR2_ADCPRE34 << 16U) | RCC_CFGR2_ADCPRE34_DIV10) /*!< ADC34 PLL clock divided by 10 */ +#define LL_RCC_ADC34_CLKSRC_PLL_DIV_12 (uint32_t)((RCC_CFGR2_ADCPRE34 << 16U) | RCC_CFGR2_ADCPRE34_DIV12) /*!< ADC34 PLL clock divided by 12 */ +#define LL_RCC_ADC34_CLKSRC_PLL_DIV_16 (uint32_t)((RCC_CFGR2_ADCPRE34 << 16U) | RCC_CFGR2_ADCPRE34_DIV16) /*!< ADC34 PLL clock divided by 16 */ +#define LL_RCC_ADC34_CLKSRC_PLL_DIV_32 (uint32_t)((RCC_CFGR2_ADCPRE34 << 16U) | RCC_CFGR2_ADCPRE34_DIV32) /*!< ADC34 PLL clock divided by 32 */ +#define LL_RCC_ADC34_CLKSRC_PLL_DIV_64 (uint32_t)((RCC_CFGR2_ADCPRE34 << 16U) | RCC_CFGR2_ADCPRE34_DIV64) /*!< ADC34 PLL clock divided by 64 */ +#define LL_RCC_ADC34_CLKSRC_PLL_DIV_128 (uint32_t)((RCC_CFGR2_ADCPRE34 << 16U) | RCC_CFGR2_ADCPRE34_DIV128) /*!< ADC34 PLL clock divided by 128 */ +#define LL_RCC_ADC34_CLKSRC_PLL_DIV_256 (uint32_t)((RCC_CFGR2_ADCPRE34 << 16U) | RCC_CFGR2_ADCPRE34_DIV256) /*!< ADC34 PLL clock divided by 256 */ +/** + * @} + */ + +#else +/** @defgroup RCC_LL_EC_ADC12_CLKSOURCE Peripheral ADC clock source selection + * @{ + */ +#define LL_RCC_ADC12_CLKSRC_HCLK RCC_CFGR2_ADCPRE12_NO /*!< ADC12 clock disabled, ADC12 can use AHB clock */ +#define LL_RCC_ADC12_CLKSRC_PLL_DIV_1 RCC_CFGR2_ADCPRE12_DIV1 /*!< ADC12 PLL clock divided by 1 */ +#define LL_RCC_ADC12_CLKSRC_PLL_DIV_2 RCC_CFGR2_ADCPRE12_DIV2 /*!< ADC12 PLL clock divided by 2 */ +#define LL_RCC_ADC12_CLKSRC_PLL_DIV_4 RCC_CFGR2_ADCPRE12_DIV4 /*!< ADC12 PLL clock divided by 4 */ +#define LL_RCC_ADC12_CLKSRC_PLL_DIV_6 RCC_CFGR2_ADCPRE12_DIV6 /*!< ADC12 PLL clock divided by 6 */ +#define LL_RCC_ADC12_CLKSRC_PLL_DIV_8 RCC_CFGR2_ADCPRE12_DIV8 /*!< ADC12 PLL clock divided by 8 */ +#define LL_RCC_ADC12_CLKSRC_PLL_DIV_10 RCC_CFGR2_ADCPRE12_DIV10 /*!< ADC12 PLL clock divided by 10 */ +#define LL_RCC_ADC12_CLKSRC_PLL_DIV_12 RCC_CFGR2_ADCPRE12_DIV12 /*!< ADC12 PLL clock divided by 12 */ +#define LL_RCC_ADC12_CLKSRC_PLL_DIV_16 RCC_CFGR2_ADCPRE12_DIV16 /*!< ADC12 PLL clock divided by 16 */ +#define LL_RCC_ADC12_CLKSRC_PLL_DIV_32 RCC_CFGR2_ADCPRE12_DIV32 /*!< ADC12 PLL clock divided by 32 */ +#define LL_RCC_ADC12_CLKSRC_PLL_DIV_64 RCC_CFGR2_ADCPRE12_DIV64 /*!< ADC12 PLL clock divided by 64 */ +#define LL_RCC_ADC12_CLKSRC_PLL_DIV_128 RCC_CFGR2_ADCPRE12_DIV128 /*!< ADC12 PLL clock divided by 128 */ +#define LL_RCC_ADC12_CLKSRC_PLL_DIV_256 RCC_CFGR2_ADCPRE12_DIV256 /*!< ADC12 PLL clock divided by 256 */ +/** + * @} + */ + +#endif /* RCC_CFGR2_ADCPRE12 && RCC_CFGR2_ADCPRE34 */ + +#endif /* RCC_CFGR_ADCPRE */ + +#if defined(RCC_CFGR_SDPRE) +/** @defgroup RCC_LL_EC_SDADC_CLKSOURCE_SYSCLK Peripheral SDADC clock source selection + * @{ + */ +#define LL_RCC_SDADC_CLKSRC_SYS_DIV_1 RCC_CFGR_SDPRE_DIV1 /*!< SDADC CLK not divided */ +#define LL_RCC_SDADC_CLKSRC_SYS_DIV_2 RCC_CFGR_SDPRE_DIV2 /*!< SDADC CLK divided by 2 */ +#define LL_RCC_SDADC_CLKSRC_SYS_DIV_4 RCC_CFGR_SDPRE_DIV4 /*!< SDADC CLK divided by 4 */ +#define LL_RCC_SDADC_CLKSRC_SYS_DIV_6 RCC_CFGR_SDPRE_DIV6 /*!< SDADC CLK divided by 6 */ +#define LL_RCC_SDADC_CLKSRC_SYS_DIV_8 RCC_CFGR_SDPRE_DIV8 /*!< SDADC CLK divided by 8 */ +#define LL_RCC_SDADC_CLKSRC_SYS_DIV_10 RCC_CFGR_SDPRE_DIV10 /*!< SDADC CLK divided by 10 */ +#define LL_RCC_SDADC_CLKSRC_SYS_DIV_12 RCC_CFGR_SDPRE_DIV12 /*!< SDADC CLK divided by 12 */ +#define LL_RCC_SDADC_CLKSRC_SYS_DIV_14 RCC_CFGR_SDPRE_DIV14 /*!< SDADC CLK divided by 14 */ +#define LL_RCC_SDADC_CLKSRC_SYS_DIV_16 RCC_CFGR_SDPRE_DIV16 /*!< SDADC CLK divided by 16 */ +#define LL_RCC_SDADC_CLKSRC_SYS_DIV_20 RCC_CFGR_SDPRE_DIV20 /*!< SDADC CLK divided by 20 */ +#define LL_RCC_SDADC_CLKSRC_SYS_DIV_24 RCC_CFGR_SDPRE_DIV24 /*!< SDADC CLK divided by 24 */ +#define LL_RCC_SDADC_CLKSRC_SYS_DIV_28 RCC_CFGR_SDPRE_DIV28 /*!< SDADC CLK divided by 28 */ +#define LL_RCC_SDADC_CLKSRC_SYS_DIV_32 RCC_CFGR_SDPRE_DIV32 /*!< SDADC CLK divided by 32 */ +#define LL_RCC_SDADC_CLKSRC_SYS_DIV_36 RCC_CFGR_SDPRE_DIV36 /*!< SDADC CLK divided by 36 */ +#define LL_RCC_SDADC_CLKSRC_SYS_DIV_40 RCC_CFGR_SDPRE_DIV40 /*!< SDADC CLK divided by 40 */ +#define LL_RCC_SDADC_CLKSRC_SYS_DIV_44 RCC_CFGR_SDPRE_DIV44 /*!< SDADC CLK divided by 44 */ +#define LL_RCC_SDADC_CLKSRC_SYS_DIV_48 RCC_CFGR_SDPRE_DIV48 /*!< SDADC CLK divided by 48 */ +/** + * @} + */ + +#endif /* RCC_CFGR_SDPRE */ + +/** @defgroup RCC_LL_EC_USART Peripheral USART get clock source + * @{ + */ +#define LL_RCC_USART1_CLKSOURCE RCC_POSITION_USART1SW /*!< USART1 Clock source selection */ +#if defined(RCC_CFGR3_USART2SW) +#define LL_RCC_USART2_CLKSOURCE RCC_POSITION_USART2SW /*!< USART2 Clock source selection */ +#endif /* RCC_CFGR3_USART2SW */ +#if defined(RCC_CFGR3_USART3SW) +#define LL_RCC_USART3_CLKSOURCE RCC_POSITION_USART3SW /*!< USART3 Clock source selection */ +#endif /* RCC_CFGR3_USART3SW */ +/** + * @} + */ + +#if defined(RCC_CFGR3_UART4SW) || defined(RCC_CFGR3_UART5SW) +/** @defgroup RCC_LL_EC_UART Peripheral UART get clock source + * @{ + */ +#define LL_RCC_UART4_CLKSOURCE RCC_CFGR3_UART4SW /*!< UART4 Clock source selection */ +#define LL_RCC_UART5_CLKSOURCE RCC_CFGR3_UART5SW /*!< UART5 Clock source selection */ +/** + * @} + */ + +#endif /* RCC_CFGR3_UART4SW || RCC_CFGR3_UART5SW */ + +/** @defgroup RCC_LL_EC_I2C Peripheral I2C get clock source + * @{ + */ +#define LL_RCC_I2C1_CLKSOURCE RCC_CFGR3_I2C1SW /*!< I2C1 Clock source selection */ +#if defined(RCC_CFGR3_I2C2SW) +#define LL_RCC_I2C2_CLKSOURCE RCC_CFGR3_I2C2SW /*!< I2C2 Clock source selection */ +#endif /*RCC_CFGR3_I2C2SW*/ +#if defined(RCC_CFGR3_I2C3SW) +#define LL_RCC_I2C3_CLKSOURCE RCC_CFGR3_I2C3SW /*!< I2C3 Clock source selection */ +#endif /*RCC_CFGR3_I2C3SW*/ +/** + * @} + */ + +#if defined(RCC_CFGR_I2SSRC) +/** @defgroup RCC_LL_EC_I2S Peripheral I2S get clock source + * @{ + */ +#define LL_RCC_I2S_CLKSOURCE RCC_CFGR_I2SSRC /*!< I2S Clock source selection */ +/** + * @} + */ + +#endif /* RCC_CFGR_I2SSRC */ + +#if defined(RCC_CFGR3_TIMSW) +/** @defgroup RCC_LL_EC_TIM TIMx Peripheral TIM get clock source + * @{ + */ +#define LL_RCC_TIM1_CLKSOURCE (RCC_POSITION_TIM1SW - RCC_POSITION_TIM1SW) /*!< TIM1 Clock source selection */ +#if defined(RCC_CFGR3_TIM2SW) +#define LL_RCC_TIM2_CLKSOURCE (RCC_POSITION_TIM2SW - RCC_POSITION_TIM1SW) /*!< TIM2 Clock source selection */ +#endif /*RCC_CFGR3_TIM2SW*/ +#if defined(RCC_CFGR3_TIM8SW) +#define LL_RCC_TIM8_CLKSOURCE (RCC_POSITION_TIM8SW - RCC_POSITION_TIM1SW) /*!< TIM8 Clock source selection */ +#endif /*RCC_CFGR3_TIM8SW*/ +#if defined(RCC_CFGR3_TIM15SW) +#define LL_RCC_TIM15_CLKSOURCE (RCC_POSITION_TIM15SW - RCC_POSITION_TIM1SW) /*!< TIM15 Clock source selection */ +#endif /*RCC_CFGR3_TIM15SW*/ +#if defined(RCC_CFGR3_TIM16SW) +#define LL_RCC_TIM16_CLKSOURCE (RCC_POSITION_TIM16SW - RCC_POSITION_TIM1SW) /*!< TIM16 Clock source selection */ +#endif /*RCC_CFGR3_TIM16SW*/ +#if defined(RCC_CFGR3_TIM17SW) +#define LL_RCC_TIM17_CLKSOURCE (RCC_POSITION_TIM17SW - RCC_POSITION_TIM1SW) /*!< TIM17 Clock source selection */ +#endif /*RCC_CFGR3_TIM17SW*/ +#if defined(RCC_CFGR3_TIM20SW) +#define LL_RCC_TIM20_CLKSOURCE (RCC_POSITION_TIM20SW - RCC_POSITION_TIM1SW) /*!< TIM20 Clock source selection */ +#endif /*RCC_CFGR3_TIM20SW*/ +#if defined(RCC_CFGR3_TIM34SW) +#define LL_RCC_TIM34_CLKSOURCE (RCC_POSITION_TIM34SW - RCC_POSITION_TIM1SW) /*!< TIM3/4 Clock source selection */ +#endif /*RCC_CFGR3_TIM34SW*/ +/** + * @} + */ + +#endif /* RCC_CFGR3_TIMSW */ + +#if defined(HRTIM1) +/** @defgroup RCC_LL_EC_HRTIM1 Peripheral HRTIM1 get clock source + * @{ + */ +#define LL_RCC_HRTIM1_CLKSOURCE RCC_CFGR3_HRTIM1SW /*!< HRTIM1 Clock source selection */ +/** + * @} + */ + +#endif /* HRTIM1 */ + +#if defined(CEC) +/** @defgroup RCC_LL_EC_CEC Peripheral CEC get clock source + * @{ + */ +#define LL_RCC_CEC_CLKSOURCE RCC_CFGR3_CECSW /*!< CEC Clock source selection */ +/** + * @} + */ + +#endif /* CEC */ + +#if defined(USB) +/** @defgroup RCC_LL_EC_USB Peripheral USB get clock source + * @{ + */ +#define LL_RCC_USB_CLKSOURCE RCC_CFGR_USBPRE /*!< USB Clock source selection */ +/** + * @} + */ + +#endif /* USB */ + +#if defined(RCC_CFGR_ADCPRE) +/** @defgroup RCC_LL_EC_ADC Peripheral ADC get clock source + * @{ + */ +#define LL_RCC_ADC_CLKSOURCE RCC_CFGR_ADCPRE /*!< ADC Clock source selection */ +/** + * @} + */ + +#endif /* RCC_CFGR_ADCPRE */ + +#if defined(RCC_CFGR2_ADC1PRES) || defined(RCC_CFGR2_ADCPRE12) || defined(RCC_CFGR2_ADCPRE34) +/** @defgroup RCC_LL_EC_ADCXX Peripheral ADC get clock source + * @{ + */ +#if defined(RCC_CFGR2_ADC1PRES) +#define LL_RCC_ADC1_CLKSOURCE RCC_CFGR2_ADC1PRES /*!< ADC1 Clock source selection */ +#else +#define LL_RCC_ADC12_CLKSOURCE RCC_CFGR2_ADCPRE12 /*!< ADC12 Clock source selection */ +#if defined(RCC_CFGR2_ADCPRE34) +#define LL_RCC_ADC34_CLKSOURCE RCC_CFGR2_ADCPRE34 /*!< ADC34 Clock source selection */ +#endif /*RCC_CFGR2_ADCPRE34*/ +#endif /*RCC_CFGR2_ADC1PRES*/ +/** + * @} + */ + +#endif /* RCC_CFGR2_ADC1PRES || RCC_CFGR2_ADCPRE12 || RCC_CFGR2_ADCPRE34 */ + +#if defined(RCC_CFGR_SDPRE) +/** @defgroup RCC_LL_EC_SDADC Peripheral SDADC get clock source + * @{ + */ +#define LL_RCC_SDADC_CLKSOURCE RCC_CFGR_SDPRE /*!< SDADC Clock source selection */ +/** + * @} + */ + +#endif /* RCC_CFGR_SDPRE */ + + +/** @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_DIV32 RCC_BDCR_RTCSEL /*!< HSE oscillator clock divided by 32 used as RTC clock */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_PLL_MUL PLL Multiplicator factor + * @{ + */ +#define LL_RCC_PLL_MUL_2 RCC_CFGR_PLLMUL2 /*!< PLL input clock*2 */ +#define LL_RCC_PLL_MUL_3 RCC_CFGR_PLLMUL3 /*!< PLL input clock*3 */ +#define LL_RCC_PLL_MUL_4 RCC_CFGR_PLLMUL4 /*!< PLL input clock*4 */ +#define LL_RCC_PLL_MUL_5 RCC_CFGR_PLLMUL5 /*!< PLL input clock*5 */ +#define LL_RCC_PLL_MUL_6 RCC_CFGR_PLLMUL6 /*!< PLL input clock*6 */ +#define LL_RCC_PLL_MUL_7 RCC_CFGR_PLLMUL7 /*!< PLL input clock*7 */ +#define LL_RCC_PLL_MUL_8 RCC_CFGR_PLLMUL8 /*!< PLL input clock*8 */ +#define LL_RCC_PLL_MUL_9 RCC_CFGR_PLLMUL9 /*!< PLL input clock*9 */ +#define LL_RCC_PLL_MUL_10 RCC_CFGR_PLLMUL10 /*!< PLL input clock*10 */ +#define LL_RCC_PLL_MUL_11 RCC_CFGR_PLLMUL11 /*!< PLL input clock*11 */ +#define LL_RCC_PLL_MUL_12 RCC_CFGR_PLLMUL12 /*!< PLL input clock*12 */ +#define LL_RCC_PLL_MUL_13 RCC_CFGR_PLLMUL13 /*!< PLL input clock*13 */ +#define LL_RCC_PLL_MUL_14 RCC_CFGR_PLLMUL14 /*!< PLL input clock*14 */ +#define LL_RCC_PLL_MUL_15 RCC_CFGR_PLLMUL15 /*!< PLL input clock*15 */ +#define LL_RCC_PLL_MUL_16 RCC_CFGR_PLLMUL16 /*!< PLL input clock*16 */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_PLLSOURCE PLL SOURCE + * @{ + */ +#define LL_RCC_PLLSOURCE_NONE 0x00000000U /*!< No clock selected as main PLL entry clock source */ +#define LL_RCC_PLLSOURCE_HSE RCC_CFGR_PLLSRC_HSE_PREDIV /*!< HSE/PREDIV clock selected as PLL entry clock source */ +#if defined(RCC_PLLSRC_PREDIV1_SUPPORT) +#define LL_RCC_PLLSOURCE_HSI RCC_CFGR_PLLSRC_HSI_PREDIV /*!< HSI/PREDIV clock selected as PLL entry clock source */ +#else +#define LL_RCC_PLLSOURCE_HSI_DIV_2 RCC_CFGR_PLLSRC_HSI_DIV2 /*!< HSI clock divided by 2 selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_HSE_DIV_1 (RCC_CFGR_PLLSRC_HSE_PREDIV | RCC_CFGR2_PREDIV_DIV1) /*!< HSE clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_HSE_DIV_2 (RCC_CFGR_PLLSRC_HSE_PREDIV | RCC_CFGR2_PREDIV_DIV2) /*!< HSE/2 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_HSE_DIV_3 (RCC_CFGR_PLLSRC_HSE_PREDIV | RCC_CFGR2_PREDIV_DIV3) /*!< HSE/3 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_HSE_DIV_4 (RCC_CFGR_PLLSRC_HSE_PREDIV | RCC_CFGR2_PREDIV_DIV4) /*!< HSE/4 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_HSE_DIV_5 (RCC_CFGR_PLLSRC_HSE_PREDIV | RCC_CFGR2_PREDIV_DIV5) /*!< HSE/5 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_HSE_DIV_6 (RCC_CFGR_PLLSRC_HSE_PREDIV | RCC_CFGR2_PREDIV_DIV6) /*!< HSE/6 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_HSE_DIV_7 (RCC_CFGR_PLLSRC_HSE_PREDIV | RCC_CFGR2_PREDIV_DIV7) /*!< HSE/7 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_HSE_DIV_8 (RCC_CFGR_PLLSRC_HSE_PREDIV | RCC_CFGR2_PREDIV_DIV8) /*!< HSE/8 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_HSE_DIV_9 (RCC_CFGR_PLLSRC_HSE_PREDIV | RCC_CFGR2_PREDIV_DIV9) /*!< HSE/9 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_HSE_DIV_10 (RCC_CFGR_PLLSRC_HSE_PREDIV | RCC_CFGR2_PREDIV_DIV10) /*!< HSE/10 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_HSE_DIV_11 (RCC_CFGR_PLLSRC_HSE_PREDIV | RCC_CFGR2_PREDIV_DIV11) /*!< HSE/11 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_HSE_DIV_12 (RCC_CFGR_PLLSRC_HSE_PREDIV | RCC_CFGR2_PREDIV_DIV12) /*!< HSE/12 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_HSE_DIV_13 (RCC_CFGR_PLLSRC_HSE_PREDIV | RCC_CFGR2_PREDIV_DIV13) /*!< HSE/13 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_HSE_DIV_14 (RCC_CFGR_PLLSRC_HSE_PREDIV | RCC_CFGR2_PREDIV_DIV14) /*!< HSE/14 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_HSE_DIV_15 (RCC_CFGR_PLLSRC_HSE_PREDIV | RCC_CFGR2_PREDIV_DIV15) /*!< HSE/15 clock selected as PLL entry clock source */ +#define LL_RCC_PLLSOURCE_HSE_DIV_16 (RCC_CFGR_PLLSRC_HSE_PREDIV | RCC_CFGR2_PREDIV_DIV16) /*!< HSE/16 clock selected as PLL entry clock source */ +#endif /* RCC_PLLSRC_PREDIV1_SUPPORT */ +/** + * @} + */ + +/** @defgroup RCC_LL_EC_PREDIV_DIV PREDIV Division factor + * @{ + */ +#define LL_RCC_PREDIV_DIV_1 RCC_CFGR2_PREDIV_DIV1 /*!< PREDIV input clock not divided */ +#define LL_RCC_PREDIV_DIV_2 RCC_CFGR2_PREDIV_DIV2 /*!< PREDIV input clock divided by 2 */ +#define LL_RCC_PREDIV_DIV_3 RCC_CFGR2_PREDIV_DIV3 /*!< PREDIV input clock divided by 3 */ +#define LL_RCC_PREDIV_DIV_4 RCC_CFGR2_PREDIV_DIV4 /*!< PREDIV input clock divided by 4 */ +#define LL_RCC_PREDIV_DIV_5 RCC_CFGR2_PREDIV_DIV5 /*!< PREDIV input clock divided by 5 */ +#define LL_RCC_PREDIV_DIV_6 RCC_CFGR2_PREDIV_DIV6 /*!< PREDIV input clock divided by 6 */ +#define LL_RCC_PREDIV_DIV_7 RCC_CFGR2_PREDIV_DIV7 /*!< PREDIV input clock divided by 7 */ +#define LL_RCC_PREDIV_DIV_8 RCC_CFGR2_PREDIV_DIV8 /*!< PREDIV input clock divided by 8 */ +#define LL_RCC_PREDIV_DIV_9 RCC_CFGR2_PREDIV_DIV9 /*!< PREDIV input clock divided by 9 */ +#define LL_RCC_PREDIV_DIV_10 RCC_CFGR2_PREDIV_DIV10 /*!< PREDIV input clock divided by 10 */ +#define LL_RCC_PREDIV_DIV_11 RCC_CFGR2_PREDIV_DIV11 /*!< PREDIV input clock divided by 11 */ +#define LL_RCC_PREDIV_DIV_12 RCC_CFGR2_PREDIV_DIV12 /*!< PREDIV input clock divided by 12 */ +#define LL_RCC_PREDIV_DIV_13 RCC_CFGR2_PREDIV_DIV13 /*!< PREDIV input clock divided by 13 */ +#define LL_RCC_PREDIV_DIV_14 RCC_CFGR2_PREDIV_DIV14 /*!< PREDIV input clock divided by 14 */ +#define LL_RCC_PREDIV_DIV_15 RCC_CFGR2_PREDIV_DIV15 /*!< PREDIV input clock divided by 15 */ +#define LL_RCC_PREDIV_DIV_16 RCC_CFGR2_PREDIV_DIV16 /*!< PREDIV input clock divided by 16 */ +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ +/** @defgroup RCC_LL_Exported_Macros RCC Exported Macros + * @{ + */ + +/** @defgroup RCC_LL_EM_WRITE_READ Common Write and read registers Macros + * @{ + */ + +/** + * @brief Write a value in RCC register + * @param __REG__ Register to be written + * @param __VALUE__ Value to be written in the register + * @retval None + */ +#define LL_RCC_WriteReg(__REG__, __VALUE__) WRITE_REG(RCC->__REG__, (__VALUE__)) + +/** + * @brief Read a value in RCC register + * @param __REG__ Register to be read + * @retval Register value + */ +#define LL_RCC_ReadReg(__REG__) READ_REG(RCC->__REG__) +/** + * @} + */ + +/** @defgroup RCC_LL_EM_CALC_FREQ Calculate frequencies + * @{ + */ + +#if defined(RCC_PLLSRC_PREDIV1_SUPPORT) +/** + * @brief Helper macro to calculate the PLLCLK frequency + * @note ex: @ref __LL_RCC_CALC_PLLCLK_FREQ (HSE_VALUE, @ref LL_RCC_PLL_GetMultiplicator() + * , @ref LL_RCC_PLL_GetPrediv()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE/HSI) + * @param __PLLMUL__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLL_MUL_2 + * @arg @ref LL_RCC_PLL_MUL_3 + * @arg @ref LL_RCC_PLL_MUL_4 + * @arg @ref LL_RCC_PLL_MUL_5 + * @arg @ref LL_RCC_PLL_MUL_6 + * @arg @ref LL_RCC_PLL_MUL_7 + * @arg @ref LL_RCC_PLL_MUL_8 + * @arg @ref LL_RCC_PLL_MUL_9 + * @arg @ref LL_RCC_PLL_MUL_10 + * @arg @ref LL_RCC_PLL_MUL_11 + * @arg @ref LL_RCC_PLL_MUL_12 + * @arg @ref LL_RCC_PLL_MUL_13 + * @arg @ref LL_RCC_PLL_MUL_14 + * @arg @ref LL_RCC_PLL_MUL_15 + * @arg @ref LL_RCC_PLL_MUL_16 + * @param __PLLPREDIV__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PREDIV_DIV_1 + * @arg @ref LL_RCC_PREDIV_DIV_2 + * @arg @ref LL_RCC_PREDIV_DIV_3 + * @arg @ref LL_RCC_PREDIV_DIV_4 + * @arg @ref LL_RCC_PREDIV_DIV_5 + * @arg @ref LL_RCC_PREDIV_DIV_6 + * @arg @ref LL_RCC_PREDIV_DIV_7 + * @arg @ref LL_RCC_PREDIV_DIV_8 + * @arg @ref LL_RCC_PREDIV_DIV_9 + * @arg @ref LL_RCC_PREDIV_DIV_10 + * @arg @ref LL_RCC_PREDIV_DIV_11 + * @arg @ref LL_RCC_PREDIV_DIV_12 + * @arg @ref LL_RCC_PREDIV_DIV_13 + * @arg @ref LL_RCC_PREDIV_DIV_14 + * @arg @ref LL_RCC_PREDIV_DIV_15 + * @arg @ref LL_RCC_PREDIV_DIV_16 + * @retval PLL clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PLLCLK_FREQ(__INPUTFREQ__, __PLLMUL__, __PLLPREDIV__) \ + (((__INPUTFREQ__) / ((((__PLLPREDIV__) & RCC_CFGR2_PREDIV) + 1U))) * ((((__PLLMUL__) & RCC_CFGR_PLLMUL) >> RCC_POSITION_PLLMUL) + 2U)) + +#else +/** + * @brief Helper macro to calculate the PLLCLK frequency + * @note ex: @ref __LL_RCC_CALC_PLLCLK_FREQ (HSE_VALUE / (@ref LL_RCC_PLL_GetPrediv () + 1), @ref LL_RCC_PLL_GetMultiplicator()); + * @param __INPUTFREQ__ PLL Input frequency (based on HSE div Prediv / HSI div 2) + * @param __PLLMUL__ This parameter can be one of the following values: + * @arg @ref LL_RCC_PLL_MUL_2 + * @arg @ref LL_RCC_PLL_MUL_3 + * @arg @ref LL_RCC_PLL_MUL_4 + * @arg @ref LL_RCC_PLL_MUL_5 + * @arg @ref LL_RCC_PLL_MUL_6 + * @arg @ref LL_RCC_PLL_MUL_7 + * @arg @ref LL_RCC_PLL_MUL_8 + * @arg @ref LL_RCC_PLL_MUL_9 + * @arg @ref LL_RCC_PLL_MUL_10 + * @arg @ref LL_RCC_PLL_MUL_11 + * @arg @ref LL_RCC_PLL_MUL_12 + * @arg @ref LL_RCC_PLL_MUL_13 + * @arg @ref LL_RCC_PLL_MUL_14 + * @arg @ref LL_RCC_PLL_MUL_15 + * @arg @ref LL_RCC_PLL_MUL_16 + * @retval PLL clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PLLCLK_FREQ(__INPUTFREQ__, __PLLMUL__) \ + ((__INPUTFREQ__) * ((((__PLLMUL__) & RCC_CFGR_PLLMUL) >> RCC_POSITION_PLLMUL) + 2U)) +#endif /* RCC_PLLSRC_PREDIV1_SUPPORT */ +/** + * @brief Helper macro to calculate the HCLK frequency + * @note: __AHBPRESCALER__ be retrieved by @ref LL_RCC_GetAHBPrescaler + * ex: __LL_RCC_CALC_HCLK_FREQ(LL_RCC_GetAHBPrescaler()) + * @param __SYSCLKFREQ__ SYSCLK frequency (based on HSE/HSI/PLLCLK) + * @param __AHBPRESCALER__ This parameter can be one of the following values: + * @arg @ref LL_RCC_SYSCLK_DIV_1 + * @arg @ref LL_RCC_SYSCLK_DIV_2 + * @arg @ref LL_RCC_SYSCLK_DIV_4 + * @arg @ref LL_RCC_SYSCLK_DIV_8 + * @arg @ref LL_RCC_SYSCLK_DIV_16 + * @arg @ref LL_RCC_SYSCLK_DIV_64 + * @arg @ref LL_RCC_SYSCLK_DIV_128 + * @arg @ref LL_RCC_SYSCLK_DIV_256 + * @arg @ref LL_RCC_SYSCLK_DIV_512 + * @retval HCLK clock frequency (in Hz) + */ +#define __LL_RCC_CALC_HCLK_FREQ(__SYSCLKFREQ__, __AHBPRESCALER__) ((__SYSCLKFREQ__) >> AHBPrescTable[((__AHBPRESCALER__) & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos]) + +/** + * @brief Helper macro to calculate the PCLK1 frequency (ABP1) + * @note: __APB1PRESCALER__ be retrieved by @ref LL_RCC_GetAPB1Prescaler + * ex: __LL_RCC_CALC_PCLK1_FREQ(LL_RCC_GetAPB1Prescaler()) + * @param __HCLKFREQ__ HCLK frequency + * @param __APB1PRESCALER__: This parameter can be one of the following values: + * @arg @ref LL_RCC_APB1_DIV_1 + * @arg @ref LL_RCC_APB1_DIV_2 + * @arg @ref LL_RCC_APB1_DIV_4 + * @arg @ref LL_RCC_APB1_DIV_8 + * @arg @ref LL_RCC_APB1_DIV_16 + * @retval PCLK1 clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PCLK1_FREQ(__HCLKFREQ__, __APB1PRESCALER__) ((__HCLKFREQ__) >> APBPrescTable[(__APB1PRESCALER__) >> RCC_CFGR_PPRE1_Pos]) + +/** + * @brief Helper macro to calculate the PCLK2 frequency (ABP2) + * @note: __APB2PRESCALER__ be retrieved by @ref LL_RCC_GetAPB2Prescaler + * ex: __LL_RCC_CALC_PCLK2_FREQ(LL_RCC_GetAPB2Prescaler()) + * @param __HCLKFREQ__ HCLK frequency + * @param __APB2PRESCALER__: This parameter can be one of the following values: + * @arg @ref LL_RCC_APB2_DIV_1 + * @arg @ref LL_RCC_APB2_DIV_2 + * @arg @ref LL_RCC_APB2_DIV_4 + * @arg @ref LL_RCC_APB2_DIV_8 + * @arg @ref LL_RCC_APB2_DIV_16 + * @retval PCLK2 clock frequency (in Hz) + */ +#define __LL_RCC_CALC_PCLK2_FREQ(__HCLKFREQ__, __APB2PRESCALER__) ((__HCLKFREQ__) >> APBPrescTable[(__APB2PRESCALER__) >> RCC_CFGR_PPRE2_Pos]) + +/** + * @} + */ + +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup RCC_LL_Exported_Functions RCC Exported Functions + * @{ + */ + +/** @defgroup RCC_LL_EF_HSE HSE + * @{ + */ + +/** + * @brief Enable the Clock Security System. + * @rmtoll CR CSSON LL_RCC_HSE_EnableCSS + * @retval None + */ +__STATIC_INLINE void LL_RCC_HSE_EnableCSS(void) +{ + SET_BIT(RCC->CR, RCC_CR_CSSON); +} + +/** + * @brief Disable the Clock Security System. + * @note Cannot be disabled in HSE is ready (only by hardware) + * @rmtoll CR CSSON LL_RCC_HSE_DisableCSS + * @retval None + */ +__STATIC_INLINE void LL_RCC_HSE_DisableCSS(void) +{ + CLEAR_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 = 0x00 and Max_Data = 0x1F + * @retval None + */ +__STATIC_INLINE void LL_RCC_HSI_SetCalibTrimming(uint32_t Value) +{ + MODIFY_REG(RCC->CR, RCC_CR_HSITRIM, Value << RCC_CR_HSITRIM_Pos); +} + +/** + * @brief Get HSI Calibration trimming + * @rmtoll CR HSITRIM LL_RCC_HSI_GetCalibTrimming + * @retval Between Min_Data = 0x00 and Max_Data = 0x1F + */ +__STATIC_INLINE uint32_t LL_RCC_HSI_GetCalibTrimming(void) +{ + return (uint32_t)(READ_BIT(RCC->CR, RCC_CR_HSITRIM) >> RCC_CR_HSITRIM_Pos); +} + +/** + * @} + */ + +/** @defgroup RCC_LL_EF_LSE LSE + * @{ + */ + +/** + * @brief Enable Low Speed External (LSE) crystal. + * @rmtoll BDCR LSEON LL_RCC_LSE_Enable + * @retval None + */ +__STATIC_INLINE void LL_RCC_LSE_Enable(void) +{ + SET_BIT(RCC->BDCR, RCC_BDCR_LSEON); +} + +/** + * @brief Disable Low Speed External (LSE) crystal. + * @rmtoll BDCR LSEON LL_RCC_LSE_Disable + * @retval None + */ +__STATIC_INLINE void LL_RCC_LSE_Disable(void) +{ + CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEON); +} + +/** + * @brief Enable external clock source (LSE bypass). + * @rmtoll BDCR LSEBYP LL_RCC_LSE_EnableBypass + * @retval None + */ +__STATIC_INLINE void LL_RCC_LSE_EnableBypass(void) +{ + SET_BIT(RCC->BDCR, RCC_BDCR_LSEBYP); +} + +/** + * @brief Disable external clock source (LSE bypass). + * @rmtoll BDCR LSEBYP LL_RCC_LSE_DisableBypass + * @retval None + */ +__STATIC_INLINE void LL_RCC_LSE_DisableBypass(void) +{ + CLEAR_BIT(RCC->BDCR, RCC_BDCR_LSEBYP); +} + +/** + * @brief Set LSE oscillator drive capability + * @note The oscillator is in Xtal mode when it is not in bypass mode. + * @rmtoll BDCR LSEDRV LL_RCC_LSE_SetDriveCapability + * @param LSEDrive This parameter can be one of the following values: + * @arg @ref LL_RCC_LSEDRIVE_LOW + * @arg @ref LL_RCC_LSEDRIVE_MEDIUMLOW + * @arg @ref LL_RCC_LSEDRIVE_MEDIUMHIGH + * @arg @ref LL_RCC_LSEDRIVE_HIGH + * @retval None + */ +__STATIC_INLINE void LL_RCC_LSE_SetDriveCapability(uint32_t LSEDrive) +{ + MODIFY_REG(RCC->BDCR, RCC_BDCR_LSEDRV, LSEDrive); +} + +/** + * @brief Get LSE oscillator drive capability + * @rmtoll BDCR LSEDRV LL_RCC_LSE_GetDriveCapability + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_LSEDRIVE_LOW + * @arg @ref LL_RCC_LSEDRIVE_MEDIUMLOW + * @arg @ref LL_RCC_LSEDRIVE_MEDIUMHIGH + * @arg @ref LL_RCC_LSEDRIVE_HIGH + */ +__STATIC_INLINE uint32_t LL_RCC_LSE_GetDriveCapability(void) +{ + return (uint32_t)(READ_BIT(RCC->BDCR, RCC_BDCR_LSEDRV)); +} + +/** + * @brief Check if LSE oscillator Ready + * @rmtoll BDCR LSERDY LL_RCC_LSE_IsReady + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_LSE_IsReady(void) +{ + return (READ_BIT(RCC->BDCR, RCC_BDCR_LSERDY) == (RCC_BDCR_LSERDY)); +} + +/** + * @} + */ + +/** @defgroup RCC_LL_EF_LSI LSI + * @{ + */ + +/** + * @brief Enable LSI Oscillator + * @rmtoll CSR LSION LL_RCC_LSI_Enable + * @retval None + */ +__STATIC_INLINE void LL_RCC_LSI_Enable(void) +{ + SET_BIT(RCC->CSR, RCC_CSR_LSION); +} + +/** + * @brief Disable LSI Oscillator + * @rmtoll CSR LSION LL_RCC_LSI_Disable + * @retval None + */ +__STATIC_INLINE void LL_RCC_LSI_Disable(void) +{ + CLEAR_BIT(RCC->CSR, RCC_CSR_LSION); +} + +/** + * @brief Check if LSI is Ready + * @rmtoll CSR LSIRDY LL_RCC_LSI_IsReady + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_LSI_IsReady(void) +{ + return (READ_BIT(RCC->CSR, RCC_CSR_LSIRDY) == (RCC_CSR_LSIRDY)); +} + +/** + * @} + */ + +/** @defgroup RCC_LL_EF_System System + * @{ + */ + +/** + * @brief Configure the system clock source + * @rmtoll CFGR SW LL_RCC_SetSysClkSource + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_SYS_CLKSOURCE_HSI + * @arg @ref LL_RCC_SYS_CLKSOURCE_HSE + * @arg @ref LL_RCC_SYS_CLKSOURCE_PLL + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetSysClkSource(uint32_t Source) +{ + MODIFY_REG(RCC->CFGR, RCC_CFGR_SW, Source); +} + +/** + * @brief Get the system clock source + * @rmtoll CFGR SWS LL_RCC_GetSysClkSource + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_SYS_CLKSOURCE_STATUS_HSI + * @arg @ref LL_RCC_SYS_CLKSOURCE_STATUS_HSE + * @arg @ref LL_RCC_SYS_CLKSOURCE_STATUS_PLL + */ +__STATIC_INLINE uint32_t LL_RCC_GetSysClkSource(void) +{ + return (uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_SWS)); +} + +/** + * @brief Set AHB prescaler + * @rmtoll CFGR HPRE LL_RCC_SetAHBPrescaler + * @param Prescaler This parameter can be one of the following values: + * @arg @ref LL_RCC_SYSCLK_DIV_1 + * @arg @ref LL_RCC_SYSCLK_DIV_2 + * @arg @ref LL_RCC_SYSCLK_DIV_4 + * @arg @ref LL_RCC_SYSCLK_DIV_8 + * @arg @ref LL_RCC_SYSCLK_DIV_16 + * @arg @ref LL_RCC_SYSCLK_DIV_64 + * @arg @ref LL_RCC_SYSCLK_DIV_128 + * @arg @ref LL_RCC_SYSCLK_DIV_256 + * @arg @ref LL_RCC_SYSCLK_DIV_512 + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetAHBPrescaler(uint32_t Prescaler) +{ + MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, Prescaler); +} + +/** + * @brief Set APB1 prescaler + * @rmtoll CFGR PPRE1 LL_RCC_SetAPB1Prescaler + * @param Prescaler This parameter can be one of the following values: + * @arg @ref LL_RCC_APB1_DIV_1 + * @arg @ref LL_RCC_APB1_DIV_2 + * @arg @ref LL_RCC_APB1_DIV_4 + * @arg @ref LL_RCC_APB1_DIV_8 + * @arg @ref LL_RCC_APB1_DIV_16 + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetAPB1Prescaler(uint32_t Prescaler) +{ + MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, Prescaler); +} + +/** + * @brief Set APB2 prescaler + * @rmtoll CFGR PPRE2 LL_RCC_SetAPB2Prescaler + * @param Prescaler This parameter can be one of the following values: + * @arg @ref LL_RCC_APB2_DIV_1 + * @arg @ref LL_RCC_APB2_DIV_2 + * @arg @ref LL_RCC_APB2_DIV_4 + * @arg @ref LL_RCC_APB2_DIV_8 + * @arg @ref LL_RCC_APB2_DIV_16 + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetAPB2Prescaler(uint32_t Prescaler) +{ + MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, Prescaler); +} + +/** + * @brief Get AHB prescaler + * @rmtoll CFGR HPRE LL_RCC_GetAHBPrescaler + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_SYSCLK_DIV_1 + * @arg @ref LL_RCC_SYSCLK_DIV_2 + * @arg @ref LL_RCC_SYSCLK_DIV_4 + * @arg @ref LL_RCC_SYSCLK_DIV_8 + * @arg @ref LL_RCC_SYSCLK_DIV_16 + * @arg @ref LL_RCC_SYSCLK_DIV_64 + * @arg @ref LL_RCC_SYSCLK_DIV_128 + * @arg @ref LL_RCC_SYSCLK_DIV_256 + * @arg @ref LL_RCC_SYSCLK_DIV_512 + */ +__STATIC_INLINE uint32_t LL_RCC_GetAHBPrescaler(void) +{ + return (uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_HPRE)); +} + +/** + * @brief Get APB1 prescaler + * @rmtoll CFGR PPRE1 LL_RCC_GetAPB1Prescaler + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_APB1_DIV_1 + * @arg @ref LL_RCC_APB1_DIV_2 + * @arg @ref LL_RCC_APB1_DIV_4 + * @arg @ref LL_RCC_APB1_DIV_8 + * @arg @ref LL_RCC_APB1_DIV_16 + */ +__STATIC_INLINE uint32_t LL_RCC_GetAPB1Prescaler(void) +{ + return (uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_PPRE1)); +} + +/** + * @brief Get APB2 prescaler + * @rmtoll CFGR PPRE2 LL_RCC_GetAPB2Prescaler + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_APB2_DIV_1 + * @arg @ref LL_RCC_APB2_DIV_2 + * @arg @ref LL_RCC_APB2_DIV_4 + * @arg @ref LL_RCC_APB2_DIV_8 + * @arg @ref LL_RCC_APB2_DIV_16 + */ +__STATIC_INLINE uint32_t LL_RCC_GetAPB2Prescaler(void) +{ + return (uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_PPRE2)); +} + +/** + * @} + */ + +/** @defgroup RCC_LL_EF_MCO MCO + * @{ + */ + +/** + * @brief Configure MCOx + * @rmtoll CFGR MCO LL_RCC_ConfigMCO\n + * CFGR MCOPRE LL_RCC_ConfigMCO\n + * CFGR PLLNODIV LL_RCC_ConfigMCO + * @param MCOxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_MCO1SOURCE_NOCLOCK + * @arg @ref LL_RCC_MCO1SOURCE_SYSCLK + * @arg @ref LL_RCC_MCO1SOURCE_HSI + * @arg @ref LL_RCC_MCO1SOURCE_HSE + * @arg @ref LL_RCC_MCO1SOURCE_LSI + * @arg @ref LL_RCC_MCO1SOURCE_LSE + * @arg @ref LL_RCC_MCO1SOURCE_PLLCLK (*) + * @arg @ref LL_RCC_MCO1SOURCE_PLLCLK_DIV_2 + * + * (*) value not defined in all devices + * @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_4 (*) + * @arg @ref LL_RCC_MCO1_DIV_8 (*) + * @arg @ref LL_RCC_MCO1_DIV_16 (*) + * @arg @ref LL_RCC_MCO1_DIV_32 (*) + * @arg @ref LL_RCC_MCO1_DIV_64 (*) + * @arg @ref LL_RCC_MCO1_DIV_128 (*) + * + * (*) value not defined in all devices + * @retval None + */ +__STATIC_INLINE void LL_RCC_ConfigMCO(uint32_t MCOxSource, uint32_t MCOxPrescaler) +{ +#if defined(RCC_CFGR_MCOPRE) +#if defined(RCC_CFGR_PLLNODIV) + MODIFY_REG(RCC->CFGR, RCC_CFGR_MCOSEL | RCC_CFGR_MCOPRE | RCC_CFGR_PLLNODIV, MCOxSource | MCOxPrescaler); +#else + MODIFY_REG(RCC->CFGR, RCC_CFGR_MCOSEL | RCC_CFGR_MCOPRE, MCOxSource | MCOxPrescaler); +#endif /* RCC_CFGR_PLLNODIV */ +#else + MODIFY_REG(RCC->CFGR, RCC_CFGR_MCOSEL, MCOxSource); +#endif /* RCC_CFGR_MCOPRE */ +} + +/** + * @} + */ + +/** @defgroup RCC_LL_EF_Peripheral_Clock_Source Peripheral Clock Source + * @{ + */ + +/** + * @brief Configure USARTx clock source + * @rmtoll CFGR3 USART1SW LL_RCC_SetUSARTClockSource\n + * CFGR3 USART2SW LL_RCC_SetUSARTClockSource\n + * CFGR3 USART3SW LL_RCC_SetUSARTClockSource + * @param USARTxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_USART1_CLKSOURCE_PCLK1 (*) + * @arg @ref LL_RCC_USART1_CLKSOURCE_PCLK2 (*) + * @arg @ref LL_RCC_USART1_CLKSOURCE_SYSCLK + * @arg @ref LL_RCC_USART1_CLKSOURCE_LSE + * @arg @ref LL_RCC_USART1_CLKSOURCE_HSI + * @arg @ref LL_RCC_USART2_CLKSOURCE_PCLK1 (*) + * @arg @ref LL_RCC_USART2_CLKSOURCE_SYSCLK (*) + * @arg @ref LL_RCC_USART2_CLKSOURCE_LSE (*) + * @arg @ref LL_RCC_USART2_CLKSOURCE_HSI (*) + * @arg @ref LL_RCC_USART3_CLKSOURCE_PCLK1 (*) + * @arg @ref LL_RCC_USART3_CLKSOURCE_SYSCLK (*) + * @arg @ref LL_RCC_USART3_CLKSOURCE_LSE (*) + * @arg @ref LL_RCC_USART3_CLKSOURCE_HSI (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetUSARTClockSource(uint32_t USARTxSource) +{ + MODIFY_REG(RCC->CFGR3, (RCC_CFGR3_USART1SW << ((USARTxSource & 0xFF000000U) >> 24U)), (USARTxSource & 0x00FFFFFFU)); +} + +#if defined(RCC_CFGR3_UART4SW) || defined(RCC_CFGR3_UART5SW) +/** + * @brief Configure UARTx clock source + * @rmtoll CFGR3 UART4SW LL_RCC_SetUARTClockSource\n + * CFGR3 UART5SW LL_RCC_SetUARTClockSource + * @param UARTxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_UART4_CLKSOURCE_PCLK1 + * @arg @ref LL_RCC_UART4_CLKSOURCE_SYSCLK + * @arg @ref LL_RCC_UART4_CLKSOURCE_LSE + * @arg @ref LL_RCC_UART4_CLKSOURCE_HSI + * @arg @ref LL_RCC_UART5_CLKSOURCE_PCLK1 + * @arg @ref LL_RCC_UART5_CLKSOURCE_SYSCLK + * @arg @ref LL_RCC_UART5_CLKSOURCE_LSE + * @arg @ref LL_RCC_UART5_CLKSOURCE_HSI + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetUARTClockSource(uint32_t UARTxSource) +{ + MODIFY_REG(RCC->CFGR3, ((UARTxSource & 0x0000FFFFU) << 8U), (UARTxSource & (RCC_CFGR3_UART4SW | RCC_CFGR3_UART5SW))); +} +#endif /* RCC_CFGR3_UART4SW || RCC_CFGR3_UART5SW */ + +/** + * @brief Configure I2Cx clock source + * @rmtoll CFGR3 I2C1SW LL_RCC_SetI2CClockSource\n + * CFGR3 I2C2SW LL_RCC_SetI2CClockSource\n + * CFGR3 I2C3SW LL_RCC_SetI2CClockSource + * @param I2CxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_I2C1_CLKSOURCE_HSI + * @arg @ref LL_RCC_I2C1_CLKSOURCE_SYSCLK + * @arg @ref LL_RCC_I2C2_CLKSOURCE_HSI (*) + * @arg @ref LL_RCC_I2C2_CLKSOURCE_SYSCLK (*) + * @arg @ref LL_RCC_I2C3_CLKSOURCE_HSI (*) + * @arg @ref LL_RCC_I2C3_CLKSOURCE_SYSCLK (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetI2CClockSource(uint32_t I2CxSource) +{ + MODIFY_REG(RCC->CFGR3, ((I2CxSource & 0xFF000000U) >> 24U), (I2CxSource & 0x00FFFFFFU)); +} + +#if defined(RCC_CFGR_I2SSRC) +/** + * @brief Configure I2Sx clock source + * @rmtoll CFGR I2SSRC LL_RCC_SetI2SClockSource + * @param I2SxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_I2S_CLKSOURCE_SYSCLK + * @arg @ref LL_RCC_I2S_CLKSOURCE_PIN + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetI2SClockSource(uint32_t I2SxSource) +{ + MODIFY_REG(RCC->CFGR, RCC_CFGR_I2SSRC, I2SxSource); +} +#endif /* RCC_CFGR_I2SSRC */ + +#if defined(RCC_CFGR3_TIMSW) +/** + * @brief Configure TIMx clock source + * @rmtoll CFGR3 TIM1SW LL_RCC_SetTIMClockSource\n + * CFGR3 TIM8SW LL_RCC_SetTIMClockSource\n + * CFGR3 TIM15SW LL_RCC_SetTIMClockSource\n + * CFGR3 TIM16SW LL_RCC_SetTIMClockSource\n + * CFGR3 TIM17SW LL_RCC_SetTIMClockSource\n + * CFGR3 TIM20SW LL_RCC_SetTIMClockSource\n + * CFGR3 TIM2SW LL_RCC_SetTIMClockSource\n + * CFGR3 TIM34SW LL_RCC_SetTIMClockSource + * @param TIMxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_TIM1_CLKSOURCE_PCLK2 + * @arg @ref LL_RCC_TIM1_CLKSOURCE_PLL + * @arg @ref LL_RCC_TIM8_CLKSOURCE_PCLK2 (*) + * @arg @ref LL_RCC_TIM8_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_TIM15_CLKSOURCE_PCLK2 (*) + * @arg @ref LL_RCC_TIM15_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_TIM16_CLKSOURCE_PCLK2 (*) + * @arg @ref LL_RCC_TIM16_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_TIM17_CLKSOURCE_PCLK2 (*) + * @arg @ref LL_RCC_TIM17_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_TIM20_CLKSOURCE_PCLK2 (*) + * @arg @ref LL_RCC_TIM20_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_TIM2_CLKSOURCE_PCLK1 (*) + * @arg @ref LL_RCC_TIM2_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_TIM34_CLKSOURCE_PCLK1 (*) + * @arg @ref LL_RCC_TIM34_CLKSOURCE_PLL (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetTIMClockSource(uint32_t TIMxSource) +{ + MODIFY_REG(RCC->CFGR3, (RCC_CFGR3_TIM1SW << (TIMxSource >> 27U)), (TIMxSource & 0x03FFFFFFU)); +} +#endif /* RCC_CFGR3_TIMSW */ + +#if defined(HRTIM1) +/** + * @brief Configure HRTIMx clock source + * @rmtoll CFGR3 HRTIMSW LL_RCC_SetHRTIMClockSource + * @param HRTIMxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_HRTIM1_CLKSOURCE_PCLK2 + * @arg @ref LL_RCC_HRTIM1_CLKSOURCE_PLL + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetHRTIMClockSource(uint32_t HRTIMxSource) +{ + MODIFY_REG(RCC->CFGR3, RCC_CFGR3_HRTIMSW, HRTIMxSource); +} +#endif /* HRTIM1 */ + +#if defined(CEC) +/** + * @brief Configure CEC clock source + * @rmtoll CFGR3 CECSW LL_RCC_SetCECClockSource + * @param CECxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_CEC_CLKSOURCE_HSI_DIV244 + * @arg @ref LL_RCC_CEC_CLKSOURCE_LSE + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetCECClockSource(uint32_t CECxSource) +{ + MODIFY_REG(RCC->CFGR3, RCC_CFGR3_CECSW, CECxSource); +} +#endif /* CEC */ + +#if defined(USB) +/** + * @brief Configure USB clock source + * @rmtoll CFGR USBPRE LL_RCC_SetUSBClockSource + * @param USBxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_USB_CLKSOURCE_PLL + * @arg @ref LL_RCC_USB_CLKSOURCE_PLL_DIV_1_5 + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetUSBClockSource(uint32_t USBxSource) +{ + MODIFY_REG(RCC->CFGR, RCC_CFGR_USBPRE, USBxSource); +} +#endif /* USB */ + +#if defined(RCC_CFGR_ADCPRE) +/** + * @brief Configure ADC clock source + * @rmtoll CFGR ADCPRE LL_RCC_SetADCClockSource + * @param ADCxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_ADC_CLKSRC_PCLK2_DIV_2 + * @arg @ref LL_RCC_ADC_CLKSRC_PCLK2_DIV_4 + * @arg @ref LL_RCC_ADC_CLKSRC_PCLK2_DIV_6 + * @arg @ref LL_RCC_ADC_CLKSRC_PCLK2_DIV_8 + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetADCClockSource(uint32_t ADCxSource) +{ + MODIFY_REG(RCC->CFGR, RCC_CFGR_ADCPRE, ADCxSource); +} + +#elif defined(RCC_CFGR2_ADC1PRES) +/** + * @brief Configure ADC clock source + * @rmtoll CFGR2 ADC1PRES LL_RCC_SetADCClockSource + * @param ADCxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_ADC1_CLKSRC_HCLK + * @arg @ref LL_RCC_ADC1_CLKSRC_PLL_DIV_1 + * @arg @ref LL_RCC_ADC1_CLKSRC_PLL_DIV_2 + * @arg @ref LL_RCC_ADC1_CLKSRC_PLL_DIV_4 + * @arg @ref LL_RCC_ADC1_CLKSRC_PLL_DIV_6 + * @arg @ref LL_RCC_ADC1_CLKSRC_PLL_DIV_8 + * @arg @ref LL_RCC_ADC1_CLKSRC_PLL_DIV_10 + * @arg @ref LL_RCC_ADC1_CLKSRC_PLL_DIV_12 + * @arg @ref LL_RCC_ADC1_CLKSRC_PLL_DIV_16 + * @arg @ref LL_RCC_ADC1_CLKSRC_PLL_DIV_32 + * @arg @ref LL_RCC_ADC1_CLKSRC_PLL_DIV_64 + * @arg @ref LL_RCC_ADC1_CLKSRC_PLL_DIV_128 + * @arg @ref LL_RCC_ADC1_CLKSRC_PLL_DIV_256 + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetADCClockSource(uint32_t ADCxSource) +{ + MODIFY_REG(RCC->CFGR2, RCC_CFGR2_ADC1PRES, ADCxSource); +} + +#elif defined(RCC_CFGR2_ADCPRE12) || defined(RCC_CFGR2_ADCPRE34) +/** + * @brief Configure ADC clock source + * @rmtoll CFGR2 ADCPRE12 LL_RCC_SetADCClockSource\n + * CFGR2 ADCPRE34 LL_RCC_SetADCClockSource + * @param ADCxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_ADC12_CLKSRC_HCLK + * @arg @ref LL_RCC_ADC12_CLKSRC_PLL_DIV_1 + * @arg @ref LL_RCC_ADC12_CLKSRC_PLL_DIV_2 + * @arg @ref LL_RCC_ADC12_CLKSRC_PLL_DIV_4 + * @arg @ref LL_RCC_ADC12_CLKSRC_PLL_DIV_6 + * @arg @ref LL_RCC_ADC12_CLKSRC_PLL_DIV_8 + * @arg @ref LL_RCC_ADC12_CLKSRC_PLL_DIV_10 + * @arg @ref LL_RCC_ADC12_CLKSRC_PLL_DIV_12 + * @arg @ref LL_RCC_ADC12_CLKSRC_PLL_DIV_16 + * @arg @ref LL_RCC_ADC12_CLKSRC_PLL_DIV_32 + * @arg @ref LL_RCC_ADC12_CLKSRC_PLL_DIV_64 + * @arg @ref LL_RCC_ADC12_CLKSRC_PLL_DIV_128 + * @arg @ref LL_RCC_ADC12_CLKSRC_PLL_DIV_256 + * @arg @ref LL_RCC_ADC34_CLKSRC_HCLK (*) + * @arg @ref LL_RCC_ADC34_CLKSRC_PLL_DIV_1 (*) + * @arg @ref LL_RCC_ADC34_CLKSRC_PLL_DIV_2 (*) + * @arg @ref LL_RCC_ADC34_CLKSRC_PLL_DIV_4 (*) + * @arg @ref LL_RCC_ADC34_CLKSRC_PLL_DIV_6 (*) + * @arg @ref LL_RCC_ADC34_CLKSRC_PLL_DIV_8 (*) + * @arg @ref LL_RCC_ADC34_CLKSRC_PLL_DIV_10 (*) + * @arg @ref LL_RCC_ADC34_CLKSRC_PLL_DIV_12 (*) + * @arg @ref LL_RCC_ADC34_CLKSRC_PLL_DIV_16 (*) + * @arg @ref LL_RCC_ADC34_CLKSRC_PLL_DIV_32 (*) + * @arg @ref LL_RCC_ADC34_CLKSRC_PLL_DIV_64 (*) + * @arg @ref LL_RCC_ADC34_CLKSRC_PLL_DIV_128 (*) + * @arg @ref LL_RCC_ADC34_CLKSRC_PLL_DIV_256 (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetADCClockSource(uint32_t ADCxSource) +{ +#if defined(RCC_CFGR2_ADCPRE34) + MODIFY_REG(RCC->CFGR2, (ADCxSource >> 16U), (ADCxSource & 0x0000FFFFU)); +#else + MODIFY_REG(RCC->CFGR2, RCC_CFGR2_ADCPRE12, ADCxSource); +#endif /* RCC_CFGR2_ADCPRE34 */ +} +#endif /* RCC_CFGR_ADCPRE */ + +#if defined(RCC_CFGR_SDPRE) +/** + * @brief Configure SDADCx clock source + * @rmtoll CFGR SDPRE LL_RCC_SetSDADCClockSource + * @param SDADCxSource This parameter can be one of the following values: + * @arg @ref LL_RCC_SDADC_CLKSRC_SYS_DIV_1 + * @arg @ref LL_RCC_SDADC_CLKSRC_SYS_DIV_2 + * @arg @ref LL_RCC_SDADC_CLKSRC_SYS_DIV_4 + * @arg @ref LL_RCC_SDADC_CLKSRC_SYS_DIV_6 + * @arg @ref LL_RCC_SDADC_CLKSRC_SYS_DIV_8 + * @arg @ref LL_RCC_SDADC_CLKSRC_SYS_DIV_10 + * @arg @ref LL_RCC_SDADC_CLKSRC_SYS_DIV_12 + * @arg @ref LL_RCC_SDADC_CLKSRC_SYS_DIV_14 + * @arg @ref LL_RCC_SDADC_CLKSRC_SYS_DIV_16 + * @arg @ref LL_RCC_SDADC_CLKSRC_SYS_DIV_20 + * @arg @ref LL_RCC_SDADC_CLKSRC_SYS_DIV_24 + * @arg @ref LL_RCC_SDADC_CLKSRC_SYS_DIV_28 + * @arg @ref LL_RCC_SDADC_CLKSRC_SYS_DIV_32 + * @arg @ref LL_RCC_SDADC_CLKSRC_SYS_DIV_36 + * @arg @ref LL_RCC_SDADC_CLKSRC_SYS_DIV_40 + * @arg @ref LL_RCC_SDADC_CLKSRC_SYS_DIV_44 + * @arg @ref LL_RCC_SDADC_CLKSRC_SYS_DIV_48 + * @retval None + */ +__STATIC_INLINE void LL_RCC_SetSDADCClockSource(uint32_t SDADCxSource) +{ + MODIFY_REG(RCC->CFGR, RCC_CFGR_SDPRE, SDADCxSource); +} +#endif /* RCC_CFGR_SDPRE */ + +/** + * @brief Get USARTx clock source + * @rmtoll CFGR3 USART1SW LL_RCC_GetUSARTClockSource\n + * CFGR3 USART2SW LL_RCC_GetUSARTClockSource\n + * CFGR3 USART3SW LL_RCC_GetUSARTClockSource + * @param USARTx This parameter can be one of the following values: + * @arg @ref LL_RCC_USART1_CLKSOURCE + * @arg @ref LL_RCC_USART2_CLKSOURCE (*) + * @arg @ref LL_RCC_USART3_CLKSOURCE (*) + * + * (*) value not defined in all devices. + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_USART1_CLKSOURCE_PCLK1 (*) + * @arg @ref LL_RCC_USART1_CLKSOURCE_PCLK2 (*) + * @arg @ref LL_RCC_USART1_CLKSOURCE_SYSCLK + * @arg @ref LL_RCC_USART1_CLKSOURCE_LSE + * @arg @ref LL_RCC_USART1_CLKSOURCE_HSI + * @arg @ref LL_RCC_USART2_CLKSOURCE_PCLK1 (*) + * @arg @ref LL_RCC_USART2_CLKSOURCE_SYSCLK (*) + * @arg @ref LL_RCC_USART2_CLKSOURCE_LSE (*) + * @arg @ref LL_RCC_USART2_CLKSOURCE_HSI (*) + * @arg @ref LL_RCC_USART3_CLKSOURCE_PCLK1 (*) + * @arg @ref LL_RCC_USART3_CLKSOURCE_SYSCLK (*) + * @arg @ref LL_RCC_USART3_CLKSOURCE_LSE (*) + * @arg @ref LL_RCC_USART3_CLKSOURCE_HSI (*) + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_RCC_GetUSARTClockSource(uint32_t USARTx) +{ + return (uint32_t)(READ_BIT(RCC->CFGR3, (RCC_CFGR3_USART1SW << USARTx)) | (USARTx << 24U)); +} + +#if defined(RCC_CFGR3_UART4SW) || defined(RCC_CFGR3_UART5SW) +/** + * @brief Get UARTx clock source + * @rmtoll CFGR3 UART4SW LL_RCC_GetUARTClockSource\n + * CFGR3 UART5SW LL_RCC_GetUARTClockSource + * @param UARTx This parameter can be one of the following values: + * @arg @ref LL_RCC_UART4_CLKSOURCE + * @arg @ref LL_RCC_UART5_CLKSOURCE + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_UART4_CLKSOURCE_PCLK1 + * @arg @ref LL_RCC_UART4_CLKSOURCE_SYSCLK + * @arg @ref LL_RCC_UART4_CLKSOURCE_LSE + * @arg @ref LL_RCC_UART4_CLKSOURCE_HSI + * @arg @ref LL_RCC_UART5_CLKSOURCE_PCLK1 + * @arg @ref LL_RCC_UART5_CLKSOURCE_SYSCLK + * @arg @ref LL_RCC_UART5_CLKSOURCE_LSE + * @arg @ref LL_RCC_UART5_CLKSOURCE_HSI + */ +__STATIC_INLINE uint32_t LL_RCC_GetUARTClockSource(uint32_t UARTx) +{ + return (uint32_t)(READ_BIT(RCC->CFGR3, UARTx) | (UARTx >> 8U)); +} +#endif /* RCC_CFGR3_UART4SW || RCC_CFGR3_UART5SW */ + +/** + * @brief Get I2Cx clock source + * @rmtoll CFGR3 I2C1SW LL_RCC_GetI2CClockSource\n + * CFGR3 I2C2SW LL_RCC_GetI2CClockSource\n + * CFGR3 I2C3SW LL_RCC_GetI2CClockSource + * @param I2Cx This parameter can be one of the following values: + * @arg @ref LL_RCC_I2C1_CLKSOURCE + * @arg @ref LL_RCC_I2C2_CLKSOURCE (*) + * @arg @ref LL_RCC_I2C3_CLKSOURCE (*) + * + * (*) value not defined in all devices. + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_I2C1_CLKSOURCE_HSI + * @arg @ref LL_RCC_I2C1_CLKSOURCE_SYSCLK + * @arg @ref LL_RCC_I2C2_CLKSOURCE_HSI (*) + * @arg @ref LL_RCC_I2C2_CLKSOURCE_SYSCLK (*) + * @arg @ref LL_RCC_I2C3_CLKSOURCE_HSI (*) + * @arg @ref LL_RCC_I2C3_CLKSOURCE_SYSCLK (*) + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_RCC_GetI2CClockSource(uint32_t I2Cx) +{ + return (uint32_t)(READ_BIT(RCC->CFGR3, I2Cx) | (I2Cx << 24U)); +} + +#if defined(RCC_CFGR_I2SSRC) +/** + * @brief Get I2Sx clock source + * @rmtoll CFGR I2SSRC LL_RCC_GetI2SClockSource + * @param I2Sx This parameter can be one of the following values: + * @arg @ref LL_RCC_I2S_CLKSOURCE + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_I2S_CLKSOURCE_SYSCLK + * @arg @ref LL_RCC_I2S_CLKSOURCE_PIN + */ +__STATIC_INLINE uint32_t LL_RCC_GetI2SClockSource(uint32_t I2Sx) +{ + return (uint32_t)(READ_BIT(RCC->CFGR, I2Sx)); +} +#endif /* RCC_CFGR_I2SSRC */ + +#if defined(RCC_CFGR3_TIMSW) +/** + * @brief Get TIMx clock source + * @rmtoll CFGR3 TIM1SW LL_RCC_GetTIMClockSource\n + * CFGR3 TIM8SW LL_RCC_GetTIMClockSource\n + * CFGR3 TIM15SW LL_RCC_GetTIMClockSource\n + * CFGR3 TIM16SW LL_RCC_GetTIMClockSource\n + * CFGR3 TIM17SW LL_RCC_GetTIMClockSource\n + * CFGR3 TIM20SW LL_RCC_GetTIMClockSource\n + * CFGR3 TIM2SW LL_RCC_GetTIMClockSource\n + * CFGR3 TIM34SW LL_RCC_GetTIMClockSource + * @param TIMx This parameter can be one of the following values: + * @arg @ref LL_RCC_TIM1_CLKSOURCE + * @arg @ref LL_RCC_TIM2_CLKSOURCE (*) + * @arg @ref LL_RCC_TIM8_CLKSOURCE (*) + * @arg @ref LL_RCC_TIM15_CLKSOURCE (*) + * @arg @ref LL_RCC_TIM16_CLKSOURCE (*) + * @arg @ref LL_RCC_TIM17_CLKSOURCE (*) + * @arg @ref LL_RCC_TIM20_CLKSOURCE (*) + * @arg @ref LL_RCC_TIM34_CLKSOURCE (*) + * + * (*) value not defined in all devices. + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_TIM1_CLKSOURCE_PCLK2 + * @arg @ref LL_RCC_TIM1_CLKSOURCE_PLL + * @arg @ref LL_RCC_TIM8_CLKSOURCE_PCLK2 (*) + * @arg @ref LL_RCC_TIM8_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_TIM15_CLKSOURCE_PCLK2 (*) + * @arg @ref LL_RCC_TIM15_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_TIM16_CLKSOURCE_PCLK2 (*) + * @arg @ref LL_RCC_TIM16_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_TIM17_CLKSOURCE_PCLK2 (*) + * @arg @ref LL_RCC_TIM17_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_TIM20_CLKSOURCE_PCLK2 (*) + * @arg @ref LL_RCC_TIM20_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_TIM2_CLKSOURCE_PCLK1 (*) + * @arg @ref LL_RCC_TIM2_CLKSOURCE_PLL (*) + * @arg @ref LL_RCC_TIM34_CLKSOURCE_PCLK1 (*) + * @arg @ref LL_RCC_TIM34_CLKSOURCE_PLL (*) + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_RCC_GetTIMClockSource(uint32_t TIMx) +{ + return (uint32_t)(READ_BIT(RCC->CFGR3, (RCC_CFGR3_TIM1SW << TIMx)) | (TIMx << 27U)); +} +#endif /* RCC_CFGR3_TIMSW */ + +#if defined(HRTIM1) +/** + * @brief Get HRTIMx clock source + * @rmtoll CFGR3 HRTIMSW LL_RCC_GetHRTIMClockSource + * @param HRTIMx This parameter can be one of the following values: + * @arg @ref LL_RCC_HRTIM1_CLKSOURCE + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_HRTIM1_CLKSOURCE_PCLK2 + * @arg @ref LL_RCC_HRTIM1_CLKSOURCE_PLL + */ +__STATIC_INLINE uint32_t LL_RCC_GetHRTIMClockSource(uint32_t HRTIMx) +{ + return (uint32_t)(READ_BIT(RCC->CFGR3, HRTIMx)); +} +#endif /* HRTIM1 */ + +#if defined(CEC) +/** + * @brief Get CEC clock source + * @rmtoll CFGR3 CECSW 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_DIV244 + * @arg @ref LL_RCC_CEC_CLKSOURCE_LSE + */ +__STATIC_INLINE uint32_t LL_RCC_GetCECClockSource(uint32_t CECx) +{ + return (uint32_t)(READ_BIT(RCC->CFGR3, CECx)); +} +#endif /* CEC */ + +#if defined(USB) +/** + * @brief Get USBx clock source + * @rmtoll CFGR USBPRE LL_RCC_GetUSBClockSource + * @param USBx This parameter can be one of the following values: + * @arg @ref LL_RCC_USB_CLKSOURCE + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_USB_CLKSOURCE_PLL + * @arg @ref LL_RCC_USB_CLKSOURCE_PLL_DIV_1_5 + */ +__STATIC_INLINE uint32_t LL_RCC_GetUSBClockSource(uint32_t USBx) +{ + return (uint32_t)(READ_BIT(RCC->CFGR, USBx)); +} +#endif /* USB */ + +#if defined(RCC_CFGR_ADCPRE) +/** + * @brief Get ADCx clock source + * @rmtoll CFGR ADCPRE LL_RCC_GetADCClockSource + * @param ADCx This parameter can be one of the following values: + * @arg @ref LL_RCC_ADC_CLKSOURCE + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_ADC_CLKSRC_PCLK2_DIV_2 + * @arg @ref LL_RCC_ADC_CLKSRC_PCLK2_DIV_4 + * @arg @ref LL_RCC_ADC_CLKSRC_PCLK2_DIV_6 + * @arg @ref LL_RCC_ADC_CLKSRC_PCLK2_DIV_8 + */ +__STATIC_INLINE uint32_t LL_RCC_GetADCClockSource(uint32_t ADCx) +{ + return (uint32_t)(READ_BIT(RCC->CFGR, ADCx)); +} + +#elif defined(RCC_CFGR2_ADC1PRES) +/** + * @brief Get ADCx clock source + * @rmtoll CFGR2 ADC1PRES LL_RCC_GetADCClockSource + * @param ADCx This parameter can be one of the following values: + * @arg @ref LL_RCC_ADC1_CLKSOURCE + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_ADC1_CLKSRC_HCLK + * @arg @ref LL_RCC_ADC1_CLKSRC_PLL_DIV_1 + * @arg @ref LL_RCC_ADC1_CLKSRC_PLL_DIV_2 + * @arg @ref LL_RCC_ADC1_CLKSRC_PLL_DIV_4 + * @arg @ref LL_RCC_ADC1_CLKSRC_PLL_DIV_6 + * @arg @ref LL_RCC_ADC1_CLKSRC_PLL_DIV_8 + * @arg @ref LL_RCC_ADC1_CLKSRC_PLL_DIV_10 + * @arg @ref LL_RCC_ADC1_CLKSRC_PLL_DIV_12 + * @arg @ref LL_RCC_ADC1_CLKSRC_PLL_DIV_16 + * @arg @ref LL_RCC_ADC1_CLKSRC_PLL_DIV_32 + * @arg @ref LL_RCC_ADC1_CLKSRC_PLL_DIV_64 + * @arg @ref LL_RCC_ADC1_CLKSRC_PLL_DIV_128 + * @arg @ref LL_RCC_ADC1_CLKSRC_PLL_DIV_256 + */ +__STATIC_INLINE uint32_t LL_RCC_GetADCClockSource(uint32_t ADCx) +{ + return (uint32_t)(READ_BIT(RCC->CFGR2, ADCx)); +} + +#elif defined(RCC_CFGR2_ADCPRE12) || defined(RCC_CFGR2_ADCPRE34) +/** + * @brief Get ADCx clock source + * @rmtoll CFGR2 ADCPRE12 LL_RCC_GetADCClockSource\n + * CFGR2 ADCPRE34 LL_RCC_GetADCClockSource + * @param ADCx This parameter can be one of the following values: + * @arg @ref LL_RCC_ADC12_CLKSOURCE + * @arg @ref LL_RCC_ADC34_CLKSOURCE (*) + * + * (*) value not defined in all devices. + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_ADC12_CLKSRC_HCLK + * @arg @ref LL_RCC_ADC12_CLKSRC_PLL_DIV_1 + * @arg @ref LL_RCC_ADC12_CLKSRC_PLL_DIV_2 + * @arg @ref LL_RCC_ADC12_CLKSRC_PLL_DIV_4 + * @arg @ref LL_RCC_ADC12_CLKSRC_PLL_DIV_6 + * @arg @ref LL_RCC_ADC12_CLKSRC_PLL_DIV_8 + * @arg @ref LL_RCC_ADC12_CLKSRC_PLL_DIV_10 + * @arg @ref LL_RCC_ADC12_CLKSRC_PLL_DIV_12 + * @arg @ref LL_RCC_ADC12_CLKSRC_PLL_DIV_16 + * @arg @ref LL_RCC_ADC12_CLKSRC_PLL_DIV_32 + * @arg @ref LL_RCC_ADC12_CLKSRC_PLL_DIV_64 + * @arg @ref LL_RCC_ADC12_CLKSRC_PLL_DIV_128 + * @arg @ref LL_RCC_ADC12_CLKSRC_PLL_DIV_256 + * @arg @ref LL_RCC_ADC34_CLKSRC_HCLK (*) + * @arg @ref LL_RCC_ADC34_CLKSRC_PLL_DIV_1 (*) + * @arg @ref LL_RCC_ADC34_CLKSRC_PLL_DIV_2 (*) + * @arg @ref LL_RCC_ADC34_CLKSRC_PLL_DIV_4 (*) + * @arg @ref LL_RCC_ADC34_CLKSRC_PLL_DIV_6 (*) + * @arg @ref LL_RCC_ADC34_CLKSRC_PLL_DIV_8 (*) + * @arg @ref LL_RCC_ADC34_CLKSRC_PLL_DIV_10 (*) + * @arg @ref LL_RCC_ADC34_CLKSRC_PLL_DIV_12 (*) + * @arg @ref LL_RCC_ADC34_CLKSRC_PLL_DIV_16 (*) + * @arg @ref LL_RCC_ADC34_CLKSRC_PLL_DIV_32 (*) + * @arg @ref LL_RCC_ADC34_CLKSRC_PLL_DIV_64 (*) + * @arg @ref LL_RCC_ADC34_CLKSRC_PLL_DIV_128 (*) + * @arg @ref LL_RCC_ADC34_CLKSRC_PLL_DIV_256 (*) + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_RCC_GetADCClockSource(uint32_t ADCx) +{ +#if defined(RCC_CFGR2_ADCPRE34) + return (uint32_t)(READ_BIT(RCC->CFGR2, ADCx) | (ADCx << 16U)); +#else + return (uint32_t)(READ_BIT(RCC->CFGR2, ADCx)); +#endif /*RCC_CFGR2_ADCPRE34*/ +} +#endif /* RCC_CFGR_ADCPRE */ + +#if defined(RCC_CFGR_SDPRE) +/** + * @brief Get SDADCx clock source + * @rmtoll CFGR SDPRE LL_RCC_GetSDADCClockSource + * @param SDADCx This parameter can be one of the following values: + * @arg @ref LL_RCC_SDADC_CLKSOURCE + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_SDADC_CLKSRC_SYS_DIV_1 + * @arg @ref LL_RCC_SDADC_CLKSRC_SYS_DIV_2 + * @arg @ref LL_RCC_SDADC_CLKSRC_SYS_DIV_4 + * @arg @ref LL_RCC_SDADC_CLKSRC_SYS_DIV_6 + * @arg @ref LL_RCC_SDADC_CLKSRC_SYS_DIV_8 + * @arg @ref LL_RCC_SDADC_CLKSRC_SYS_DIV_10 + * @arg @ref LL_RCC_SDADC_CLKSRC_SYS_DIV_12 + * @arg @ref LL_RCC_SDADC_CLKSRC_SYS_DIV_14 + * @arg @ref LL_RCC_SDADC_CLKSRC_SYS_DIV_16 + * @arg @ref LL_RCC_SDADC_CLKSRC_SYS_DIV_20 + * @arg @ref LL_RCC_SDADC_CLKSRC_SYS_DIV_24 + * @arg @ref LL_RCC_SDADC_CLKSRC_SYS_DIV_28 + * @arg @ref LL_RCC_SDADC_CLKSRC_SYS_DIV_32 + * @arg @ref LL_RCC_SDADC_CLKSRC_SYS_DIV_36 + * @arg @ref LL_RCC_SDADC_CLKSRC_SYS_DIV_40 + * @arg @ref LL_RCC_SDADC_CLKSRC_SYS_DIV_44 + * @arg @ref LL_RCC_SDADC_CLKSRC_SYS_DIV_48 + */ +__STATIC_INLINE uint32_t LL_RCC_GetSDADCClockSource(uint32_t SDADCx) +{ + return (uint32_t)(READ_BIT(RCC->CFGR, SDADCx)); +} +#endif /* RCC_CFGR_SDPRE */ + +/** + * @} + */ + +/** @defgroup RCC_LL_EF_RTC RTC + * @{ + */ + +/** + * @brief Set RTC Clock Source + * @note Once the RTC clock source has been selected, it cannot be changed any more unless + * the Backup domain is reset. The BDRST bit can be used to reset them. + * @rmtoll BDCR RTCSEL LL_RCC_SetRTCClockSource + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_RTC_CLKSOURCE_NONE + * @arg @ref LL_RCC_RTC_CLKSOURCE_LSE + * @arg @ref LL_RCC_RTC_CLKSOURCE_LSI + * @arg @ref LL_RCC_RTC_CLKSOURCE_HSE_DIV32 + * @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_DIV32 + */ +__STATIC_INLINE uint32_t LL_RCC_GetRTCClockSource(void) +{ + return (uint32_t)(READ_BIT(RCC->BDCR, RCC_BDCR_RTCSEL)); +} + +/** + * @brief Enable RTC + * @rmtoll BDCR RTCEN LL_RCC_EnableRTC + * @retval None + */ +__STATIC_INLINE void LL_RCC_EnableRTC(void) +{ + SET_BIT(RCC->BDCR, RCC_BDCR_RTCEN); +} + +/** + * @brief Disable RTC + * @rmtoll BDCR RTCEN LL_RCC_DisableRTC + * @retval None + */ +__STATIC_INLINE void LL_RCC_DisableRTC(void) +{ + CLEAR_BIT(RCC->BDCR, RCC_BDCR_RTCEN); +} + +/** + * @brief Check if RTC has been enabled or not + * @rmtoll BDCR RTCEN LL_RCC_IsEnabledRTC + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsEnabledRTC(void) +{ + return (READ_BIT(RCC->BDCR, RCC_BDCR_RTCEN) == (RCC_BDCR_RTCEN)); +} + +/** + * @brief Force the Backup domain reset + * @rmtoll BDCR BDRST LL_RCC_ForceBackupDomainReset + * @retval None + */ +__STATIC_INLINE void LL_RCC_ForceBackupDomainReset(void) +{ + SET_BIT(RCC->BDCR, RCC_BDCR_BDRST); +} + +/** + * @brief Release the Backup domain reset + * @rmtoll BDCR BDRST LL_RCC_ReleaseBackupDomainReset + * @retval None + */ +__STATIC_INLINE void LL_RCC_ReleaseBackupDomainReset(void) +{ + CLEAR_BIT(RCC->BDCR, RCC_BDCR_BDRST); +} + +/** + * @} + */ + +/** @defgroup RCC_LL_EF_PLL PLL + * @{ + */ + +/** + * @brief Enable PLL + * @rmtoll CR PLLON LL_RCC_PLL_Enable + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLL_Enable(void) +{ + SET_BIT(RCC->CR, RCC_CR_PLLON); +} + +/** + * @brief Disable PLL + * @note Cannot be disabled if the PLL clock is used as the system clock + * @rmtoll CR PLLON LL_RCC_PLL_Disable + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLL_Disable(void) +{ + CLEAR_BIT(RCC->CR, RCC_CR_PLLON); +} + +/** + * @brief Check if PLL Ready + * @rmtoll CR PLLRDY LL_RCC_PLL_IsReady + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_PLL_IsReady(void) +{ + return (READ_BIT(RCC->CR, RCC_CR_PLLRDY) == (RCC_CR_PLLRDY)); +} + +#if defined(RCC_PLLSRC_PREDIV1_SUPPORT) +/** + * @brief Configure PLL used for SYSCLK Domain + * @rmtoll CFGR PLLSRC LL_RCC_PLL_ConfigDomain_SYS\n + * CFGR PLLMUL LL_RCC_PLL_ConfigDomain_SYS\n + * CFGR2 PREDIV 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 PLLMul This parameter can be one of the following values: + * @arg @ref LL_RCC_PLL_MUL_2 + * @arg @ref LL_RCC_PLL_MUL_3 + * @arg @ref LL_RCC_PLL_MUL_4 + * @arg @ref LL_RCC_PLL_MUL_5 + * @arg @ref LL_RCC_PLL_MUL_6 + * @arg @ref LL_RCC_PLL_MUL_7 + * @arg @ref LL_RCC_PLL_MUL_8 + * @arg @ref LL_RCC_PLL_MUL_9 + * @arg @ref LL_RCC_PLL_MUL_10 + * @arg @ref LL_RCC_PLL_MUL_11 + * @arg @ref LL_RCC_PLL_MUL_12 + * @arg @ref LL_RCC_PLL_MUL_13 + * @arg @ref LL_RCC_PLL_MUL_14 + * @arg @ref LL_RCC_PLL_MUL_15 + * @arg @ref LL_RCC_PLL_MUL_16 + * @param PLLDiv This parameter can be one of the following values: + * @arg @ref LL_RCC_PREDIV_DIV_1 + * @arg @ref LL_RCC_PREDIV_DIV_2 + * @arg @ref LL_RCC_PREDIV_DIV_3 + * @arg @ref LL_RCC_PREDIV_DIV_4 + * @arg @ref LL_RCC_PREDIV_DIV_5 + * @arg @ref LL_RCC_PREDIV_DIV_6 + * @arg @ref LL_RCC_PREDIV_DIV_7 + * @arg @ref LL_RCC_PREDIV_DIV_8 + * @arg @ref LL_RCC_PREDIV_DIV_9 + * @arg @ref LL_RCC_PREDIV_DIV_10 + * @arg @ref LL_RCC_PREDIV_DIV_11 + * @arg @ref LL_RCC_PREDIV_DIV_12 + * @arg @ref LL_RCC_PREDIV_DIV_13 + * @arg @ref LL_RCC_PREDIV_DIV_14 + * @arg @ref LL_RCC_PREDIV_DIV_15 + * @arg @ref LL_RCC_PREDIV_DIV_16 + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_SYS(uint32_t Source, uint32_t PLLMul, uint32_t PLLDiv) +{ + MODIFY_REG(RCC->CFGR, RCC_CFGR_PLLSRC | RCC_CFGR_PLLMUL, Source | PLLMul); + MODIFY_REG(RCC->CFGR2, RCC_CFGR2_PREDIV, PLLDiv); +} + +#else + +/** + * @brief Configure PLL used for SYSCLK Domain + * @rmtoll CFGR PLLSRC LL_RCC_PLL_ConfigDomain_SYS\n + * CFGR PLLMUL LL_RCC_PLL_ConfigDomain_SYS\n + * CFGR2 PREDIV LL_RCC_PLL_ConfigDomain_SYS + * @param Source This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_HSI_DIV_2 + * @arg @ref LL_RCC_PLLSOURCE_HSE_DIV_1 + * @arg @ref LL_RCC_PLLSOURCE_HSE_DIV_2 + * @arg @ref LL_RCC_PLLSOURCE_HSE_DIV_3 + * @arg @ref LL_RCC_PLLSOURCE_HSE_DIV_4 + * @arg @ref LL_RCC_PLLSOURCE_HSE_DIV_5 + * @arg @ref LL_RCC_PLLSOURCE_HSE_DIV_6 + * @arg @ref LL_RCC_PLLSOURCE_HSE_DIV_7 + * @arg @ref LL_RCC_PLLSOURCE_HSE_DIV_8 + * @arg @ref LL_RCC_PLLSOURCE_HSE_DIV_9 + * @arg @ref LL_RCC_PLLSOURCE_HSE_DIV_10 + * @arg @ref LL_RCC_PLLSOURCE_HSE_DIV_11 + * @arg @ref LL_RCC_PLLSOURCE_HSE_DIV_12 + * @arg @ref LL_RCC_PLLSOURCE_HSE_DIV_13 + * @arg @ref LL_RCC_PLLSOURCE_HSE_DIV_14 + * @arg @ref LL_RCC_PLLSOURCE_HSE_DIV_15 + * @arg @ref LL_RCC_PLLSOURCE_HSE_DIV_16 + * @param PLLMul This parameter can be one of the following values: + * @arg @ref LL_RCC_PLL_MUL_2 + * @arg @ref LL_RCC_PLL_MUL_3 + * @arg @ref LL_RCC_PLL_MUL_4 + * @arg @ref LL_RCC_PLL_MUL_5 + * @arg @ref LL_RCC_PLL_MUL_6 + * @arg @ref LL_RCC_PLL_MUL_7 + * @arg @ref LL_RCC_PLL_MUL_8 + * @arg @ref LL_RCC_PLL_MUL_9 + * @arg @ref LL_RCC_PLL_MUL_10 + * @arg @ref LL_RCC_PLL_MUL_11 + * @arg @ref LL_RCC_PLL_MUL_12 + * @arg @ref LL_RCC_PLL_MUL_13 + * @arg @ref LL_RCC_PLL_MUL_14 + * @arg @ref LL_RCC_PLL_MUL_15 + * @arg @ref LL_RCC_PLL_MUL_16 + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLL_ConfigDomain_SYS(uint32_t Source, uint32_t PLLMul) +{ + MODIFY_REG(RCC->CFGR, RCC_CFGR_PLLSRC | RCC_CFGR_PLLMUL, (Source & RCC_CFGR_PLLSRC) | PLLMul); + MODIFY_REG(RCC->CFGR2, RCC_CFGR2_PREDIV, (Source & RCC_CFGR2_PREDIV)); +} +#endif /* RCC_PLLSRC_PREDIV1_SUPPORT */ + +/** + * @brief Configure PLL clock source + * @rmtoll CFGR PLLSRC LL_RCC_PLL_SetMainSource + * @param PLLSource This parameter can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_NONE + * @arg @ref LL_RCC_PLLSOURCE_HSI (*) + * @arg @ref LL_RCC_PLLSOURCE_HSI_DIV_2 (*) + * @arg @ref LL_RCC_PLLSOURCE_HSE + * @arg @ref LL_RCC_PLLSOURCE_HSI48 (*) + * + * (*) value not defined in all devices + * @retval None + */ +__STATIC_INLINE void LL_RCC_PLL_SetMainSource(uint32_t PLLSource) +{ + MODIFY_REG(RCC->CFGR, RCC_CFGR_PLLSRC, PLLSource); +} + +/** + * @brief Get the oscillator used as PLL clock source. + * @rmtoll CFGR PLLSRC LL_RCC_PLL_GetMainSource + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLLSOURCE_NONE + * @arg @ref LL_RCC_PLLSOURCE_HSI (*) + * @arg @ref LL_RCC_PLLSOURCE_HSI_DIV_2 (*) + * @arg @ref LL_RCC_PLLSOURCE_HSE + * + * (*) value not defined in all devices + */ +__STATIC_INLINE uint32_t LL_RCC_PLL_GetMainSource(void) +{ + return (uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_PLLSRC)); +} + +/** + * @brief Get PLL multiplication Factor + * @rmtoll CFGR PLLMUL LL_RCC_PLL_GetMultiplicator + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PLL_MUL_2 + * @arg @ref LL_RCC_PLL_MUL_3 + * @arg @ref LL_RCC_PLL_MUL_4 + * @arg @ref LL_RCC_PLL_MUL_5 + * @arg @ref LL_RCC_PLL_MUL_6 + * @arg @ref LL_RCC_PLL_MUL_7 + * @arg @ref LL_RCC_PLL_MUL_8 + * @arg @ref LL_RCC_PLL_MUL_9 + * @arg @ref LL_RCC_PLL_MUL_10 + * @arg @ref LL_RCC_PLL_MUL_11 + * @arg @ref LL_RCC_PLL_MUL_12 + * @arg @ref LL_RCC_PLL_MUL_13 + * @arg @ref LL_RCC_PLL_MUL_14 + * @arg @ref LL_RCC_PLL_MUL_15 + * @arg @ref LL_RCC_PLL_MUL_16 + */ +__STATIC_INLINE uint32_t LL_RCC_PLL_GetMultiplicator(void) +{ + return (uint32_t)(READ_BIT(RCC->CFGR, RCC_CFGR_PLLMUL)); +} + +/** + * @brief Get PREDIV division factor for the main PLL + * @note They can be written only when the PLL is disabled + * @rmtoll CFGR2 PREDIV LL_RCC_PLL_GetPrediv + * @retval Returned value can be one of the following values: + * @arg @ref LL_RCC_PREDIV_DIV_1 + * @arg @ref LL_RCC_PREDIV_DIV_2 + * @arg @ref LL_RCC_PREDIV_DIV_3 + * @arg @ref LL_RCC_PREDIV_DIV_4 + * @arg @ref LL_RCC_PREDIV_DIV_5 + * @arg @ref LL_RCC_PREDIV_DIV_6 + * @arg @ref LL_RCC_PREDIV_DIV_7 + * @arg @ref LL_RCC_PREDIV_DIV_8 + * @arg @ref LL_RCC_PREDIV_DIV_9 + * @arg @ref LL_RCC_PREDIV_DIV_10 + * @arg @ref LL_RCC_PREDIV_DIV_11 + * @arg @ref LL_RCC_PREDIV_DIV_12 + * @arg @ref LL_RCC_PREDIV_DIV_13 + * @arg @ref LL_RCC_PREDIV_DIV_14 + * @arg @ref LL_RCC_PREDIV_DIV_15 + * @arg @ref LL_RCC_PREDIV_DIV_16 + */ +__STATIC_INLINE uint32_t LL_RCC_PLL_GetPrediv(void) +{ + return (uint32_t)(READ_BIT(RCC->CFGR2, RCC_CFGR2_PREDIV)); +} + +/** + * @} + */ + +/** @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); +} + +/** + * @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)); +} + +#if defined(RCC_CFGR_MCOF) +/** + * @brief Check if switch to new MCO source is effective or not + * @rmtoll CFGR MCOF LL_RCC_IsActiveFlag_MCO1 + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_MCO1(void) +{ + return (READ_BIT(RCC->CFGR, RCC_CFGR_MCOF) == (RCC_CFGR_MCOF)); +} +#endif /* RCC_CFGR_MCOF */ + +/** + * @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)); +} + +/** + * @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 is set or not. + * @rmtoll CSR OBLRSTF LL_RCC_IsActiveFlag_OBLRST + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_OBLRST(void) +{ + return (READ_BIT(RCC->CSR, RCC_CSR_OBLRSTF) == (RCC_CSR_OBLRSTF)); +} + +/** + * @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_V18PWRRSTF) +/** + * @brief Check if RCC Reset flag of the 1.8 V domain is set or not. + * @rmtoll CSR V18PWRRSTF LL_RCC_IsActiveFlag_V18PWRRST + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_RCC_IsActiveFlag_V18PWRRST(void) +{ + return (READ_BIT(RCC->CSR, RCC_CSR_V18PWRRSTF) == (RCC_CSR_V18PWRRSTF)); +} +#endif /* RCC_CSR_V18PWRRSTF */ + +/** + * @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); +} + +/** + * @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); +} + +/** + * @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(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); +uint32_t LL_RCC_GetUSARTClockFreq(uint32_t USARTxSource); +#if defined(UART4) || defined(UART5) +uint32_t LL_RCC_GetUARTClockFreq(uint32_t UARTxSource); +#endif /* UART4 || UART5 */ +uint32_t LL_RCC_GetI2CClockFreq(uint32_t I2CxSource); +#if defined(RCC_CFGR_I2SSRC) +uint32_t LL_RCC_GetI2SClockFreq(uint32_t I2SxSource); +#endif /* RCC_CFGR_I2SSRC */ +#if defined(USB_OTG_FS) || defined(USB) +uint32_t LL_RCC_GetUSBClockFreq(uint32_t USBxSource); +#endif /* USB_OTG_FS || USB */ +#if (defined(RCC_CFGR_ADCPRE) || defined(RCC_CFGR2_ADC1PRES) || defined(RCC_CFGR2_ADCPRE12) || defined(RCC_CFGR2_ADCPRE34)) +uint32_t LL_RCC_GetADCClockFreq(uint32_t ADCxSource); +#endif /*RCC_CFGR_ADCPRE || RCC_CFGR2_ADC1PRES || RCC_CFGR2_ADCPRE12 || RCC_CFGR2_ADCPRE34 */ +#if defined(RCC_CFGR_SDPRE) +uint32_t LL_RCC_GetSDADCClockFreq(uint32_t SDADCxSource); +#endif /*RCC_CFGR_SDPRE */ +#if defined(CEC) +uint32_t LL_RCC_GetCECClockFreq(uint32_t CECxSource); +#endif /* CEC */ +#if defined(RCC_CFGR3_TIMSW) +uint32_t LL_RCC_GetTIMClockFreq(uint32_t TIMxSource); +#endif /*RCC_CFGR3_TIMSW*/ +uint32_t LL_RCC_GetHRTIMClockFreq(uint32_t HRTIMxSource); +/** + * @} + */ +#endif /* USE_FULL_LL_DRIVER */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* RCC */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F3xx_LL_RCC_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_system.h b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_system.h new file mode 100644 index 0000000..d47644d --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_system.h @@ -0,0 +1,1724 @@ +/** + ****************************************************************************** + * @file stm32f3xx_ll_system.h + * @author MCD Application Team + * @brief Header file of SYSTEM LL module. + @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 + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F3xx_LL_SYSTEM_H +#define __STM32F3xx_LL_SYSTEM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f3xx.h" + +/** @addtogroup STM32F3xx_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 + * @{ + */ + +/* Offset used to access to SYSCFG_CFGR1 and SYSCFG_CFGR3 registers */ +#define SYSCFG_OFFSET_CFGR1 0x00000000U +#define SYSCFG_OFFSET_CFGR3 0x00000050U + +/* Mask used for TIM breaks functions */ +#if defined(SYSCFG_CFGR2_PVD_LOCK) && defined(SYSCFG_CFGR2_SRAM_PARITY_LOCK) +#define SYSCFG_MASK_TIM_BREAK (SYSCFG_CFGR2_LOCKUP_LOCK | SYSCFG_CFGR2_SRAM_PARITY_LOCK | SYSCFG_CFGR2_PVD_LOCK) +#elif defined(SYSCFG_CFGR2_PVD_LOCK) && !defined(SYSCFG_CFGR2_SRAM_PARITY_LOCK) +#define SYSCFG_MASK_TIM_BREAK (SYSCFG_CFGR2_LOCKUP_LOCK | SYSCFG_CFGR2_PVD_LOCK) +#elif !defined(SYSCFG_CFGR2_PVD_LOCK) && defined(SYSCFG_CFGR2_SRAM_PARITY_LOCK) +#define SYSCFG_MASK_TIM_BREAK (SYSCFG_CFGR2_LOCKUP_LOCK | SYSCFG_CFGR2_SRAM_PARITY_LOCK) +#else +#define SYSCFG_MASK_TIM_BREAK (SYSCFG_CFGR2_LOCKUP_LOCK) +#endif /* SYSCFG_CFGR2_PVD_LOCK && SYSCFG_CFGR2_SRAM_PARITY_LOCK */ + +/** + * @} + */ + +/* 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_CFGR1_MEM_MODE_0 /* System Flash memory mapped at 0x00000000 */ +#define LL_SYSCFG_REMAP_SRAM (SYSCFG_CFGR1_MEM_MODE_1 | SYSCFG_CFGR1_MEM_MODE_0) /* Embedded SRAM mapped at 0x00000000 */ +#if defined(FMC_BANK1) +#define LL_SYSCFG_REMAP_FMC SYSCFG_CFGR1_MEM_MODE_2 /*CFGR1, SYSCFG_CFGR1_MEM_MODE, Memory); +} + +/** + * @brief Get memory mapping at address 0x00000000 + * @rmtoll SYSCFG_CFGR1 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_FMC (*) + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_SYSCFG_GetRemapMemory(void) +{ + return (uint32_t)(READ_BIT(SYSCFG->CFGR1, SYSCFG_CFGR1_MEM_MODE)); +} + +#if defined(SYSCFG_CFGR3_SPI1_RX_DMA_RMP) +/** + * @brief Set DMA request remapping bits for SPI + * @rmtoll SYSCFG_CFGR3 SPI1_RX_DMA_RMP LL_SYSCFG_SetRemapDMA_SPI\n + * SYSCFG_CFGR3 SPI1_TX_DMA_RMP LL_SYSCFG_SetRemapDMA_SPI + * @param Remap This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_SPI1RX_RMP_DMA1_CH2 + * @arg @ref LL_SYSCFG_SPI1RX_RMP_DMA1_CH4 + * @arg @ref LL_SYSCFG_SPI1RX_RMP_DMA1_CH6 + * @arg @ref LL_SYSCFG_SPI1TX_RMP_DMA1_CH3 + * @arg @ref LL_SYSCFG_SPI1TX_RMP_DMA1_CH5 + * @arg @ref LL_SYSCFG_SPI1TX_RMP_DMA1_CH7 + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_SetRemapDMA_SPI(uint32_t Remap) +{ + MODIFY_REG(SYSCFG->CFGR3, (Remap >> 16U), (Remap & 0x0000FFFF)); +} +#endif /* SYSCFG_CFGR3_SPI1_RX_DMA_RMP */ + +#if defined(SYSCFG_CFGR3_I2C1_RX_DMA_RMP) +/** + * @brief Set DMA request remapping bits for I2C + * @rmtoll SYSCFG_CFGR3 I2C1_RX_DMA_RMP LL_SYSCFG_SetRemapDMA_I2C\n + * SYSCFG_CFGR3 I2C1_TX_DMA_RMP LL_SYSCFG_SetRemapDMA_I2C + * @param Remap This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_I2C1RX_RMP_DMA1_CH7 + * @arg @ref LL_SYSCFG_I2C1RX_RMP_DMA1_CH3 + * @arg @ref LL_SYSCFG_I2C1RX_RMP_DMA1_CH5 + * @arg @ref LL_SYSCFG_I2C1TX_RMP_DMA1_CH6 + * @arg @ref LL_SYSCFG_I2C1TX_RMP_DMA1_CH2 + * @arg @ref LL_SYSCFG_I2C1TX_RMP_DMA1_CH4 + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_SetRemapDMA_I2C(uint32_t Remap) +{ + MODIFY_REG(SYSCFG->CFGR3, (Remap >> 16U), (Remap & 0x0000FFFF)); +} +#endif /* SYSCFG_CFGR3_I2C1_RX_DMA_RMP */ + +#if defined(SYSCFG_CFGR1_ADC24_DMA_RMP) || defined(SYSCFG_CFGR3_ADC2_DMA_RMP) +/** + * @brief Set DMA request remapping bits for ADC + * @rmtoll SYSCFG_CFGR1 ADC24_DMA_RMP LL_SYSCFG_SetRemapDMA_ADC\n + * SYSCFG_CFGR3 ADC2_DMA_RMP LL_SYSCFG_SetRemapDMA_ADC + * @param Remap This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_ADC24_RMP_DMA2_CH12 (*) + * @arg @ref LL_SYSCFG_ADC24_RMP_DMA2_CH34 (*) + * @arg @ref LL_SYSCFG_ADC2_RMP_DMA1_CH2 (*) + * @arg @ref LL_SYSCFG_ADC2_RMP_DMA1_CH4 (*) + * @arg @ref LL_SYSCFG_ADC2_RMP_DMA2 (*) + * @arg @ref LL_SYSCFG_ADC2_RMP_DMA1 (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_SetRemapDMA_ADC(uint32_t Remap) +{ + __IO uint32_t *reg = (__IO uint32_t *)(uint32_t)(SYSCFG_BASE + (Remap >> 24U)); + MODIFY_REG(*reg, (Remap & 0x00FF0000U) >> 8U, (Remap & 0x0000FFFFU)); +} +#endif /* SYSCFG_CFGR1_ADC24_DMA_RMP || SYSCFG_CFGR3_ADC2_DMA_RMP */ + +/** + * @brief Set DMA request remapping bits for DAC + * @rmtoll SYSCFG_CFGR1 TIM6DAC1Ch1_DMA_RMP LL_SYSCFG_SetRemapDMA_DAC\n + * SYSCFG_CFGR1 DAC2Ch1_DMA_RMP LL_SYSCFG_SetRemapDMA_DAC + * @param Remap This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_DAC1_CH1_RMP_DMA2_CH3 + * @arg @ref LL_SYSCFG_DAC1_CH1_RMP_DMA1_CH3 + * @arg @ref LL_SYSCFG_DAC1_OUT2_RMP_DMA2_CH4 (*) + * @arg @ref LL_SYSCFG_DAC1_OUT2_RMP_DMA1_CH4 (*) + * @arg @ref LL_SYSCFG_DAC2_OUT1_RMP_DMA2_CH5 (*) + * @arg @ref LL_SYSCFG_DAC2_OUT1_RMP_DMA1_CH5 (*) + * @arg @ref LL_SYSCFG_DAC2_CH1_RMP_NO (*) + * @arg @ref LL_SYSCFG_DAC2_CH1_RMP_DMA1_CH5 (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_SetRemapDMA_DAC(uint32_t Remap) +{ + MODIFY_REG(SYSCFG->CFGR1, (Remap & 0x00FF0000U) >> 8U, (Remap & 0x0000FF00U)); +} + +/** + * @brief Set DMA request remapping bits for TIM + * @rmtoll SYSCFG_CFGR1 TIM16_DMA_RMP LL_SYSCFG_SetRemapDMA_TIM\n + * SYSCFG_CFGR1 TIM17_DMA_RMP LL_SYSCFG_SetRemapDMA_TIM\n + * SYSCFG_CFGR1 TIM6DAC1Ch1_DMA_RMP LL_SYSCFG_SetRemapDMA_TIM\n + * SYSCFG_CFGR1 TIM7DAC1Ch2_DMA_RMP LL_SYSCFG_SetRemapDMA_TIM\n + * SYSCFG_CFGR1 TIM18DAC2Ch1_DMA_RMP LL_SYSCFG_SetRemapDMA_TIM + * @param Remap This parameter can be a combination of the following values: + * @arg @ref LL_SYSCFG_TIM16_RMP_DMA1_CH3 or @ref LL_SYSCFG_TIM16_RMP_DMA1_CH6 + * @arg @ref LL_SYSCFG_TIM17_RMP_DMA1_CH1 or @ref LL_SYSCFG_TIM17_RMP_DMA1_CH7 + * @arg @ref LL_SYSCFG_TIM6_RMP_DMA2_CH3 or @ref LL_SYSCFG_TIM6_RMP_DMA1_CH3 + * @arg @ref LL_SYSCFG_TIM7_RMP_DMA2_CH4 or @ref LL_SYSCFG_TIM7_RMP_DMA1_CH4 (*) + * @arg @ref LL_SYSCFG_TIM18_RMP_DMA2_CH5 or @ref LL_SYSCFG_TIM18_RMP_DMA1_CH5 (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_SetRemapDMA_TIM(uint32_t Remap) +{ + MODIFY_REG(SYSCFG->CFGR1, (Remap & 0x00FF0000U) >> 8U, (Remap & 0x0000FF00U)); +} + +#if defined(SYSCFG_CFGR1_TIM1_ITR3_RMP) || defined(SYSCFG_CFGR1_ENCODER_MODE) +/** + * @brief Set Timer input remap + * @rmtoll SYSCFG_CFGR1 TIM1_ITR3_RMP LL_SYSCFG_SetRemapInput_TIM\n + * SYSCFG_CFGR1 ENCODER_MODE LL_SYSCFG_SetRemapInput_TIM + * @param Remap This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_TIM1_ITR3_RMP_TIM4_TRGO (*) + * @arg @ref LL_SYSCFG_TIM1_ITR3_RMP_TIM17_OC (*) + * @arg @ref LL_SYSCFG_TIM15_ENCODEMODE_NOREDIRECTION (*) + * @arg @ref LL_SYSCFG_TIM15_ENCODEMODE_TIM2 (*) + * @arg @ref LL_SYSCFG_TIM15_ENCODEMODE_TIM3 (*) + * @arg @ref LL_SYSCFG_TIM15_ENCODEMODE_TIM4 (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_SetRemapInput_TIM(uint32_t Remap) +{ + MODIFY_REG(SYSCFG->CFGR1, (Remap & 0xFF00FF00U) >> 8U, (Remap & 0x00FF00FFU)); +} +#endif /* SYSCFG_CFGR1_TIM1_ITR3_RMP || SYSCFG_CFGR1_ENCODER_MODE */ + +#if defined(SYSCFG_CFGR4_ADC12_EXT2_RMP) +/** + * @brief Set ADC Trigger remap + * @rmtoll SYSCFG_CFGR4 ADC12_EXT2_RMP LL_SYSCFG_SetRemapTrigger_ADC\n + * SYSCFG_CFGR4 ADC12_EXT3_RMP LL_SYSCFG_SetRemapTrigger_ADC\n + * SYSCFG_CFGR4 ADC12_EXT5_RMP LL_SYSCFG_SetRemapTrigger_ADC\n + * SYSCFG_CFGR4 ADC12_EXT13_RMP LL_SYSCFG_SetRemapTrigger_ADC\n + * SYSCFG_CFGR4 ADC12_EXT15_RMP LL_SYSCFG_SetRemapTrigger_ADC\n + * SYSCFG_CFGR4 ADC12_JEXT3_RMP LL_SYSCFG_SetRemapTrigger_ADC\n + * SYSCFG_CFGR4 ADC12_JEXT6_RMP LL_SYSCFG_SetRemapTrigger_ADC\n + * SYSCFG_CFGR4 ADC12_JEXT13_RMP LL_SYSCFG_SetRemapTrigger_ADC\n + * SYSCFG_CFGR4 ADC34_EXT5_RMP LL_SYSCFG_SetRemapTrigger_ADC\n + * SYSCFG_CFGR4 ADC34_EXT6_RMP LL_SYSCFG_SetRemapTrigger_ADC\n + * SYSCFG_CFGR4 ADC34_EXT15_RMP LL_SYSCFG_SetRemapTrigger_ADC\n + * SYSCFG_CFGR4 ADC34_JEXT5_RMP LL_SYSCFG_SetRemapTrigger_ADC\n + * SYSCFG_CFGR4 ADC34_JEXT11_RMP LL_SYSCFG_SetRemapTrigger_ADC\n + * SYSCFG_CFGR4 ADC34_JEXT14_RMP LL_SYSCFG_SetRemapTrigger_ADC + * @param Remap This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_ADC12_EXT2_RMP_TIM1_CC3 + * @arg @ref LL_SYSCFG_ADC12_EXT2_RMP_TIM20_TRGO + * @arg @ref LL_SYSCFG_ADC12_EXT3_RMP_TIM2_CC2 + * @arg @ref LL_SYSCFG_ADC12_EXT3_RMP_TIM20_TRGO2 + * @arg @ref LL_SYSCFG_ADC12_EXT5_RMP_TIM4_CC4 + * @arg @ref LL_SYSCFG_ADC12_EXT5_RMP_TIM20_CC1 + * @arg @ref LL_SYSCFG_ADC12_EXT13_RMP_TIM6_TRGO + * @arg @ref LL_SYSCFG_ADC12_EXT13_RMP_TIM20_CC2 + * @arg @ref LL_SYSCFG_ADC12_EXT15_RMP_TIM3_CC4 + * @arg @ref LL_SYSCFG_ADC12_EXT15_RMP_TIM20_CC3 + * @arg @ref LL_SYSCFG_ADC12_JEXT3_RMP_TIM2_CC1 + * @arg @ref LL_SYSCFG_ADC12_JEXT3_RMP_TIM20_TRGO + * @arg @ref LL_SYSCFG_ADC12_JEXT6_RMP_EXTI_LINE_15 + * @arg @ref LL_SYSCFG_ADC12_JEXT6_RMP_TIM20_TRGO2 + * @arg @ref LL_SYSCFG_ADC12_JEXT13_RMP_TIM3_CC1 + * @arg @ref LL_SYSCFG_ADC12_JEXT13_RMP_TIM20_CC4 + * @arg @ref LL_SYSCFG_ADC34_EXT5_RMP_EXTI_LINE_2 + * @arg @ref LL_SYSCFG_ADC34_EXT5_RMP_TIM20_TRGO + * @arg @ref LL_SYSCFG_ADC34_EXT6_RMP_TIM4_CC1 + * @arg @ref LL_SYSCFG_ADC34_EXT6_RMP_TIM20_TRGO2 + * @arg @ref LL_SYSCFG_ADC34_EXT15_RMP_TIM2_CC1 + * @arg @ref LL_SYSCFG_ADC34_EXT15_RMP_TIM20_CC1 + * @arg @ref LL_SYSCFG_ADC34_JEXT5_RMP_TIM4_CC3 + * @arg @ref LL_SYSCFG_ADC34_JEXT5_RMP_TIM20_TRGO + * @arg @ref LL_SYSCFG_ADC34_JEXT11_RMP_TIM1_CC3 + * @arg @ref LL_SYSCFG_ADC34_JEXT11_RMP_TIM20_TRGO2 + * @arg @ref LL_SYSCFG_ADC34_JEXT14_RMP_TIM7_TRGO + * @arg @ref LL_SYSCFG_ADC34_JEXT14_RMP_TIM20_CC2 + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_SetRemapTrigger_ADC(uint32_t Remap) +{ + MODIFY_REG(SYSCFG->CFGR4, (Remap & 0xFFFF0000U) >> 16U, (Remap & 0x0000FFFFU)); +} +#endif /* SYSCFG_CFGR4_ADC12_EXT2_RMP */ + +#if defined(SYSCFG_CFGR1_DAC1_TRIG1_RMP) || defined(SYSCFG_CFGR3_TRIGGER_RMP) +/** + * @brief Set DAC Trigger remap + * @rmtoll SYSCFG_CFGR1 DAC1_TRIG1_RMP LL_SYSCFG_SetRemapTrigger_DAC\n + * SYSCFG_CFGR3 DAC1_TRG3_RMP LL_SYSCFG_SetRemapTrigger_DAC\n + * SYSCFG_CFGR3 DAC1_TRG5_RMP LL_SYSCFG_SetRemapTrigger_DAC + * @param Remap This parameter can be one of the following values: + * @arg @ref LL_SYSCFG_DAC1_TRIG1_RMP_TIM8_TRGO (*) + * @arg @ref LL_SYSCFG_DAC1_TRIG1_RMP_TIM3_TRGO (*) + * @arg @ref LL_SYSCFG_DAC1_TRIG3_RMP_TIM15_TRGO (*) + * @arg @ref LL_SYSCFG_DAC1_TRIG3_RMP_HRTIM1_DAC1_TRIG1 (*) + * @arg @ref LL_SYSCFG_DAC1_TRIG5_RMP_NO (*) + * @arg @ref LL_SYSCFG_DAC1_TRIG5_RMP_HRTIM1_DAC1_TRIG2 (*) + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_SetRemapTrigger_DAC(uint32_t Remap) +{ + __IO uint32_t *reg = (__IO uint32_t *)(uint32_t)(SYSCFG_BASE + (Remap >> 24U)); + MODIFY_REG(*reg, (Remap & 0x00F00F00U) >> 4U, (Remap & 0x000F00F0U)); +} +#endif /* SYSCFG_CFGR1_DAC1_TRIG1_RMP || SYSCFG_CFGR3_TRIGGER_RMP */ + +#if defined(SYSCFG_CFGR1_USB_IT_RMP) +/** + * @brief Enable USB interrupt remap + * @note Remap the USB interrupts (USB_HP, USB_LP and USB_WKUP) on interrupt lines 74, 75 and 76 + * respectively + * @rmtoll SYSCFG_CFGR1 USB_IT_RMP LL_SYSCFG_EnableRemapIT_USB + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_EnableRemapIT_USB(void) +{ + SET_BIT(SYSCFG->CFGR1, SYSCFG_CFGR1_USB_IT_RMP); +} + +/** + * @brief Disable USB interrupt remap + * @rmtoll SYSCFG_CFGR1 USB_IT_RMP LL_SYSCFG_DisableRemapIT_USB + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DisableRemapIT_USB(void) +{ + CLEAR_BIT(SYSCFG->CFGR1, SYSCFG_CFGR1_USB_IT_RMP); +} +#endif /* SYSCFG_CFGR1_USB_IT_RMP */ + +#if defined(SYSCFG_CFGR1_VBAT) +/** + * @brief Enable VBAT monitoring (to enable the power switch to deliver VBAT voltage on ADC channel 18 input) + * @rmtoll SYSCFG_CFGR1 VBAT LL_SYSCFG_EnableVBATMonitoring + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_EnableVBATMonitoring(void) +{ + SET_BIT(SYSCFG->CFGR1, SYSCFG_CFGR1_VBAT); +} + +/** + * @brief Disable VBAT monitoring + * @rmtoll SYSCFG_CFGR1 VBAT LL_SYSCFG_DisableVBATMonitoring + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DisableVBATMonitoring(void) +{ + CLEAR_BIT(SYSCFG->CFGR1, SYSCFG_CFGR1_VBAT); +} +#endif /* SYSCFG_CFGR1_VBAT */ + +/** + * @brief Enable the I2C fast mode plus driving capability. + * @rmtoll SYSCFG_CFGR1 I2C_PB6_FMP LL_SYSCFG_EnableFastModePlus\n + * SYSCFG_CFGR1 I2C_PB7_FMP LL_SYSCFG_EnableFastModePlus\n + * SYSCFG_CFGR1 I2C_PB8_FMP LL_SYSCFG_EnableFastModePlus\n + * SYSCFG_CFGR1 I2C_PB9_FMP LL_SYSCFG_EnableFastModePlus\n + * SYSCFG_CFGR1 I2C1_FMP LL_SYSCFG_EnableFastModePlus\n + * SYSCFG_CFGR1 I2C2_FMP LL_SYSCFG_EnableFastModePlus\n + * SYSCFG_CFGR1 I2C3_FMP LL_SYSCFG_EnableFastModePlus + * @param ConfigFastModePlus This parameter can be a combination of the following values: + * @arg @ref LL_SYSCFG_I2C_FASTMODEPLUS_PB6 + * @arg @ref LL_SYSCFG_I2C_FASTMODEPLUS_PB7 + * @arg @ref LL_SYSCFG_I2C_FASTMODEPLUS_PB8 + * @arg @ref LL_SYSCFG_I2C_FASTMODEPLUS_PB9 + * @arg @ref LL_SYSCFG_I2C_FASTMODEPLUS_I2C1 + * @arg @ref LL_SYSCFG_I2C_FASTMODEPLUS_I2C2 (*) + * @arg @ref LL_SYSCFG_I2C_FASTMODEPLUS_I2C3 (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_EnableFastModePlus(uint32_t ConfigFastModePlus) +{ + SET_BIT(SYSCFG->CFGR1, ConfigFastModePlus); +} + +/** + * @brief Disable the I2C fast mode plus driving capability. + * @rmtoll SYSCFG_CFGR1 I2C_PB6_FMP LL_SYSCFG_DisableFastModePlus\n + * SYSCFG_CFGR1 I2C_PB7_FMP LL_SYSCFG_DisableFastModePlus\n + * SYSCFG_CFGR1 I2C_PB8_FMP LL_SYSCFG_DisableFastModePlus\n + * SYSCFG_CFGR1 I2C_PB9_FMP LL_SYSCFG_DisableFastModePlus\n + * SYSCFG_CFGR1 I2C1_FMP LL_SYSCFG_DisableFastModePlus\n + * SYSCFG_CFGR1 I2C2_FMP LL_SYSCFG_DisableFastModePlus\n + * SYSCFG_CFGR1 I2C3_FMP LL_SYSCFG_DisableFastModePlus + * @param ConfigFastModePlus This parameter can be a combination of the following values: + * @arg @ref LL_SYSCFG_I2C_FASTMODEPLUS_PB6 + * @arg @ref LL_SYSCFG_I2C_FASTMODEPLUS_PB7 + * @arg @ref LL_SYSCFG_I2C_FASTMODEPLUS_PB8 + * @arg @ref LL_SYSCFG_I2C_FASTMODEPLUS_PB9 + * @arg @ref LL_SYSCFG_I2C_FASTMODEPLUS_I2C1 + * @arg @ref LL_SYSCFG_I2C_FASTMODEPLUS_I2C2 (*) + * @arg @ref LL_SYSCFG_I2C_FASTMODEPLUS_I2C3 (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DisableFastModePlus(uint32_t ConfigFastModePlus) +{ + CLEAR_BIT(SYSCFG->CFGR1, ConfigFastModePlus); +} + +/** + * @brief Enable Floating Point Unit Invalid operation Interrupt + * @rmtoll SYSCFG_CFGR1 FPU_IE_0 LL_SYSCFG_EnableIT_FPU_IOC + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_EnableIT_FPU_IOC(void) +{ + SET_BIT(SYSCFG->CFGR1, SYSCFG_CFGR1_FPU_IE_0); +} + +/** + * @brief Enable Floating Point Unit Divide-by-zero Interrupt + * @rmtoll SYSCFG_CFGR1 FPU_IE_1 LL_SYSCFG_EnableIT_FPU_DZC + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_EnableIT_FPU_DZC(void) +{ + SET_BIT(SYSCFG->CFGR1, SYSCFG_CFGR1_FPU_IE_1); +} + +/** + * @brief Enable Floating Point Unit Underflow Interrupt + * @rmtoll SYSCFG_CFGR1 FPU_IE_2 LL_SYSCFG_EnableIT_FPU_UFC + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_EnableIT_FPU_UFC(void) +{ + SET_BIT(SYSCFG->CFGR1, SYSCFG_CFGR1_FPU_IE_2); +} + +/** + * @brief Enable Floating Point Unit Overflow Interrupt + * @rmtoll SYSCFG_CFGR1 FPU_IE_3 LL_SYSCFG_EnableIT_FPU_OFC + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_EnableIT_FPU_OFC(void) +{ + SET_BIT(SYSCFG->CFGR1, SYSCFG_CFGR1_FPU_IE_3); +} + +/** + * @brief Enable Floating Point Unit Input denormal Interrupt + * @rmtoll SYSCFG_CFGR1 FPU_IE_4 LL_SYSCFG_EnableIT_FPU_IDC + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_EnableIT_FPU_IDC(void) +{ + SET_BIT(SYSCFG->CFGR1, SYSCFG_CFGR1_FPU_IE_4); +} + +/** + * @brief Enable Floating Point Unit Inexact Interrupt + * @rmtoll SYSCFG_CFGR1 FPU_IE_5 LL_SYSCFG_EnableIT_FPU_IXC + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_EnableIT_FPU_IXC(void) +{ + SET_BIT(SYSCFG->CFGR1, SYSCFG_CFGR1_FPU_IE_5); +} + +/** + * @brief Disable Floating Point Unit Invalid operation Interrupt + * @rmtoll SYSCFG_CFGR1 FPU_IE_0 LL_SYSCFG_DisableIT_FPU_IOC + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DisableIT_FPU_IOC(void) +{ + CLEAR_BIT(SYSCFG->CFGR1, SYSCFG_CFGR1_FPU_IE_0); +} + +/** + * @brief Disable Floating Point Unit Divide-by-zero Interrupt + * @rmtoll SYSCFG_CFGR1 FPU_IE_1 LL_SYSCFG_DisableIT_FPU_DZC + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DisableIT_FPU_DZC(void) +{ + CLEAR_BIT(SYSCFG->CFGR1, SYSCFG_CFGR1_FPU_IE_1); +} + +/** + * @brief Disable Floating Point Unit Underflow Interrupt + * @rmtoll SYSCFG_CFGR1 FPU_IE_2 LL_SYSCFG_DisableIT_FPU_UFC + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DisableIT_FPU_UFC(void) +{ + CLEAR_BIT(SYSCFG->CFGR1, SYSCFG_CFGR1_FPU_IE_2); +} + +/** + * @brief Disable Floating Point Unit Overflow Interrupt + * @rmtoll SYSCFG_CFGR1 FPU_IE_3 LL_SYSCFG_DisableIT_FPU_OFC + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DisableIT_FPU_OFC(void) +{ + CLEAR_BIT(SYSCFG->CFGR1, SYSCFG_CFGR1_FPU_IE_3); +} + +/** + * @brief Disable Floating Point Unit Input denormal Interrupt + * @rmtoll SYSCFG_CFGR1 FPU_IE_4 LL_SYSCFG_DisableIT_FPU_IDC + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DisableIT_FPU_IDC(void) +{ + CLEAR_BIT(SYSCFG->CFGR1, SYSCFG_CFGR1_FPU_IE_4); +} + +/** + * @brief Disable Floating Point Unit Inexact Interrupt + * @rmtoll SYSCFG_CFGR1 FPU_IE_5 LL_SYSCFG_DisableIT_FPU_IXC + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DisableIT_FPU_IXC(void) +{ + CLEAR_BIT(SYSCFG->CFGR1, SYSCFG_CFGR1_FPU_IE_5); +} + +/** + * @brief Check if Floating Point Unit Invalid operation Interrupt source is enabled or disabled. + * @rmtoll SYSCFG_CFGR1 FPU_IE_0 LL_SYSCFG_IsEnabledIT_FPU_IOC + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SYSCFG_IsEnabledIT_FPU_IOC(void) +{ + return (READ_BIT(SYSCFG->CFGR1, SYSCFG_CFGR1_FPU_IE_0) == (SYSCFG_CFGR1_FPU_IE_0)); +} + +/** + * @brief Check if Floating Point Unit Divide-by-zero Interrupt source is enabled or disabled. + * @rmtoll SYSCFG_CFGR1 FPU_IE_1 LL_SYSCFG_IsEnabledIT_FPU_DZC + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SYSCFG_IsEnabledIT_FPU_DZC(void) +{ + return (READ_BIT(SYSCFG->CFGR1, SYSCFG_CFGR1_FPU_IE_1) == (SYSCFG_CFGR1_FPU_IE_1)); +} + +/** + * @brief Check if Floating Point Unit Underflow Interrupt source is enabled or disabled. + * @rmtoll SYSCFG_CFGR1 FPU_IE_2 LL_SYSCFG_IsEnabledIT_FPU_UFC + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SYSCFG_IsEnabledIT_FPU_UFC(void) +{ + return (READ_BIT(SYSCFG->CFGR1, SYSCFG_CFGR1_FPU_IE_2) == (SYSCFG_CFGR1_FPU_IE_2)); +} + +/** + * @brief Check if Floating Point Unit Overflow Interrupt source is enabled or disabled. + * @rmtoll SYSCFG_CFGR1 FPU_IE_3 LL_SYSCFG_IsEnabledIT_FPU_OFC + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SYSCFG_IsEnabledIT_FPU_OFC(void) +{ + return (READ_BIT(SYSCFG->CFGR1, SYSCFG_CFGR1_FPU_IE_3) == (SYSCFG_CFGR1_FPU_IE_3)); +} + +/** + * @brief Check if Floating Point Unit Input denormal Interrupt source is enabled or disabled. + * @rmtoll SYSCFG_CFGR1 FPU_IE_4 LL_SYSCFG_IsEnabledIT_FPU_IDC + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SYSCFG_IsEnabledIT_FPU_IDC(void) +{ + return (READ_BIT(SYSCFG->CFGR1, SYSCFG_CFGR1_FPU_IE_4) == (SYSCFG_CFGR1_FPU_IE_4)); +} + +/** + * @brief Check if Floating Point Unit Inexact Interrupt source is enabled or disabled. + * @rmtoll SYSCFG_CFGR1 FPU_IE_5 LL_SYSCFG_IsEnabledIT_FPU_IXC + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SYSCFG_IsEnabledIT_FPU_IXC(void) +{ + return (READ_BIT(SYSCFG->CFGR1, SYSCFG_CFGR1_FPU_IE_5) == (SYSCFG_CFGR1_FPU_IE_5)); +} + +/** + * @brief Configure source input for the EXTI external interrupt. + * @rmtoll SYSCFG_EXTICR1 EXTI0 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR1 EXTI1 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR1 EXTI2 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR1 EXTI3 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR1 EXTI4 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR1 EXTI5 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR1 EXTI6 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR1 EXTI7 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR1 EXTI8 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR1 EXTI9 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR1 EXTI10 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR1 EXTI11 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR1 EXTI12 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR1 EXTI13 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR1 EXTI14 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR1 EXTI15 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR2 EXTI0 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR2 EXTI1 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR2 EXTI2 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR2 EXTI3 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR2 EXTI4 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR2 EXTI5 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR2 EXTI6 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR2 EXTI7 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR2 EXTI8 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR2 EXTI9 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR2 EXTI10 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR2 EXTI11 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR2 EXTI12 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR2 EXTI13 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR2 EXTI14 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR2 EXTI15 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR3 EXTI0 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR3 EXTI1 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR3 EXTI2 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR3 EXTI3 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR3 EXTI4 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR3 EXTI5 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR3 EXTI6 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR3 EXTI7 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR3 EXTI8 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR3 EXTI9 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR3 EXTI10 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR3 EXTI11 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR3 EXTI12 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR3 EXTI13 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR3 EXTI14 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR3 EXTI15 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR4 EXTI0 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR4 EXTI1 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR4 EXTI2 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR4 EXTI3 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR4 EXTI4 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR4 EXTI5 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR4 EXTI6 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR4 EXTI7 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR4 EXTI8 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR4 EXTI9 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR4 EXTI10 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR4 EXTI11 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR4 EXTI12 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR4 EXTI13 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR4 EXTI14 LL_SYSCFG_SetEXTISource\n + * SYSCFG_EXTICR4 EXTI15 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 >> 16U), Port << POSITION_VAL((Line >> 16U))); +} + +/** + * @brief Get the configured defined for specific EXTI Line + * @rmtoll SYSCFG_EXTICR1 EXTI0 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR1 EXTI1 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR1 EXTI2 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR1 EXTI3 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR1 EXTI4 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR1 EXTI5 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR1 EXTI6 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR1 EXTI7 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR1 EXTI8 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR1 EXTI9 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR1 EXTI10 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR1 EXTI11 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR1 EXTI12 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR1 EXTI13 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR1 EXTI14 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR1 EXTI15 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR2 EXTI0 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR2 EXTI1 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR2 EXTI2 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR2 EXTI3 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR2 EXTI4 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR2 EXTI5 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR2 EXTI6 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR2 EXTI7 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR2 EXTI8 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR2 EXTI9 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR2 EXTI10 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR2 EXTI11 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR2 EXTI12 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR2 EXTI13 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR2 EXTI14 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR2 EXTI15 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR3 EXTI0 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR3 EXTI1 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR3 EXTI2 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR3 EXTI3 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR3 EXTI4 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR3 EXTI5 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR3 EXTI6 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR3 EXTI7 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR3 EXTI8 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR3 EXTI9 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR3 EXTI10 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR3 EXTI11 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR3 EXTI12 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR3 EXTI13 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR3 EXTI14 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR3 EXTI15 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR4 EXTI0 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR4 EXTI1 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR4 EXTI2 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR4 EXTI3 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR4 EXTI4 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR4 EXTI5 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR4 EXTI6 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR4 EXTI7 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR4 EXTI8 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR4 EXTI9 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR4 EXTI10 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR4 EXTI11 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR4 EXTI12 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR4 EXTI13 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR4 EXTI14 LL_SYSCFG_GetEXTISource\n + * SYSCFG_EXTICR4 EXTI15 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 >> 16U)) >> POSITION_VAL(Line >> 16U)); +} + +/** + * @brief Set connections to TIMx Break inputs + * @rmtoll SYSCFG_CFGR2 LOCKUP_LOCK LL_SYSCFG_SetTIMBreakInputs\n + * SYSCFG_CFGR2 SRAM_PARITY_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_PVD (*) + * @arg @ref LL_SYSCFG_TIMBREAK_SRAM_PARITY (*) + * @arg @ref LL_SYSCFG_TIMBREAK_LOCKUP + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_SetTIMBreakInputs(uint32_t Break) +{ + MODIFY_REG(SYSCFG->CFGR2, SYSCFG_MASK_TIM_BREAK, Break); +} + +/** + * @brief Get connections to TIMx Break inputs + * @rmtoll SYSCFG_CFGR2 LOCKUP_LOCK LL_SYSCFG_GetTIMBreakInputs\n + * SYSCFG_CFGR2 SRAM_PARITY_LOCK LL_SYSCFG_GetTIMBreakInputs\n + * SYSCFG_CFGR2 PVD_LOCK LL_SYSCFG_GetTIMBreakInputs + * @retval Returned value can be can be a combination of the following values: + * @arg @ref LL_SYSCFG_TIMBREAK_PVD (*) + * @arg @ref LL_SYSCFG_TIMBREAK_SRAM_PARITY (*) + * @arg @ref LL_SYSCFG_TIMBREAK_LOCKUP + * + * (*) value not defined in all devices. + */ +__STATIC_INLINE uint32_t LL_SYSCFG_GetTIMBreakInputs(void) +{ + return (uint32_t)(READ_BIT(SYSCFG->CFGR2, SYSCFG_MASK_TIM_BREAK)); +} + +#if defined(SYSCFG_CFGR2_BYP_ADDR_PAR) +/** + * @brief Disable RAM Parity Check Disable + * @rmtoll SYSCFG_CFGR2 BYP_ADDR_PAR LL_SYSCFG_DisableSRAMParityCheck + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_DisableSRAMParityCheck(void) +{ + SET_BIT(SYSCFG->CFGR2, SYSCFG_CFGR2_BYP_ADDR_PAR); +} +#endif /* SYSCFG_CFGR2_BYP_ADDR_PAR */ + +#if defined(SYSCFG_CFGR2_SRAM_PE) +/** + * @brief Check if SRAM parity error detected + * @rmtoll SYSCFG_CFGR2 SRAM_PE LL_SYSCFG_IsActiveFlag_SP + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_SYSCFG_IsActiveFlag_SP(void) +{ + return (READ_BIT(SYSCFG->CFGR2, SYSCFG_CFGR2_SRAM_PE) == (SYSCFG_CFGR2_SRAM_PE)); +} + +/** + * @brief Clear SRAM parity error flag + * @rmtoll SYSCFG_CFGR2 SRAM_PE LL_SYSCFG_ClearFlag_SP + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_ClearFlag_SP(void) +{ + SET_BIT(SYSCFG->CFGR2, SYSCFG_CFGR2_SRAM_PE); +} +#endif /* SYSCFG_CFGR2_SRAM_PE */ + +#if defined(SYSCFG_RCR_PAGE0) +/** + * @brief Enable CCM SRAM page write protection + * @note Write protection is cleared only by a system reset + * @rmtoll SYSCFG_RCR PAGE0 LL_SYSCFG_EnableCCM_SRAMPageWRP\n + * SYSCFG_RCR PAGE1 LL_SYSCFG_EnableCCM_SRAMPageWRP\n + * SYSCFG_RCR PAGE2 LL_SYSCFG_EnableCCM_SRAMPageWRP\n + * SYSCFG_RCR PAGE3 LL_SYSCFG_EnableCCM_SRAMPageWRP\n + * SYSCFG_RCR PAGE4 LL_SYSCFG_EnableCCM_SRAMPageWRP\n + * SYSCFG_RCR PAGE5 LL_SYSCFG_EnableCCM_SRAMPageWRP\n + * SYSCFG_RCR PAGE6 LL_SYSCFG_EnableCCM_SRAMPageWRP\n + * SYSCFG_RCR PAGE7 LL_SYSCFG_EnableCCM_SRAMPageWRP\n + * SYSCFG_RCR PAGE8 LL_SYSCFG_EnableCCM_SRAMPageWRP\n + * SYSCFG_RCR PAGE9 LL_SYSCFG_EnableCCM_SRAMPageWRP\n + * SYSCFG_RCR PAGE10 LL_SYSCFG_EnableCCM_SRAMPageWRP\n + * SYSCFG_RCR PAGE11 LL_SYSCFG_EnableCCM_SRAMPageWRP\n + * SYSCFG_RCR PAGE12 LL_SYSCFG_EnableCCM_SRAMPageWRP\n + * SYSCFG_RCR PAGE13 LL_SYSCFG_EnableCCM_SRAMPageWRP\n + * SYSCFG_RCR PAGE14 LL_SYSCFG_EnableCCM_SRAMPageWRP\n + * SYSCFG_RCR PAGE15 LL_SYSCFG_EnableCCM_SRAMPageWRP + * @param PageWRP This parameter can be a combination of the following values: + * @arg @ref LL_SYSCFG_CCMSRAMWRP_PAGE0 + * @arg @ref LL_SYSCFG_CCMSRAMWRP_PAGE1 + * @arg @ref LL_SYSCFG_CCMSRAMWRP_PAGE2 + * @arg @ref LL_SYSCFG_CCMSRAMWRP_PAGE3 + * @arg @ref LL_SYSCFG_CCMSRAMWRP_PAGE4 (*) + * @arg @ref LL_SYSCFG_CCMSRAMWRP_PAGE5 (*) + * @arg @ref LL_SYSCFG_CCMSRAMWRP_PAGE6 (*) + * @arg @ref LL_SYSCFG_CCMSRAMWRP_PAGE7 (*) + * @arg @ref LL_SYSCFG_CCMSRAMWRP_PAGE8 (*) + * @arg @ref LL_SYSCFG_CCMSRAMWRP_PAGE9 (*) + * @arg @ref LL_SYSCFG_CCMSRAMWRP_PAGE10 (*) + * @arg @ref LL_SYSCFG_CCMSRAMWRP_PAGE11 (*) + * @arg @ref LL_SYSCFG_CCMSRAMWRP_PAGE12 (*) + * @arg @ref LL_SYSCFG_CCMSRAMWRP_PAGE13 (*) + * @arg @ref LL_SYSCFG_CCMSRAMWRP_PAGE14 (*) + * @arg @ref LL_SYSCFG_CCMSRAMWRP_PAGE15 (*) + * + * (*) value not defined in all devices. + * @retval None + */ +__STATIC_INLINE void LL_SYSCFG_EnableCCM_SRAMPageWRP(uint32_t PageWRP) +{ + SET_BIT(SYSCFG->RCR, PageWRP); +} +#endif /* SYSCFG_RCR_PAGE0 */ + +/** + * @} + */ + +/** @defgroup SYSTEM_LL_EF_DBGMCU DBGMCU + * @{ + */ + +/** + * @brief Return the device identifier + * @note For STM32F303xC, STM32F358xx and STM32F302xC devices, the device ID is 0x422 + * @note For STM32F373xx and STM32F378xx devices, the device ID is 0x432 + * @note For STM32F303x8, STM32F334xx and STM32F328xx devices, the device ID is 0x438. + * @note For STM32F302x8, STM32F301x8 and STM32F318xx devices, the device ID is 0x439 + * @note For STM32F303xE, STM32F398xx and STM32F302xE devices, the device ID is 0x446 + * @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. + * @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 APB1_FZ DBG_TIM2_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * APB1_FZ DBG_TIM3_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * APB1_FZ DBG_TIM4_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * APB1_FZ DBG_TIM5_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * APB1_FZ DBG_TIM6_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * APB1_FZ DBG_TIM7_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * APB1_FZ DBG_TIM12_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * APB1_FZ DBG_TIM13_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * APB1_FZ DBG_TIM14_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * APB1_FZ DBG_TIM18_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * APB1_FZ DBG_RTC_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * APB1_FZ DBG_WWDG_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * APB1_FZ DBG_IWDG_STOP LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * APB1_FZ DBG_I2C1_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * APB1_FZ DBG_I2C2_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * APB1_FZ DBG_I2C3_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_FreezePeriph\n + * APB1_FZ DBG_CAN_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_TIM18_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_CAN_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 APB1_FZ DBG_TIM2_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * APB1_FZ DBG_TIM3_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * APB1_FZ DBG_TIM4_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * APB1_FZ DBG_TIM5_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * APB1_FZ DBG_TIM6_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * APB1_FZ DBG_TIM7_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * APB1_FZ DBG_TIM12_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * APB1_FZ DBG_TIM13_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * APB1_FZ DBG_TIM14_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * APB1_FZ DBG_TIM18_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * APB1_FZ DBG_RTC_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * APB1_FZ DBG_WWDG_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * APB1_FZ DBG_IWDG_STOP LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * APB1_FZ DBG_I2C1_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * APB1_FZ DBG_I2C2_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * APB1_FZ DBG_I2C3_SMBUS_TIMEOUT LL_DBGMCU_APB1_GRP1_UnFreezePeriph\n + * APB1_FZ DBG_CAN_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_TIM18_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_CAN_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 APB2_FZ DBG_TIM1_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph\n + * APB2_FZ DBG_TIM8_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph\n + * APB2_FZ DBG_TIM15_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph\n + * APB2_FZ DBG_TIM16_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph\n + * APB2_FZ DBG_TIM17_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph\n + * APB2_FZ DBG_TIM19_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph\n + * APB2_FZ DBG_TIM20_STOP LL_DBGMCU_APB2_GRP1_FreezePeriph\n + * APB2_FZ DBG_HRTIM1_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_TIM15_STOP + * @arg @ref LL_DBGMCU_APB2_GRP1_TIM16_STOP + * @arg @ref LL_DBGMCU_APB2_GRP1_TIM17_STOP + * @arg @ref LL_DBGMCU_APB2_GRP1_TIM19_STOP (*) + * @arg @ref LL_DBGMCU_APB2_GRP1_TIM20_STOP (*) + * @arg @ref LL_DBGMCU_APB2_GRP1_HRTIM1_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 APB2_FZ DBG_TIM1_STOP LL_DBGMCU_APB2_GRP1_UnFreezePeriph\n + * APB2_FZ DBG_TIM8_STOP LL_DBGMCU_APB2_GRP1_UnFreezePeriph\n + * APB2_FZ DBG_TIM15_STOP LL_DBGMCU_APB2_GRP1_UnFreezePeriph\n + * APB2_FZ DBG_TIM16_STOP LL_DBGMCU_APB2_GRP1_UnFreezePeriph\n + * APB2_FZ DBG_TIM17_STOP LL_DBGMCU_APB2_GRP1_UnFreezePeriph\n + * APB2_FZ DBG_TIM19_STOP LL_DBGMCU_APB2_GRP1_UnFreezePeriph\n + * APB2_FZ DBG_TIM20_STOP LL_DBGMCU_APB2_GRP1_UnFreezePeriph\n + * APB2_FZ DBG_HRTIM1_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_TIM15_STOP + * @arg @ref LL_DBGMCU_APB2_GRP1_TIM16_STOP + * @arg @ref LL_DBGMCU_APB2_GRP1_TIM17_STOP + * @arg @ref LL_DBGMCU_APB2_GRP1_TIM19_STOP (*) + * @arg @ref LL_DBGMCU_APB2_GRP1_TIM20_STOP (*) + * @arg @ref LL_DBGMCU_APB2_GRP1_HRTIM1_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 + * @retval None + */ +__STATIC_INLINE void LL_FLASH_SetLatency(uint32_t Latency) +{ + MODIFY_REG(FLASH->ACR, FLASH_ACR_LATENCY, Latency); +} + +/** + * @brief Get FLASH Latency + * @rmtoll FLASH_ACR LATENCY LL_FLASH_GetLatency + * @retval Returned value can be one of the following values: + * @arg @ref LL_FLASH_LATENCY_0 + * @arg @ref LL_FLASH_LATENCY_1 + * @arg @ref LL_FLASH_LATENCY_2 + */ +__STATIC_INLINE uint32_t LL_FLASH_GetLatency(void) +{ + return (uint32_t)(READ_BIT(FLASH->ACR, FLASH_ACR_LATENCY)); +} + +/** + * @brief Enable Prefetch + * @rmtoll FLASH_ACR PRFTBE LL_FLASH_EnablePrefetch + * @retval None + */ +__STATIC_INLINE void LL_FLASH_EnablePrefetch(void) +{ + SET_BIT(FLASH->ACR, FLASH_ACR_PRFTBE ); +} + +/** + * @brief Disable Prefetch + * @rmtoll FLASH_ACR PRFTBE LL_FLASH_DisablePrefetch + * @retval None + */ +__STATIC_INLINE void LL_FLASH_DisablePrefetch(void) +{ + CLEAR_BIT(FLASH->ACR, FLASH_ACR_PRFTBE ); +} + +/** + * @brief Check if Prefetch buffer is enabled + * @rmtoll FLASH_ACR PRFTBS LL_FLASH_IsPrefetchEnabled + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_FLASH_IsPrefetchEnabled(void) +{ + return (READ_BIT(FLASH->ACR, FLASH_ACR_PRFTBS) == (FLASH_ACR_PRFTBS)); +} + +#if defined(FLASH_ACR_HLFCYA) +/** + * @brief Enable Flash Half Cycle Access + * @rmtoll FLASH_ACR HLFCYA LL_FLASH_EnableHalfCycleAccess + * @retval None + */ +__STATIC_INLINE void LL_FLASH_EnableHalfCycleAccess(void) +{ + SET_BIT(FLASH->ACR, FLASH_ACR_HLFCYA); +} + +/** + * @brief Disable Flash Half Cycle Access + * @rmtoll FLASH_ACR HLFCYA LL_FLASH_DisableHalfCycleAccess + * @retval None + */ +__STATIC_INLINE void LL_FLASH_DisableHalfCycleAccess(void) +{ + CLEAR_BIT(FLASH->ACR, FLASH_ACR_HLFCYA); +} + +/** + * @brief Check if Flash Half Cycle Access is enabled or not + * @rmtoll FLASH_ACR HLFCYA LL_FLASH_IsHalfCycleAccessEnabled + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_FLASH_IsHalfCycleAccessEnabled(void) +{ + return (READ_BIT(FLASH->ACR, FLASH_ACR_HLFCYA) == (FLASH_ACR_HLFCYA)); +} +#endif /* FLASH_ACR_HLFCYA */ + + + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* defined (FLASH) || defined (SYSCFG) || defined (DBGMCU) */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F3xx_LL_SYSTEM_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_utils.h b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_utils.h new file mode 100644 index 0000000..0c18159 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_ll_utils.h @@ -0,0 +1,282 @@ +/** + ****************************************************************************** + * @file stm32f3xx_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) 2016 STMicroelectronics. + * All rights reserved.

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F3xx_LL_UTILS_H +#define __STM32F3xx_LL_UTILS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f3xx.h" + +/** @addtogroup STM32F3xx_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 PLLMul; /*!< Multiplication factor for PLL VCO input clock. + This parameter can be a value of @ref RCC_LL_EC_PLL_MUL + + This feature can be modified afterwards using unitary function + @ref LL_RCC_PLL_ConfigDomain_SYS(). */ + +#if defined(RCC_PLLSRC_PREDIV1_SUPPORT) + uint32_t PLLDiv; /*!< Division factor for PLL VCO output clock. + This parameter can be a value of @ref RCC_LL_EC_PREDIV_DIV + + This feature can be modified afterwards using unitary function + @ref LL_RCC_PLL_ConfigDomain_SYS(). */ +#else + uint32_t Prediv; /*!< Division factor for HSE used as PLL clock source. + This parameter can be a value of @ref RCC_LL_EC_PREDIV_DIV + + This feature can be modified afterwards using unitary function + @ref LL_RCC_PLL_ConfigDomain_SYS(). */ +#endif /* RCC_PLLSRC_PREDIV1_SUPPORT */ +} LL_UTILS_PLLInitTypeDef; + +/** + * @brief UTILS System, AHB and APB buses clock configuration structure definition + */ +typedef struct +{ + uint32_t AHBCLKDivider; /*!< The AHB clock (HCLK) divider. This clock is derived from the system clock (SYSCLK). + This parameter can be a value of @ref RCC_LL_EC_SYSCLK_DIV + + This feature can be modified afterwards using unitary function + @ref LL_RCC_SetAHBPrescaler(). */ + + uint32_t APB1CLKDivider; /*!< The APB1 clock (PCLK1) divider. This clock is derived from the AHB clock (HCLK). + This parameter can be a value of @ref RCC_LL_EC_APB1_DIV + + This feature can be modified afterwards using unitary function + @ref LL_RCC_SetAPB1Prescaler(). */ + + uint32_t APB2CLKDivider; /*!< The APB2 clock (PCLK2) divider. This clock is derived from the AHB clock (HCLK). + This parameter can be a value of @ref RCC_LL_EC_APB2_DIV + + This feature can be modified afterwards using unitary function + @ref LL_RCC_SetAPB2Prescaler(). */ + +} LL_UTILS_ClkInitTypeDef; + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/** @defgroup UTILS_LL_Exported_Constants UTILS Exported Constants + * @{ + */ + +/** @defgroup UTILS_EC_HSE_BYPASS HSE Bypass activation + * @{ + */ +#define LL_UTILS_HSEBYPASS_OFF 0x00000000U /*!< HSE Bypass is not enabled */ +#define LL_UTILS_HSEBYPASS_ON 0x00000001U /*!< HSE Bypass is enabled */ +/** + * @} + */ + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup UTILS_LL_Exported_Functions UTILS Exported Functions + * @{ + */ + +/** @defgroup UTILS_EF_DEVICE_ELECTRONIC_SIGNATURE DEVICE ELECTRONIC SIGNATURE + * @{ + */ + +/** + * @brief Get Word0 of the unique device identifier (UID based on 96 bits) + * @retval UID[31:0]: X and Y coordinates on the wafer expressed in BCD format + */ +__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]: Wafer number (UID[39:32]) & LOT_NUM[23:0] (UID[63:40]) + */ +__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]: Lot number (ASCII encoded) - LOT_NUM[55:24] + */ +__STATIC_INLINE uint32_t LL_GetUID_Word2(void) +{ + return (uint32_t)(READ_REG(*((uint32_t *)(UID_BASE_ADDRESS + 8U)))); +} + +/** + * @brief Get Flash memory size + * @note This bitfield indicates the size of the device Flash memory expressed in + * Kbytes. As an example, 0x040 corresponds to 64 Kbytes. + * @retval FLASH_SIZE[15:0]: Flash memory size + */ +__STATIC_INLINE uint32_t LL_GetFlashSize(void) +{ + return (uint16_t)(READ_REG(*((uint32_t *)FLASHSIZE_BASE_ADDRESS))); +} + + +/** + * @} + */ + +/** @defgroup UTILS_LL_EF_DELAY DELAY + * @{ + */ + +/** + * @brief This function configures the Cortex-M SysTick source of the time base. + * @param HCLKFrequency HCLK frequency in Hz (can be calculated thanks to RCC helper macro) + * @note When a RTOS is used, it is recommended to avoid changing the SysTick + * configuration by calling this function, for a delay use rather osDelay RTOS service. + * @param Ticks Number of ticks + * @retval None + */ +__STATIC_INLINE void LL_InitTick(uint32_t HCLKFrequency, uint32_t Ticks) +{ + /* Configure the SysTick to have interrupt in 1ms time base */ + SysTick->LOAD = (uint32_t)((HCLKFrequency / Ticks) - 1UL); /* set reload register */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable the Systick Timer */ +} + +void LL_Init1msTick(uint32_t HCLKFrequency); +void LL_mDelay(uint32_t Delay); + +/** + * @} + */ + +/** @defgroup UTILS_EF_SYSTEM SYSTEM + * @{ + */ + +void LL_SetSystemCoreClock(uint32_t HCLKFrequency); +#if defined(FLASH_ACR_LATENCY) +ErrorStatus LL_SetFlashLatency(uint32_t Frequency); +#endif /* FLASH_ACR_LATENCY */ +ErrorStatus LL_PLL_ConfigSystemClock_HSI(LL_UTILS_PLLInitTypeDef *UTILS_PLLInitStruct, + LL_UTILS_ClkInitTypeDef *UTILS_ClkInitStruct); +ErrorStatus LL_PLL_ConfigSystemClock_HSE(uint32_t HSEFrequency, uint32_t HSEBypass, + LL_UTILS_PLLInitTypeDef *UTILS_PLLInitStruct, LL_UTILS_ClkInitTypeDef *UTILS_ClkInitStruct); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F3xx_LL_UTILS_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/License.md b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/License.md new file mode 100644 index 0000000..d12cc8e --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/License.md @@ -0,0 +1,3 @@ +# Copyright (c) 2016 STMicroelectronics + +This software component is licensed by STMicroelectronics under the **BSD-3-Clause** license. You may not use this software except in compliance with this license. You may obtain a copy of the license [here](https://opensource.org/licenses/BSD-3-Clause). \ No newline at end of file diff --git a/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c new file mode 100644 index 0000000..56980b0 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c @@ -0,0 +1,531 @@ +/** + ****************************************************************************** + * @file stm32f3xx_hal.c + * @author MCD Application Team + * @brief HAL module driver. + * This is the common part of the HAL initialization + * + @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + [..] + The common HAL driver contains a set of generic and common APIs that can be + used by the PPP peripheral drivers and the user to start using the HAL. + [..] + The HAL contains two APIs categories: + (+) HAL Initialization and de-initialization functions + (+) HAL Control functions + + @endverbatim + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f3xx_hal.h" + +/** @addtogroup STM32F3xx_HAL_Driver + * @{ + */ + +/** @defgroup HAL HAL + * @brief HAL module driver. + * @{ + */ + +#ifdef HAL_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @defgroup HAL_Private Constants + * @{ + */ +/** + * @brief STM32F3xx HAL Driver version number V1.5.6 + */ +#define __STM32F3xx_HAL_VERSION_MAIN (0x01U) /*!< [31:24] main version */ +#define __STM32F3xx_HAL_VERSION_SUB1 (0x05U) /*!< [23:16] sub1 version */ +#define __STM32F3xx_HAL_VERSION_SUB2 (0x06U) /*!< [15:8] sub2 version */ +#define __STM32F3xx_HAL_VERSION_RC (0x00U) /*!< [7:0] release candidate */ +#define __STM32F3xx_HAL_VERSION ((__STM32F3xx_HAL_VERSION_MAIN << 24U)\ + |(__STM32F3xx_HAL_VERSION_SUB1 << 16U)\ + |(__STM32F3xx_HAL_VERSION_SUB2 << 8U )\ + |(__STM32F3xx_HAL_VERSION_RC)) + +#define IDCODE_DEVID_MASK (0x00000FFFU) +/** + * @} + */ + +/* Private macro -------------------------------------------------------------*/ +/* Exported variables --------------------------------------------------------*/ +/** @defgroup HAL_Exported_Variables HAL Exported Variables + * @{ + */ +__IO uint32_t uwTick; +uint32_t uwTickPrio = (1UL << __NVIC_PRIO_BITS); /* Invalid PRIO */ +HAL_TickFreqTypeDef uwTickFreq = HAL_TICK_FREQ_DEFAULT; /* 1KHz */ +/** + * @} + */ +/* Private function prototypes -----------------------------------------------*/ +/* Exported functions ---------------------------------------------------------*/ + +/** @defgroup HAL_Exported_Functions HAL Exported Functions + * @{ + */ + +/** @defgroup HAL_Exported_Functions_Group1 Initialization and de-initialization Functions + * @brief Initialization and de-initialization functions + * +@verbatim + =============================================================================== + ##### Initialization and de-initialization functions ##### + =============================================================================== + [..] This section provides functions allowing to: + (+) Initializes the Flash interface, the NVIC allocation and initial clock + configuration. It initializes the systick also when timeout is needed + and the backup domain when enabled. + (+) de-Initializes common part of the HAL. + (+) Configure The time base source to have 1ms time base with a dedicated + Tick interrupt priority. + (++) SysTick timer is used by default as source of time base, but user + can eventually implement his proper time base source (a general purpose + timer for example or other time source), keeping in mind that Time base + duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and + handled in milliseconds basis. + (++) Time base configuration function (HAL_InitTick ()) is called automatically + at the beginning of the program after reset by HAL_Init() or at any time + when clock is configured, by HAL_RCC_ClockConfig(). + (++) Source of time base is configured to generate interrupts at regular + time intervals. Care must be taken if HAL_Delay() is called from a + peripheral ISR process, the Tick interrupt line must have higher priority + (numerically lower) than the peripheral interrupt. Otherwise the caller + ISR process will be blocked. + (++) functions affecting time base configurations are declared as __Weak + to make override possible in case of other implementations in user file. + +@endverbatim + * @{ + */ + +/** + * @brief This function configures the Flash prefetch, + * Configures time base source, NVIC and Low level hardware + * @note This function is called at the beginning of program after reset and before + * the clock configuration + * + * @note The Systick configuration is based on HSI clock, as HSI is the clock + * used after a system Reset and the NVIC configuration is set to Priority group 4 + * + * @note The time base configuration is based on MSI clock when exting from Reset. + * Once done, time base tick start incrementing. + * In the default implementation,Systick is used as source of time base. + * The tick variable is incremented each 1ms in its ISR. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_Init(void) +{ + /* Configure Flash prefetch */ +#if (PREFETCH_ENABLE != 0U) + __HAL_FLASH_PREFETCH_BUFFER_ENABLE(); +#endif /* PREFETCH_ENABLE */ + + /* Set Interrupt Group Priority */ + HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4); + + /* Enable systick 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. + * @note This function is optional. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DeInit(void) +{ + /* Reset of all peripherals */ + __HAL_RCC_APB1_FORCE_RESET(); + __HAL_RCC_APB1_RELEASE_RESET(); + + __HAL_RCC_APB2_FORCE_RESET(); + __HAL_RCC_APB2_RELEASE_RESET(); + + __HAL_RCC_AHB_FORCE_RESET(); + __HAL_RCC_AHB_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 DeInitialize 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 Povides a tick value in millisecond. + * @note The function is declared as __Weak to be overwritten in case of other + * implementations in user file. + * @retval tick value + */ +__weak uint32_t HAL_GetTick(void) +{ + return uwTick; +} + +/** + * @brief This function returns a tick priority. + * @retval tick priority + */ +uint32_t HAL_GetTickPrio(void) +{ + return uwTickPrio; +} + +/** + * @brief Set new tick Freq. + * @retval status + */ +HAL_StatusTypeDef HAL_SetTickFreq(HAL_TickFreqTypeDef Freq) +{ + HAL_StatusTypeDef status = HAL_OK; + HAL_TickFreqTypeDef prevTickFreq; + + assert_param(IS_TICKFREQ(Freq)); + + if (uwTickFreq != Freq) + { + /* Back up uwTickFreq frequency */ + prevTickFreq = uwTickFreq; + + /* Update uwTickFreq global variable used by HAL_InitTick() */ + uwTickFreq = Freq; + + /* Apply the new tick Freq */ + status = HAL_InitTick(uwTickPrio); + + if (status != HAL_OK) + { + /* Restore previous tick frequency */ + uwTickFreq = prevTickFreq; + } + } + + return status; +} + +/** + * @brief Return tick frequency. + * @retval tick period in Hz + */ +HAL_TickFreqTypeDef HAL_GetTickFreq(void) +{ + return uwTickFreq; +} + +/** + * @brief This function provides accurate 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. + * The 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 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 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 the SysTick interrupt will be enabled and so Tick increment + * is resumed. + * The 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 This function returns the HAL revision + * @retval version 0xXYZR (8bits for each decimal, R for RC) + */ +uint32_t HAL_GetHalVersion(void) +{ + return __STM32F3xx_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 Returns first word of the unique device identifier (UID based on 96 bits) + * @retval Device identifier + */ +uint32_t HAL_GetUIDw0(void) +{ + return(READ_REG(*((uint32_t *)UID_BASE))); +} + +/** + * @brief Returns second word of the unique device identifier (UID based on 96 bits) + * @retval Device identifier + */ +uint32_t HAL_GetUIDw1(void) +{ + return(READ_REG(*((uint32_t *)(UID_BASE + 4U)))); +} + +/** + * @brief Returns third word of the unique device identifier (UID based on 96 bits) + * @retval Device identifier + */ +uint32_t HAL_GetUIDw2(void) +{ + return(READ_REG(*((uint32_t *)(UID_BASE + 8U)))); +} + +/** + * @brief Enable the Debug Module during SLEEP mode + * @retval None + */ +void HAL_DBGMCU_EnableDBGSleepMode(void) +{ + SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_SLEEP); +} + +/** + * @brief Disable the Debug Module during SLEEP mode + * @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); +} + +/** + * @} + */ + +/** + * @} + */ + +#endif /* HAL_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c new file mode 100644 index 0000000..6fba113 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c @@ -0,0 +1,2420 @@ +/** + ****************************************************************************** + * @file stm32f3xx_hal_can.c + * @author MCD Application Team + * @brief CAN HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Controller Area Network (CAN) peripheral: + * + Initialization and de-initialization functions + * + Configuration functions + * + Control functions + * + Interrupts management + * + Callbacks functions + * + Peripheral State and Error functions + * + @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + [..] + (#) Initialize the CAN low level resources by implementing the + HAL_CAN_MspInit(): + (++) Enable the CAN interface clock using __HAL_RCC_CANx_CLK_ENABLE() + (++) Configure CAN pins + (+++) Enable the clock for the CAN GPIOs + (+++) Configure CAN pins as alternate function open-drain + (++) In case of using interrupts (e.g. HAL_CAN_ActivateNotification()) + (+++) Configure the CAN interrupt priority using + HAL_NVIC_SetPriority() + (+++) Enable the CAN IRQ handler using HAL_NVIC_EnableIRQ() + (+++) In CAN IRQ handler, call HAL_CAN_IRQHandler() + + (#) Initialize the CAN peripheral using HAL_CAN_Init() function. This + function resorts to HAL_CAN_MspInit() for low-level initialization. + + (#) Configure the reception filters using the following configuration + functions: + (++) HAL_CAN_ConfigFilter() + + (#) Start the CAN module using HAL_CAN_Start() function. At this level + the node is active on the bus: it receive messages, and can send + messages. + + (#) To manage messages transmission, the following Tx control functions + can be used: + (++) HAL_CAN_AddTxMessage() to request transmission of a new + message. + (++) HAL_CAN_AbortTxRequest() to abort transmission of a pending + message. + (++) HAL_CAN_GetTxMailboxesFreeLevel() to get the number of free Tx + mailboxes. + (++) HAL_CAN_IsTxMessagePending() to check if a message is pending + in a Tx mailbox. + (++) HAL_CAN_GetTxTimestamp() to get the timestamp of Tx message + sent, if time triggered communication mode is enabled. + + (#) When a message is received into the CAN Rx FIFOs, it can be retrieved + using the HAL_CAN_GetRxMessage() function. The function + HAL_CAN_GetRxFifoFillLevel() allows to know how many Rx message are + stored in the Rx Fifo. + + (#) Calling the HAL_CAN_Stop() function stops the CAN module. + + (#) The deinitialization is achieved with HAL_CAN_DeInit() function. + + + *** Polling mode operation *** + ============================== + [..] + (#) Reception: + (++) Monitor reception of message using HAL_CAN_GetRxFifoFillLevel() + until at least one message is received. + (++) Then get the message using HAL_CAN_GetRxMessage(). + + (#) Transmission: + (++) Monitor the Tx mailboxes availability until at least one Tx + mailbox is free, using HAL_CAN_GetTxMailboxesFreeLevel(). + (++) Then request transmission of a message using + HAL_CAN_AddTxMessage(). + + + *** Interrupt mode operation *** + ================================ + [..] + (#) Notifications are activated using HAL_CAN_ActivateNotification() + function. Then, the process can be controlled through the + available user callbacks: HAL_CAN_xxxCallback(), using same APIs + HAL_CAN_GetRxMessage() and HAL_CAN_AddTxMessage(). + + (#) Notifications can be deactivated using + HAL_CAN_DeactivateNotification() function. + + (#) Special care should be taken for CAN_IT_RX_FIFO0_MSG_PENDING and + CAN_IT_RX_FIFO1_MSG_PENDING notifications. These notifications trig + the callbacks HAL_CAN_RxFIFO0MsgPendingCallback() and + HAL_CAN_RxFIFO1MsgPendingCallback(). User has two possible options + here. + (++) Directly get the Rx message in the callback, using + HAL_CAN_GetRxMessage(). + (++) Or deactivate the notification in the callback without + getting the Rx message. The Rx message can then be got later + using HAL_CAN_GetRxMessage(). Once the Rx message have been + read, the notification can be activated again. + + + *** Sleep mode *** + ================== + [..] + (#) The CAN peripheral can be put in sleep mode (low power), using + HAL_CAN_RequestSleep(). The sleep mode will be entered as soon as the + current CAN activity (transmission or reception of a CAN frame) will + be completed. + + (#) A notification can be activated to be informed when the sleep mode + will be entered. + + (#) It can be checked if the sleep mode is entered using + HAL_CAN_IsSleepActive(). + Note that the CAN state (accessible from the API HAL_CAN_GetState()) + is HAL_CAN_STATE_SLEEP_PENDING as soon as the sleep mode request is + submitted (the sleep mode is not yet entered), and become + HAL_CAN_STATE_SLEEP_ACTIVE when the sleep mode is effective. + + (#) The wake-up from sleep mode can be triggered by two ways: + (++) Using HAL_CAN_WakeUp(). When returning from this function, + the sleep mode is exited (if return status is HAL_OK). + (++) When a start of Rx CAN frame is detected by the CAN peripheral, + if automatic wake up mode is enabled. + + *** Callback registration *** + ============================================= + + The compilation define USE_HAL_CAN_REGISTER_CALLBACKS when set to 1 + allows the user to configure dynamically the driver callbacks. + Use Function HAL_CAN_RegisterCallback() to register an interrupt callback. + + Function HAL_CAN_RegisterCallback() allows to register following callbacks: + (+) TxMailbox0CompleteCallback : Tx Mailbox 0 Complete Callback. + (+) TxMailbox1CompleteCallback : Tx Mailbox 1 Complete Callback. + (+) TxMailbox2CompleteCallback : Tx Mailbox 2 Complete Callback. + (+) TxMailbox0AbortCallback : Tx Mailbox 0 Abort Callback. + (+) TxMailbox1AbortCallback : Tx Mailbox 1 Abort Callback. + (+) TxMailbox2AbortCallback : Tx Mailbox 2 Abort Callback. + (+) RxFifo0MsgPendingCallback : Rx Fifo 0 Message Pending Callback. + (+) RxFifo0FullCallback : Rx Fifo 0 Full Callback. + (+) RxFifo1MsgPendingCallback : Rx Fifo 1 Message Pending Callback. + (+) RxFifo1FullCallback : Rx Fifo 1 Full Callback. + (+) SleepCallback : Sleep Callback. + (+) WakeUpFromRxMsgCallback : Wake Up From Rx Message Callback. + (+) ErrorCallback : Error Callback. + (+) MspInitCallback : CAN MspInit. + (+) MspDeInitCallback : CAN MspDeInit. + This function takes as parameters the HAL peripheral handle, the Callback ID + and a pointer to the user callback function. + + Use function HAL_CAN_UnRegisterCallback() to reset a callback to the default + weak function. + HAL_CAN_UnRegisterCallback takes as parameters the HAL peripheral handle, + and the Callback ID. + This function allows to reset following callbacks: + (+) TxMailbox0CompleteCallback : Tx Mailbox 0 Complete Callback. + (+) TxMailbox1CompleteCallback : Tx Mailbox 1 Complete Callback. + (+) TxMailbox2CompleteCallback : Tx Mailbox 2 Complete Callback. + (+) TxMailbox0AbortCallback : Tx Mailbox 0 Abort Callback. + (+) TxMailbox1AbortCallback : Tx Mailbox 1 Abort Callback. + (+) TxMailbox2AbortCallback : Tx Mailbox 2 Abort Callback. + (+) RxFifo0MsgPendingCallback : Rx Fifo 0 Message Pending Callback. + (+) RxFifo0FullCallback : Rx Fifo 0 Full Callback. + (+) RxFifo1MsgPendingCallback : Rx Fifo 1 Message Pending Callback. + (+) RxFifo1FullCallback : Rx Fifo 1 Full Callback. + (+) SleepCallback : Sleep Callback. + (+) WakeUpFromRxMsgCallback : Wake Up From Rx Message Callback. + (+) ErrorCallback : Error Callback. + (+) MspInitCallback : CAN MspInit. + (+) MspDeInitCallback : CAN MspDeInit. + + By default, after the HAL_CAN_Init() and when the state is HAL_CAN_STATE_RESET, + all callbacks are set to the corresponding weak functions: + example HAL_CAN_ErrorCallback(). + Exception done for MspInit and MspDeInit functions that are + reset to the legacy weak function in the HAL_CAN_Init()/ HAL_CAN_DeInit() only when + these callbacks are null (not registered beforehand). + if not, MspInit or MspDeInit are not null, the HAL_CAN_Init()/ HAL_CAN_DeInit() + keep and use the user MspInit/MspDeInit callbacks (registered beforehand) + + Callbacks can be registered/unregistered in HAL_CAN_STATE_READY state only. + Exception done MspInit/MspDeInit that can be registered/unregistered + in HAL_CAN_STATE_READY or HAL_CAN_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_CAN_RegisterCallback() before calling HAL_CAN_DeInit() + or HAL_CAN_Init() function. + + When The compilation define USE_HAL_CAN_REGISTER_CALLBACKS is set to 0 or + not defined, the callback registration feature is not available and all callbacks + are set to the corresponding weak functions. + + @endverbatim + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f3xx_hal.h" + +/** @addtogroup STM32F3xx_HAL_Driver + * @{ + */ + +#if defined(CAN) + +/** @defgroup CAN CAN + * @brief CAN driver modules + * @{ + */ + +#ifdef HAL_CAN_MODULE_ENABLED + +#ifdef HAL_CAN_LEGACY_MODULE_ENABLED + #error "The CAN driver cannot be used with its legacy, Please enable only one CAN module at once" +#endif + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @defgroup CAN_Private_Constants CAN Private Constants + * @{ + */ +#define CAN_TIMEOUT_VALUE 10U +/** + * @} + */ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ + +/** @defgroup CAN_Exported_Functions CAN Exported Functions + * @{ + */ + +/** @defgroup CAN_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: + (+) HAL_CAN_Init : Initialize and configure the CAN. + (+) HAL_CAN_DeInit : De-initialize the CAN. + (+) HAL_CAN_MspInit : Initialize the CAN MSP. + (+) HAL_CAN_MspDeInit : DeInitialize the CAN MSP. + +@endverbatim + * @{ + */ + +/** + * @brief Initializes the CAN peripheral according to the specified + * parameters in the CAN_InitStruct. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_CAN_Init(CAN_HandleTypeDef *hcan) +{ + uint32_t tickstart; + + /* Check CAN handle */ + if (hcan == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_CAN_ALL_INSTANCE(hcan->Instance)); + assert_param(IS_FUNCTIONAL_STATE(hcan->Init.TimeTriggeredMode)); + assert_param(IS_FUNCTIONAL_STATE(hcan->Init.AutoBusOff)); + assert_param(IS_FUNCTIONAL_STATE(hcan->Init.AutoWakeUp)); + assert_param(IS_FUNCTIONAL_STATE(hcan->Init.AutoRetransmission)); + assert_param(IS_FUNCTIONAL_STATE(hcan->Init.ReceiveFifoLocked)); + assert_param(IS_FUNCTIONAL_STATE(hcan->Init.TransmitFifoPriority)); + assert_param(IS_CAN_MODE(hcan->Init.Mode)); + assert_param(IS_CAN_SJW(hcan->Init.SyncJumpWidth)); + assert_param(IS_CAN_BS1(hcan->Init.TimeSeg1)); + assert_param(IS_CAN_BS2(hcan->Init.TimeSeg2)); + assert_param(IS_CAN_PRESCALER(hcan->Init.Prescaler)); + +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + if (hcan->State == HAL_CAN_STATE_RESET) + { + /* Reset callbacks to legacy functions */ + hcan->RxFifo0MsgPendingCallback = HAL_CAN_RxFifo0MsgPendingCallback; /* Legacy weak RxFifo0MsgPendingCallback */ + hcan->RxFifo0FullCallback = HAL_CAN_RxFifo0FullCallback; /* Legacy weak RxFifo0FullCallback */ + hcan->RxFifo1MsgPendingCallback = HAL_CAN_RxFifo1MsgPendingCallback; /* Legacy weak RxFifo1MsgPendingCallback */ + hcan->RxFifo1FullCallback = HAL_CAN_RxFifo1FullCallback; /* Legacy weak RxFifo1FullCallback */ + hcan->TxMailbox0CompleteCallback = HAL_CAN_TxMailbox0CompleteCallback; /* Legacy weak TxMailbox0CompleteCallback */ + hcan->TxMailbox1CompleteCallback = HAL_CAN_TxMailbox1CompleteCallback; /* Legacy weak TxMailbox1CompleteCallback */ + hcan->TxMailbox2CompleteCallback = HAL_CAN_TxMailbox2CompleteCallback; /* Legacy weak TxMailbox2CompleteCallback */ + hcan->TxMailbox0AbortCallback = HAL_CAN_TxMailbox0AbortCallback; /* Legacy weak TxMailbox0AbortCallback */ + hcan->TxMailbox1AbortCallback = HAL_CAN_TxMailbox1AbortCallback; /* Legacy weak TxMailbox1AbortCallback */ + hcan->TxMailbox2AbortCallback = HAL_CAN_TxMailbox2AbortCallback; /* Legacy weak TxMailbox2AbortCallback */ + hcan->SleepCallback = HAL_CAN_SleepCallback; /* Legacy weak SleepCallback */ + hcan->WakeUpFromRxMsgCallback = HAL_CAN_WakeUpFromRxMsgCallback; /* Legacy weak WakeUpFromRxMsgCallback */ + hcan->ErrorCallback = HAL_CAN_ErrorCallback; /* Legacy weak ErrorCallback */ + + if (hcan->MspInitCallback == NULL) + { + hcan->MspInitCallback = HAL_CAN_MspInit; /* Legacy weak MspInit */ + } + + /* Init the low level hardware: CLOCK, NVIC */ + hcan->MspInitCallback(hcan); + } + +#else + if (hcan->State == HAL_CAN_STATE_RESET) + { + /* Init the low level hardware: CLOCK, NVIC */ + HAL_CAN_MspInit(hcan); + } +#endif /* (USE_HAL_CAN_REGISTER_CALLBACKS) */ + + /* Request initialisation */ + SET_BIT(hcan->Instance->MCR, CAN_MCR_INRQ); + + /* Get tick */ + tickstart = HAL_GetTick(); + + /* Wait initialisation acknowledge */ + while ((hcan->Instance->MSR & CAN_MSR_INAK) == 0U) + { + if ((HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE) + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_TIMEOUT; + + /* Change CAN state */ + hcan->State = HAL_CAN_STATE_ERROR; + + return HAL_ERROR; + } + } + + /* Exit from sleep mode */ + CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_SLEEP); + + /* Get tick */ + tickstart = HAL_GetTick(); + + /* Check Sleep mode leave acknowledge */ + while ((hcan->Instance->MSR & CAN_MSR_SLAK) != 0U) + { + if ((HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE) + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_TIMEOUT; + + /* Change CAN state */ + hcan->State = HAL_CAN_STATE_ERROR; + + return HAL_ERROR; + } + } + + /* Set the time triggered communication mode */ + if (hcan->Init.TimeTriggeredMode == ENABLE) + { + SET_BIT(hcan->Instance->MCR, CAN_MCR_TTCM); + } + else + { + CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_TTCM); + } + + /* Set the automatic bus-off management */ + if (hcan->Init.AutoBusOff == ENABLE) + { + SET_BIT(hcan->Instance->MCR, CAN_MCR_ABOM); + } + else + { + CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_ABOM); + } + + /* Set the automatic wake-up mode */ + if (hcan->Init.AutoWakeUp == ENABLE) + { + SET_BIT(hcan->Instance->MCR, CAN_MCR_AWUM); + } + else + { + CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_AWUM); + } + + /* Set the automatic retransmission */ + if (hcan->Init.AutoRetransmission == ENABLE) + { + CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_NART); + } + else + { + SET_BIT(hcan->Instance->MCR, CAN_MCR_NART); + } + + /* Set the receive FIFO locked mode */ + if (hcan->Init.ReceiveFifoLocked == ENABLE) + { + SET_BIT(hcan->Instance->MCR, CAN_MCR_RFLM); + } + else + { + CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_RFLM); + } + + /* Set the transmit FIFO priority */ + if (hcan->Init.TransmitFifoPriority == ENABLE) + { + SET_BIT(hcan->Instance->MCR, CAN_MCR_TXFP); + } + else + { + CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_TXFP); + } + + /* Set the bit timing register */ + WRITE_REG(hcan->Instance->BTR, (uint32_t)(hcan->Init.Mode | + hcan->Init.SyncJumpWidth | + hcan->Init.TimeSeg1 | + hcan->Init.TimeSeg2 | + (hcan->Init.Prescaler - 1U))); + + /* Initialize the error code */ + hcan->ErrorCode = HAL_CAN_ERROR_NONE; + + /* Initialize the CAN state */ + hcan->State = HAL_CAN_STATE_READY; + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Deinitializes the CAN peripheral registers to their default + * reset values. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_CAN_DeInit(CAN_HandleTypeDef *hcan) +{ + /* Check CAN handle */ + if (hcan == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_CAN_ALL_INSTANCE(hcan->Instance)); + + /* Stop the CAN module */ + (void)HAL_CAN_Stop(hcan); + +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + if (hcan->MspDeInitCallback == NULL) + { + hcan->MspDeInitCallback = HAL_CAN_MspDeInit; /* Legacy weak MspDeInit */ + } + + /* DeInit the low level hardware: CLOCK, NVIC */ + hcan->MspDeInitCallback(hcan); + +#else + /* DeInit the low level hardware: CLOCK, NVIC */ + HAL_CAN_MspDeInit(hcan); +#endif /* (USE_HAL_CAN_REGISTER_CALLBACKS) */ + + /* Reset the CAN peripheral */ + SET_BIT(hcan->Instance->MCR, CAN_MCR_RESET); + + /* Reset the CAN ErrorCode */ + hcan->ErrorCode = HAL_CAN_ERROR_NONE; + + /* Change CAN state */ + hcan->State = HAL_CAN_STATE_RESET; + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Initializes the CAN MSP. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +__weak void HAL_CAN_MspInit(CAN_HandleTypeDef *hcan) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_CAN_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes the CAN MSP. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +__weak void HAL_CAN_MspDeInit(CAN_HandleTypeDef *hcan) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_CAN_MspDeInit could be implemented in the user file + */ +} + +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 +/** + * @brief Register a CAN CallBack. + * To be used instead of the weak predefined callback + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for CAN module + * @param CallbackID ID of the callback to be registered + * This parameter can be one of the following values: + * @arg @ref HAL_CAN_TX_MAILBOX0_COMPLETE_CB_ID Tx Mailbox 0 Complete callback ID + * @arg @ref HAL_CAN_TX_MAILBOX1_COMPLETE_CB_ID Tx Mailbox 1 Complete callback ID + * @arg @ref HAL_CAN_TX_MAILBOX2_COMPLETE_CB_ID Tx Mailbox 2 Complete callback ID + * @arg @ref HAL_CAN_TX_MAILBOX0_ABORT_CB_ID Tx Mailbox 0 Abort callback ID + * @arg @ref HAL_CAN_TX_MAILBOX1_ABORT_CB_ID Tx Mailbox 1 Abort callback ID + * @arg @ref HAL_CAN_TX_MAILBOX2_ABORT_CB_ID Tx Mailbox 2 Abort callback ID + * @arg @ref HAL_CAN_RX_FIFO0_MSG_PENDING_CB_ID Rx Fifo 0 message pending callback ID + * @arg @ref HAL_CAN_RX_FIFO0_FULL_CB_ID Rx Fifo 0 full callback ID + * @arg @ref HAL_CAN_RX_FIFO1_MSG_PENDING_CB_ID Rx Fifo 1 message pending callback ID + * @arg @ref HAL_CAN_RX_FIFO1_FULL_CB_ID Rx Fifo 1 full callback ID + * @arg @ref HAL_CAN_SLEEP_CB_ID Sleep callback ID + * @arg @ref HAL_CAN_WAKEUP_FROM_RX_MSG_CB_ID Wake Up from Rx message callback ID + * @arg @ref HAL_CAN_ERROR_CB_ID Error callback ID + * @arg @ref HAL_CAN_MSPINIT_CB_ID MspInit callback ID + * @arg @ref HAL_CAN_MSPDEINIT_CB_ID MspDeInit callback ID + * @param pCallback pointer to the Callback function + * @retval HAL status + */ +HAL_StatusTypeDef HAL_CAN_RegisterCallback(CAN_HandleTypeDef *hcan, HAL_CAN_CallbackIDTypeDef CallbackID, void (* pCallback)(CAN_HandleTypeDef *_hcan)) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (pCallback == NULL) + { + /* Update the error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_INVALID_CALLBACK; + + return HAL_ERROR; + } + + if (hcan->State == HAL_CAN_STATE_READY) + { + switch (CallbackID) + { + case HAL_CAN_TX_MAILBOX0_COMPLETE_CB_ID : + hcan->TxMailbox0CompleteCallback = pCallback; + break; + + case HAL_CAN_TX_MAILBOX1_COMPLETE_CB_ID : + hcan->TxMailbox1CompleteCallback = pCallback; + break; + + case HAL_CAN_TX_MAILBOX2_COMPLETE_CB_ID : + hcan->TxMailbox2CompleteCallback = pCallback; + break; + + case HAL_CAN_TX_MAILBOX0_ABORT_CB_ID : + hcan->TxMailbox0AbortCallback = pCallback; + break; + + case HAL_CAN_TX_MAILBOX1_ABORT_CB_ID : + hcan->TxMailbox1AbortCallback = pCallback; + break; + + case HAL_CAN_TX_MAILBOX2_ABORT_CB_ID : + hcan->TxMailbox2AbortCallback = pCallback; + break; + + case HAL_CAN_RX_FIFO0_MSG_PENDING_CB_ID : + hcan->RxFifo0MsgPendingCallback = pCallback; + break; + + case HAL_CAN_RX_FIFO0_FULL_CB_ID : + hcan->RxFifo0FullCallback = pCallback; + break; + + case HAL_CAN_RX_FIFO1_MSG_PENDING_CB_ID : + hcan->RxFifo1MsgPendingCallback = pCallback; + break; + + case HAL_CAN_RX_FIFO1_FULL_CB_ID : + hcan->RxFifo1FullCallback = pCallback; + break; + + case HAL_CAN_SLEEP_CB_ID : + hcan->SleepCallback = pCallback; + break; + + case HAL_CAN_WAKEUP_FROM_RX_MSG_CB_ID : + hcan->WakeUpFromRxMsgCallback = pCallback; + break; + + case HAL_CAN_ERROR_CB_ID : + hcan->ErrorCallback = pCallback; + break; + + case HAL_CAN_MSPINIT_CB_ID : + hcan->MspInitCallback = pCallback; + break; + + case HAL_CAN_MSPDEINIT_CB_ID : + hcan->MspDeInitCallback = pCallback; + break; + + default : + /* Update the error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else if (hcan->State == HAL_CAN_STATE_RESET) + { + switch (CallbackID) + { + case HAL_CAN_MSPINIT_CB_ID : + hcan->MspInitCallback = pCallback; + break; + + case HAL_CAN_MSPDEINIT_CB_ID : + hcan->MspDeInitCallback = pCallback; + break; + + default : + /* Update the error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else + { + /* Update the error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + return status; +} + +/** + * @brief Unregister a CAN CallBack. + * CAN callabck is redirected to the weak predefined callback + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for CAN module + * @param CallbackID ID of the callback to be unregistered + * This parameter can be one of the following values: + * @arg @ref HAL_CAN_TX_MAILBOX0_COMPLETE_CB_ID Tx Mailbox 0 Complete callback ID + * @arg @ref HAL_CAN_TX_MAILBOX1_COMPLETE_CB_ID Tx Mailbox 1 Complete callback ID + * @arg @ref HAL_CAN_TX_MAILBOX2_COMPLETE_CB_ID Tx Mailbox 2 Complete callback ID + * @arg @ref HAL_CAN_TX_MAILBOX0_ABORT_CB_ID Tx Mailbox 0 Abort callback ID + * @arg @ref HAL_CAN_TX_MAILBOX1_ABORT_CB_ID Tx Mailbox 1 Abort callback ID + * @arg @ref HAL_CAN_TX_MAILBOX2_ABORT_CB_ID Tx Mailbox 2 Abort callback ID + * @arg @ref HAL_CAN_RX_FIFO0_MSG_PENDING_CB_ID Rx Fifo 0 message pending callback ID + * @arg @ref HAL_CAN_RX_FIFO0_FULL_CB_ID Rx Fifo 0 full callback ID + * @arg @ref HAL_CAN_RX_FIFO1_MSG_PENDING_CB_ID Rx Fifo 1 message pending callback ID + * @arg @ref HAL_CAN_RX_FIFO1_FULL_CB_ID Rx Fifo 1 full callback ID + * @arg @ref HAL_CAN_SLEEP_CB_ID Sleep callback ID + * @arg @ref HAL_CAN_WAKEUP_FROM_RX_MSG_CB_ID Wake Up from Rx message callback ID + * @arg @ref HAL_CAN_ERROR_CB_ID Error callback ID + * @arg @ref HAL_CAN_MSPINIT_CB_ID MspInit callback ID + * @arg @ref HAL_CAN_MSPDEINIT_CB_ID MspDeInit callback ID + * @retval HAL status + */ +HAL_StatusTypeDef HAL_CAN_UnRegisterCallback(CAN_HandleTypeDef *hcan, HAL_CAN_CallbackIDTypeDef CallbackID) +{ + HAL_StatusTypeDef status = HAL_OK; + + if (hcan->State == HAL_CAN_STATE_READY) + { + switch (CallbackID) + { + case HAL_CAN_TX_MAILBOX0_COMPLETE_CB_ID : + hcan->TxMailbox0CompleteCallback = HAL_CAN_TxMailbox0CompleteCallback; + break; + + case HAL_CAN_TX_MAILBOX1_COMPLETE_CB_ID : + hcan->TxMailbox1CompleteCallback = HAL_CAN_TxMailbox1CompleteCallback; + break; + + case HAL_CAN_TX_MAILBOX2_COMPLETE_CB_ID : + hcan->TxMailbox2CompleteCallback = HAL_CAN_TxMailbox2CompleteCallback; + break; + + case HAL_CAN_TX_MAILBOX0_ABORT_CB_ID : + hcan->TxMailbox0AbortCallback = HAL_CAN_TxMailbox0AbortCallback; + break; + + case HAL_CAN_TX_MAILBOX1_ABORT_CB_ID : + hcan->TxMailbox1AbortCallback = HAL_CAN_TxMailbox1AbortCallback; + break; + + case HAL_CAN_TX_MAILBOX2_ABORT_CB_ID : + hcan->TxMailbox2AbortCallback = HAL_CAN_TxMailbox2AbortCallback; + break; + + case HAL_CAN_RX_FIFO0_MSG_PENDING_CB_ID : + hcan->RxFifo0MsgPendingCallback = HAL_CAN_RxFifo0MsgPendingCallback; + break; + + case HAL_CAN_RX_FIFO0_FULL_CB_ID : + hcan->RxFifo0FullCallback = HAL_CAN_RxFifo0FullCallback; + break; + + case HAL_CAN_RX_FIFO1_MSG_PENDING_CB_ID : + hcan->RxFifo1MsgPendingCallback = HAL_CAN_RxFifo1MsgPendingCallback; + break; + + case HAL_CAN_RX_FIFO1_FULL_CB_ID : + hcan->RxFifo1FullCallback = HAL_CAN_RxFifo1FullCallback; + break; + + case HAL_CAN_SLEEP_CB_ID : + hcan->SleepCallback = HAL_CAN_SleepCallback; + break; + + case HAL_CAN_WAKEUP_FROM_RX_MSG_CB_ID : + hcan->WakeUpFromRxMsgCallback = HAL_CAN_WakeUpFromRxMsgCallback; + break; + + case HAL_CAN_ERROR_CB_ID : + hcan->ErrorCallback = HAL_CAN_ErrorCallback; + break; + + case HAL_CAN_MSPINIT_CB_ID : + hcan->MspInitCallback = HAL_CAN_MspInit; + break; + + case HAL_CAN_MSPDEINIT_CB_ID : + hcan->MspDeInitCallback = HAL_CAN_MspDeInit; + break; + + default : + /* Update the error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else if (hcan->State == HAL_CAN_STATE_RESET) + { + switch (CallbackID) + { + case HAL_CAN_MSPINIT_CB_ID : + hcan->MspInitCallback = HAL_CAN_MspInit; + break; + + case HAL_CAN_MSPDEINIT_CB_ID : + hcan->MspDeInitCallback = HAL_CAN_MspDeInit; + break; + + default : + /* Update the error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + break; + } + } + else + { + /* Update the error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_INVALID_CALLBACK; + + /* Return error status */ + status = HAL_ERROR; + } + + return status; +} +#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + +/** + * @} + */ + +/** @defgroup CAN_Exported_Functions_Group2 Configuration functions + * @brief Configuration functions. + * +@verbatim + ============================================================================== + ##### Configuration functions ##### + ============================================================================== + [..] This section provides functions allowing to: + (+) HAL_CAN_ConfigFilter : Configure the CAN reception filters + +@endverbatim + * @{ + */ + +/** + * @brief Configures the CAN reception filter according to the specified + * parameters in the CAN_FilterInitStruct. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @param sFilterConfig pointer to a CAN_FilterTypeDef structure that + * contains the filter configuration information. + * @retval None + */ +HAL_StatusTypeDef HAL_CAN_ConfigFilter(CAN_HandleTypeDef *hcan, CAN_FilterTypeDef *sFilterConfig) +{ + uint32_t filternbrbitpos; + CAN_TypeDef *can_ip = hcan->Instance; + HAL_CAN_StateTypeDef state = hcan->State; + + if ((state == HAL_CAN_STATE_READY) || + (state == HAL_CAN_STATE_LISTENING)) + { + /* Check the parameters */ + assert_param(IS_CAN_FILTER_ID_HALFWORD(sFilterConfig->FilterIdHigh)); + assert_param(IS_CAN_FILTER_ID_HALFWORD(sFilterConfig->FilterIdLow)); + assert_param(IS_CAN_FILTER_ID_HALFWORD(sFilterConfig->FilterMaskIdHigh)); + assert_param(IS_CAN_FILTER_ID_HALFWORD(sFilterConfig->FilterMaskIdLow)); + assert_param(IS_CAN_FILTER_MODE(sFilterConfig->FilterMode)); + assert_param(IS_CAN_FILTER_SCALE(sFilterConfig->FilterScale)); + assert_param(IS_CAN_FILTER_FIFO(sFilterConfig->FilterFIFOAssignment)); + assert_param(IS_CAN_FILTER_ACTIVATION(sFilterConfig->FilterActivation)); + + /* CAN is single instance with 14 dedicated filters banks */ + + /* Check the parameters */ + assert_param(IS_CAN_FILTER_BANK_SINGLE(sFilterConfig->FilterBank)); + + /* Initialisation mode for the filter */ + SET_BIT(can_ip->FMR, CAN_FMR_FINIT); + + /* Convert filter number into bit position */ + filternbrbitpos = (uint32_t)1 << (sFilterConfig->FilterBank & 0x1FU); + + /* Filter Deactivation */ + CLEAR_BIT(can_ip->FA1R, filternbrbitpos); + + /* Filter Scale */ + if (sFilterConfig->FilterScale == CAN_FILTERSCALE_16BIT) + { + /* 16-bit scale for the filter */ + CLEAR_BIT(can_ip->FS1R, filternbrbitpos); + + /* First 16-bit identifier and First 16-bit mask */ + /* Or First 16-bit identifier and Second 16-bit identifier */ + can_ip->sFilterRegister[sFilterConfig->FilterBank].FR1 = + ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdLow) << 16U) | + (0x0000FFFFU & (uint32_t)sFilterConfig->FilterIdLow); + + /* Second 16-bit identifier and Second 16-bit mask */ + /* Or Third 16-bit identifier and Fourth 16-bit identifier */ + can_ip->sFilterRegister[sFilterConfig->FilterBank].FR2 = + ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdHigh) << 16U) | + (0x0000FFFFU & (uint32_t)sFilterConfig->FilterIdHigh); + } + + if (sFilterConfig->FilterScale == CAN_FILTERSCALE_32BIT) + { + /* 32-bit scale for the filter */ + SET_BIT(can_ip->FS1R, filternbrbitpos); + + /* 32-bit identifier or First 32-bit identifier */ + can_ip->sFilterRegister[sFilterConfig->FilterBank].FR1 = + ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterIdHigh) << 16U) | + (0x0000FFFFU & (uint32_t)sFilterConfig->FilterIdLow); + + /* 32-bit mask or Second 32-bit identifier */ + can_ip->sFilterRegister[sFilterConfig->FilterBank].FR2 = + ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdHigh) << 16U) | + (0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdLow); + } + + /* Filter Mode */ + if (sFilterConfig->FilterMode == CAN_FILTERMODE_IDMASK) + { + /* Id/Mask mode for the filter*/ + CLEAR_BIT(can_ip->FM1R, filternbrbitpos); + } + else /* CAN_FilterInitStruct->CAN_FilterMode == CAN_FilterMode_IdList */ + { + /* Identifier list mode for the filter*/ + SET_BIT(can_ip->FM1R, filternbrbitpos); + } + + /* Filter FIFO assignment */ + if (sFilterConfig->FilterFIFOAssignment == CAN_FILTER_FIFO0) + { + /* FIFO 0 assignation for the filter */ + CLEAR_BIT(can_ip->FFA1R, filternbrbitpos); + } + else + { + /* FIFO 1 assignation for the filter */ + SET_BIT(can_ip->FFA1R, filternbrbitpos); + } + + /* Filter activation */ + if (sFilterConfig->FilterActivation == CAN_FILTER_ENABLE) + { + SET_BIT(can_ip->FA1R, filternbrbitpos); + } + + /* Leave the initialisation mode for the filter */ + CLEAR_BIT(can_ip->FMR, CAN_FMR_FINIT); + + /* Return function status */ + return HAL_OK; + } + else + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED; + + return HAL_ERROR; + } +} + +/** + * @} + */ + +/** @defgroup CAN_Exported_Functions_Group3 Control functions + * @brief Control functions + * +@verbatim + ============================================================================== + ##### Control functions ##### + ============================================================================== + [..] This section provides functions allowing to: + (+) HAL_CAN_Start : Start the CAN module + (+) HAL_CAN_Stop : Stop the CAN module + (+) HAL_CAN_RequestSleep : Request sleep mode entry. + (+) HAL_CAN_WakeUp : Wake up from sleep mode. + (+) HAL_CAN_IsSleepActive : Check is sleep mode is active. + (+) HAL_CAN_AddTxMessage : Add a message to the Tx mailboxes + and activate the corresponding + transmission request + (+) HAL_CAN_AbortTxRequest : Abort transmission request + (+) HAL_CAN_GetTxMailboxesFreeLevel : Return Tx mailboxes free level + (+) HAL_CAN_IsTxMessagePending : Check if a transmission request is + pending on the selected Tx mailbox + (+) HAL_CAN_GetRxMessage : Get a CAN frame from the Rx FIFO + (+) HAL_CAN_GetRxFifoFillLevel : Return Rx FIFO fill level + +@endverbatim + * @{ + */ + +/** + * @brief Start the CAN module. + * @param hcan pointer to an CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_CAN_Start(CAN_HandleTypeDef *hcan) +{ + uint32_t tickstart; + + if (hcan->State == HAL_CAN_STATE_READY) + { + /* Change CAN peripheral state */ + hcan->State = HAL_CAN_STATE_LISTENING; + + /* Request leave initialisation */ + CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_INRQ); + + /* Get tick */ + tickstart = HAL_GetTick(); + + /* Wait the acknowledge */ + while ((hcan->Instance->MSR & CAN_MSR_INAK) != 0U) + { + /* Check for the Timeout */ + if ((HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE) + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_TIMEOUT; + + /* Change CAN state */ + hcan->State = HAL_CAN_STATE_ERROR; + + return HAL_ERROR; + } + } + + /* Reset the CAN ErrorCode */ + hcan->ErrorCode = HAL_CAN_ERROR_NONE; + + /* Return function status */ + return HAL_OK; + } + else + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_NOT_READY; + + return HAL_ERROR; + } +} + +/** + * @brief Stop the CAN module and enable access to configuration registers. + * @param hcan pointer to an CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_CAN_Stop(CAN_HandleTypeDef *hcan) +{ + uint32_t tickstart; + + if (hcan->State == HAL_CAN_STATE_LISTENING) + { + /* Request initialisation */ + SET_BIT(hcan->Instance->MCR, CAN_MCR_INRQ); + + /* Get tick */ + tickstart = HAL_GetTick(); + + /* Wait the acknowledge */ + while ((hcan->Instance->MSR & CAN_MSR_INAK) == 0U) + { + /* Check for the Timeout */ + if ((HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE) + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_TIMEOUT; + + /* Change CAN state */ + hcan->State = HAL_CAN_STATE_ERROR; + + return HAL_ERROR; + } + } + + /* Exit from sleep mode */ + CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_SLEEP); + + /* Change CAN peripheral state */ + hcan->State = HAL_CAN_STATE_READY; + + /* Return function status */ + return HAL_OK; + } + else + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_NOT_STARTED; + + return HAL_ERROR; + } +} + +/** + * @brief Request the sleep mode (low power) entry. + * When returning from this function, Sleep mode will be entered + * as soon as the current CAN activity (transmission or reception + * of a CAN frame) has been completed. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval HAL status. + */ +HAL_StatusTypeDef HAL_CAN_RequestSleep(CAN_HandleTypeDef *hcan) +{ + HAL_CAN_StateTypeDef state = hcan->State; + + if ((state == HAL_CAN_STATE_READY) || + (state == HAL_CAN_STATE_LISTENING)) + { + /* Request Sleep mode */ + SET_BIT(hcan->Instance->MCR, CAN_MCR_SLEEP); + + /* Return function status */ + return HAL_OK; + } + else + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED; + + /* Return function status */ + return HAL_ERROR; + } +} + +/** + * @brief Wake up from sleep mode. + * When returning with HAL_OK status from this function, Sleep mode + * is exited. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval HAL status. + */ +HAL_StatusTypeDef HAL_CAN_WakeUp(CAN_HandleTypeDef *hcan) +{ + __IO uint32_t count = 0; + uint32_t timeout = 1000000U; + HAL_CAN_StateTypeDef state = hcan->State; + + if ((state == HAL_CAN_STATE_READY) || + (state == HAL_CAN_STATE_LISTENING)) + { + /* Wake up request */ + CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_SLEEP); + + /* Wait sleep mode is exited */ + do + { + /* Increment counter */ + count++; + + /* Check if timeout is reached */ + if (count > timeout) + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_TIMEOUT; + + return HAL_ERROR; + } + } + while ((hcan->Instance->MSR & CAN_MSR_SLAK) != 0U); + + /* Return function status */ + return HAL_OK; + } + else + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED; + + return HAL_ERROR; + } +} + +/** + * @brief Check is sleep mode is active. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval Status + * - 0 : Sleep mode is not active. + * - 1 : Sleep mode is active. + */ +uint32_t HAL_CAN_IsSleepActive(CAN_HandleTypeDef *hcan) +{ + uint32_t status = 0U; + HAL_CAN_StateTypeDef state = hcan->State; + + if ((state == HAL_CAN_STATE_READY) || + (state == HAL_CAN_STATE_LISTENING)) + { + /* Check Sleep mode */ + if ((hcan->Instance->MSR & CAN_MSR_SLAK) != 0U) + { + status = 1U; + } + } + + /* Return function status */ + return status; +} + +/** + * @brief Add a message to the first free Tx mailbox and activate the + * corresponding transmission request. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @param pHeader pointer to a CAN_TxHeaderTypeDef structure. + * @param aData array containing the payload of the Tx frame. + * @param pTxMailbox pointer to a variable where the function will return + * the TxMailbox used to store the Tx message. + * This parameter can be a value of @arg CAN_Tx_Mailboxes. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_CAN_AddTxMessage(CAN_HandleTypeDef *hcan, CAN_TxHeaderTypeDef *pHeader, uint8_t aData[], uint32_t *pTxMailbox) +{ + uint32_t transmitmailbox; + HAL_CAN_StateTypeDef state = hcan->State; + uint32_t tsr = READ_REG(hcan->Instance->TSR); + + /* Check the parameters */ + assert_param(IS_CAN_IDTYPE(pHeader->IDE)); + assert_param(IS_CAN_RTR(pHeader->RTR)); + assert_param(IS_CAN_DLC(pHeader->DLC)); + if (pHeader->IDE == CAN_ID_STD) + { + assert_param(IS_CAN_STDID(pHeader->StdId)); + } + else + { + assert_param(IS_CAN_EXTID(pHeader->ExtId)); + } + assert_param(IS_FUNCTIONAL_STATE(pHeader->TransmitGlobalTime)); + + if ((state == HAL_CAN_STATE_READY) || + (state == HAL_CAN_STATE_LISTENING)) + { + /* Check that all the Tx mailboxes are not full */ + if (((tsr & CAN_TSR_TME0) != 0U) || + ((tsr & CAN_TSR_TME1) != 0U) || + ((tsr & CAN_TSR_TME2) != 0U)) + { + /* Select an empty transmit mailbox */ + transmitmailbox = (tsr & CAN_TSR_CODE) >> CAN_TSR_CODE_Pos; + + /* Check transmit mailbox value */ + if (transmitmailbox > 2U) + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_INTERNAL; + + return HAL_ERROR; + } + + /* Store the Tx mailbox */ + *pTxMailbox = (uint32_t)1 << transmitmailbox; + + /* Set up the Id */ + if (pHeader->IDE == CAN_ID_STD) + { + hcan->Instance->sTxMailBox[transmitmailbox].TIR = ((pHeader->StdId << CAN_TI0R_STID_Pos) | + pHeader->RTR); + } + else + { + hcan->Instance->sTxMailBox[transmitmailbox].TIR = ((pHeader->ExtId << CAN_TI0R_EXID_Pos) | + pHeader->IDE | + pHeader->RTR); + } + + /* Set up the DLC */ + hcan->Instance->sTxMailBox[transmitmailbox].TDTR = (pHeader->DLC); + + /* Set up the Transmit Global Time mode */ + if (pHeader->TransmitGlobalTime == ENABLE) + { + SET_BIT(hcan->Instance->sTxMailBox[transmitmailbox].TDTR, CAN_TDT0R_TGT); + } + + /* Set up the data field */ + WRITE_REG(hcan->Instance->sTxMailBox[transmitmailbox].TDHR, + ((uint32_t)aData[7] << CAN_TDH0R_DATA7_Pos) | + ((uint32_t)aData[6] << CAN_TDH0R_DATA6_Pos) | + ((uint32_t)aData[5] << CAN_TDH0R_DATA5_Pos) | + ((uint32_t)aData[4] << CAN_TDH0R_DATA4_Pos)); + WRITE_REG(hcan->Instance->sTxMailBox[transmitmailbox].TDLR, + ((uint32_t)aData[3] << CAN_TDL0R_DATA3_Pos) | + ((uint32_t)aData[2] << CAN_TDL0R_DATA2_Pos) | + ((uint32_t)aData[1] << CAN_TDL0R_DATA1_Pos) | + ((uint32_t)aData[0] << CAN_TDL0R_DATA0_Pos)); + + /* Request transmission */ + SET_BIT(hcan->Instance->sTxMailBox[transmitmailbox].TIR, CAN_TI0R_TXRQ); + + /* Return function status */ + return HAL_OK; + } + else + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_PARAM; + + return HAL_ERROR; + } + } + else + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED; + + return HAL_ERROR; + } +} + +/** + * @brief Abort transmission requests + * @param hcan pointer to an CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @param TxMailboxes List of the Tx Mailboxes to abort. + * This parameter can be any combination of @arg CAN_Tx_Mailboxes. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_CAN_AbortTxRequest(CAN_HandleTypeDef *hcan, uint32_t TxMailboxes) +{ + HAL_CAN_StateTypeDef state = hcan->State; + + /* Check function parameters */ + assert_param(IS_CAN_TX_MAILBOX_LIST(TxMailboxes)); + + if ((state == HAL_CAN_STATE_READY) || + (state == HAL_CAN_STATE_LISTENING)) + { + /* Check Tx Mailbox 0 */ + if ((TxMailboxes & CAN_TX_MAILBOX0) != 0U) + { + /* Add cancellation request for Tx Mailbox 0 */ + SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ0); + } + + /* Check Tx Mailbox 1 */ + if ((TxMailboxes & CAN_TX_MAILBOX1) != 0U) + { + /* Add cancellation request for Tx Mailbox 1 */ + SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ1); + } + + /* Check Tx Mailbox 2 */ + if ((TxMailboxes & CAN_TX_MAILBOX2) != 0U) + { + /* Add cancellation request for Tx Mailbox 2 */ + SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ2); + } + + /* Return function status */ + return HAL_OK; + } + else + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED; + + return HAL_ERROR; + } +} + +/** + * @brief Return Tx Mailboxes free level: number of free Tx Mailboxes. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval Number of free Tx Mailboxes. + */ +uint32_t HAL_CAN_GetTxMailboxesFreeLevel(CAN_HandleTypeDef *hcan) +{ + uint32_t freelevel = 0U; + HAL_CAN_StateTypeDef state = hcan->State; + + if ((state == HAL_CAN_STATE_READY) || + (state == HAL_CAN_STATE_LISTENING)) + { + /* Check Tx Mailbox 0 status */ + if ((hcan->Instance->TSR & CAN_TSR_TME0) != 0U) + { + freelevel++; + } + + /* Check Tx Mailbox 1 status */ + if ((hcan->Instance->TSR & CAN_TSR_TME1) != 0U) + { + freelevel++; + } + + /* Check Tx Mailbox 2 status */ + if ((hcan->Instance->TSR & CAN_TSR_TME2) != 0U) + { + freelevel++; + } + } + + /* Return Tx Mailboxes free level */ + return freelevel; +} + +/** + * @brief Check if a transmission request is pending on the selected Tx + * Mailboxes. + * @param hcan pointer to an CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @param TxMailboxes List of Tx Mailboxes to check. + * This parameter can be any combination of @arg CAN_Tx_Mailboxes. + * @retval Status + * - 0 : No pending transmission request on any selected Tx Mailboxes. + * - 1 : Pending transmission request on at least one of the selected + * Tx Mailbox. + */ +uint32_t HAL_CAN_IsTxMessagePending(CAN_HandleTypeDef *hcan, uint32_t TxMailboxes) +{ + uint32_t status = 0U; + HAL_CAN_StateTypeDef state = hcan->State; + + /* Check function parameters */ + assert_param(IS_CAN_TX_MAILBOX_LIST(TxMailboxes)); + + if ((state == HAL_CAN_STATE_READY) || + (state == HAL_CAN_STATE_LISTENING)) + { + /* Check pending transmission request on the selected Tx Mailboxes */ + if ((hcan->Instance->TSR & (TxMailboxes << CAN_TSR_TME0_Pos)) != (TxMailboxes << CAN_TSR_TME0_Pos)) + { + status = 1U; + } + } + + /* Return status */ + return status; +} + +/** + * @brief Return timestamp of Tx message sent, if time triggered communication + mode is enabled. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @param TxMailbox Tx Mailbox where the timestamp of message sent will be + * read. + * This parameter can be one value of @arg CAN_Tx_Mailboxes. + * @retval Timestamp of message sent from Tx Mailbox. + */ +uint32_t HAL_CAN_GetTxTimestamp(CAN_HandleTypeDef *hcan, uint32_t TxMailbox) +{ + uint32_t timestamp = 0U; + uint32_t transmitmailbox; + HAL_CAN_StateTypeDef state = hcan->State; + + /* Check function parameters */ + assert_param(IS_CAN_TX_MAILBOX(TxMailbox)); + + if ((state == HAL_CAN_STATE_READY) || + (state == HAL_CAN_STATE_LISTENING)) + { + /* Select the Tx mailbox */ + transmitmailbox = POSITION_VAL(TxMailbox); + + /* Get timestamp */ + timestamp = (hcan->Instance->sTxMailBox[transmitmailbox].TDTR & CAN_TDT0R_TIME) >> CAN_TDT0R_TIME_Pos; + } + + /* Return the timestamp */ + return timestamp; +} + +/** + * @brief Get an CAN frame from the Rx FIFO zone into the message RAM. + * @param hcan pointer to an CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @param RxFifo Fifo number of the received message to be read. + * This parameter can be a value of @arg CAN_receive_FIFO_number. + * @param pHeader pointer to a CAN_RxHeaderTypeDef structure where the header + * of the Rx frame will be stored. + * @param aData array where the payload of the Rx frame will be stored. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_CAN_GetRxMessage(CAN_HandleTypeDef *hcan, uint32_t RxFifo, CAN_RxHeaderTypeDef *pHeader, uint8_t aData[]) +{ + HAL_CAN_StateTypeDef state = hcan->State; + + assert_param(IS_CAN_RX_FIFO(RxFifo)); + + if ((state == HAL_CAN_STATE_READY) || + (state == HAL_CAN_STATE_LISTENING)) + { + /* Check the Rx FIFO */ + if (RxFifo == CAN_RX_FIFO0) /* Rx element is assigned to Rx FIFO 0 */ + { + /* Check that the Rx FIFO 0 is not empty */ + if ((hcan->Instance->RF0R & CAN_RF0R_FMP0) == 0U) + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_PARAM; + + return HAL_ERROR; + } + } + else /* Rx element is assigned to Rx FIFO 1 */ + { + /* Check that the Rx FIFO 1 is not empty */ + if ((hcan->Instance->RF1R & CAN_RF1R_FMP1) == 0U) + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_PARAM; + + return HAL_ERROR; + } + } + + /* Get the header */ + pHeader->IDE = CAN_RI0R_IDE & hcan->Instance->sFIFOMailBox[RxFifo].RIR; + if (pHeader->IDE == CAN_ID_STD) + { + pHeader->StdId = (CAN_RI0R_STID & hcan->Instance->sFIFOMailBox[RxFifo].RIR) >> CAN_TI0R_STID_Pos; + } + else + { + pHeader->ExtId = ((CAN_RI0R_EXID | CAN_RI0R_STID) & hcan->Instance->sFIFOMailBox[RxFifo].RIR) >> CAN_RI0R_EXID_Pos; + } + pHeader->RTR = (CAN_RI0R_RTR & hcan->Instance->sFIFOMailBox[RxFifo].RIR); + pHeader->DLC = (CAN_RDT0R_DLC & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_DLC_Pos; + pHeader->FilterMatchIndex = (CAN_RDT0R_FMI & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_FMI_Pos; + pHeader->Timestamp = (CAN_RDT0R_TIME & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_TIME_Pos; + + /* Get the data */ + aData[0] = (uint8_t)((CAN_RDL0R_DATA0 & hcan->Instance->sFIFOMailBox[RxFifo].RDLR) >> CAN_RDL0R_DATA0_Pos); + aData[1] = (uint8_t)((CAN_RDL0R_DATA1 & hcan->Instance->sFIFOMailBox[RxFifo].RDLR) >> CAN_RDL0R_DATA1_Pos); + aData[2] = (uint8_t)((CAN_RDL0R_DATA2 & hcan->Instance->sFIFOMailBox[RxFifo].RDLR) >> CAN_RDL0R_DATA2_Pos); + aData[3] = (uint8_t)((CAN_RDL0R_DATA3 & hcan->Instance->sFIFOMailBox[RxFifo].RDLR) >> CAN_RDL0R_DATA3_Pos); + aData[4] = (uint8_t)((CAN_RDH0R_DATA4 & hcan->Instance->sFIFOMailBox[RxFifo].RDHR) >> CAN_RDH0R_DATA4_Pos); + aData[5] = (uint8_t)((CAN_RDH0R_DATA5 & hcan->Instance->sFIFOMailBox[RxFifo].RDHR) >> CAN_RDH0R_DATA5_Pos); + aData[6] = (uint8_t)((CAN_RDH0R_DATA6 & hcan->Instance->sFIFOMailBox[RxFifo].RDHR) >> CAN_RDH0R_DATA6_Pos); + aData[7] = (uint8_t)((CAN_RDH0R_DATA7 & hcan->Instance->sFIFOMailBox[RxFifo].RDHR) >> CAN_RDH0R_DATA7_Pos); + + /* Release the FIFO */ + if (RxFifo == CAN_RX_FIFO0) /* Rx element is assigned to Rx FIFO 0 */ + { + /* Release RX FIFO 0 */ + SET_BIT(hcan->Instance->RF0R, CAN_RF0R_RFOM0); + } + else /* Rx element is assigned to Rx FIFO 1 */ + { + /* Release RX FIFO 1 */ + SET_BIT(hcan->Instance->RF1R, CAN_RF1R_RFOM1); + } + + /* Return function status */ + return HAL_OK; + } + else + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED; + + return HAL_ERROR; + } +} + +/** + * @brief Return Rx FIFO fill level. + * @param hcan pointer to an CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @param RxFifo Rx FIFO. + * This parameter can be a value of @arg CAN_receive_FIFO_number. + * @retval Number of messages available in Rx FIFO. + */ +uint32_t HAL_CAN_GetRxFifoFillLevel(CAN_HandleTypeDef *hcan, uint32_t RxFifo) +{ + uint32_t filllevel = 0U; + HAL_CAN_StateTypeDef state = hcan->State; + + /* Check function parameters */ + assert_param(IS_CAN_RX_FIFO(RxFifo)); + + if ((state == HAL_CAN_STATE_READY) || + (state == HAL_CAN_STATE_LISTENING)) + { + if (RxFifo == CAN_RX_FIFO0) + { + filllevel = hcan->Instance->RF0R & CAN_RF0R_FMP0; + } + else /* RxFifo == CAN_RX_FIFO1 */ + { + filllevel = hcan->Instance->RF1R & CAN_RF1R_FMP1; + } + } + + /* Return Rx FIFO fill level */ + return filllevel; +} + +/** + * @} + */ + +/** @defgroup CAN_Exported_Functions_Group4 Interrupts management + * @brief Interrupts management + * +@verbatim + ============================================================================== + ##### Interrupts management ##### + ============================================================================== + [..] This section provides functions allowing to: + (+) HAL_CAN_ActivateNotification : Enable interrupts + (+) HAL_CAN_DeactivateNotification : Disable interrupts + (+) HAL_CAN_IRQHandler : Handles CAN interrupt request + +@endverbatim + * @{ + */ + +/** + * @brief Enable interrupts. + * @param hcan pointer to an CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @param ActiveITs indicates which interrupts will be enabled. + * This parameter can be any combination of @arg CAN_Interrupts. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_CAN_ActivateNotification(CAN_HandleTypeDef *hcan, uint32_t ActiveITs) +{ + HAL_CAN_StateTypeDef state = hcan->State; + + /* Check function parameters */ + assert_param(IS_CAN_IT(ActiveITs)); + + if ((state == HAL_CAN_STATE_READY) || + (state == HAL_CAN_STATE_LISTENING)) + { + /* Enable the selected interrupts */ + __HAL_CAN_ENABLE_IT(hcan, ActiveITs); + + /* Return function status */ + return HAL_OK; + } + else + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED; + + return HAL_ERROR; + } +} + +/** + * @brief Disable interrupts. + * @param hcan pointer to an CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @param InactiveITs indicates which interrupts will be disabled. + * This parameter can be any combination of @arg CAN_Interrupts. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_CAN_DeactivateNotification(CAN_HandleTypeDef *hcan, uint32_t InactiveITs) +{ + HAL_CAN_StateTypeDef state = hcan->State; + + /* Check function parameters */ + assert_param(IS_CAN_IT(InactiveITs)); + + if ((state == HAL_CAN_STATE_READY) || + (state == HAL_CAN_STATE_LISTENING)) + { + /* Disable the selected interrupts */ + __HAL_CAN_DISABLE_IT(hcan, InactiveITs); + + /* Return function status */ + return HAL_OK; + } + else + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED; + + return HAL_ERROR; + } +} + +/** + * @brief Handles CAN interrupt request + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +void HAL_CAN_IRQHandler(CAN_HandleTypeDef *hcan) +{ + uint32_t errorcode = HAL_CAN_ERROR_NONE; + uint32_t interrupts = READ_REG(hcan->Instance->IER); + uint32_t msrflags = READ_REG(hcan->Instance->MSR); + uint32_t tsrflags = READ_REG(hcan->Instance->TSR); + uint32_t rf0rflags = READ_REG(hcan->Instance->RF0R); + uint32_t rf1rflags = READ_REG(hcan->Instance->RF1R); + uint32_t esrflags = READ_REG(hcan->Instance->ESR); + + /* Transmit Mailbox empty interrupt management *****************************/ + if ((interrupts & CAN_IT_TX_MAILBOX_EMPTY) != 0U) + { + /* Transmit Mailbox 0 management *****************************************/ + if ((tsrflags & CAN_TSR_RQCP0) != 0U) + { + /* Clear the Transmission Complete flag (and TXOK0,ALST0,TERR0 bits) */ + __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_RQCP0); + + if ((tsrflags & CAN_TSR_TXOK0) != 0U) + { + /* Transmission Mailbox 0 complete callback */ +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + /* Call registered callback*/ + hcan->TxMailbox0CompleteCallback(hcan); +#else + /* Call weak (surcharged) callback */ + HAL_CAN_TxMailbox0CompleteCallback(hcan); +#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + } + else + { + if ((tsrflags & CAN_TSR_ALST0) != 0U) + { + /* Update error code */ + errorcode |= HAL_CAN_ERROR_TX_ALST0; + } + else if ((tsrflags & CAN_TSR_TERR0) != 0U) + { + /* Update error code */ + errorcode |= HAL_CAN_ERROR_TX_TERR0; + } + else + { + /* Transmission Mailbox 0 abort callback */ +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + /* Call registered callback*/ + hcan->TxMailbox0AbortCallback(hcan); +#else + /* Call weak (surcharged) callback */ + HAL_CAN_TxMailbox0AbortCallback(hcan); +#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + } + } + } + + /* Transmit Mailbox 1 management *****************************************/ + if ((tsrflags & CAN_TSR_RQCP1) != 0U) + { + /* Clear the Transmission Complete flag (and TXOK1,ALST1,TERR1 bits) */ + __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_RQCP1); + + if ((tsrflags & CAN_TSR_TXOK1) != 0U) + { + /* Transmission Mailbox 1 complete callback */ +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + /* Call registered callback*/ + hcan->TxMailbox1CompleteCallback(hcan); +#else + /* Call weak (surcharged) callback */ + HAL_CAN_TxMailbox1CompleteCallback(hcan); +#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + } + else + { + if ((tsrflags & CAN_TSR_ALST1) != 0U) + { + /* Update error code */ + errorcode |= HAL_CAN_ERROR_TX_ALST1; + } + else if ((tsrflags & CAN_TSR_TERR1) != 0U) + { + /* Update error code */ + errorcode |= HAL_CAN_ERROR_TX_TERR1; + } + else + { + /* Transmission Mailbox 1 abort callback */ +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + /* Call registered callback*/ + hcan->TxMailbox1AbortCallback(hcan); +#else + /* Call weak (surcharged) callback */ + HAL_CAN_TxMailbox1AbortCallback(hcan); +#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + } + } + } + + /* Transmit Mailbox 2 management *****************************************/ + if ((tsrflags & CAN_TSR_RQCP2) != 0U) + { + /* Clear the Transmission Complete flag (and TXOK2,ALST2,TERR2 bits) */ + __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_RQCP2); + + if ((tsrflags & CAN_TSR_TXOK2) != 0U) + { + /* Transmission Mailbox 2 complete callback */ +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + /* Call registered callback*/ + hcan->TxMailbox2CompleteCallback(hcan); +#else + /* Call weak (surcharged) callback */ + HAL_CAN_TxMailbox2CompleteCallback(hcan); +#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + } + else + { + if ((tsrflags & CAN_TSR_ALST2) != 0U) + { + /* Update error code */ + errorcode |= HAL_CAN_ERROR_TX_ALST2; + } + else if ((tsrflags & CAN_TSR_TERR2) != 0U) + { + /* Update error code */ + errorcode |= HAL_CAN_ERROR_TX_TERR2; + } + else + { + /* Transmission Mailbox 2 abort callback */ +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + /* Call registered callback*/ + hcan->TxMailbox2AbortCallback(hcan); +#else + /* Call weak (surcharged) callback */ + HAL_CAN_TxMailbox2AbortCallback(hcan); +#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + } + } + } + } + + /* Receive FIFO 0 overrun interrupt management *****************************/ + if ((interrupts & CAN_IT_RX_FIFO0_OVERRUN) != 0U) + { + if ((rf0rflags & CAN_RF0R_FOVR0) != 0U) + { + /* Set CAN error code to Rx Fifo 0 overrun error */ + errorcode |= HAL_CAN_ERROR_RX_FOV0; + + /* Clear FIFO0 Overrun Flag */ + __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FOV0); + } + } + + /* Receive FIFO 0 full interrupt management ********************************/ + if ((interrupts & CAN_IT_RX_FIFO0_FULL) != 0U) + { + if ((rf0rflags & CAN_RF0R_FULL0) != 0U) + { + /* Clear FIFO 0 full Flag */ + __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FF0); + + /* Receive FIFO 0 full Callback */ +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + /* Call registered callback*/ + hcan->RxFifo0FullCallback(hcan); +#else + /* Call weak (surcharged) callback */ + HAL_CAN_RxFifo0FullCallback(hcan); +#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + } + } + + /* Receive FIFO 0 message pending interrupt management *********************/ + if ((interrupts & CAN_IT_RX_FIFO0_MSG_PENDING) != 0U) + { + /* Check if message is still pending */ + if ((hcan->Instance->RF0R & CAN_RF0R_FMP0) != 0U) + { + /* Receive FIFO 0 message pending Callback */ +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + /* Call registered callback*/ + hcan->RxFifo0MsgPendingCallback(hcan); +#else + /* Call weak (surcharged) callback */ + HAL_CAN_RxFifo0MsgPendingCallback(hcan); +#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + } + } + + /* Receive FIFO 1 overrun interrupt management *****************************/ + if ((interrupts & CAN_IT_RX_FIFO1_OVERRUN) != 0U) + { + if ((rf1rflags & CAN_RF1R_FOVR1) != 0U) + { + /* Set CAN error code to Rx Fifo 1 overrun error */ + errorcode |= HAL_CAN_ERROR_RX_FOV1; + + /* Clear FIFO1 Overrun Flag */ + __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FOV1); + } + } + + /* Receive FIFO 1 full interrupt management ********************************/ + if ((interrupts & CAN_IT_RX_FIFO1_FULL) != 0U) + { + if ((rf1rflags & CAN_RF1R_FULL1) != 0U) + { + /* Clear FIFO 1 full Flag */ + __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FF1); + + /* Receive FIFO 1 full Callback */ +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + /* Call registered callback*/ + hcan->RxFifo1FullCallback(hcan); +#else + /* Call weak (surcharged) callback */ + HAL_CAN_RxFifo1FullCallback(hcan); +#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + } + } + + /* Receive FIFO 1 message pending interrupt management *********************/ + if ((interrupts & CAN_IT_RX_FIFO1_MSG_PENDING) != 0U) + { + /* Check if message is still pending */ + if ((hcan->Instance->RF1R & CAN_RF1R_FMP1) != 0U) + { + /* Receive FIFO 1 message pending Callback */ +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + /* Call registered callback*/ + hcan->RxFifo1MsgPendingCallback(hcan); +#else + /* Call weak (surcharged) callback */ + HAL_CAN_RxFifo1MsgPendingCallback(hcan); +#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + } + } + + /* Sleep interrupt management *********************************************/ + if ((interrupts & CAN_IT_SLEEP_ACK) != 0U) + { + if ((msrflags & CAN_MSR_SLAKI) != 0U) + { + /* Clear Sleep interrupt Flag */ + __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_SLAKI); + + /* Sleep Callback */ +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + /* Call registered callback*/ + hcan->SleepCallback(hcan); +#else + /* Call weak (surcharged) callback */ + HAL_CAN_SleepCallback(hcan); +#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + } + } + + /* WakeUp interrupt management *********************************************/ + if ((interrupts & CAN_IT_WAKEUP) != 0U) + { + if ((msrflags & CAN_MSR_WKUI) != 0U) + { + /* Clear WakeUp Flag */ + __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_WKU); + + /* WakeUp Callback */ +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + /* Call registered callback*/ + hcan->WakeUpFromRxMsgCallback(hcan); +#else + /* Call weak (surcharged) callback */ + HAL_CAN_WakeUpFromRxMsgCallback(hcan); +#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + } + } + + /* Error interrupts management *********************************************/ + if ((interrupts & CAN_IT_ERROR) != 0U) + { + if ((msrflags & CAN_MSR_ERRI) != 0U) + { + /* Check Error Warning Flag */ + if (((interrupts & CAN_IT_ERROR_WARNING) != 0U) && + ((esrflags & CAN_ESR_EWGF) != 0U)) + { + /* Set CAN error code to Error Warning */ + errorcode |= HAL_CAN_ERROR_EWG; + + /* No need for clear of Error Warning Flag as read-only */ + } + + /* Check Error Passive Flag */ + if (((interrupts & CAN_IT_ERROR_PASSIVE) != 0U) && + ((esrflags & CAN_ESR_EPVF) != 0U)) + { + /* Set CAN error code to Error Passive */ + errorcode |= HAL_CAN_ERROR_EPV; + + /* No need for clear of Error Passive Flag as read-only */ + } + + /* Check Bus-off Flag */ + if (((interrupts & CAN_IT_BUSOFF) != 0U) && + ((esrflags & CAN_ESR_BOFF) != 0U)) + { + /* Set CAN error code to Bus-Off */ + errorcode |= HAL_CAN_ERROR_BOF; + + /* No need for clear of Error Bus-Off as read-only */ + } + + /* Check Last Error Code Flag */ + if (((interrupts & CAN_IT_LAST_ERROR_CODE) != 0U) && + ((esrflags & CAN_ESR_LEC) != 0U)) + { + switch (esrflags & CAN_ESR_LEC) + { + case (CAN_ESR_LEC_0): + /* Set CAN error code to Stuff error */ + errorcode |= HAL_CAN_ERROR_STF; + break; + case (CAN_ESR_LEC_1): + /* Set CAN error code to Form error */ + errorcode |= HAL_CAN_ERROR_FOR; + break; + case (CAN_ESR_LEC_1 | CAN_ESR_LEC_0): + /* Set CAN error code to Acknowledgement error */ + errorcode |= HAL_CAN_ERROR_ACK; + break; + case (CAN_ESR_LEC_2): + /* Set CAN error code to Bit recessive error */ + errorcode |= HAL_CAN_ERROR_BR; + break; + case (CAN_ESR_LEC_2 | CAN_ESR_LEC_0): + /* Set CAN error code to Bit Dominant error */ + errorcode |= HAL_CAN_ERROR_BD; + break; + case (CAN_ESR_LEC_2 | CAN_ESR_LEC_1): + /* Set CAN error code to CRC error */ + errorcode |= HAL_CAN_ERROR_CRC; + break; + default: + break; + } + + /* Clear Last error code Flag */ + CLEAR_BIT(hcan->Instance->ESR, CAN_ESR_LEC); + } + } + + /* Clear ERRI Flag */ + __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_ERRI); + } + + /* Call the Error call Back in case of Errors */ + if (errorcode != HAL_CAN_ERROR_NONE) + { + /* Update error code in handle */ + hcan->ErrorCode |= errorcode; + + /* Call Error callback function */ +#if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + /* Call registered callback*/ + hcan->ErrorCallback(hcan); +#else + /* Call weak (surcharged) callback */ + HAL_CAN_ErrorCallback(hcan); +#endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + } +} + +/** + * @} + */ + +/** @defgroup CAN_Exported_Functions_Group5 Callback functions + * @brief CAN Callback functions + * +@verbatim + ============================================================================== + ##### Callback functions ##### + ============================================================================== + [..] + This subsection provides the following callback functions: + (+) HAL_CAN_TxMailbox0CompleteCallback + (+) HAL_CAN_TxMailbox1CompleteCallback + (+) HAL_CAN_TxMailbox2CompleteCallback + (+) HAL_CAN_TxMailbox0AbortCallback + (+) HAL_CAN_TxMailbox1AbortCallback + (+) HAL_CAN_TxMailbox2AbortCallback + (+) HAL_CAN_RxFifo0MsgPendingCallback + (+) HAL_CAN_RxFifo0FullCallback + (+) HAL_CAN_RxFifo1MsgPendingCallback + (+) HAL_CAN_RxFifo1FullCallback + (+) HAL_CAN_SleepCallback + (+) HAL_CAN_WakeUpFromRxMsgCallback + (+) HAL_CAN_ErrorCallback + +@endverbatim + * @{ + */ + +/** + * @brief Transmission Mailbox 0 complete callback. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +__weak void HAL_CAN_TxMailbox0CompleteCallback(CAN_HandleTypeDef *hcan) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_CAN_TxMailbox0CompleteCallback could be implemented in the + user file + */ +} + +/** + * @brief Transmission Mailbox 1 complete callback. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +__weak void HAL_CAN_TxMailbox1CompleteCallback(CAN_HandleTypeDef *hcan) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_CAN_TxMailbox1CompleteCallback could be implemented in the + user file + */ +} + +/** + * @brief Transmission Mailbox 2 complete callback. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +__weak void HAL_CAN_TxMailbox2CompleteCallback(CAN_HandleTypeDef *hcan) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_CAN_TxMailbox2CompleteCallback could be implemented in the + user file + */ +} + +/** + * @brief Transmission Mailbox 0 Cancellation callback. + * @param hcan pointer to an CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +__weak void HAL_CAN_TxMailbox0AbortCallback(CAN_HandleTypeDef *hcan) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_CAN_TxMailbox0AbortCallback could be implemented in the + user file + */ +} + +/** + * @brief Transmission Mailbox 1 Cancellation callback. + * @param hcan pointer to an CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +__weak void HAL_CAN_TxMailbox1AbortCallback(CAN_HandleTypeDef *hcan) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_CAN_TxMailbox1AbortCallback could be implemented in the + user file + */ +} + +/** + * @brief Transmission Mailbox 2 Cancellation callback. + * @param hcan pointer to an CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +__weak void HAL_CAN_TxMailbox2AbortCallback(CAN_HandleTypeDef *hcan) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_CAN_TxMailbox2AbortCallback could be implemented in the + user file + */ +} + +/** + * @brief Rx FIFO 0 message pending callback. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +__weak void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_CAN_RxFifo0MsgPendingCallback could be implemented in the + user file + */ +} + +/** + * @brief Rx FIFO 0 full callback. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +__weak void HAL_CAN_RxFifo0FullCallback(CAN_HandleTypeDef *hcan) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_CAN_RxFifo0FullCallback could be implemented in the user + file + */ +} + +/** + * @brief Rx FIFO 1 message pending callback. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +__weak void HAL_CAN_RxFifo1MsgPendingCallback(CAN_HandleTypeDef *hcan) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_CAN_RxFifo1MsgPendingCallback could be implemented in the + user file + */ +} + +/** + * @brief Rx FIFO 1 full callback. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +__weak void HAL_CAN_RxFifo1FullCallback(CAN_HandleTypeDef *hcan) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_CAN_RxFifo1FullCallback could be implemented in the user + file + */ +} + +/** + * @brief Sleep callback. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +__weak void HAL_CAN_SleepCallback(CAN_HandleTypeDef *hcan) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_CAN_SleepCallback could be implemented in the user file + */ +} + +/** + * @brief WakeUp from Rx message callback. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +__weak void HAL_CAN_WakeUpFromRxMsgCallback(CAN_HandleTypeDef *hcan) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_CAN_WakeUpFromRxMsgCallback could be implemented in the + user file + */ +} + +/** + * @brief Error CAN callback. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval None + */ +__weak void HAL_CAN_ErrorCallback(CAN_HandleTypeDef *hcan) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(hcan); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_CAN_ErrorCallback could be implemented in the user file + */ +} + +/** + * @} + */ + +/** @defgroup CAN_Exported_Functions_Group6 Peripheral State and Error functions + * @brief CAN Peripheral State functions + * +@verbatim + ============================================================================== + ##### Peripheral State and Error functions ##### + ============================================================================== + [..] + This subsection provides functions allowing to : + (+) HAL_CAN_GetState() : Return the CAN state. + (+) HAL_CAN_GetError() : Return the CAN error codes if any. + (+) HAL_CAN_ResetError(): Reset the CAN error codes if any. + +@endverbatim + * @{ + */ + +/** + * @brief Return the CAN state. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval HAL state + */ +HAL_CAN_StateTypeDef HAL_CAN_GetState(CAN_HandleTypeDef *hcan) +{ + HAL_CAN_StateTypeDef state = hcan->State; + + if ((state == HAL_CAN_STATE_READY) || + (state == HAL_CAN_STATE_LISTENING)) + { + /* Check sleep mode acknowledge flag */ + if ((hcan->Instance->MSR & CAN_MSR_SLAK) != 0U) + { + /* Sleep mode is active */ + state = HAL_CAN_STATE_SLEEP_ACTIVE; + } + /* Check sleep mode request flag */ + else if ((hcan->Instance->MCR & CAN_MCR_SLEEP) != 0U) + { + /* Sleep mode request is pending */ + state = HAL_CAN_STATE_SLEEP_PENDING; + } + else + { + /* Neither sleep mode request nor sleep mode acknowledge */ + } + } + + /* Return CAN state */ + return state; +} + +/** + * @brief Return the CAN error code. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval CAN Error Code + */ +uint32_t HAL_CAN_GetError(CAN_HandleTypeDef *hcan) +{ + /* Return CAN error code */ + return hcan->ErrorCode; +} + +/** + * @brief Reset the CAN error code. + * @param hcan pointer to a CAN_HandleTypeDef structure that contains + * the configuration information for the specified CAN. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_CAN_ResetError(CAN_HandleTypeDef *hcan) +{ + HAL_StatusTypeDef status = HAL_OK; + HAL_CAN_StateTypeDef state = hcan->State; + + if ((state == HAL_CAN_STATE_READY) || + (state == HAL_CAN_STATE_LISTENING)) + { + /* Reset CAN error code */ + hcan->ErrorCode = 0U; + } + else + { + /* Update error code */ + hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED; + + status = HAL_ERROR; + } + + /* Return the status */ + return status; +} + +/** + * @} + */ + +/** + * @} + */ + +#endif /* HAL_CAN_MODULE_ENABLED */ + +/** + * @} + */ + +#endif /* CAN */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c new file mode 100644 index 0000000..641711d --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c @@ -0,0 +1,513 @@ +/** + ****************************************************************************** + * @file stm32f3xx_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 + + (#) Configure the priority of the selected IRQ Channels using HAL_NVIC_SetPriority() + + (#) Enable the selected IRQ Channels using HAL_NVIC_EnableIRQ() + + + -@- When the NVIC_PRIORITYGROUP_0 is selected, IRQ pre-emption 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 pre-emption 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 (0x0FU). + (++) 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 stm32f3xx_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) 2016 STMicroelectronics. + * All rights reserved.

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* + Additional Tables: CORTEX_NVIC_Priority_Table + The table below gives the allowed values of the pre-emption priority and subpriority according + to the Priority Grouping configuration performed by HAL_NVIC_SetPriorityGrouping() function + ========================================================================================================================== + NVIC_PriorityGroup | NVIC_IRQChannelPreemptionPriority | NVIC_IRQChannelSubPriority | Description + ========================================================================================================================== + NVIC_PRIORITYGROUP_0 | 0 | 0U-15 | 0 bits for pre-emption priority + | | | 4 bits for subpriority + -------------------------------------------------------------------------------------------------------------------------- + NVIC_PRIORITYGROUP_1 | 0U-1 | 0U-7 | 1 bits for pre-emption priority + | | | 3 bits for subpriority + -------------------------------------------------------------------------------------------------------------------------- + NVIC_PRIORITYGROUP_2 | 0U-3 | 0U-3 | 2 bits for pre-emption priority + | | | 2 bits for subpriority + -------------------------------------------------------------------------------------------------------------------------- + NVIC_PRIORITYGROUP_3 | 0U-7 | 0U-1 | 3 bits for pre-emption priority + | | | 1 bits for subpriority + -------------------------------------------------------------------------------------------------------------------------- + NVIC_PRIORITYGROUP_4 | 0U-15 | 0 | 4 bits for pre-emption priority + | | | 0 bits for subpriority + ========================================================================================================================== + +*/ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f3xx_hal.h" + +/** @addtogroup STM32F3xx_HAL_Driver + * @{ + */ + +/** @defgroup CORTEX CORTEX + * @brief CORTEX CORTEX HAL module driver + * @{ + */ + +#ifdef HAL_CORTEX_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* 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 (pre-emption 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 pre-emption priority + * 4 bits for subpriority + * @arg NVIC_PRIORITYGROUP_1: 1 bits for pre-emption priority + * 3 bits for subpriority + * @arg NVIC_PRIORITYGROUP_2: 2 bits for pre-emption priority + * 2 bits for subpriority + * @arg NVIC_PRIORITYGROUP_3: 3 bits for pre-emption priority + * 1 bits for subpriority + * @arg NVIC_PRIORITYGROUP_4: 4 bits for pre-emption priority + * 0 bits for subpriority + * @note When the NVIC_PriorityGroup_0 is selected, IRQ pre-emption 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 (stm32f3xxxx.h)) + * @param PreemptPriority The pre-emption priority for the IRQn channel. + * This parameter can be a value between 0 and 15 as described in the table CORTEX_NVIC_Priority_Table + * 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 as described in the table CORTEX_NVIC_Priority_Table + * 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 (stm32f3xxxx.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 (stm32f3xxxx.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 also clears the HFNMIENA bit (ARM recommendation) + * @retval None + */ +void HAL_MPU_Disable(void) +{ + /* Disable fault exceptions */ + SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; + + /* Disable the MPU */ + MPU->CTRL = 0U; +} + +/** + * @brief Enables 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; +} + + /** + * @brief Initializes and configures the Region and the memory to be protected. + * @param MPU_Init Pointer to a MPU_Region_InitTypeDef structure that contains + * the initialization and configuration information. + * @retval None + */ +void HAL_MPU_ConfigRegion(MPU_Region_InitTypeDef *MPU_Init) +{ + /* Check the parameters */ + assert_param(IS_MPU_REGION_NUMBER(MPU_Init->Number)); + assert_param(IS_MPU_REGION_ENABLE(MPU_Init->Enable)); + + /* Set the Region number */ + MPU->RNR = MPU_Init->Number; + + if ((MPU_Init->Enable) != RESET) + { + /* Check the parameters */ + assert_param(IS_MPU_INSTRUCTION_ACCESS(MPU_Init->DisableExec)); + assert_param(IS_MPU_REGION_PERMISSION_ATTRIBUTE(MPU_Init->AccessPermission)); + assert_param(IS_MPU_TEX_LEVEL(MPU_Init->TypeExtField)); + assert_param(IS_MPU_ACCESS_SHAREABLE(MPU_Init->IsShareable)); + assert_param(IS_MPU_ACCESS_CACHEABLE(MPU_Init->IsCacheable)); + assert_param(IS_MPU_ACCESS_BUFFERABLE(MPU_Init->IsBufferable)); + assert_param(IS_MPU_SUB_REGION_DISABLE(MPU_Init->SubRegionDisable)); + assert_param(IS_MPU_REGION_SIZE(MPU_Init->Size)); + + MPU->RBAR = MPU_Init->BaseAddress; + MPU->RASR = ((uint32_t)MPU_Init->DisableExec << MPU_RASR_XN_Pos) | + ((uint32_t)MPU_Init->AccessPermission << MPU_RASR_AP_Pos) | + ((uint32_t)MPU_Init->TypeExtField << MPU_RASR_TEX_Pos) | + ((uint32_t)MPU_Init->IsShareable << MPU_RASR_S_Pos) | + ((uint32_t)MPU_Init->IsCacheable << MPU_RASR_C_Pos) | + ((uint32_t)MPU_Init->IsBufferable << MPU_RASR_B_Pos) | + ((uint32_t)MPU_Init->SubRegionDisable << MPU_RASR_SRD_Pos) | + ((uint32_t)MPU_Init->Size << MPU_RASR_SIZE_Pos) | + ((uint32_t)MPU_Init->Enable << MPU_RASR_ENABLE_Pos); + } + else + { + MPU->RBAR = 0x00U; + MPU->RASR = 0x00U; + } +} +#endif /* __MPU_PRESENT */ + +/** + * @brief Gets the priority grouping field from the NVIC Interrupt Controller. + * @retval Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field) + */ +uint32_t HAL_NVIC_GetPriorityGrouping(void) +{ + /* Get the PRIGROUP[10:8] field value */ + return NVIC_GetPriorityGrouping(); +} + +/** + * @brief Gets the priority of an interrupt. + * @param IRQn External interrupt number + * This parameter can be an enumerator of IRQn_Type enumeration + * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f3xxxx.h)) + * @param PriorityGroup: the priority grouping bits length. + * This parameter can be one of the following values: + * @arg NVIC_PRIORITYGROUP_0: 0 bits for pre-emption priority + * 4 bits for subpriority + * @arg NVIC_PRIORITYGROUP_1: 1 bits for pre-emption priority + * 3 bits for subpriority + * @arg NVIC_PRIORITYGROUP_2: 2 bits for pre-emption priority + * 2 bits for subpriority + * @arg NVIC_PRIORITYGROUP_3: 3 bits for pre-emption priority + * 1 bits for subpriority + * @arg NVIC_PRIORITYGROUP_4: 4 bits for pre-emption 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 (stm32f3xxxx.h)) + * @retval None + */ +void HAL_NVIC_SetPendingIRQ(IRQn_Type 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 (stm32f3xxxx.h)) + * @retval status: - 0 Interrupt status is not pending. + * - 1 Interrupt status is pending. + */ +uint32_t HAL_NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + /* Return 1 if pending else 0U */ + 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 (stm32f3xxxx.h)) + * @retval None + */ +void HAL_NVIC_ClearPendingIRQ(IRQn_Type 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 (stm32f3xxxx.h)) + * @retval status: - 0 Interrupt status is not pending. + * - 1 Interrupt status is pending. + */ +uint32_t HAL_NVIC_GetActive(IRQn_Type IRQn) +{ + /* Return 1 if active else 0U */ + return NVIC_GetActive(IRQn); +} + +/** + * @brief Configures the SysTick clock source. + * @param CLKSource specifies the SysTick clock source. + * This parameter can be one of the following values: + * @arg SYSTICK_CLKSOURCE_HCLK_DIV8: AHB clock divided by 8 selected as SysTick clock source. + * @arg SYSTICK_CLKSOURCE_HCLK: AHB clock selected as SysTick clock source. + * @retval None + */ +void HAL_SYSTICK_CLKSourceConfig(uint32_t CLKSource) +{ + /* Check the parameters */ + assert_param(IS_SYSTICK_CLK_SOURCE(CLKSource)); + if (CLKSource == SYSTICK_CLKSOURCE_HCLK) + { + SysTick->CTRL |= SYSTICK_CLKSOURCE_HCLK; + } + else + { + SysTick->CTRL &= ~SYSTICK_CLKSOURCE_HCLK; + } +} + +/** + * @brief This function handles SYSTICK interrupt request. + * @retval None + */ +void HAL_SYSTICK_IRQHandler(void) +{ + HAL_SYSTICK_Callback(); +} + +/** + * @brief SYSTICK callback. + * @retval None + */ +__weak void HAL_SYSTICK_Callback(void) +{ + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_SYSTICK_Callback could be implemented in the user file + */ +} + +/** + * @} + */ + +/** + * @} + */ + +#endif /* HAL_CORTEX_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c new file mode 100644 index 0000000..cb6a091 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c @@ -0,0 +1,900 @@ +/** + ****************************************************************************** + * @file stm32f3xx_hal_dma.c + * @author MCD Application Team + * @brief DMA HAL module driver. + * + * This file provides firmware functions to manage the following + * functionalities of the Direct Memory Access (DMA) peripheral: + * + Initialization and de-initialization functions + * + IO operation functions + * + Peripheral State and errors functions + @verbatim + ============================================================================== + ##### How to use this driver ##### + ============================================================================== + [..] + (#) Enable and configure the peripheral to be connected to the DMA Channel + (except for internal SRAM / FLASH memories: no initialization is + necessary). Please refer to Reference manual for connection between peripherals + and DMA requests . + + (#) For a given Channel, program the required configuration through the following parameters: + Transfer Direction, Source and Destination data formats, + Circular or Normal mode, Channel Priority level, Source and Destination Increment mode, + using HAL_DMA_Init() function. + + (#) Use HAL_DMA_GetState() function to return the DMA state and HAL_DMA_GetError() in case of error + detection. + + (#) Use HAL_DMA_Abort() function to abort the current transfer + + -@- In Memory-to-Memory transfer mode, Circular mode is not allowed. + *** Polling mode IO operation *** + ================================= + [..] + (+) Use HAL_DMA_Start() to start DMA transfer after the configuration of Source + address and destination address and the Length of data to be transferred + (+) Use HAL_DMA_PollForTransfer() to poll for the end of current transfer, in this + case a fixed Timeout can be configured by User depending from his application. + + *** Interrupt mode IO operation *** + =================================== + [..] + (+) Configure the DMA interrupt priority using HAL_NVIC_SetPriority() + (+) Enable the DMA IRQ handler using HAL_NVIC_EnableIRQ() + (+) Use HAL_DMA_Start_IT() to start DMA transfer after the configuration of + Source address and destination address and the Length of data to be transferred. + In this case the DMA interrupt is configured + (+) Use HAL_DMA_Channel_IRQHandler() called under DMA_IRQHandler() Interrupt subroutine + (+) At the end of data transfer HAL_DMA_IRQHandler() function is executed and user can + add his own function by customization of function pointer XferCpltCallback and + XferErrorCallback (i.e a member of DMA handle structure). + + *** DMA HAL driver macros list *** + ============================================= + [..] + Below the list of most used macros in DMA HAL driver. + + [..] + (@) You can refer to the DMA HAL driver header file for more useful macros + + @endverbatim + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f3xx_hal.h" + +/** @addtogroup STM32F3xx_HAL_Driver + * @{ + */ + +/** @defgroup DMA DMA + * @brief DMA HAL module driver + * @{ + */ + +#ifdef HAL_DMA_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/** @defgroup DMA_Private_Functions DMA Private Functions + * @{ + */ +static void DMA_SetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength); +static void DMA_CalcBaseAndBitshift(DMA_HandleTypeDef *hdma); +/** + * @} + */ + +/* Exported functions ---------------------------------------------------------*/ + +/** @defgroup DMA_Exported_Functions DMA Exported Functions + * @{ + */ + +/** @defgroup DMA_Exported_Functions_Group1 Initialization and de-initialization functions + * @brief Initialization and de-initialization functions + * +@verbatim + =============================================================================== + ##### Initialization and de-initialization functions ##### + =============================================================================== + [..] + This section provides functions allowing to initialize the DMA Channel source + and destination addresses, incrementation and data sizes, transfer direction, + circular/normal mode selection, memory-to-memory mode selection and Channel priority value. + [..] + The HAL_DMA_Init() function follows the DMA configuration procedures as described in + reference manual. + +@endverbatim + * @{ + */ + +/** + * @brief Initialize the DMA according to the specified + * parameters in the DMA_InitTypeDef and initialize the associated handle. + * @param hdma Pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Channel. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma) +{ + uint32_t tmp = 0U; + + /* Check the DMA handle allocation */ + if(NULL == hdma) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_DMA_ALL_INSTANCE(hdma->Instance)); + assert_param(IS_DMA_DIRECTION(hdma->Init.Direction)); + assert_param(IS_DMA_PERIPHERAL_INC_STATE(hdma->Init.PeriphInc)); + assert_param(IS_DMA_MEMORY_INC_STATE(hdma->Init.MemInc)); + assert_param(IS_DMA_PERIPHERAL_DATA_SIZE(hdma->Init.PeriphDataAlignment)); + assert_param(IS_DMA_MEMORY_DATA_SIZE(hdma->Init.MemDataAlignment)); + assert_param(IS_DMA_MODE(hdma->Init.Mode)); + assert_param(IS_DMA_PRIORITY(hdma->Init.Priority)); + + /* Change DMA peripheral state */ + hdma->State = HAL_DMA_STATE_BUSY; + + /* Get the CR register value */ + tmp = hdma->Instance->CCR; + + /* Clear PL, MSIZE, PSIZE, MINC, PINC, CIRC, DIR bits */ + tmp &= ((uint32_t)~(DMA_CCR_PL | DMA_CCR_MSIZE | DMA_CCR_PSIZE | \ + DMA_CCR_MINC | DMA_CCR_PINC | DMA_CCR_CIRC | \ + DMA_CCR_DIR)); + + /* Prepare the DMA Channel configuration */ + tmp |= hdma->Init.Direction | + hdma->Init.PeriphInc | hdma->Init.MemInc | + hdma->Init.PeriphDataAlignment | hdma->Init.MemDataAlignment | + hdma->Init.Mode | hdma->Init.Priority; + + /* Write to DMA Channel CR register */ + hdma->Instance->CCR = tmp; + + /* Initialize DmaBaseAddress and ChannelIndex parameters used + by HAL_DMA_IRQHandler() and HAL_DMA_PollForTransfer() */ + DMA_CalcBaseAndBitshift(hdma); + + /* Initialise the error code */ + hdma->ErrorCode = HAL_DMA_ERROR_NONE; + + /* Initialize the DMA state*/ + hdma->State = HAL_DMA_STATE_READY; + + /* Allocate lock resource and initialize it */ + hdma->Lock = HAL_UNLOCKED; + + return HAL_OK; +} + +/** + * @brief DeInitialize the DMA peripheral + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Channel. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA_DeInit(DMA_HandleTypeDef *hdma) +{ + /* Check the DMA handle allocation */ + if(NULL == hdma) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_DMA_ALL_INSTANCE(hdma->Instance)); + + /* Disable the selected DMA Channelx */ + hdma->Instance->CCR &= ~DMA_CCR_EN; + + /* Reset DMA Channel control register */ + hdma->Instance->CCR = 0U; + + /* Reset DMA Channel Number of Data to Transfer register */ + hdma->Instance->CNDTR = 0U; + + /* Reset DMA Channel peripheral address register */ + hdma->Instance->CPAR = 0U; + + /* Reset DMA Channel memory address register */ + hdma->Instance->CMAR = 0U; + + /* Get DMA Base Address */ + DMA_CalcBaseAndBitshift(hdma); + + /* Clear all flags */ + hdma->DmaBaseAddress->IFCR = DMA_FLAG_GL1 << hdma->ChannelIndex; + + /* Clean callbacks */ + hdma->XferCpltCallback = NULL; + hdma->XferHalfCpltCallback = NULL; + hdma->XferErrorCallback = NULL; + hdma->XferAbortCallback = NULL; + + /* Reset the error code */ + hdma->ErrorCode = HAL_DMA_ERROR_NONE; + + /* Reset the DMA state */ + hdma->State = HAL_DMA_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(hdma); + + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup DMA_Exported_Functions_Group2 Input and Output operation functions + * @brief I/O operation functions + * +@verbatim + =============================================================================== + ##### IO operation functions ##### + =============================================================================== + [..] This section provides functions allowing to: + (+) Configure the source, destination address and data length and Start DMA transfer + (+) Configure the source, destination address and data length and + Start DMA transfer with interrupt + (+) Abort DMA transfer + (+) Poll for transfer complete + (+) Handle DMA interrupt request + +@endverbatim + * @{ + */ + +/** + * @brief Start the DMA Transfer. + * @param hdma : pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Channel. + * @param SrcAddress The source memory Buffer address + * @param DstAddress The destination memory Buffer address + * @param DataLength The length of data to be transferred from source to destination + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA_Start(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_DMA_BUFFER_SIZE(DataLength)); + + /* Process locked */ + __HAL_LOCK(hdma); + + if(HAL_DMA_STATE_READY == hdma->State) + { + /* Change DMA peripheral state */ + hdma->State = HAL_DMA_STATE_BUSY; + + hdma->ErrorCode = HAL_DMA_ERROR_NONE; + + /* Disable the peripheral */ + hdma->Instance->CCR &= ~DMA_CCR_EN; + + /* Configure the source, destination address and the data length */ + DMA_SetConfig(hdma, SrcAddress, DstAddress, DataLength); + + /* Enable the Peripheral */ + hdma->Instance->CCR |= DMA_CCR_EN; + } + else + { + /* Process Unlocked */ + __HAL_UNLOCK(hdma); + + /* Remain BUSY */ + status = HAL_BUSY; + } + + return status; +} + +/** + * @brief Start the DMA Transfer with interrupt enabled. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Channel. + * @param SrcAddress The source memory Buffer address + * @param DstAddress The destination memory Buffer address + * @param DataLength The length of data to be transferred from source to destination + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_DMA_BUFFER_SIZE(DataLength)); + + /* Process locked */ + __HAL_LOCK(hdma); + + if(HAL_DMA_STATE_READY == hdma->State) + { + /* Change DMA peripheral state */ + hdma->State = HAL_DMA_STATE_BUSY; + + hdma->ErrorCode = HAL_DMA_ERROR_NONE; + + /* Disable the peripheral */ + hdma->Instance->CCR &= ~DMA_CCR_EN; + + /* Configure the source, destination address and the data length */ + DMA_SetConfig(hdma, SrcAddress, DstAddress, DataLength); + + /* Enable the transfer complete, & transfer error interrupts */ + /* Half transfer interrupt is optional: enable it only if associated callback is available */ + if(NULL != hdma->XferHalfCpltCallback ) + { + hdma->Instance->CCR |= (DMA_IT_TC | DMA_IT_HT | DMA_IT_TE); + } + else + { + hdma->Instance->CCR |= (DMA_IT_TC | DMA_IT_TE); + hdma->Instance->CCR &= ~DMA_IT_HT; + } + + /* Enable the Peripheral */ + hdma->Instance->CCR |= DMA_CCR_EN; + } + else + { + /* Process Unlocked */ + __HAL_UNLOCK(hdma); + + /* Remain BUSY */ + status = HAL_BUSY; + } + + return status; +} + +/** + * @brief Abort the DMA Transfer. + * @param hdma : pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Channel. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma) +{ + if(hdma->State != HAL_DMA_STATE_BUSY) + { + /* no transfer ongoing */ + hdma->ErrorCode = HAL_DMA_ERROR_NO_XFER; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma); + + return HAL_ERROR; + } + else + { + /* Disable DMA IT */ + hdma->Instance->CCR &= ~(DMA_IT_TC | DMA_IT_HT | DMA_IT_TE); + + /* Disable the channel */ + hdma->Instance->CCR &= ~DMA_CCR_EN; + + /* Clear all flags */ + hdma->DmaBaseAddress->IFCR = (DMA_FLAG_GL1 << hdma->ChannelIndex); + } + /* Change the DMA state*/ + hdma->State = HAL_DMA_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma); + + return HAL_OK; +} + +/** + * @brief Abort 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) +{ + HAL_StatusTypeDef status = HAL_OK; + + if(HAL_DMA_STATE_BUSY != hdma->State) + { + /* no transfer ongoing */ + hdma->ErrorCode = HAL_DMA_ERROR_NO_XFER; + + status = HAL_ERROR; + } + else + { + + /* Disable DMA IT */ + hdma->Instance->CCR &= ~(DMA_IT_TC | DMA_IT_HT | DMA_IT_TE); + + /* Disable the channel */ + hdma->Instance->CCR &= ~DMA_CCR_EN; + + /* Clear all flags */ + hdma->DmaBaseAddress->IFCR = DMA_FLAG_GL1 << hdma->ChannelIndex; + + /* Change the DMA state */ + hdma->State = HAL_DMA_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma); + + /* Call User Abort callback */ + if(hdma->XferAbortCallback != NULL) + { + hdma->XferAbortCallback(hdma); + } + } + return status; +} + +/** + * @brief Polling for transfer complete. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Channel. + * @param CompleteLevel Specifies the DMA level complete. + * @param Timeout Timeout duration. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA_PollForTransfer(DMA_HandleTypeDef *hdma, uint32_t CompleteLevel, uint32_t Timeout) +{ + uint32_t temp; + uint32_t tickstart = 0U; + + if(HAL_DMA_STATE_BUSY != hdma->State) + { + /* no transfer ongoing */ + hdma->ErrorCode = HAL_DMA_ERROR_NO_XFER; + __HAL_UNLOCK(hdma); + return HAL_ERROR; + } + + /* Polling mode not supported in circular mode */ + if (RESET != (hdma->Instance->CCR & DMA_CCR_CIRC)) + { + hdma->ErrorCode = HAL_DMA_ERROR_NOT_SUPPORTED; + return HAL_ERROR; + } + + /* Get the level transfer complete flag */ + if(HAL_DMA_FULL_TRANSFER == CompleteLevel) + { + /* Transfer Complete flag */ + temp = DMA_FLAG_TC1 << hdma->ChannelIndex; + } + else + { + /* Half Transfer Complete flag */ + temp = DMA_FLAG_HT1 << hdma->ChannelIndex; + } + + /* Get tick */ + tickstart = HAL_GetTick(); + + while(RESET == (hdma->DmaBaseAddress->ISR & temp)) + { + if(RESET != (hdma->DmaBaseAddress->ISR & (DMA_FLAG_TE1 << hdma->ChannelIndex))) + { + /* When a DMA transfer error occurs */ + /* A hardware clear of its EN bits is performed */ + /* Clear all flags */ + hdma->DmaBaseAddress->IFCR = DMA_FLAG_GL1 << hdma->ChannelIndex; + + /* Update error code */ + hdma->ErrorCode = HAL_DMA_ERROR_TE; + + /* Change the DMA state */ + hdma->State= HAL_DMA_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma); + + return HAL_ERROR; + } + /* Check for the Timeout */ + 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_ERROR; + } + } + } + + if(HAL_DMA_FULL_TRANSFER == CompleteLevel) + { + /* Clear the transfer complete flag */ + hdma->DmaBaseAddress->IFCR = DMA_FLAG_TC1 << hdma->ChannelIndex; + + /* The selected Channelx EN bit is cleared (DMA is disabled and + all transfers are complete) */ + hdma->State = HAL_DMA_STATE_READY; + } + else + { + /* Clear the half transfer complete flag */ + hdma->DmaBaseAddress->IFCR = DMA_FLAG_HT1 << hdma->ChannelIndex; + } + + /* Process unlocked */ + __HAL_UNLOCK(hdma); + + return HAL_OK; +} + +/** + * @brief Handle DMA interrupt request. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Channel. + * @retval None + */ +void HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma) +{ + uint32_t flag_it = hdma->DmaBaseAddress->ISR; + uint32_t source_it = hdma->Instance->CCR; + + /* Half Transfer Complete Interrupt management ******************************/ + if ((RESET != (flag_it & (DMA_FLAG_HT1 << hdma->ChannelIndex))) && (RESET != (source_it & DMA_IT_HT))) + { + /* Disable the half transfer interrupt if the DMA mode is not CIRCULAR */ + if((hdma->Instance->CCR & DMA_CCR_CIRC) == 0U) + { + /* Disable the half transfer interrupt */ + hdma->Instance->CCR &= ~DMA_IT_HT; + } + + /* Clear the half transfer complete flag */ + hdma->DmaBaseAddress->IFCR = DMA_FLAG_HT1 << hdma->ChannelIndex; + + /* DMA peripheral state is not updated in Half Transfer */ + /* State is updated only in Transfer Complete case */ + + if(hdma->XferHalfCpltCallback != NULL) + { + /* Half transfer callback */ + hdma->XferHalfCpltCallback(hdma); + } + } + + /* Transfer Complete Interrupt management ***********************************/ + else if ((RESET != (flag_it & (DMA_FLAG_TC1 << hdma->ChannelIndex))) && (RESET != (source_it & DMA_IT_TC))) + { + if((hdma->Instance->CCR & DMA_CCR_CIRC) == 0U) + { + /* Disable the transfer complete & transfer error interrupts */ + /* if the DMA mode is not CIRCULAR */ + hdma->Instance->CCR &= ~(DMA_IT_TC | DMA_IT_TE); + + /* Change the DMA state */ + hdma->State = HAL_DMA_STATE_READY; + } + + /* Clear the transfer complete flag */ + hdma->DmaBaseAddress->IFCR = DMA_FLAG_TC1 << hdma->ChannelIndex; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma); + + if(hdma->XferCpltCallback != NULL) + { + /* Transfer complete callback */ + hdma->XferCpltCallback(hdma); + } + } + + /* Transfer Error Interrupt management ***************************************/ + else if (( RESET != (flag_it & (DMA_FLAG_TE1 << hdma->ChannelIndex))) && (RESET != (source_it & DMA_IT_TE))) + { + /* When a DMA transfer error occurs */ + /* A hardware clear of its EN bits is performed */ + /* Then, disable all DMA interrupts */ + hdma->Instance->CCR &= ~(DMA_IT_TC | DMA_IT_HT | DMA_IT_TE); + + /* Clear all flags */ + hdma->DmaBaseAddress->IFCR = DMA_FLAG_GL1 << hdma->ChannelIndex; + + /* Update error code */ + hdma->ErrorCode = HAL_DMA_ERROR_TE; + + /* Change the DMA state */ + hdma->State = HAL_DMA_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hdma); + + if(hdma->XferErrorCallback != NULL) + { + /* Transfer error callback */ + hdma->XferErrorCallback(hdma); + } + } +} + +/** + * @brief Register callbacks + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @param CallbackID User Callback identifer + * a HAL_DMA_CallbackIDTypeDef ENUM as parameter. + * @param pCallback pointer to private callback function which has pointer to + * a DMA_HandleTypeDef structure as parameter. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA_RegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID, void (* pCallback)( DMA_HandleTypeDef * _hdma)) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(hdma); + + if(HAL_DMA_STATE_READY == hdma->State) + { + switch (CallbackID) + { + case HAL_DMA_XFER_CPLT_CB_ID: + hdma->XferCpltCallback = pCallback; + break; + + case HAL_DMA_XFER_HALFCPLT_CB_ID: + hdma->XferHalfCpltCallback = pCallback; + break; + + case HAL_DMA_XFER_ERROR_CB_ID: + hdma->XferErrorCallback = pCallback; + break; + + case HAL_DMA_XFER_ABORT_CB_ID: + hdma->XferAbortCallback = pCallback; + break; + + default: + status = HAL_ERROR; + break; + } + } + else + { + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hdma); + + return status; +} + +/** + * @brief UnRegister callbacks + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @param CallbackID User Callback identifer + * a HAL_DMA_CallbackIDTypeDef ENUM as parameter. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_DMA_UnRegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef CallbackID) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process locked */ + __HAL_LOCK(hdma); + + if(HAL_DMA_STATE_READY == hdma->State) + { + switch (CallbackID) + { + case HAL_DMA_XFER_CPLT_CB_ID: + hdma->XferCpltCallback = NULL; + break; + + case HAL_DMA_XFER_HALFCPLT_CB_ID: + hdma->XferHalfCpltCallback = NULL; + break; + + case HAL_DMA_XFER_ERROR_CB_ID: + hdma->XferErrorCallback = NULL; + break; + + case HAL_DMA_XFER_ABORT_CB_ID: + hdma->XferAbortCallback = NULL; + break; + + case HAL_DMA_XFER_ALL_CB_ID: + hdma->XferCpltCallback = NULL; + hdma->XferHalfCpltCallback = NULL; + hdma->XferErrorCallback = NULL; + hdma->XferAbortCallback = NULL; + break; + + default: + status = HAL_ERROR; + break; + } + } + else + { + status = HAL_ERROR; + } + + /* Release Lock */ + __HAL_UNLOCK(hdma); + + return status; +} + +/** + * @} + */ + +/** @defgroup DMA_Exported_Functions_Group3 Peripheral State functions + * @brief Peripheral State functions + * +@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 Channel. + * @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 Channel. + * @retval DMA Error Code + */ +uint32_t HAL_DMA_GetError(DMA_HandleTypeDef *hdma) +{ + return hdma->ErrorCode; +} + +/** + * @} + */ + +/** + * @} + */ + +/** @addtogroup DMA_Private_Functions + * @{ + */ + +/** + * @brief Set the DMA Transfer parameters. + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Channel. + * @param SrcAddress The source memory Buffer address + * @param DstAddress The destination memory Buffer address + * @param DataLength The length of data to be transferred from source to destination + * @retval HAL status + */ +static void DMA_SetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength) +{ + /* Clear all flags */ + hdma->DmaBaseAddress->IFCR = (DMA_FLAG_GL1 << hdma->ChannelIndex); + + /* Configure DMA Channel data length */ + hdma->Instance->CNDTR = DataLength; + + /* Peripheral to Memory */ + if((hdma->Init.Direction) == DMA_MEMORY_TO_PERIPH) + { + /* Configure DMA Channel destination address */ + hdma->Instance->CPAR = DstAddress; + + /* Configure DMA Channel source address */ + hdma->Instance->CMAR = SrcAddress; + } + /* Memory to Peripheral */ + else + { + /* Configure DMA Channel source address */ + hdma->Instance->CPAR = SrcAddress; + + /* Configure DMA Channel destination address */ + hdma->Instance->CMAR = DstAddress; + } +} + +/** + * @brief Set the DMA base address and channel index depending on DMA instance + * @param hdma pointer to a DMA_HandleTypeDef structure that contains + * the configuration information for the specified DMA Stream. + * @retval None + */ +static void DMA_CalcBaseAndBitshift(DMA_HandleTypeDef *hdma) +{ +#if defined (DMA2) + /* calculation of the channel index */ + if ((uint32_t)(hdma->Instance) < (uint32_t)(DMA2_Channel1)) + { + /* DMA1 */ + hdma->ChannelIndex = (((uint32_t)hdma->Instance - (uint32_t)DMA1_Channel1) / ((uint32_t)DMA1_Channel2 - (uint32_t)DMA1_Channel1)) << 2U; + hdma->DmaBaseAddress = DMA1; + } + else + { + /* DMA2 */ + hdma->ChannelIndex = (((uint32_t)hdma->Instance - (uint32_t)DMA2_Channel1) / ((uint32_t)DMA2_Channel2 - (uint32_t)DMA2_Channel1)) << 2U; + hdma->DmaBaseAddress = DMA2; + } +#else + /* calculation of the channel index */ + /* DMA1 */ + hdma->ChannelIndex = (((uint32_t)hdma->Instance - (uint32_t)DMA1_Channel1) / ((uint32_t)DMA1_Channel2 - (uint32_t)DMA1_Channel1)) << 2U; + hdma->DmaBaseAddress = DMA1; +#endif +} + +/** + * @} + */ + +/** + * @} + */ +#endif /* HAL_DMA_MODULE_ENABLED */ + +/** + * @} + */ + + /** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c new file mode 100644 index 0000000..3120041 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c @@ -0,0 +1,621 @@ +/** + ****************************************************************************** + * @file stm32f3xx_hal_exti.c + * @author MCD Application Team + * @brief EXTI HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Extended Interrupts and events controller (EXTI) peripheral: + * + Initialization and de-initialization functions + * + IO operation functions + * + @verbatim + ============================================================================== + ##### EXTI Peripheral features ##### + ============================================================================== + [..] + (+) Each Exti line can be configured within this driver. + + (+) Exti line can be configured in 3 different modes + (++) Interrupt + (++) Event + (++) Both of them + + (+) Configurable Exti lines can be configured with 3 different triggers + (++) Rising + (++) Falling + (++) Both of them + + (+) When set in interrupt mode, configurable Exti lines have two different + interrupts pending registers which allow to distinguish which transition + occurs: + (++) Rising edge pending interrupt + (++) Falling + + (+) Exti lines 0 to 15 are linked to gpio pin number 0 to 15. Gpio port can + be selected through multiplexer. + + ##### How to use this driver ##### + ============================================================================== + [..] + + (#) Configure the EXTI line using HAL_EXTI_SetConfigLine(). + (++) Choose the interrupt line number by setting "Line" member from + EXTI_ConfigTypeDef structure. + (++) Configure the interrupt and/or event mode using "Mode" member from + EXTI_ConfigTypeDef structure. + (++) For configurable lines, configure rising and/or falling trigger + "Trigger" member from EXTI_ConfigTypeDef structure. + (++) For Exti lines linked to gpio, choose gpio port using "GPIOSel" + member from GPIO_InitTypeDef structure. + + (#) Get current Exti configuration of a dedicated line using + HAL_EXTI_GetConfigLine(). + (++) Provide exiting handle as parameter. + (++) Provide pointer on EXTI_ConfigTypeDef structure as second parameter. + + (#) Clear Exti configuration of a dedicated line using HAL_EXTI_GetConfigLine(). + (++) Provide exiting handle as parameter. + + (#) Register callback to treat Exti interrupts using HAL_EXTI_RegisterCallback(). + (++) Provide exiting handle as first parameter. + (++) Provide which callback will be registered using one value from + EXTI_CallbackIDTypeDef. + (++) Provide callback function pointer. + + (#) Get interrupt pending bit using HAL_EXTI_GetPending(). + + (#) Clear interrupt pending bit using HAL_EXTI_GetPending(). + + (#) Generate software interrupt using HAL_EXTI_GenerateSWI(). + + @endverbatim + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f3xx_hal.h" + +/** @addtogroup STM32F3xx_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 + * @{ + */ +#define EXTI_MODE_OFFSET 0x08u /* 0x20: offset between CPU IMR/EMR registers */ +#define EXTI_CONFIG_OFFSET 0x08u /* 0x20: offset between CPU Rising/Falling configuration registers */ +/** + * @} + */ + +/* 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) +{ + __IO uint32_t *regaddr; + uint32_t regval; + uint32_t linepos; + uint32_t maskline; + uint32_t offset; + + /* 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 register offset and line mask */ + offset = ((pExtiConfig->Line & EXTI_REG_MASK) >> EXTI_REG_SHIFT); + 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 */ + regaddr = (&EXTI->RTSR + (EXTI_CONFIG_OFFSET * offset)); + regval = *regaddr; + + /* Mask or set line */ + if ((pExtiConfig->Trigger & EXTI_TRIGGER_RISING) != 0x00u) + { + regval |= maskline; + } + else + { + regval &= ~maskline; + } + + /* Store rising trigger mode */ + *regaddr = regval; + + /* Configure falling trigger */ + regaddr = (&EXTI->FTSR + (EXTI_CONFIG_OFFSET * offset)); + regval = *regaddr; + + /* Mask or set line */ + if ((pExtiConfig->Trigger & EXTI_TRIGGER_FALLING) != 0x00u) + { + regval |= maskline; + } + else + { + regval &= ~maskline; + } + + /* Store falling trigger mode */ + *regaddr = regval; + + /* 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 */ + regaddr = (&EXTI->IMR + (EXTI_MODE_OFFSET * offset)); + regval = *regaddr; + + /* Mask or set line */ + if ((pExtiConfig->Mode & EXTI_MODE_INTERRUPT) != 0x00u) + { + regval |= maskline; + } + else + { + regval &= ~maskline; + } + + /* Store interrupt mode */ + *regaddr = regval; + + /* Configure event mode : read current mode */ + regaddr = (&EXTI->EMR + (EXTI_MODE_OFFSET * offset)); + regval = *regaddr; + + /* Mask or set line */ + if ((pExtiConfig->Mode & EXTI_MODE_EVENT) != 0x00u) + { + regval |= maskline; + } + else + { + regval &= ~maskline; + } + + /* Store event mode */ + *regaddr = regval; + + 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) +{ + __IO uint32_t *regaddr; + uint32_t regval; + uint32_t linepos; + uint32_t maskline; + uint32_t offset; + + /* 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 register offset and line mask */ + offset = ((pExtiConfig->Line & EXTI_REG_MASK) >> EXTI_REG_SHIFT); + linepos = (pExtiConfig->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); + + /* 1] Get core mode : interrupt */ + regaddr = (&EXTI->IMR + (EXTI_MODE_OFFSET * offset)); + regval = *regaddr; + + /* Check if selected line is enable */ + if ((regval & maskline) != 0x00u) + { + pExtiConfig->Mode = EXTI_MODE_INTERRUPT; + } + else + { + pExtiConfig->Mode = EXTI_MODE_NONE; + } + + /* Get event mode */ + regaddr = (&EXTI->EMR + (EXTI_MODE_OFFSET * offset)); + regval = *regaddr; + + /* Check if selected line is enable */ + if ((regval & 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) + { + regaddr = (&EXTI->RTSR + (EXTI_CONFIG_OFFSET * offset)); + regval = *regaddr; + + /* Check if configuration of selected line is enable */ + if ((regval & maskline) != 0x00u) + { + pExtiConfig->Trigger = EXTI_TRIGGER_RISING; + } + + /* Get falling configuration */ + regaddr = (&EXTI->FTSR + (EXTI_CONFIG_OFFSET * offset)); + regval = *regaddr; + + /* Check if configuration of selected line is enable */ + if ((regval & maskline) != 0x00u) + { + pExtiConfig->Trigger |= EXTI_TRIGGER_FALLING; + } + + /* Get Gpio port selection for gpio lines */ + if ((pExtiConfig->Line & EXTI_GPIO) == EXTI_GPIO) + { + assert_param(IS_EXTI_GPIO_PIN(linepos)); + + regval = SYSCFG->EXTICR[linepos >> 2u]; + pExtiConfig->GPIOSel = ((regval << (SYSCFG_EXTICR1_EXTI1_Pos * (3uL - (linepos & 0x03u)))) >> 24); + } + } + + 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) +{ + __IO uint32_t *regaddr; + uint32_t regval; + uint32_t linepos; + uint32_t maskline; + uint32_t offset; + + /* Check null pointer */ + if (hexti == NULL) + { + return HAL_ERROR; + } + + /* Check the parameter */ + assert_param(IS_EXTI_LINE(hexti->Line)); + + /* compute line register offset and line mask */ + offset = ((hexti->Line & EXTI_REG_MASK) >> EXTI_REG_SHIFT); + linepos = (hexti->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); + + /* 1] Clear interrupt mode */ + regaddr = (&EXTI->IMR + (EXTI_MODE_OFFSET * offset)); + regval = (*regaddr & ~maskline); + *regaddr = regval; + + /* 2] Clear event mode */ + regaddr = (&EXTI->EMR + (EXTI_MODE_OFFSET * offset)); + regval = (*regaddr & ~maskline); + *regaddr = regval; + + /* 3] Clear triggers in case of configurable lines */ + if ((hexti->Line & EXTI_CONFIG) != 0x00u) + { + regaddr = (&EXTI->RTSR + (EXTI_CONFIG_OFFSET * offset)); + regval = (*regaddr & ~maskline); + *regaddr = regval; + + regaddr = (&EXTI->FTSR + (EXTI_CONFIG_OFFSET * offset)); + regval = (*regaddr & ~maskline); + *regaddr = regval; + + /* 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) +{ + __IO uint32_t *regaddr; + uint32_t regval; + uint32_t maskline; + uint32_t offset; + + /* Compute line register offset and line mask */ + offset = ((hexti->Line & EXTI_REG_MASK) >> EXTI_REG_SHIFT); + maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); + + /* Get pending bit */ + regaddr = (&EXTI->PR + (EXTI_CONFIG_OFFSET * offset)); + regval = (*regaddr & 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) +{ + __IO uint32_t *regaddr; + uint32_t regval; + uint32_t linepos; + uint32_t maskline; + uint32_t offset; + + /* 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 register offset and line mask */ + offset = ((hexti->Line & EXTI_REG_MASK) >> EXTI_REG_SHIFT); + linepos = (hexti->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); + + /* Get pending bit */ + regaddr = (&EXTI->PR + (EXTI_CONFIG_OFFSET * offset)); + /* return 1 if bit is set else 0 */ + regval = ((*regaddr & 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) +{ + __IO uint32_t *regaddr; + uint32_t maskline; + uint32_t offset; + + /* 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 register offset and line mask */ + offset = ((hexti->Line & EXTI_REG_MASK) >> EXTI_REG_SHIFT); + maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); + + /* Get pending bit */ + regaddr = (&EXTI->PR + (EXTI_CONFIG_OFFSET * offset)); + + /* Clear Pending bit */ + *regaddr = maskline; +} + +/** + * @brief Generate a software interrupt for a dedicated line. + * @param hexti Exti handle. + * @retval None. + */ +void HAL_EXTI_GenerateSWI(EXTI_HandleTypeDef *hexti) +{ + __IO uint32_t *regaddr; + uint32_t maskline; + uint32_t offset; + + /* Check parameters */ + assert_param(IS_EXTI_LINE(hexti->Line)); + assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); + + /* compute line register offset and line mask */ + offset = ((hexti->Line & EXTI_REG_MASK) >> EXTI_REG_SHIFT); + maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); + + regaddr = (&EXTI->SWIER + (EXTI_CONFIG_OFFSET * offset)); + *regaddr = maskline; +} + +/** + * @} + */ + +/** + * @} + */ + +#endif /* HAL_EXTI_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c new file mode 100644 index 0000000..6da1eca --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c @@ -0,0 +1,695 @@ +/** + ****************************************************************************** + * @file stm32f3xx_hal_flash.c + * @author MCD Application Team + * @brief FLASH HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the internal FLASH memory: + * + Program operations functions + * + Memory Control functions + * + Peripheral State functions + * + @verbatim + ============================================================================== + ##### FLASH peripheral features ##### + ============================================================================== + [..] The Flash memory interface manages CPU AHB I-Code and D-Code accesses + to the Flash memory. It implements the erase and program Flash memory operations + and the read and write protection mechanisms. + + [..] The Flash memory interface accelerates code execution with a system of instruction + prefetch. + + [..] The FLASH main features are: + (+) Flash memory read operations + (+) Flash memory program/erase operations + (+) Read / write protections + (+) Prefetch on I-Code + (+) Option Bytes programming + + + ##### How to use this driver ##### + ============================================================================== + [..] + This driver provides functions and macros to configure and program the FLASH + memory of all STM32F3xx devices. + + (#) FLASH Memory I/O Programming functions: this group includes all needed + functions to erase and program the main memory: + (++) Lock and Unlock the FLASH interface + (++) Erase function: Erase page, erase all pages + (++) Program functions: half word, word and doubleword + (#) FLASH Option Bytes Programming functions: this group includes all needed + functions to manage the Option Bytes: + (++) Lock and Unlock the Option Bytes + (++) Set/Reset the write protection + (++) Set the Read protection Level + (++) Program the user Option Bytes + (++) Launch the Option Bytes loader + (++) Erase Option Bytes + (++) Program the data Option Bytes + (++) Get the Write protection. + (++) Get the user option bytes. + + (#) Interrupts and flags management functions : this group + includes all needed functions to: + (++) Handle FLASH interrupts + (++) Wait for last FLASH operation according to its status + (++) Get error flag status + + [..] In addition to these function, this driver includes a set of macros allowing + to handle the following operations: + + (+) Set/Get the latency + (+) Enable/Disable the prefetch buffer + (+) Enable/Disable the half cycle access + (+) Enable/Disable the FLASH interrupts + (+) Monitor the FLASH flags status + + @endverbatim + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f3xx_hal.h" + +/** @addtogroup STM32F3xx_HAL_Driver + * @{ + */ + +#ifdef HAL_FLASH_MODULE_ENABLED + +/** @defgroup FLASH FLASH + * @brief FLASH HAL module driver + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @defgroup FLASH_Private_Constants FLASH Private Constants + * @{ + */ +/** + * @} + */ + +/* Private macro ---------------------------- ---------------------------------*/ +/** @defgroup FLASH_Private_Macros FLASH Private Macros + * @{ + */ + +/** + * @} + */ + +/* Private variables ---------------------------------------------------------*/ +/** @defgroup FLASH_Private_Variables FLASH Private Variables + * @{ + */ +/* Variables used for Erase pages under interruption*/ +FLASH_ProcessTypeDef pFlash; +/** + * @} + */ + +/* Private function prototypes -----------------------------------------------*/ +/** @defgroup FLASH_Private_Functions FLASH Private Functions + * @{ + */ +static void FLASH_Program_HalfWord(uint32_t Address, uint16_t Data); +static void FLASH_SetErrorCode(void); +extern void FLASH_PageErase(uint32_t PageAddress); +/** + * @} + */ + +/* Exported functions ---------------------------------------------------------*/ +/** @defgroup FLASH_Exported_Functions FLASH Exported Functions + * @{ + */ + +/** @defgroup FLASH_Exported_Functions_Group1 Programming operation functions + * @brief Programming operation functions + * +@verbatim +@endverbatim + * @{ + */ + +/** + * @brief Program halfword, word or double word at a specified address + * @note The function HAL_FLASH_Unlock() should be called before to unlock the FLASH interface + * The function HAL_FLASH_Lock() should be called after to lock the FLASH interface + * + * @note If an erase and a program operations are requested simultaneously, + * the erase operation is performed before the program one. + * + * @note FLASH should be previously erased before new programming (only exception to this + * is when 0x0000 is programmed) + * + * @param TypeProgram Indicate the way to program at a specified address. + * This parameter can be a value of @ref FLASH_Type_Program + * @param Address Specifie the address to be programmed. + * @param Data Specifie the data to be programmed + * + * @retval HAL_StatusTypeDef HAL Status + */ +HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data) +{ + HAL_StatusTypeDef status = HAL_ERROR; + uint8_t index = 0U; + uint8_t nbiterations = 0U; + + /* Process Locked */ + __HAL_LOCK(&pFlash); + + /* Check the parameters */ + assert_param(IS_FLASH_TYPEPROGRAM(TypeProgram)); + assert_param(IS_FLASH_PROGRAM_ADDRESS(Address)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + if(TypeProgram == FLASH_TYPEPROGRAM_HALFWORD) + { + /* Program halfword (16-bit) at a specified address. */ + nbiterations = 1U; + } + else if(TypeProgram == FLASH_TYPEPROGRAM_WORD) + { + /* Program word (32-bit = 2*16-bit) at a specified address. */ + nbiterations = 2U; + } + else + { + /* Program double word (64-bit = 4*16-bit) at a specified address. */ + nbiterations = 4U; + } + + for (index = 0U; index < nbiterations; index++) + { + FLASH_Program_HalfWord((Address + (2U*index)), (uint16_t)(Data >> (16U*index))); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE); + + /* If the program operation is completed, disable the PG Bit */ + CLEAR_BIT(FLASH->CR, FLASH_CR_PG); + /* In case of error, stop programming procedure */ + if (status != HAL_OK) + { + break; + } + } + } + + /* Process Unlocked */ + __HAL_UNLOCK(&pFlash); + + return status; +} + +/** + * @brief Program halfword, word or double word at a specified address with interrupt enabled. + * @note The function HAL_FLASH_Unlock() should be called before to unlock the FLASH interface + * The function HAL_FLASH_Lock() should be called after to lock the FLASH interface + * + * @note If an erase and a program operations are requested simultaneously, + * the erase operation is performed before the program one. + * + * @param TypeProgram Indicate the way to program at a specified address. + * This parameter can be a value of @ref FLASH_Type_Program + * @param Address Specifie the address to be programmed. + * @param Data Specifie the data to be programmed + * + * @retval HAL_StatusTypeDef HAL Status + */ +HAL_StatusTypeDef HAL_FLASH_Program_IT(uint32_t TypeProgram, uint32_t Address, uint64_t Data) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process Locked */ + __HAL_LOCK(&pFlash); + + /* Check the parameters */ + assert_param(IS_FLASH_TYPEPROGRAM(TypeProgram)); + assert_param(IS_FLASH_PROGRAM_ADDRESS(Address)); + + /* Enable End of FLASH Operation and Error source interrupts */ + __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP | FLASH_IT_ERR); + + pFlash.Address = Address; + pFlash.Data = Data; + + if(TypeProgram == FLASH_TYPEPROGRAM_HALFWORD) + { + pFlash.ProcedureOnGoing = FLASH_PROC_PROGRAMHALFWORD; + /* Program halfword (16-bit) at a specified address. */ + pFlash.DataRemaining = 1U; + } + else if(TypeProgram == FLASH_TYPEPROGRAM_WORD) + { + pFlash.ProcedureOnGoing = FLASH_PROC_PROGRAMWORD; + /* Program word (32-bit : 2*16-bit) at a specified address. */ + pFlash.DataRemaining = 2U; + } + else + { + pFlash.ProcedureOnGoing = FLASH_PROC_PROGRAMDOUBLEWORD; + /* Program double word (64-bit : 4*16-bit) at a specified address. */ + pFlash.DataRemaining = 4U; + } + + /* Program halfword (16-bit) at a specified address. */ + FLASH_Program_HalfWord(Address, (uint16_t)Data); + + return status; +} + +/** + * @brief This function handles FLASH interrupt request. + * @retval None + */ +void HAL_FLASH_IRQHandler(void) +{ + uint32_t addresstmp = 0U; + + /* Check FLASH operation error flags */ + if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR) ||__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGERR)) + { + /* Return the faulty address */ + addresstmp = pFlash.Address; + /* Reset address */ + pFlash.Address = 0xFFFFFFFFU; + + /* Save the Error code */ + FLASH_SetErrorCode(); + + /* FLASH error interrupt user callback */ + HAL_FLASH_OperationErrorCallback(addresstmp); + + /* Stop the procedure ongoing */ + pFlash.ProcedureOnGoing = FLASH_PROC_NONE; + } + + /* Check FLASH End of Operation flag */ + if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP)) + { + /* Clear FLASH End of Operation pending bit */ + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP); + + /* Process can continue only if no error detected */ + if(pFlash.ProcedureOnGoing != FLASH_PROC_NONE) + { + if(pFlash.ProcedureOnGoing == FLASH_PROC_PAGEERASE) + { + /* Nb of pages to erased can be decreased */ + pFlash.DataRemaining--; + + /* Check if there are still pages to erase */ + if(pFlash.DataRemaining != 0U) + { + addresstmp = pFlash.Address; + /*Indicate user which sector has been erased */ + HAL_FLASH_EndOfOperationCallback(addresstmp); + + /*Increment sector number*/ + addresstmp = pFlash.Address + FLASH_PAGE_SIZE; + pFlash.Address = addresstmp; + + /* If the erase operation is completed, disable the PER Bit */ + CLEAR_BIT(FLASH->CR, FLASH_CR_PER); + + FLASH_PageErase(addresstmp); + } + else + { + /* No more pages to Erase, user callback can be called. */ + /* Reset Sector and stop Erase pages procedure */ + pFlash.Address = addresstmp = 0xFFFFFFFFU; + pFlash.ProcedureOnGoing = FLASH_PROC_NONE; + /* FLASH EOP interrupt user callback */ + HAL_FLASH_EndOfOperationCallback(addresstmp); + } + } + else if(pFlash.ProcedureOnGoing == FLASH_PROC_MASSERASE) + { + /* Operation is completed, disable the MER Bit */ + CLEAR_BIT(FLASH->CR, FLASH_CR_MER); + + /* MassErase ended. Return the selected bank */ + /* FLASH EOP interrupt user callback */ + HAL_FLASH_EndOfOperationCallback(0U); + + /* Stop Mass Erase procedure*/ + pFlash.ProcedureOnGoing = FLASH_PROC_NONE; + } + else + { + /* Nb of 16-bit data to program can be decreased */ + pFlash.DataRemaining--; + + /* Check if there are still 16-bit data to program */ + if(pFlash.DataRemaining != 0U) + { + /* Increment address to 16-bit */ + pFlash.Address += 2U; + addresstmp = pFlash.Address; + + /* Shift to have next 16-bit data */ + pFlash.Data = (pFlash.Data >> 16U); + + /* Operation is completed, disable the PG Bit */ + CLEAR_BIT(FLASH->CR, FLASH_CR_PG); + + /*Program halfword (16-bit) at a specified address.*/ + FLASH_Program_HalfWord(addresstmp, (uint16_t)pFlash.Data); + } + else + { + /* Program ended. Return the selected address */ + /* FLASH EOP interrupt user callback */ + if (pFlash.ProcedureOnGoing == FLASH_PROC_PROGRAMHALFWORD) + { + HAL_FLASH_EndOfOperationCallback(pFlash.Address); + } + else if (pFlash.ProcedureOnGoing == FLASH_PROC_PROGRAMWORD) + { + HAL_FLASH_EndOfOperationCallback(pFlash.Address - 2U); + } + else + { + HAL_FLASH_EndOfOperationCallback(pFlash.Address - 6U); + } + + /* Reset Address and stop Program procedure */ + pFlash.Address = 0xFFFFFFFFU; + pFlash.ProcedureOnGoing = FLASH_PROC_NONE; + } + } + } + } + + + if(pFlash.ProcedureOnGoing == FLASH_PROC_NONE) + { + /* Operation is completed, disable the PG, PER and MER Bits */ + CLEAR_BIT(FLASH->CR, (FLASH_CR_PG | FLASH_CR_PER | FLASH_CR_MER)); + + /* Disable End of FLASH Operation and Error source interrupts */ + __HAL_FLASH_DISABLE_IT(FLASH_IT_EOP | FLASH_IT_ERR); + + /* Process Unlocked */ + __HAL_UNLOCK(&pFlash); + } +} + +/** + * @brief FLASH end of operation interrupt callback + * @param ReturnValue The value saved in this parameter depends on the ongoing procedure + * - Mass Erase: No return value expected + * - Pages Erase: Address of the page which has been erased + * (if 0xFFFFFFFF, it means that all the selected pages have been erased) + * - Program: Address which was selected for data program + * @retval none + */ +__weak void HAL_FLASH_EndOfOperationCallback(uint32_t ReturnValue) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(ReturnValue); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_FLASH_EndOfOperationCallback could be implemented in the user file + */ +} + +/** + * @brief FLASH operation error interrupt callback + * @param ReturnValue The value saved in this parameter depends on the ongoing procedure + * - Mass Erase: No return value expected + * - Pages Erase: Address of the page which returned an error + * - Program: Address which was selected for data program + * @retval none + */ +__weak void HAL_FLASH_OperationErrorCallback(uint32_t ReturnValue) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(ReturnValue); + + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_FLASH_OperationErrorCallback could be implemented in the user file + */ +} + +/** + * @} + */ + +/** @defgroup FLASH_Exported_Functions_Group2 Peripheral Control functions + * @brief management functions + * +@verbatim + =============================================================================== + ##### Peripheral Control functions ##### + =============================================================================== + [..] + This subsection provides a set of functions allowing to control the FLASH + memory operations. + +@endverbatim + * @{ + */ + +/** + * @brief Unlock the FLASH control register access + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_FLASH_Unlock(void) +{ + HAL_StatusTypeDef status = HAL_OK; + + if(READ_BIT(FLASH->CR, FLASH_CR_LOCK) != RESET) + { + /* Authorize the FLASH Registers access */ + WRITE_REG(FLASH->KEYR, FLASH_KEY1); + WRITE_REG(FLASH->KEYR, FLASH_KEY2); + + /* Verify Flash is unlocked */ + if(READ_BIT(FLASH->CR, FLASH_CR_LOCK) != RESET) + { + status = HAL_ERROR; + } + } + + return status; +} + +/** + * @brief Locks the FLASH control register access + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_FLASH_Lock(void) +{ + /* Set the LOCK Bit to lock the FLASH Registers access */ + SET_BIT(FLASH->CR, FLASH_CR_LOCK); + + return HAL_OK; +} + +/** + * @brief Unlock the FLASH Option Control Registers access. + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_FLASH_OB_Unlock(void) +{ + if (HAL_IS_BIT_CLR(FLASH->CR, FLASH_CR_OPTWRE)) + { + /* Authorizes the Option Byte register programming */ + WRITE_REG(FLASH->OPTKEYR, FLASH_OPTKEY1); + WRITE_REG(FLASH->OPTKEYR, FLASH_OPTKEY2); + } + else + { + return HAL_ERROR; + } + + return HAL_OK; +} + +/** + * @brief Lock the FLASH Option Control Registers access. + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_FLASH_OB_Lock(void) +{ + /* Clear the OPTWRE Bit to lock the FLASH Option Byte Registers access */ + CLEAR_BIT(FLASH->CR, FLASH_CR_OPTWRE); + + return HAL_OK; +} + +/** + * @brief Launch the option byte loading. + * @note This function will reset automatically the MCU. + * @retval HAL Status + */ +HAL_StatusTypeDef HAL_FLASH_OB_Launch(void) +{ + /* Set the OBL_Launch bit to launch the option byte loading */ + SET_BIT(FLASH->CR, FLASH_CR_OBL_LAUNCH); + + /* Wait for last operation to be completed */ + return(FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE)); +} + +/** + * @} + */ + +/** @defgroup FLASH_Exported_Functions_Group3 Peripheral errors functions + * @brief Peripheral errors functions + * +@verbatim + =============================================================================== + ##### Peripheral Errors functions ##### + =============================================================================== + [..] + This subsection permit to get in run-time errors of the FLASH peripheral. + +@endverbatim + * @{ + */ + +/** + * @brief Get the specific FLASH error flag. + * @retval FLASH_ErrorCode The returned value can be: + * @ref FLASH_Error_Codes + */ +uint32_t HAL_FLASH_GetError(void) +{ + return pFlash.ErrorCode; +} + +/** + * @} + */ + +/** + * @} + */ + +/** @addtogroup FLASH_Private_Functions + * @{ + */ + +/** + * @brief Program a half-word (16-bit) at a specified address. + * @param Address specify the address to be programmed. + * @param Data specify the data to be programmed. + * @retval None + */ +static void FLASH_Program_HalfWord(uint32_t Address, uint16_t Data) +{ + /* Clean the error context */ + pFlash.ErrorCode = HAL_FLASH_ERROR_NONE; + + /* Proceed to program the new data */ + SET_BIT(FLASH->CR, FLASH_CR_PG); + + /* Write data in the address */ + *(__IO uint16_t*)Address = Data; +} + +/** + * @brief Wait for a FLASH operation to complete. + * @param Timeout maximum flash operation timeout + * @retval HAL Status + */ +HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout) +{ + /* Wait for the FLASH operation to complete by polling on BUSY flag to be reset. + Even if the FLASH operation fails, the BUSY flag will be reset and an error + flag will be set */ + + uint32_t tickstart = HAL_GetTick(); + + while(__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY)) + { + if (Timeout != HAL_MAX_DELAY) + { + if((Timeout == 0U) || ((HAL_GetTick()-tickstart) > Timeout)) + { + return HAL_TIMEOUT; + } + } + } + + /* Check FLASH End of Operation flag */ + if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP)) + { + /* Clear FLASH End of Operation pending bit */ + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP); + } + + if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR) || + __HAL_FLASH_GET_FLAG(FLASH_FLAG_PGERR)) + { + /*Save the error code*/ + FLASH_SetErrorCode(); + return HAL_ERROR; + } + + /* There is no error flag set */ + return HAL_OK; +} + + +/** + * @brief Set the specific FLASH error flag. + * @retval None + */ +static void FLASH_SetErrorCode(void) +{ + uint32_t flags = 0U; + + if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR)) + { + pFlash.ErrorCode |= HAL_FLASH_ERROR_WRP; + flags |= FLASH_FLAG_WRPERR; + } + if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGERR)) + { + pFlash.ErrorCode |= HAL_FLASH_ERROR_PROG; + flags |= FLASH_FLAG_PGERR; + } + /* Clear FLASH error pending bits */ + __HAL_FLASH_CLEAR_FLAG(flags); +} +/** + * @} + */ + +/** + * @} + */ + +#endif /* HAL_FLASH_MODULE_ENABLED */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c new file mode 100644 index 0000000..4364751 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c @@ -0,0 +1,983 @@ +/** + ****************************************************************************** + * @file stm32f3xx_hal_flash_ex.c + * @author MCD Application Team + * @brief Extended FLASH HAL module driver. + * + * This file provides firmware functions to manage the following + * functionalities of the FLASH peripheral: + * + Extended Initialization/de-initialization functions + * + Extended I/O operation functions + * + Extended Peripheral Control functions + * + @verbatim + ============================================================================== + ##### Flash peripheral extended features ##### + ============================================================================== + + ##### How to use this driver ##### + ============================================================================== + [..] This driver provides functions to configure and program the FLASH memory + of all STM32F3xxx devices. It includes + + (++) Set/Reset the write protection + (++) Program the user Option Bytes + (++) Get the Read protection Level + + @endverbatim + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f3xx_hal.h" + +/** @addtogroup STM32F3xx_HAL_Driver + * @{ + */ +#ifdef HAL_FLASH_MODULE_ENABLED + +/** @addtogroup FLASH + * @{ + */ +/** @addtogroup FLASH_Private_Variables + * @{ + */ +/* Variables used for Erase pages under interruption*/ +extern FLASH_ProcessTypeDef pFlash; +/** + * @} + */ + +/** + * @} + */ + +/** @defgroup FLASHEx FLASHEx + * @brief FLASH HAL Extension module driver + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @defgroup FLASHEx_Private_Constants FLASHEx Private Constants + * @{ + */ +#define FLASH_POSITION_IWDGSW_BIT (uint32_t)POSITION_VAL(FLASH_OBR_IWDG_SW) +#define FLASH_POSITION_OB_USERDATA0_BIT (uint32_t)POSITION_VAL(FLASH_OBR_DATA0) +#define FLASH_POSITION_OB_USERDATA1_BIT (uint32_t)POSITION_VAL(FLASH_OBR_DATA1) +/** + * @} + */ + +/* Private macro -------------------------------------------------------------*/ +/** @defgroup FLASHEx_Private_Macros FLASHEx Private Macros + * @{ + */ +/** + * @} + */ + +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/** @defgroup FLASHEx_Private_Functions FLASHEx Private Functions + * @{ + */ +/* Erase operations */ +static void FLASH_MassErase(void); +void FLASH_PageErase(uint32_t PageAddress); + +/* Option bytes control */ +static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WriteProtectPage); +static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WriteProtectPage); +static HAL_StatusTypeDef FLASH_OB_RDP_LevelConfig(uint8_t ReadProtectLevel); +static HAL_StatusTypeDef FLASH_OB_UserConfig(uint8_t UserConfig); +static HAL_StatusTypeDef FLASH_OB_ProgramData(uint32_t Address, uint8_t Data); +static uint32_t FLASH_OB_GetWRP(void); +static uint32_t FLASH_OB_GetRDP(void); +static uint8_t FLASH_OB_GetUser(void); + +/** + * @} + */ + +/* Exported functions ---------------------------------------------------------*/ +/** @defgroup FLASHEx_Exported_Functions FLASHEx Exported Functions + * @{ + */ + +/** @defgroup FLASHEx_Exported_Functions_Group1 FLASHEx Memory Erasing functions + * @brief FLASH Memory Erasing functions + * +@verbatim + ============================================================================== + ##### FLASH Erasing Programming functions ##### + ============================================================================== + + [..] The FLASH Memory Erasing functions, includes the following functions: + (+) HAL_FLASHEx_Erase: return only when erase has been done + (+) HAL_FLASHEx_Erase_IT: end of erase is done when HAL_FLASH_EndOfOperationCallback + is called with parameter 0xFFFFFFFF + + [..] Any operation of erase should follow these steps: + (#) Call the HAL_FLASH_Unlock() function to enable the flash control register and + program memory access. + (#) Call the desired function to erase page. + (#) Call the HAL_FLASH_Lock() to disable the flash program memory access + (recommended to protect the FLASH memory against possible unwanted operation). + +@endverbatim + * @{ + */ + + +/** + * @brief Perform a mass erase or erase the specified FLASH memory pages + * @note To correctly run this function, the @ref HAL_FLASH_Unlock() function + * must be called before. + * Call the @ref HAL_FLASH_Lock() to disable the flash memory access + * (recommended to protect the FLASH memory against possible unwanted operation) + * @param[in] pEraseInit pointer to an FLASH_EraseInitTypeDef structure that + * contains the configuration information for the erasing. + * + * @param[out] PageError pointer to variable that + * contains the configuration information on faulty page in case of error + * (0xFFFFFFFF means that all the pages have been correctly erased) + * + * @retval HAL_StatusTypeDef HAL Status + */ +HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *PageError) +{ + HAL_StatusTypeDef status = HAL_ERROR; + uint32_t address = 0U; + + /* Process Locked */ + __HAL_LOCK(&pFlash); + + /* Check the parameters */ + assert_param(IS_FLASH_TYPEERASE(pEraseInit->TypeErase)); + + if (pEraseInit->TypeErase == FLASH_TYPEERASE_MASSERASE) + { + /* Mass Erase requested for Bank1 */ + /* Wait for last operation to be completed */ + if (FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE) == HAL_OK) + { + /*Mass erase to be done*/ + FLASH_MassErase(); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + /* If the erase operation is completed, disable the MER Bit */ + CLEAR_BIT(FLASH->CR, FLASH_CR_MER); + } + } + else + { + /* Page Erase is requested */ + /* Check the parameters */ + assert_param(IS_FLASH_PROGRAM_ADDRESS(pEraseInit->PageAddress)); + assert_param(IS_FLASH_NB_PAGES(pEraseInit->PageAddress, pEraseInit->NbPages)); + + /* Page Erase requested on address located on bank1 */ + /* Wait for last operation to be completed */ + if (FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE) == HAL_OK) + { + /*Initialization of PageError variable*/ + *PageError = 0xFFFFFFFFU; + + /* Erase page by page to be done*/ + for(address = pEraseInit->PageAddress; + address < ((pEraseInit->NbPages * FLASH_PAGE_SIZE) + pEraseInit->PageAddress); + address += FLASH_PAGE_SIZE) + { + FLASH_PageErase(address); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + /* If the erase operation is completed, disable the PER Bit */ + CLEAR_BIT(FLASH->CR, FLASH_CR_PER); + + if (status != HAL_OK) + { + /* In case of error, stop erase procedure and return the faulty address */ + *PageError = address; + break; + } + } + } + } + + /* Process Unlocked */ + __HAL_UNLOCK(&pFlash); + + return status; +} + +/** + * @brief Perform a mass erase or erase the specified FLASH memory pages with interrupt enabled + * @note To correctly run this function, the @ref HAL_FLASH_Unlock() function + * must be called before. + * Call the @ref HAL_FLASH_Lock() to disable the flash memory access + * (recommended to protect the FLASH memory against possible unwanted operation) + * @param pEraseInit pointer to an FLASH_EraseInitTypeDef structure that + * contains the configuration information for the erasing. + * + * @retval HAL_StatusTypeDef HAL Status + */ +HAL_StatusTypeDef HAL_FLASHEx_Erase_IT(FLASH_EraseInitTypeDef *pEraseInit) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Process Locked */ + __HAL_LOCK(&pFlash); + + /* If procedure already ongoing, reject the next one */ + if (pFlash.ProcedureOnGoing != FLASH_PROC_NONE) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_FLASH_TYPEERASE(pEraseInit->TypeErase)); + + /* Enable End of FLASH Operation and Error source interrupts */ + __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP | FLASH_IT_ERR); + + if (pEraseInit->TypeErase == FLASH_TYPEERASE_MASSERASE) + { + /*Mass erase to be done*/ + pFlash.ProcedureOnGoing = FLASH_PROC_MASSERASE; + FLASH_MassErase(); + } + else + { + /* Erase by page to be done*/ + + /* Check the parameters */ + assert_param(IS_FLASH_PROGRAM_ADDRESS(pEraseInit->PageAddress)); + assert_param(IS_FLASH_NB_PAGES(pEraseInit->PageAddress, pEraseInit->NbPages)); + + pFlash.ProcedureOnGoing = FLASH_PROC_PAGEERASE; + pFlash.DataRemaining = pEraseInit->NbPages; + pFlash.Address = pEraseInit->PageAddress; + + /*Erase 1st page and wait for IT*/ + FLASH_PageErase(pEraseInit->PageAddress); + } + + return status; +} + +/** + * @} + */ + +/** @defgroup FLASHEx_Exported_Functions_Group2 Option Bytes Programming functions + * @brief Option Bytes Programming functions + * +@verbatim + ============================================================================== + ##### Option Bytes Programming functions ##### + ============================================================================== + [..] + This subsection provides a set of functions allowing to control the FLASH + option bytes operations. + +@endverbatim + * @{ + */ + +/** + * @brief Erases the FLASH option bytes. + * @note This functions erases all option bytes except the Read protection (RDP). + * The function @ref HAL_FLASH_Unlock() should be called before to unlock the FLASH interface + * The function @ref HAL_FLASH_OB_Unlock() should be called before to unlock the options bytes + * The function @ref HAL_FLASH_OB_Launch() should be called after to force the reload of the options bytes + * (system reset will occur) + * @retval HAL status + */ + +HAL_StatusTypeDef HAL_FLASHEx_OBErase(void) +{ + uint8_t rdptmp = OB_RDP_LEVEL_0; + HAL_StatusTypeDef status = HAL_ERROR; + + /* Get the actual read protection Option Byte value */ + rdptmp = FLASH_OB_GetRDP(); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + /* Clean the error context */ + pFlash.ErrorCode = HAL_FLASH_ERROR_NONE; + + /* If the previous operation is completed, proceed to erase the option bytes */ + SET_BIT(FLASH->CR, FLASH_CR_OPTER); + SET_BIT(FLASH->CR, FLASH_CR_STRT); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + /* If the erase operation is completed, disable the OPTER Bit */ + CLEAR_BIT(FLASH->CR, FLASH_CR_OPTER); + + if(status == HAL_OK) + { + /* Restore the last read protection Option Byte value */ + status = FLASH_OB_RDP_LevelConfig(rdptmp); + } + } + + /* Return the erase status */ + return status; +} + +/** + * @brief Program option bytes + * @note The function @ref HAL_FLASH_Unlock() should be called before to unlock the FLASH interface + * The function @ref HAL_FLASH_OB_Unlock() should be called before to unlock the options bytes + * The function @ref HAL_FLASH_OB_Launch() should be called after to force the reload of the options bytes + * (system reset will occur) + * + * @param pOBInit pointer to an FLASH_OBInitStruct structure that + * contains the configuration information for the programming. + * + * @retval HAL_StatusTypeDef HAL Status + */ +HAL_StatusTypeDef HAL_FLASHEx_OBProgram(FLASH_OBProgramInitTypeDef *pOBInit) +{ + HAL_StatusTypeDef status = HAL_ERROR; + + /* Process Locked */ + __HAL_LOCK(&pFlash); + + /* Check the parameters */ + assert_param(IS_OPTIONBYTE(pOBInit->OptionType)); + + /* Write protection configuration */ + if((pOBInit->OptionType & OPTIONBYTE_WRP) == OPTIONBYTE_WRP) + { + assert_param(IS_WRPSTATE(pOBInit->WRPState)); + if (pOBInit->WRPState == OB_WRPSTATE_ENABLE) + { + /* Enable of Write protection on the selected page */ + status = FLASH_OB_EnableWRP(pOBInit->WRPPage); + } + else + { + /* Disable of Write protection on the selected page */ + status = FLASH_OB_DisableWRP(pOBInit->WRPPage); + } + if (status != HAL_OK) + { + /* Process Unlocked */ + __HAL_UNLOCK(&pFlash); + return status; + } + } + + /* Read protection configuration */ + if((pOBInit->OptionType & OPTIONBYTE_RDP) == OPTIONBYTE_RDP) + { + status = FLASH_OB_RDP_LevelConfig(pOBInit->RDPLevel); + if (status != HAL_OK) + { + /* Process Unlocked */ + __HAL_UNLOCK(&pFlash); + return status; + } + } + + /* USER configuration */ + if((pOBInit->OptionType & OPTIONBYTE_USER) == OPTIONBYTE_USER) + { + status = FLASH_OB_UserConfig(pOBInit->USERConfig); + if (status != HAL_OK) + { + /* Process Unlocked */ + __HAL_UNLOCK(&pFlash); + return status; + } + } + + /* DATA configuration*/ + if((pOBInit->OptionType & OPTIONBYTE_DATA) == OPTIONBYTE_DATA) + { + status = FLASH_OB_ProgramData(pOBInit->DATAAddress, pOBInit->DATAData); + if (status != HAL_OK) + { + /* Process Unlocked */ + __HAL_UNLOCK(&pFlash); + return status; + } + } + + /* Process Unlocked */ + __HAL_UNLOCK(&pFlash); + + return status; +} + +/** + * @brief Get the Option byte configuration + * @param pOBInit pointer to an FLASH_OBInitStruct structure that + * contains the configuration information for the programming. + * + * @retval None + */ +void HAL_FLASHEx_OBGetConfig(FLASH_OBProgramInitTypeDef *pOBInit) +{ + pOBInit->OptionType = OPTIONBYTE_WRP | OPTIONBYTE_RDP | OPTIONBYTE_USER; + + /*Get WRP*/ + pOBInit->WRPPage = FLASH_OB_GetWRP(); + + /*Get RDP Level*/ + pOBInit->RDPLevel = FLASH_OB_GetRDP(); + + /*Get USER*/ + pOBInit->USERConfig = FLASH_OB_GetUser(); +} + +/** + * @brief Get the Option byte user data + * @param DATAAdress Address of the option byte DATA + * This parameter can be one of the following values: + * @arg @ref OB_DATA_ADDRESS_DATA0 + * @arg @ref OB_DATA_ADDRESS_DATA1 + * @retval Value programmed in USER data + */ +uint32_t HAL_FLASHEx_OBGetUserData(uint32_t DATAAdress) +{ + uint32_t value = 0U; + + if (DATAAdress == OB_DATA_ADDRESS_DATA0) + { + /* Get value programmed in OB USER Data0 */ + value = READ_BIT(FLASH->OBR, FLASH_OBR_DATA0) >> FLASH_POSITION_OB_USERDATA0_BIT; + } + else + { + /* Get value programmed in OB USER Data1 */ + value = READ_BIT(FLASH->OBR, FLASH_OBR_DATA1) >> FLASH_POSITION_OB_USERDATA1_BIT; + } + + return value; +} + +/** + * @} + */ + +/** + * @} + */ + +/** @addtogroup FLASHEx_Private_Functions + * @{ + */ + +/** + * @brief Full erase of FLASH memory Bank + * + * @retval None + */ +static void FLASH_MassErase(void) +{ + /* Clean the error context */ + pFlash.ErrorCode = HAL_FLASH_ERROR_NONE; + + /* Only bank1 will be erased*/ + SET_BIT(FLASH->CR, FLASH_CR_MER); + SET_BIT(FLASH->CR, FLASH_CR_STRT); +} + +/** + * @brief Enable the write protection of the desired pages + * @note An option byte erase is done automatically in this function. + * @note When the memory read protection level is selected (RDP level = 1), + * it is not possible to program or erase the flash page i if + * debug features are connected or boot code is executed in RAM, even if nWRPi = 1 + * + * @param WriteProtectPage specifies the page(s) to be write protected. + * The value of this parameter depend on device used within the same series + * @retval HAL status + */ +static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WriteProtectPage) +{ + HAL_StatusTypeDef status = HAL_OK; + uint16_t WRP0_Data = 0xFFFFU; +#if defined(OB_WRP1_WRP1) + uint16_t WRP1_Data = 0xFFFFU; +#endif /* OB_WRP1_WRP1 */ +#if defined(OB_WRP2_WRP2) + uint16_t WRP2_Data = 0xFFFFU; +#endif /* OB_WRP2_WRP2 */ +#if defined(OB_WRP3_WRP3) + uint16_t WRP3_Data = 0xFFFFU; +#endif /* OB_WRP3_WRP3 */ + + /* Check the parameters */ + assert_param(IS_OB_WRP(WriteProtectPage)); + + /* Get current write protected pages and the new pages to be protected ******/ + WriteProtectPage = (uint32_t)(~((~FLASH_OB_GetWRP()) | WriteProtectPage)); + +#if defined(OB_WRP_PAGES0TO15MASK) + WRP0_Data = (uint16_t)(WriteProtectPage & OB_WRP_PAGES0TO15MASK); +#endif /* OB_WRP_PAGES0TO31MASK */ + +#if defined(OB_WRP_PAGES16TO31MASK) + WRP1_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES16TO31MASK) >> 8U); +#endif /* OB_WRP_PAGES32TO63MASK */ + +#if defined(OB_WRP_PAGES32TO47MASK) + WRP2_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES32TO47MASK) >> 16U); +#endif /* OB_WRP_PAGES32TO47MASK */ + +#if defined(OB_WRP_PAGES48TO127MASK) + WRP3_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES48TO127MASK) >> 24U); +#elif defined(OB_WRP_PAGES48TO255MASK) + WRP3_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES48TO255MASK) >> 24U); +#endif /* OB_WRP_PAGES48TO63MASK */ + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + /* Clean the error context */ + pFlash.ErrorCode = HAL_FLASH_ERROR_NONE; + + /* To be able to write again option byte, need to perform a option byte erase */ + status = HAL_FLASHEx_OBErase(); + if (status == HAL_OK) + { + /* Enable write protection */ + SET_BIT(FLASH->CR, FLASH_CR_OPTPG); + +#if defined(OB_WRP0_WRP0) + if(WRP0_Data != 0xFFU) + { + OB->WRP0 &= WRP0_Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + } +#endif /* OB_WRP0_WRP0 */ + +#if defined(OB_WRP1_WRP1) + if((status == HAL_OK) && (WRP1_Data != 0xFFU)) + { + OB->WRP1 &= WRP1_Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + } +#endif /* OB_WRP1_WRP1 */ + +#if defined(OB_WRP2_WRP2) + if((status == HAL_OK) && (WRP2_Data != 0xFFU)) + { + OB->WRP2 &= WRP2_Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + } +#endif /* OB_WRP2_WRP2 */ + +#if defined(OB_WRP3_WRP3) + if((status == HAL_OK) && (WRP3_Data != 0xFFU)) + { + OB->WRP3 &= WRP3_Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + } +#endif /* OB_WRP3_WRP3 */ + + /* if the program operation is completed, disable the OPTPG Bit */ + CLEAR_BIT(FLASH->CR, FLASH_CR_OPTPG); + } + } + + return status; +} + +/** + * @brief Disable the write protection of the desired pages + * @note An option byte erase is done automatically in this function. + * @note When the memory read protection level is selected (RDP level = 1), + * it is not possible to program or erase the flash page i if + * debug features are connected or boot code is executed in RAM, even if nWRPi = 1 + * + * @param WriteProtectPage specifies the page(s) to be write unprotected. + * The value of this parameter depend on device used within the same series + * @retval HAL status + */ +static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WriteProtectPage) +{ + HAL_StatusTypeDef status = HAL_OK; + uint16_t WRP0_Data = 0xFFFFU; +#if defined(OB_WRP1_WRP1) + uint16_t WRP1_Data = 0xFFFFU; +#endif /* OB_WRP1_WRP1 */ +#if defined(OB_WRP2_WRP2) + uint16_t WRP2_Data = 0xFFFFU; +#endif /* OB_WRP2_WRP2 */ +#if defined(OB_WRP3_WRP3) + uint16_t WRP3_Data = 0xFFFFU; +#endif /* OB_WRP3_WRP3 */ + + /* Check the parameters */ + assert_param(IS_OB_WRP(WriteProtectPage)); + + /* Get current write protected pages and the new pages to be unprotected ******/ + WriteProtectPage = (FLASH_OB_GetWRP() | WriteProtectPage); + +#if defined(OB_WRP_PAGES0TO15MASK) + WRP0_Data = (uint16_t)(WriteProtectPage & OB_WRP_PAGES0TO15MASK); +#endif /* OB_WRP_PAGES0TO31MASK */ + +#if defined(OB_WRP_PAGES16TO31MASK) + WRP1_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES16TO31MASK) >> 8U); +#endif /* OB_WRP_PAGES32TO63MASK */ + +#if defined(OB_WRP_PAGES32TO47MASK) + WRP2_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES32TO47MASK) >> 16U); +#endif /* OB_WRP_PAGES32TO47MASK */ + +#if defined(OB_WRP_PAGES48TO127MASK) + WRP3_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES48TO127MASK) >> 24U); +#elif defined(OB_WRP_PAGES48TO255MASK) + WRP3_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES48TO255MASK) >> 24U); +#endif /* OB_WRP_PAGES48TO63MASK */ + + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + /* Clean the error context */ + pFlash.ErrorCode = HAL_FLASH_ERROR_NONE; + + /* To be able to write again option byte, need to perform a option byte erase */ + status = HAL_FLASHEx_OBErase(); + if (status == HAL_OK) + { + SET_BIT(FLASH->CR, FLASH_CR_OPTPG); + +#if defined(OB_WRP0_WRP0) + if(WRP0_Data != 0xFFU) + { + OB->WRP0 |= WRP0_Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + } +#endif /* OB_WRP0_WRP0 */ + +#if defined(OB_WRP1_WRP1) + if((status == HAL_OK) && (WRP1_Data != 0xFFU)) + { + OB->WRP1 |= WRP1_Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + } +#endif /* OB_WRP1_WRP1 */ + +#if defined(OB_WRP2_WRP2) + if((status == HAL_OK) && (WRP2_Data != 0xFFU)) + { + OB->WRP2 |= WRP2_Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + } +#endif /* OB_WRP2_WRP2 */ + +#if defined(OB_WRP3_WRP3) + if((status == HAL_OK) && (WRP3_Data != 0xFFU)) + { + OB->WRP3 |= WRP3_Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + } +#endif /* OB_WRP3_WRP3 */ + + /* if the program operation is completed, disable the OPTPG Bit */ + CLEAR_BIT(FLASH->CR, FLASH_CR_OPTPG); + } + } + return status; +} + +/** + * @brief Set the read protection level. + * @param ReadProtectLevel specifies the read protection level. + * This parameter can be one of the following values: + * @arg @ref OB_RDP_LEVEL_0 No protection + * @arg @ref OB_RDP_LEVEL_1 Read protection of the memory + * @arg @ref 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 ReadProtectLevel) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_OB_RDP_LEVEL(ReadProtectLevel)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + /* Clean the error context */ + pFlash.ErrorCode = HAL_FLASH_ERROR_NONE; + + /* If the previous operation is completed, proceed to erase the option bytes */ + SET_BIT(FLASH->CR, FLASH_CR_OPTER); + SET_BIT(FLASH->CR, FLASH_CR_STRT); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + /* If the erase operation is completed, disable the OPTER Bit */ + CLEAR_BIT(FLASH->CR, FLASH_CR_OPTER); + + if(status == HAL_OK) + { + /* Enable the Option Bytes Programming operation */ + SET_BIT(FLASH->CR, FLASH_CR_OPTPG); + + WRITE_REG(OB->RDP, ReadProtectLevel); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + /* if the program operation is completed, disable the OPTPG Bit */ + CLEAR_BIT(FLASH->CR, FLASH_CR_OPTPG); + } + } + + return status; +} + +/** + * @brief Program the FLASH User Option Byte. + * @note Programming of the OB should be performed only after an erase (otherwise PGERR occurs) + * @param UserConfig The FLASH User Option Bytes values: IWDG_SW(Bit0), RST_STOP(Bit1), RST_STDBY(Bit2), nBOOT1(Bit4), + * VDDA_Analog_Monitoring(Bit5) and SRAM_Parity_Enable(Bit6). + * And SDADC12_VDD_MONITOR(Bit7) for STM32F373 or STM32F378 . + * @retval HAL status + */ +static HAL_StatusTypeDef FLASH_OB_UserConfig(uint8_t UserConfig) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_OB_IWDG_SOURCE((UserConfig&OB_IWDG_SW))); + assert_param(IS_OB_STOP_SOURCE((UserConfig&OB_STOP_NO_RST))); + assert_param(IS_OB_STDBY_SOURCE((UserConfig&OB_STDBY_NO_RST))); + assert_param(IS_OB_BOOT1((UserConfig&OB_BOOT1_SET))); + assert_param(IS_OB_VDDA_ANALOG((UserConfig&OB_VDDA_ANALOG_ON))); + assert_param(IS_OB_SRAM_PARITY((UserConfig&OB_SRAM_PARITY_RESET))); +#if defined(FLASH_OBR_SDADC12_VDD_MONITOR) + assert_param(IS_OB_SDACD_VDD_MONITOR((UserConfig&OB_SDACD_VDD_MONITOR_SET))); +#endif /* FLASH_OBR_SDADC12_VDD_MONITOR */ + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + /* Clean the error context */ + pFlash.ErrorCode = HAL_FLASH_ERROR_NONE; + + /* Enable the Option Bytes Programming operation */ + SET_BIT(FLASH->CR, FLASH_CR_OPTPG); + +#if defined(FLASH_OBR_SDADC12_VDD_MONITOR) + OB->USER = (UserConfig | 0x08U); +#else + OB->USER = (UserConfig | 0x88U); +#endif + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + /* if the program operation is completed, disable the OPTPG Bit */ + CLEAR_BIT(FLASH->CR, FLASH_CR_OPTPG); + } + + return status; +} + +/** + * @brief Programs a half word at a specified Option Byte Data address. + * @note The function @ref HAL_FLASH_Unlock() should be called before to unlock the FLASH interface + * The function @ref HAL_FLASH_OB_Unlock() should be called before to unlock the options bytes + * The function @ref HAL_FLASH_OB_Launch() should be called after to force the reload of the options bytes + * (system reset will occur) + * Programming of the OB should be performed only after an erase (otherwise PGERR occurs) + * @param Address specifies the address to be programmed. + * This parameter can be 0x1FFFF804 or 0x1FFFF806. + * @param Data specifies the data to be programmed. + * @retval HAL status + */ +static HAL_StatusTypeDef FLASH_OB_ProgramData(uint32_t Address, uint8_t Data) +{ + HAL_StatusTypeDef status = HAL_ERROR; + + /* Check the parameters */ + assert_param(IS_OB_DATA_ADDRESS(Address)); + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + if(status == HAL_OK) + { + /* Clean the error context */ + pFlash.ErrorCode = HAL_FLASH_ERROR_NONE; + + /* Enables the Option Bytes Programming operation */ + SET_BIT(FLASH->CR, FLASH_CR_OPTPG); + *(__IO uint16_t*)Address = Data; + + /* Wait for last operation to be completed */ + status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + + /* If the program operation is completed, disable the OPTPG Bit */ + CLEAR_BIT(FLASH->CR, FLASH_CR_OPTPG); + } + /* Return the Option Byte Data Program Status */ + return status; +} + +/** + * @brief Return the FLASH Write Protection Option Bytes value. + * @retval The FLASH Write Protection Option Bytes value + */ +static uint32_t FLASH_OB_GetWRP(void) +{ + /* Return the FLASH write protection Register value */ + return (uint32_t)(READ_REG(FLASH->WRPR)); +} + +/** + * @brief Returns the FLASH Read Protection level. + * @retval FLASH RDP level + * This parameter can be one of the following values: + * @arg @ref OB_RDP_LEVEL_0 No protection + * @arg @ref OB_RDP_LEVEL_1 Read protection of the memory + * @arg @ref OB_RDP_LEVEL_2 Full chip protection + */ +static uint32_t FLASH_OB_GetRDP(void) +{ + uint32_t tmp_reg = 0U; + + /* Read RDP level bits */ +#if defined(FLASH_OBR_RDPRT) + tmp_reg = READ_BIT(FLASH->OBR, FLASH_OBR_RDPRT); +#elif defined(FLASH_OBR_LEVEL1_PROT) + tmp_reg = READ_BIT(FLASH->OBR, (FLASH_OBR_LEVEL1_PROT | FLASH_OBR_LEVEL2_PROT)); +#endif /* FLASH_OBR_RDPRT */ + +#if defined(FLASH_OBR_RDPRT) + if (tmp_reg == FLASH_OBR_RDPRT_2) +#elif defined(FLASH_OBR_LEVEL1_PROT) + if (tmp_reg == FLASH_OBR_LEVEL2_PROT) +#endif /* FLASH_OBR_RDPRT */ + { + return OB_RDP_LEVEL_2; + } + else if (tmp_reg == 0U) + { + return OB_RDP_LEVEL_0; + } + else + { + return OB_RDP_LEVEL_1; + } +} + +/** + * @brief Return the FLASH User Option Byte value. + * @retval The FLASH User Option Bytes values: IWDG_SW(Bit0), RST_STOP(Bit1), RST_STDBY(Bit2), nBOOT1(Bit4), + * VDDA_Analog_Monitoring(Bit5) and SRAM_Parity_Enable(Bit6). + * And SDADC12_VDD_MONITOR(Bit7) for STM32F373 or STM32F378 . + */ +static uint8_t FLASH_OB_GetUser(void) +{ + /* Return the User Option Byte */ + return (uint8_t)((READ_REG(FLASH->OBR) & FLASH_OBR_USER) >> FLASH_POSITION_IWDGSW_BIT); +} + +/** + * @} + */ + +/** + * @} + */ + +/** @addtogroup FLASH + * @{ + */ + +/** @addtogroup FLASH_Private_Functions + * @{ + */ + +/** + * @brief Erase the specified FLASH memory page + * @param PageAddress FLASH page to erase + * The value of this parameter depend on device used within the same series + * + * @retval None + */ +void FLASH_PageErase(uint32_t PageAddress) +{ + /* Clean the error context */ + pFlash.ErrorCode = HAL_FLASH_ERROR_NONE; + + /* Proceed to erase the page */ + SET_BIT(FLASH->CR, FLASH_CR_PER); + WRITE_REG(FLASH->AR, PageAddress); + SET_BIT(FLASH->CR, FLASH_CR_STRT); +} + +/** + * @} + */ + +/** + * @} + */ + +#endif /* HAL_FLASH_MODULE_ENABLED */ +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c new file mode 100644 index 0000000..e1f91fe --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c @@ -0,0 +1,542 @@ +/** + ****************************************************************************** + * @file stm32f3xx_hal_gpio.c + * @author MCD Application Team + * @brief GPIO HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the General Purpose Input/Output (GPIO) peripheral: + * + Initialization and de-initialization functions + * + IO operation functions + * + @verbatim + ============================================================================== + ##### GPIO Peripheral features ##### + ============================================================================== + [..] + (+) Each port bit of the general-purpose I/O (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. + + (+) The microcontroller IO pins are connected to onboard peripherals/modules through a + multiplexer that allows only one peripheral alternate function (AF) connected + to an IO pin at a time. In this way, there can be no conflict between peripherals + sharing the same IO pin. + + (+) 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 PC15U, 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 PF0 and PF1, respectively, when the HSE oscillator is off. + The HSE has priority over the GPIO function. + + @endverbatim + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f3xx_hal.h" + +/** @addtogroup STM32F3xx_HAL_Driver + * @{ + */ + +/** @defgroup GPIO GPIO + * @brief GPIO HAL module driver + * @{ + */ + +/** MISRA C:2012 deviation rule has been granted for following rules: + * Rule-18.1_d - Medium: Array pointer `GPIOx' is accessed with index [..,..] + * which may be out of array bounds [..,UNKNOWN] in following APIs: + * HAL_GPIO_Init + * HAL_GPIO_DeInit + */ + +#ifdef HAL_GPIO_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private defines -----------------------------------------------------------*/ +/** @addtogroup GPIO_Private_Constants + * @{ + */ +#define GPIO_NUMBER (16U) +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/** @defgroup GPIO_Private_Macros GPIO Private Macros + * @{ + */ +/** + * @} + */ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ + +/** @defgroup GPIO_Exported_Functions GPIO Exported Functions + * @{ + */ + +/** @defgroup GPIO_Exported_Functions_Group1 Initialization/de-initialization functions + * @brief Initialization and Configuration functions + * +@verbatim + =============================================================================== + ##### Initialization and de-initialization functions ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Initialize the GPIOx peripheral according to the specified parameters in the GPIO_Init. + * @param GPIOx where x can be (A..F) to select the GPIO peripheral for STM32F3 family 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 = 0x00u; + uint32_t iocurrent; + uint32_t temp; + + /* Check the parameters */ + assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); + assert_param(IS_GPIO_PIN(GPIO_Init->Pin)); + assert_param(IS_GPIO_MODE(GPIO_Init->Mode)); + + /* Configure the port pins */ + while (((GPIO_Init->Pin) >> position) != 0x00u) + { + /* Get current io position */ + iocurrent = (GPIO_Init->Pin) & (1uL << position); + + if (iocurrent != 0x00u) + { + /*--------------------- 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 Pull parameter */ + 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; + } + + /*--------------------- GPIO Mode Configuration ------------------------*/ + /* In case of Alternate function mode selection */ + if((GPIO_Init->Mode & GPIO_MODE) == MODE_AF) + { + /* Check the Alternate function parameters */ + assert_param(IS_GPIO_AF_INSTANCE(GPIOx)); + assert_param(IS_GPIO_AF(GPIO_Init->Alternate)); + + /* Configure Alternate function mapped with the current IO */ + temp = GPIOx->AFR[position >> 3u]; + temp &= ~(0xFu << ((position & 0x07u) * 4u)); + temp |= ((GPIO_Init->Alternate) << ((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 &= ~(0x0FuL << (4u * (position & 0x03u))); + temp |= (GPIO_GET_INDEX(GPIOx) << (4u * (position & 0x03u))); + SYSCFG->EXTICR[position >> 2u] = temp; + + /* Clear EXTI line configuration */ + temp = EXTI->IMR; + temp &= ~(iocurrent); + if((GPIO_Init->Mode & EXTI_IT) != 0x00u) + { + temp |= iocurrent; + } + EXTI->IMR = temp; + + temp = EXTI->EMR; + temp &= ~(iocurrent); + if((GPIO_Init->Mode & EXTI_EVT) != 0x00u) + { + temp |= iocurrent; + } + EXTI->EMR = temp; + + /* Clear Rising Falling edge configuration */ + temp = EXTI->RTSR; + temp &= ~(iocurrent); + if((GPIO_Init->Mode & TRIGGER_RISING) != 0x00u) + { + temp |= iocurrent; + } + EXTI->RTSR = temp; + + temp = EXTI->FTSR; + temp &= ~(iocurrent); + if((GPIO_Init->Mode & TRIGGER_FALLING) != 0x00u) + { + temp |= iocurrent; + } + EXTI->FTSR = temp; + } + } + + position++; + } +} + +/** + * @brief De-initialize the GPIOx peripheral registers to their default reset values. + * @param GPIOx where x can be (A..F) to select the GPIO peripheral for STM32F30X device or STM32F37X device + * @param GPIO_Pin specifies the port bit to be written. + * This parameter can be one of GPIO_PIN_x where x can be (0..15). + * @retval None + */ +void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) +{ + uint32_t position = 0x00u; + uint32_t iocurrent; + uint32_t tmp; + + /* Check the parameters */ + assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); + assert_param(IS_GPIO_PIN(GPIO_Pin)); + + /* Configure the port pins */ + while ((GPIO_Pin >> position) != 0x00u) + { + /* Get current io position */ + iocurrent = (GPIO_Pin) & (1uL << position); + + if (iocurrent != 0x00u) + { + /*------------------------- EXTI Mode Configuration --------------------*/ + /* Clear the External Interrupt or Event for the current IO */ + + tmp = SYSCFG->EXTICR[position >> 2u]; + tmp &= (0x0FuL << (4u * (position & 0x03u))); + if (tmp == (GPIO_GET_INDEX(GPIOx) << (4u * (position & 0x03u)))) + { + /* Clear EXTI line configuration */ + EXTI->IMR &= ~((uint32_t)iocurrent); + EXTI->EMR &= ~((uint32_t)iocurrent); + + /* Clear Rising Falling edge configuration */ + EXTI->RTSR &= ~((uint32_t)iocurrent); + EXTI->FTSR &= ~((uint32_t)iocurrent); + + /* Configure the External Interrupt or event for the current IO */ + tmp = 0x0FuL << (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)); + } + + position++; + } +} + +/** + * @} + */ + +/** @defgroup GPIO_Exported_Functions_Group2 IO operation functions + * @brief GPIO Read, Write, Toggle, Lock and EXTI management functions. + * +@verbatim + =============================================================================== + ##### IO operation functions ##### + =============================================================================== + +@endverbatim + * @{ + */ + +/** + * @brief Read the specified input port pin. + * @param GPIOx where x can be (A..F) to select the GPIO peripheral for STM32F3 family + * @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 Set or clear the selected data port bit. + * + * @note This function uses GPIOx_BSRR and GPIOx_BRR registers 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..F) to select the GPIO peripheral for STM32F3 family + * @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 = (uint32_t)GPIO_Pin; + } + else + { + GPIOx->BRR = (uint32_t)GPIO_Pin; + } +} + +/** + * @brief Toggle the specified GPIO pin. + * @param GPIOx where x can be (A..F) to select the GPIO peripheral for STM32F3 family + * @param GPIO_Pin specifies the pin 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 Ouput 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 Lock 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 STM32F3 family + * @param GPIO_Pin specifies the port bits to be locked. + * This parameter can be any combination of GPIO_Pin_x where x can be (0..15). + * @retval None + */ +HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) +{ + __IO uint32_t tmp = GPIO_LCKR_LCKK; + + /* Check the parameters */ + assert_param(IS_GPIO_LOCK_INSTANCE(GPIOx)); + assert_param(IS_GPIO_PIN(GPIO_Pin)); + + /* Apply lock key write sequence */ + tmp |= GPIO_Pin; + /* Set LCKx bit(s): LCKK='1' + LCK[15U-0] */ + GPIOx->LCKR = tmp; + /* Reset LCKx bit(s): LCKK='0' + LCK[15U-0] */ + GPIOx->LCKR = GPIO_Pin; + /* Set LCKx bit(s): LCKK='1' + LCK[15U-0] */ + GPIOx->LCKR = tmp; + /* Read LCKK register. This read is mandatory to complete key lock sequence */ + tmp = GPIOx->LCKR; + + /* read again in order to confirm lock is active */ + if((GPIOx->LCKR & GPIO_LCKR_LCKK) != 0x00u) + { + return HAL_OK; + } + else + { + return HAL_ERROR; + } +} + +/** + * @brief Handle EXTI interrupt request. + * @param GPIO_Pin Specifies the port pin connected to corresponding EXTI line. + * @retval None + */ +void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin) +{ + /* EXTI line interrupt detected */ + if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != 0x00u) + { + __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin); + HAL_GPIO_EXTI_Callback(GPIO_Pin); + } +} + +/** + * @brief EXTI line detection callback. + * @param GPIO_Pin Specifies the port pin connected to corresponding EXTI line. + * @retval None + */ +__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(GPIO_Pin); + + /* NOTE: This function should not be modified, when the callback is needed, + the HAL_GPIO_EXTI_Callback could be implemented in the user file + */ +} + +/** + * @} + */ + + +/** + * @} + */ + +#endif /* HAL_GPIO_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c new file mode 100644 index 0000000..af58c50 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c @@ -0,0 +1,6794 @@ +/** + ****************************************************************************** + * @file stm32f3xx_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 and Errors functions + * + @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 channel + (+++) Enable the DMAx interface clock using + (+++) Configure the DMA handle parameters + (+++) Configure the DMA Tx or Rx channel + (+++) 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 channel + + (#) Configure the Communication Clock Timing, Own Address1, Master Addressing mode, Dual Addressing mode, + Own Address2, Own Address2 Mask, 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(&hi2c) 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 users can + add their 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 users can + add their 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 users can + add their 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 users can + add their own code by customization of function pointer HAL_I2C_SlaveRxCpltCallback() + (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and users can + add their own code by customization of function pointer HAL_I2C_ErrorCallback() + (+) Abort a master I2C process communication with Interrupt using HAL_I2C_Master_Abort_IT() + (+) End of abort process, HAL_I2C_AbortCpltCallback() is executed and users can + add their own code by customization of function pointer HAL_I2C_AbortCpltCallback() + (+) Discard a slave I2C process communication using __HAL_I2C_GENERATE_NACK() macro. + This action will inform Master to generate a Stop condition to discard the communication. + + + *** 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 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 + or HAL_I2C_Master_Seq_Receive_IT + or HAL_I2C_Master_Seq_Transmit_DMA + or HAL_I2C_Master_Seq_Receive_DMA + with 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 + or HAL_I2C_Master_Seq_Receive_IT + or HAL_I2C_Master_Seq_Transmit_DMA + or HAL_I2C_Master_Seq_Receive_DMA + with 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 + users can add their 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 users can + add their own code by customization of function pointer HAL_I2C_MasterRxCpltCallback() + (++) Abort a master IT or DMA I2C process communication with Interrupt using HAL_I2C_Master_Abort_IT() + (+++) End of abort process, HAL_I2C_AbortCpltCallback() is executed and users can + add their 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 users can + add their 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 users can + add their 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 + users can add their 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 users can + add their own code by customization of function pointer HAL_I2C_SlaveRxCpltCallback() + (++) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and users can + add their own code by customization of function pointer HAL_I2C_ErrorCallback() + (++) Discard a slave I2C process communication using __HAL_I2C_GENERATE_NACK() macro. + This action will inform Master to generate a Stop condition to discard the communication. + + *** 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 users can + add their 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 users can + add their own code by customization of function pointer HAL_I2C_MemRxCpltCallback() + (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and users can + add their 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 users can + add their 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 users can + add their 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 users can + add their 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 users can + add their own code by customization of function pointer HAL_I2C_SlaveRxCpltCallback() + (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and users can + add their own code by customization of function pointer HAL_I2C_ErrorCallback() + (+) Abort a master I2C process communication with Interrupt using HAL_I2C_Master_Abort_IT() + (+) End of abort process, HAL_I2C_AbortCpltCallback() is executed and users can + add their own code by customization of function pointer HAL_I2C_AbortCpltCallback() + (+) Discard a slave I2C process communication using __HAL_I2C_GENERATE_NACK() macro. + This action will inform Master to generate a Stop condition to discard the communication. + + *** 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 users can + add their 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 users can + add their own code by customization of function pointer HAL_I2C_MemRxCpltCallback() + (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and users can + add their 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_GENERATE_NACK: Generate a Non-Acknowledge I2C peripheral in Slave mode + (+) __HAL_I2C_GET_FLAG: Check 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 + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f3xx_hal.h" + +/** @addtogroup STM32F3xx_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 TIMING_CLEAR_MASK (0xF0FFFFFFU) /*!< I2C TIMING clear register Mask */ +#define I2C_TIMEOUT_ADDR (10000U) /*!< 10 s */ +#define I2C_TIMEOUT_BUSY (25U) /*!< 25 ms */ +#define I2C_TIMEOUT_DIR (25U) /*!< 25 ms */ +#define I2C_TIMEOUT_RXNE (25U) /*!< 25 ms */ +#define I2C_TIMEOUT_STOPF (25U) /*!< 25 ms */ +#define I2C_TIMEOUT_TC (25U) /*!< 25 ms */ +#define I2C_TIMEOUT_TCR (25U) /*!< 25 ms */ +#define I2C_TIMEOUT_TXIS (25U) /*!< 25 ms */ +#define I2C_TIMEOUT_FLAG (25U) /*!< 25 ms */ + +#define MAX_NBYTE_SIZE 255U +#define SLAVE_ADDR_SHIFT 7U +#define SLAVE_ADDR_MSK 0x06U + +/* 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 */ +#define I2C_STATE_MEM_BUSY_TX ((uint32_t)(((uint32_t)HAL_I2C_STATE_BUSY_TX & I2C_STATE_MSK) | \ + (uint32_t)HAL_I2C_MODE_MEM)) +/*!< Memory Busy TX, combinaison of State LSB and Mode enum */ +#define I2C_STATE_MEM_BUSY_RX ((uint32_t)(((uint32_t)HAL_I2C_STATE_BUSY_RX & I2C_STATE_MSK) | \ + (uint32_t)HAL_I2C_MODE_MEM)) +/*!< Memory Busy RX, combinaison of State LSB and Mode enum */ + + +/* Private define to centralize the enable/disable of Interrupts */ +#define I2C_XFER_TX_IT (uint16_t)(0x0001U) /*!< Bit field can be combinated with + @ref I2C_XFER_LISTEN_IT */ +#define I2C_XFER_RX_IT (uint16_t)(0x0002U) /*!< Bit field can be combinated with + @ref I2C_XFER_LISTEN_IT */ +#define I2C_XFER_LISTEN_IT (uint16_t)(0x8000U) /*!< Bit field can be combinated with @ref I2C_XFER_TX_IT + and @ref I2C_XFER_RX_IT */ + +#define I2C_XFER_ERROR_IT (uint16_t)(0x0010U) /*!< Bit definition to manage addition of global Error + and NACK treatment */ +#define I2C_XFER_CPLT_IT (uint16_t)(0x0020U) /*!< Bit definition to manage only STOP evenement */ +#define I2C_XFER_RELOAD_IT (uint16_t)(0x0040U) /*!< Bit definition to manage only Reload of NBYTE */ + +/* Private define Sequential Transfer Options default/reset value */ +#define I2C_NO_OPTION_FRAME (0xFFFF0000U) +/** + * @} + */ + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ + +/** @defgroup I2C_Private_Functions I2C Private Functions + * @{ + */ +/* Private functions to handle DMA transfer */ +static void I2C_DMAMasterTransmitCplt(DMA_HandleTypeDef *hdma); +static void I2C_DMAMasterReceiveCplt(DMA_HandleTypeDef *hdma); +static void I2C_DMASlaveTransmitCplt(DMA_HandleTypeDef *hdma); +static void I2C_DMASlaveReceiveCplt(DMA_HandleTypeDef *hdma); +static void I2C_DMAError(DMA_HandleTypeDef *hdma); +static void I2C_DMAAbort(DMA_HandleTypeDef *hdma); + +/* Private functions to handle IT transfer */ +static void I2C_ITAddrCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags); +static void I2C_ITMasterSeqCplt(I2C_HandleTypeDef *hi2c); +static void I2C_ITSlaveSeqCplt(I2C_HandleTypeDef *hi2c); +static void I2C_ITMasterCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags); +static void I2C_ITSlaveCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags); +static void I2C_ITListenCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags); +static void I2C_ITError(I2C_HandleTypeDef *hi2c, uint32_t ErrorCode); + +/* Private functions to handle IT transfer */ +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 for I2C transfer IRQ handler */ +static HAL_StatusTypeDef I2C_Master_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, + uint32_t ITSources); +static HAL_StatusTypeDef I2C_Slave_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, + uint32_t ITSources); +static HAL_StatusTypeDef I2C_Master_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, + uint32_t ITSources); +static HAL_StatusTypeDef I2C_Slave_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, + uint32_t ITSources); + +/* 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_WaitOnTXISFlagUntilTimeout(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_IsAcknowledgeFailed(I2C_HandleTypeDef *hi2c, uint32_t Timeout, + uint32_t Tickstart); + +/* Private functions to centralize the enable/disable of Interrupts */ +static void I2C_Enable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest); +static void I2C_Disable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest); + +/* Private function to treat different error callback */ +static void I2C_TreatErrorCallback(I2C_HandleTypeDef *hi2c); + +/* Private function to flush TXDR register */ +static void I2C_Flush_TXDR(I2C_HandleTypeDef *hi2c); + +/* Private function to handle start, restart or stop a transfer */ +static void I2C_TransferConfig(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t Size, uint32_t Mode, + uint32_t Request); + +/* Private function to Convert Specific options */ +static void I2C_ConvertOtherXferOptions(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: + (++) Clock Timing + (++) Own Address 1 + (++) Addressing mode (Master, Slave) + (++) Dual Addressing mode + (++) Own Address 2 + (++) Own Address 2 Mask + (++) 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) +{ + /* 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_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_OWN_ADDRESS2_MASK(hi2c->Init.OwnAddress2Masks)); + 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, CORTEX...etc */ + hi2c->MspInitCallback(hi2c); +#else + /* Init the low level hardware : GPIO, CLOCK, CORTEX...etc */ + 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); + + /*---------------------------- I2Cx TIMINGR Configuration ------------------*/ + /* Configure I2Cx: Frequency range */ + hi2c->Instance->TIMINGR = hi2c->Init.Timing & TIMING_CLEAR_MASK; + + /*---------------------------- I2Cx OAR1 Configuration ---------------------*/ + /* Disable Own Address1 before set the Own Address1 configuration */ + hi2c->Instance->OAR1 &= ~I2C_OAR1_OA1EN; + + /* Configure I2Cx: Own Address1 and ack own address1 mode */ + if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT) + { + hi2c->Instance->OAR1 = (I2C_OAR1_OA1EN | hi2c->Init.OwnAddress1); + } + else /* I2C_ADDRESSINGMODE_10BIT */ + { + hi2c->Instance->OAR1 = (I2C_OAR1_OA1EN | I2C_OAR1_OA1MODE | hi2c->Init.OwnAddress1); + } + + /*---------------------------- I2Cx CR2 Configuration ----------------------*/ + /* Configure I2Cx: Addressing Master mode */ + if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_10BIT) + { + hi2c->Instance->CR2 = (I2C_CR2_ADD10); + } + /* Enable the AUTOEND by default, and enable NACK (should be disable only during Slave process */ + hi2c->Instance->CR2 |= (I2C_CR2_AUTOEND | I2C_CR2_NACK); + + /*---------------------------- I2Cx OAR2 Configuration ---------------------*/ + /* Disable Own Address2 before set the Own Address2 configuration */ + hi2c->Instance->OAR2 &= ~I2C_DUALADDRESS_ENABLE; + + /* Configure I2Cx: Dual mode and Own Address2 */ + hi2c->Instance->OAR2 = (hi2c->Init.DualAddressMode | hi2c->Init.OwnAddress2 | \ + (hi2c->Init.OwnAddress2Masks << 8)); + + /*---------------------------- I2Cx CR1 Configuration ----------------------*/ + /* Configure I2Cx: Generalcall and NoStretch mode */ + hi2c->Instance->CR1 = (hi2c->Init.GeneralCallMode | hi2c->Init.NoStretchMode); + + /* 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 */ + +/** + * @} + */ + +/** @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) +{ + uint32_t tickstart; + + if (hi2c->State == HAL_I2C_STATE_READY) + { + /* Process Locked */ + __HAL_LOCK(hi2c); + + /* Init tickstart for timeout management*/ + tickstart = HAL_GetTick(); + + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY, tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + 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->XferISR = NULL; + + /* Send Slave Address */ + /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */ + if (hi2c->XferCount > MAX_NBYTE_SIZE) + { + hi2c->XferSize = MAX_NBYTE_SIZE; + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, + I2C_GENERATE_START_WRITE); + } + else + { + hi2c->XferSize = hi2c->XferCount; + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, + I2C_GENERATE_START_WRITE); + } + + while (hi2c->XferCount > 0U) + { + /* Wait until TXIS flag is set */ + if (I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) + { + return HAL_ERROR; + } + /* Write data to TXDR */ + hi2c->Instance->TXDR = *hi2c->pBuffPtr; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + hi2c->XferCount--; + hi2c->XferSize--; + + if ((hi2c->XferCount != 0U) && (hi2c->XferSize == 0U)) + { + /* Wait until TCR flag is set */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, Timeout, tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + if (hi2c->XferCount > MAX_NBYTE_SIZE) + { + hi2c->XferSize = MAX_NBYTE_SIZE; + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, + I2C_NO_STARTSTOP); + } + else + { + hi2c->XferSize = hi2c->XferCount; + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, + I2C_NO_STARTSTOP); + } + } + } + + /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */ + /* Wait until STOPF flag is set */ + if (I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + /* Clear STOP Flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF); + + /* Clear Configuration Register 2 */ + I2C_RESET_CR2(hi2c); + + 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) +{ + uint32_t tickstart; + + if (hi2c->State == HAL_I2C_STATE_READY) + { + /* Process Locked */ + __HAL_LOCK(hi2c); + + /* Init tickstart for timeout management*/ + tickstart = HAL_GetTick(); + + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY, tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + 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->XferISR = NULL; + + /* Send Slave Address */ + /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */ + if (hi2c->XferCount > MAX_NBYTE_SIZE) + { + hi2c->XferSize = MAX_NBYTE_SIZE; + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, + I2C_GENERATE_START_READ); + } + else + { + hi2c->XferSize = hi2c->XferCount; + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, + I2C_GENERATE_START_READ); + } + + while (hi2c->XferCount > 0U) + { + /* Wait until RXNE flag is set */ + if (I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + /* Read data from RXDR */ + *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + hi2c->XferSize--; + hi2c->XferCount--; + + if ((hi2c->XferCount != 0U) && (hi2c->XferSize == 0U)) + { + /* Wait until TCR flag is set */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, Timeout, tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + if (hi2c->XferCount > MAX_NBYTE_SIZE) + { + hi2c->XferSize = MAX_NBYTE_SIZE; + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, + I2C_NO_STARTSTOP); + } + else + { + hi2c->XferSize = hi2c->XferCount; + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, + I2C_NO_STARTSTOP); + } + } + } + + /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */ + /* Wait until STOPF flag is set */ + if (I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + /* Clear STOP Flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF); + + /* Clear Configuration Register 2 */ + I2C_RESET_CR2(hi2c); + + 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) +{ + uint32_t tickstart; + + if (hi2c->State == HAL_I2C_STATE_READY) + { + if ((pData == NULL) || (Size == 0U)) + { + hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM; + return HAL_ERROR; + } + /* Process Locked */ + __HAL_LOCK(hi2c); + + /* Init tickstart for timeout management*/ + tickstart = HAL_GetTick(); + + 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->XferISR = NULL; + + /* Enable Address Acknowledge */ + hi2c->Instance->CR2 &= ~I2C_CR2_NACK; + + /* Wait until ADDR flag is set */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout, tickstart) != HAL_OK) + { + /* Disable Address Acknowledge */ + hi2c->Instance->CR2 |= I2C_CR2_NACK; + return HAL_ERROR; + } + + /* Clear ADDR flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR); + + /* 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) + { + /* Disable Address Acknowledge */ + hi2c->Instance->CR2 |= I2C_CR2_NACK; + return HAL_ERROR; + } + + /* Clear ADDR flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR); + } + + /* Wait until DIR flag is set Transmitter mode */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_DIR, RESET, Timeout, tickstart) != HAL_OK) + { + /* Disable Address Acknowledge */ + hi2c->Instance->CR2 |= I2C_CR2_NACK; + return HAL_ERROR; + } + + while (hi2c->XferCount > 0U) + { + /* Wait until TXIS flag is set */ + if (I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) + { + /* Disable Address Acknowledge */ + hi2c->Instance->CR2 |= I2C_CR2_NACK; + return HAL_ERROR; + } + + /* Write data to TXDR */ + hi2c->Instance->TXDR = *hi2c->pBuffPtr; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + hi2c->XferCount--; + } + + /* Wait until STOP flag is set */ + if (I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) + { + /* Disable Address Acknowledge */ + hi2c->Instance->CR2 |= I2C_CR2_NACK; + + if (hi2c->ErrorCode == HAL_I2C_ERROR_AF) + { + /* Normal use case for Transmitter mode */ + /* A NACK is generated to confirm the end of transfer */ + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + } + else + { + return HAL_ERROR; + } + } + + /* Clear STOP flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF); + + /* Wait until BUSY flag is reset */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, Timeout, tickstart) != HAL_OK) + { + /* Disable Address Acknowledge */ + hi2c->Instance->CR2 |= I2C_CR2_NACK; + return HAL_ERROR; + } + + /* Disable Address Acknowledge */ + hi2c->Instance->CR2 |= I2C_CR2_NACK; + + 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) +{ + uint32_t tickstart; + + if (hi2c->State == HAL_I2C_STATE_READY) + { + if ((pData == NULL) || (Size == 0U)) + { + hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM; + return HAL_ERROR; + } + /* Process Locked */ + __HAL_LOCK(hi2c); + + /* Init tickstart for timeout management*/ + tickstart = HAL_GetTick(); + + 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->XferISR = NULL; + + /* Enable Address Acknowledge */ + hi2c->Instance->CR2 &= ~I2C_CR2_NACK; + + /* Wait until ADDR flag is set */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout, tickstart) != HAL_OK) + { + /* Disable Address Acknowledge */ + hi2c->Instance->CR2 |= I2C_CR2_NACK; + return HAL_ERROR; + } + + /* Clear ADDR flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR); + + /* Wait until DIR flag is reset Receiver mode */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_DIR, SET, Timeout, tickstart) != HAL_OK) + { + /* Disable Address Acknowledge */ + hi2c->Instance->CR2 |= I2C_CR2_NACK; + return HAL_ERROR; + } + + while (hi2c->XferCount > 0U) + { + /* Wait until RXNE flag is set */ + if (I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) + { + /* Disable Address Acknowledge */ + hi2c->Instance->CR2 |= I2C_CR2_NACK; + + /* Store Last receive data if any */ + if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET) + { + /* Read data from RXDR */ + *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + hi2c->XferCount--; + } + + return HAL_ERROR; + } + + /* Read data from RXDR */ + *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + hi2c->XferCount--; + } + + /* Wait until STOP flag is set */ + if (I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) + { + /* Disable Address Acknowledge */ + hi2c->Instance->CR2 |= I2C_CR2_NACK; + return HAL_ERROR; + } + + /* Clear STOP flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF); + + /* Wait until BUSY flag is reset */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, Timeout, tickstart) != HAL_OK) + { + /* Disable Address Acknowledge */ + hi2c->Instance->CR2 |= I2C_CR2_NACK; + return HAL_ERROR; + } + + /* Disable Address Acknowledge */ + hi2c->Instance->CR2 |= I2C_CR2_NACK; + + 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) +{ + uint32_t xfermode; + + if (hi2c->State == HAL_I2C_STATE_READY) + { + if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET) + { + return HAL_BUSY; + } + + /* Process Locked */ + __HAL_LOCK(hi2c); + + 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->XferOptions = I2C_NO_OPTION_FRAME; + hi2c->XferISR = I2C_Master_ISR_IT; + + if (hi2c->XferCount > MAX_NBYTE_SIZE) + { + hi2c->XferSize = MAX_NBYTE_SIZE; + xfermode = I2C_RELOAD_MODE; + } + else + { + hi2c->XferSize = hi2c->XferCount; + xfermode = I2C_AUTOEND_MODE; + } + + /* Send Slave Address */ + /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE */ + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, I2C_GENERATE_START_WRITE); + + /* 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, TC, STOP, NACK, TXI interrupt */ + /* possible to enable all of these */ + /* I2C_IT_ERRI | I2C_IT_TCI | I2C_IT_STOPI | I2C_IT_NACKI | + I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */ + I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT); + + 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) +{ + uint32_t xfermode; + + if (hi2c->State == HAL_I2C_STATE_READY) + { + if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET) + { + return HAL_BUSY; + } + + /* Process Locked */ + __HAL_LOCK(hi2c); + + 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->XferOptions = I2C_NO_OPTION_FRAME; + hi2c->XferISR = I2C_Master_ISR_IT; + + if (hi2c->XferCount > MAX_NBYTE_SIZE) + { + hi2c->XferSize = MAX_NBYTE_SIZE; + xfermode = I2C_RELOAD_MODE; + } + else + { + hi2c->XferSize = hi2c->XferCount; + xfermode = I2C_AUTOEND_MODE; + } + + /* Send Slave Address */ + /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE */ + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, I2C_GENERATE_START_READ); + + /* 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, TC, STOP, NACK, RXI interrupt */ + /* possible to enable all of these */ + /* I2C_IT_ERRI | I2C_IT_TCI | I2C_IT_STOPI | I2C_IT_NACKI | + I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */ + I2C_Enable_IRQ(hi2c, I2C_XFER_RX_IT); + + 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) + { + /* Process Locked */ + __HAL_LOCK(hi2c); + + hi2c->State = HAL_I2C_STATE_BUSY_TX; + hi2c->Mode = HAL_I2C_MODE_SLAVE; + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + + /* Enable Address Acknowledge */ + hi2c->Instance->CR2 &= ~I2C_CR2_NACK; + + /* Prepare transfer parameters */ + hi2c->pBuffPtr = pData; + hi2c->XferCount = Size; + hi2c->XferSize = hi2c->XferCount; + hi2c->XferOptions = I2C_NO_OPTION_FRAME; + hi2c->XferISR = I2C_Slave_ISR_IT; + + /* 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, TC, STOP, NACK, TXI interrupt */ + /* possible to enable all of these */ + /* I2C_IT_ERRI | I2C_IT_TCI | I2C_IT_STOPI | I2C_IT_NACKI | + I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */ + I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT | I2C_XFER_LISTEN_IT); + + 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) + { + /* Process Locked */ + __HAL_LOCK(hi2c); + + hi2c->State = HAL_I2C_STATE_BUSY_RX; + hi2c->Mode = HAL_I2C_MODE_SLAVE; + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + + /* Enable Address Acknowledge */ + hi2c->Instance->CR2 &= ~I2C_CR2_NACK; + + /* Prepare transfer parameters */ + hi2c->pBuffPtr = pData; + hi2c->XferCount = Size; + hi2c->XferSize = hi2c->XferCount; + hi2c->XferOptions = I2C_NO_OPTION_FRAME; + hi2c->XferISR = I2C_Slave_ISR_IT; + + /* 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, TC, STOP, NACK, RXI interrupt */ + /* possible to enable all of these */ + /* I2C_IT_ERRI | I2C_IT_TCI | I2C_IT_STOPI | I2C_IT_NACKI | + I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */ + I2C_Enable_IRQ(hi2c, I2C_XFER_RX_IT | I2C_XFER_LISTEN_IT); + + 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) +{ + uint32_t xfermode; + HAL_StatusTypeDef dmaxferstatus; + + if (hi2c->State == HAL_I2C_STATE_READY) + { + if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET) + { + return HAL_BUSY; + } + + /* Process Locked */ + __HAL_LOCK(hi2c); + + 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->XferOptions = I2C_NO_OPTION_FRAME; + hi2c->XferISR = I2C_Master_ISR_DMA; + + if (hi2c->XferCount > MAX_NBYTE_SIZE) + { + hi2c->XferSize = MAX_NBYTE_SIZE; + xfermode = I2C_RELOAD_MODE; + } + else + { + hi2c->XferSize = hi2c->XferCount; + xfermode = I2C_AUTOEND_MODE; + } + + if (hi2c->XferSize > 0U) + { + if (hi2c->hdmatx != NULL) + { + /* Set the I2C DMA transfer complete callback */ + hi2c->hdmatx->XferCpltCallback = I2C_DMAMasterTransmitCplt; + + /* 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 channel */ + dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)pData, (uint32_t)&hi2c->Instance->TXDR, + 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 */ + /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */ + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, I2C_GENERATE_START_WRITE); + + /* Update XferCount value */ + hi2c->XferCount -= hi2c->XferSize; + + /* 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 and NACK interrupts */ + I2C_Enable_IRQ(hi2c, I2C_XFER_ERROR_IT); + + /* Enable DMA Request */ + hi2c->Instance->CR1 |= I2C_CR1_TXDMAEN; + } + 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 Transfer ISR function pointer */ + hi2c->XferISR = I2C_Master_ISR_IT; + + /* Send Slave Address */ + /* Set NBYTES to write and generate START condition */ + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, + I2C_GENERATE_START_WRITE); + + /* 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, TC, STOP, NACK, TXI interrupt */ + /* possible to enable all of these */ + /* I2C_IT_ERRI | I2C_IT_TCI | I2C_IT_STOPI | I2C_IT_NACKI | + I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */ + I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT); + } + + 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) +{ + uint32_t xfermode; + HAL_StatusTypeDef dmaxferstatus; + + if (hi2c->State == HAL_I2C_STATE_READY) + { + if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET) + { + return HAL_BUSY; + } + + /* Process Locked */ + __HAL_LOCK(hi2c); + + 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->XferOptions = I2C_NO_OPTION_FRAME; + hi2c->XferISR = I2C_Master_ISR_DMA; + + if (hi2c->XferCount > MAX_NBYTE_SIZE) + { + hi2c->XferSize = MAX_NBYTE_SIZE; + xfermode = I2C_RELOAD_MODE; + } + else + { + hi2c->XferSize = hi2c->XferCount; + xfermode = I2C_AUTOEND_MODE; + } + + if (hi2c->XferSize > 0U) + { + if (hi2c->hdmarx != NULL) + { + /* Set the I2C DMA transfer complete callback */ + hi2c->hdmarx->XferCpltCallback = I2C_DMAMasterReceiveCplt; + + /* 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 channel */ + dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->RXDR, (uint32_t)pData, + 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 */ + /* Set NBYTES to read and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */ + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, I2C_GENERATE_START_READ); + + /* Update XferCount value */ + hi2c->XferCount -= hi2c->XferSize; + + /* 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 and NACK interrupts */ + I2C_Enable_IRQ(hi2c, I2C_XFER_ERROR_IT); + + /* Enable DMA Request */ + hi2c->Instance->CR1 |= I2C_CR1_RXDMAEN; + } + 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 Transfer ISR function pointer */ + hi2c->XferISR = I2C_Master_ISR_IT; + + /* Send Slave Address */ + /* Set NBYTES to read and generate START condition */ + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, + I2C_GENERATE_START_READ); + + /* 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, TC, STOP, NACK, TXI interrupt */ + /* possible to enable all of these */ + /* I2C_IT_ERRI | I2C_IT_TCI | I2C_IT_STOPI | I2C_IT_NACKI | + I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */ + I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT); + } + + 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)) + { + hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM; + return HAL_ERROR; + } + /* Process Locked */ + __HAL_LOCK(hi2c); + + 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; + hi2c->XferISR = I2C_Slave_ISR_DMA; + + if (hi2c->hdmatx != NULL) + { + /* Set the I2C DMA transfer complete callback */ + hi2c->hdmatx->XferCpltCallback = I2C_DMASlaveTransmitCplt; + + /* 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 channel */ + dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)pData, (uint32_t)&hi2c->Instance->TXDR, + 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 */ + hi2c->Instance->CR2 &= ~I2C_CR2_NACK; + + /* 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, STOP, NACK, ADDR interrupts */ + I2C_Enable_IRQ(hi2c, I2C_XFER_LISTEN_IT); + + /* Enable DMA Request */ + hi2c->Instance->CR1 |= I2C_CR1_TXDMAEN; + } + 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; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_ERROR; + } + + return HAL_OK; + } + 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)) + { + hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM; + return HAL_ERROR; + } + /* Process Locked */ + __HAL_LOCK(hi2c); + + 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; + hi2c->XferISR = I2C_Slave_ISR_DMA; + + if (hi2c->hdmarx != NULL) + { + /* Set the I2C DMA transfer complete callback */ + hi2c->hdmarx->XferCpltCallback = I2C_DMASlaveReceiveCplt; + + /* 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 channel */ + dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->RXDR, (uint32_t)pData, + 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 */ + hi2c->Instance->CR2 &= ~I2C_CR2_NACK; + + /* 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, STOP, NACK, ADDR interrupts */ + I2C_Enable_IRQ(hi2c, I2C_XFER_LISTEN_IT); + + /* Enable DMA Request */ + hi2c->Instance->CR1 |= I2C_CR1_RXDMAEN; + } + 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; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_ERROR; + } + + return HAL_OK; + } + 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) +{ + uint32_t tickstart; + + /* Check the parameters */ + assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); + + if (hi2c->State == HAL_I2C_STATE_READY) + { + if ((pData == NULL) || (Size == 0U)) + { + hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM; + return HAL_ERROR; + } + + /* Process Locked */ + __HAL_LOCK(hi2c); + + /* Init tickstart for timeout management*/ + tickstart = HAL_GetTick(); + + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY, tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + 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->XferISR = NULL; + + /* Send Slave Address and Memory Address */ + if (I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, Timeout, tickstart) != HAL_OK) + { + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + return HAL_ERROR; + } + + /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE */ + if (hi2c->XferCount > MAX_NBYTE_SIZE) + { + hi2c->XferSize = MAX_NBYTE_SIZE; + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, I2C_NO_STARTSTOP); + } + else + { + hi2c->XferSize = hi2c->XferCount; + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, I2C_NO_STARTSTOP); + } + + do + { + /* Wait until TXIS flag is set */ + if (I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + /* Write data to TXDR */ + hi2c->Instance->TXDR = *hi2c->pBuffPtr; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + hi2c->XferCount--; + hi2c->XferSize--; + + if ((hi2c->XferCount != 0U) && (hi2c->XferSize == 0U)) + { + /* Wait until TCR flag is set */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, Timeout, tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + if (hi2c->XferCount > MAX_NBYTE_SIZE) + { + hi2c->XferSize = MAX_NBYTE_SIZE; + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, + I2C_NO_STARTSTOP); + } + else + { + hi2c->XferSize = hi2c->XferCount; + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, + I2C_NO_STARTSTOP); + } + } + + } while (hi2c->XferCount > 0U); + + /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */ + /* Wait until STOPF flag is reset */ + if (I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + /* Clear STOP Flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF); + + /* Clear Configuration Register 2 */ + I2C_RESET_CR2(hi2c); + + 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) +{ + uint32_t tickstart; + + /* Check the parameters */ + assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); + + if (hi2c->State == HAL_I2C_STATE_READY) + { + if ((pData == NULL) || (Size == 0U)) + { + hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM; + return HAL_ERROR; + } + + /* Process Locked */ + __HAL_LOCK(hi2c); + + /* Init tickstart for timeout management*/ + tickstart = HAL_GetTick(); + + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY, tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + 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->XferISR = NULL; + + /* Send Slave Address and Memory Address */ + if (I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, Timeout, tickstart) != HAL_OK) + { + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + return HAL_ERROR; + } + + /* Send Slave Address */ + /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */ + if (hi2c->XferCount > MAX_NBYTE_SIZE) + { + hi2c->XferSize = MAX_NBYTE_SIZE; + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, + I2C_GENERATE_START_READ); + } + else + { + hi2c->XferSize = hi2c->XferCount; + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, + I2C_GENERATE_START_READ); + } + + do + { + /* Wait until RXNE flag is set */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_RXNE, RESET, Timeout, tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + /* Read data from RXDR */ + *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + hi2c->XferSize--; + hi2c->XferCount--; + + if ((hi2c->XferCount != 0U) && (hi2c->XferSize == 0U)) + { + /* Wait until TCR flag is set */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, Timeout, tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + if (hi2c->XferCount > MAX_NBYTE_SIZE) + { + hi2c->XferSize = MAX_NBYTE_SIZE; + I2C_TransferConfig(hi2c, DevAddress, (uint8_t) hi2c->XferSize, I2C_RELOAD_MODE, + I2C_NO_STARTSTOP); + } + else + { + hi2c->XferSize = hi2c->XferCount; + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, + I2C_NO_STARTSTOP); + } + } + } while (hi2c->XferCount > 0U); + + /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */ + /* Wait until STOPF flag is reset */ + if (I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + /* Clear STOP Flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF); + + /* Clear Configuration Register 2 */ + I2C_RESET_CR2(hi2c); + + 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) +{ + uint32_t tickstart; + uint32_t xfermode; + + /* Check the parameters */ + assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); + + if (hi2c->State == HAL_I2C_STATE_READY) + { + if ((pData == NULL) || (Size == 0U)) + { + hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM; + return HAL_ERROR; + } + + if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET) + { + return HAL_BUSY; + } + + /* Process Locked */ + __HAL_LOCK(hi2c); + + /* Init tickstart for timeout management*/ + tickstart = HAL_GetTick(); + + 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->XferOptions = I2C_NO_OPTION_FRAME; + hi2c->XferISR = I2C_Master_ISR_IT; + + if (hi2c->XferCount > MAX_NBYTE_SIZE) + { + hi2c->XferSize = MAX_NBYTE_SIZE; + xfermode = I2C_RELOAD_MODE; + } + else + { + hi2c->XferSize = hi2c->XferCount; + xfermode = I2C_AUTOEND_MODE; + } + + /* Send Slave Address and Memory Address */ + if (I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart) + != HAL_OK) + { + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + return HAL_ERROR; + } + + /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */ + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, I2C_NO_STARTSTOP); + + /* 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, TC, STOP, NACK, TXI interrupt */ + /* possible to enable all of these */ + /* I2C_IT_ERRI | I2C_IT_TCI | I2C_IT_STOPI | I2C_IT_NACKI | + I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */ + I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT); + + 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: 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_Read_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, + uint16_t MemAddSize, uint8_t *pData, uint16_t Size) +{ + uint32_t tickstart; + uint32_t xfermode; + + /* Check the parameters */ + assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); + + if (hi2c->State == HAL_I2C_STATE_READY) + { + if ((pData == NULL) || (Size == 0U)) + { + hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM; + return HAL_ERROR; + } + + if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET) + { + return HAL_BUSY; + } + + /* Process Locked */ + __HAL_LOCK(hi2c); + + /* Init tickstart for timeout management*/ + tickstart = HAL_GetTick(); + + 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->XferOptions = I2C_NO_OPTION_FRAME; + hi2c->XferISR = I2C_Master_ISR_IT; + + if (hi2c->XferCount > MAX_NBYTE_SIZE) + { + hi2c->XferSize = MAX_NBYTE_SIZE; + xfermode = I2C_RELOAD_MODE; + } + else + { + hi2c->XferSize = hi2c->XferCount; + xfermode = I2C_AUTOEND_MODE; + } + + /* Send Slave Address and Memory Address */ + if (I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart) != HAL_OK) + { + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + return HAL_ERROR; + } + + /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */ + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, I2C_GENERATE_START_READ); + + /* 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, TC, STOP, NACK, RXI interrupt */ + /* possible to enable all of these */ + /* I2C_IT_ERRI | I2C_IT_TCI | I2C_IT_STOPI | I2C_IT_NACKI | + I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */ + I2C_Enable_IRQ(hi2c, I2C_XFER_RX_IT); + + 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) +{ + uint32_t tickstart; + uint32_t xfermode; + HAL_StatusTypeDef dmaxferstatus; + + /* Check the parameters */ + assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); + + if (hi2c->State == HAL_I2C_STATE_READY) + { + if ((pData == NULL) || (Size == 0U)) + { + hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM; + return HAL_ERROR; + } + + if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET) + { + return HAL_BUSY; + } + + /* Process Locked */ + __HAL_LOCK(hi2c); + + /* Init tickstart for timeout management*/ + tickstart = HAL_GetTick(); + + 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->XferOptions = I2C_NO_OPTION_FRAME; + hi2c->XferISR = I2C_Master_ISR_DMA; + + if (hi2c->XferCount > MAX_NBYTE_SIZE) + { + hi2c->XferSize = MAX_NBYTE_SIZE; + xfermode = I2C_RELOAD_MODE; + } + else + { + hi2c->XferSize = hi2c->XferCount; + xfermode = I2C_AUTOEND_MODE; + } + + /* Send Slave Address and Memory Address */ + if (I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart) + != HAL_OK) + { + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + return HAL_ERROR; + } + + + if (hi2c->hdmatx != NULL) + { + /* Set the I2C DMA transfer complete callback */ + hi2c->hdmatx->XferCpltCallback = I2C_DMAMasterTransmitCplt; + + /* 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 channel */ + dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)pData, (uint32_t)&hi2c->Instance->TXDR, + 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 */ + /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */ + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, I2C_NO_STARTSTOP); + + /* Update XferCount value */ + hi2c->XferCount -= hi2c->XferSize; + + /* 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 and NACK interrupts */ + I2C_Enable_IRQ(hi2c, I2C_XFER_ERROR_IT); + + /* Enable DMA Request */ + hi2c->Instance->CR1 |= I2C_CR1_TXDMAEN; + } + 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; + } + + return HAL_OK; + } + 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) +{ + uint32_t tickstart; + uint32_t xfermode; + HAL_StatusTypeDef dmaxferstatus; + + /* Check the parameters */ + assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); + + if (hi2c->State == HAL_I2C_STATE_READY) + { + if ((pData == NULL) || (Size == 0U)) + { + hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM; + return HAL_ERROR; + } + + if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET) + { + return HAL_BUSY; + } + + /* Process Locked */ + __HAL_LOCK(hi2c); + + /* Init tickstart for timeout management*/ + tickstart = HAL_GetTick(); + + 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->XferOptions = I2C_NO_OPTION_FRAME; + hi2c->XferISR = I2C_Master_ISR_DMA; + + if (hi2c->XferCount > MAX_NBYTE_SIZE) + { + hi2c->XferSize = MAX_NBYTE_SIZE; + xfermode = I2C_RELOAD_MODE; + } + else + { + hi2c->XferSize = hi2c->XferCount; + xfermode = I2C_AUTOEND_MODE; + } + + /* Send Slave Address and Memory Address */ + if (I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart) != HAL_OK) + { + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + return HAL_ERROR; + } + + if (hi2c->hdmarx != NULL) + { + /* Set the I2C DMA transfer complete callback */ + hi2c->hdmarx->XferCpltCallback = I2C_DMAMasterReceiveCplt; + + /* 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 channel */ + dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->RXDR, (uint32_t)pData, + 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) + { + /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */ + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, I2C_GENERATE_START_READ); + + /* Update XferCount value */ + hi2c->XferCount -= hi2c->XferSize; + + /* 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 and NACK interrupts */ + I2C_Enable_IRQ(hi2c, I2C_XFER_ERROR_IT); + + /* Enable DMA Request */ + hi2c->Instance->CR1 |= I2C_CR1_RXDMAEN; + } + 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; + } + + 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) +{ + uint32_t tickstart; + + __IO uint32_t I2C_Trials = 0UL; + + FlagStatus tmp1; + FlagStatus tmp2; + + if (hi2c->State == HAL_I2C_STATE_READY) + { + if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET) + { + return HAL_BUSY; + } + + /* Process Locked */ + __HAL_LOCK(hi2c); + + hi2c->State = HAL_I2C_STATE_BUSY; + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + + do + { + /* Generate Start */ + hi2c->Instance->CR2 = I2C_GENERATE_START(hi2c->Init.AddressingMode, DevAddress); + + /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */ + /* Wait until STOPF flag is set or a NACK flag is set*/ + tickstart = HAL_GetTick(); + + tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF); + tmp2 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF); + + while ((tmp1 == RESET) && (tmp2 == RESET)) + { + if (Timeout != HAL_MAX_DELAY) + { + if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U)) + { + /* Update I2C state */ + hi2c->State = HAL_I2C_STATE_READY; + + /* Update I2C error code */ + hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_ERROR; + } + } + + tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF); + tmp2 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF); + } + + /* Check if the NACKF flag has not been set */ + if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == RESET) + { + /* Wait until STOPF flag is reset */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_STOPF, RESET, Timeout, tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + /* Clear STOP Flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF); + + /* Device is ready */ + hi2c->State = HAL_I2C_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_OK; + } + else + { + /* Wait until STOPF flag is reset */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_STOPF, RESET, Timeout, tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + /* Clear NACK Flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); + + /* Clear STOP Flag, auto generated with autoend*/ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF); + } + + /* Check if the maximum allowed number of trials has been reached */ + if (I2C_Trials == Trials) + { + /* Generate Stop */ + hi2c->Instance->CR2 |= I2C_CR2_STOP; + + /* Wait until STOPF flag is reset */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_STOPF, RESET, Timeout, tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + /* Clear STOP Flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF); + } + + /* Increment Trials */ + I2C_Trials++; + } while (I2C_Trials < Trials); + + /* Update I2C state */ + hi2c->State = HAL_I2C_STATE_READY; + + /* Update I2C error code */ + hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; + + /* 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 + * @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) +{ + uint32_t xfermode; + uint32_t xferrequest = I2C_GENERATE_START_WRITE; + + /* Check the parameters */ + assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); + + if (hi2c->State == HAL_I2C_STATE_READY) + { + /* Process Locked */ + __HAL_LOCK(hi2c); + + 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->XferOptions = XferOptions; + hi2c->XferISR = I2C_Master_ISR_IT; + + /* If hi2c->XferCount > MAX_NBYTE_SIZE, use reload mode */ + if (hi2c->XferCount > MAX_NBYTE_SIZE) + { + hi2c->XferSize = MAX_NBYTE_SIZE; + xfermode = I2C_RELOAD_MODE; + } + else + { + hi2c->XferSize = hi2c->XferCount; + xfermode = hi2c->XferOptions; + } + + /* 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 ((hi2c->PreviousState == I2C_STATE_MASTER_BUSY_TX) && \ + (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 0)) + { + xferrequest = I2C_NO_STARTSTOP; + } + else + { + /* Convert OTHER_xxx XferOptions if any */ + I2C_ConvertOtherXferOptions(hi2c); + + /* Update xfermode accordingly if no reload is necessary */ + if (hi2c->XferCount <= MAX_NBYTE_SIZE) + { + xfermode = hi2c->XferOptions; + } + } + + /* Send Slave Address and set NBYTES to write */ + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, xferrequest); + + /* 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 */ + I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT); + + 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 + * @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) +{ + uint32_t xfermode; + uint32_t xferrequest = I2C_GENERATE_START_WRITE; + HAL_StatusTypeDef dmaxferstatus; + + /* Check the parameters */ + assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); + + if (hi2c->State == HAL_I2C_STATE_READY) + { + /* Process Locked */ + __HAL_LOCK(hi2c); + + 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->XferOptions = XferOptions; + hi2c->XferISR = I2C_Master_ISR_DMA; + + /* If hi2c->XferCount > MAX_NBYTE_SIZE, use reload mode */ + if (hi2c->XferCount > MAX_NBYTE_SIZE) + { + hi2c->XferSize = MAX_NBYTE_SIZE; + xfermode = I2C_RELOAD_MODE; + } + else + { + hi2c->XferSize = hi2c->XferCount; + xfermode = hi2c->XferOptions; + } + + /* 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 ((hi2c->PreviousState == I2C_STATE_MASTER_BUSY_TX) && \ + (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 0)) + { + xferrequest = I2C_NO_STARTSTOP; + } + else + { + /* Convert OTHER_xxx XferOptions if any */ + I2C_ConvertOtherXferOptions(hi2c); + + /* Update xfermode accordingly if no reload is necessary */ + if (hi2c->XferCount <= MAX_NBYTE_SIZE) + { + xfermode = hi2c->XferOptions; + } + } + + if (hi2c->XferSize > 0U) + { + if (hi2c->hdmatx != NULL) + { + /* Set the I2C DMA transfer complete callback */ + hi2c->hdmatx->XferCpltCallback = I2C_DMAMasterTransmitCplt; + + /* 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 channel */ + dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)pData, (uint32_t)&hi2c->Instance->TXDR, + 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 set NBYTES to write */ + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, xferrequest); + + /* Update XferCount value */ + hi2c->XferCount -= hi2c->XferSize; + + /* 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 and NACK interrupts */ + I2C_Enable_IRQ(hi2c, I2C_XFER_ERROR_IT); + + /* Enable DMA Request */ + hi2c->Instance->CR1 |= I2C_CR1_TXDMAEN; + } + 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 Transfer ISR function pointer */ + hi2c->XferISR = I2C_Master_ISR_IT; + + /* Send Slave Address */ + /* Set NBYTES to write and generate START condition */ + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, + I2C_GENERATE_START_WRITE); + + /* 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, TC, STOP, NACK, TXI interrupt */ + /* possible to enable all of these */ + /* I2C_IT_ERRI | I2C_IT_TCI | I2C_IT_STOPI | I2C_IT_NACKI | + I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */ + I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT); + } + + 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 + * @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) +{ + uint32_t xfermode; + uint32_t xferrequest = I2C_GENERATE_START_READ; + + /* Check the parameters */ + assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); + + if (hi2c->State == HAL_I2C_STATE_READY) + { + /* Process Locked */ + __HAL_LOCK(hi2c); + + 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->XferOptions = XferOptions; + hi2c->XferISR = I2C_Master_ISR_IT; + + /* If hi2c->XferCount > MAX_NBYTE_SIZE, use reload mode */ + if (hi2c->XferCount > MAX_NBYTE_SIZE) + { + hi2c->XferSize = MAX_NBYTE_SIZE; + xfermode = I2C_RELOAD_MODE; + } + else + { + hi2c->XferSize = hi2c->XferCount; + xfermode = hi2c->XferOptions; + } + + /* 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 ((hi2c->PreviousState == I2C_STATE_MASTER_BUSY_RX) && \ + (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 0)) + { + xferrequest = I2C_NO_STARTSTOP; + } + else + { + /* Convert OTHER_xxx XferOptions if any */ + I2C_ConvertOtherXferOptions(hi2c); + + /* Update xfermode accordingly if no reload is necessary */ + if (hi2c->XferCount <= MAX_NBYTE_SIZE) + { + xfermode = hi2c->XferOptions; + } + } + + /* Send Slave Address and set NBYTES to read */ + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, xferrequest); + + /* 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 */ + I2C_Enable_IRQ(hi2c, I2C_XFER_RX_IT); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Sequential receive 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 + * @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) +{ + uint32_t xfermode; + uint32_t xferrequest = I2C_GENERATE_START_READ; + HAL_StatusTypeDef dmaxferstatus; + + /* Check the parameters */ + assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); + + if (hi2c->State == HAL_I2C_STATE_READY) + { + /* Process Locked */ + __HAL_LOCK(hi2c); + + 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->XferOptions = XferOptions; + hi2c->XferISR = I2C_Master_ISR_DMA; + + /* If hi2c->XferCount > MAX_NBYTE_SIZE, use reload mode */ + if (hi2c->XferCount > MAX_NBYTE_SIZE) + { + hi2c->XferSize = MAX_NBYTE_SIZE; + xfermode = I2C_RELOAD_MODE; + } + else + { + hi2c->XferSize = hi2c->XferCount; + xfermode = hi2c->XferOptions; + } + + /* 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 ((hi2c->PreviousState == I2C_STATE_MASTER_BUSY_RX) && \ + (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 0)) + { + xferrequest = I2C_NO_STARTSTOP; + } + else + { + /* Convert OTHER_xxx XferOptions if any */ + I2C_ConvertOtherXferOptions(hi2c); + + /* Update xfermode accordingly if no reload is necessary */ + if (hi2c->XferCount <= MAX_NBYTE_SIZE) + { + xfermode = hi2c->XferOptions; + } + } + + if (hi2c->XferSize > 0U) + { + if (hi2c->hdmarx != NULL) + { + /* Set the I2C DMA transfer complete callback */ + hi2c->hdmarx->XferCpltCallback = I2C_DMAMasterReceiveCplt; + + /* 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 channel */ + dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->RXDR, (uint32_t)pData, + 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 set NBYTES to read */ + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, xferrequest); + + /* Update XferCount value */ + hi2c->XferCount -= hi2c->XferSize; + + /* 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 and NACK interrupts */ + I2C_Enable_IRQ(hi2c, I2C_XFER_ERROR_IT); + + /* Enable DMA Request */ + hi2c->Instance->CR1 |= I2C_CR1_RXDMAEN; + } + 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 Transfer ISR function pointer */ + hi2c->XferISR = I2C_Master_ISR_IT; + + /* Send Slave Address */ + /* Set NBYTES to read and generate START condition */ + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, + I2C_GENERATE_START_READ); + + /* 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, TC, STOP, NACK, TXI interrupt */ + /* possible to enable all of these */ + /* I2C_IT_ERRI | I2C_IT_TCI | I2C_IT_STOPI | I2C_IT_NACKI | + I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */ + I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT); + } + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Sequential transmit in slave/device 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 pData Pointer to data buffer + * @param Size Amount of data to be sent + * @param XferOptions Options of Transfer, value of @ref I2C_XFEROPTIONS + * @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)) + { + hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM; + return HAL_ERROR; + } + + /* Disable Interrupts, to prevent preemption during treatment in case of multicall */ + I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT | I2C_XFER_TX_IT); + + /* Process Locked */ + __HAL_LOCK(hi2c); + + /* 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) + { + /* Disable associated Interrupts */ + I2C_Disable_IRQ(hi2c, I2C_XFER_RX_IT); + + /* Abort DMA Xfer if any */ + if ((hi2c->Instance->CR1 & I2C_CR1_RXDMAEN) == I2C_CR1_RXDMAEN) + { + hi2c->Instance->CR1 &= ~I2C_CR1_RXDMAEN; + + if (hi2c->hdmarx != NULL) + { + /* 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); + } + } + } + } + + hi2c->State = HAL_I2C_STATE_BUSY_TX_LISTEN; + hi2c->Mode = HAL_I2C_MODE_SLAVE; + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + + /* Enable Address Acknowledge */ + hi2c->Instance->CR2 &= ~I2C_CR2_NACK; + + /* Prepare transfer parameters */ + hi2c->pBuffPtr = pData; + hi2c->XferCount = Size; + hi2c->XferSize = hi2c->XferCount; + hi2c->XferOptions = XferOptions; + hi2c->XferISR = I2C_Slave_ISR_IT; + + if (I2C_GET_DIR(hi2c) == I2C_DIRECTION_RECEIVE) + { + /* Clear ADDR flag after prepare the transfer parameters */ + /* This action will generate an acknowledge to the Master */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR); + } + + /* 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 */ + /* REnable ADDR interrupt */ + I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT | I2C_XFER_LISTEN_IT); + + return HAL_OK; + } + else + { + return HAL_ERROR; + } +} + +/** + * @brief Sequential transmit in slave/device 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 pData Pointer to data buffer + * @param Size Amount of data to be sent + * @param XferOptions Options of Transfer, value of @ref I2C_XFEROPTIONS + * @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)) + { + hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM; + return HAL_ERROR; + } + + /* Process Locked */ + __HAL_LOCK(hi2c); + + /* Disable Interrupts, to prevent preemption during treatment in case of multicall */ + I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT | I2C_XFER_TX_IT); + + /* 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) + { + /* Disable associated Interrupts */ + I2C_Disable_IRQ(hi2c, I2C_XFER_RX_IT); + + if ((hi2c->Instance->CR1 & I2C_CR1_RXDMAEN) == I2C_CR1_RXDMAEN) + { + /* Abort DMA Xfer if any */ + if (hi2c->hdmarx != NULL) + { + hi2c->Instance->CR1 &= ~I2C_CR1_RXDMAEN; + + /* 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->CR1 & I2C_CR1_TXDMAEN) == I2C_CR1_TXDMAEN) + { + hi2c->Instance->CR1 &= ~I2C_CR1_TXDMAEN; + + /* 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 */ + } + + hi2c->State = HAL_I2C_STATE_BUSY_TX_LISTEN; + hi2c->Mode = HAL_I2C_MODE_SLAVE; + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + + /* Enable Address Acknowledge */ + hi2c->Instance->CR2 &= ~I2C_CR2_NACK; + + /* Prepare transfer parameters */ + hi2c->pBuffPtr = pData; + hi2c->XferCount = Size; + hi2c->XferSize = hi2c->XferCount; + hi2c->XferOptions = XferOptions; + hi2c->XferISR = I2C_Slave_ISR_DMA; + + if (hi2c->hdmatx != NULL) + { + /* Set the I2C DMA transfer complete callback */ + hi2c->hdmatx->XferCpltCallback = I2C_DMASlaveTransmitCplt; + + /* 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 channel */ + dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)pData, (uint32_t)&hi2c->Instance->TXDR, + 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) + { + /* Update XferCount value */ + hi2c->XferCount -= hi2c->XferSize; + + /* Reset XferSize */ + hi2c->XferSize = 0; + } + 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; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_ERROR; + } + + if (I2C_GET_DIR(hi2c) == I2C_DIRECTION_RECEIVE) + { + /* Clear ADDR flag after prepare the transfer parameters */ + /* This action will generate an acknowledge to the Master */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR); + } + + /* 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, STOP, NACK, ADDR interrupts */ + I2C_Enable_IRQ(hi2c, I2C_XFER_LISTEN_IT); + + /* Enable DMA Request */ + hi2c->Instance->CR1 |= I2C_CR1_TXDMAEN; + + return HAL_OK; + } + else + { + return HAL_ERROR; + } +} + +/** + * @brief Sequential receive in slave/device 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 pData Pointer to data buffer + * @param Size Amount of data to be sent + * @param XferOptions Options of Transfer, value of @ref I2C_XFEROPTIONS + * @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)) + { + hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM; + return HAL_ERROR; + } + + /* Disable Interrupts, to prevent preemption during treatment in case of multicall */ + I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT | I2C_XFER_RX_IT); + + /* Process Locked */ + __HAL_LOCK(hi2c); + + /* I2C cannot manage full duplex exchange so disable previous IT enabled if any */ + /* and then toggle the HAL slave TX state to RX state */ + if (hi2c->State == HAL_I2C_STATE_BUSY_TX_LISTEN) + { + /* Disable associated Interrupts */ + I2C_Disable_IRQ(hi2c, I2C_XFER_TX_IT); + + if ((hi2c->Instance->CR1 & I2C_CR1_TXDMAEN) == I2C_CR1_TXDMAEN) + { + hi2c->Instance->CR1 &= ~I2C_CR1_TXDMAEN; + + /* 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); + } + } + } + } + + hi2c->State = HAL_I2C_STATE_BUSY_RX_LISTEN; + hi2c->Mode = HAL_I2C_MODE_SLAVE; + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + + /* Enable Address Acknowledge */ + hi2c->Instance->CR2 &= ~I2C_CR2_NACK; + + /* Prepare transfer parameters */ + hi2c->pBuffPtr = pData; + hi2c->XferCount = Size; + hi2c->XferSize = hi2c->XferCount; + hi2c->XferOptions = XferOptions; + hi2c->XferISR = I2C_Slave_ISR_IT; + + if (I2C_GET_DIR(hi2c) == I2C_DIRECTION_TRANSMIT) + { + /* Clear ADDR flag after prepare the transfer parameters */ + /* This action will generate an acknowledge to the Master */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR); + } + + /* 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 */ + /* REnable ADDR interrupt */ + I2C_Enable_IRQ(hi2c, I2C_XFER_RX_IT | I2C_XFER_LISTEN_IT); + + return HAL_OK; + } + else + { + return HAL_ERROR; + } +} + +/** + * @brief Sequential receive in slave/device 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 pData Pointer to data buffer + * @param Size Amount of data to be sent + * @param XferOptions Options of Transfer, value of @ref I2C_XFEROPTIONS + * @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)) + { + hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM; + return HAL_ERROR; + } + + /* Disable Interrupts, to prevent preemption during treatment in case of multicall */ + I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT | I2C_XFER_RX_IT); + + /* Process Locked */ + __HAL_LOCK(hi2c); + + /* I2C cannot manage full duplex exchange so disable previous IT enabled if any */ + /* and then toggle the HAL slave TX state to RX state */ + if (hi2c->State == HAL_I2C_STATE_BUSY_TX_LISTEN) + { + /* Disable associated Interrupts */ + I2C_Disable_IRQ(hi2c, I2C_XFER_TX_IT); + + if ((hi2c->Instance->CR1 & I2C_CR1_TXDMAEN) == I2C_CR1_TXDMAEN) + { + /* Abort DMA Xfer if any */ + if (hi2c->hdmatx != NULL) + { + hi2c->Instance->CR1 &= ~I2C_CR1_TXDMAEN; + + /* 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 if (hi2c->State == HAL_I2C_STATE_BUSY_RX_LISTEN) + { + if ((hi2c->Instance->CR1 & I2C_CR1_RXDMAEN) == I2C_CR1_RXDMAEN) + { + hi2c->Instance->CR1 &= ~I2C_CR1_RXDMAEN; + + /* Abort DMA Xfer if any */ + if (hi2c->hdmarx != NULL) + { + /* 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 + { + /* Nothing to do */ + } + + hi2c->State = HAL_I2C_STATE_BUSY_RX_LISTEN; + hi2c->Mode = HAL_I2C_MODE_SLAVE; + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + + /* Enable Address Acknowledge */ + hi2c->Instance->CR2 &= ~I2C_CR2_NACK; + + /* Prepare transfer parameters */ + hi2c->pBuffPtr = pData; + hi2c->XferCount = Size; + hi2c->XferSize = hi2c->XferCount; + hi2c->XferOptions = XferOptions; + hi2c->XferISR = I2C_Slave_ISR_DMA; + + if (hi2c->hdmarx != NULL) + { + /* Set the I2C DMA transfer complete callback */ + hi2c->hdmarx->XferCpltCallback = I2C_DMASlaveReceiveCplt; + + /* 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 channel */ + dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->RXDR, + (uint32_t)pData, 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) + { + /* Update XferCount value */ + hi2c->XferCount -= hi2c->XferSize; + + /* Reset XferSize */ + hi2c->XferSize = 0; + } + 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; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_ERROR; + } + + if (I2C_GET_DIR(hi2c) == I2C_DIRECTION_TRANSMIT) + { + /* Clear ADDR flag after prepare the transfer parameters */ + /* This action will generate an acknowledge to the Master */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR); + } + + /* 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 */ + /* REnable ADDR interrupt */ + I2C_Enable_IRQ(hi2c, I2C_XFER_RX_IT | I2C_XFER_LISTEN_IT); + + /* Enable DMA Request */ + hi2c->Instance->CR1 |= I2C_CR1_RXDMAEN; + + return HAL_OK; + } + else + { + return HAL_ERROR; + } +} + +/** + * @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; + hi2c->XferISR = I2C_Slave_ISR_IT; + + /* Enable the Address Match interrupt */ + I2C_Enable_IRQ(hi2c, I2C_XFER_LISTEN_IT); + + 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; + hi2c->XferISR = NULL; + + /* Disable the Address Match interrupt */ + I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Abort a master 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) +{ + if (hi2c->Mode == HAL_I2C_MODE_MASTER) + { + /* Process Locked */ + __HAL_LOCK(hi2c); + + /* Disable Interrupts and Store Previous state */ + if (hi2c->State == HAL_I2C_STATE_BUSY_TX) + { + I2C_Disable_IRQ(hi2c, I2C_XFER_TX_IT); + hi2c->PreviousState = I2C_STATE_MASTER_BUSY_TX; + } + else if (hi2c->State == HAL_I2C_STATE_BUSY_RX) + { + I2C_Disable_IRQ(hi2c, I2C_XFER_RX_IT); + hi2c->PreviousState = I2C_STATE_MASTER_BUSY_RX; + } + else + { + /* Do nothing */ + } + + /* Set State at HAL_I2C_STATE_ABORT */ + hi2c->State = HAL_I2C_STATE_ABORT; + + /* Set NBYTES to 1 to generate a dummy read on I2C peripheral */ + /* Set AUTOEND mode, this will generate a NACK then STOP condition to abort the current transfer */ + I2C_TransferConfig(hi2c, DevAddress, 1, I2C_AUTOEND_MODE, I2C_GENERATE_STOP); + + /* 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 */ + I2C_Enable_IRQ(hi2c, I2C_XFER_CPLT_IT); + + return HAL_OK; + } + else + { + /* Wrong usage of abort function */ + /* This function should be used only in case of abort monitored by master device */ + 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) +{ + /* Get current IT Flags and IT sources value */ + uint32_t itflags = READ_REG(hi2c->Instance->ISR); + uint32_t itsources = READ_REG(hi2c->Instance->CR1); + + /* I2C events treatment -------------------------------------*/ + if (hi2c->XferISR != NULL) + { + hi2c->XferISR(hi2c, itflags, itsources); + } +} + +/** + * @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) +{ + uint32_t itflags = READ_REG(hi2c->Instance->ISR); + uint32_t itsources = READ_REG(hi2c->Instance->CR1); + uint32_t tmperror; + + /* I2C Bus error interrupt occurred ------------------------------------*/ + if ((I2C_CHECK_FLAG(itflags, I2C_FLAG_BERR) != RESET) && \ + (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERRI) != RESET)) + { + hi2c->ErrorCode |= HAL_I2C_ERROR_BERR; + + /* Clear BERR flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_BERR); + } + + /* I2C Over-Run/Under-Run interrupt occurred ----------------------------------------*/ + if ((I2C_CHECK_FLAG(itflags, I2C_FLAG_OVR) != RESET) && \ + (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERRI) != RESET)) + { + hi2c->ErrorCode |= HAL_I2C_ERROR_OVR; + + /* Clear OVR flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_OVR); + } + + /* I2C Arbitration Loss error interrupt occurred -------------------------------------*/ + if ((I2C_CHECK_FLAG(itflags, I2C_FLAG_ARLO) != RESET) && \ + (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERRI) != RESET)) + { + hi2c->ErrorCode |= HAL_I2C_ERROR_ARLO; + + /* Clear ARLO flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ARLO); + } + + /* Store current volatile hi2c->ErrorCode, misra rule */ + tmperror = hi2c->ErrorCode; + + /* Call the Error Callback in case of Error detected */ + if ((tmperror & (HAL_I2C_ERROR_BERR | HAL_I2C_ERROR_OVR | HAL_I2C_ERROR_ARLO)) != HAL_I2C_ERROR_NONE) + { + I2C_ITError(hi2c, tmperror); + } +} + +/** + * @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 + * @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 Interrupt Sub-Routine which handle the Interrupt Flags Master Mode with Interrupt. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @param ITFlags Interrupt flags to handle. + * @param ITSources Interrupt sources enabled. + * @retval HAL status + */ +static HAL_StatusTypeDef I2C_Master_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, + uint32_t ITSources) +{ + uint16_t devaddress; + uint32_t tmpITFlags = ITFlags; + + /* Process Locked */ + __HAL_LOCK(hi2c); + + if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_AF) != RESET) && \ + (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET)) + { + /* Clear NACK Flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); + + /* Set corresponding Error Code */ + /* No need to generate STOP, it is automatically done */ + /* Error callback will be send during stop flag treatment */ + hi2c->ErrorCode |= HAL_I2C_ERROR_AF; + + /* Flush TX register */ + I2C_Flush_TXDR(hi2c); + } + else if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_RXNE) != RESET) && \ + (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_RXI) != RESET)) + { + /* Remove RXNE flag on temporary variable as read done */ + tmpITFlags &= ~I2C_FLAG_RXNE; + + /* Read data from RXDR */ + *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + hi2c->XferSize--; + hi2c->XferCount--; + } + else if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_TXIS) != RESET) && \ + (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TXI) != RESET)) + { + /* Write data to TXDR */ + hi2c->Instance->TXDR = *hi2c->pBuffPtr; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + hi2c->XferSize--; + hi2c->XferCount--; + } + else if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_TCR) != RESET) && \ + (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TCI) != RESET)) + { + if ((hi2c->XferCount != 0U) && (hi2c->XferSize == 0U)) + { + devaddress = (uint16_t)(hi2c->Instance->CR2 & I2C_CR2_SADD); + + if (hi2c->XferCount > MAX_NBYTE_SIZE) + { + hi2c->XferSize = MAX_NBYTE_SIZE; + I2C_TransferConfig(hi2c, devaddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, I2C_NO_STARTSTOP); + } + else + { + hi2c->XferSize = hi2c->XferCount; + if (hi2c->XferOptions != I2C_NO_OPTION_FRAME) + { + I2C_TransferConfig(hi2c, devaddress, (uint8_t)hi2c->XferSize, + hi2c->XferOptions, I2C_NO_STARTSTOP); + } + else + { + I2C_TransferConfig(hi2c, devaddress, (uint8_t)hi2c->XferSize, + I2C_AUTOEND_MODE, I2C_NO_STARTSTOP); + } + } + } + else + { + /* Call TxCpltCallback() if no stop mode is set */ + if (I2C_GET_STOP_MODE(hi2c) != I2C_AUTOEND_MODE) + { + /* Call I2C Master Sequential complete process */ + I2C_ITMasterSeqCplt(hi2c); + } + else + { + /* Wrong size Status regarding TCR flag event */ + /* Call the corresponding callback to inform upper layer of End of Transfer */ + I2C_ITError(hi2c, HAL_I2C_ERROR_SIZE); + } + } + } + else if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_TC) != RESET) && \ + (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TCI) != RESET)) + { + if (hi2c->XferCount == 0U) + { + if (I2C_GET_STOP_MODE(hi2c) != I2C_AUTOEND_MODE) + { + /* Generate a stop condition in case of no transfer option */ + if (hi2c->XferOptions == I2C_NO_OPTION_FRAME) + { + /* Generate Stop */ + hi2c->Instance->CR2 |= I2C_CR2_STOP; + } + else + { + /* Call I2C Master Sequential complete process */ + I2C_ITMasterSeqCplt(hi2c); + } + } + } + else + { + /* Wrong size Status regarding TC flag event */ + /* Call the corresponding callback to inform upper layer of End of Transfer */ + I2C_ITError(hi2c, HAL_I2C_ERROR_SIZE); + } + } + else + { + /* Nothing to do */ + } + + if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_STOPF) != RESET) && \ + (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) + { + /* Call I2C Master complete process */ + I2C_ITMasterCplt(hi2c, tmpITFlags); + } + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_OK; +} + +/** + * @brief Interrupt Sub-Routine which handle the Interrupt Flags Slave Mode with Interrupt. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @param ITFlags Interrupt flags to handle. + * @param ITSources Interrupt sources enabled. + * @retval HAL status + */ +static HAL_StatusTypeDef I2C_Slave_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, + uint32_t ITSources) +{ + uint32_t tmpoptions = hi2c->XferOptions; + uint32_t tmpITFlags = ITFlags; + + /* Process locked */ + __HAL_LOCK(hi2c); + + /* Check if STOPF is set */ + if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_STOPF) != RESET) && \ + (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) + { + /* Call I2C Slave complete process */ + I2C_ITSlaveCplt(hi2c, tmpITFlags); + } + + if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_AF) != RESET) && \ + (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET)) + { + /* Check that I2C transfer finished */ + /* if yes, normal use case, a NACK is sent by the MASTER when Transfer is finished */ + /* Mean XferCount == 0*/ + /* So clear Flag NACKF only */ + if (hi2c->XferCount == 0U) + { + if ((hi2c->State == HAL_I2C_STATE_LISTEN) && (tmpoptions == I2C_FIRST_AND_LAST_FRAME)) + /* Same action must be done for (tmpoptions == I2C_LAST_FRAME) which removed for + Warning[Pa134]: left and right operands are identical */ + { + /* Call I2C Listen complete process */ + I2C_ITListenCplt(hi2c, tmpITFlags); + } + else if ((hi2c->State == HAL_I2C_STATE_BUSY_TX_LISTEN) && (tmpoptions != I2C_NO_OPTION_FRAME)) + { + /* Clear NACK Flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); + + /* Flush TX register */ + I2C_Flush_TXDR(hi2c); + + /* Last Byte is Transmitted */ + /* Call I2C Slave Sequential complete process */ + I2C_ITSlaveSeqCplt(hi2c); + } + else + { + /* Clear NACK Flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); + } + } + else + { + /* if no, error use case, a Non-Acknowledge of last Data is generated by the MASTER*/ + /* Clear NACK Flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); + + /* Set ErrorCode corresponding to a Non-Acknowledge */ + hi2c->ErrorCode |= HAL_I2C_ERROR_AF; + + if ((tmpoptions == I2C_FIRST_FRAME) || (tmpoptions == I2C_NEXT_FRAME)) + { + /* Call the corresponding callback to inform upper layer of End of Transfer */ + I2C_ITError(hi2c, hi2c->ErrorCode); + } + } + } + else if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_RXNE) != RESET) && \ + (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_RXI) != RESET)) + { + if (hi2c->XferCount > 0U) + { + /* Read data from RXDR */ + *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + hi2c->XferSize--; + hi2c->XferCount--; + } + + if ((hi2c->XferCount == 0U) && \ + (tmpoptions != I2C_NO_OPTION_FRAME)) + { + /* Call I2C Slave Sequential complete process */ + I2C_ITSlaveSeqCplt(hi2c); + } + } + else if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_ADDR) != RESET) && \ + (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_ADDRI) != RESET)) + { + I2C_ITAddrCplt(hi2c, tmpITFlags); + } + else if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_TXIS) != RESET) && \ + (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TXI) != RESET)) + { + /* Write data to TXDR only if XferCount not reach "0" */ + /* A TXIS flag can be set, during STOP treatment */ + /* Check if all Data have already been sent */ + /* If it is the case, this last write in TXDR is not sent, correspond to a dummy TXIS event */ + if (hi2c->XferCount > 0U) + { + /* Write data to TXDR */ + hi2c->Instance->TXDR = *hi2c->pBuffPtr; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + hi2c->XferCount--; + hi2c->XferSize--; + } + else + { + if ((tmpoptions == I2C_NEXT_FRAME) || (tmpoptions == I2C_FIRST_FRAME)) + { + /* Last Byte is Transmitted */ + /* Call I2C Slave Sequential complete process */ + I2C_ITSlaveSeqCplt(hi2c); + } + } + } + else + { + /* Nothing to do */ + } + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_OK; +} + +/** + * @brief Interrupt Sub-Routine which handle the Interrupt Flags Master Mode with DMA. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @param ITFlags Interrupt flags to handle. + * @param ITSources Interrupt sources enabled. + * @retval HAL status + */ +static HAL_StatusTypeDef I2C_Master_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, + uint32_t ITSources) +{ + uint16_t devaddress; + uint32_t xfermode; + + /* Process Locked */ + __HAL_LOCK(hi2c); + + if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_AF) != RESET) && \ + (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET)) + { + /* Clear NACK Flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); + + /* Set corresponding Error Code */ + hi2c->ErrorCode |= HAL_I2C_ERROR_AF; + + /* No need to generate STOP, it is automatically done */ + /* But enable STOP interrupt, to treat it */ + /* Error callback will be send during stop flag treatment */ + I2C_Enable_IRQ(hi2c, I2C_XFER_CPLT_IT); + + /* Flush TX register */ + I2C_Flush_TXDR(hi2c); + } + else if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_TCR) != RESET) && \ + (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TCI) != RESET)) + { + /* Disable TC interrupt */ + __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_TCI); + + if (hi2c->XferCount != 0U) + { + /* Recover Slave address */ + devaddress = (uint16_t)(hi2c->Instance->CR2 & I2C_CR2_SADD); + + /* Prepare the new XferSize to transfer */ + if (hi2c->XferCount > MAX_NBYTE_SIZE) + { + hi2c->XferSize = MAX_NBYTE_SIZE; + xfermode = I2C_RELOAD_MODE; + } + else + { + hi2c->XferSize = hi2c->XferCount; + if (hi2c->XferOptions != I2C_NO_OPTION_FRAME) + { + xfermode = hi2c->XferOptions; + } + else + { + xfermode = I2C_AUTOEND_MODE; + } + } + + /* Set the new XferSize in Nbytes register */ + I2C_TransferConfig(hi2c, devaddress, (uint8_t)hi2c->XferSize, xfermode, I2C_NO_STARTSTOP); + + /* Update XferCount value */ + hi2c->XferCount -= hi2c->XferSize; + + /* Enable DMA Request */ + if (hi2c->State == HAL_I2C_STATE_BUSY_RX) + { + hi2c->Instance->CR1 |= I2C_CR1_RXDMAEN; + } + else + { + hi2c->Instance->CR1 |= I2C_CR1_TXDMAEN; + } + } + else + { + /* Call TxCpltCallback() if no stop mode is set */ + if (I2C_GET_STOP_MODE(hi2c) != I2C_AUTOEND_MODE) + { + /* Call I2C Master Sequential complete process */ + I2C_ITMasterSeqCplt(hi2c); + } + else + { + /* Wrong size Status regarding TCR flag event */ + /* Call the corresponding callback to inform upper layer of End of Transfer */ + I2C_ITError(hi2c, HAL_I2C_ERROR_SIZE); + } + } + } + else if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_TC) != RESET) && \ + (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TCI) != RESET)) + { + if (hi2c->XferCount == 0U) + { + if (I2C_GET_STOP_MODE(hi2c) != I2C_AUTOEND_MODE) + { + /* Generate a stop condition in case of no transfer option */ + if (hi2c->XferOptions == I2C_NO_OPTION_FRAME) + { + /* Generate Stop */ + hi2c->Instance->CR2 |= I2C_CR2_STOP; + } + else + { + /* Call I2C Master Sequential complete process */ + I2C_ITMasterSeqCplt(hi2c); + } + } + } + else + { + /* Wrong size Status regarding TC flag event */ + /* Call the corresponding callback to inform upper layer of End of Transfer */ + I2C_ITError(hi2c, HAL_I2C_ERROR_SIZE); + } + } + else if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_STOPF) != RESET) && \ + (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) + { + /* Call I2C Master complete process */ + I2C_ITMasterCplt(hi2c, ITFlags); + } + else + { + /* Nothing to do */ + } + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_OK; +} + +/** + * @brief Interrupt Sub-Routine which handle the Interrupt Flags Slave Mode with DMA. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @param ITFlags Interrupt flags to handle. + * @param ITSources Interrupt sources enabled. + * @retval HAL status + */ +static HAL_StatusTypeDef I2C_Slave_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, + uint32_t ITSources) +{ + uint32_t tmpoptions = hi2c->XferOptions; + uint32_t treatdmanack = 0U; + HAL_I2C_StateTypeDef tmpstate; + + /* Process locked */ + __HAL_LOCK(hi2c); + + /* Check if STOPF is set */ + if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_STOPF) != RESET) && \ + (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) + { + /* Call I2C Slave complete process */ + I2C_ITSlaveCplt(hi2c, ITFlags); + } + + if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_AF) != RESET) && \ + (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET)) + { + /* Check that I2C transfer finished */ + /* if yes, normal use case, a NACK is sent by the MASTER when Transfer is finished */ + /* Mean XferCount == 0 */ + /* So clear Flag NACKF only */ + if ((I2C_CHECK_IT_SOURCE(ITSources, I2C_CR1_TXDMAEN) != RESET) || + (I2C_CHECK_IT_SOURCE(ITSources, I2C_CR1_RXDMAEN) != RESET)) + { + /* Split check of hdmarx, for MISRA compliance */ + if (hi2c->hdmarx != NULL) + { + if (I2C_CHECK_IT_SOURCE(ITSources, I2C_CR1_RXDMAEN) != RESET) + { + if (__HAL_DMA_GET_COUNTER(hi2c->hdmarx) == 0U) + { + treatdmanack = 1U; + } + } + } + + /* Split check of hdmatx, for MISRA compliance */ + if (hi2c->hdmatx != NULL) + { + if (I2C_CHECK_IT_SOURCE(ITSources, I2C_CR1_TXDMAEN) != RESET) + { + if (__HAL_DMA_GET_COUNTER(hi2c->hdmatx) == 0U) + { + treatdmanack = 1U; + } + } + } + + if (treatdmanack == 1U) + { + if ((hi2c->State == HAL_I2C_STATE_LISTEN) && (tmpoptions == I2C_FIRST_AND_LAST_FRAME)) + /* Same action must be done for (tmpoptions == I2C_LAST_FRAME) which removed for + Warning[Pa134]: left and right operands are identical */ + { + /* Call I2C Listen complete process */ + I2C_ITListenCplt(hi2c, ITFlags); + } + else if ((hi2c->State == HAL_I2C_STATE_BUSY_TX_LISTEN) && (tmpoptions != I2C_NO_OPTION_FRAME)) + { + /* Clear NACK Flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); + + /* Flush TX register */ + I2C_Flush_TXDR(hi2c); + + /* Last Byte is Transmitted */ + /* Call I2C Slave Sequential complete process */ + I2C_ITSlaveSeqCplt(hi2c); + } + else + { + /* Clear NACK Flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); + } + } + else + { + /* if no, error use case, a Non-Acknowledge of last Data is generated by the MASTER*/ + /* Clear NACK Flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); + + /* Set ErrorCode corresponding to a Non-Acknowledge */ + hi2c->ErrorCode |= HAL_I2C_ERROR_AF; + + /* Store current hi2c->State, solve MISRA2012-Rule-13.5 */ + tmpstate = hi2c->State; + + if ((tmpoptions == I2C_FIRST_FRAME) || (tmpoptions == I2C_NEXT_FRAME)) + { + if ((tmpstate == HAL_I2C_STATE_BUSY_TX) || (tmpstate == HAL_I2C_STATE_BUSY_TX_LISTEN)) + { + hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_TX; + } + else if ((tmpstate == HAL_I2C_STATE_BUSY_RX) || (tmpstate == HAL_I2C_STATE_BUSY_RX_LISTEN)) + { + hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_RX; + } + else + { + /* Do nothing */ + } + + /* Call the corresponding callback to inform upper layer of End of Transfer */ + I2C_ITError(hi2c, hi2c->ErrorCode); + } + } + } + else + { + /* Only Clear NACK Flag, no DMA treatment is pending */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); + } + } + else if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_ADDR) != RESET) && \ + (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_ADDRI) != RESET)) + { + I2C_ITAddrCplt(hi2c, ITFlags); + } + else + { + /* Nothing to do */ + } + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + 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 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 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) +{ + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)MemAddSize, I2C_RELOAD_MODE, I2C_GENERATE_START_WRITE); + + /* Wait until TXIS flag is set */ + if (I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + /* If Memory address size is 8Bit */ + if (MemAddSize == I2C_MEMADD_SIZE_8BIT) + { + /* Send Memory Address */ + hi2c->Instance->TXDR = I2C_MEM_ADD_LSB(MemAddress); + } + /* If Memory address size is 16Bit */ + else + { + /* Send MSB of Memory Address */ + hi2c->Instance->TXDR = I2C_MEM_ADD_MSB(MemAddress); + + /* Wait until TXIS flag is set */ + if (I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + /* Send LSB of Memory Address */ + hi2c->Instance->TXDR = I2C_MEM_ADD_LSB(MemAddress); + } + + /* Wait until TCR flag is set */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, Timeout, Tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + 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 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 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) +{ + I2C_TransferConfig(hi2c, DevAddress, (uint8_t)MemAddSize, I2C_SOFTEND_MODE, I2C_GENERATE_START_WRITE); + + /* Wait until TXIS flag is set */ + if (I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + /* If Memory address size is 8Bit */ + if (MemAddSize == I2C_MEMADD_SIZE_8BIT) + { + /* Send Memory Address */ + hi2c->Instance->TXDR = I2C_MEM_ADD_LSB(MemAddress); + } + /* If Memory address size is 16Bit */ + else + { + /* Send MSB of Memory Address */ + hi2c->Instance->TXDR = I2C_MEM_ADD_MSB(MemAddress); + + /* Wait until TXIS flag is set */ + if (I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + /* Send LSB of Memory Address */ + hi2c->Instance->TXDR = I2C_MEM_ADD_LSB(MemAddress); + } + + /* Wait until TC flag is set */ + if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TC, RESET, Timeout, Tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + return HAL_OK; +} + +/** + * @brief I2C Address complete process callback. + * @param hi2c I2C handle. + * @param ITFlags Interrupt flags to handle. + * @retval None + */ +static void I2C_ITAddrCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags) +{ + uint8_t transferdirection; + uint16_t slaveaddrcode; + uint16_t ownadd1code; + uint16_t ownadd2code; + + /* Prevent unused argument(s) compilation warning */ + UNUSED(ITFlags); + + /* In case of Listen state, need to inform upper layer of address match code event */ + if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN) + { + transferdirection = I2C_GET_DIR(hi2c); + slaveaddrcode = I2C_GET_ADDR_MATCH(hi2c); + ownadd1code = I2C_GET_OWN_ADDRESS1(hi2c); + ownadd2code = I2C_GET_OWN_ADDRESS2(hi2c); + + /* If 10bits addressing mode is selected */ + if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_10BIT) + { + if ((slaveaddrcode & SLAVE_ADDR_MSK) == ((ownadd1code >> SLAVE_ADDR_SHIFT) & SLAVE_ADDR_MSK)) + { + slaveaddrcode = ownadd1code; + hi2c->AddrEventCount++; + if (hi2c->AddrEventCount == 2U) + { + /* Reset Address Event counter */ + hi2c->AddrEventCount = 0U; + + /* Clear ADDR flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR); + + /* 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 + { + slaveaddrcode = ownadd2code; + + /* Disable ADDR Interrupts */ + I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT); + + /* 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 7 bits addressing mode is selected */ + else + { + /* Disable ADDR Interrupts */ + I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT); + + /* 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 address flag only */ + else + { + /* Clear ADDR flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR); + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + } +} + +/** + * @brief I2C Master sequential complete process. + * @param hi2c I2C handle. + * @retval None + */ +static void I2C_ITMasterSeqCplt(I2C_HandleTypeDef *hi2c) +{ + /* Reset I2C handle mode */ + hi2c->Mode = HAL_I2C_MODE_NONE; + + /* No Generate Stop, to permit restart mode */ + /* The stop will be done at the end of transfer, when I2C_AUTOEND_MODE enable */ + if (hi2c->State == HAL_I2C_STATE_BUSY_TX) + { + hi2c->State = HAL_I2C_STATE_READY; + hi2c->PreviousState = I2C_STATE_MASTER_BUSY_TX; + hi2c->XferISR = NULL; + + /* Disable Interrupts */ + I2C_Disable_IRQ(hi2c, I2C_XFER_TX_IT); + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + /* Call the corresponding callback to inform upper layer of End of Transfer */ +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) + hi2c->MasterTxCpltCallback(hi2c); +#else + HAL_I2C_MasterTxCpltCallback(hi2c); +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + } + /* hi2c->State == HAL_I2C_STATE_BUSY_RX */ + else + { + hi2c->State = HAL_I2C_STATE_READY; + hi2c->PreviousState = I2C_STATE_MASTER_BUSY_RX; + hi2c->XferISR = NULL; + + /* Disable Interrupts */ + I2C_Disable_IRQ(hi2c, I2C_XFER_RX_IT); + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + /* Call the corresponding callback to inform upper layer of End of Transfer */ +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) + hi2c->MasterRxCpltCallback(hi2c); +#else + HAL_I2C_MasterRxCpltCallback(hi2c); +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + } +} + +/** + * @brief I2C Slave sequential complete process. + * @param hi2c I2C handle. + * @retval None + */ +static void I2C_ITSlaveSeqCplt(I2C_HandleTypeDef *hi2c) +{ + uint32_t tmpcr1value = READ_REG(hi2c->Instance->CR1); + + /* Reset I2C handle mode */ + hi2c->Mode = HAL_I2C_MODE_NONE; + + /* If a DMA is ongoing, Update handle size context */ + if (I2C_CHECK_IT_SOURCE(tmpcr1value, I2C_CR1_TXDMAEN) != RESET) + { + /* Disable DMA Request */ + hi2c->Instance->CR1 &= ~I2C_CR1_TXDMAEN; + } + else if (I2C_CHECK_IT_SOURCE(tmpcr1value, I2C_CR1_RXDMAEN) != RESET) + { + /* Disable DMA Request */ + hi2c->Instance->CR1 &= ~I2C_CR1_RXDMAEN; + } + else + { + /* Do nothing */ + } + + if (hi2c->State == HAL_I2C_STATE_BUSY_TX_LISTEN) + { + /* Remove HAL_I2C_STATE_SLAVE_BUSY_TX, keep only HAL_I2C_STATE_LISTEN */ + hi2c->State = HAL_I2C_STATE_LISTEN; + hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_TX; + + /* Disable Interrupts */ + I2C_Disable_IRQ(hi2c, I2C_XFER_TX_IT); + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + /* 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 (hi2c->State == HAL_I2C_STATE_BUSY_RX_LISTEN) + { + /* Remove HAL_I2C_STATE_SLAVE_BUSY_RX, keep only HAL_I2C_STATE_LISTEN */ + hi2c->State = HAL_I2C_STATE_LISTEN; + hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_RX; + + /* Disable Interrupts */ + I2C_Disable_IRQ(hi2c, I2C_XFER_RX_IT); + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + /* 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 + { + /* Nothing to do */ + } +} + +/** + * @brief I2C Master complete process. + * @param hi2c I2C handle. + * @param ITFlags Interrupt flags to handle. + * @retval None + */ +static void I2C_ITMasterCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags) +{ + uint32_t tmperror; + uint32_t tmpITFlags = ITFlags; + __IO uint32_t tmpreg; + + /* Clear STOP Flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF); + + /* Disable Interrupts and Store Previous state */ + if (hi2c->State == HAL_I2C_STATE_BUSY_TX) + { + I2C_Disable_IRQ(hi2c, I2C_XFER_TX_IT); + hi2c->PreviousState = I2C_STATE_MASTER_BUSY_TX; + } + else if (hi2c->State == HAL_I2C_STATE_BUSY_RX) + { + I2C_Disable_IRQ(hi2c, I2C_XFER_RX_IT); + hi2c->PreviousState = I2C_STATE_MASTER_BUSY_RX; + } + else + { + /* Do nothing */ + } + + /* Clear Configuration Register 2 */ + I2C_RESET_CR2(hi2c); + + /* Reset handle parameters */ + hi2c->XferISR = NULL; + hi2c->XferOptions = I2C_NO_OPTION_FRAME; + + if (I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_AF) != RESET) + { + /* Clear NACK Flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); + + /* Set acknowledge error code */ + hi2c->ErrorCode |= HAL_I2C_ERROR_AF; + } + + /* Fetch Last receive data if any */ + if ((hi2c->State == HAL_I2C_STATE_ABORT) && (I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_RXNE) != RESET)) + { + /* Read data from RXDR */ + tmpreg = (uint8_t)hi2c->Instance->RXDR; + UNUSED(tmpreg); + } + + /* Flush TX register */ + I2C_Flush_TXDR(hi2c); + + /* Store current volatile hi2c->ErrorCode, misra rule */ + tmperror = hi2c->ErrorCode; + + /* Call the corresponding callback to inform upper layer of End of Transfer */ + if ((hi2c->State == HAL_I2C_STATE_ABORT) || (tmperror != HAL_I2C_ERROR_NONE)) + { + /* Call the corresponding callback to inform upper layer of End of Transfer */ + I2C_ITError(hi2c, hi2c->ErrorCode); + } + /* hi2c->State == HAL_I2C_STATE_BUSY_TX */ + else if (hi2c->State == HAL_I2C_STATE_BUSY_TX) + { + hi2c->State = HAL_I2C_STATE_READY; + hi2c->PreviousState = I2C_STATE_NONE; + + if (hi2c->Mode == HAL_I2C_MODE_MEM) + { + hi2c->Mode = HAL_I2C_MODE_NONE; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + /* Call the corresponding callback to inform upper layer of End of Transfer */ +#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; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + /* Call the corresponding callback to inform upper layer of End of Transfer */ +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) + hi2c->MasterTxCpltCallback(hi2c); +#else + HAL_I2C_MasterTxCpltCallback(hi2c); +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + } + } + /* hi2c->State == HAL_I2C_STATE_BUSY_RX */ + else if (hi2c->State == HAL_I2C_STATE_BUSY_RX) + { + hi2c->State = HAL_I2C_STATE_READY; + hi2c->PreviousState = I2C_STATE_NONE; + + if (hi2c->Mode == HAL_I2C_MODE_MEM) + { + hi2c->Mode = HAL_I2C_MODE_NONE; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + /* Call the corresponding callback to inform upper layer of End of Transfer */ +#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; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + /* Call the corresponding callback to inform upper layer of End of Transfer */ +#if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) + hi2c->MasterRxCpltCallback(hi2c); +#else + HAL_I2C_MasterRxCpltCallback(hi2c); +#endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + } + } + else + { + /* Nothing to do */ + } +} + +/** + * @brief I2C Slave complete process. + * @param hi2c I2C handle. + * @param ITFlags Interrupt flags to handle. + * @retval None + */ +static void I2C_ITSlaveCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags) +{ + uint32_t tmpcr1value = READ_REG(hi2c->Instance->CR1); + uint32_t tmpITFlags = ITFlags; + HAL_I2C_StateTypeDef tmpstate = hi2c->State; + + /* Clear STOP Flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF); + + /* Disable Interrupts and Store Previous state */ + if ((tmpstate == HAL_I2C_STATE_BUSY_TX) || (tmpstate == HAL_I2C_STATE_BUSY_TX_LISTEN)) + { + I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT | I2C_XFER_TX_IT); + hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_TX; + } + else if ((tmpstate == HAL_I2C_STATE_BUSY_RX) || (tmpstate == HAL_I2C_STATE_BUSY_RX_LISTEN)) + { + I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT | I2C_XFER_RX_IT); + hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_RX; + } + else + { + /* Do nothing */ + } + + /* Disable Address Acknowledge */ + hi2c->Instance->CR2 |= I2C_CR2_NACK; + + /* Clear Configuration Register 2 */ + I2C_RESET_CR2(hi2c); + + /* Flush TX register */ + I2C_Flush_TXDR(hi2c); + + /* If a DMA is ongoing, Update handle size context */ + if (I2C_CHECK_IT_SOURCE(tmpcr1value, I2C_CR1_TXDMAEN) != RESET) + { + /* Disable DMA Request */ + hi2c->Instance->CR1 &= ~I2C_CR1_TXDMAEN; + + if (hi2c->hdmatx != NULL) + { + hi2c->XferCount = (uint16_t)__HAL_DMA_GET_COUNTER(hi2c->hdmatx); + } + } + else if (I2C_CHECK_IT_SOURCE(tmpcr1value, I2C_CR1_RXDMAEN) != RESET) + { + /* Disable DMA Request */ + hi2c->Instance->CR1 &= ~I2C_CR1_RXDMAEN; + + if (hi2c->hdmarx != NULL) + { + hi2c->XferCount = (uint16_t)__HAL_DMA_GET_COUNTER(hi2c->hdmarx); + } + } + else + { + /* Do nothing */ + } + + /* Store Last receive data if any */ + if (I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_RXNE) != RESET) + { + /* Remove RXNE flag on temporary variable as read done */ + tmpITFlags &= ~I2C_FLAG_RXNE; + + /* Read data from RXDR */ + *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + if ((hi2c->XferSize > 0U)) + { + hi2c->XferSize--; + hi2c->XferCount--; + } + } + + /* All data are not transferred, so set error code accordingly */ + if (hi2c->XferCount != 0U) + { + /* Set ErrorCode corresponding to a Non-Acknowledge */ + hi2c->ErrorCode |= HAL_I2C_ERROR_AF; + } + + hi2c->Mode = HAL_I2C_MODE_NONE; + hi2c->XferISR = NULL; + + if (hi2c->ErrorCode != HAL_I2C_ERROR_NONE) + { + /* Call the corresponding callback to inform upper layer of End of Transfer */ + I2C_ITError(hi2c, hi2c->ErrorCode); + + /* Call the Listen Complete callback, to inform upper layer of the end of Listen usecase */ + if (hi2c->State == HAL_I2C_STATE_LISTEN) + { + /* Call I2C Listen complete process */ + I2C_ITListenCplt(hi2c, tmpITFlags); + } + } + else if (hi2c->XferOptions != I2C_NO_OPTION_FRAME) + { + /* Call the Sequential Complete callback, to inform upper layer of the end of Transfer */ + I2C_ITSlaveSeqCplt(hi2c); + + hi2c->XferOptions = I2C_NO_OPTION_FRAME; + hi2c->State = HAL_I2C_STATE_READY; + hi2c->PreviousState = I2C_STATE_NONE; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + /* 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 */ + } + /* Call the corresponding callback to inform upper layer of End of Transfer */ + else if (hi2c->State == HAL_I2C_STATE_BUSY_RX) + { + hi2c->State = HAL_I2C_STATE_READY; + hi2c->PreviousState = I2C_STATE_NONE; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + /* 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 + { + hi2c->State = HAL_I2C_STATE_READY; + hi2c->PreviousState = I2C_STATE_NONE; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + /* 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 I2C Listen complete process. + * @param hi2c I2C handle. + * @param ITFlags Interrupt flags to handle. + * @retval None + */ +static void I2C_ITListenCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags) +{ + /* Reset handle parameters */ + hi2c->XferOptions = I2C_NO_OPTION_FRAME; + hi2c->PreviousState = I2C_STATE_NONE; + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + hi2c->XferISR = NULL; + + /* Store Last receive data if any */ + if (I2C_CHECK_FLAG(ITFlags, I2C_FLAG_RXNE) != RESET) + { + /* Read data from RXDR */ + *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR; + + /* Increment Buffer pointer */ + hi2c->pBuffPtr++; + + if ((hi2c->XferSize > 0U)) + { + hi2c->XferSize--; + hi2c->XferCount--; + + /* Set ErrorCode corresponding to a Non-Acknowledge */ + hi2c->ErrorCode |= HAL_I2C_ERROR_AF; + } + } + + /* Disable all Interrupts*/ + I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT | I2C_XFER_RX_IT | I2C_XFER_TX_IT); + + /* Clear NACK Flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + /* 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 */ +} + +/** + * @brief I2C interrupts error process. + * @param hi2c I2C handle. + * @param ErrorCode Error code to handle. + * @retval None + */ +static void I2C_ITError(I2C_HandleTypeDef *hi2c, uint32_t ErrorCode) +{ + HAL_I2C_StateTypeDef tmpstate = hi2c->State; + uint32_t tmppreviousstate; + + /* Reset handle parameters */ + hi2c->Mode = HAL_I2C_MODE_NONE; + hi2c->XferOptions = I2C_NO_OPTION_FRAME; + hi2c->XferCount = 0U; + + /* Set new error code */ + hi2c->ErrorCode |= ErrorCode; + + /* Disable Interrupts */ + if ((tmpstate == HAL_I2C_STATE_LISTEN) || + (tmpstate == HAL_I2C_STATE_BUSY_TX_LISTEN) || + (tmpstate == HAL_I2C_STATE_BUSY_RX_LISTEN)) + { + /* Disable all interrupts, except interrupts related to LISTEN state */ + I2C_Disable_IRQ(hi2c, I2C_XFER_RX_IT | I2C_XFER_TX_IT); + + /* keep HAL_I2C_STATE_LISTEN if set */ + hi2c->State = HAL_I2C_STATE_LISTEN; + hi2c->XferISR = I2C_Slave_ISR_IT; + } + else + { + /* Disable all interrupts */ + I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT | I2C_XFER_RX_IT | I2C_XFER_TX_IT); + + /* If state is an abort treatment on going, don't change state */ + /* This change will be do later */ + if (hi2c->State != HAL_I2C_STATE_ABORT) + { + /* Set HAL_I2C_STATE_READY */ + hi2c->State = HAL_I2C_STATE_READY; + } + hi2c->XferISR = NULL; + } + + /* Abort DMA TX transfer if any */ + tmppreviousstate = hi2c->PreviousState; + if ((hi2c->hdmatx != NULL) && ((tmppreviousstate == I2C_STATE_MASTER_BUSY_TX) || \ + (tmppreviousstate == I2C_STATE_SLAVE_BUSY_TX))) + { + if ((hi2c->Instance->CR1 & I2C_CR1_TXDMAEN) == I2C_CR1_TXDMAEN) + { + hi2c->Instance->CR1 &= ~I2C_CR1_TXDMAEN; + } + + 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; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + /* 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 + { + I2C_TreatErrorCallback(hi2c); + } + } + /* Abort DMA RX transfer if any */ + else if ((hi2c->hdmarx != NULL) && ((tmppreviousstate == I2C_STATE_MASTER_BUSY_RX) || \ + (tmppreviousstate == I2C_STATE_SLAVE_BUSY_RX))) + { + if ((hi2c->Instance->CR1 & I2C_CR1_RXDMAEN) == I2C_CR1_RXDMAEN) + { + hi2c->Instance->CR1 &= ~I2C_CR1_RXDMAEN; + } + + 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; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + /* Abort DMA RX */ + if (HAL_DMA_Abort_IT(hi2c->hdmarx) != HAL_OK) + { + /* Call Directly hi2c->hdmarx->XferAbortCallback function in case of error */ + hi2c->hdmarx->XferAbortCallback(hi2c->hdmarx); + } + } + else + { + I2C_TreatErrorCallback(hi2c); + } + } + else + { + I2C_TreatErrorCallback(hi2c); + } +} + +/** + * @brief I2C Error callback treatment. + * @param hi2c I2C handle. + * @retval None + */ +static void I2C_TreatErrorCallback(I2C_HandleTypeDef *hi2c) +{ + if (hi2c->State == HAL_I2C_STATE_ABORT) + { + hi2c->State = HAL_I2C_STATE_READY; + hi2c->PreviousState = I2C_STATE_NONE; + + /* Process Unlocked */ + __HAL_UNLOCK(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 + { + hi2c->PreviousState = I2C_STATE_NONE; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + /* 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 I2C Tx data register flush process. + * @param hi2c I2C handle. + * @retval None + */ +static void I2C_Flush_TXDR(I2C_HandleTypeDef *hi2c) +{ + /* If a pending TXIS flag is set */ + /* Write a dummy data in TXDR to clear it */ + if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXIS) != RESET) + { + hi2c->Instance->TXDR = 0x00U; + } + + /* Flush TX register if not empty */ + if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXE) == RESET) + { + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_TXE); + } +} + +/** + * @brief DMA I2C master transmit process complete callback. + * @param hdma DMA handle + * @retval None + */ +static void I2C_DMAMasterTransmitCplt(DMA_HandleTypeDef *hdma) +{ + /* Derogation MISRAC2012-Rule-11.5 */ + I2C_HandleTypeDef *hi2c = (I2C_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); + + /* Disable DMA Request */ + hi2c->Instance->CR1 &= ~I2C_CR1_TXDMAEN; + + /* If last transfer, enable STOP interrupt */ + if (hi2c->XferCount == 0U) + { + /* Enable STOP interrupt */ + I2C_Enable_IRQ(hi2c, I2C_XFER_CPLT_IT); + } + /* else prepare a new DMA transfer and enable TCReload interrupt */ + else + { + /* Update Buffer pointer */ + hi2c->pBuffPtr += hi2c->XferSize; + + /* Set the XferSize to transfer */ + if (hi2c->XferCount > MAX_NBYTE_SIZE) + { + hi2c->XferSize = MAX_NBYTE_SIZE; + } + else + { + hi2c->XferSize = hi2c->XferCount; + } + + /* Enable the DMA channel */ + if (HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->TXDR, + hi2c->XferSize) != HAL_OK) + { + /* Call the corresponding callback to inform upper layer of End of Transfer */ + I2C_ITError(hi2c, HAL_I2C_ERROR_DMA); + } + else + { + /* Enable TC interrupts */ + I2C_Enable_IRQ(hi2c, I2C_XFER_RELOAD_IT); + } + } +} + +/** + * @brief DMA I2C slave transmit process complete callback. + * @param hdma DMA handle + * @retval None + */ +static void I2C_DMASlaveTransmitCplt(DMA_HandleTypeDef *hdma) +{ + /* Derogation MISRAC2012-Rule-11.5 */ + I2C_HandleTypeDef *hi2c = (I2C_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); + uint32_t tmpoptions = hi2c->XferOptions; + + if ((tmpoptions == I2C_NEXT_FRAME) || (tmpoptions == I2C_FIRST_FRAME)) + { + /* Disable DMA Request */ + hi2c->Instance->CR1 &= ~I2C_CR1_TXDMAEN; + + /* Last Byte is Transmitted */ + /* Call I2C Slave Sequential complete process */ + I2C_ITSlaveSeqCplt(hi2c); + } + else + { + /* No specific action, Master fully manage the generation of STOP condition */ + /* Mean that this generation can arrive at any time, at the end or during DMA process */ + /* So STOP condition should be manage through Interrupt treatment */ + } +} + +/** + * @brief DMA I2C master receive process complete callback. + * @param hdma DMA handle + * @retval None + */ +static void I2C_DMAMasterReceiveCplt(DMA_HandleTypeDef *hdma) +{ + /* Derogation MISRAC2012-Rule-11.5 */ + I2C_HandleTypeDef *hi2c = (I2C_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); + + /* Disable DMA Request */ + hi2c->Instance->CR1 &= ~I2C_CR1_RXDMAEN; + + /* If last transfer, enable STOP interrupt */ + if (hi2c->XferCount == 0U) + { + /* Enable STOP interrupt */ + I2C_Enable_IRQ(hi2c, I2C_XFER_CPLT_IT); + } + /* else prepare a new DMA transfer and enable TCReload interrupt */ + else + { + /* Update Buffer pointer */ + hi2c->pBuffPtr += hi2c->XferSize; + + /* Set the XferSize to transfer */ + if (hi2c->XferCount > MAX_NBYTE_SIZE) + { + hi2c->XferSize = MAX_NBYTE_SIZE; + } + else + { + hi2c->XferSize = hi2c->XferCount; + } + + /* Enable the DMA channel */ + if (HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->RXDR, (uint32_t)hi2c->pBuffPtr, + hi2c->XferSize) != HAL_OK) + { + /* Call the corresponding callback to inform upper layer of End of Transfer */ + I2C_ITError(hi2c, HAL_I2C_ERROR_DMA); + } + else + { + /* Enable TC interrupts */ + I2C_Enable_IRQ(hi2c, I2C_XFER_RELOAD_IT); + } + } +} + +/** + * @brief DMA I2C slave receive process complete callback. + * @param hdma DMA handle + * @retval None + */ +static void I2C_DMASlaveReceiveCplt(DMA_HandleTypeDef *hdma) +{ + /* Derogation MISRAC2012-Rule-11.5 */ + I2C_HandleTypeDef *hi2c = (I2C_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); + uint32_t tmpoptions = hi2c->XferOptions; + + if ((__HAL_DMA_GET_COUNTER(hi2c->hdmarx) == 0U) && \ + (tmpoptions != I2C_NO_OPTION_FRAME)) + { + /* Disable DMA Request */ + hi2c->Instance->CR1 &= ~I2C_CR1_RXDMAEN; + + /* Call I2C Slave Sequential complete process */ + I2C_ITSlaveSeqCplt(hi2c); + } + else + { + /* No specific action, Master fully manage the generation of STOP condition */ + /* Mean that this generation can arrive at any time, at the end or during DMA process */ + /* So STOP condition should be manage through Interrupt treatment */ + } +} + +/** + * @brief DMA I2C communication error callback. + * @param hdma DMA handle + * @retval None + */ +static void I2C_DMAError(DMA_HandleTypeDef *hdma) +{ + /* Derogation MISRAC2012-Rule-11.5 */ + I2C_HandleTypeDef *hi2c = (I2C_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); + + /* Disable Acknowledge */ + hi2c->Instance->CR2 |= I2C_CR2_NACK; + + /* Call the corresponding callback to inform upper layer of End of Transfer */ + I2C_ITError(hi2c, HAL_I2C_ERROR_DMA); +} + +/** + * @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) +{ + /* Derogation MISRAC2012-Rule-11.5 */ + I2C_HandleTypeDef *hi2c = (I2C_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); + + /* Reset AbortCpltCallback */ + if (hi2c->hdmatx != NULL) + { + hi2c->hdmatx->XferAbortCallback = NULL; + } + if (hi2c->hdmarx != NULL) + { + hi2c->hdmarx->XferAbortCallback = NULL; + } + + I2C_TreatErrorCallback(hi2c); +} + +/** + * @brief This function handles I2C Communication Timeout. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @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) +{ + while (__HAL_I2C_GET_FLAG(hi2c, Flag) == Status) + { + /* Check for the Timeout */ + if (Timeout != HAL_MAX_DELAY) + { + if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) + { + hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + return HAL_ERROR; + } + } + } + return HAL_OK; +} + +/** + * @brief This function handles I2C Communication Timeout for specific usage of TXIS 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_WaitOnTXISFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, + uint32_t Tickstart) +{ + while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXIS) == RESET) + { + /* Check if a NACK is detected */ + if (I2C_IsAcknowledgeFailed(hi2c, Timeout, Tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + /* Check for the Timeout */ + if (Timeout != HAL_MAX_DELAY) + { + if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) + { + hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + + /* 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, Timeout, Tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + /* Check for the Timeout */ + if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) + { + hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_ERROR; + } + } + 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 NACK is detected */ + if (I2C_IsAcknowledgeFailed(hi2c, Timeout, Tickstart) != HAL_OK) + { + return HAL_ERROR; + } + + /* Check if a STOPF is detected */ + if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == SET) + { + /* Check if an RXNE is pending */ + /* Store Last receive data if any */ + if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET) && (hi2c->XferSize > 0U)) + { + /* Return HAL_OK */ + /* The Reading of data from RXDR will be done in caller function */ + return HAL_OK; + } + else + { + /* Clear STOP Flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF); + + /* Clear Configuration Register 2 */ + I2C_RESET_CR2(hi2c); + + hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_ERROR; + } + } + + /* Check for the Timeout */ + if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) + { + hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; + hi2c->State = HAL_I2C_STATE_READY; + + /* 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. + * @param Timeout Timeout duration + * @param Tickstart Tick start value + * @retval HAL status + */ +static HAL_StatusTypeDef I2C_IsAcknowledgeFailed(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_t Tickstart) +{ + if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == SET) + { + /* In case of Soft End condition, generate the STOP condition */ + if (I2C_GET_STOP_MODE(hi2c) != I2C_AUTOEND_MODE) + { + /* Generate Stop */ + hi2c->Instance->CR2 |= I2C_CR2_STOP; + } + /* Wait until STOP Flag is reset */ + /* AutoEnd should be initiate after AF */ + while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == RESET) + { + /* Check for the Timeout */ + if (Timeout != HAL_MAX_DELAY) + { + if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) + { + hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_ERROR; + } + } + } + + /* Clear NACKF Flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); + + /* Clear STOP Flag */ + __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF); + + /* Flush TX register */ + I2C_Flush_TXDR(hi2c); + + /* Clear Configuration Register 2 */ + I2C_RESET_CR2(hi2c); + + hi2c->ErrorCode |= HAL_I2C_ERROR_AF; + hi2c->State = HAL_I2C_STATE_READY; + hi2c->Mode = HAL_I2C_MODE_NONE; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_ERROR; + } + return HAL_OK; +} + +/** + * @brief Handles I2Cx communication when starting transfer or during transfer (TC or TCR flag are set). + * @param hi2c I2C handle. + * @param DevAddress Specifies the slave address to be programmed. + * @param Size Specifies the number of bytes to be programmed. + * This parameter must be a value between 0 and 255. + * @param Mode New state of the I2C START condition generation. + * This parameter can be one of the following values: + * @arg @ref I2C_RELOAD_MODE Enable Reload mode . + * @arg @ref I2C_AUTOEND_MODE Enable Automatic end mode. + * @arg @ref I2C_SOFTEND_MODE Enable Software end mode. + * @param Request New state of the I2C START condition generation. + * This parameter can be one of the following values: + * @arg @ref I2C_NO_STARTSTOP Don't Generate stop and start condition. + * @arg @ref I2C_GENERATE_STOP Generate stop condition (Size should be set to 0). + * @arg @ref I2C_GENERATE_START_READ Generate Restart for read request. + * @arg @ref I2C_GENERATE_START_WRITE Generate Restart for write request. + * @retval None + */ +static void I2C_TransferConfig(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t Size, uint32_t Mode, + uint32_t Request) +{ + /* Check the parameters */ + assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance)); + assert_param(IS_TRANSFER_MODE(Mode)); + assert_param(IS_TRANSFER_REQUEST(Request)); + + /* update CR2 register */ + MODIFY_REG(hi2c->Instance->CR2, + ((I2C_CR2_SADD | I2C_CR2_NBYTES | I2C_CR2_RELOAD | I2C_CR2_AUTOEND | \ + (I2C_CR2_RD_WRN & (uint32_t)(Request >> (31U - I2C_CR2_RD_WRN_Pos))) | \ + I2C_CR2_START | I2C_CR2_STOP)), \ + (uint32_t)(((uint32_t)DevAddress & I2C_CR2_SADD) | \ + (((uint32_t)Size << I2C_CR2_NBYTES_Pos) & I2C_CR2_NBYTES) | \ + (uint32_t)Mode | (uint32_t)Request)); +} + +/** + * @brief Manage the enabling of Interrupts. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @param InterruptRequest Value of @ref I2C_Interrupt_configuration_definition. + * @retval None + */ +static void I2C_Enable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest) +{ + uint32_t tmpisr = 0U; + + if ((hi2c->XferISR == I2C_Master_ISR_DMA) || \ + (hi2c->XferISR == I2C_Slave_ISR_DMA)) + { + if ((InterruptRequest & I2C_XFER_LISTEN_IT) == I2C_XFER_LISTEN_IT) + { + /* Enable ERR, STOP, NACK and ADDR interrupts */ + tmpisr |= I2C_IT_ADDRI | I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_ERRI; + } + + if (InterruptRequest == I2C_XFER_ERROR_IT) + { + /* Enable ERR and NACK interrupts */ + tmpisr |= I2C_IT_ERRI | I2C_IT_NACKI; + } + + if (InterruptRequest == I2C_XFER_CPLT_IT) + { + /* Enable STOP interrupts */ + tmpisr |= (I2C_IT_STOPI | I2C_IT_TCI); + } + + if (InterruptRequest == I2C_XFER_RELOAD_IT) + { + /* Enable TC interrupts */ + tmpisr |= I2C_IT_TCI; + } + } + else + { + if ((InterruptRequest & I2C_XFER_LISTEN_IT) == I2C_XFER_LISTEN_IT) + { + /* Enable ERR, STOP, NACK, and ADDR interrupts */ + tmpisr |= I2C_IT_ADDRI | I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_ERRI; + } + + if ((InterruptRequest & I2C_XFER_TX_IT) == I2C_XFER_TX_IT) + { + /* Enable ERR, TC, STOP, NACK and RXI interrupts */ + tmpisr |= I2C_IT_ERRI | I2C_IT_TCI | I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_TXI; + } + + if ((InterruptRequest & I2C_XFER_RX_IT) == I2C_XFER_RX_IT) + { + /* Enable ERR, TC, STOP, NACK and TXI interrupts */ + tmpisr |= I2C_IT_ERRI | I2C_IT_TCI | I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_RXI; + } + + if (InterruptRequest == I2C_XFER_CPLT_IT) + { + /* Enable STOP interrupts */ + tmpisr |= I2C_IT_STOPI; + } + } + + /* Enable interrupts only at the end */ + /* to avoid the risk of I2C interrupt handle execution before */ + /* all interrupts requested done */ + __HAL_I2C_ENABLE_IT(hi2c, tmpisr); +} + +/** + * @brief Manage the disabling of Interrupts. + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2C. + * @param InterruptRequest Value of @ref I2C_Interrupt_configuration_definition. + * @retval None + */ +static void I2C_Disable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest) +{ + uint32_t tmpisr = 0U; + + if ((InterruptRequest & I2C_XFER_TX_IT) == I2C_XFER_TX_IT) + { + /* Disable TC and TXI interrupts */ + tmpisr |= I2C_IT_TCI | I2C_IT_TXI; + + if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) != (uint32_t)HAL_I2C_STATE_LISTEN) + { + /* Disable NACK and STOP interrupts */ + tmpisr |= I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_ERRI; + } + } + + if ((InterruptRequest & I2C_XFER_RX_IT) == I2C_XFER_RX_IT) + { + /* Disable TC and RXI interrupts */ + tmpisr |= I2C_IT_TCI | I2C_IT_RXI; + + if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) != (uint32_t)HAL_I2C_STATE_LISTEN) + { + /* Disable NACK and STOP interrupts */ + tmpisr |= I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_ERRI; + } + } + + if ((InterruptRequest & I2C_XFER_LISTEN_IT) == I2C_XFER_LISTEN_IT) + { + /* Disable ADDR, NACK and STOP interrupts */ + tmpisr |= I2C_IT_ADDRI | I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_ERRI; + } + + if (InterruptRequest == I2C_XFER_ERROR_IT) + { + /* Enable ERR and NACK interrupts */ + tmpisr |= I2C_IT_ERRI | I2C_IT_NACKI; + } + + if (InterruptRequest == I2C_XFER_CPLT_IT) + { + /* Enable STOP interrupts */ + tmpisr |= I2C_IT_STOPI; + } + + if (InterruptRequest == I2C_XFER_RELOAD_IT) + { + /* Enable TC interrupts */ + tmpisr |= I2C_IT_TCI; + } + + /* Disable interrupts only at the end */ + /* to avoid a breaking situation like at "t" time */ + /* all disable interrupts request are not done */ + __HAL_I2C_DISABLE_IT(hi2c, tmpisr); +} + +/** + * @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 */ +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c new file mode 100644 index 0000000..c36afb6 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c @@ -0,0 +1,367 @@ +/** + ****************************************************************************** + * @file stm32f3xx_hal_i2c_ex.c + * @author MCD Application Team + * @brief I2C Extended HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of I2C Extended peripheral: + * + Filter Mode Functions + * + WakeUp Mode Functions + * + FastModePlus Functions + * + @verbatim + ============================================================================== + ##### I2C peripheral Extended features ##### + ============================================================================== + + [..] Comparing to other previous devices, the I2C interface for STM32F3xx + devices contains the following additional features + + (+) Possibility to disable or enable Analog Noise Filter + (+) Use of a configured Digital Noise Filter + (+) Disable or enable wakeup from Stop mode(s) + (+) Disable or enable Fast Mode Plus + + ##### How to use this driver ##### + ============================================================================== + [..] This driver provides functions to configure Noise Filter and Wake Up Feature + (#) Configure I2C Analog noise filter using the function HAL_I2CEx_ConfigAnalogFilter() + (#) Configure I2C Digital noise filter using the function HAL_I2CEx_ConfigDigitalFilter() + (#) Configure the enable or disable of I2C Wake Up Mode using the functions : + (++) HAL_I2CEx_EnableWakeUp() + (++) HAL_I2CEx_DisableWakeUp() + (#) Configure the enable or disable of fast mode plus driving capability using the functions : + (++) HAL_I2CEx_EnableFastModePlus() + (++) HAL_I2CEx_DisableFastModePlus() + @endverbatim + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f3xx_hal.h" + +/** @addtogroup STM32F3xx_HAL_Driver + * @{ + */ + +/** @defgroup I2CEx I2CEx + * @brief I2C Extended HAL module driver + * @{ + */ + +#ifdef HAL_I2C_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** @defgroup I2CEx_Exported_Functions I2C Extended Exported Functions + * @{ + */ + +/** @defgroup I2CEx_Exported_Functions_Group1 Filter Mode Functions + * @brief Filter Mode Functions + * +@verbatim + =============================================================================== + ##### Filter Mode Functions ##### + =============================================================================== + [..] This section provides functions allowing to: + (+) Configure Noise Filters + +@endverbatim + * @{ + */ + +/** + * @brief Configure 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) + { + /* Process Locked */ + __HAL_LOCK(hi2c); + + hi2c->State = HAL_I2C_STATE_BUSY; + + /* Disable the selected I2C peripheral */ + __HAL_I2C_DISABLE(hi2c); + + /* Reset I2Cx ANOFF bit */ + hi2c->Instance->CR1 &= ~(I2C_CR1_ANFOFF); + + /* Set analog filter bit*/ + hi2c->Instance->CR1 |= AnalogFilter; + + __HAL_I2C_ENABLE(hi2c); + + hi2c->State = HAL_I2C_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Configure 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 Min_Data=0x00 and Max_Data=0x0F. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_I2CEx_ConfigDigitalFilter(I2C_HandleTypeDef *hi2c, uint32_t DigitalFilter) +{ + uint32_t tmpreg; + + /* 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) + { + /* Process Locked */ + __HAL_LOCK(hi2c); + + hi2c->State = HAL_I2C_STATE_BUSY; + + /* Disable the selected I2C peripheral */ + __HAL_I2C_DISABLE(hi2c); + + /* Get the old register value */ + tmpreg = hi2c->Instance->CR1; + + /* Reset I2Cx DNF bits [11:8] */ + tmpreg &= ~(I2C_CR1_DNF); + + /* Set I2Cx DNF coefficient */ + tmpreg |= DigitalFilter << 8U; + + /* Store the new register value */ + hi2c->Instance->CR1 = tmpreg; + + __HAL_I2C_ENABLE(hi2c); + + hi2c->State = HAL_I2C_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} +/** + * @} + */ + +/** @defgroup I2CEx_Exported_Functions_Group2 WakeUp Mode Functions + * @brief WakeUp Mode Functions + * +@verbatim + =============================================================================== + ##### WakeUp Mode Functions ##### + =============================================================================== + [..] This section provides functions allowing to: + (+) Configure Wake Up Feature + +@endverbatim + * @{ + */ + +/** + * @brief Enable I2C wakeup from Stop mode(s). + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2Cx peripheral. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_I2CEx_EnableWakeUp(I2C_HandleTypeDef *hi2c) +{ + /* Check the parameters */ + assert_param(IS_I2C_WAKEUP_FROMSTOP_INSTANCE(hi2c->Instance)); + + if (hi2c->State == HAL_I2C_STATE_READY) + { + /* Process Locked */ + __HAL_LOCK(hi2c); + + hi2c->State = HAL_I2C_STATE_BUSY; + + /* Disable the selected I2C peripheral */ + __HAL_I2C_DISABLE(hi2c); + + /* Enable wakeup from stop mode */ + hi2c->Instance->CR1 |= I2C_CR1_WUPEN; + + __HAL_I2C_ENABLE(hi2c); + + hi2c->State = HAL_I2C_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Disable I2C wakeup from Stop mode(s). + * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + * the configuration information for the specified I2Cx peripheral. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_I2CEx_DisableWakeUp(I2C_HandleTypeDef *hi2c) +{ + /* Check the parameters */ + assert_param(IS_I2C_WAKEUP_FROMSTOP_INSTANCE(hi2c->Instance)); + + if (hi2c->State == HAL_I2C_STATE_READY) + { + /* Process Locked */ + __HAL_LOCK(hi2c); + + hi2c->State = HAL_I2C_STATE_BUSY; + + /* Disable the selected I2C peripheral */ + __HAL_I2C_DISABLE(hi2c); + + /* Enable wakeup from stop mode */ + hi2c->Instance->CR1 &= ~(I2C_CR1_WUPEN); + + __HAL_I2C_ENABLE(hi2c); + + hi2c->State = HAL_I2C_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(hi2c); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} +/** + * @} + */ + +/** @defgroup I2CEx_Exported_Functions_Group3 Fast Mode Plus Functions + * @brief Fast Mode Plus Functions + * +@verbatim + =============================================================================== + ##### Fast Mode Plus Functions ##### + =============================================================================== + [..] This section provides functions allowing to: + (+) Configure Fast Mode Plus + +@endverbatim + * @{ + */ + +/** + * @brief Enable the I2C fast mode plus driving capability. + * @param ConfigFastModePlus Selects the pin. + * This parameter can be one of the @ref I2CEx_FastModePlus values + * @note For I2C1, fast mode plus driving capability can be enabled on all selected + * I2C1 pins using I2C_FASTMODEPLUS_I2C1 parameter or independently + * on each one of the following pins PB6, PB7, PB8 and PB9. + * @note For remaining I2C1 pins (PA14, PA15...) fast mode plus driving capability + * can be enabled only by using I2C_FASTMODEPLUS_I2C1 parameter. + * @note For all I2C2 pins fast mode plus driving capability can be enabled + * only by using I2C_FASTMODEPLUS_I2C2 parameter. + * @note For all I2C3 pins fast mode plus driving capability can be enabled + * only by using I2C_FASTMODEPLUS_I2C3 parameter. + * @retval None + */ +void HAL_I2CEx_EnableFastModePlus(uint32_t ConfigFastModePlus) +{ + /* Check the parameter */ + assert_param(IS_I2C_FASTMODEPLUS(ConfigFastModePlus)); + + /* Enable SYSCFG clock */ + __HAL_RCC_SYSCFG_CLK_ENABLE(); + + /* Enable fast mode plus driving capability for selected pin */ + SET_BIT(SYSCFG->CFGR1, (uint32_t)ConfigFastModePlus); +} + +/** + * @brief Disable the I2C fast mode plus driving capability. + * @param ConfigFastModePlus Selects the pin. + * This parameter can be one of the @ref I2CEx_FastModePlus values + * @note For I2C1, fast mode plus driving capability can be disabled on all selected + * I2C1 pins using I2C_FASTMODEPLUS_I2C1 parameter or independently + * on each one of the following pins PB6, PB7, PB8 and PB9. + * @note For remaining I2C1 pins (PA14, PA15...) fast mode plus driving capability + * can be disabled only by using I2C_FASTMODEPLUS_I2C1 parameter. + * @note For all I2C2 pins fast mode plus driving capability can be disabled + * only by using I2C_FASTMODEPLUS_I2C2 parameter. + * @note For all I2C3 pins fast mode plus driving capability can be disabled + * only by using I2C_FASTMODEPLUS_I2C3 parameter. + * @retval None + */ +void HAL_I2CEx_DisableFastModePlus(uint32_t ConfigFastModePlus) +{ + /* Check the parameter */ + assert_param(IS_I2C_FASTMODEPLUS(ConfigFastModePlus)); + + /* Enable SYSCFG clock */ + __HAL_RCC_SYSCFG_CLK_ENABLE(); + + /* Disable fast mode plus driving capability for selected pin */ + CLEAR_BIT(SYSCFG->CFGR1, (uint32_t)ConfigFastModePlus); +} +/** + * @} + */ +/** + * @} + */ + +#endif /* HAL_I2C_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c new file mode 100644 index 0000000..3ad97c3 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c @@ -0,0 +1,461 @@ +/** + ****************************************************************************** + * @file stm32f3xx_hal_pwr.c + * @author MCD Application Team + * @brief PWR HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Power Controller (PWR) peripheral: + * + Initialization/de-initialization functions + * + Peripheral Control functions + * + @verbatim + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f3xx_hal.h" + +/** @addtogroup STM32F3xx_HAL_Driver + * @{ + */ + +/** @defgroup PWR PWR + * @brief PWR HAL module driver + * @{ + */ + +#ifdef HAL_PWR_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* 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 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 32 is used as the RTC clock, the + * Backup Domain Access should be kept enabled. + * @retval None + */ +void HAL_PWR_EnableBkUpAccess(void) +{ + SET_BIT(PWR->CR, PWR_CR_DBP); +} + +/** + * @brief Disables access to the backup domain (RTC registers, RTC + * backup data registers and backup SRAM). + * @note If the HSE divided by 32 is used as the RTC clock, the + * Backup Domain Access should be kept enabled. + * @retval None + */ +void HAL_PWR_DisableBkUpAccess(void) +{ + CLEAR_BIT(PWR->CR, PWR_CR_DBP); +} + +/** + * @} + */ + +/** @defgroup PWR_Exported_Functions_Group2 Peripheral Control functions + * @brief Low Power modes configuration functions + * +@verbatim + + =============================================================================== + ##### Peripheral Control functions ##### + =============================================================================== + + *** WakeUp pin configuration *** + ================================ + [..] + (+) WakeUp pin is used to wakeup the system from Standby mode. This pin is + forced in input pull down configuration and is active on rising edges. + (+) There are up to three WakeUp pins: + (++)WakeUp Pin 1 on PA.00. + (++)WakeUp Pin 2 on PC.13 (STM32F303xC, STM32F303xE only). + (++)WakeUp Pin 3 on PE.06. + + *** Main and Backup Regulators configuration *** + ================================================ + [..] + (+) 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. + + Refer to the datasheets for more details. + + *** 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 (mode not available on STM32F3x8 devices). + + *** Sleep mode *** + ================== + [..] + (+) Entry: + The Sleep mode is entered by using the HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFx) + functions with + (++) PWR_SLEEPENTRY_WFI: enter SLEEP mode with WFI instruction + (++) PWR_SLEEPENTRY_WFE: enter SLEEP mode with WFE instruction + + (+) Exit: + (++) 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.8V 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. + + (+) Entry: + The Stop mode is entered using the HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_STOPENTRY_WFI ) + function with: + (++) Main regulator ON or + (++) Low Power regulator ON. + (++) PWR_STOPENTRY_WFI: enter STOP mode with WFI instruction or + (++) PWR_STOPENTRY_WFE: enter STOP mode with WFE instruction + (+) Exit: + (++) Any EXTI Line (Internal or External) configured in Interrupt/Event mode. + (++) Some specific communication peripherals (CEC, USART, I2C) interrupts, + when programmed in wakeup mode (the peripheral must be + programmed in wakeup mode and the corresponding interrupt vector + must be enabled in the NVIC). + + *** 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.8V 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 wakeup, + tamper event, time-stamp event, external reset in NRST pin, IWDG reset. + + *** Auto-wakeup (AWU) from low-power mode *** + ============================================= + [..] + The MCU can be woken up from low-power mode by an RTC Alarm event, an RTC + Wakeup event, a tamper event, a time-stamp event, or a comparator event, + without depending on an external interrupt (Auto-wakeup mode). + + (+) RTC auto-wakeup (AWU) from the Stop and Standby modes + + (++) To wake up from the Stop mode with an RTC alarm event, it is necessary to + configure the RTC to generate the RTC alarm using the HAL_RTC_SetAlarm_IT() function. + + (++) 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_RTC_SetTimeStamp_IT() or HAL_RTC_SetTamper_IT() functions. + + (++) To wake up from the Stop mode with an RTC WakeUp event, it is necessary to + configure the RTC to generate the RTC WakeUp event using the HAL_RTC_SetWakeUpTimer_IT() function. + + (+) Comparator auto-wakeup (AWU) from the Stop mode + + (++) To wake up from the Stop mode with a comparator wakeup event, it is necessary to: + (+++) Configure the EXTI Line associated with the comparator (example EXTI Line 22 for comparator 2U) + to be sensitive to to the selected edges (falling, rising or falling + and rising) (Interrupt or Event modes) using the EXTI_Init() function. + (+++) Configure the comparator to generate the event. +@endverbatim + * @{ + */ + +/** + * @brief Enables the WakeUp PINx functionality. + * @param WakeUpPinx Specifies the Power Wake-Up pin to enable. + * This parameter can be value of : + * @ref PWR_WakeUp_Pins + * @retval None + */ +void HAL_PWR_EnableWakeUpPin(uint32_t WakeUpPinx) +{ + /* Check the parameters */ + assert_param(IS_PWR_WAKEUP_PIN(WakeUpPinx)); + /* Enable the EWUPx pin */ + SET_BIT(PWR->CSR, WakeUpPinx); +} + +/** + * @brief Disables the WakeUp PINx functionality. + * @param WakeUpPinx Specifies the Power Wake-Up pin to disable. + * This parameter can be values of : + * @ref PWR_WakeUp_Pins + * @retval None + */ +void HAL_PWR_DisableWakeUpPin(uint32_t WakeUpPinx) +{ + /* Check the parameters */ + assert_param(IS_PWR_WAKEUP_PIN(WakeUpPinx)); + /* Disable the EWUPx 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. + * @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 has no effect in F3 family and is just maintained to + * offer full portability of other STM32 families softwares. + * @param SLEEPEntry Specifies if SLEEP mode is entered with WFI or WFE instruction. + * When WFI entry is used, tick interrupt have to be disabled if not desired as + * the interrupt wake up source. + * This parameter can be one of the following values: + * @arg PWR_SLEEPENTRY_WFI: enter SLEEP mode with WFI instruction + * @arg PWR_SLEEPENTRY_WFE: enter SLEEP mode with WFE instruction + * @retval None + */ +void HAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t SLEEPEntry) +{ + /* Check the parameters */ + assert_param(IS_PWR_SLEEP_ENTRY(SLEEPEntry)); + + /* Clear SLEEPDEEP bit of Cortex System Control Register */ + SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP_Msk); + + /* Select SLEEP mode entry -------------------------------------------------*/ + if(SLEEPEntry == PWR_SLEEPENTRY_WFI) + { + /* Request Wait For Interrupt */ + __WFI(); + } + else + { + /* Request Wait For Event */ + __SEV(); + __WFE(); + __WFE(); + } +} + +/** + * @brief Enters STOP mode. + * @note In Stop mode, all I/O pins keep the same state as in Run mode. + * @note When exiting Stop mode by issuing an interrupt or a wakeup event, + * the HSI RC oscillator is selected as system clock. + * @note When the voltage regulator operates in low power mode, an additional + * startup delay is incurred when waking up from Stop mode. + * By keeping the internal regulator ON during Stop mode, the consumption + * is higher although the startup time is reduced. + * @param Regulator Specifies the regulator state in STOP mode. + * This parameter can be one of the following values: + * @arg PWR_MAINREGULATOR_ON: STOP mode with regulator ON + * @arg PWR_LOWPOWERREGULATOR_ON: STOP mode with low power regulator ON + * @param STOPEntry specifies if STOP mode in entered with WFI or WFE instruction. + * This parameter can be one of the following values: + * @arg PWR_STOPENTRY_WFI:Enter STOP mode with WFI instruction + * @arg PWR_STOPENTRY_WFE: Enter STOP mode with WFE instruction + * @retval None + */ +void HAL_PWR_EnterSTOPMode(uint32_t Regulator, uint8_t STOPEntry) +{ + uint32_t tmpreg = 0U; + + /* Check the parameters */ + assert_param(IS_PWR_REGULATOR(Regulator)); + assert_param(IS_PWR_STOP_ENTRY(STOPEntry)); + + /* Select the regulator state in STOP mode ---------------------------------*/ + tmpreg = PWR->CR; + + /* Clear PDDS and LPDS bits */ + tmpreg &= (uint32_t)~(PWR_CR_PDDS | PWR_CR_LPDS); + + /* Set LPDS bit according to Regulator value */ + tmpreg |= Regulator; + + /* Store the new value */ + PWR->CR = tmpreg; + + /* Set SLEEPDEEP bit of Cortex System Control Register */ + SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; + + /* Select STOP mode entry --------------------------------------------------*/ + if(STOPEntry == PWR_STOPENTRY_WFI) + { + /* Request Wait For Interrupt */ + __WFI(); + } + else + { + /* Request Wait For Event */ + __SEV(); + __WFE(); + __WFE(); + } + + /* Reset SLEEPDEEP bit of Cortex System Control Register */ + SCB->SCR &= (uint32_t)~((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 alternate function pins if configured for tamper, time-stamp, RTC + * Alarm out, or RTC clock calibration out, + * - WKUP pins if enabled. + * @retval None + */ +void HAL_PWR_EnterSTANDBYMode(void) +{ + /* Select STANDBY mode */ + PWR->CR |= PWR_CR_PDDS; + + /* Set SLEEPDEEP bit of Cortex System Control Register */ + SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; + + /* This option is used to ensure that store operations are completed */ +#if defined ( __CC_ARM) + __force_stores(); +#endif + /* Request Wait For Interrupt */ + __WFI(); +} + +/** + * @brief Indicates Sleep-On-Exit when returning from Handler mode to Thread mode. + * @note Set SLEEPONEXIT bit of SCR register. When this bit is set, the processor + * re-enters SLEEP mode when an interruption handling is over. + * Setting this bit is useful when the processor is expected to run only on + * interruptions handling. + * @retval None + */ +void HAL_PWR_EnableSleepOnExit(void) +{ + /* Set SLEEPONEXIT bit of Cortex System Control Register */ + SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk)); +} + + +/** + * @brief Disables Sleep-On-Exit feature when returning from Handler mode to Thread mode. + * @note Clears SLEEPONEXIT bit of SCR register. When this bit is set, the processor + * re-enters SLEEP mode when an interruption handling is over. + * @retval None + */ +void HAL_PWR_DisableSleepOnExit(void) +{ + /* Clear SLEEPONEXIT bit of Cortex System Control Register */ + CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk)); +} + + + +/** + * @brief Enables CORTEX M4 SEVONPEND bit. + * @note Sets SEVONPEND bit of SCR register. When this bit is set, this causes + * WFE to wake up when an interrupt moves from inactive to pended. + * @retval None + */ +void HAL_PWR_EnableSEVOnPend(void) +{ + /* Set SEVONPEND bit of Cortex System Control Register */ + SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk)); +} + + +/** + * @brief Disables CORTEX M4 SEVONPEND bit. + * @note Clears SEVONPEND bit of SCR register. When this bit is set, this causes + * WFE to wake up when an interrupt moves from inactive to pended. + * @retval None + */ +void HAL_PWR_DisableSEVOnPend(void) +{ + /* Clear SEVONPEND bit of Cortex System Control Register */ + CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk)); +} +/** + * @} + */ + +/** + * @} + */ + +#endif /* HAL_PWR_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c new file mode 100644 index 0000000..69e35e9 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c @@ -0,0 +1,272 @@ +/** + ****************************************************************************** + * @file stm32f3xx_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 the Power Controller (PWR) peripheral: + * + Extended Initialization and de-initialization functions + * + Extended Peripheral Control functions + * + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f3xx_hal.h" + +/** @addtogroup STM32F3xx_HAL_Driver + * @{ + */ + +/** @defgroup PWREx PWREx + * @brief PWREx HAL module driver + * @{ + */ + +#ifdef HAL_PWR_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @defgroup PWREx_Private_Constants PWR Extended Private Constants + * @{ + */ +#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 -----------------------------------------------*/ +/* Exported functions ---------------------------------------------------------*/ + +/** @defgroup PWREx_Exported_Functions PWR Extended Exported Functions + * @{ + */ + +/** @defgroup PWREx_Exported_Functions_Group1 Peripheral Extended Control Functions + * @brief Extended Peripheral Control functions + * +@verbatim + + =============================================================================== + ##### Peripheral Extended control functions ##### + =============================================================================== + *** PVD configuration (present on all other devices than STM32F3x8 devices) *** + ========================= + [..] + (+) 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. + -@- PVD is not available on STM32F3x8 Product Line + + + *** Voltage regulator *** + ========================= + [..] + (+) The voltage regulator is always enabled after Reset. It works in three different + modes. + In Run mode, the regulator supplies full power to the 1.8V domain (core, memories + and digital peripherals). + In Stop mode, the regulator supplies low power to the 1.8V domain, preserving + contents of registers and SRAM. + In Stop mode, the regulator is powered off. The contents of the registers and SRAM + are lost except for the Standby circuitry and the Backup Domain. + Note: in the STM32F3x8xx devices, the voltage regulator is bypassed and the + microcontroller must be powered from a nominal VDD = 1.8V +/-8U% voltage. + + + (+) 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. + + + *** SDADC power configuration *** + ================================ + [..] + (+) On STM32F373xC/STM32F378xx devices, there are up to + 3 SDADC instances that can be enabled/disabled. + +@endverbatim + * @{ + */ + +#if defined(STM32F302xE) || defined(STM32F303xE) || \ + defined(STM32F302xC) || defined(STM32F303xC) || \ + defined(STM32F303x8) || defined(STM32F334x8) || \ + defined(STM32F301x8) || defined(STM32F302x8) || \ + defined(STM32F373xC) + +/** + * @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) +{ + SET_BIT(PWR->CR, PWR_CR_PVDE); +} + +/** + * @brief Disables the Power Voltage Detector(PVD). + * @retval None + */ +void HAL_PWR_DisablePVD(void) +{ + CLEAR_BIT(PWR->CR, PWR_CR_PVDE); +} + +/** + * @brief This function handles the PWR PVD interrupt request. + * @note This API should be called under the PVD_IRQHandler(). + * @retval None + */ +void HAL_PWR_PVD_IRQHandler(void) +{ + /* Check PWR exti flag */ + if(__HAL_PWR_PVD_EXTI_GET_FLAG() != RESET) + { + /* PWR PVD interrupt user callback */ + HAL_PWR_PVDCallback(); + + /* Clear PWR Exti pending bit */ + __HAL_PWR_PVD_EXTI_CLEAR_FLAG(); + } +} + +/** + * @brief PWR PVD interrupt callback + * @retval None + */ +__weak void HAL_PWR_PVDCallback(void) +{ + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_PWR_PVDCallback could be implemented in the user file + */ +} + +#endif /* STM32F302xE || STM32F303xE || */ + /* STM32F302xC || STM32F303xC || */ + /* STM32F303x8 || STM32F334x8 || */ + /* STM32F301x8 || STM32F302x8 || */ + /* STM32F373xC */ + +#if defined(STM32F373xC) || defined(STM32F378xx) + +/** + * @brief Enables the SDADC peripheral functionaliy + * @param Analogx specifies the SDADC peripheral instance. + * This parameter can be: PWR_SDADC_ANALOG1, PWR_SDADC_ANALOG2 or PWR_SDADC_ANALOG3. + * @retval None + */ +void HAL_PWREx_EnableSDADC(uint32_t Analogx) +{ + /* Check the parameters */ + assert_param(IS_PWR_SDADC_ANALOG(Analogx)); + + /* Enable PWR clock interface for SDADC use */ + __HAL_RCC_PWR_CLK_ENABLE(); + + PWR->CR |= Analogx; +} + +/** + * @brief Disables the SDADC peripheral functionaliy + * @param Analogx specifies the SDADC peripheral instance. + * This parameter can be: PWR_SDADC_ANALOG1, PWR_SDADC_ANALOG2 or PWR_SDADC_ANALOG3. + * @retval None + */ +void HAL_PWREx_DisableSDADC(uint32_t Analogx) +{ + /* Check the parameters */ + assert_param(IS_PWR_SDADC_ANALOG(Analogx)); + + PWR->CR &= ~Analogx; +} + +#endif /* STM32F373xC || STM32F378xx */ + +/** + * @} + */ + +/** + * @} + */ + +#endif /* HAL_PWR_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c new file mode 100644 index 0000000..007ff2e --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c @@ -0,0 +1,1224 @@ +/** + ****************************************************************************** + * @file stm32f3xx_hal_rcc.c + * @author MCD Application Team + * @brief RCC HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Reset and Clock Control (RCC) peripheral: + * + Initialization and de-initialization functions + * + Peripheral Control functions + * + @verbatim + ============================================================================== + ##### RCC specific features ##### + ============================================================================== + [..] + After reset the device is running from Internal High Speed oscillator + (HSI 8MHz) with Flash 0 wait state, Flash prefetch buffer is enabled, + and all peripherals are off except internal SRAM, Flash and JTAG. + (+) There is no prescaler on High speed (AHB) and Low speed (APB) buses; + all peripherals mapped on these buses are running at HSI speed. + (+) The clock for all peripherals is switched off, except the SRAM and FLASH. + (+) All GPIOs are in input floating state, except the JTAG pins which + are assigned to be used for debug purpose. + [..] Once the device started from reset, the user application has to: + (+) Configure the clock source to be used to drive the System clock + (if the application needs higher frequency/performance) + (+) Configure the System clock frequency and Flash settings + (+) Configure the AHB and APB buses prescalers + (+) Enable the clock for the peripheral(s) to be used + (+) Configure the clock source(s) for peripherals whose clocks are not + derived from the System clock (RTC, ADC, I2C, I2S, TIM, USB FS) + + ##### RCC Limitations ##### + ============================================================================== + [..] + A delay between an RCC peripheral clock enable and the effective peripheral + enabling should be taken into account in order to manage the peripheral read/write + from/to registers. + (+) This delay depends on the peripheral mapping. + (++) AHB & APB peripherals, 1 dummy read is necessary + + [..] + Workarounds: + (#) For AHB & APB peripherals, a dummy read to the peripheral register has been + inserted in each __HAL_RCC_PPP_CLK_ENABLE() macro. + + @endverbatim + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f3xx_hal.h" + +/** @addtogroup STM32F3xx_HAL_Driver + * @{ + */ + +/** @defgroup RCC RCC +* @brief RCC HAL module driver + * @{ + */ + +#ifdef HAL_RCC_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @defgroup RCC_Private_Constants RCC Private Constants + * @{ + */ +/* Bits position in in the CFGR register */ +#define RCC_CFGR_HPRE_BITNUMBER POSITION_VAL(RCC_CFGR_HPRE) +#define RCC_CFGR_PPRE1_BITNUMBER POSITION_VAL(RCC_CFGR_PPRE1) +#define RCC_CFGR_PPRE2_BITNUMBER POSITION_VAL(RCC_CFGR_PPRE2) +/** + * @} + */ +/* Private macro -------------------------------------------------------------*/ +/** @defgroup RCC_Private_Macros RCC Private Macros + * @{ + */ + +#define MCO1_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() +#define MCO1_GPIO_PORT GPIOA +#define MCO1_PIN GPIO_PIN_8 + +/** + * @} + */ + +/* Private variables ---------------------------------------------------------*/ +/** @defgroup RCC_Private_Variables RCC Private Variables + * @{ + */ +const uint8_t aPLLMULFactorTable[16] = { 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, + 10U, 11U, 12U, 13U, 14U, 15U, 16U, 16U}; +const uint8_t aPredivFactorTable[16] = { 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, + 9U,10U, 11U, 12U, 13U, 14U, 15U, 16U}; +/** + * @} + */ + +/* Private function prototypes -----------------------------------------------*/ +/* Exported functions ---------------------------------------------------------*/ + +/** @defgroup RCC_Exported_Functions RCC Exported Functions + * @{ + */ + +/** @defgroup RCC_Exported_Functions_Group1 Initialization and de-initialization functions + * @brief Initialization and Configuration functions + * + @verbatim + =============================================================================== + ##### Initialization and de-initialization functions ##### + =============================================================================== + [..] + This section provides functions allowing to configure the internal/external oscillators + (HSE, HSI, LSE, LSI, PLL, CSS and MCO) and the System buses clocks (SYSCLK, AHB, APB1 + and APB2). + + [..] Internal/external clock and PLL configuration + (#) HSI (high-speed internal), 8 MHz factory-trimmed RC used directly or through + the PLL as System clock source. + The HSI clock can be used also to clock the USART and I2C peripherals. + + (#) LSI (low-speed internal), ~40 KHz low consumption RC used as IWDG and/or RTC + clock source. + + (#) HSE (high-speed external), 4 to 32 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 different output clocks: + (++) The first output is used to generate the high speed system clock (up to 72 MHz) + (++) The second output is used to generate the clock for the USB FS (48 MHz) + (++) The third output may be used to generate the clock for the ADC peripherals (up to 72 MHz) + (++) The fourth output may be used to generate the clock for the TIM peripherals (144 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. + + (#) MCO (microcontroller clock output), used to output SYSCLK, HSI, HSE, LSI, LSE or PLL + clock (divided by 2) output on pin (such as PA8 pin). + + [..] System, AHB and APB buses clocks configuration + (#) Several clock sources can be used to drive the System clock (SYSCLK): HSI, + HSE and PLL. + The AHB clock (HCLK) is derived from System clock through configurable + prescaler and used to clock the CPU, memory and peripherals mapped + on AHB bus (DMA, GPIO...). APB1 (PCLK1) and APB2 (PCLK2) clocks are derived + from AHB clock through configurable prescalers and used to clock + the peripherals mapped on these buses. You can use + "HAL_RCC_GetSysClockFreq()" function to retrieve the frequencies of these clocks. + + (#) All the peripheral clocks are derived from the System clock (SYSCLK) except: + (++) The FLASH program/erase clock which is always HSI 8MHz clock. + (++) The USB 48 MHz clock which is derived from the PLL VCO clock. + (++) The USART clock which can be derived as well from HSI 8MHz, LSI or LSE. + (++) The I2C clock which can be derived as well from HSI 8MHz clock. + (++) The ADC clock which is derived from PLL output. + (++) The RTC clock which is derived from the LSE, LSI or 1 MHz HSE_RTC + (HSE divided by a programmable prescaler). The System clock (SYSCLK) + frequency must be higher or equal to the RTC clock frequency. + (++) IWDG clock which is always the LSI clock. + + (#) For the STM32F3xx devices, the maximum frequency of the SYSCLK, HCLK, PCLK1 and PCLK2 is 72 MHz, + Depending on the SYSCLK frequency, the flash latency should be adapted accordingly. + + (#) After reset, the System clock source is the HSI (8 MHz) with 0 WS and + prefetch is disabled. + @endverbatim + * @{ + */ + +/* + Additional consideration on the SYSCLK based on Latency settings: + +-----------------------------------------------+ + | Latency | SYSCLK clock frequency (MHz) | + |---------------|-------------------------------| + |0WS(1CPU cycle)| 0 < SYSCLK <= 24 | + |---------------|-------------------------------| + |1WS(2CPU cycle)| 24 < SYSCLK <= 48 | + |---------------|-------------------------------| + |2WS(3CPU cycle)| 48 < SYSCLK <= 72 | + +-----------------------------------------------+ + */ + +/** + * @brief Resets the RCC clock configuration to the default reset state. + * @note The default reset state of the clock configuration is given below: + * - HSI ON and used as system clock source + * - HSE and PLL OFF + * - AHB, APB1 and APB2 prescaler set to 1. + * - CSS and MCO1 OFF + * - All interrupts disabled + * @note This function does not modify the configuration of the + * - Peripheral clocks + * - LSI, LSE and RTC clocks + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCC_DeInit(void) +{ + uint32_t tickstart = 0; + + /* Set HSION bit */ + SET_BIT(RCC->CR, RCC_CR_HSION); + + /* Insure HSIRDY bit is set before writing default HSITRIM value */ + /* Get start tick */ + tickstart = HAL_GetTick(); + + /* 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 default value */ + MODIFY_REG(RCC->CR, RCC_CR_HSITRIM, RCC_CR_HSITRIM_4); + + /* Reset SW[1:0], HPRE[3:0], PPRE1[2:0], PPRE2[2:0] and MCOSEL[2:0] bits */ + CLEAR_BIT(RCC->CFGR, RCC_CFGR_SW | RCC_CFGR_HPRE | RCC_CFGR_PPRE1 | RCC_CFGR_PPRE2 | RCC_CFGR_MCO); + + /* Insure HSI selected as system clock source */ + /* Get start tick */ + tickstart = HAL_GetTick(); + + /* Wait till system clock source is ready */ + while(READ_BIT(RCC->CFGR, RCC_CFGR_SWS) != RCC_CFGR_SWS_HSI) + { + if((HAL_GetTick() - tickstart) > CLOCKSWITCH_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* Update the SystemCoreClock global variable for HSI as system clock source */ + SystemCoreClock = HSI_VALUE; + + /* Configure the source of time base considering new system clock settings */ + if(HAL_InitTick(uwTickPrio) != HAL_OK) + { + return HAL_ERROR; + } + + /* Reset HSEON, CSSON, PLLON bits */ + CLEAR_BIT(RCC->CR, RCC_CR_PLLON | RCC_CR_CSSON | RCC_CR_HSEON); + + /* Reset HSEBYP bit */ + CLEAR_BIT(RCC->CR, RCC_CR_HSEBYP); + + /* Insure PLLRDY is reset */ + /* Get start tick */ + tickstart = HAL_GetTick(); + while(READ_BIT(RCC->CR, RCC_CR_PLLRDY) != 0U) + { + if((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* Reset CFGR register */ + CLEAR_REG(RCC->CFGR); + + /* Reset CFGR2 register */ + CLEAR_REG(RCC->CFGR2); + + /* Reset CFGR3 register */ + CLEAR_REG(RCC->CFGR3); + + /* 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); + + /* Disable all interrupts */ + CLEAR_REG(RCC->CIR); + + /* Reset all CSR flags */ + __HAL_RCC_CLEAR_RESET_FLAGS(); + + 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 macro. User should request a transition to LSE Off + * first and then LSE On or LSE Bypass. + * @note Transition HSE Bypass to HSE On and HSE On to HSE Bypass are not + * supported by this macro. User should request a transition to HSE Off + * first and then HSE On or HSE Bypass. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) +{ + uint32_t tickstart; + uint32_t pll_config; +#if defined(RCC_CFGR_PLLSRC_HSI_PREDIV) + uint32_t pll_config2; +#endif /* RCC_CFGR_PLLSRC_HSI_PREDIV */ + + /* Check Null pointer */ + if(RCC_OscInitStruct == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_RCC_OSCILLATORTYPE(RCC_OscInitStruct->OscillatorType)); + + /*------------------------------- HSE Configuration ------------------------*/ + if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE) + { + /* Check the parameters */ + assert_param(IS_RCC_HSE(RCC_OscInitStruct->HSEState)); + + /* When the HSE is used as system clock or clock source for PLL in these cases it is not allowed to be disabled */ + if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSE) + || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && (__HAL_RCC_GET_PLL_OSCSOURCE() == RCC_PLLSOURCE_HSE))) + { + if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF)) + { + return HAL_ERROR; + } + } + else + { + /* Set the new HSE configuration ---------------------------------------*/ + __HAL_RCC_HSE_CONFIG(RCC_OscInitStruct->HSEState); + +#if defined(RCC_CFGR_PLLSRC_HSI_DIV2) + /* Configure the HSE predivision factor --------------------------------*/ + __HAL_RCC_HSE_PREDIV_CONFIG(RCC_OscInitStruct->HSEPredivValue); +#endif /* RCC_CFGR_PLLSRC_HSI_DIV2 */ + + /* Check the HSE State */ + if(RCC_OscInitStruct->HSEState != RCC_HSE_OFF) + { + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Wait till HSE is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + else + { + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Wait till HSE is disabled */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + } + /*----------------------------- HSI Configuration --------------------------*/ + if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI) + { + /* Check the parameters */ + assert_param(IS_RCC_HSI(RCC_OscInitStruct->HSIState)); + assert_param(IS_RCC_CALIBRATION_VALUE(RCC_OscInitStruct->HSICalibrationValue)); + + /* Check if HSI is used as system clock or as PLL source when PLL is selected as system clock */ + if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSI) + || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && (__HAL_RCC_GET_PLL_OSCSOURCE() == RCC_PLLSOURCE_HSI))) + { + /* When HSI is used as system clock it will not disabled */ + if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) && (RCC_OscInitStruct->HSIState != RCC_HSI_ON)) + { + return HAL_ERROR; + } + /* Otherwise, just the calibration is allowed */ + else + { + /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/ + __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); + } + } + else + { + /* Check the HSI State */ + if(RCC_OscInitStruct->HSIState != RCC_HSI_OFF) + { + /* Enable the Internal High Speed oscillator (HSI). */ + __HAL_RCC_HSI_ENABLE(); + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Wait till HSI is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + + /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/ + __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); + } + else + { + /* Disable the Internal High Speed oscillator (HSI). */ + __HAL_RCC_HSI_DISABLE(); + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Wait till HSI is disabled */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + } + /*------------------------------ LSI Configuration -------------------------*/ + if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI) + { + /* Check the parameters */ + assert_param(IS_RCC_LSI(RCC_OscInitStruct->LSIState)); + + /* Check the LSI State */ + if(RCC_OscInitStruct->LSIState != RCC_LSI_OFF) + { + /* Enable the Internal Low Speed oscillator (LSI). */ + __HAL_RCC_LSI_ENABLE(); + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Wait till LSI is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + else + { + /* Disable the Internal Low Speed oscillator (LSI). */ + __HAL_RCC_LSI_DISABLE(); + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Wait till LSI is disabled */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + /*------------------------------ LSE Configuration -------------------------*/ + if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE) + { + FlagStatus pwrclkchanged = RESET; + + /* Check the parameters */ + assert_param(IS_RCC_LSE(RCC_OscInitStruct->LSEState)); + + /* Update LSE configuration in Backup Domain control register */ + /* Requires to enable write access to Backup Domain of necessary */ + if(__HAL_RCC_PWR_IS_CLK_DISABLED()) + { + __HAL_RCC_PWR_CLK_ENABLE(); + pwrclkchanged = SET; + } + + if(HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) + { + /* Enable write access to Backup domain */ + SET_BIT(PWR->CR, PWR_CR_DBP); + + /* Wait for Backup domain Write protection disable */ + tickstart = HAL_GetTick(); + + while(HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) + { + if((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + + /* Set the new LSE configuration -----------------------------------------*/ + __HAL_RCC_LSE_CONFIG(RCC_OscInitStruct->LSEState); + /* Check the LSE State */ + if(RCC_OscInitStruct->LSEState != RCC_LSE_OFF) + { + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Wait till LSE is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + else + { + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Wait till LSE is disabled */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + + /* Require to disable power clock if necessary */ + if(pwrclkchanged == SET) + { + __HAL_RCC_PWR_CLK_DISABLE(); + } + } + + /*-------------------------------- PLL Configuration -----------------------*/ + /* Check the parameters */ + assert_param(IS_RCC_PLL(RCC_OscInitStruct->PLL.PLLState)); + if ((RCC_OscInitStruct->PLL.PLLState) != RCC_PLL_NONE) + { + /* Check if the PLL is used as system clock or not */ + if(__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_SYSCLKSOURCE_STATUS_PLLCLK) + { + if((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON) + { + /* Check the parameters */ + assert_param(IS_RCC_PLLSOURCE(RCC_OscInitStruct->PLL.PLLSource)); + assert_param(IS_RCC_PLL_MUL(RCC_OscInitStruct->PLL.PLLMUL)); +#if defined(RCC_CFGR_PLLSRC_HSI_PREDIV) + assert_param(IS_RCC_PREDIV(RCC_OscInitStruct->PLL.PREDIV)); +#endif + + /* 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; + } + } + +#if defined(RCC_CFGR_PLLSRC_HSI_PREDIV) + /* Configure the main PLL clock source, predivider and multiplication factor. */ + __HAL_RCC_PLL_CONFIG(RCC_OscInitStruct->PLL.PLLSource, + RCC_OscInitStruct->PLL.PREDIV, + RCC_OscInitStruct->PLL.PLLMUL); +#else + /* Configure the main PLL clock source and multiplication factor. */ + __HAL_RCC_PLL_CONFIG(RCC_OscInitStruct->PLL.PLLSource, + RCC_OscInitStruct->PLL.PLLMUL); +#endif /* RCC_CFGR_PLLSRC_HSI_PREDIV */ + /* Enable the main PLL. */ + __HAL_RCC_PLL_ENABLE(); + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Wait till PLL is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) + { + if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + else + { + /* Disable the main PLL. */ + __HAL_RCC_PLL_DISABLE(); + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Wait till PLL is disabled */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) + { + if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + else + { + /* Check if there is a request to disable the PLL used as System clock source */ + if((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) + { + return HAL_ERROR; + } + else + { + /* Do not return HAL_ERROR if request repeats the current configuration */ + pll_config = RCC->CFGR; +#if defined(RCC_CFGR_PLLSRC_HSI_PREDIV) + pll_config2 = RCC->CFGR2; + if((READ_BIT(pll_config, RCC_CFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || + (READ_BIT(pll_config, RCC_CFGR_PLLMUL) != RCC_OscInitStruct->PLL.PLLMUL) || + (READ_BIT(pll_config2, RCC_CFGR2_PREDIV) != RCC_OscInitStruct->PLL.PREDIV)) +#else + if((READ_BIT(pll_config, RCC_CFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || + (READ_BIT(pll_config, RCC_CFGR_PLLMUL) != RCC_OscInitStruct->PLL.PLLMUL)) +#endif + { + return HAL_ERROR; + } + } + } + } + + return HAL_OK; +} + +/** + * @brief Initializes the CPU, AHB and APB buses clocks according to the specified + * parameters in the RCC_ClkInitStruct. + * @param RCC_ClkInitStruct pointer to an RCC_OscInitTypeDef structure that + * contains the configuration information for the RCC peripheral. + * @param FLatency FLASH Latency + * The value of this parameter depend on device used within the same series + * @note The SystemCoreClock CMSIS variable is used to store System Clock Frequency + * and updated by @ref HAL_RCC_GetHCLKFreq() function called within this function + * + * @note The HSI is used (enabled by hardware) as system clock source after + * start-up from Reset, wake-up from STOP and STANDBY mode, or in case + * of failure of the HSE used directly or indirectly as system clock + * (if the Clock Security System CSS is enabled). + * + * @note A switch from one clock source to another occurs only if the target + * clock source is ready (clock stable after start-up delay or PLL locked). + * If a clock source which is not yet ready is selected, the switch will + * occur when the clock source will be ready. + * You can use @ref HAL_RCC_GetClockConfig() function to know which clock is + * currently used as system clock source. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t FLatency) +{ + uint32_t tickstart = 0U; + + /* Check Null pointer */ + if(RCC_ClkInitStruct == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_RCC_CLOCKTYPE(RCC_ClkInitStruct->ClockType)); + assert_param(IS_FLASH_LATENCY(FLatency)); + + /* To correctly read data from FLASH memory, the number of wait states (LATENCY) + must be correctly programmed according to the frequency of the CPU clock + (HCLK) of the device. */ + + /* 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) + { + assert_param(IS_RCC_HCLK(RCC_ClkInitStruct->AHBCLKDivider)); + MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, RCC_ClkInitStruct->AHBCLKDivider); + } + + /*------------------------- SYSCLK Configuration ---------------------------*/ + if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_SYSCLK) == RCC_CLOCKTYPE_SYSCLK) + { + assert_param(IS_RCC_SYSCLKSOURCE(RCC_ClkInitStruct->SYSCLKSource)); + + /* HSE is selected as System Clock Source */ + if(RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_HSE) + { + /* Check the HSE ready flag */ + if(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) + { + return HAL_ERROR; + } + } + /* PLL is selected as System Clock Source */ + else if(RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLCLK) + { + /* Check the PLL ready flag */ + if(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) + { + return HAL_ERROR; + } + } + /* HSI is selected as System Clock Source */ + else + { + /* Check the HSI ready flag */ + if(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) + { + return HAL_ERROR; + } + } + + __HAL_RCC_SYSCLK_CONFIG(RCC_ClkInitStruct->SYSCLKSource); + + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + while (__HAL_RCC_GET_SYSCLK_SOURCE() != (RCC_ClkInitStruct->SYSCLKSource << RCC_CFGR_SWS_Pos)) + { + if ((HAL_GetTick() - tickstart) > CLOCKSWITCH_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + /* 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_BITNUMBER]; + + /* 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 + * @{ + */ + +#if defined(RCC_CFGR_MCOPRE) +/** + * @brief Selects the clock source to output on MCO pin. + * @note MCO pin should be configured in alternate function mode. + * @param RCC_MCOx specifies the output direction for the clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_MCO1 Clock source to output on MCO1 pin(PA8). + * @param RCC_MCOSource specifies the clock source to output. + * This parameter can be one of the following values: + * @arg @ref RCC_MCO1SOURCE_NOCLOCK No clock selected + * @arg @ref RCC_MCO1SOURCE_SYSCLK System Clock selected as MCO clock + * @arg @ref RCC_MCO1SOURCE_HSI HSI selected as MCO clock + * @arg @ref RCC_MCO1SOURCE_HSE HSE selected as MCO clock + * @arg @ref RCC_MCO1SOURCE_LSI LSI selected as MCO clock + * @arg @ref RCC_MCO1SOURCE_LSE LSE selected as MCO clock + * @arg @ref RCC_MCO1SOURCE_PLLCLK PLLCLK selected as MCO clock + * @arg @ref RCC_MCO1SOURCE_PLLCLK_DIV2 PLLCLK Divided by 2 selected as MCO clock + * @param RCC_MCODiv specifies the MCO DIV. + * This parameter can be one of the following values: + * @arg @ref RCC_MCODIV_1 no division applied to MCO clock + * @arg @ref RCC_MCODIV_2 division by 2 applied to MCO clock + * @arg @ref RCC_MCODIV_4 division by 4 applied to MCO clock + * @arg @ref RCC_MCODIV_8 division by 8 applied to MCO clock + * @arg @ref RCC_MCODIV_16 division by 16 applied to MCO clock + * @arg @ref RCC_MCODIV_32 division by 32 applied to MCO clock + * @arg @ref RCC_MCODIV_64 division by 64 applied to MCO clock + * @arg @ref RCC_MCODIV_128 division by 128 applied to MCO clock + * @retval None + */ +#else +/** + * @brief Selects the clock source to output on MCO pin. + * @note MCO pin should be configured in alternate function mode. + * @param RCC_MCOx specifies the output direction for the clock source. + * This parameter can be one of the following values: + * @arg @ref RCC_MCO1 Clock source to output on MCO1 pin(PA8). + * @param RCC_MCOSource specifies the clock source to output. + * This parameter can be one of the following values: + * @arg @ref RCC_MCO1SOURCE_NOCLOCK No clock selected as MCO clock + * @arg @ref RCC_MCO1SOURCE_SYSCLK System clock selected as MCO clock + * @arg @ref RCC_MCO1SOURCE_HSI HSI selected as MCO clock + * @arg @ref RCC_MCO1SOURCE_HSE HSE selected as MCO clock + * @arg @ref RCC_MCO1SOURCE_LSI LSI selected as MCO clock + * @arg @ref RCC_MCO1SOURCE_LSE LSE selected as MCO clock + * @arg @ref RCC_MCO1SOURCE_PLLCLK_DIV2 PLLCLK Divided by 2 selected as MCO clock + * @param RCC_MCODiv specifies the MCO DIV. + * This parameter can be one of the following values: + * @arg @ref RCC_MCODIV_1 no division applied to MCO clock + * @retval None + */ +#endif +void HAL_RCC_MCOConfig(uint32_t RCC_MCOx, uint32_t RCC_MCOSource, uint32_t RCC_MCODiv) +{ + GPIO_InitTypeDef gpio; + + /* Check the parameters */ + assert_param(IS_RCC_MCO(RCC_MCOx)); + assert_param(IS_RCC_MCODIV(RCC_MCODiv)); + assert_param(IS_RCC_MCO1SOURCE(RCC_MCOSource)); + + /* Configure the MCO1 pin in alternate function mode */ + gpio.Mode = GPIO_MODE_AF_PP; + gpio.Speed = GPIO_SPEED_FREQ_HIGH; + gpio.Pull = GPIO_NOPULL; + gpio.Pin = MCO1_PIN; + gpio.Alternate = GPIO_AF0_MCO; + + /* MCO1 Clock Enable */ + MCO1_CLK_ENABLE(); + + HAL_GPIO_Init(MCO1_GPIO_PORT, &gpio); + + /* Configure the MCO clock source */ + __HAL_RCC_MCO1_CONFIG(RCC_MCOSource, RCC_MCODiv); +} + +/** + * @brief Enables the Clock Security System. + * @note If a failure is detected on the HSE oscillator clock, this oscillator + * is automatically disabled and an interrupt is generated to inform the + * software about the failure (Clock Security System Interrupt, CSSI), + * allowing the MCU to perform rescue operations. The CSSI is linked to + * the Cortex-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 a value based on HSE_VALUE + * divided by PREDIV factor(**) + * @note If SYSCLK source is PLL, function returns a value based on HSE_VALUE + * divided by PREDIV factor(**) or HSI_VALUE(*) multiplied by the PLL factor. + * @note (*) HSI_VALUE is a constant defined in stm32f3xx_hal_conf.h file (default value + * 8 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * @note (**) HSE_VALUE is a constant defined in stm32f3xx_hal_conf.h file (default value + * 8 MHz), user has to ensure that HSE_VALUE is same as the real + * frequency of the crystal used. Otherwise, this function may + * have wrong result. + * + * @note The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @note This function can be used by the user application to compute the + * baud-rate for the communication peripherals or configure other parameters. + * + * @note Each time SYSCLK changes, this function must be called to update the + * right SYSCLK value. Otherwise, any configuration based on this function will be incorrect. + * + * @retval SYSCLK frequency + */ +uint32_t HAL_RCC_GetSysClockFreq(void) +{ + uint32_t tmpreg = 0U, prediv = 0U, pllclk = 0U, pllmul = 0U; + uint32_t sysclockfreq = 0U; + + tmpreg = RCC->CFGR; + + /* Get SYSCLK source -------------------------------------------------------*/ + switch (tmpreg & RCC_CFGR_SWS) + { + case RCC_SYSCLKSOURCE_STATUS_HSE: /* HSE used as system clock */ + { + sysclockfreq = HSE_VALUE; + break; + } + case RCC_SYSCLKSOURCE_STATUS_PLLCLK: /* PLL used as system clock */ + { + pllmul = aPLLMULFactorTable[(uint32_t)(tmpreg & RCC_CFGR_PLLMUL) >> POSITION_VAL(RCC_CFGR_PLLMUL)]; + prediv = aPredivFactorTable[(uint32_t)(RCC->CFGR2 & RCC_CFGR2_PREDIV) >> POSITION_VAL(RCC_CFGR2_PREDIV)]; +#if defined(RCC_CFGR_PLLSRC_HSI_DIV2) + if ((tmpreg & RCC_CFGR_PLLSRC) != RCC_PLLSOURCE_HSI) + { + /* HSE used as PLL clock source : PLLCLK = HSE/PREDIV * PLLMUL */ + pllclk = (uint32_t)((uint64_t) HSE_VALUE / (uint64_t) (prediv)) * ((uint64_t) pllmul); + } + else + { + /* HSI used as PLL clock source : PLLCLK = HSI/2 * PLLMUL */ + pllclk = (uint32_t)((uint64_t) (HSI_VALUE >> 1U) * ((uint64_t) pllmul)); + } +#else + if ((tmpreg & RCC_CFGR_PLLSRC_HSE_PREDIV) == RCC_CFGR_PLLSRC_HSE_PREDIV) + { + /* HSE used as PLL clock source : PLLCLK = HSE/PREDIV * PLLMUL */ + pllclk = (uint32_t)((uint64_t) HSE_VALUE / (uint64_t) (prediv)) * ((uint64_t) pllmul); + } + else + { + /* HSI used as PLL clock source : PLLCLK = HSI/PREDIV * PLLMUL */ + pllclk = (uint32_t)((uint64_t) HSI_VALUE / (uint64_t) (prediv)) * ((uint64_t) pllmul); + } +#endif /* RCC_CFGR_PLLSRC_HSI_DIV2 */ + sysclockfreq = pllclk; + break; + } + case RCC_SYSCLKSOURCE_STATUS_HSI: /* HSI used as system clock source */ + default: /* HSI used as system clock */ + { + sysclockfreq = HSI_VALUE; + break; + } + } + return sysclockfreq; +} + +/** + * @brief Returns the HCLK frequency + * @note Each time HCLK changes, this function must be called to update the + * right HCLK value. Otherwise, any configuration based on this function will be incorrect. + * + * @note The SystemCoreClock CMSIS variable is used to store System Clock Frequency + * and updated within this function + * @retval HCLK frequency + */ +uint32_t HAL_RCC_GetHCLKFreq(void) +{ + return SystemCoreClock; +} + +/** + * @brief Returns the PCLK1 frequency + * @note Each time PCLK1 changes, this function must be called to update the + * right PCLK1 value. Otherwise, any configuration based on this function will be incorrect. + * @retval PCLK1 frequency + */ +uint32_t HAL_RCC_GetPCLK1Freq(void) +{ + /* Get HCLK source and Compute PCLK1 frequency ---------------------------*/ + return (HAL_RCC_GetHCLKFreq() >> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE1) >> RCC_CFGR_PPRE1_BITNUMBER]); +} + +/** + * @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_BITNUMBER]); +} + +/** + * @brief Configures the RCC_OscInitStruct according to the internal + * RCC configuration registers. + * @param RCC_OscInitStruct pointer to an RCC_OscInitTypeDef structure that + * will be configured. + * @retval None + */ +void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) +{ + /* Check the parameters */ + assert_param(RCC_OscInitStruct != NULL); + + /* Set all possible values for the Oscillator type parameter ---------------*/ + RCC_OscInitStruct->OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI \ + | RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI; + + + /* 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; + } +#if defined(RCC_CFGR_PLLSRC_HSI_DIV2) + RCC_OscInitStruct->HSEPredivValue = __HAL_RCC_HSE_GET_PREDIV(); +#endif + + /* 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) >> POSITION_VAL(RCC_CR_HSITRIM)); + + /* Get the LSE configuration -----------------------------------------------*/ + if((RCC->BDCR &RCC_BDCR_LSEBYP) == RCC_BDCR_LSEBYP) + { + RCC_OscInitStruct->LSEState = RCC_LSE_BYPASS; + } + else if((RCC->BDCR &RCC_BDCR_LSEON) == RCC_BDCR_LSEON) + { + RCC_OscInitStruct->LSEState = RCC_LSE_ON; + } + else + { + RCC_OscInitStruct->LSEState = RCC_LSE_OFF; + } + + /* Get the LSI configuration -----------------------------------------------*/ + if((RCC->CSR &RCC_CSR_LSION) == RCC_CSR_LSION) + { + RCC_OscInitStruct->LSIState = RCC_LSI_ON; + } + else + { + RCC_OscInitStruct->LSIState = RCC_LSI_OFF; + } + + + /* Get the PLL configuration -----------------------------------------------*/ + if((RCC->CR &RCC_CR_PLLON) == RCC_CR_PLLON) + { + RCC_OscInitStruct->PLL.PLLState = RCC_PLL_ON; + } + else + { + RCC_OscInitStruct->PLL.PLLState = RCC_PLL_OFF; + } + RCC_OscInitStruct->PLL.PLLSource = (uint32_t)(RCC->CFGR & RCC_CFGR_PLLSRC); + RCC_OscInitStruct->PLL.PLLMUL = (uint32_t)(RCC->CFGR & RCC_CFGR_PLLMUL); +#if defined(RCC_CFGR_PLLSRC_HSI_PREDIV) + RCC_OscInitStruct->PLL.PREDIV = (uint32_t)(RCC->CFGR2 & RCC_CFGR2_PREDIV); +#endif /* RCC_CFGR_PLLSRC_HSI_PREDIV */ +} + +/** + * @brief Get the RCC_ClkInitStruct according to the internal + * RCC configuration registers. + * @param RCC_ClkInitStruct pointer to an RCC_ClkInitTypeDef structure that + * contains the current clock configuration. + * @param pFLatency Pointer on the Flash Latency. + * @retval None + */ +void HAL_RCC_GetClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t *pFLatency) +{ + /* Check the parameters */ + assert_param(RCC_ClkInitStruct != NULL); + assert_param(pFLatency != NULL); + + /* Set all possible values for the Clock type parameter --------------------*/ + RCC_ClkInitStruct->ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; + + /* Get the SYSCLK configuration --------------------------------------------*/ + RCC_ClkInitStruct->SYSCLKSource = (uint32_t)(RCC->CFGR & RCC_CFGR_SW); + + /* Get the HCLK configuration ----------------------------------------------*/ + RCC_ClkInitStruct->AHBCLKDivider = (uint32_t)(RCC->CFGR & RCC_CFGR_HPRE); + + /* Get the APB1 configuration ----------------------------------------------*/ + RCC_ClkInitStruct->APB1CLKDivider = (uint32_t)(RCC->CFGR & RCC_CFGR_PPRE1); + + /* Get the APB2 configuration ----------------------------------------------*/ + RCC_ClkInitStruct->APB2CLKDivider = (uint32_t)((RCC->CFGR & RCC_CFGR_PPRE2) >> 3U); + + /* Get the Flash Wait State (Latency) configuration ------------------------*/ + *pFLatency = (uint32_t)(FLASH->ACR & FLASH_ACR_LATENCY); +} + +/** + * @brief This function handles the RCC CSS interrupt request. + * @note This API should be called under the NMI_Handler(). + * @retval None + */ +void HAL_RCC_NMI_IRQHandler(void) +{ + /* Check RCC CSSF flag */ + if(__HAL_RCC_GET_IT(RCC_IT_CSS)) + { + /* RCC Clock Security System interrupt user callback */ + HAL_RCC_CSSCallback(); + + /* Clear RCC CSS pending bit */ + __HAL_RCC_CLEAR_IT(RCC_IT_CSS); + } +} + +/** + * @brief RCC Clock Security System interrupt callback + * @retval none + */ +__weak void HAL_RCC_CSSCallback(void) +{ + /* NOTE : This function Should not be modified, when the callback is needed, + the HAL_RCC_CSSCallback could be implemented in the user file + */ +} + +/** + * @} + */ + +/** + * @} + */ + +#endif /* HAL_RCC_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c new file mode 100644 index 0000000..cb44fb4 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c @@ -0,0 +1,1584 @@ +/** + ****************************************************************************** + * @file stm32f3xx_hal_rcc_ex.c + * @author MCD Application Team + * @brief Extended RCC HAL module driver. + * This file provides firmware functions to manage the following + * functionalities RCC extension peripheral: + * + Extended Peripheral Control functions + * + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f3xx_hal.h" + +/** @addtogroup STM32F3xx_HAL_Driver + * @{ + */ + +#ifdef HAL_RCC_MODULE_ENABLED + +/** @defgroup RCCEx RCCEx + * @brief RCC Extension HAL module driver. + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/** @defgroup RCCEx_Private_Macros RCCEx Private Macros + * @{ + */ +/** + * @} + */ + +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +#if defined(RCC_CFGR2_ADC1PRES) || defined(RCC_CFGR2_ADCPRE12) || defined(RCC_CFGR2_ADCPRE34) || defined(RCC_CFGR_USBPRE) \ + || defined(RCC_CFGR3_TIM1SW) || defined(RCC_CFGR3_TIM2SW) || defined(RCC_CFGR3_TIM8SW) || defined(RCC_CFGR3_TIM15SW) \ + || defined(RCC_CFGR3_TIM16SW) || defined(RCC_CFGR3_TIM17SW) || defined(RCC_CFGR3_TIM20SW) || defined(RCC_CFGR3_TIM34SW) \ + || defined(RCC_CFGR3_HRTIM1SW) +/** @defgroup RCCEx_Private_Functions RCCEx Private Functions + * @{ + */ +static uint32_t RCC_GetPLLCLKFreq(void); + +/** + * @} + */ +#endif /* RCC_CFGR2_ADC1PRES || RCC_CFGR2_ADCPRExx || RCC_CFGR3_TIMxSW || RCC_CFGR3_HRTIM1SW || RCC_CFGR_USBPRE */ + +/** @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) are set to their reset values. + +@endverbatim + * @{ + */ + +/** + * @brief Initializes the RCC extended peripherals clocks according to the specified + * parameters in the RCC_PeriphCLKInitTypeDef. + * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that + * contains the configuration information for the Extended Peripherals clocks + * (ADC, CEC, I2C, I2S, SDADC, HRTIM, TIM, USART, RTC and USB). + * + * @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. + * + * @note When the TIMx clock source is APB clock, so the TIMx clock is APB clock or + * APB clock x 2 depending on the APB prescaler. + * When the TIMx clock source is PLL clock, so the TIMx clock is PLL clock x 2. + * + * @retval HAL status + */ +HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + uint32_t tickstart = 0U; + uint32_t temp_reg = 0U; + FlagStatus pwrclkchanged = RESET; + + /* 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)); + + + /* As soon as function is called to change RTC clock source, activation of the + power domain is done. */ + /* Requires to enable write access to Backup Domain of necessary */ + if(__HAL_RCC_PWR_IS_CLK_DISABLED()) + { + __HAL_RCC_PWR_CLK_ENABLE(); + pwrclkchanged = SET; + } + + if(HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) + { + /* Enable write access to Backup domain */ + SET_BIT(PWR->CR, PWR_CR_DBP); + + /* Wait for Backup domain Write protection disable */ + tickstart = HAL_GetTick(); + + while(HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) + { + if((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + + /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value */ + temp_reg = (RCC->BDCR & RCC_BDCR_RTCSEL); + if((temp_reg != 0x00000000U) && (temp_reg != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSEL))) + { + /* Store the content of BDCR register before the reset of Backup Domain */ + temp_reg = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); + /* RTC Clock selection can be changed only if the Backup Domain is reset */ + __HAL_RCC_BACKUPRESET_FORCE(); + __HAL_RCC_BACKUPRESET_RELEASE(); + /* Restore the Content of BDCR register */ + RCC->BDCR = temp_reg; + + /* Wait for LSERDY if LSE was enabled */ + if (HAL_IS_BIT_SET(temp_reg, RCC_BDCR_LSEON)) + { + /* Get Start Tick */ + tickstart = HAL_GetTick(); + + /* Wait till LSE is ready */ + while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) + { + if((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) + { + return HAL_TIMEOUT; + } + } + } + } + __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); + + /* Require to disable power clock if necessary */ + if(pwrclkchanged == SET) + { + __HAL_RCC_PWR_CLK_DISABLE(); + } + } + + /*------------------------------- USART1 Configuration ------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_USART1) == RCC_PERIPHCLK_USART1) + { + /* Check the parameters */ + assert_param(IS_RCC_USART1CLKSOURCE(PeriphClkInit->Usart1ClockSelection)); + + /* Configure the USART1 clock source */ + __HAL_RCC_USART1_CONFIG(PeriphClkInit->Usart1ClockSelection); + } + +#if defined(RCC_CFGR3_USART2SW) + /*----------------------------- USART2 Configuration --------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_USART2) == RCC_PERIPHCLK_USART2) + { + /* Check the parameters */ + assert_param(IS_RCC_USART2CLKSOURCE(PeriphClkInit->Usart2ClockSelection)); + + /* Configure the USART2 clock source */ + __HAL_RCC_USART2_CONFIG(PeriphClkInit->Usart2ClockSelection); + } +#endif /* RCC_CFGR3_USART2SW */ + +#if defined(RCC_CFGR3_USART3SW) + /*------------------------------ USART3 Configuration ------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_USART3) == RCC_PERIPHCLK_USART3) + { + /* Check the parameters */ + assert_param(IS_RCC_USART3CLKSOURCE(PeriphClkInit->Usart3ClockSelection)); + + /* Configure the USART3 clock source */ + __HAL_RCC_USART3_CONFIG(PeriphClkInit->Usart3ClockSelection); + } +#endif /* RCC_CFGR3_USART3SW */ + + /*------------------------------ I2C1 Configuration ------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2C1) == RCC_PERIPHCLK_I2C1) + { + /* Check the parameters */ + assert_param(IS_RCC_I2C1CLKSOURCE(PeriphClkInit->I2c1ClockSelection)); + + /* Configure the I2C1 clock source */ + __HAL_RCC_I2C1_CONFIG(PeriphClkInit->I2c1ClockSelection); + } + +#if defined(STM32F302xE) || defined(STM32F303xE)\ + || defined(STM32F302xC) || defined(STM32F303xC)\ + || defined(STM32F302x8) \ + || defined(STM32F373xC) + /*------------------------------ USB Configuration ------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_USB) == RCC_PERIPHCLK_USB) + { + /* Check the parameters */ + assert_param(IS_RCC_USBCLKSOURCE(PeriphClkInit->USBClockSelection)); + + /* Configure the USB clock source */ + __HAL_RCC_USB_CONFIG(PeriphClkInit->USBClockSelection); + } + +#endif /* STM32F302xE || STM32F303xE || */ + /* STM32F302xC || STM32F303xC || */ + /* STM32F302x8 || */ + /* STM32F373xC */ + +#if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx)\ + || defined(STM32F302xC) || defined(STM32F303xC) || defined(STM32F358xx)\ + || defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx)\ + || defined(STM32F373xC) || defined(STM32F378xx) + + /*------------------------------ I2C2 Configuration ------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2C2) == RCC_PERIPHCLK_I2C2) + { + /* Check the parameters */ + assert_param(IS_RCC_I2C2CLKSOURCE(PeriphClkInit->I2c2ClockSelection)); + + /* Configure the I2C2 clock source */ + __HAL_RCC_I2C2_CONFIG(PeriphClkInit->I2c2ClockSelection); + } + +#endif /* STM32F302xE || STM32F303xE || STM32F398xx || */ + /* STM32F302xC || STM32F303xC || STM32F358xx || */ + /* STM32F301x8 || STM32F302x8 || STM32F318xx || */ + /* STM32F373xC || STM32F378xx */ + +#if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx)\ + || defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx) + + /*------------------------------ I2C3 Configuration ------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2C3) == RCC_PERIPHCLK_I2C3) + { + /* Check the parameters */ + assert_param(IS_RCC_I2C3CLKSOURCE(PeriphClkInit->I2c3ClockSelection)); + + /* Configure the I2C3 clock source */ + __HAL_RCC_I2C3_CONFIG(PeriphClkInit->I2c3ClockSelection); + } +#endif /* STM32F302xE || STM32F303xE || STM32F398xx || */ + /* STM32F301x8 || STM32F302x8 || STM32F318xx */ + +#if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx)\ + || defined(STM32F302xC) || defined(STM32F303xC) || defined(STM32F358xx) + + /*------------------------------ UART4 Configuration ------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_UART4) == RCC_PERIPHCLK_UART4) + { + /* Check the parameters */ + assert_param(IS_RCC_UART4CLKSOURCE(PeriphClkInit->Uart4ClockSelection)); + + /* Configure the UART4 clock source */ + __HAL_RCC_UART4_CONFIG(PeriphClkInit->Uart4ClockSelection); + } + + /*------------------------------ UART5 Configuration ------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_UART5) == RCC_PERIPHCLK_UART5) + { + /* Check the parameters */ + assert_param(IS_RCC_UART5CLKSOURCE(PeriphClkInit->Uart5ClockSelection)); + + /* Configure the UART5 clock source */ + __HAL_RCC_UART5_CONFIG(PeriphClkInit->Uart5ClockSelection); + } + +#endif /* STM32F302xE || STM32F303xE || STM32F398xx || */ + /* STM32F302xC || STM32F303xC || STM32F358xx */ + +#if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx)\ + || defined(STM32F302xC) || defined(STM32F303xC) || defined(STM32F358xx)\ + || defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx) + /*------------------------------ I2S Configuration ------------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == RCC_PERIPHCLK_I2S) + { + /* Check the parameters */ + assert_param(IS_RCC_I2SCLKSOURCE(PeriphClkInit->I2sClockSelection)); + + /* Configure the I2S clock source */ + __HAL_RCC_I2S_CONFIG(PeriphClkInit->I2sClockSelection); + } + +#endif /* STM32F302xE || STM32F303xE || STM32F398xx || */ + /* STM32F302xC || STM32F303xC || STM32F358xx || */ + /* STM32F301x8 || STM32F302x8 || STM32F318xx */ + +#if defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx) + + /*------------------------------ ADC1 clock Configuration ------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_ADC1) == RCC_PERIPHCLK_ADC1) + { + /* Check the parameters */ + assert_param(IS_RCC_ADC1PLLCLK_DIV(PeriphClkInit->Adc1ClockSelection)); + + /* Configure the ADC1 clock source */ + __HAL_RCC_ADC1_CONFIG(PeriphClkInit->Adc1ClockSelection); + } + +#endif /* STM32F301x8 || STM32F302x8 || STM32F318xx */ + +#if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx)\ + || defined(STM32F302xC) || defined(STM32F303xC) || defined(STM32F358xx)\ + || defined(STM32F303x8) || defined(STM32F334x8) || defined(STM32F328xx) + + /*------------------------------ ADC1 & ADC2 clock Configuration -------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_ADC12) == RCC_PERIPHCLK_ADC12) + { + /* Check the parameters */ + assert_param(IS_RCC_ADC12PLLCLK_DIV(PeriphClkInit->Adc12ClockSelection)); + + /* Configure the ADC12 clock source */ + __HAL_RCC_ADC12_CONFIG(PeriphClkInit->Adc12ClockSelection); + } + +#endif /* STM32F302xE || STM32F303xE || STM32F398xx || */ + /* STM32F302xC || STM32F303xC || STM32F358xx || */ + /* STM32F303x8 || STM32F334x8 || STM32F328xx */ + +#if defined(STM32F303xE) || defined(STM32F398xx)\ + || defined(STM32F303xC) || defined(STM32F358xx) + + /*------------------------------ ADC3 & ADC4 clock Configuration -------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_ADC34) == RCC_PERIPHCLK_ADC34) + { + /* Check the parameters */ + assert_param(IS_RCC_ADC34PLLCLK_DIV(PeriphClkInit->Adc34ClockSelection)); + + /* Configure the ADC34 clock source */ + __HAL_RCC_ADC34_CONFIG(PeriphClkInit->Adc34ClockSelection); + } + +#endif /* STM32F303xE || STM32F398xx || */ + /* STM32F303xC || STM32F358xx */ + +#if defined(STM32F373xC) || defined(STM32F378xx) + + /*------------------------------ ADC1 clock Configuration ------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_ADC1) == RCC_PERIPHCLK_ADC1) + { + /* Check the parameters */ + assert_param(IS_RCC_ADC1PCLK2_DIV(PeriphClkInit->Adc1ClockSelection)); + + /* Configure the ADC1 clock source */ + __HAL_RCC_ADC1_CONFIG(PeriphClkInit->Adc1ClockSelection); + } + +#endif /* STM32F373xC || STM32F378xx */ + +#if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx)\ + || defined(STM32F302xC) || defined(STM32F303xC) || defined(STM32F358xx)\ + || defined(STM32F303x8) || defined(STM32F334x8) || defined(STM32F328xx)\ + || defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx) + + /*------------------------------ TIM1 clock Configuration ----------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM1) == RCC_PERIPHCLK_TIM1) + { + /* Check the parameters */ + assert_param(IS_RCC_TIM1CLKSOURCE(PeriphClkInit->Tim1ClockSelection)); + + /* Configure the TIM1 clock source */ + __HAL_RCC_TIM1_CONFIG(PeriphClkInit->Tim1ClockSelection); + } + +#endif /* STM32F302xE || STM32F303xE || STM32F398xx || */ + /* STM32F302xC || STM32F303xC || STM32F358xx || */ + /* STM32F303x8 || STM32F334x8 || STM32F328xx || */ + /* STM32F301x8 || STM32F302x8 || STM32F318xx */ + +#if defined(STM32F303xE) || defined(STM32F398xx)\ + || defined(STM32F303xC) || defined(STM32F358xx) + + /*------------------------------ TIM8 clock Configuration ----------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM8) == RCC_PERIPHCLK_TIM8) + { + /* Check the parameters */ + assert_param(IS_RCC_TIM8CLKSOURCE(PeriphClkInit->Tim8ClockSelection)); + + /* Configure the TIM8 clock source */ + __HAL_RCC_TIM8_CONFIG(PeriphClkInit->Tim8ClockSelection); + } + +#endif /* STM32F303xE || STM32F398xx || */ + /* STM32F303xC || STM32F358xx */ + +#if defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx) + + /*------------------------------ TIM15 clock Configuration ----------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM15) == RCC_PERIPHCLK_TIM15) + { + /* Check the parameters */ + assert_param(IS_RCC_TIM15CLKSOURCE(PeriphClkInit->Tim15ClockSelection)); + + /* Configure the TIM15 clock source */ + __HAL_RCC_TIM15_CONFIG(PeriphClkInit->Tim15ClockSelection); + } + + /*------------------------------ TIM16 clock Configuration ----------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM16) == RCC_PERIPHCLK_TIM16) + { + /* Check the parameters */ + assert_param(IS_RCC_TIM16CLKSOURCE(PeriphClkInit->Tim16ClockSelection)); + + /* Configure the TIM16 clock source */ + __HAL_RCC_TIM16_CONFIG(PeriphClkInit->Tim16ClockSelection); + } + + /*------------------------------ TIM17 clock Configuration ----------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM17) == RCC_PERIPHCLK_TIM17) + { + /* Check the parameters */ + assert_param(IS_RCC_TIM17CLKSOURCE(PeriphClkInit->Tim17ClockSelection)); + + /* Configure the TIM17 clock source */ + __HAL_RCC_TIM17_CONFIG(PeriphClkInit->Tim17ClockSelection); + } + +#endif /* STM32F301x8 || STM32F302x8 || STM32F318xx */ + +#if defined(STM32F334x8) + + /*------------------------------ HRTIM1 clock Configuration ----------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_HRTIM1) == RCC_PERIPHCLK_HRTIM1) + { + /* Check the parameters */ + assert_param(IS_RCC_HRTIM1CLKSOURCE(PeriphClkInit->Hrtim1ClockSelection)); + + /* Configure the HRTIM1 clock source */ + __HAL_RCC_HRTIM1_CONFIG(PeriphClkInit->Hrtim1ClockSelection); + } + +#endif /* STM32F334x8 */ + +#if defined(STM32F373xC) || defined(STM32F378xx) + + /*------------------------------ SDADC clock Configuration -------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDADC) == RCC_PERIPHCLK_SDADC) + { + /* Check the parameters */ + assert_param(IS_RCC_SDADCSYSCLK_DIV(PeriphClkInit->SdadcClockSelection)); + + /* Configure the SDADC clock prescaler */ + __HAL_RCC_SDADC_CONFIG(PeriphClkInit->SdadcClockSelection); + } + + /*------------------------------ CEC clock 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); + } + +#endif /* STM32F373xC || STM32F378xx */ + +#if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx) + + /*------------------------------ TIM2 clock Configuration -------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM2) == RCC_PERIPHCLK_TIM2) + { + /* Check the parameters */ + assert_param(IS_RCC_TIM2CLKSOURCE(PeriphClkInit->Tim2ClockSelection)); + + /* Configure the CEC clock source */ + __HAL_RCC_TIM2_CONFIG(PeriphClkInit->Tim2ClockSelection); + } + + /*------------------------------ TIM3 clock Configuration -------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM34) == RCC_PERIPHCLK_TIM34) + { + /* Check the parameters */ + assert_param(IS_RCC_TIM3CLKSOURCE(PeriphClkInit->Tim34ClockSelection)); + + /* Configure the CEC clock source */ + __HAL_RCC_TIM34_CONFIG(PeriphClkInit->Tim34ClockSelection); + } + + /*------------------------------ TIM15 clock Configuration ------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM15) == RCC_PERIPHCLK_TIM15) + { + /* Check the parameters */ + assert_param(IS_RCC_TIM15CLKSOURCE(PeriphClkInit->Tim15ClockSelection)); + + /* Configure the CEC clock source */ + __HAL_RCC_TIM15_CONFIG(PeriphClkInit->Tim15ClockSelection); + } + + /*------------------------------ TIM16 clock Configuration ------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM16) == RCC_PERIPHCLK_TIM16) + { + /* Check the parameters */ + assert_param(IS_RCC_TIM16CLKSOURCE(PeriphClkInit->Tim16ClockSelection)); + + /* Configure the CEC clock source */ + __HAL_RCC_TIM16_CONFIG(PeriphClkInit->Tim16ClockSelection); + } + + /*------------------------------ TIM17 clock Configuration ------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM17) == RCC_PERIPHCLK_TIM17) + { + /* Check the parameters */ + assert_param(IS_RCC_TIM17CLKSOURCE(PeriphClkInit->Tim17ClockSelection)); + + /* Configure the CEC clock source */ + __HAL_RCC_TIM17_CONFIG(PeriphClkInit->Tim17ClockSelection); + } + +#endif /* STM32F302xE || STM32F303xE || STM32F398xx */ + +#if defined(STM32F303xE) || defined(STM32F398xx) + /*------------------------------ TIM20 clock Configuration ------------------*/ + if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM20) == RCC_PERIPHCLK_TIM20) + { + /* Check the parameters */ + assert_param(IS_RCC_TIM20CLKSOURCE(PeriphClkInit->Tim20ClockSelection)); + + /* Configure the CEC clock source */ + __HAL_RCC_TIM20_CONFIG(PeriphClkInit->Tim20ClockSelection); + } +#endif /* STM32F303xE || STM32F398xx */ + + + return HAL_OK; +} + +/** + * @brief Get the RCC_ClkInitStruct according to the internal + * RCC configuration registers. + * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that + * returns the configuration information for the Extended Peripherals clocks + * (ADC, CEC, I2C, I2S, SDADC, HRTIM, TIM, USART, RTC and USB clocks). + * @retval None + */ +void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) +{ + /* Set all possible values for the extended clock type parameter------------*/ + /* Common part first */ +#if defined(RCC_CFGR3_USART2SW) && defined(RCC_CFGR3_USART3SW) + PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_USART1 | RCC_PERIPHCLK_USART2 | RCC_PERIPHCLK_USART3 | \ + RCC_PERIPHCLK_I2C1 | RCC_PERIPHCLK_RTC; +#else + PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_USART1 | \ + RCC_PERIPHCLK_I2C1 | RCC_PERIPHCLK_RTC; +#endif /* RCC_CFGR3_USART2SW && RCC_CFGR3_USART3SW */ + + /* Get the RTC configuration --------------------------------------------*/ + PeriphClkInit->RTCClockSelection = __HAL_RCC_GET_RTC_SOURCE(); + /* Get the USART1 clock configuration --------------------------------------------*/ + PeriphClkInit->Usart1ClockSelection = __HAL_RCC_GET_USART1_SOURCE(); +#if defined(RCC_CFGR3_USART2SW) + /* Get the USART2 clock configuration -----------------------------------------*/ + PeriphClkInit->Usart2ClockSelection = __HAL_RCC_GET_USART2_SOURCE(); +#endif /* RCC_CFGR3_USART2SW */ +#if defined(RCC_CFGR3_USART3SW) + /* Get the USART3 clock configuration -----------------------------------------*/ + PeriphClkInit->Usart3ClockSelection = __HAL_RCC_GET_USART3_SOURCE(); +#endif /* RCC_CFGR3_USART3SW */ + /* Get the I2C1 clock configuration -----------------------------------------*/ + PeriphClkInit->I2c1ClockSelection = __HAL_RCC_GET_I2C1_SOURCE(); + +#if defined(STM32F302xE) || defined(STM32F303xE)\ + || defined(STM32F302xC) || defined(STM32F303xC)\ + || defined(STM32F302x8) \ + || defined(STM32F373xC) + + PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_USB; + /* Get the USB clock configuration -----------------------------------------*/ + PeriphClkInit->USBClockSelection = __HAL_RCC_GET_USB_SOURCE(); + +#endif /* STM32F302xE || STM32F303xE || */ + /* STM32F302xC || STM32F303xC || */ + /* STM32F302x8 || */ + /* STM32F373xC */ + +#if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx)\ + || defined(STM32F302xC) || defined(STM32F303xC) || defined(STM32F358xx)\ + || defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx)\ + || defined(STM32F373xC) || defined(STM32F378xx) + + PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_I2C2; + /* Get the I2C2 clock configuration -----------------------------------------*/ + PeriphClkInit->I2c2ClockSelection = __HAL_RCC_GET_I2C2_SOURCE(); + +#endif /* STM32F302xE || STM32F303xE || STM32F398xx || */ + /* STM32F302xC || STM32F303xC || STM32F358xx || */ + /* STM32F301x8 || STM32F302x8 || STM32F318xx || */ + /* STM32F373xC || STM32F378xx */ + +#if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx)\ + || defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx) + + PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_I2C3; + /* Get the I2C3 clock configuration -----------------------------------------*/ + PeriphClkInit->I2c3ClockSelection = __HAL_RCC_GET_I2C3_SOURCE(); + +#endif /* STM32F302xE || STM32F303xE || STM32F398xx || */ + /* STM32F301x8 || STM32F302x8 || STM32F318xx */ + +#if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx)\ + || defined(STM32F302xC) || defined(STM32F303xC) ||defined(STM32F358xx) + + PeriphClkInit->PeriphClockSelection |= (RCC_PERIPHCLK_UART4 | RCC_PERIPHCLK_UART5); + /* Get the UART4 clock configuration -----------------------------------------*/ + PeriphClkInit->Uart4ClockSelection = __HAL_RCC_GET_UART4_SOURCE(); + /* Get the UART5 clock configuration -----------------------------------------*/ + PeriphClkInit->Uart5ClockSelection = __HAL_RCC_GET_UART5_SOURCE(); + +#endif /* STM32F302xE || STM32F303xE || STM32F398xx || */ + /* STM32F302xC || STM32F303xC || STM32F358xx */ + +#if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx)\ + || defined(STM32F302xC) || defined(STM32F303xC) || defined(STM32F358xx)\ + || defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx) + + PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_I2S; + /* Get the I2S clock configuration -----------------------------------------*/ + PeriphClkInit->I2sClockSelection = __HAL_RCC_GET_I2S_SOURCE(); + +#endif /* STM32F302xE || STM32F303xE || STM32F398xx || */ + /* STM32F302xC || STM32F303xC || STM32F358xx || */ + /* STM32F301x8 || STM32F302x8 || STM32F318xx || */ + +#if defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx)\ + || defined(STM32F373xC) || defined(STM32F378xx) + + PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_ADC1; + /* Get the ADC1 clock configuration -----------------------------------------*/ + PeriphClkInit->Adc1ClockSelection = __HAL_RCC_GET_ADC1_SOURCE(); + +#endif /* STM32F301x8 || STM32F302x8 || STM32F318xx || */ + /* STM32F373xC || STM32F378xx */ + +#if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx)\ + || defined(STM32F302xC) || defined(STM32F303xC) || defined(STM32F358xx)\ + || defined(STM32F303x8) || defined(STM32F334x8) || defined(STM32F328xx) + + PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_ADC12; + /* Get the ADC1 & ADC2 clock configuration -----------------------------------------*/ + PeriphClkInit->Adc12ClockSelection = __HAL_RCC_GET_ADC12_SOURCE(); + +#endif /* STM32F302xE || STM32F303xE || STM32F398xx || */ + /* STM32F302xC || STM32F303xC || STM32F358xx || */ + /* STM32F303x8 || STM32F334x8 || STM32F328xx */ + +#if defined(STM32F303xE) || defined(STM32F398xx)\ + || defined(STM32F303xC) || defined(STM32F358xx) + + PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_ADC34; + /* Get the ADC3 & ADC4 clock configuration -----------------------------------------*/ + PeriphClkInit->Adc34ClockSelection = __HAL_RCC_GET_ADC34_SOURCE(); + +#endif /* STM32F303xE || STM32F398xx || */ + /* STM32F303xC || STM32F358xx */ + +#if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx)\ + || defined(STM32F302xC) || defined(STM32F303xC) || defined(STM32F358xx)\ + || defined(STM32F303x8) || defined(STM32F334x8) || defined(STM32F328xx)\ + || defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx) + + PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_TIM1; + /* Get the TIM1 clock configuration -----------------------------------------*/ + PeriphClkInit->Tim1ClockSelection = __HAL_RCC_GET_TIM1_SOURCE(); + +#endif /* STM32F302xE || STM32F303xE || STM32F398xx || */ + /* STM32F302xC || STM32F303xC || STM32F358xx || */ + /* STM32F303x8 || STM32F334x8 || STM32F328xx || */ + /* STM32F301x8 || STM32F302x8 || STM32F318xx */ + +#if defined(STM32F303xE) || defined(STM32F398xx)\ + || defined(STM32F303xC) || defined(STM32F358xx) + + PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_TIM8; + /* Get the TIM8 clock configuration -----------------------------------------*/ + PeriphClkInit->Tim8ClockSelection = __HAL_RCC_GET_TIM8_SOURCE(); + +#endif /* STM32F303xE || STM32F398xx || */ + /* STM32F303xC || STM32F358xx */ + +#if defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx) + + PeriphClkInit->PeriphClockSelection |= (RCC_PERIPHCLK_TIM15 | RCC_PERIPHCLK_TIM16 | RCC_PERIPHCLK_TIM17); + /* Get the TIM15 clock configuration -----------------------------------------*/ + PeriphClkInit->Tim15ClockSelection = __HAL_RCC_GET_TIM15_SOURCE(); + /* Get the TIM16 clock configuration -----------------------------------------*/ + PeriphClkInit->Tim16ClockSelection = __HAL_RCC_GET_TIM16_SOURCE(); + /* Get the TIM17 clock configuration -----------------------------------------*/ + PeriphClkInit->Tim17ClockSelection = __HAL_RCC_GET_TIM17_SOURCE(); + +#endif /* STM32F301x8 || STM32F302x8 || STM32F318xx */ + +#if defined(STM32F334x8) + + PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_HRTIM1; + /* Get the HRTIM1 clock configuration -----------------------------------------*/ + PeriphClkInit->Hrtim1ClockSelection = __HAL_RCC_GET_HRTIM1_SOURCE(); + +#endif /* STM32F334x8 */ + +#if defined(STM32F373xC) || defined(STM32F378xx) + + PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_SDADC; + /* Get the SDADC clock configuration -----------------------------------------*/ + PeriphClkInit->SdadcClockSelection = __HAL_RCC_GET_SDADC_SOURCE(); + + PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_CEC; + /* Get the CEC clock configuration -----------------------------------------*/ + PeriphClkInit->CecClockSelection = __HAL_RCC_GET_CEC_SOURCE(); + +#endif /* STM32F373xC || STM32F378xx */ + +#if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx) + + PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_TIM2; + /* Get the TIM2 clock configuration -----------------------------------------*/ + PeriphClkInit->Tim2ClockSelection = __HAL_RCC_GET_TIM2_SOURCE(); + + PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_TIM34; + /* Get the TIM3 clock configuration -----------------------------------------*/ + PeriphClkInit->Tim34ClockSelection = __HAL_RCC_GET_TIM34_SOURCE(); + + PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_TIM15; + /* Get the TIM15 clock configuration -----------------------------------------*/ + PeriphClkInit->Tim15ClockSelection = __HAL_RCC_GET_TIM15_SOURCE(); + + PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_TIM16; + /* Get the TIM16 clock configuration -----------------------------------------*/ + PeriphClkInit->Tim16ClockSelection = __HAL_RCC_GET_TIM16_SOURCE(); + + PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_TIM17; + /* Get the TIM17 clock configuration -----------------------------------------*/ + PeriphClkInit->Tim17ClockSelection = __HAL_RCC_GET_TIM17_SOURCE(); + +#endif /* STM32F302xE || STM32F303xE || STM32F398xx */ + +#if defined (STM32F303xE) || defined(STM32F398xx) + PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_TIM20; + /* Get the TIM20 clock configuration -----------------------------------------*/ + PeriphClkInit->Tim20ClockSelection = __HAL_RCC_GET_TIM20_SOURCE(); +#endif /* STM32F303xE || STM32F398xx */ +} + +/** + * @brief Returns the peripheral clock frequency + * @note Returns 0 if peripheral clock is unknown or 0xDEADDEAD if not applicable. + * @param PeriphClk Peripheral clock identifier + * This parameter can be one of the following values: + * @arg @ref RCC_PERIPHCLK_RTC RTC peripheral clock + * @arg @ref RCC_PERIPHCLK_USART1 USART1 peripheral clock + * @arg @ref RCC_PERIPHCLK_I2C1 I2C1 peripheral clock + @if STM32F301x8 + * @arg @ref RCC_PERIPHCLK_I2C2 I2C2 peripheral clock + * @arg @ref RCC_PERIPHCLK_I2C3 I2C3 peripheral clock + * @arg @ref RCC_PERIPHCLK_I2S I2S peripheral clock + * @arg @ref RCC_PERIPHCLK_ADC1 ADC1 peripheral clock + * @arg @ref RCC_PERIPHCLK_TIM1 TIM1 peripheral clock + * @arg @ref RCC_PERIPHCLK_TIM15 TIM15 peripheral clock + * @arg @ref RCC_PERIPHCLK_TIM16 TIM16 peripheral clock + * @arg @ref RCC_PERIPHCLK_TIM17 TIM17 peripheral clock + @endif + @if STM32F302x8 + * @arg @ref RCC_PERIPHCLK_I2C2 I2C2 peripheral clock + * @arg @ref RCC_PERIPHCLK_I2C3 I2C3 peripheral clock + * @arg @ref RCC_PERIPHCLK_I2S I2S peripheral clock + * @arg @ref RCC_PERIPHCLK_USB USB peripheral clock + * @arg @ref RCC_PERIPHCLK_ADC1 ADC1 peripheral clock + * @arg @ref RCC_PERIPHCLK_TIM1 TIM1 peripheral clock + * @arg @ref RCC_PERIPHCLK_TIM15 TIM15 peripheral clock + * @arg @ref RCC_PERIPHCLK_TIM16 TIM16 peripheral clock + * @arg @ref RCC_PERIPHCLK_TIM17 TIM17 peripheral clock + @endif + @if STM32F302xC + * @arg @ref RCC_PERIPHCLK_USART2 USART2 peripheral clock + * @arg @ref RCC_PERIPHCLK_USART3 USART3 peripheral clock + * @arg @ref RCC_PERIPHCLK_UART4 UART4 peripheral clock + * @arg @ref RCC_PERIPHCLK_UART5 UART5 peripheral clock + * @arg @ref RCC_PERIPHCLK_I2C2 I2C2 peripheral clock + * @arg @ref RCC_PERIPHCLK_I2S I2S peripheral clock + * @arg @ref RCC_PERIPHCLK_USB USB peripheral clock + * @arg @ref RCC_PERIPHCLK_ADC12 ADC12 peripheral clock + * @arg @ref RCC_PERIPHCLK_TIM1 TIM1 peripheral clock + @endif + @if STM32F302xE + * @arg @ref RCC_PERIPHCLK_USART2 USART2 peripheral clock + * @arg @ref RCC_PERIPHCLK_USART3 USART3 peripheral clock + * @arg @ref RCC_PERIPHCLK_UART4 UART4 peripheral clock + * @arg @ref RCC_PERIPHCLK_UART5 UART5 peripheral clock + * @arg @ref RCC_PERIPHCLK_I2C2 I2C2 peripheral clock + * @arg @ref RCC_PERIPHCLK_I2C3 I2C3 peripheral clock + * @arg @ref RCC_PERIPHCLK_I2S I2S peripheral clock + * @arg @ref RCC_PERIPHCLK_USB USB peripheral clock + * @arg @ref RCC_PERIPHCLK_ADC12 ADC12 peripheral clock + * @arg @ref RCC_PERIPHCLK_TIM1 TIM1 peripheral clock + * @arg @ref RCC_PERIPHCLK_TIM2 TIM2 peripheral clock + * @arg @ref RCC_PERIPHCLK_TIM15 TIM15 peripheral clock + * @arg @ref RCC_PERIPHCLK_TIM16 TIM16 peripheral clock + * @arg @ref RCC_PERIPHCLK_TIM17 TIM17 peripheral clock + * @arg @ref RCC_PERIPHCLK_TIM34 TIM34 peripheral clock + @endif + @if STM32F303x8 + * @arg @ref RCC_PERIPHCLK_ADC12 ADC12 peripheral clock + * @arg @ref RCC_PERIPHCLK_TIM1 TIM1 peripheral clock + @endif + @if STM32F303xC + * @arg @ref RCC_PERIPHCLK_USART2 USART2 peripheral clock + * @arg @ref RCC_PERIPHCLK_USART3 USART3 peripheral clock + * @arg @ref RCC_PERIPHCLK_UART4 UART4 peripheral clock + * @arg @ref RCC_PERIPHCLK_UART5 UART5 peripheral clock + * @arg @ref RCC_PERIPHCLK_I2C2 I2C2 peripheral clock + * @arg @ref RCC_PERIPHCLK_I2S I2S peripheral clock + * @arg @ref RCC_PERIPHCLK_USB USB peripheral clock + * @arg @ref RCC_PERIPHCLK_ADC12 ADC12 peripheral clock + * @arg @ref RCC_PERIPHCLK_ADC34 ADC34 peripheral clock + * @arg @ref RCC_PERIPHCLK_TIM1 TIM1 peripheral clock + * @arg @ref RCC_PERIPHCLK_TIM8 TIM8 peripheral clock + @endif + @if STM32F303xE + * @arg @ref RCC_PERIPHCLK_USART2 USART2 peripheral clock + * @arg @ref RCC_PERIPHCLK_USART3 USART3 peripheral clock + * @arg @ref RCC_PERIPHCLK_UART4 UART4 peripheral clock + * @arg @ref RCC_PERIPHCLK_UART5 UART5 peripheral clock + * @arg @ref RCC_PERIPHCLK_I2C2 I2C2 peripheral clock + * @arg @ref RCC_PERIPHCLK_I2C3 I2C3 peripheral clock + * @arg @ref RCC_PERIPHCLK_I2S I2S peripheral clock + * @arg @ref RCC_PERIPHCLK_USB USB peripheral clock + * @arg @ref RCC_PERIPHCLK_ADC12 ADC12 peripheral clock + * @arg @ref RCC_PERIPHCLK_ADC34 ADC34 peripheral clock + * @arg @ref RCC_PERIPHCLK_TIM1 TIM1 peripheral clock + * @arg @ref RCC_PERIPHCLK_TIM2 TIM2 peripheral clock + * @arg @ref RCC_PERIPHCLK_TIM8 TIM8 peripheral clock + * @arg @ref RCC_PERIPHCLK_TIM15 TIM15 peripheral clock + * @arg @ref RCC_PERIPHCLK_TIM16 TIM16 peripheral clock + * @arg @ref RCC_PERIPHCLK_TIM17 TIM17 peripheral clock + * @arg @ref RCC_PERIPHCLK_TIM20 TIM20 peripheral clock + * @arg @ref RCC_PERIPHCLK_TIM34 TIM34 peripheral clock + @endif + @if STM32F318xx + * @arg @ref RCC_PERIPHCLK_I2C2 I2C2 peripheral clock + * @arg @ref RCC_PERIPHCLK_I2C3 I2C3 peripheral clock + * @arg @ref RCC_PERIPHCLK_I2S I2S peripheral clock + * @arg @ref RCC_PERIPHCLK_ADC1 ADC1 peripheral clock + * @arg @ref RCC_PERIPHCLK_TIM1 TIM1 peripheral clock + * @arg @ref RCC_PERIPHCLK_TIM15 TIM15 peripheral clock + * @arg @ref RCC_PERIPHCLK_TIM16 TIM16 peripheral clock + * @arg @ref RCC_PERIPHCLK_TIM17 TIM17 peripheral clock + @endif + @if STM32F328xx + * @arg @ref RCC_PERIPHCLK_I2C2 I2C2 peripheral clock + * @arg @ref RCC_PERIPHCLK_ADC12 ADC12 peripheral clock + * @arg @ref RCC_PERIPHCLK_TIM1 TIM1 peripheral clock + @endif + @if STM32F334x8 + * @arg @ref RCC_PERIPHCLK_ADC12 ADC12 peripheral clock + * @arg @ref RCC_PERIPHCLK_TIM1 TIM1 peripheral clock + * @arg @ref RCC_PERIPHCLK_HRTIM1 HRTIM1 peripheral clock + @endif + @if STM32F358xx + * @arg @ref RCC_PERIPHCLK_USART2 USART2 peripheral clock + * @arg @ref RCC_PERIPHCLK_USART3 USART3 peripheral clock + * @arg @ref RCC_PERIPHCLK_UART4 UART4 peripheral clock + * @arg @ref RCC_PERIPHCLK_UART5 UART5 peripheral clock + * @arg @ref RCC_PERIPHCLK_I2S I2S peripheral clock + * @arg @ref RCC_PERIPHCLK_ADC12 ADC12 peripheral clock + * @arg @ref RCC_PERIPHCLK_ADC34 ADC34 peripheral clock + * @arg @ref RCC_PERIPHCLK_TIM1 TIM1 peripheral clock + * @arg @ref RCC_PERIPHCLK_TIM8 TIM8 peripheral clock + @endif + @if STM32F373xC + * @arg @ref RCC_PERIPHCLK_USART2 USART2 peripheral clock + * @arg @ref RCC_PERIPHCLK_USART3 USART3 peripheral clock + * @arg @ref RCC_PERIPHCLK_I2C2 I2C2 peripheral clock + * @arg @ref RCC_PERIPHCLK_USB USB peripheral clock + * @arg @ref RCC_PERIPHCLK_ADC1 ADC1 peripheral clock + * @arg @ref RCC_PERIPHCLK_SDADC SDADC peripheral clock + * @arg @ref RCC_PERIPHCLK_CEC CEC peripheral clock + @endif + @if STM32F378xx + * @arg @ref RCC_PERIPHCLK_USART2 USART2 peripheral clock + * @arg @ref RCC_PERIPHCLK_USART3 USART3 peripheral clock + * @arg @ref RCC_PERIPHCLK_I2C2 I2C2 peripheral clock + * @arg @ref RCC_PERIPHCLK_ADC1 ADC1 peripheral clock + * @arg @ref RCC_PERIPHCLK_SDADC SDADC peripheral clock + * @arg @ref RCC_PERIPHCLK_CEC CEC peripheral clock + @endif + @if STM32F398xx + * @arg @ref RCC_PERIPHCLK_USART2 USART2 peripheral clock + * @arg @ref RCC_PERIPHCLK_USART3 USART3 peripheral clock + * @arg @ref RCC_PERIPHCLK_UART4 UART4 peripheral clock + * @arg @ref RCC_PERIPHCLK_UART5 UART5 peripheral clock + * @arg @ref RCC_PERIPHCLK_I2C2 I2C2 peripheral clock + * @arg @ref RCC_PERIPHCLK_I2C3 I2C3 peripheral clock + * @arg @ref RCC_PERIPHCLK_I2S I2S peripheral clock + * @arg @ref RCC_PERIPHCLK_ADC12 ADC12 peripheral clock + * @arg @ref RCC_PERIPHCLK_ADC34 ADC34 peripheral clock + * @arg @ref RCC_PERIPHCLK_TIM1 TIM1 peripheral clock + * @arg @ref RCC_PERIPHCLK_TIM2 TIM2 peripheral clock + * @arg @ref RCC_PERIPHCLK_TIM8 TIM8 peripheral clock + * @arg @ref RCC_PERIPHCLK_TIM15 TIM15 peripheral clock + * @arg @ref RCC_PERIPHCLK_TIM16 TIM16 peripheral clock + * @arg @ref RCC_PERIPHCLK_TIM17 TIM17 peripheral clock + * @arg @ref RCC_PERIPHCLK_TIM20 TIM20 peripheral clock + * @arg @ref RCC_PERIPHCLK_TIM34 TIM34 peripheral clock + @endif + * @retval Frequency in Hz (0: means that no available frequency for the peripheral) + */ +uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) +{ + /* frequency == 0 : means that no available frequency for the peripheral */ + uint32_t frequency = 0U; + + uint32_t srcclk = 0U; +#if defined(RCC_CFGR2_ADC1PRES) || defined(RCC_CFGR2_ADCPRE12) || defined(RCC_CFGR2_ADCPRE34) + uint16_t adc_pll_prediv_table[16] = { 1U, 2U, 4U, 6U, 8U, 10U, 12U, 16U, 32U, 64U, 128U, 256U, 256U, 256U, 256U, 256U}; +#endif /* RCC_CFGR2_ADC1PRES || RCC_CFGR2_ADCPRE12 || RCC_CFGR2_ADCPRE34 */ +#if defined(RCC_CFGR_SDPRE) + uint8_t sdadc_prescaler_table[16] = { 2U, 4U, 6U, 8U, 10U, 12U, 14U, 16U, 20U, 24U, 28U, 32U, 36U, 40U, 44U, 48U}; +#endif /* RCC_CFGR_SDPRE */ + + /* Check the parameters */ + assert_param(IS_RCC_PERIPHCLOCK(PeriphClk)); + + switch (PeriphClk) + { + case RCC_PERIPHCLK_RTC: + { + /* Get the current RTC source */ + srcclk = __HAL_RCC_GET_RTC_SOURCE(); + + /* Check if LSE is ready and if RTC clock selection is LSE */ + if ((srcclk == RCC_RTCCLKSOURCE_LSE) && (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY))) + { + frequency = LSE_VALUE; + } + /* Check if LSI is ready and if RTC clock selection is LSI */ + else if ((srcclk == RCC_RTCCLKSOURCE_LSI) && (HAL_IS_BIT_SET(RCC->CSR, RCC_CSR_LSIRDY))) + { + frequency = LSI_VALUE; + } + /* Check if HSE is ready and if RTC clock selection is HSI_DIV32*/ + else if ((srcclk == RCC_RTCCLKSOURCE_HSE_DIV32) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSERDY))) + { + frequency = HSE_VALUE / 32U; + } + break; + } + case RCC_PERIPHCLK_USART1: + { + /* Get the current USART1 source */ + srcclk = __HAL_RCC_GET_USART1_SOURCE(); + + /* Check if USART1 clock selection is PCLK1 */ +#if defined(RCC_USART1CLKSOURCE_PCLK2) + if (srcclk == RCC_USART1CLKSOURCE_PCLK2) + { + frequency = HAL_RCC_GetPCLK2Freq(); + } +#else + if (srcclk == RCC_USART1CLKSOURCE_PCLK1) + { + frequency = HAL_RCC_GetPCLK1Freq(); + } +#endif /* RCC_USART1CLKSOURCE_PCLK2 */ + /* Check if HSI is ready and if USART1 clock selection is HSI */ + else if ((srcclk == RCC_USART1CLKSOURCE_HSI) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))) + { + frequency = HSI_VALUE; + } + /* Check if USART1 clock selection is SYSCLK */ + else if (srcclk == RCC_USART1CLKSOURCE_SYSCLK) + { + frequency = HAL_RCC_GetSysClockFreq(); + } + /* Check if LSE is ready and if USART1 clock selection is LSE */ + else if ((srcclk == RCC_USART1CLKSOURCE_LSE) && (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY))) + { + frequency = LSE_VALUE; + } + break; + } +#if defined(RCC_CFGR3_USART2SW) + case RCC_PERIPHCLK_USART2: + { + /* Get the current USART2 source */ + srcclk = __HAL_RCC_GET_USART2_SOURCE(); + + /* Check if USART2 clock selection is PCLK1 */ + if (srcclk == RCC_USART2CLKSOURCE_PCLK1) + { + frequency = HAL_RCC_GetPCLK1Freq(); + } + /* Check if HSI is ready and if USART2 clock selection is HSI */ + else if ((srcclk == RCC_USART2CLKSOURCE_HSI) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))) + { + frequency = HSI_VALUE; + } + /* Check if USART2 clock selection is SYSCLK */ + else if (srcclk == RCC_USART2CLKSOURCE_SYSCLK) + { + frequency = HAL_RCC_GetSysClockFreq(); + } + /* Check if LSE is ready and if USART2 clock selection is LSE */ + else if ((srcclk == RCC_USART2CLKSOURCE_LSE) && (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY))) + { + frequency = LSE_VALUE; + } + break; + } +#endif /* RCC_CFGR3_USART2SW */ +#if defined(RCC_CFGR3_USART3SW) + case RCC_PERIPHCLK_USART3: + { + /* Get the current USART3 source */ + srcclk = __HAL_RCC_GET_USART3_SOURCE(); + + /* Check if USART3 clock selection is PCLK1 */ + if (srcclk == RCC_USART3CLKSOURCE_PCLK1) + { + frequency = HAL_RCC_GetPCLK1Freq(); + } + /* Check if HSI is ready and if USART3 clock selection is HSI */ + else if ((srcclk == RCC_USART3CLKSOURCE_HSI) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))) + { + frequency = HSI_VALUE; + } + /* Check if USART3 clock selection is SYSCLK */ + else if (srcclk == RCC_USART3CLKSOURCE_SYSCLK) + { + frequency = HAL_RCC_GetSysClockFreq(); + } + /* Check if LSE is ready and if USART3 clock selection is LSE */ + else if ((srcclk == RCC_USART3CLKSOURCE_LSE) && (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY))) + { + frequency = LSE_VALUE; + } + break; + } +#endif /* RCC_CFGR3_USART3SW */ +#if defined(RCC_CFGR3_UART4SW) + case RCC_PERIPHCLK_UART4: + { + /* Get the current UART4 source */ + srcclk = __HAL_RCC_GET_UART4_SOURCE(); + + /* Check if UART4 clock selection is PCLK1 */ + if (srcclk == RCC_UART4CLKSOURCE_PCLK1) + { + frequency = HAL_RCC_GetPCLK1Freq(); + } + /* Check if HSI is ready and if UART4 clock selection is HSI */ + else if ((srcclk == RCC_UART4CLKSOURCE_HSI) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))) + { + frequency = HSI_VALUE; + } + /* Check if UART4 clock selection is SYSCLK */ + else if (srcclk == RCC_UART4CLKSOURCE_SYSCLK) + { + frequency = HAL_RCC_GetSysClockFreq(); + } + /* Check if LSE is ready and if UART4 clock selection is LSE */ + else if ((srcclk == RCC_UART4CLKSOURCE_LSE) && (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY))) + { + frequency = LSE_VALUE; + } + break; + } +#endif /* RCC_CFGR3_UART4SW */ +#if defined(RCC_CFGR3_UART5SW) + case RCC_PERIPHCLK_UART5: + { + /* Get the current UART5 source */ + srcclk = __HAL_RCC_GET_UART5_SOURCE(); + + /* Check if UART5 clock selection is PCLK1 */ + if (srcclk == RCC_UART5CLKSOURCE_PCLK1) + { + frequency = HAL_RCC_GetPCLK1Freq(); + } + /* Check if HSI is ready and if UART5 clock selection is HSI */ + else if ((srcclk == RCC_UART5CLKSOURCE_HSI) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))) + { + frequency = HSI_VALUE; + } + /* Check if UART5 clock selection is SYSCLK */ + else if (srcclk == RCC_UART5CLKSOURCE_SYSCLK) + { + frequency = HAL_RCC_GetSysClockFreq(); + } + /* Check if LSE is ready and if UART5 clock selection is LSE */ + else if ((srcclk == RCC_UART5CLKSOURCE_LSE) && (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY))) + { + frequency = LSE_VALUE; + } + break; + } +#endif /* RCC_CFGR3_UART5SW */ + case RCC_PERIPHCLK_I2C1: + { + /* Get the current I2C1 source */ + srcclk = __HAL_RCC_GET_I2C1_SOURCE(); + + /* Check if HSI is ready and if I2C1 clock selection is HSI */ + if ((srcclk == RCC_I2C1CLKSOURCE_HSI) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))) + { + frequency = HSI_VALUE; + } + /* Check if I2C1 clock selection is SYSCLK */ + else if (srcclk == RCC_I2C1CLKSOURCE_SYSCLK) + { + frequency = HAL_RCC_GetSysClockFreq(); + } + break; + } +#if defined(RCC_CFGR3_I2C2SW) + case RCC_PERIPHCLK_I2C2: + { + /* Get the current I2C2 source */ + srcclk = __HAL_RCC_GET_I2C2_SOURCE(); + + /* Check if HSI is ready and if I2C2 clock selection is HSI */ + if ((srcclk == RCC_I2C2CLKSOURCE_HSI) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))) + { + frequency = HSI_VALUE; + } + /* Check if I2C2 clock selection is SYSCLK */ + else if (srcclk == RCC_I2C2CLKSOURCE_SYSCLK) + { + frequency = HAL_RCC_GetSysClockFreq(); + } + break; + } +#endif /* RCC_CFGR3_I2C2SW */ +#if defined(RCC_CFGR3_I2C3SW) + case RCC_PERIPHCLK_I2C3: + { + /* Get the current I2C3 source */ + srcclk = __HAL_RCC_GET_I2C3_SOURCE(); + + /* Check if HSI is ready and if I2C3 clock selection is HSI */ + if ((srcclk == RCC_I2C3CLKSOURCE_HSI) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))) + { + frequency = HSI_VALUE; + } + /* Check if I2C3 clock selection is SYSCLK */ + else if (srcclk == RCC_I2C3CLKSOURCE_SYSCLK) + { + frequency = HAL_RCC_GetSysClockFreq(); + } + break; + } +#endif /* RCC_CFGR3_I2C3SW */ +#if defined(RCC_CFGR_I2SSRC) + case RCC_PERIPHCLK_I2S: + { + /* Get the current I2S source */ + srcclk = __HAL_RCC_GET_I2S_SOURCE(); + + /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin */ + if (srcclk == RCC_I2SCLKSOURCE_EXT) + { + /* External clock used. Frequency cannot be returned.*/ + frequency = 0xDEADDEADU; + } + /* Check if I2S clock selection is SYSCLK */ + else if (srcclk == RCC_I2SCLKSOURCE_SYSCLK) + { + frequency = HAL_RCC_GetSysClockFreq(); + } + break; + } +#endif /* RCC_CFGR_I2SSRC */ +#if defined(RCC_CFGR_USBPRE) + case RCC_PERIPHCLK_USB: + { + /* Check if PLL is ready */ + if (HAL_IS_BIT_SET(RCC->CR, RCC_CR_PLLRDY)) + { + /* Get the current USB source */ + srcclk = __HAL_RCC_GET_USB_SOURCE(); + + /* Check if USB clock selection is not divided */ + if (srcclk == RCC_USBCLKSOURCE_PLL) + { + frequency = RCC_GetPLLCLKFreq(); + } + /* Check if USB clock selection is divided by 1.5 */ + else /* RCC_USBCLKSOURCE_PLL_DIV1_5 */ + { + frequency = (RCC_GetPLLCLKFreq() * 3U) / 2U; + } + } + break; + } +#endif /* RCC_CFGR_USBPRE */ +#if defined(RCC_CFGR2_ADC1PRES) || defined(RCC_CFGR_ADCPRE) + case RCC_PERIPHCLK_ADC1: + { + /* Get the current ADC1 source */ + srcclk = __HAL_RCC_GET_ADC1_SOURCE(); +#if defined(RCC_CFGR2_ADC1PRES) + /* Check if ADC1 clock selection is AHB */ + if (srcclk == RCC_ADC1PLLCLK_OFF) + { + frequency = SystemCoreClock; + } + /* PLL clock has been selected */ + else + { + /* Check if PLL is ready */ + if (HAL_IS_BIT_SET(RCC->CR, RCC_CR_PLLRDY)) + { + /* Frequency is the PLL frequency divided by ADC prescaler (1U/2U/4U/6U/8U/10U/12U/16U/32U/64U/128U/256U) */ + frequency = RCC_GetPLLCLKFreq() / adc_pll_prediv_table[(srcclk >> POSITION_VAL(RCC_CFGR2_ADC1PRES)) & 0xFU]; + } + } +#else /* RCC_CFGR_ADCPRE */ + /* ADC1 is set to PLCK2 frequency divided by 2U/4U/6U/8U */ + frequency = HAL_RCC_GetPCLK2Freq() / (((srcclk >> POSITION_VAL(RCC_CFGR_ADCPRE)) + 1U) * 2U); +#endif /* RCC_CFGR2_ADC1PRES */ + break; + } +#endif /* RCC_CFGR2_ADC1PRES || RCC_CFGR_ADCPRE */ +#if defined(RCC_CFGR2_ADCPRE12) + case RCC_PERIPHCLK_ADC12: + { + /* Get the current ADC12 source */ + srcclk = __HAL_RCC_GET_ADC12_SOURCE(); + /* Check if ADC12 clock selection is AHB */ + if (srcclk == RCC_ADC12PLLCLK_OFF) + { + frequency = SystemCoreClock; + } + /* PLL clock has been selected */ + else + { + /* Check if PLL is ready */ + if (HAL_IS_BIT_SET(RCC->CR, RCC_CR_PLLRDY)) + { + /* Frequency is the PLL frequency divided by ADC prescaler (1U/2U/4U/6/8U/10U/12U/16U/32U/64U/128U/256U) */ + frequency = RCC_GetPLLCLKFreq() / adc_pll_prediv_table[(srcclk >> POSITION_VAL(RCC_CFGR2_ADCPRE12)) & 0xF]; + } + } + break; + } +#endif /* RCC_CFGR2_ADCPRE12 */ +#if defined(RCC_CFGR2_ADCPRE34) + case RCC_PERIPHCLK_ADC34: + { + /* Get the current ADC34 source */ + srcclk = __HAL_RCC_GET_ADC34_SOURCE(); + /* Check if ADC34 clock selection is AHB */ + if (srcclk == RCC_ADC34PLLCLK_OFF) + { + frequency = SystemCoreClock; + } + /* PLL clock has been selected */ + else + { + /* Check if PLL is ready */ + if (HAL_IS_BIT_SET(RCC->CR, RCC_CR_PLLRDY)) + { + /* Frequency is the PLL frequency divided by ADC prescaler (1U/2U/4U/6U/8U/10U/12U/16U/32U/64U/128U/256U) */ + frequency = RCC_GetPLLCLKFreq() / adc_pll_prediv_table[(srcclk >> POSITION_VAL(RCC_CFGR2_ADCPRE34)) & 0xF]; + } + } + break; + } +#endif /* RCC_CFGR2_ADCPRE34 */ +#if defined(RCC_CFGR3_TIM1SW) + case RCC_PERIPHCLK_TIM1: + { + /* Get the current TIM1 source */ + srcclk = __HAL_RCC_GET_TIM1_SOURCE(); + + /* Check if PLL is ready and if TIM1 clock selection is PLL */ + if ((srcclk == RCC_TIM1CLK_PLLCLK) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_PLLRDY))) + { + frequency = RCC_GetPLLCLKFreq(); + } + /* Check if TIM1 clock selection is SYSCLK */ + else if (srcclk == RCC_TIM1CLK_HCLK) + { + frequency = SystemCoreClock; + } + break; + } +#endif /* RCC_CFGR3_TIM1SW */ +#if defined(RCC_CFGR3_TIM2SW) + case RCC_PERIPHCLK_TIM2: + { + /* Get the current TIM2 source */ + srcclk = __HAL_RCC_GET_TIM2_SOURCE(); + + /* Check if PLL is ready and if TIM2 clock selection is PLL */ + if ((srcclk == RCC_TIM2CLK_PLLCLK) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_PLLRDY))) + { + frequency = RCC_GetPLLCLKFreq(); + } + /* Check if TIM2 clock selection is SYSCLK */ + else if (srcclk == RCC_TIM2CLK_HCLK) + { + frequency = SystemCoreClock; + } + break; + } +#endif /* RCC_CFGR3_TIM2SW */ +#if defined(RCC_CFGR3_TIM8SW) + case RCC_PERIPHCLK_TIM8: + { + /* Get the current TIM8 source */ + srcclk = __HAL_RCC_GET_TIM8_SOURCE(); + + /* Check if PLL is ready and if TIM8 clock selection is PLL */ + if ((srcclk == RCC_TIM8CLK_PLLCLK) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_PLLRDY))) + { + frequency = RCC_GetPLLCLKFreq(); + } + /* Check if TIM8 clock selection is SYSCLK */ + else if (srcclk == RCC_TIM8CLK_HCLK) + { + frequency = SystemCoreClock; + } + break; + } +#endif /* RCC_CFGR3_TIM8SW */ +#if defined(RCC_CFGR3_TIM15SW) + case RCC_PERIPHCLK_TIM15: + { + /* Get the current TIM15 source */ + srcclk = __HAL_RCC_GET_TIM15_SOURCE(); + + /* Check if PLL is ready and if TIM15 clock selection is PLL */ + if ((srcclk == RCC_TIM15CLK_PLLCLK) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_PLLRDY))) + { + frequency = RCC_GetPLLCLKFreq(); + } + /* Check if TIM15 clock selection is SYSCLK */ + else if (srcclk == RCC_TIM15CLK_HCLK) + { + frequency = SystemCoreClock; + } + break; + } +#endif /* RCC_CFGR3_TIM15SW */ +#if defined(RCC_CFGR3_TIM16SW) + case RCC_PERIPHCLK_TIM16: + { + /* Get the current TIM16 source */ + srcclk = __HAL_RCC_GET_TIM16_SOURCE(); + + /* Check if PLL is ready and if TIM16 clock selection is PLL */ + if ((srcclk == RCC_TIM16CLK_PLLCLK) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_PLLRDY))) + { + frequency = RCC_GetPLLCLKFreq(); + } + /* Check if TIM16 clock selection is SYSCLK */ + else if (srcclk == RCC_TIM16CLK_HCLK) + { + frequency = SystemCoreClock; + } + break; + } +#endif /* RCC_CFGR3_TIM16SW */ +#if defined(RCC_CFGR3_TIM17SW) + case RCC_PERIPHCLK_TIM17: + { + /* Get the current TIM17 source */ + srcclk = __HAL_RCC_GET_TIM17_SOURCE(); + + /* Check if PLL is ready and if TIM17 clock selection is PLL */ + if ((srcclk == RCC_TIM17CLK_PLLCLK) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_PLLRDY))) + { + frequency = RCC_GetPLLCLKFreq(); + } + /* Check if TIM17 clock selection is SYSCLK */ + else if (srcclk == RCC_TIM17CLK_HCLK) + { + frequency = SystemCoreClock; + } + break; + } +#endif /* RCC_CFGR3_TIM17SW */ +#if defined(RCC_CFGR3_TIM20SW) + case RCC_PERIPHCLK_TIM20: + { + /* Get the current TIM20 source */ + srcclk = __HAL_RCC_GET_TIM20_SOURCE(); + + /* Check if PLL is ready and if TIM20 clock selection is PLL */ + if ((srcclk == RCC_TIM20CLK_PLLCLK) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_PLLRDY))) + { + frequency = RCC_GetPLLCLKFreq(); + } + /* Check if TIM20 clock selection is SYSCLK */ + else if (srcclk == RCC_TIM20CLK_HCLK) + { + frequency = SystemCoreClock; + } + break; + } +#endif /* RCC_CFGR3_TIM20SW */ +#if defined(RCC_CFGR3_TIM34SW) + case RCC_PERIPHCLK_TIM34: + { + /* Get the current TIM34 source */ + srcclk = __HAL_RCC_GET_TIM34_SOURCE(); + + /* Check if PLL is ready and if TIM34 clock selection is PLL */ + if ((srcclk == RCC_TIM34CLK_PLLCLK) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_PLLRDY))) + { + frequency = RCC_GetPLLCLKFreq(); + } + /* Check if TIM34 clock selection is SYSCLK */ + else if (srcclk == RCC_TIM34CLK_HCLK) + { + frequency = SystemCoreClock; + } + break; + } +#endif /* RCC_CFGR3_TIM34SW */ +#if defined(RCC_CFGR3_HRTIM1SW) + case RCC_PERIPHCLK_HRTIM1: + { + /* Get the current HRTIM1 source */ + srcclk = __HAL_RCC_GET_HRTIM1_SOURCE(); + + /* Check if PLL is ready and if HRTIM1 clock selection is PLL */ + if ((srcclk == RCC_HRTIM1CLK_PLLCLK) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_PLLRDY))) + { + frequency = RCC_GetPLLCLKFreq(); + } + /* Check if HRTIM1 clock selection is SYSCLK */ + else if (srcclk == RCC_HRTIM1CLK_HCLK) + { + frequency = SystemCoreClock; + } + break; + } +#endif /* RCC_CFGR3_HRTIM1SW */ +#if defined(RCC_CFGR_SDPRE) + case RCC_PERIPHCLK_SDADC: + { + /* Get the current SDADC source */ + srcclk = __HAL_RCC_GET_SDADC_SOURCE(); + /* Frequency is the system frequency divided by SDADC prescaler (2U/4U/6U/8U/10U/12U/14U/16U/20U/24U/28U/32U/36U/40U/44U/48U) */ + frequency = SystemCoreClock / sdadc_prescaler_table[(srcclk >> POSITION_VAL(RCC_CFGR_SDPRE)) & 0xF]; + break; + } +#endif /* RCC_CFGR_SDPRE */ +#if defined(RCC_CFGR3_CECSW) + case RCC_PERIPHCLK_CEC: + { + /* Get the current CEC source */ + srcclk = __HAL_RCC_GET_CEC_SOURCE(); + + /* Check if HSI is ready and if CEC clock selection is HSI */ + if ((srcclk == RCC_CECCLKSOURCE_HSI) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))) + { + frequency = HSI_VALUE; + } + /* Check if LSE is ready and if CEC clock selection is LSE */ + else if ((srcclk == RCC_CECCLKSOURCE_LSE) && (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY))) + { + frequency = LSE_VALUE; + } + break; + } +#endif /* RCC_CFGR3_CECSW */ + default: + { + break; + } + } + return(frequency); +} + +/** + * @} + */ + +/** + * @} + */ + + +#if defined(RCC_CFGR2_ADC1PRES) || defined(RCC_CFGR2_ADCPRE12) || defined(RCC_CFGR2_ADCPRE34) || defined(RCC_CFGR_USBPRE) \ + || defined(RCC_CFGR3_TIM1SW) || defined(RCC_CFGR3_TIM2SW) || defined(RCC_CFGR3_TIM8SW) || defined(RCC_CFGR3_TIM15SW) \ + || defined(RCC_CFGR3_TIM16SW) || defined(RCC_CFGR3_TIM17SW) || defined(RCC_CFGR3_TIM20SW) || defined(RCC_CFGR3_TIM34SW) \ + || defined(RCC_CFGR3_HRTIM1SW) + +/** @addtogroup RCCEx_Private_Functions + * @{ + */ +static uint32_t RCC_GetPLLCLKFreq(void) +{ + uint32_t pllmul = 0U, pllsource = 0U, prediv = 0U, pllclk = 0U; + + pllmul = RCC->CFGR & RCC_CFGR_PLLMUL; + pllmul = ( pllmul >> 18U) + 2U; + pllsource = RCC->CFGR & RCC_CFGR_PLLSRC; +#if defined(RCC_CFGR_PLLSRC_HSI_DIV2) + if (pllsource != RCC_PLLSOURCE_HSI) + { + prediv = (RCC->CFGR2 & RCC_CFGR2_PREDIV) + 1U; + /* HSE used as PLL clock source : PLLCLK = HSE/PREDIV * PLLMUL */ + pllclk = (HSE_VALUE/prediv) * pllmul; + } + else + { + /* HSI used as PLL clock source : PLLCLK = HSI/2U * PLLMUL */ + pllclk = (HSI_VALUE >> 1U) * pllmul; + } +#else + prediv = (RCC->CFGR2 & RCC_CFGR2_PREDIV) + 1U; + if (pllsource == RCC_CFGR_PLLSRC_HSE_PREDIV) + { + /* HSE used as PLL clock source : PLLCLK = HSE/PREDIV * PLLMUL */ + pllclk = (HSE_VALUE/prediv) * pllmul; + } + else + { + /* HSI used as PLL clock source : PLLCLK = HSI/PREDIV * PLLMUL */ + pllclk = (HSI_VALUE/prediv) * pllmul; + } +#endif /* RCC_CFGR_PLLSRC_HSI_DIV2 */ + + return pllclk; +} +/** + * @} + */ + +#endif /* RCC_CFGR2_ADC1PRES || RCC_CFGR2_ADCPRExx || RCC_CFGR3_TIMxSW || RCC_CFGR3_HRTIM1SW || RCC_CFGR_USBPRE */ + +/** + * @} + */ + +#endif /* HAL_RCC_MODULE_ENABLED */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c new file mode 100644 index 0000000..5d270f8 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c @@ -0,0 +1,4458 @@ +/** + ****************************************************************************** + * @file stm32f3xx_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 + * + @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/4 | Fpclk/8 | NA | NA | NA | NA | + | X |----------------|----------|----------|-----------|----------|-----------|----------| + | / | Interrupt | Fpclk/4 | Fpclk/16 | NA | NA | NA | NA | + | R |----------------|----------|----------|-----------|----------|-----------|----------| + | X | DMA | Fpclk/2 | Fpclk/2 | NA | NA | NA | NA | + |=========|================|==========|==========|===========|==========|===========|==========| + | | Polling | Fpclk/4 | Fpclk/8 | Fpclk/16 | Fpclk/8 | Fpclk/8 | Fpclk/8 | + | |----------------|----------|----------|-----------|----------|-----------|----------| + | R | Interrupt | Fpclk/8 | Fpclk/16 | Fpclk/8 | Fpclk/8 | Fpclk/8 | Fpclk/4 | + | X |----------------|----------|----------|-----------|----------|-----------|----------| + | | DMA | Fpclk/4 | Fpclk/2 | Fpclk/2 | Fpclk/16 | Fpclk/2 | Fpclk/16 | + |=========|================|==========|==========|===========|==========|===========|==========| + | | Polling | Fpclk/8 | Fpclk/2 | NA | NA | Fpclk/8 | Fpclk/8 | + | |----------------|----------|----------|-----------|----------|-----------|----------| + | T | Interrupt | Fpclk/2 | Fpclk/4 | NA | NA | Fpclk/16 | Fpclk/8 | + | X |----------------|----------|----------|-----------|----------|-----------|----------| + | | DMA | Fpclk/2 | Fpclk/2 | NA | NA | Fpclk/8 | Fpclk/16 | + +----------------------------------------------------------------------------------------------+ + + DataSize = SPI_DATASIZE_16BIT: + +----------------------------------------------------------------------------------------------+ + | | | 2Lines Fullduplex | 2Lines RxOnly | 1Line | + | Process | Transfer mode |---------------------|----------------------|----------------------| + | | | Master | Slave | Master | Slave | Master | Slave | + |==============================================================================================| + | T | Polling | Fpclk/4 | Fpclk/8 | NA | NA | NA | NA | + | X |----------------|----------|----------|-----------|----------|-----------|----------| + | / | Interrupt | Fpclk/4 | Fpclk/16 | NA | NA | NA | NA | + | R |----------------|----------|----------|-----------|----------|-----------|----------| + | X | DMA | Fpclk/2 | Fpclk/2 | NA | NA | NA | NA | + |=========|================|==========|==========|===========|==========|===========|==========| + | | Polling | Fpclk/4 | Fpclk/8 | Fpclk/16 | Fpclk/8 | Fpclk/8 | Fpclk/8 | + | |----------------|----------|----------|-----------|----------|-----------|----------| + | R | Interrupt | Fpclk/8 | Fpclk/16 | Fpclk/8 | Fpclk/8 | Fpclk/8 | Fpclk/4 | + | X |----------------|----------|----------|-----------|----------|-----------|----------| + | | DMA | Fpclk/4 | Fpclk/2 | Fpclk/2 | Fpclk/16 | Fpclk/2 | Fpclk/16 | + |=========|================|==========|==========|===========|==========|===========|==========| + | | Polling | Fpclk/8 | Fpclk/2 | NA | NA | Fpclk/8 | Fpclk/8 | + | |----------------|----------|----------|-----------|----------|-----------|----------| + | T | Interrupt | Fpclk/2 | Fpclk/4 | NA | NA | Fpclk/16 | Fpclk/8 | + | X |----------------|----------|----------|-----------|----------|-----------|----------| + | | DMA | Fpclk/2 | Fpclk/2 | NA | NA | Fpclk/8 | Fpclk/16 | + +----------------------------------------------------------------------------------------------+ + @note The max SPI frequency depend on SPI data size (4bits, 5bits,..., 8bits,...15bits, 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() + + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f3xx_hal.h" + +/** @addtogroup STM32F3xx_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 +/** + * @} + */ + +/* 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 HAL_StatusTypeDef SPI_WaitFifoStateUntilTimeout(SPI_HandleTypeDef *hspi, uint32_t Fifo, uint32_t 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 + (++) CRC Length, used only with Data8 and Data16 + (++) FIFO reception threshold + + (+) 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) +{ + uint32_t frxth; + + /* 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_NSSP(hspi->Init.NSSPMode)); + 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)); + assert_param(IS_SPI_CRC_LENGTH(hspi->Init.CRCLength)); + } +#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); + + /* Align by default the rs fifo threshold on the data size */ + if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) + { + frxth = SPI_RXFIFO_THRESHOLD_HF; + } + else + { + frxth = SPI_RXFIFO_THRESHOLD_QF; + } + + /* CRC calculation is valid only for 16Bit and 8 Bit */ + if ((hspi->Init.DataSize != SPI_DATASIZE_16BIT) && (hspi->Init.DataSize != SPI_DATASIZE_8BIT)) + { + /* CRC must be disabled */ + hspi->Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + } + + /*----------------------- SPIx CR1 & CR2 Configuration ---------------------*/ + /* Configure : SPI Mode, Communication Mode, 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.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))); +#if (USE_SPI_CRC != 0U) + /*---------------------------- SPIx CRCL Configuration -------------------*/ + if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + { + /* Align the CRC Length on the data size */ + if (hspi->Init.CRCLength == SPI_CRC_LENGTH_DATASIZE) + { + /* CRC Length aligned on the data size : value set by default */ + if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) + { + hspi->Init.CRCLength = SPI_CRC_LENGTH_16BIT; + } + else + { + hspi->Init.CRCLength = SPI_CRC_LENGTH_8BIT; + } + } + + /* Configure : CRC Length */ + if (hspi->Init.CRCLength == SPI_CRC_LENGTH_16BIT) + { + SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCL); + } + } +#endif /* USE_SPI_CRC */ + + /* Configure : NSS management, TI Mode, NSS Pulse, Data size and Rx Fifo threshold */ + WRITE_REG(hspi->Instance->CR2, (((hspi->Init.NSS >> 16U) & SPI_CR2_SSOE) | + (hspi->Init.TIMode & SPI_CR2_FRF) | + (hspi->Init.NSSPMode & SPI_CR2_NSSP) | + (hspi->Init.DataSize & SPI_CR2_DS_Msk) | + (frxth & SPI_CR2_FRXTH))); + +#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 + * @param Size amount of data to be sent + * @param Timeout Timeout duration + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout) +{ + uint32_t tickstart; + HAL_StatusTypeDef errorcode = HAL_OK; + uint16_t initial_TxXferCount; + + /* Check Direction parameter */ + assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE(hspi->Init.Direction)); + + /* Process Locked */ + __HAL_LOCK(hspi); + + /* Init tickstart for timeout management*/ + tickstart = HAL_GetTick(); + initial_TxXferCount = Size; + + if (hspi->State != HAL_SPI_STATE_READY) + { + errorcode = HAL_BUSY; + goto error; + } + + if ((pData == NULL) || (Size == 0U)) + { + errorcode = HAL_ERROR; + goto error; + } + + /* Set the transaction information */ + hspi->State = HAL_SPI_STATE_BUSY_TX; + hspi->ErrorCode = HAL_SPI_ERROR_NONE; + hspi->pTxBuffPtr = (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_8BIT) + { + if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U)) + { + hspi->Instance->DR = *((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 = *((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)) + { + errorcode = HAL_TIMEOUT; + goto error; + } + } + } + } + /* Transmit data in 8 Bit mode */ + else + { + if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U)) + { + if (hspi->TxXferCount > 1U) + { + /* write on the data register in packing mode */ + hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr); + hspi->pTxBuffPtr += sizeof(uint16_t); + hspi->TxXferCount -= 2U; + } + else + { + *((__IO uint8_t *)&hspi->Instance->DR) = (*hspi->pTxBuffPtr); + hspi->pTxBuffPtr ++; + hspi->TxXferCount--; + } + } + while (hspi->TxXferCount > 0U) + { + /* Wait until TXE flag is set to send data */ + if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE)) + { + if (hspi->TxXferCount > 1U) + { + /* write on the data register in packing mode */ + hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr); + hspi->pTxBuffPtr += sizeof(uint16_t); + hspi->TxXferCount -= 2U; + } + else + { + *((__IO uint8_t *)&hspi->Instance->DR) = (*hspi->pTxBuffPtr); + hspi->pTxBuffPtr++; + hspi->TxXferCount--; + } + } + else + { + /* Timeout management */ + if ((((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout == 0U)) + { + errorcode = HAL_TIMEOUT; + goto error; + } + } + } + } +#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); + } + + if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) + { + errorcode = HAL_ERROR; + } + +error: + hspi->State = HAL_SPI_STATE_READY; + /* Process Unlocked */ + __HAL_UNLOCK(hspi); + return errorcode; +} + +/** + * @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 + * @param Size amount of data to be received + * @param Timeout Timeout duration + * @retval HAL status + */ +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; + __IO uint8_t * ptmpreg8; + __IO uint8_t tmpreg8 = 0; +#endif /* USE_SPI_CRC */ + uint32_t tickstart; + HAL_StatusTypeDef errorcode = HAL_OK; + + 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); + } + + /* Process Locked */ + __HAL_LOCK(hspi); + + /* Init tickstart for timeout management*/ + tickstart = HAL_GetTick(); + + if (hspi->State != HAL_SPI_STATE_READY) + { + errorcode = HAL_BUSY; + goto error; + } + + if ((pData == NULL) || (Size == 0U)) + { + errorcode = HAL_ERROR; + goto error; + } + + /* 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 */ + + /* Set the Rx Fifo threshold */ + if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) + { + /* Set RX Fifo threshold according the reception data length: 16bit */ + CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); + } + else + { + /* Set RX Fifo threshold according the reception data length: 8bit */ + SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); + } + + /* 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)) + { + errorcode = HAL_TIMEOUT; + goto error; + } + } + } + } + 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)) + { + errorcode = HAL_TIMEOUT; + goto error; + } + } + } + } + +#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 */ + errorcode = HAL_TIMEOUT; + goto error; + } + + /* Receive last data in 16 Bit mode */ + if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) + { + *((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); + errorcode = HAL_TIMEOUT; + goto error; + } + + /* Read CRC to Flush DR and RXNE flag */ + if (hspi->Init.DataSize == SPI_DATASIZE_16BIT) + { + /* Read 16bit CRC */ + tmpreg = READ_REG(hspi->Instance->DR); + /* To avoid GCC warning */ + UNUSED(tmpreg); + } + else + { + /* Initialize the 8bit temporary pointer */ + ptmpreg8 = (__IO uint8_t *)&hspi->Instance->DR; + /* Read 8bit CRC */ + tmpreg8 = *ptmpreg8; + /* To avoid GCC warning */ + UNUSED(tmpreg8); + + if ((hspi->Init.DataSize == SPI_DATASIZE_8BIT) && (hspi->Init.CRCLength == SPI_CRC_LENGTH_16BIT)) + { + 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); + errorcode = HAL_TIMEOUT; + goto error; + } + /* Read 8bit CRC again in case of 16bit CRC in 8bit Data mode */ + tmpreg8 = *ptmpreg8; + /* To avoid GCC warning */ + UNUSED(tmpreg8); + } + } + } +#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 */ + + if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) + { + errorcode = HAL_ERROR; + } + +error : + hspi->State = HAL_SPI_STATE_READY; + __HAL_UNLOCK(hspi); + return errorcode; +} + +/** + * @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 + * @param pRxData pointer to reception data buffer + * @param Size amount of data to be sent and received + * @param Timeout Timeout duration + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, + uint32_t Timeout) +{ + uint16_t initial_TxXferCount; + uint16_t initial_RxXferCount; + uint32_t tmp_mode; + HAL_SPI_StateTypeDef tmp_state; + uint32_t tickstart; +#if (USE_SPI_CRC != 0U) + __IO uint32_t tmpreg = 0U; + uint32_t spi_cr1; + uint32_t spi_cr2; + __IO uint8_t * ptmpreg8; + __IO uint8_t tmpreg8 = 0; +#endif /* USE_SPI_CRC */ + + /* Variable used to alternate Rx and Tx during transfer */ + uint32_t txallowed = 1U; + HAL_StatusTypeDef errorcode = HAL_OK; + + /* Check Direction parameter */ + assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction)); + + /* Process Locked */ + __HAL_LOCK(hspi); + + /* Init tickstart for timeout management*/ + tickstart = HAL_GetTick(); + + /* Init temporary variables */ + tmp_state = hspi->State; + tmp_mode = hspi->Init.Mode; + initial_TxXferCount = Size; + initial_RxXferCount = Size; +#if (USE_SPI_CRC != 0U) + spi_cr1 = READ_REG(hspi->Instance->CR1); + spi_cr2 = READ_REG(hspi->Instance->CR2); +#endif /* USE_SPI_CRC */ + + 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)))) + { + errorcode = HAL_BUSY; + goto error; + } + + if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U)) + { + errorcode = HAL_ERROR; + goto error; + } + + /* 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 = (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 */ + + /* Set the Rx Fifo threshold */ + if ((hspi->Init.DataSize > SPI_DATASIZE_8BIT) || (initial_RxXferCount > 1U)) + { + /* Set fiforxthreshold according the reception data length: 16bit */ + CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); + } + else + { + /* Set fiforxthreshold according the reception data length: 8bit */ + SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); + } + + /* 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_8BIT) + { + if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U)) + { + hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr); + hspi->pTxBuffPtr += sizeof(uint16_t); + hspi->TxXferCount--; + } + 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 = *((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 NSS Soft to received correctly the CRC on slave mode with NSS pulse activated */ + if ((READ_BIT(spi_cr1, SPI_CR1_MSTR) == 0U) && (READ_BIT(spi_cr2, SPI_CR2_NSSP) == SPI_CR2_NSSP)) + { + SET_BIT(hspi->Instance->CR1, SPI_CR1_SSM); + } + 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)) + { + errorcode = HAL_TIMEOUT; + goto error; + } + } + } + /* Transmit and Receive data in 8 Bit mode */ + else + { + if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U)) + { + if (hspi->TxXferCount > 1U) + { + hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr); + hspi->pTxBuffPtr += sizeof(uint16_t); + hspi->TxXferCount -= 2U; + } + else + { + *(__IO uint8_t *)&hspi->Instance->DR = (*hspi->pTxBuffPtr); + hspi->pTxBuffPtr++; + hspi->TxXferCount--; + } + } + while ((hspi->TxXferCount > 0U) || (hspi->RxXferCount > 0U)) + { + /* Check TXE flag */ + if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE)) && (hspi->TxXferCount > 0U) && (txallowed == 1U)) + { + if (hspi->TxXferCount > 1U) + { + hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr); + hspi->pTxBuffPtr += sizeof(uint16_t); + hspi->TxXferCount -= 2U; + } + else + { + *(__IO uint8_t *)&hspi->Instance->DR = (*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 NSS Soft to received correctly the CRC on slave mode with NSS pulse activated */ + if ((READ_BIT(spi_cr1, SPI_CR1_MSTR) == 0U) && (READ_BIT(spi_cr2, SPI_CR2_NSSP) == SPI_CR2_NSSP)) + { + SET_BIT(hspi->Instance->CR1, SPI_CR1_SSM); + } + 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)) + { + if (hspi->RxXferCount > 1U) + { + *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)hspi->Instance->DR; + hspi->pRxBuffPtr += sizeof(uint16_t); + hspi->RxXferCount -= 2U; + if (hspi->RxXferCount <= 1U) + { + /* Set RX Fifo threshold before to switch on 8 bit data size */ + SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); + } + } + else + { + (*(uint8_t *)hspi->pRxBuffPtr) = *(__IO uint8_t *)&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)) + { + errorcode = HAL_TIMEOUT; + goto error; + } + } + } + +#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); + errorcode = HAL_TIMEOUT; + goto error; + } + /* Read CRC */ + if (hspi->Init.DataSize == SPI_DATASIZE_16BIT) + { + /* Read 16bit CRC */ + tmpreg = READ_REG(hspi->Instance->DR); + /* To avoid GCC warning */ + UNUSED(tmpreg); + } + else + { + /* Initialize the 8bit temporary pointer */ + ptmpreg8 = (__IO uint8_t *)&hspi->Instance->DR; + /* Read 8bit CRC */ + tmpreg8 = *ptmpreg8; + /* To avoid GCC warning */ + UNUSED(tmpreg8); + + if (hspi->Init.CRCLength == SPI_CRC_LENGTH_16BIT) + { + 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); + errorcode = HAL_TIMEOUT; + goto error; + } + /* Read 8bit CRC again in case of 16bit CRC in 8bit Data mode */ + tmpreg8 = *ptmpreg8; + /* To avoid GCC warning */ + UNUSED(tmpreg8); + } + } + } + + /* 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); + + errorcode = HAL_ERROR; + } +#endif /* USE_SPI_CRC */ + + /* Check the end of the transaction */ + if (SPI_EndRxTxTransaction(hspi, Timeout, tickstart) != HAL_OK) + { + errorcode = HAL_ERROR; + hspi->ErrorCode = HAL_SPI_ERROR_FLAG; + } + +error : + hspi->State = HAL_SPI_STATE_READY; + __HAL_UNLOCK(hspi); + return errorcode; +} + +/** + * @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 + * @param Size amount of data to be sent + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPI_Transmit_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size) +{ + HAL_StatusTypeDef errorcode = HAL_OK; + + /* Check Direction parameter */ + assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE(hspi->Init.Direction)); + + /* Process Locked */ + __HAL_LOCK(hspi); + + if ((pData == NULL) || (Size == 0U)) + { + errorcode = HAL_ERROR; + goto error; + } + + if (hspi->State != HAL_SPI_STATE_READY) + { + errorcode = HAL_BUSY; + goto error; + } + + /* Set the transaction information */ + hspi->State = HAL_SPI_STATE_BUSY_TX; + hspi->ErrorCode = HAL_SPI_ERROR_NONE; + hspi->pTxBuffPtr = (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 */ + + /* Enable TXE and ERR interrupt */ + __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_ERR)); + + + /* Check if the SPI is already enabled */ + if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) + { + /* Enable SPI peripheral */ + __HAL_SPI_ENABLE(hspi); + } + +error : + __HAL_UNLOCK(hspi); + return errorcode; +} + +/** + * @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 + * @param Size amount of data to be sent + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPI_Receive_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size) +{ + HAL_StatusTypeDef errorcode = HAL_OK; + + 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); + + if (hspi->State != HAL_SPI_STATE_READY) + { + errorcode = HAL_BUSY; + goto error; + } + + if ((pData == NULL) || (Size == 0U)) + { + errorcode = HAL_ERROR; + goto error; + } + + /* 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; + + /* Check the data size to adapt Rx threshold and the set the function for IT treatment */ + if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) + { + /* Set RX Fifo threshold according the reception data length: 16 bit */ + CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); + hspi->RxISR = SPI_RxISR_16BIT; + } + else + { + /* Set RX Fifo threshold according the reception data length: 8 bit */ + SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); + 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) + { + hspi->CRCSize = 1U; + if ((hspi->Init.DataSize <= SPI_DATASIZE_8BIT) && (hspi->Init.CRCLength == SPI_CRC_LENGTH_16BIT)) + { + hspi->CRCSize = 2U; + } + SPI_RESET_CRC(hspi); + } + else + { + hspi->CRCSize = 0U; + } +#endif /* USE_SPI_CRC */ + + /* Enable TXE and ERR interrupt */ + __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR)); + + /* 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); + } + +error : + /* Process Unlocked */ + __HAL_UNLOCK(hspi); + return errorcode; +} + +/** + * @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 + * @param pRxData pointer to reception data buffer + * @param Size amount of data to be sent and received + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPI_TransmitReceive_IT(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size) +{ + uint32_t tmp_mode; + HAL_SPI_StateTypeDef tmp_state; + HAL_StatusTypeDef errorcode = HAL_OK; + + /* Check Direction parameter */ + assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction)); + + /* Process locked */ + __HAL_LOCK(hspi); + + /* 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)))) + { + errorcode = HAL_BUSY; + goto error; + } + + if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U)) + { + errorcode = HAL_ERROR; + goto error; + } + + /* 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 = (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) + { + hspi->CRCSize = 1U; + if ((hspi->Init.DataSize <= SPI_DATASIZE_8BIT) && (hspi->Init.CRCLength == SPI_CRC_LENGTH_16BIT)) + { + hspi->CRCSize = 2U; + } + SPI_RESET_CRC(hspi); + } + else + { + hspi->CRCSize = 0U; + } +#endif /* USE_SPI_CRC */ + + /* Check if packing mode is enabled and if there is more than 2 data to receive */ + if ((hspi->Init.DataSize > SPI_DATASIZE_8BIT) || (Size >= 2U)) + { + /* Set RX Fifo threshold according the reception data length: 16 bit */ + CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); + } + else + { + /* Set RX Fifo threshold according the reception data length: 8 bit */ + SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); + } + + /* Enable TXE, RXNE and ERR interrupt */ + __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_RXNE | SPI_IT_ERR)); + + /* Check if the SPI is already enabled */ + if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) + { + /* Enable SPI peripheral */ + __HAL_SPI_ENABLE(hspi); + } + +error : + /* Process Unlocked */ + __HAL_UNLOCK(hspi); + return errorcode; +} + +/** + * @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 + * @param Size amount of data to be sent + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPI_Transmit_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size) +{ + HAL_StatusTypeDef errorcode = HAL_OK; + + /* 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)); + + /* Process Locked */ + __HAL_LOCK(hspi); + + if (hspi->State != HAL_SPI_STATE_READY) + { + errorcode = HAL_BUSY; + goto error; + } + + if ((pData == NULL) || (Size == 0U)) + { + errorcode = HAL_ERROR; + goto error; + } + + /* Set the transaction information */ + hspi->State = HAL_SPI_STATE_BUSY_TX; + hspi->ErrorCode = HAL_SPI_ERROR_NONE; + hspi->pTxBuffPtr = (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; + + CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMATX); + /* Packing mode is enabled only if the DMA setting is HALWORD */ + if ((hspi->Init.DataSize <= SPI_DATASIZE_8BIT) && (hspi->hdmatx->Init.MemDataAlignment == DMA_MDATAALIGN_HALFWORD)) + { + /* Check the even/odd of the data size + crc if enabled */ + if ((hspi->TxXferCount & 0x1U) == 0U) + { + CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMATX); + hspi->TxXferCount = (hspi->TxXferCount >> 1U); + } + else + { + SET_BIT(hspi->Instance->CR2, SPI_CR2_LDMATX); + hspi->TxXferCount = (hspi->TxXferCount >> 1U) + 1U; + } + } + + /* 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); + errorcode = HAL_ERROR; + + hspi->State = HAL_SPI_STATE_READY; + goto 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); + } + + /* 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); + +error : + /* Process Unlocked */ + __HAL_UNLOCK(hspi); + return errorcode; +} + +/** + * @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 + * @note When the CRC feature is enabled the pData Length must be Size + 1. + * @param Size amount of data to be sent + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPI_Receive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size) +{ + HAL_StatusTypeDef errorcode = HAL_OK; + + /* Check rx dma handle */ + assert_param(IS_SPI_DMA_HANDLE(hspi->hdmarx)); + + 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); + + if (hspi->State != HAL_SPI_STATE_READY) + { + errorcode = HAL_BUSY; + goto error; + } + + if ((pData == NULL) || (Size == 0U)) + { + errorcode = HAL_ERROR; + goto error; + } + + /* 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 */ + +#if defined (STM32F302xC) || defined (STM32F303xC) || defined (STM32F373xC) || defined (STM32F358xx) || defined (STM32F378xx) + /* Packing mode management is enabled by the DMA settings */ + if ((hspi->Init.DataSize <= SPI_DATASIZE_8BIT) && (hspi->hdmarx->Init.MemDataAlignment == DMA_MDATAALIGN_HALFWORD)) + { + /* Restriction the DMA data received is not allowed in this mode */ + errorcode = HAL_ERROR; + goto error; + } +#endif /* STM32F302xC || STM32F303xC || STM32F373xC || STM32F358xx || STM32F378xx */ + + CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMARX); + if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) + { + /* Set RX Fifo threshold according the reception data length: 16bit */ + CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); + } + else + { + /* Set RX Fifo threshold according the reception data length: 8bit */ + SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); + + if (hspi->hdmarx->Init.MemDataAlignment == DMA_MDATAALIGN_HALFWORD) + { + /* Set RX Fifo threshold according the reception data length: 16bit */ + CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); + + if ((hspi->RxXferCount & 0x1U) == 0x0U) + { + CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMARX); + hspi->RxXferCount = hspi->RxXferCount >> 1U; + } + else + { + SET_BIT(hspi->Instance->CR2, SPI_CR2_LDMARX); + hspi->RxXferCount = (hspi->RxXferCount >> 1U) + 1U; + } + } + } + + /* 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); + errorcode = HAL_ERROR; + + hspi->State = HAL_SPI_STATE_READY; + goto 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); + } + + /* 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); + +error: + /* Process Unlocked */ + __HAL_UNLOCK(hspi); + return errorcode; +} + +/** + * @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 + * @param pRxData pointer to reception data buffer + * @note When the CRC feature is enabled the pRxData Length must be Size + 1 + * @param Size amount of data to be sent + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPI_TransmitReceive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, + uint16_t Size) +{ + uint32_t tmp_mode; + HAL_SPI_StateTypeDef tmp_state; + HAL_StatusTypeDef errorcode = HAL_OK; + + /* 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)); + + /* Process locked */ + __HAL_LOCK(hspi); + + /* 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)))) + { + errorcode = HAL_BUSY; + goto error; + } + + if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U)) + { + errorcode = HAL_ERROR; + goto error; + } + + /* 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 = (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 */ + +#if defined (STM32F302xC) || defined (STM32F303xC) || defined (STM32F373xC) || defined (STM32F358xx) || defined (STM32F378xx) + /* Packing mode management is enabled by the DMA settings */ + if ((hspi->Init.DataSize <= SPI_DATASIZE_8BIT) && (hspi->hdmarx->Init.MemDataAlignment == DMA_MDATAALIGN_HALFWORD)) + { + /* Restriction the DMA data received is not allowed in this mode */ + errorcode = HAL_ERROR; + goto error; + } +#endif /* STM32F302xC || STM32F303xC || STM32F373xC || STM32F358xx || STM32F378xx */ + + /* Reset the threshold bit */ + CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMATX | SPI_CR2_LDMARX); + + /* The packing mode management is enabled by the DMA settings according the spi data size */ + if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) + { + /* Set fiforxthreshold according the reception data length: 16bit */ + CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); + } + else + { + /* Set RX Fifo threshold according the reception data length: 8bit */ + SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); + + if (hspi->hdmatx->Init.MemDataAlignment == DMA_MDATAALIGN_HALFWORD) + { + if ((hspi->TxXferSize & 0x1U) == 0x0U) + { + CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMATX); + hspi->TxXferCount = hspi->TxXferCount >> 1U; + } + else + { + SET_BIT(hspi->Instance->CR2, SPI_CR2_LDMATX); + hspi->TxXferCount = (hspi->TxXferCount >> 1U) + 1U; + } + } + + if (hspi->hdmarx->Init.MemDataAlignment == DMA_MDATAALIGN_HALFWORD) + { + /* Set RX Fifo threshold according the reception data length: 16bit */ + CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); + + if ((hspi->RxXferCount & 0x1U) == 0x0U) + { + CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMARX); + hspi->RxXferCount = hspi->RxXferCount >> 1U; + } + else + { + SET_BIT(hspi->Instance->CR2, SPI_CR2_LDMARX); + hspi->RxXferCount = (hspi->RxXferCount >> 1U) + 1U; + } + } + } + + /* 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); + errorcode = HAL_ERROR; + + hspi->State = HAL_SPI_STATE_READY; + goto 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); + errorcode = HAL_ERROR; + + hspi->State = HAL_SPI_STATE_READY; + goto 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); + } + /* 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); + +error : + /* Process Unlocked */ + __HAL_UNLOCK(hspi); + return errorcode; +} + +/** + * @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)); + + if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK) + { + hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + } + + /* Disable SPI Peripheral */ + __HAL_SPI_DISABLE(hspi); + + /* Empty the FRLVL fifo */ + if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK) + { + hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + } + } + } + + /* 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); + + /* Control the BSY flag */ + if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_BSY, RESET, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK) + { + hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + } + + /* Empty the FRLVL fifo */ + if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK) + { + hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + } + + /* 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(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(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); /* Derogation MISRAC2012-Rule-11.5 */ + uint32_t tickstart; + + /* Init tickstart for timeout management*/ + tickstart = HAL_GetTick(); + + /* DMA Normal Mode */ + if ((hdma->Instance->CCR & DMA_CCR_CIRC) != DMA_CCR_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); /* Derogation MISRAC2012-Rule-11.5 */ + uint32_t tickstart; +#if (USE_SPI_CRC != 0U) + __IO uint32_t tmpreg = 0U; + __IO uint8_t * ptmpreg8; + __IO uint8_t tmpreg8 = 0; +#endif /* USE_SPI_CRC */ + + /* Init tickstart for timeout management*/ + tickstart = HAL_GetTick(); + + /* DMA Normal Mode */ + if ((hdma->Instance->CCR & DMA_CCR_CIRC) != DMA_CCR_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 */ + if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) + { + /* Read 16bit CRC */ + tmpreg = READ_REG(hspi->Instance->DR); + /* To avoid GCC warning */ + UNUSED(tmpreg); + } + else + { + /* Initialize the 8bit temporary pointer */ + ptmpreg8 = (__IO uint8_t *)&hspi->Instance->DR; + /* Read 8bit CRC */ + tmpreg8 = *ptmpreg8; + /* To avoid GCC warning */ + UNUSED(tmpreg8); + + if (hspi->Init.CRCLength == SPI_CRC_LENGTH_16BIT) + { + 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 8bit CRC again in case of 16bit CRC in 8bit Data mode */ + tmpreg8 = *ptmpreg8; + /* To avoid GCC warning */ + UNUSED(tmpreg8); + } + } + } +#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); /* Derogation MISRAC2012-Rule-11.5 */ + uint32_t tickstart; +#if (USE_SPI_CRC != 0U) + __IO uint32_t tmpreg = 0U; + __IO uint8_t * ptmpreg8; + __IO uint8_t tmpreg8 = 0; +#endif /* USE_SPI_CRC */ + + /* Init tickstart for timeout management*/ + tickstart = HAL_GetTick(); + + /* DMA Normal Mode */ + if ((hdma->Instance->CCR & DMA_CCR_CIRC) != DMA_CCR_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) + { + if ((hspi->Init.DataSize == SPI_DATASIZE_8BIT) && (hspi->Init.CRCLength == SPI_CRC_LENGTH_8BIT)) + { + if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_QUARTER_FULL, SPI_DEFAULT_TIMEOUT, + tickstart) != HAL_OK) + { + /* Error on the CRC reception */ + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); + } + /* Initialize the 8bit temporary pointer */ + ptmpreg8 = (__IO uint8_t *)&hspi->Instance->DR; + /* Read 8bit CRC */ + tmpreg8 = *ptmpreg8; + /* To avoid GCC warning */ + UNUSED(tmpreg8); + } + else + { + if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_HALF_FULL, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK) + { + /* Error on the CRC reception */ + 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); /* Derogation MISRAC2012-Rule-11.5 */ + + /* 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); /* Derogation MISRAC2012-Rule-11.5 */ + + /* 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); /* Derogation MISRAC2012-Rule-11.5 */ + + /* 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); /* Derogation MISRAC2012-Rule-11.5 */ + + /* 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); /* Derogation MISRAC2012-Rule-11.5 */ + 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); /* Derogation MISRAC2012-Rule-11.5 */ + + hspi->hdmatx->XferAbortCallback = NULL; + + /* Disable Tx DMA Request */ + CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN); + + if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK) + { + hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + } + + /* Disable SPI Peripheral */ + __HAL_SPI_DISABLE(hspi); + + /* Empty the FRLVL fifo */ + if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK) + { + hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + } + + /* 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); /* Derogation MISRAC2012-Rule-11.5 */ + + /* Disable SPI Peripheral */ + __HAL_SPI_DISABLE(hspi); + + hspi->hdmarx->XferAbortCallback = NULL; + + /* Disable Rx DMA Request */ + CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_RXDMAEN); + + /* Control the BSY flag */ + if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_BSY, RESET, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK) + { + hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + } + + /* Empty the FRLVL fifo */ + if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK) + { + 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 packing mode */ + if (hspi->RxXferCount > 1U) + { + *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)(hspi->Instance->DR); + hspi->pRxBuffPtr += sizeof(uint16_t); + hspi->RxXferCount -= 2U; + if (hspi->RxXferCount == 1U) + { + /* Set RX Fifo threshold according the reception data length: 8bit */ + SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); + } + } + /* Receive data in 8 Bit mode */ + else + { + *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) + { + SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); + 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); + + hspi->CRCSize--; + + /* Check end of the reception */ + if (hspi->CRCSize == 0U) + { + /* 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) +{ + /* Transmit data in packing Bit mode */ + if (hspi->TxXferCount >= 2U) + { + hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr); + hspi->pTxBuffPtr += sizeof(uint16_t); + hspi->TxXferCount -= 2U; + } + /* Transmit data in 8 Bit mode */ + else + { + *(__IO uint8_t *)&hspi->Instance->DR = (*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 = *((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); + + hspi->CRCSize--; + + if (hspi->CRCSize == 0U) + { + 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 = (*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 = *((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; + } + count--; + } + } + + return HAL_OK; +} + +/** + * @brief Handle SPI FIFO Communication Timeout. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for SPI module. + * @param Fifo Fifo to check + * @param State Fifo state to check + * @param Timeout Timeout duration + * @param Tickstart tick start value + * @retval HAL status + */ +static HAL_StatusTypeDef SPI_WaitFifoStateUntilTimeout(SPI_HandleTypeDef *hspi, uint32_t Fifo, uint32_t State, + uint32_t Timeout, uint32_t Tickstart) +{ + __IO uint32_t count; + uint32_t tmp_timeout; + uint32_t tmp_tickstart; + __IO uint8_t * ptmpreg8; + __IO uint8_t tmpreg8 = 0; + + /* Adjust Timeout value in case of end of transfer */ + tmp_timeout = Timeout - (HAL_GetTick() - Tickstart); + tmp_tickstart = HAL_GetTick(); + + /* Initialize the 8bit temporary pointer */ + ptmpreg8 = (__IO uint8_t *)&hspi->Instance->DR; + + /* Calculate Timeout based on a software loop to avoid blocking issue if Systick is disabled */ + count = tmp_timeout * ((SystemCoreClock * 35U) >> 20U); + + while ((hspi->Instance->SR & Fifo) != State) + { + if ((Fifo == SPI_SR_FRLVL) && (State == SPI_FRLVL_EMPTY)) + { + /* Flush Data Register by a blank read */ + tmpreg8 = *ptmpreg8; + /* To avoid GCC warning */ + UNUSED(tmpreg8); + } + + 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; + } + 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); + } + + /* 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; + } + + if ((hspi->Init.Mode == SPI_MODE_MASTER) && ((hspi->Init.Direction == SPI_DIRECTION_1LINE) + || (hspi->Init.Direction == SPI_DIRECTION_2LINES_RXONLY))) + { + /* Empty the FRLVL fifo */ + if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, 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) +{ + /* Control if the TX fifo is empty */ + if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FTLVL, SPI_FTLVL_EMPTY, Timeout, Tickstart) != HAL_OK) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); + return HAL_TIMEOUT; + } + + /* 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; + } + + /* Control if the RX fifo is empty */ + if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, Timeout, Tickstart) != HAL_OK) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); + return HAL_TIMEOUT; + } + + 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; + + /* Init tickstart for timeout management */ + tickstart = HAL_GetTick(); + + /* Disable ERR interrupt */ + __HAL_SPI_DISABLE_IT(hspi, 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); + } + +#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); + } + 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; + + /* Init tickstart for timeout management*/ + tickstart = HAL_GetTick(); + + /* 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 count; + + /* Disable SPI Peripheral */ + __HAL_SPI_DISABLE(hspi); + + count = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U); + + /* Disable RXNEIE interrupt */ + CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_RXNEIE)); + + /* Check RXNEIE is disabled */ + do + { + if (count == 0U) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); + break; + } + count--; + } while (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXNEIE)); + + /* Control the BSY flag */ + if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_BSY, RESET, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK) + { + hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + } + + /* Empty the FRLVL fifo */ + if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK) + { + hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + } + + 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) +{ + __IO uint32_t count; + + count = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U); + + /* Disable TXEIE interrupt */ + CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_TXEIE)); + + /* Check TXEIE is disabled */ + do + { + if (count == 0U) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); + break; + } + count--; + } while (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXEIE)); + + if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK) + { + hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + } + + /* Disable SPI Peripheral */ + __HAL_SPI_DISABLE(hspi); + + /* Empty the FRLVL fifo */ + if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK) + { + hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + } + + /* Check case of Full-Duplex Mode and disable directly RXNEIE interrupt */ + if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXNEIE)) + { + /* Disable RXNEIE interrupt */ + CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_RXNEIE)); + + /* Check RXNEIE is disabled */ + do + { + if (count == 0U) + { + SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); + break; + } + count--; + } while (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXNEIE)); + + /* Control the BSY flag */ + if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_BSY, RESET, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK) + { + hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + } + + /* Empty the FRLVL fifo */ + if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK) + { + hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + } + } + hspi->State = HAL_SPI_STATE_ABORT; +} + +/** + * @} + */ + +#endif /* HAL_SPI_MODULE_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c new file mode 100644 index 0000000..71f3181 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c @@ -0,0 +1,115 @@ +/** + ****************************************************************************** + * @file stm32f3xx_hal_spi_ex.c + * @author MCD Application Team + * @brief Extended SPI HAL module driver. + * This file provides firmware functions to manage the following + * SPI peripheral extended functionalities : + * + IO operation functions + * + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f3xx_hal.h" + +/** @addtogroup STM32F3xx_HAL_Driver + * @{ + */ + +/** @defgroup SPIEx SPIEx + * @brief SPI Extended HAL module driver + * @{ + */ +#ifdef HAL_SPI_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private defines -----------------------------------------------------------*/ +/** @defgroup SPIEx_Private_Constants SPIEx Private Constants + * @{ + */ +#define SPI_FIFO_SIZE 4UL +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Exported functions --------------------------------------------------------*/ + +/** @defgroup SPIEx_Exported_Functions SPIEx Exported Functions + * @{ + */ + +/** @defgroup SPIEx_Exported_Functions_Group1 IO operation functions + * @brief Data transfers functions + * +@verbatim + ============================================================================== + ##### IO operation functions ##### + =============================================================================== + [..] + This subsection provides a set of extended functions to manage the SPI + data transfers. + + (#) Rx data flush function: + (++) HAL_SPIEx_FlushRxFifo() + +@endverbatim + * @{ + */ + +/** + * @brief Flush the RX fifo. + * @param hspi pointer to a SPI_HandleTypeDef structure that contains + * the configuration information for the specified SPI module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_SPIEx_FlushRxFifo(SPI_HandleTypeDef *hspi) +{ + __IO uint32_t tmpreg; + uint8_t count = 0U; + while ((hspi->Instance->SR & SPI_FLAG_FRLVL) != SPI_FRLVL_EMPTY) + { + count++; + tmpreg = hspi->Instance->DR; + UNUSED(tmpreg); /* To avoid GCC warning */ + if (count == SPI_FIFO_SIZE) + { + return HAL_TIMEOUT; + } + } + return HAL_OK; +} + +/** + * @} + */ + +/** + * @} + */ + +#endif /* HAL_SPI_MODULE_ENABLED */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.c b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.c new file mode 100644 index 0000000..9bab4be --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.c @@ -0,0 +1,7942 @@ +/** + ****************************************************************************** + * @file stm32f3xx_hal_tim.c + * @author MCD Application Team + * @brief TIM HAL module driver. + * This file provides firmware functions to manage the following + * functionalities of the Timer (TIM) peripheral: + * + TIM Time Base Initialization + * + TIM Time Base Start + * + TIM Time Base Start Interruption + * + TIM Time Base Start DMA + * + TIM Output Compare/PWM Initialization + * + TIM Output Compare/PWM Channel Configuration + * + TIM Output Compare/PWM Start + * + TIM Output Compare/PWM Start Interruption + * + TIM Output Compare/PWM Start DMA + * + TIM Input Capture Initialization + * + TIM Input Capture Channel Configuration + * + TIM Input Capture Start + * + TIM Input Capture Start Interruption + * + TIM Input Capture Start DMA + * + TIM One Pulse Initialization + * + TIM One Pulse Channel Configuration + * + TIM One Pulse Start + * + TIM Encoder Interface Initialization + * + TIM Encoder Interface Start + * + TIM Encoder Interface Start Interruption + * + TIM Encoder Interface Start DMA + * + Commutation Event configuration with Interruption and DMA + * + TIM OCRef clear configuration + * + TIM External Clock configuration + @verbatim + ============================================================================== + ##### TIMER Generic features ##### + ============================================================================== + [..] The Timer features include: + (#) 16-bit up, down, up/down auto-reload counter. + (#) 16-bit programmable prescaler allowing dividing (also on the fly) the + counter clock frequency either by any factor between 1 and 65536. + (#) Up to 4 independent channels for: + (++) Input Capture + (++) Output Compare + (++) PWM generation (Edge and Center-aligned Mode) + (++) One-pulse mode output + (#) Synchronization circuit to control the timer with external signals and to interconnect + several timers together. + (#) Supports incremental encoder for positioning purposes + + ##### How to use this driver ##### + ============================================================================== + [..] + (#) Initialize the TIM low level resources by implementing the following functions + depending on the selected feature: + (++) Time Base : HAL_TIM_Base_MspInit() + (++) Input Capture : HAL_TIM_IC_MspInit() + (++) Output Compare : HAL_TIM_OC_MspInit() + (++) PWM generation : HAL_TIM_PWM_MspInit() + (++) One-pulse mode output : HAL_TIM_OnePulse_MspInit() + (++) Encoder mode output : HAL_TIM_Encoder_MspInit() + + (#) Initialize the TIM low level resources : + (##) Enable the TIM interface clock using __HAL_RCC_TIMx_CLK_ENABLE(); + (##) TIM pins configuration + (+++) Enable the clock for the TIM GPIOs using the following function: + __HAL_RCC_GPIOx_CLK_ENABLE(); + (+++) Configure these TIM pins in Alternate function mode using HAL_GPIO_Init(); + + (#) The external Clock can be configured, if needed (the default clock is the + internal clock from the APBx), using the following function: + HAL_TIM_ConfigClockSource, the clock configuration should be done before + any start function. + + (#) Configure the TIM in the desired functioning mode using one of the + Initialization function of this driver: + (++) HAL_TIM_Base_Init: to use the Timer to generate a simple time base + (++) HAL_TIM_OC_Init and HAL_TIM_OC_ConfigChannel: to use the Timer to generate an + Output Compare signal. + (++) HAL_TIM_PWM_Init and HAL_TIM_PWM_ConfigChannel: to use the Timer to generate a + PWM signal. + (++) HAL_TIM_IC_Init and HAL_TIM_IC_ConfigChannel: to use the Timer to measure an + external signal. + (++) HAL_TIM_OnePulse_Init and HAL_TIM_OnePulse_ConfigChannel: to use the Timer + in One Pulse Mode. + (++) HAL_TIM_Encoder_Init: to use the Timer Encoder Interface. + + (#) Activate the TIM peripheral using one of the start functions depending from the feature used: + (++) Time Base : HAL_TIM_Base_Start(), HAL_TIM_Base_Start_DMA(), HAL_TIM_Base_Start_IT() + (++) Input Capture : HAL_TIM_IC_Start(), HAL_TIM_IC_Start_DMA(), HAL_TIM_IC_Start_IT() + (++) Output Compare : HAL_TIM_OC_Start(), HAL_TIM_OC_Start_DMA(), HAL_TIM_OC_Start_IT() + (++) PWM generation : HAL_TIM_PWM_Start(), HAL_TIM_PWM_Start_DMA(), HAL_TIM_PWM_Start_IT() + (++) One-pulse mode output : HAL_TIM_OnePulse_Start(), HAL_TIM_OnePulse_Start_IT() + (++) Encoder mode output : HAL_TIM_Encoder_Start(), HAL_TIM_Encoder_Start_DMA(), HAL_TIM_Encoder_Start_IT(). + + (#) The DMA Burst is managed with the two following functions: + HAL_TIM_DMABurst_WriteStart() + HAL_TIM_DMABurst_ReadStart() + + *** Callback registration *** + ============================================= + + [..] + The compilation define USE_HAL_TIM_REGISTER_CALLBACKS when set to 1 + allows the user to configure dynamically the driver callbacks. + + [..] + Use Function 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. + (+) Break2Callback : TIM Break2 Callback (when supported). + + [..] +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 + ****************************************************************************** + * @attention + * + *

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

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

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f3xx_hal.h" + +/** @addtogroup STM32F3xx_HAL_Driver + * @{ + */ + +/** @defgroup TIMEx TIMEx + * @brief TIM Extended HAL module driver + * @{ + */ + +#ifdef HAL_TIM_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +static void TIM_DMADelayPulseNCplt(DMA_HandleTypeDef *hdma); +static void TIM_DMAErrorCCxN(DMA_HandleTypeDef *hdma); +static void TIM_CCxNChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelNState); + +/* Exported functions --------------------------------------------------------*/ +/** @defgroup TIMEx_Exported_Functions TIM Extended Exported Functions + * @{ + */ + +/** @defgroup TIMEx_Exported_Functions_Group1 Extended Timer Hall Sensor functions + * @brief Timer Hall Sensor functions + * +@verbatim + ============================================================================== + ##### Timer Hall Sensor functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Initialize and configure TIM HAL Sensor. + (+) De-initialize TIM HAL Sensor. + (+) Start the Hall Sensor Interface. + (+) Stop the Hall Sensor Interface. + (+) Start the Hall Sensor Interface and enable interrupts. + (+) Stop the Hall Sensor Interface and disable interrupts. + (+) Start the Hall Sensor Interface and enable DMA transfers. + (+) Stop the Hall Sensor Interface and disable DMA transfers. + +@endverbatim + * @{ + */ +/** + * @brief Initializes the TIM Hall Sensor Interface and initialize the associated handle. + * @note When the timer instance is initialized in Hall Sensor Interface mode, + * timer channels 1 and channel 2 are reserved and cannot be used for + * other purpose. + * @param htim TIM Hall Sensor Interface handle + * @param sConfig TIM Hall Sensor configuration structure + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Init(TIM_HandleTypeDef *htim, TIM_HallSensor_InitTypeDef *sConfig) +{ + TIM_OC_InitTypeDef OC_Config; + + /* Check the TIM handle allocation */ + if (htim == NULL) + { + return HAL_ERROR; + } + + /* Check the parameters */ + assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); + assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); + assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); + assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); + assert_param(IS_TIM_IC_POLARITY(sConfig->IC1Polarity)); + assert_param(IS_TIM_IC_PRESCALER(sConfig->IC1Prescaler)); + assert_param(IS_TIM_IC_FILTER(sConfig->IC1Filter)); + + if (htim->State == HAL_TIM_STATE_RESET) + { + /* Allocate lock resource and initialize it */ + htim->Lock = HAL_UNLOCKED; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + /* Reset interrupt callbacks to legacy week callbacks */ + TIM_ResetCallback(htim); + + if (htim->HallSensor_MspInitCallback == NULL) + { + htim->HallSensor_MspInitCallback = HAL_TIMEx_HallSensor_MspInit; + } + /* Init the low level hardware : GPIO, CLOCK, NVIC */ + htim->HallSensor_MspInitCallback(htim); +#else + /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */ + HAL_TIMEx_HallSensor_MspInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + } + + /* Set the TIM state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Configure the Time base in the Encoder Mode */ + TIM_Base_SetConfig(htim->Instance, &htim->Init); + + /* Configure the Channel 1 as Input Channel to interface with the three Outputs of the Hall sensor */ + TIM_TI1_SetConfig(htim->Instance, sConfig->IC1Polarity, TIM_ICSELECTION_TRC, sConfig->IC1Filter); + + /* Reset the IC1PSC Bits */ + htim->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC; + /* Set the IC1PSC value */ + htim->Instance->CCMR1 |= sConfig->IC1Prescaler; + + /* Enable the Hall sensor interface (XOR function of the three inputs) */ + htim->Instance->CR2 |= TIM_CR2_TI1S; + + /* Select the TIM_TS_TI1F_ED signal as Input trigger for the TIM */ + htim->Instance->SMCR &= ~TIM_SMCR_TS; + htim->Instance->SMCR |= TIM_TS_TI1F_ED; + + /* Use the TIM_TS_TI1F_ED signal to reset the TIM counter each edge detection */ + htim->Instance->SMCR &= ~TIM_SMCR_SMS; + htim->Instance->SMCR |= TIM_SLAVEMODE_RESET; + + /* Program channel 2 in PWM 2 mode with the desired Commutation_Delay*/ + OC_Config.OCFastMode = TIM_OCFAST_DISABLE; + OC_Config.OCIdleState = TIM_OCIDLESTATE_RESET; + OC_Config.OCMode = TIM_OCMODE_PWM2; + OC_Config.OCNIdleState = TIM_OCNIDLESTATE_RESET; + OC_Config.OCNPolarity = TIM_OCNPOLARITY_HIGH; + OC_Config.OCPolarity = TIM_OCPOLARITY_HIGH; + OC_Config.Pulse = sConfig->Commutation_Delay; + + TIM_OC2_SetConfig(htim->Instance, &OC_Config); + + /* Select OC2REF as trigger output on TRGO: write the MMS bits in the TIMx_CR2 + register to 101 */ + htim->Instance->CR2 &= ~TIM_CR2_MMS; + htim->Instance->CR2 |= TIM_TRGO_OC2REF; + + /* Initialize the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_READY; + + /* Initialize the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + + /* Initialize the TIM state*/ + htim->State = HAL_TIM_STATE_READY; + + return HAL_OK; +} + +/** + * @brief DeInitializes the TIM Hall Sensor interface + * @param htim TIM Hall Sensor Interface handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_DeInit(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_INSTANCE(htim->Instance)); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Disable the TIM Peripheral Clock */ + __HAL_TIM_DISABLE(htim); + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + if (htim->HallSensor_MspDeInitCallback == NULL) + { + htim->HallSensor_MspDeInitCallback = HAL_TIMEx_HallSensor_MspDeInit; + } + /* DeInit the low level hardware */ + htim->HallSensor_MspDeInitCallback(htim); +#else + /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ + HAL_TIMEx_HallSensor_MspDeInit(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + /* Change the DMA burst operation state */ + htim->DMABurstState = HAL_DMA_BURST_STATE_RESET; + + /* Change the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_RESET); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_RESET); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_RESET); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_RESET); + + /* Change TIM state */ + htim->State = HAL_TIM_STATE_RESET; + + /* Release Lock */ + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Initializes the TIM Hall Sensor MSP. + * @param htim TIM Hall Sensor Interface handle + * @retval None + */ +__weak void HAL_TIMEx_HallSensor_MspInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIMEx_HallSensor_MspInit could be implemented in the user file + */ +} + +/** + * @brief DeInitializes TIM Hall Sensor MSP. + * @param htim TIM Hall Sensor Interface handle + * @retval None + */ +__weak void HAL_TIMEx_HallSensor_MspDeInit(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIMEx_HallSensor_MspDeInit could be implemented in the user file + */ +} + +/** + * @brief Starts the TIM Hall Sensor Interface. + * @param htim TIM Hall Sensor Interface handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start(TIM_HandleTypeDef *htim) +{ + uint32_t tmpsmcr; + HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); + HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); + + /* Check the parameters */ + assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); + + /* Check the TIM channels state */ + if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) + { + return HAL_ERROR; + } + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + + /* Enable the Input Capture channel 1 + (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, + TIM_CHANNEL_2 and TIM_CHANNEL_3) */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Hall sensor Interface. + * @param htim TIM Hall Sensor Interface handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); + + /* Disable the Input Capture channels 1, 2 and 3 + (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, + TIM_CHANNEL_2 and TIM_CHANNEL_3) */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Hall Sensor Interface in interrupt mode. + * @param htim TIM Hall Sensor Interface handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_IT(TIM_HandleTypeDef *htim) +{ + uint32_t tmpsmcr; + HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef channel_2_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_2); + HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef complementary_channel_2_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_2); + + /* Check the parameters */ + assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); + + /* Check the TIM channels state */ + if ((channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (channel_2_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_1_state != HAL_TIM_CHANNEL_STATE_READY) + || (complementary_channel_2_state != HAL_TIM_CHANNEL_STATE_READY)) + { + return HAL_ERROR; + } + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_BUSY); + + /* Enable the capture compare Interrupts 1 event */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + + /* Enable the Input Capture channel 1 + (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, + TIM_CHANNEL_2 and TIM_CHANNEL_3) */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Hall Sensor Interface in interrupt mode. + * @param htim TIM Hall Sensor Interface handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_IT(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); + + /* Disable the Input Capture channel 1 + (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, + TIM_CHANNEL_2 and TIM_CHANNEL_3) */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + + /* Disable the capture compare Interrupts event */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channels state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Hall Sensor Interface in DMA mode. + * @param htim TIM Hall Sensor Interface handle + * @param pData The destination Buffer address. + * @param Length The length of data to be transferred from TIM peripheral to memory. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pData, uint16_t Length) +{ + uint32_t tmpsmcr; + HAL_TIM_ChannelStateTypeDef channel_1_state = TIM_CHANNEL_STATE_GET(htim, TIM_CHANNEL_1); + HAL_TIM_ChannelStateTypeDef complementary_channel_1_state = TIM_CHANNEL_N_STATE_GET(htim, TIM_CHANNEL_1); + + /* Check the parameters */ + assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); + + /* Set the TIM channel state */ + if ((channel_1_state == HAL_TIM_CHANNEL_STATE_BUSY) + || (complementary_channel_1_state == HAL_TIM_CHANNEL_STATE_BUSY)) + { + return HAL_BUSY; + } + else if ((channel_1_state == HAL_TIM_CHANNEL_STATE_READY) + && (complementary_channel_1_state == HAL_TIM_CHANNEL_STATE_READY)) + { + if ((pData == NULL) && (Length > 0U)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + else + { + return HAL_ERROR; + } + + /* Enable the Input Capture channel 1 + (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, + TIM_CHANNEL_2 and TIM_CHANNEL_3) */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); + + /* Set the DMA Input Capture 1 Callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMACaptureCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMACaptureHalfCplt; + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; + + /* Enable the DMA channel for Capture 1*/ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)&htim->Instance->CCR1, (uint32_t)pData, Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the capture compare 1 Interrupt */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC1); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Hall Sensor Interface in DMA mode. + * @param htim TIM Hall Sensor Interface handle + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_DMA(TIM_HandleTypeDef *htim) +{ + /* Check the parameters */ + assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); + + /* Disable the Input Capture channel 1 + (in the Hall Sensor Interface the three possible channels that can be used are TIM_CHANNEL_1, + TIM_CHANNEL_2 and TIM_CHANNEL_3) */ + TIM_CCxChannelCmd(htim->Instance, TIM_CHANNEL_1, TIM_CCx_DISABLE); + + + /* Disable the capture compare Interrupts 1 event */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); + + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM channel state */ + TIM_CHANNEL_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + + /* Return function status */ + return HAL_OK; +} + +/** + * @} + */ + +/** @defgroup TIMEx_Exported_Functions_Group2 Extended Timer Complementary Output Compare functions + * @brief Timer Complementary Output Compare functions + * +@verbatim + ============================================================================== + ##### Timer Complementary Output Compare functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Start the Complementary Output Compare/PWM. + (+) Stop the Complementary Output Compare/PWM. + (+) Start the Complementary Output Compare/PWM and enable interrupts. + (+) Stop the Complementary Output Compare/PWM and disable interrupts. + (+) Start the Complementary Output Compare/PWM and enable DMA transfers. + (+) Stop the Complementary Output Compare/PWM and disable DMA transfers. + +@endverbatim + * @{ + */ + +/** + * @brief Starts the TIM Output Compare signal generation on the complementary + * output. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Start(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + /* Check the TIM complementary channel state */ + if (TIM_CHANNEL_N_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) + { + return HAL_ERROR; + } + + /* Set the TIM complementary channel state */ + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + + /* Enable the Capture compare channel N */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the TIM Output Compare signal generation on the complementary + * output. + * @param htim TIM handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + /* Disable the Capture compare channel N */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); + + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM complementary channel state */ + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the TIM Output Compare signal generation in interrupt mode + * on the complementary output. + * @param htim TIM OC handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + /* Check the TIM complementary channel state */ + if (TIM_CHANNEL_N_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) + { + return HAL_ERROR; + } + + /* Set the TIM complementary channel state */ + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Enable the TIM Output Compare interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Enable the TIM Output Compare interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Enable the TIM Output Compare interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); + break; + } + + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Enable the TIM Break interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_BREAK); + + /* Enable the Capture compare channel N */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + } + + /* Return function status */ + return status; +} + +/** + * @brief Stops the TIM Output Compare signal generation in interrupt mode + * on the complementary output. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpccer; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Output Compare interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Output Compare interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Output Compare interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Disable the Capture compare channel N */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); + + /* Disable the TIM Break interrupt (only if no more channel is active) */ + tmpccer = htim->Instance->CCER; + if ((tmpccer & (TIM_CCER_CC1NE | TIM_CCER_CC2NE | TIM_CCER_CC3NE)) == (uint32_t)RESET) + { + __HAL_TIM_DISABLE_IT(htim, TIM_IT_BREAK); + } + + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM complementary channel state */ + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + } + + /* Return function status */ + return status; +} + +/** + * @brief Starts the TIM Output Compare signal generation in DMA mode + * on the complementary output. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @param pData The source Buffer address. + * @param Length The length of data to be transferred from memory to TIM peripheral + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + /* Set the TIM complementary channel state */ + if (TIM_CHANNEL_N_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_BUSY) + { + return HAL_BUSY; + } + else if (TIM_CHANNEL_N_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_READY) + { + if ((pData == NULL) && (Length > 0U)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + else + { + return HAL_ERROR; + } + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseNCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAErrorCCxN ; + + /* Enable the DMA channel */ + 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 channel */ + 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 channel */ + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)pData, (uint32_t)&htim->Instance->CCR3, + Length) != HAL_OK) + { + /* Return error status */ + return HAL_ERROR; + } + /* Enable the TIM Output Compare DMA request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_CC3); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Enable the Capture compare channel N */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + } + + /* Return function status */ + return status; +} + +/** + * @brief Stops the TIM Output Compare signal generation in DMA mode + * on the complementary output. + * @param htim TIM Output Compare handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Output Compare DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC1); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC1]); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Output Compare DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC2); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC2]); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Output Compare DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_CC3); + (void)HAL_DMA_Abort_IT(htim->hdma[TIM_DMA_ID_CC3]); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Disable the Capture compare channel N */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); + + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM complementary channel state */ + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + } + + /* Return function status */ + return status; +} + +/** + * @} + */ + +/** @defgroup TIMEx_Exported_Functions_Group3 Extended Timer Complementary PWM functions + * @brief Timer Complementary PWM functions + * +@verbatim + ============================================================================== + ##### Timer Complementary PWM functions ##### + ============================================================================== + [..] + This section provides functions allowing to: + (+) Start the Complementary PWM. + (+) Stop the Complementary PWM. + (+) Start the Complementary PWM and enable interrupts. + (+) Stop the Complementary PWM and disable interrupts. + (+) Start the Complementary PWM and enable DMA transfers. + (+) Stop the Complementary PWM and disable DMA transfers. + (+) Start the Complementary Input Capture measurement. + (+) Stop the Complementary Input Capture. + (+) Start the Complementary Input Capture and enable interrupts. + (+) Stop the Complementary Input Capture and disable interrupts. + (+) Start the Complementary Input Capture and enable DMA transfers. + (+) Stop the Complementary Input Capture and disable DMA transfers. + (+) Start the Complementary One Pulse generation. + (+) Stop the Complementary One Pulse. + (+) Start the Complementary One Pulse and enable interrupts. + (+) Stop the Complementary One Pulse and disable interrupts. + +@endverbatim + * @{ + */ + +/** + * @brief Starts the PWM signal generation on the complementary output. + * @param htim TIM handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Start(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + /* Check the TIM complementary channel state */ + if (TIM_CHANNEL_N_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) + { + return HAL_ERROR; + } + + /* Set the TIM complementary channel state */ + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + + /* Enable the complementary PWM output */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Stops the PWM signal generation on the complementary output. + * @param htim TIM handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + /* Disable the complementary PWM output */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); + + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM complementary channel state */ + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + + /* Return function status */ + return HAL_OK; +} + +/** + * @brief Starts the PWM signal generation in interrupt mode on the + * complementary output. + * @param htim TIM handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + /* Check the TIM complementary channel state */ + if (TIM_CHANNEL_N_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY) + { + return HAL_ERROR; + } + + /* Set the TIM complementary channel state */ + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Enable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Enable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Enable the TIM Capture/Compare 3 interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_CC3); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Enable the TIM Break interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_BREAK); + + /* Enable the complementary PWM output */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_ENABLE); + + /* Enable the Main Output */ + __HAL_TIM_MOE_ENABLE(htim); + + /* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */ + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS; + if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) + { + __HAL_TIM_ENABLE(htim); + } + } + else + { + __HAL_TIM_ENABLE(htim); + } + } + + /* Return function status */ + return status; +} + +/** + * @brief Stops the PWM signal generation in interrupt mode on the + * complementary output. + * @param htim TIM handle + * @param Channel TIM Channel to be disabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpccer; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Disable the TIM Capture/Compare 1 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); + break; + } + + case TIM_CHANNEL_2: + { + /* Disable the TIM Capture/Compare 2 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC2); + break; + } + + case TIM_CHANNEL_3: + { + /* Disable the TIM Capture/Compare 3 interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_CC3); + break; + } + + default: + status = HAL_ERROR; + break; + } + + if (status == HAL_OK) + { + /* Disable the complementary PWM output */ + TIM_CCxNChannelCmd(htim->Instance, Channel, TIM_CCxN_DISABLE); + + /* Disable the TIM Break interrupt (only if no more channel is active) */ + tmpccer = htim->Instance->CCER; + if ((tmpccer & (TIM_CCER_CC1NE | TIM_CCER_CC2NE | TIM_CCER_CC3NE)) == (uint32_t)RESET) + { + __HAL_TIM_DISABLE_IT(htim, TIM_IT_BREAK); + } + + /* Disable the Main Output */ + __HAL_TIM_MOE_DISABLE(htim); + + /* Disable the Peripheral */ + __HAL_TIM_DISABLE(htim); + + /* Set the TIM complementary channel state */ + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_READY); + } + + /* Return function status */ + return status; +} + +/** + * @brief Starts the TIM PWM signal generation in DMA mode on the + * complementary output + * @param htim TIM handle + * @param Channel TIM Channel to be enabled + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @param pData The source Buffer address. + * @param Length The length of data to be transferred from memory to TIM peripheral + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); + + /* Set the TIM complementary channel state */ + if (TIM_CHANNEL_N_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_BUSY) + { + return HAL_BUSY; + } + else if (TIM_CHANNEL_N_STATE_GET(htim, Channel) == HAL_TIM_CHANNEL_STATE_READY) + { + if ((pData == NULL) && (Length > 0U)) + { + return HAL_ERROR; + } + else + { + TIM_CHANNEL_N_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY); + } + } + else + { + return HAL_ERROR; + } + + switch (Channel) + { + case TIM_CHANNEL_1: + { + /* Set the DMA compare callbacks */ + htim->hdma[TIM_DMA_ID_CC1]->XferCpltCallback = TIM_DMADelayPulseNCplt; + htim->hdma[TIM_DMA_ID_CC1]->XferHalfCpltCallback = TIM_DMADelayPulseHalfCplt; + + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAErrorCCxN ; + + /* Enable the DMA channel */ + 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 channel */ + 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 channel */ + 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. + (+) Enable or disable channel grouping. + +@endverbatim + * @{ + */ + +/** + * @brief Configure the TIM commutation event sequence. + * @note This function is mandatory to use the commutation event in order to + * update the configuration at each commutation detection on the TRGI input of the Timer, + * the typical use of this feature is with the use of another Timer(interface Timer) + * configured in Hall sensor interface, this interface Timer will generate the + * commutation at its TRGO output (connected to Timer used in this function) each time + * the TI1 of the Interface Timer detect a commutation at its input TI1. + * @param htim TIM handle + * @param InputTrigger the Internal trigger corresponding to the Timer Interfacing with the Hall sensor + * This parameter can be one of the following values: + * @arg TIM_TS_ITR0: Internal trigger 0 selected + * @arg TIM_TS_ITR1: Internal trigger 1 selected + * @arg TIM_TS_ITR2: Internal trigger 2 selected + * @arg TIM_TS_ITR3: Internal trigger 3 selected + * @arg TIM_TS_NONE: No trigger is needed + * @param CommutationSource the Commutation Event source + * This parameter can be one of the following values: + * @arg TIM_COMMUTATION_TRGI: Commutation source is the TRGI of the Interface Timer + * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource) +{ + /* Check the parameters */ + assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); + assert_param(IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(InputTrigger)); + + __HAL_LOCK(htim); + + if ((InputTrigger == TIM_TS_ITR0) || (InputTrigger == TIM_TS_ITR1) || + (InputTrigger == TIM_TS_ITR2) || (InputTrigger == TIM_TS_ITR3)) + { + /* Select the Input trigger */ + htim->Instance->SMCR &= ~TIM_SMCR_TS; + htim->Instance->SMCR |= InputTrigger; + } + + /* Select the Capture Compare preload feature */ + htim->Instance->CR2 |= TIM_CR2_CCPC; + /* Select the Commutation event source */ + htim->Instance->CR2 &= ~TIM_CR2_CCUS; + htim->Instance->CR2 |= CommutationSource; + + /* Disable Commutation Interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_COM); + + /* Disable Commutation DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_COM); + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Configure the TIM commutation event sequence with interrupt. + * @note This function is mandatory to use the commutation event in order to + * update the configuration at each commutation detection on the TRGI input of the Timer, + * the typical use of this feature is with the use of another Timer(interface Timer) + * configured in Hall sensor interface, this interface Timer will generate the + * commutation at its TRGO output (connected to Timer used in this function) each time + * the TI1 of the Interface Timer detect a commutation at its input TI1. + * @param htim TIM handle + * @param InputTrigger the Internal trigger corresponding to the Timer Interfacing with the Hall sensor + * This parameter can be one of the following values: + * @arg TIM_TS_ITR0: Internal trigger 0 selected + * @arg TIM_TS_ITR1: Internal trigger 1 selected + * @arg TIM_TS_ITR2: Internal trigger 2 selected + * @arg TIM_TS_ITR3: Internal trigger 3 selected + * @arg TIM_TS_NONE: No trigger is needed + * @param CommutationSource the Commutation Event source + * This parameter can be one of the following values: + * @arg TIM_COMMUTATION_TRGI: Commutation source is the TRGI of the Interface Timer + * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource) +{ + /* Check the parameters */ + assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); + assert_param(IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(InputTrigger)); + + __HAL_LOCK(htim); + + if ((InputTrigger == TIM_TS_ITR0) || (InputTrigger == TIM_TS_ITR1) || + (InputTrigger == TIM_TS_ITR2) || (InputTrigger == TIM_TS_ITR3)) + { + /* Select the Input trigger */ + htim->Instance->SMCR &= ~TIM_SMCR_TS; + htim->Instance->SMCR |= InputTrigger; + } + + /* Select the Capture Compare preload feature */ + htim->Instance->CR2 |= TIM_CR2_CCPC; + /* Select the Commutation event source */ + htim->Instance->CR2 &= ~TIM_CR2_CCUS; + htim->Instance->CR2 |= CommutationSource; + + /* Disable Commutation DMA request */ + __HAL_TIM_DISABLE_DMA(htim, TIM_DMA_COM); + + /* Enable the Commutation Interrupt */ + __HAL_TIM_ENABLE_IT(htim, TIM_IT_COM); + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Configure the TIM commutation event sequence with DMA. + * @note This function is mandatory to use the commutation event in order to + * update the configuration at each commutation detection on the TRGI input of the Timer, + * the typical use of this feature is with the use of another Timer(interface Timer) + * configured in Hall sensor interface, this interface Timer will generate the + * commutation at its TRGO output (connected to Timer used in this function) each time + * the TI1 of the Interface Timer detect a commutation at its input TI1. + * @note The user should configure the DMA in his own software, in This function only the COMDE bit is set + * @param htim TIM handle + * @param InputTrigger the Internal trigger corresponding to the Timer Interfacing with the Hall sensor + * This parameter can be one of the following values: + * @arg TIM_TS_ITR0: Internal trigger 0 selected + * @arg TIM_TS_ITR1: Internal trigger 1 selected + * @arg TIM_TS_ITR2: Internal trigger 2 selected + * @arg TIM_TS_ITR3: Internal trigger 3 selected + * @arg TIM_TS_NONE: No trigger is needed + * @param CommutationSource the Commutation Event source + * This parameter can be one of the following values: + * @arg TIM_COMMUTATION_TRGI: Commutation source is the TRGI of the Interface Timer + * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource) +{ + /* Check the parameters */ + assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); + assert_param(IS_TIM_INTERNAL_TRIGGEREVENT_SELECTION(InputTrigger)); + + __HAL_LOCK(htim); + + if ((InputTrigger == TIM_TS_ITR0) || (InputTrigger == TIM_TS_ITR1) || + (InputTrigger == TIM_TS_ITR2) || (InputTrigger == TIM_TS_ITR3)) + { + /* Select the Input trigger */ + htim->Instance->SMCR &= ~TIM_SMCR_TS; + htim->Instance->SMCR |= InputTrigger; + } + + /* Select the Capture Compare preload feature */ + htim->Instance->CR2 |= TIM_CR2_CCPC; + /* Select the Commutation event source */ + htim->Instance->CR2 &= ~TIM_CR2_CCUS; + htim->Instance->CR2 |= CommutationSource; + + /* Enable the Commutation DMA Request */ + /* Set the DMA Commutation Callback */ + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferCpltCallback = TIMEx_DMACommutationCplt; + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferHalfCpltCallback = TIMEx_DMACommutationHalfCplt; + /* Set the DMA error callback */ + htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError; + + /* Disable Commutation Interrupt */ + __HAL_TIM_DISABLE_IT(htim, TIM_IT_COM); + + /* Enable the Commutation DMA Request */ + __HAL_TIM_ENABLE_DMA(htim, TIM_DMA_COM); + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Configures the TIM in master mode. + * @param htim TIM handle. + * @param sMasterConfig pointer to a TIM_MasterConfigTypeDef structure that + * contains the selected trigger output (TRGO) and the Master/Slave + * mode. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, + TIM_MasterConfigTypeDef *sMasterConfig) +{ + uint32_t tmpcr2; + uint32_t tmpsmcr; + + /* Check the parameters */ + assert_param(IS_TIM_MASTER_INSTANCE(htim->Instance)); + assert_param(IS_TIM_TRGO_SOURCE(sMasterConfig->MasterOutputTrigger)); + assert_param(IS_TIM_MSM_STATE(sMasterConfig->MasterSlaveMode)); + + /* Check input state */ + __HAL_LOCK(htim); + + /* Change the handler state */ + htim->State = HAL_TIM_STATE_BUSY; + + /* Get the TIMx CR2 register value */ + tmpcr2 = htim->Instance->CR2; + + /* Get the TIMx SMCR register value */ + tmpsmcr = htim->Instance->SMCR; + +#if defined(TIM_CR2_MMS2) + /* If the timer supports ADC synchronization through TRGO2, set the master mode selection 2 */ + if (IS_TIM_TRGO2_INSTANCE(htim->Instance)) + { + /* Check the parameters */ + assert_param(IS_TIM_TRGO2_SOURCE(sMasterConfig->MasterOutputTrigger2)); + + /* Clear the MMS2 bits */ + tmpcr2 &= ~TIM_CR2_MMS2; + /* Select the TRGO2 source*/ + tmpcr2 |= sMasterConfig->MasterOutputTrigger2; + } +#endif /* TIM_CR2_MMS2 */ + + /* Reset the MMS Bits */ + tmpcr2 &= ~TIM_CR2_MMS; + /* Select the TRGO source */ + tmpcr2 |= sMasterConfig->MasterOutputTrigger; + + /* Update TIMx CR2 */ + htim->Instance->CR2 = tmpcr2; + + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + /* Reset the MSM Bit */ + tmpsmcr &= ~TIM_SMCR_MSM; + /* Set master mode */ + tmpsmcr |= sMasterConfig->MasterSlaveMode; + + /* Update TIMx SMCR */ + htim->Instance->SMCR = tmpsmcr; + } + + /* Change the htim state */ + htim->State = HAL_TIM_STATE_READY; + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +/** + * @brief Configures the Break feature, dead time, Lock level, OSSI/OSSR State + * and the AOE(automatic output enable). + * @param htim TIM handle + * @param sBreakDeadTimeConfig pointer to a TIM_ConfigBreakDeadConfigTypeDef structure that + * contains the BDTR Register configuration information for the TIM peripheral. + * @note Interrupts can be generated when an active level is detected on the + * break input, the break 2 input or the system break input. Break + * interrupt can be enabled by calling the @ref __HAL_TIM_ENABLE_IT macro. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, + TIM_BreakDeadTimeConfigTypeDef *sBreakDeadTimeConfig) +{ + /* Keep this variable initialized to 0 as it is used to configure BDTR register */ + uint32_t tmpbdtr = 0U; + + /* Check the parameters */ + assert_param(IS_TIM_BREAK_INSTANCE(htim->Instance)); + assert_param(IS_TIM_OSSR_STATE(sBreakDeadTimeConfig->OffStateRunMode)); + assert_param(IS_TIM_OSSI_STATE(sBreakDeadTimeConfig->OffStateIDLEMode)); + assert_param(IS_TIM_LOCK_LEVEL(sBreakDeadTimeConfig->LockLevel)); + assert_param(IS_TIM_DEADTIME(sBreakDeadTimeConfig->DeadTime)); + assert_param(IS_TIM_BREAK_STATE(sBreakDeadTimeConfig->BreakState)); + assert_param(IS_TIM_BREAK_POLARITY(sBreakDeadTimeConfig->BreakPolarity)); +#if defined(TIM_BDTR_BKF) + assert_param(IS_TIM_BREAK_FILTER(sBreakDeadTimeConfig->BreakFilter)); +#endif /* TIM_BDTR_BKF */ + 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); +#if defined(TIM_BDTR_BKF) + MODIFY_REG(tmpbdtr, TIM_BDTR_BKF, (sBreakDeadTimeConfig->BreakFilter << TIM_BDTR_BKF_Pos)); +#endif /* TIM_BDTR_BKF */ + +#if defined(TIM_BDTR_BK2E) + if (IS_TIM_BKIN2_INSTANCE(htim->Instance)) + { + /* Check the parameters */ + assert_param(IS_TIM_BREAK2_STATE(sBreakDeadTimeConfig->Break2State)); + assert_param(IS_TIM_BREAK2_POLARITY(sBreakDeadTimeConfig->Break2Polarity)); + assert_param(IS_TIM_BREAK_FILTER(sBreakDeadTimeConfig->Break2Filter)); + + /* Set the BREAK2 input related BDTR bits */ + MODIFY_REG(tmpbdtr, TIM_BDTR_BK2F, (sBreakDeadTimeConfig->Break2Filter << TIM_BDTR_BK2F_Pos)); + MODIFY_REG(tmpbdtr, TIM_BDTR_BK2E, sBreakDeadTimeConfig->Break2State); + MODIFY_REG(tmpbdtr, TIM_BDTR_BK2P, sBreakDeadTimeConfig->Break2Polarity); + } +#endif /* TIM_BDTR_BK2E */ + + /* 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. + @if STM32F301x8 + * For TIM1, the parameter can have the following values: + * @arg TIM_TIM1_ADC1_NONE: TIM1_ETR is not connected to any AWD (analog watchdog) + * @arg TIM_TIM1_ADC1_AWD1: TIM1_ETR is connected to ADC1 AWD1 + * @arg TIM_TIM1_ADC1_AWD2: TIM1_ETR is connected to ADC1 AWD2 + * @arg TIM_TIM1_ADC1_AWD3: TIM1_ETR is connected to ADC1 AWD2 + @elseif STM32F303xE + * For TIM1, the parameter is a combination of 2 fields (field1 | field2): + * + * field1 can have the following values: + * @arg TIM_TIM1_ADC1_NONE: TIM1_ETR is not connected to any AWD (analog watchdog) + * @arg TIM_TIM1_ADC1_AWD1: TIM1_ETR is connected to ADC1 AWD1 + * @arg TIM_TIM1_ADC1_AWD2: TIM1_ETR is connected to ADC1 AWD2 + * @arg TIM_TIM1_ADC1_AWD3: TIM1_ETR is connected to ADC1 AWD2 + * + * field2 can have the following values: + * @arg TIM_TIM1_ADC4_NONE : TIM1_ETR is not connected to any AWD (analog watchdog) + * @arg TIM_TIM1_ADC4_AWD1: TIM1_ETR is connected to ADC4 AWD1 + * @arg TIM_TIM1_ADC4_AWD2: TIM1_ETR is connected to ADC4 AWD2 + * @arg TIM_TIM1_ADC4_AWD3: TIM1_ETR is connected to ADC4 AWD3 + @elseif STM32F334x8 + * For TIM1, the parameter is a combination of 2 fields (field1 | field2): + * + * field1 can have the following values: + * @arg TIM_TIM1_ADC1_NONE: TIM1_ETR is not connected to any AWD (analog watchdog) + * @arg TIM_TIM1_ADC1_AWD1: TIM1_ETR is connected to ADC1 AWD1 + * @arg TIM_TIM1_ADC1_AWD2: TIM1_ETR is connected to ADC1 AWD2 + * @arg TIM_TIM1_ADC1_AWD3: TIM1_ETR is connected to ADC1 AWD2 + * + * field2 can have the following values: + * @arg TIM_TIM1_ADC2_NONE : TIM1_ETR is not connected to any AWD (analog watchdog) + * @arg TIM_TIM1_ADC2_AWD1: TIM1_ETR is connected to ADC2 AWD1 + * @arg TIM_TIM1_ADC2_AWD2: TIM1_ETR is connected to ADC2 AWD2 + * @arg TIM_TIM1_ADC2_AWD3: TIM1_ETR is connected to ADC2 AWD3 + @endif + @if STM32F303xE + * For TIM8, the parameter is a combination of 2 fields (field1 | field2): + * + * field1 can have the following values: + * @arg TIM_TIM8_ADC2_NONE: TIM1_ETR is not connected to any AWD (analog watchdog) + * @arg TIM_TIM8_ADC2_AWD1: TIM1_ETR is connected to ADC2 AWD1 + * @arg TIM_TIM8_ADC2_AWD2: TIM1_ETR is connected to ADC2 AWD2 + * @arg TIM_TIM8_ADC2_AWD3: TIM1_ETR is connected to ADC2 AWD2 + * + * field2 can have the following values: + * @arg TIM_TIM8_ADC3_NONE : TIM1_ETR is not connected to any AWD (analog watchdog) + * @arg TIM_TIM8_ADC3_AWD1: TIM1_ETR is connected to ADC3 AWD1 + * @arg TIM_TIM8_ADC3_AWD2: TIM1_ETR is connected to ADC3 AWD2 + * @arg TIM_TIM8_ADC3_AWD3: TIM1_ETR is connected to ADC3 AWD3 + @endif + @if STM32F373xC + * For TIM14, the parameter can have the following values: + * @arg TIM_TIM14_GPIO: TIM14 TI1 is connected to GPIO + * @arg TIM_TIM14_RTC: TIM14 TI1 is connected to RTC_clock + * @arg TIM_TIM14_HSE: TIM14 TI1 is connected to HSE/32 + * @arg TIM_TIM14_MCO: TIM14 TI1 is connected to MCO + @else + * For TIM16, the parameter can have the following values: + * @arg TIM_TIM16_GPIO: TIM16 TI1 is connected to GPIO + * @arg TIM_TIM16_RTC: TIM16 TI1 is connected to RTC_clock + * @arg TIM_TIM16_HSE: TIM16 TI1 is connected to HSE/32 + * @arg TIM_TIM16_MCO: TIM16 TI1 is connected to MCO + @endif + @if STM32F303xE + * For TIM20, the parameter is a combination of 2 fields (field1 | field2): + * + * field1 can have the following values: + * @arg TIM_TIM20_ADC3_NONE: TIM1_ETR is not connected to any AWD (analog watchdog) + * @arg TIM_TIM20_ADC3_AWD1: TIM1_ETR is connected to ADC3 AWD1 + * @arg TIM_TIM20_ADC3_AWD2: TIM1_ETR is connected to ADC3 AWD2 + * @arg TIM_TIM20_ADC3_AWD3: TIM1_ETR is connected to ADC3 AWD2 + * + * field2 can have the following values: + * @arg TIM_TIM20_ADC4_NONE : TIM1_ETR is not connected to any AWD (analog watchdog) + * @arg TIM_TIM20_ADC4_AWD1: TIM1_ETR is connected to ADC4 AWD1 + * @arg TIM_TIM20_ADC4_AWD2: TIM1_ETR is connected to ADC4 AWD2 + * @arg TIM_TIM20_ADC4_AWD3: TIM1_ETR is connected to ADC4 AWD3 + @endif + * + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_RemapConfig(TIM_HandleTypeDef *htim, uint32_t Remap) +{ + __HAL_LOCK(htim); + + /* Check parameters */ + assert_param(IS_TIM_REMAP(htim->Instance, Remap)); + + /* Set the Timer remapping configuration */ + WRITE_REG(htim->Instance->OR, Remap); + + __HAL_UNLOCK(htim); + + return HAL_OK; +} + +#if defined(TIM_CCR5_CCR5) +/** + * @brief Group channel 5 and channel 1, 2 or 3 + * @param htim TIM handle. + * @param Channels specifies the reference signal(s) the OC5REF is combined with. + * This parameter can be any combination of the following values: + * TIM_GROUPCH5_NONE: No effect of OC5REF on OC1REFC, OC2REFC and OC3REFC + * TIM_GROUPCH5_OC1REFC: OC1REFC is the logical AND of OC1REFC and OC5REF + * TIM_GROUPCH5_OC2REFC: OC2REFC is the logical AND of OC2REFC and OC5REF + * TIM_GROUPCH5_OC3REFC: OC3REFC is the logical AND of OC3REFC and OC5REF + * @retval HAL status + */ +HAL_StatusTypeDef HAL_TIMEx_GroupChannel5(TIM_HandleTypeDef *htim, uint32_t Channels) +{ + /* Check parameters */ + assert_param(IS_TIM_COMBINED3PHASEPWM_INSTANCE(htim->Instance)); + assert_param(IS_TIM_GROUPCH5(Channels)); + + /* Process Locked */ + __HAL_LOCK(htim); + + htim->State = HAL_TIM_STATE_BUSY; + + /* Clear GC5Cx bit fields */ + htim->Instance->CCR5 &= ~(TIM_CCR5_GC5C3 | TIM_CCR5_GC5C2 | TIM_CCR5_GC5C1); + + /* Set GC5Cx bit fields */ + htim->Instance->CCR5 |= Channels; + + /* Change the htim state */ + htim->State = HAL_TIM_STATE_READY; + + __HAL_UNLOCK(htim); + + return HAL_OK; +} +#endif /* TIM_CCR5_CCR5 */ + +/** + * @} + */ + +/** @defgroup TIMEx_Exported_Functions_Group6 Extended Callbacks functions + * @brief Extended Callbacks functions + * +@verbatim + ============================================================================== + ##### Extended Callbacks functions ##### + ============================================================================== + [..] + This section provides Extended TIM callback functions: + (+) Timer Commutation callback + (+) Timer Break callback + +@endverbatim + * @{ + */ + +/** + * @brief Hall commutation changed callback in non-blocking mode + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIMEx_CommutCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIMEx_CommutCallback could be implemented in the user file + */ +} +/** + * @brief Hall commutation changed half complete callback in non-blocking mode + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIMEx_CommutHalfCpltCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIMEx_CommutHalfCpltCallback could be implemented in the user file + */ +} + +/** + * @brief Hall Break detection callback in non-blocking mode + * @param htim TIM handle + * @retval None + */ +__weak void HAL_TIMEx_BreakCallback(TIM_HandleTypeDef *htim) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(htim); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_TIMEx_BreakCallback could be implemented in the user file + */ +} + +#if defined(TIM_BDTR_BK2E) +/** + * @brief Hall Break2 detection callback in non blocking mode + * @param htim: TIM handle + * @retval None + */ +__weak void HAL_TIMEx_Break2Callback(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_Break2Callback could be implemented in the user file + */ +} +#endif /* TIM_BDTR_BK2E */ +/** + * @} + */ + +/** @defgroup TIMEx_Exported_Functions_Group7 Extended Peripheral State functions + * @brief Extended Peripheral State functions + * +@verbatim + ============================================================================== + ##### Extended Peripheral State functions ##### + ============================================================================== + [..] + This subsection permits to get in run-time the status of the peripheral + and the data flow. + +@endverbatim + * @{ + */ + +/** + * @brief Return the TIM Hall Sensor interface handle state. + * @param htim TIM Hall Sensor handle + * @retval HAL state + */ +HAL_TIM_StateTypeDef HAL_TIMEx_HallSensor_GetState(TIM_HandleTypeDef *htim) +{ + return htim->State; +} + +/** + * @brief Return actual state of the TIM complementary channel. + * @param htim TIM handle + * @param ChannelN TIM Complementary channel + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 + * @arg TIM_CHANNEL_2: TIM Channel 2 + * @arg TIM_CHANNEL_3: TIM Channel 3 + * @retval TIM Complementary channel state + */ +HAL_TIM_ChannelStateTypeDef HAL_TIMEx_GetChannelNState(TIM_HandleTypeDef *htim, uint32_t ChannelN) +{ + HAL_TIM_ChannelStateTypeDef channel_state; + + /* Check the parameters */ + assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, ChannelN)); + + channel_state = TIM_CHANNEL_N_STATE_GET(htim, ChannelN); + + return channel_state; +} +/** + * @} + */ + +/** + * @} + */ + +/* Private functions ---------------------------------------------------------*/ +/** @defgroup TIMEx_Private_Functions TIMEx Private Functions + * @{ + */ + +/** + * @brief TIM DMA Commutation callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +void TIMEx_DMACommutationCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + /* Change the htim state */ + htim->State = HAL_TIM_STATE_READY; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->CommutationCallback(htim); +#else + HAL_TIMEx_CommutCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ +} + +/** + * @brief TIM DMA Commutation half complete callback. + * @param hdma pointer to DMA handle. + * @retval None + */ +void TIMEx_DMACommutationHalfCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + /* Change the htim state */ + htim->State = HAL_TIM_STATE_READY; + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->CommutationHalfCpltCallback(htim); +#else + HAL_TIMEx_CommutHalfCpltCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ +} + + +/** + * @brief TIM DMA Delay Pulse complete callback (complementary channel). + * @param hdma pointer to DMA handle. + * @retval None + */ +static void TIM_DMADelayPulseNCplt(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + if (hdma == htim->hdma[TIM_DMA_ID_CC1]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; + + if (hdma->Init.Mode == DMA_NORMAL) + { + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + } + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; + + if (hdma->Init.Mode == DMA_NORMAL) + { + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + } + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; + + if (hdma->Init.Mode == DMA_NORMAL) + { + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY); + } + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC4]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; + + if (hdma->Init.Mode == DMA_NORMAL) + { + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_4, HAL_TIM_CHANNEL_STATE_READY); + } + } + else + { + /* nothing to do */ + } + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->PWM_PulseFinishedCallback(htim); +#else + HAL_TIM_PWM_PulseFinishedCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; +} + +/** + * @brief TIM DMA error callback (complementary channel) + * @param hdma pointer to DMA handle. + * @retval None + */ +static void TIM_DMAErrorCCxN(DMA_HandleTypeDef *hdma) +{ + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent; + + if (hdma == htim->hdma[TIM_DMA_ID_CC1]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1; + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_1, HAL_TIM_CHANNEL_STATE_READY); + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC2]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2; + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_2, HAL_TIM_CHANNEL_STATE_READY); + } + else if (hdma == htim->hdma[TIM_DMA_ID_CC3]) + { + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3; + TIM_CHANNEL_N_STATE_SET(htim, TIM_CHANNEL_3, HAL_TIM_CHANNEL_STATE_READY); + } + else + { + /* nothing to do */ + } + +#if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) + htim->ErrorCallback(htim); +#else + HAL_TIM_ErrorCallback(htim); +#endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ + + htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; +} + +/** + * @brief Enables or disables the TIM Capture Compare Channel xN. + * @param TIMx to select the TIM peripheral + * @param Channel specifies the TIM Channel + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 + * @arg TIM_CHANNEL_2: TIM Channel 2 + * @arg TIM_CHANNEL_3: TIM Channel 3 + * @param ChannelNState specifies the TIM Channel CCxNE bit new state. + * This parameter can be: TIM_CCxN_ENABLE or TIM_CCxN_Disable. + * @retval None + */ +static void TIM_CCxNChannelCmd(TIM_TypeDef *TIMx, uint32_t Channel, uint32_t ChannelNState) +{ + uint32_t tmp; + + tmp = TIM_CCER_CC1NE << (Channel & 0x1FU); /* 0x1FU = 31 bits max shift */ + + /* Reset the CCxNE Bit */ + TIMx->CCER &= ~tmp; + + /* Set or reset the CCxNE Bit */ + TIMx->CCER |= (uint32_t)(ChannelNState << (Channel & 0x1FU)); /* 0x1FU = 31 bits max shift */ +} +/** + * @} + */ + +#endif /* HAL_TIM_MODULE_ENABLED */ +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/BMS_Testbench/BMS_Software_V1/Makefile b/BMS_Testbench/BMS_Software_V1/Makefile new file mode 100644 index 0000000..4f9ac55 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Makefile @@ -0,0 +1,193 @@ +########################################################################################################################## +# File automatically-generated by tool: [projectgenerator] version: [3.19.2] date: [Sat Apr 15 20:04:42 CEST 2023] +########################################################################################################################## + +# ------------------------------------------------ +# Generic Makefile (based on gcc) +# +# ChangeLog : +# 2017-02-10 - Several enhancements + project update mode +# 2015-07-22 - first version +# ------------------------------------------------ + +###################################### +# target +###################################### +TARGET = ams-slave-23 + + +###################################### +# building variables +###################################### +# debug build? +DEBUG = 1 +# optimization +OPT = -Og + + +####################################### +# paths +####################################### +# Build path +BUILD_DIR = build + +###################################### +# source +###################################### +# C sources +C_SOURCES = \ +Core/Src/main.c \ +Core/Src/stm32f3xx_it.c \ +Core/Src/stm32f3xx_hal_msp.c \ +Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c \ +Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c \ +Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c \ +Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c \ +Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c \ +Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c \ +Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c \ +Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c \ +Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c \ +Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c \ +Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c \ +Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c \ +Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c \ +Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c \ +Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c \ +Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c \ +Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.c \ +Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.c \ +Core/Src/system_stm32f3xx.c + +# ASM sources +ASM_SOURCES = \ +startup_stm32f302xc.s + + +####################################### +# binaries +####################################### +PREFIX = arm-none-eabi- +# The gcc compiler bin path can be either defined in make command via GCC_PATH variable (> make GCC_PATH=xxx) +# either it can be added to the PATH environment variable. +ifdef GCC_PATH +CC = $(GCC_PATH)/$(PREFIX)gcc +AS = $(GCC_PATH)/$(PREFIX)gcc -x assembler-with-cpp +CP = $(GCC_PATH)/$(PREFIX)objcopy +SZ = $(GCC_PATH)/$(PREFIX)size +else +CC = $(PREFIX)gcc +AS = $(PREFIX)gcc -x assembler-with-cpp +CP = $(PREFIX)objcopy +SZ = $(PREFIX)size +endif +HEX = $(CP) -O ihex +BIN = $(CP) -O binary -S + +####################################### +# CFLAGS +####################################### +# cpu +CPU = -mcpu=cortex-m4 + +# fpu +FPU = -mfpu=fpv4-sp-d16 + +# float-abi +FLOAT-ABI = -mfloat-abi=hard + +# mcu +MCU = $(CPU) -mthumb $(FPU) $(FLOAT-ABI) + +# macros for gcc +# AS defines +AS_DEFS = + +# C defines +C_DEFS = \ +-DUSE_HAL_DRIVER \ +-DSTM32F302xC + + +# AS includes +AS_INCLUDES = + +# C includes +C_INCLUDES = \ +-ICore/Inc \ +-IDrivers/STM32F3xx_HAL_Driver/Inc \ +-IDrivers/STM32F3xx_HAL_Driver/Inc/Legacy \ +-IDrivers/CMSIS/Device/ST/STM32F3xx/Include \ +-IDrivers/CMSIS/Include + + +# compile gcc flags +ASFLAGS = $(MCU) $(AS_DEFS) $(AS_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections + +CFLAGS += $(MCU) $(C_DEFS) $(C_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections + +ifeq ($(DEBUG), 1) +CFLAGS += -g -gdwarf-2 +endif + + +# Generate dependency information +CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)" + + +####################################### +# LDFLAGS +####################################### +# link script +LDSCRIPT = STM32F302CCTx_FLASH.ld + +# libraries +LIBS = -lc -lm -lnosys +LIBDIR = +LDFLAGS = $(MCU) -specs=nano.specs -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections + +# default action: build all +all: $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).bin + + +####################################### +# build the application +####################################### +# list of objects +OBJECTS = $(addprefix $(BUILD_DIR)/,$(notdir $(C_SOURCES:.c=.o))) +vpath %.c $(sort $(dir $(C_SOURCES))) +# list of ASM program objects +OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(ASM_SOURCES:.s=.o))) +vpath %.s $(sort $(dir $(ASM_SOURCES))) + +$(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR) + $(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) $< -o $@ + +$(BUILD_DIR)/%.o: %.s Makefile | $(BUILD_DIR) + $(AS) -c $(CFLAGS) $< -o $@ + +$(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) Makefile + $(CC) $(OBJECTS) $(LDFLAGS) -o $@ + $(SZ) $@ + +$(BUILD_DIR)/%.hex: $(BUILD_DIR)/%.elf | $(BUILD_DIR) + $(HEX) $< $@ + +$(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf | $(BUILD_DIR) + $(BIN) $< $@ + +$(BUILD_DIR): + mkdir $@ + +####################################### +# clean up +####################################### +clean: + -rm -fR $(BUILD_DIR) + +####################################### +# dependencies +####################################### +-include $(wildcard $(BUILD_DIR)/*.d) + +# *** EOF *** \ No newline at end of file diff --git a/BMS_Testbench/BMS_Software_V1/STM32-for-VSCode.config.yaml b/BMS_Testbench/BMS_Software_V1/STM32-for-VSCode.config.yaml new file mode 100644 index 0000000..898440f --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/STM32-for-VSCode.config.yaml @@ -0,0 +1,107 @@ +# Configuration file for the STM32 for VSCode extension +# Arrays can be inputted in two ways. One is: [entry_1, entry_2, ..., entry_final] +# or by adding an indented list below the variable name e.g.: +# VARIABLE: +# - entry_1 +# - entry_2 + +# The project name +target: ams-slave-23 +# Can be C or C++ +language: C + +optimization: Og + +# MCU settings +targetMCU: stm32f3x +cpu: cortex-m4 # type of cpu e.g. cortex-m4 +fpu: fpv4-sp-d16 # Defines how floating points are defined. Can be left empty. +floatAbi: -mfloat-abi=hard +ldscript: STM32F302CCTx_FLASH.ld # linker script + +# Compiler definitions. The -D prefix for the compiler will be automatically added. +cDefinitions: [] +cxxDefinitions: [] +asDefinitions: [] + +# Compiler definition files. you can add a single files or an array of files for different definitions. +# The file is expected to have a definition each new line. +# This allows to include for example a .definition file which can be ignored in git and can contain +# This can be convenient for passing along secrets at compile time, or generating a file for per device setup. +cDefinitionsFile: +cxxDefinitionsFile: +asDefinitionsFile: + +# Compiler flags +cFlags: + - -Wall + - -fdata-sections + - -ffunction-sections + +cxxFlags: [] +assemblyFlags: + - -Wall + - -fdata-sections + - -ffunction-sections + +linkerFlags: [] + +# libraries to be included. The -l prefix to the library will be automatically added. +libraries: + - c + - m + +# Library directories. Folders can be added here that contain custom libraries. +libraryDirectories: [] + +# Files or folders that will be excluded from compilation. +# Glob patterns (https://www.wikiwand.com/en/Glob_(programming)) can be used. +# Do mind that double stars are reserved in yaml +# these should be escaped with a: \ or the name should be in double quotes e.g. "**.test.**" +excludes: + - "**/Examples/**" + - "**/examples/**" + - "**/Example/**" + - "**/example/**" + - "**_template.*" + + +# Include directories (directories containing .h or .hpp files) +# If a CubeMX makefile is present it will automatically include the include directories from that makefile. +includeDirectories: + - Inc/** + - Core/Inc/** + - Core/Lib/** + - Src/** + - Core/Src/** + - Core/Lib/** + + +# Files that should be included in the compilation. +# If a CubeMX makefile is present it will automatically include the c and cpp/cxx files from that makefile. +# Glob patterns (https://www.wikiwand.com/en/Glob_(programming)) can be used. +# Do mind that double stars are reserved in yaml +# these should be escaped with a: \ or the name should be in double quotes e.g. "HARDWARE_DRIVER*.c" +sourceFiles: + - Src/** + - Core/Src/** + - Core/Lib/** + + +# When no makefile is present it will show a warning pop-up. +# However when compilation without the CubeMX Makefile is desired, this can be turned of. +suppressMakefileWarning: false + +# Custom makefile rules +# Here custom makefile rules can be added to the STM32Make.make file +# an example of how this can be used is commented out below. +customMakefileRules: +# - command: sayhello +# rule: echo "hello" +# dependsOn: $(BUILD_DIR)/$(TARGET).elf # can be left out + +# Additional flags which will be used when invoking the make command +makeFlags: +# - -O # use this option when the output of make is mixed up only works for make version 4.0 and upwards +# - --silent # use this option to silence the output of the build + \ No newline at end of file diff --git a/BMS_Testbench/BMS_Software_V1/STM32F102xx.svd b/BMS_Testbench/BMS_Software_V1/STM32F102xx.svd new file mode 100644 index 0000000..9b0b41f --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/STM32F102xx.svd @@ -0,0 +1,9041 @@ + + + STM32F102xx + 1.1 + STM32F102xx + + + 8 + + 32 + + 0x20 + 0x0 + 0xFFFFFFFF + + + PWR + Power control + PWR + 0x40007000 + + 0x0 + 0x400 + registers + + + PVD_IRQ + PVD through EXTI line detection + interrupt + 1 + + + + CR + CR + Power control register + (PWR_CR) + 0x0 + 0x20 + read-write + 0x00000000 + + + LPDS + Low Power Deep Sleep + 0 + 1 + + + PDDS + Power Down Deep Sleep + 1 + 1 + + + CWUF + Clear Wake-up Flag + 2 + 1 + + + CSBF + Clear STANDBY Flag + 3 + 1 + + + PVDE + Power Voltage Detector + Enable + 4 + 1 + + + PLS + PVD Level Selection + 5 + 3 + + + DBP + Disable Backup Domain write + protection + 8 + 1 + + + + + CSR + CSR + Power control register + (PWR_CR) + 0x4 + 0x20 + 0x00000000 + + + WUF + Wake-Up Flag + 0 + 1 + read-only + + + SBF + STANDBY Flag + 1 + 1 + read-only + + + PVDO + PVD Output + 2 + 1 + read-only + + + EWUP + Enable WKUP pin + 8 + 1 + read-write + + + + + + + RCC + Reset and clock control + RCC + 0x40021000 + + 0x0 + 0x400 + registers + + + RCC_IRQ + RCC global interrupt + 5 + + + + CR + CR + Clock control register + 0x0 + 0x20 + 0x00000083 + + + HSION + Internal High Speed clock + enable + 0 + 1 + read-write + + + HSIRDY + Internal High Speed clock ready + flag + 1 + 1 + read-only + + + HSITRIM + Internal High Speed clock + trimming + 3 + 5 + read-write + + + HSICAL + Internal High Speed clock + Calibration + 8 + 8 + read-only + + + HSEON + External High Speed clock + enable + 16 + 1 + read-write + + + HSERDY + External High Speed clock ready + flag + 17 + 1 + read-only + + + HSEBYP + External High Speed clock + Bypass + 18 + 1 + read-write + + + CSSON + Clock Security System + enable + 19 + 1 + read-write + + + PLLON + PLL enable + 24 + 1 + read-write + + + PLLRDY + PLL clock ready flag + 25 + 1 + read-only + + + + + CFGR + CFGR + Clock configuration register + (RCC_CFGR) + 0x4 + 0x20 + 0x00000000 + + + SW + System clock Switch + 0 + 2 + read-write + + + SWS + System Clock Switch Status + 2 + 2 + read-only + + + HPRE + AHB prescaler + 4 + 4 + read-write + + + PPRE1 + APB Low speed prescaler + (APB1) + 8 + 3 + read-write + + + PPRE2 + APB High speed prescaler + (APB2) + 11 + 3 + read-write + + + ADCPRE + ADC prescaler + 14 + 2 + read-write + + + PLLSRC + PLL entry clock source + 16 + 1 + read-write + + + PLLXTPRE + HSE divider for PLL entry + 17 + 1 + read-write + + + PLLMUL + PLL Multiplication Factor + 18 + 4 + read-write + + + MCO + Microcontroller clock + output + 24 + 3 + read-write + + + + + CIR + CIR + Clock interrupt register + (RCC_CIR) + 0x8 + 0x20 + 0x00000000 + + + LSIRDYF + LSI Ready Interrupt flag + 0 + 1 + read-only + + + LSERDYF + LSE Ready Interrupt flag + 1 + 1 + read-only + + + HSIRDYF + HSI Ready Interrupt flag + 2 + 1 + read-only + + + HSERDYF + HSE Ready Interrupt flag + 3 + 1 + read-only + + + PLLRDYF + PLL Ready Interrupt flag + 4 + 1 + read-only + + + CSSF + Clock Security System Interrupt + flag + 7 + 1 + read-only + + + LSIRDYIE + LSI Ready Interrupt Enable + 8 + 1 + read-write + + + LSERDYIE + LSE Ready Interrupt Enable + 9 + 1 + read-write + + + HSIRDYIE + HSI Ready Interrupt Enable + 10 + 1 + read-write + + + HSERDYIE + HSE Ready Interrupt Enable + 11 + 1 + read-write + + + PLLRDYIE + PLL Ready Interrupt Enable + 12 + 1 + read-write + + + LSIRDYC + LSI Ready Interrupt Clear + 16 + 1 + write-only + + + LSERDYC + LSE Ready Interrupt Clear + 17 + 1 + write-only + + + HSIRDYC + HSI Ready Interrupt Clear + 18 + 1 + write-only + + + HSERDYC + HSE Ready Interrupt Clear + 19 + 1 + write-only + + + PLLRDYC + PLL Ready Interrupt Clear + 20 + 1 + write-only + + + CSSC + Clock security system interrupt + clear + 23 + 1 + write-only + + + + + APB2RSTR + APB2RSTR + APB2 peripheral reset register + (RCC_APB2RSTR) + 0xC + 0x20 + read-write + 0x000000000 + + + AFIORST + Alternate function I/O + reset + 0 + 1 + + + IOPARST + IO port A reset + 2 + 1 + + + IOPBRST + IO port B reset + 3 + 1 + + + IOPCRST + IO port C reset + 4 + 1 + + + IOPDRST + IO port D reset + 5 + 1 + + + ADC1RST + ADC 1 interface reset + 9 + 1 + + + SPI1RST + SPI 1 reset + 12 + 1 + + + USART1RST + USART1 reset + 14 + 1 + + + + + APB1RSTR + APB1RSTR + APB1 peripheral reset register + (RCC_APB1RSTR) + 0x10 + 0x20 + read-write + 0x00000000 + + + TIM2RST + Timer 2 reset + 0 + 1 + + + TIM3RST + Timer 3 reset + 1 + 1 + + + WWDGRST + Window watchdog reset + 11 + 1 + + + USART2RST + USART 2 reset + 17 + 1 + + + I2C1RST + I2C1 reset + 21 + 1 + + + BKPRST + Backup interface reset + 27 + 1 + + + PWRRST + Power interface reset + 28 + 1 + + + + + AHBENR + AHBENR + AHB Peripheral Clock enable register + (RCC_AHBENR) + 0x14 + 0x20 + read-write + 0x00000014 + + + DMA1EN + DMA1 clock enable + 0 + 1 + + + DMA2EN + DMA2 clock enable + 1 + 1 + + + SRAMEN + SRAM interface clock + enable + 2 + 1 + + + FLITFEN + FLITF clock enable + 4 + 1 + + + CRCEN + CRC clock enable + 6 + 1 + + + + + APB2ENR + APB2ENR + APB2 peripheral clock enable register + (RCC_APB2ENR) + 0x18 + 0x20 + read-write + 0x00000000 + + + AFIOEN + Alternate function I/O clock + enable + 0 + 1 + + + IOPAEN + I/O port A clock enable + 2 + 1 + + + IOPBEN + I/O port B clock enable + 3 + 1 + + + IOPCEN + I/O port C clock enable + 4 + 1 + + + IOPDEN + I/O port D clock enable + 5 + 1 + + + ADC1EN + ADC 1 interface clock + enable + 9 + 1 + + + SPI1EN + SPI 1 clock enable + 12 + 1 + + + USART1EN + USART1 clock enable + 14 + 1 + + + + + APB1ENR + APB1ENR + APB1 peripheral clock enable register + (RCC_APB1ENR) + 0x1C + 0x20 + read-write + 0x00000000 + + + TIM2EN + Timer 2 clock enable + 0 + 1 + + + TIM3EN + Timer 3 clock enable + 1 + 1 + + + WWDGEN + Window watchdog clock + enable + 11 + 1 + + + USART2EN + USART 2 clock enable + 17 + 1 + + + I2C1EN + I2C 1 clock enable + 21 + 1 + + + BKPEN + Backup interface clock + enable + 27 + 1 + + + PWREN + Power interface clock + enable + 28 + 1 + + + + + BDCR + BDCR + Backup domain control register + (RCC_BDCR) + 0x20 + 0x20 + 0x00000000 + + + LSEON + External Low Speed oscillator + enable + 0 + 1 + read-write + + + LSERDY + External Low Speed oscillator + ready + 1 + 1 + read-only + + + LSEBYP + External Low Speed oscillator + bypass + 2 + 1 + read-write + + + RTCSEL + RTC clock source selection + 8 + 2 + read-write + + + RTCEN + RTC clock enable + 15 + 1 + read-write + + + BDRST + Backup domain software + reset + 16 + 1 + read-write + + + + + CSR + CSR + Control/status register + (RCC_CSR) + 0x24 + 0x20 + 0x0C000000 + + + LSION + Internal low speed oscillator + enable + 0 + 1 + read-write + + + LSIRDY + Internal low speed oscillator + ready + 1 + 1 + read-only + + + RMVF + Remove reset flag + 24 + 1 + read-write + + + PINRSTF + PIN reset flag + 26 + 1 + read-write + + + PORRSTF + POR/PDR reset flag + 27 + 1 + read-write + + + SFTRSTF + Software reset flag + 28 + 1 + read-write + + + IWDGRSTF + Independent watchdog reset + flag + 29 + 1 + read-write + + + WWDGRSTF + Window watchdog reset flag + 30 + 1 + read-write + + + LPWRRSTF + Low-power reset flag + 31 + 1 + read-write + + + + + + + GPIOA + General purpose I/O + GPIO + 0x40010800 + + 0x0 + 0x400 + registers + + + + CRL + CRL + Port configuration register low + (GPIOn_CRL) + 0x0 + 0x20 + read-write + 0x44444444 + + + MODE0 + Port n.0 mode bits + 0 + 2 + + + CNF0 + Port n.0 configuration + bits + 2 + 2 + + + MODE1 + Port n.1 mode bits + 4 + 2 + + + CNF1 + Port n.1 configuration + bits + 6 + 2 + + + MODE2 + Port n.2 mode bits + 8 + 2 + + + CNF2 + Port n.2 configuration + bits + 10 + 2 + + + MODE3 + Port n.3 mode bits + 12 + 2 + + + CNF3 + Port n.3 configuration + bits + 14 + 2 + + + MODE4 + Port n.4 mode bits + 16 + 2 + + + CNF4 + Port n.4 configuration + bits + 18 + 2 + + + MODE5 + Port n.5 mode bits + 20 + 2 + + + CNF5 + Port n.5 configuration + bits + 22 + 2 + + + MODE6 + Port n.6 mode bits + 24 + 2 + + + CNF6 + Port n.6 configuration + bits + 26 + 2 + + + MODE7 + Port n.7 mode bits + 28 + 2 + + + CNF7 + Port n.7 configuration + bits + 30 + 2 + + + + + CRH + CRH + Port configuration register high + (GPIOn_CRL) + 0x4 + 0x20 + read-write + 0x44444444 + + + MODE8 + Port n.8 mode bits + 0 + 2 + + + CNF8 + Port n.8 configuration + bits + 2 + 2 + + + MODE9 + Port n.9 mode bits + 4 + 2 + + + CNF9 + Port n.9 configuration + bits + 6 + 2 + + + MODE10 + Port n.10 mode bits + 8 + 2 + + + CNF10 + Port n.10 configuration + bits + 10 + 2 + + + MODE11 + Port n.11 mode bits + 12 + 2 + + + CNF11 + Port n.11 configuration + bits + 14 + 2 + + + MODE12 + Port n.12 mode bits + 16 + 2 + + + CNF12 + Port n.12 configuration + bits + 18 + 2 + + + MODE13 + Port n.13 mode bits + 20 + 2 + + + CNF13 + Port n.13 configuration + bits + 22 + 2 + + + MODE14 + Port n.14 mode bits + 24 + 2 + + + CNF14 + Port n.14 configuration + bits + 26 + 2 + + + MODE15 + Port n.15 mode bits + 28 + 2 + + + CNF15 + Port n.15 configuration + bits + 30 + 2 + + + + + IDR + IDR + Port input data register + (GPIOn_IDR) + 0x8 + 0x20 + read-only + 0x00000000 + + + IDR0 + Port input data + 0 + 1 + + + IDR1 + Port input data + 1 + 1 + + + IDR2 + Port input data + 2 + 1 + + + IDR3 + Port input data + 3 + 1 + + + IDR4 + Port input data + 4 + 1 + + + IDR5 + Port input data + 5 + 1 + + + IDR6 + Port input data + 6 + 1 + + + IDR7 + Port input data + 7 + 1 + + + IDR8 + Port input data + 8 + 1 + + + IDR9 + Port input data + 9 + 1 + + + IDR10 + Port input data + 10 + 1 + + + IDR11 + Port input data + 11 + 1 + + + IDR12 + Port input data + 12 + 1 + + + IDR13 + Port input data + 13 + 1 + + + IDR14 + Port input data + 14 + 1 + + + IDR15 + Port input data + 15 + 1 + + + + + ODR + ODR + Port output data register + (GPIOn_ODR) + 0xC + 0x20 + read-write + 0x00000000 + + + ODR0 + Port output data + 0 + 1 + + + ODR1 + Port output data + 1 + 1 + + + ODR2 + Port output data + 2 + 1 + + + ODR3 + Port output data + 3 + 1 + + + ODR4 + Port output data + 4 + 1 + + + ODR5 + Port output data + 5 + 1 + + + ODR6 + Port output data + 6 + 1 + + + ODR7 + Port output data + 7 + 1 + + + ODR8 + Port output data + 8 + 1 + + + ODR9 + Port output data + 9 + 1 + + + ODR10 + Port output data + 10 + 1 + + + ODR11 + Port output data + 11 + 1 + + + ODR12 + Port output data + 12 + 1 + + + ODR13 + Port output data + 13 + 1 + + + ODR14 + Port output data + 14 + 1 + + + ODR15 + Port output data + 15 + 1 + + + + + BSRR + BSRR + Port bit set/reset register + (GPIOn_BSRR) + 0x10 + 0x20 + write-only + 0x00000000 + + + BS0 + Set bit 0 + 0 + 1 + + + BS1 + Set bit 1 + 1 + 1 + + + BS2 + Set bit 1 + 2 + 1 + + + BS3 + Set bit 3 + 3 + 1 + + + BS4 + Set bit 4 + 4 + 1 + + + BS5 + Set bit 5 + 5 + 1 + + + BS6 + Set bit 6 + 6 + 1 + + + BS7 + Set bit 7 + 7 + 1 + + + BS8 + Set bit 8 + 8 + 1 + + + BS9 + Set bit 9 + 9 + 1 + + + BS10 + Set bit 10 + 10 + 1 + + + BS11 + Set bit 11 + 11 + 1 + + + BS12 + Set bit 12 + 12 + 1 + + + BS13 + Set bit 13 + 13 + 1 + + + BS14 + Set bit 14 + 14 + 1 + + + BS15 + Set bit 15 + 15 + 1 + + + BR0 + Reset bit 0 + 16 + 1 + + + BR1 + Reset bit 1 + 17 + 1 + + + BR2 + Reset bit 2 + 18 + 1 + + + BR3 + Reset bit 3 + 19 + 1 + + + BR4 + Reset bit 4 + 20 + 1 + + + BR5 + Reset bit 5 + 21 + 1 + + + BR6 + Reset bit 6 + 22 + 1 + + + BR7 + Reset bit 7 + 23 + 1 + + + BR8 + Reset bit 8 + 24 + 1 + + + BR9 + Reset bit 9 + 25 + 1 + + + BR10 + Reset bit 10 + 26 + 1 + + + BR11 + Reset bit 11 + 27 + 1 + + + BR12 + Reset bit 12 + 28 + 1 + + + BR13 + Reset bit 13 + 29 + 1 + + + BR14 + Reset bit 14 + 30 + 1 + + + BR15 + Reset bit 15 + 31 + 1 + + + + + BRR + BRR + Port bit reset register + (GPIOn_BRR) + 0x14 + 0x20 + write-only + 0x00000000 + + + BR0 + Reset bit 0 + 0 + 1 + + + BR1 + Reset bit 1 + 1 + 1 + + + BR2 + Reset bit 1 + 2 + 1 + + + BR3 + Reset bit 3 + 3 + 1 + + + BR4 + Reset bit 4 + 4 + 1 + + + BR5 + Reset bit 5 + 5 + 1 + + + BR6 + Reset bit 6 + 6 + 1 + + + BR7 + Reset bit 7 + 7 + 1 + + + BR8 + Reset bit 8 + 8 + 1 + + + BR9 + Reset bit 9 + 9 + 1 + + + BR10 + Reset bit 10 + 10 + 1 + + + BR11 + Reset bit 11 + 11 + 1 + + + BR12 + Reset bit 12 + 12 + 1 + + + BR13 + Reset bit 13 + 13 + 1 + + + BR14 + Reset bit 14 + 14 + 1 + + + BR15 + Reset bit 15 + 15 + 1 + + + + + LCKR + LCKR + Port configuration lock + register + 0x18 + 0x20 + read-write + 0x00000000 + + + LCK0 + Port A Lock bit 0 + 0 + 1 + + + LCK1 + Port A Lock bit 1 + 1 + 1 + + + LCK2 + Port A Lock bit 2 + 2 + 1 + + + LCK3 + Port A Lock bit 3 + 3 + 1 + + + LCK4 + Port A Lock bit 4 + 4 + 1 + + + LCK5 + Port A Lock bit 5 + 5 + 1 + + + LCK6 + Port A Lock bit 6 + 6 + 1 + + + LCK7 + Port A Lock bit 7 + 7 + 1 + + + LCK8 + Port A Lock bit 8 + 8 + 1 + + + LCK9 + Port A Lock bit 9 + 9 + 1 + + + LCK10 + Port A Lock bit 10 + 10 + 1 + + + LCK11 + Port A Lock bit 11 + 11 + 1 + + + LCK12 + Port A Lock bit 12 + 12 + 1 + + + LCK13 + Port A Lock bit 13 + 13 + 1 + + + LCK14 + Port A Lock bit 14 + 14 + 1 + + + LCK15 + Port A Lock bit 15 + 15 + 1 + + + LCKK + Lock key + 16 + 1 + + + + + + + GPIOB + 0x40010C00 + + + GPIOC + 0x40011000 + + + GPIOD + 0x40011400 + + + AFIO + Alternate function I/O + AFIO + 0x40010000 + + 0x0 + 0x400 + registers + + + + EVCR + EVCR + Event Control Register + (AFIO_EVCR) + 0x0 + 0x20 + read-write + 0x00000000 + + + PIN + Pin selection + 0 + 4 + + + PORT + Port selection + 4 + 3 + + + EVOE + Event Output Enable + 7 + 1 + + + + + MAPR + MAPR + AF remap and debug I/O configuration + register (AFIO_MAPR) + 0x4 + 0x20 + 0x00000000 + + + SPI1_REMAP + SPI1 remapping + 0 + 1 + read-write + + + I2C1_REMAP + I2C1 remapping + 1 + 1 + read-write + + + USART1_REMAP + USART1 remapping + 2 + 1 + read-write + + + USART2_REMAP + USART2 remapping + 3 + 1 + read-write + + + USART3_REMAP + USART3 remapping + 4 + 2 + read-write + + + TIM1_REMAP + TIM1 remapping + 6 + 2 + read-write + + + TIM2_REMAP + TIM2 remapping + 8 + 2 + read-write + + + TIM3_REMAP + TIM3 remapping + 10 + 2 + read-write + + + TIM4_REMAP + TIM4 remapping + 12 + 1 + read-write + + + CAN_REMAP + CAN1 remapping + 13 + 2 + read-write + + + PD01_REMAP + Port D0/Port D1 mapping on + OSCIN/OSCOUT + 15 + 1 + read-write + + + TIM5CH4_IREMAP + Set and cleared by + software + 16 + 1 + read-write + + + ADC1_ETRGINJ_REMAP + ADC 1 External trigger injected + conversion remapping + 17 + 1 + read-write + + + ADC1_ETRGREG_REMAP + ADC 1 external trigger regular + conversion remapping + 18 + 1 + read-write + + + ADC2_ETRGINJ_REMAP + ADC 2 external trigger injected + conversion remapping + 19 + 1 + read-write + + + ADC2_ETRGREG_REMAP + ADC 2 external trigger regular + conversion remapping + 20 + 1 + read-write + + + SWJ_CFG + Serial wire JTAG + configuration + 24 + 3 + write-only + + + + + EXTICR1 + EXTICR1 + External interrupt configuration register 1 + (AFIO_EXTICR1) + 0x8 + 0x20 + read-write + 0x00000000 + + + EXTI0 + EXTI0 configuration + 0 + 4 + + + EXTI1 + EXTI1 configuration + 4 + 4 + + + EXTI2 + EXTI2 configuration + 8 + 4 + + + EXTI3 + EXTI3 configuration + 12 + 4 + + + + + EXTICR2 + EXTICR2 + External interrupt configuration register 2 + (AFIO_EXTICR2) + 0xC + 0x20 + read-write + 0x00000000 + + + EXTI4 + EXTI4 configuration + 0 + 4 + + + EXTI5 + EXTI5 configuration + 4 + 4 + + + EXTI6 + EXTI6 configuration + 8 + 4 + + + EXTI7 + EXTI7 configuration + 12 + 4 + + + + + EXTICR3 + EXTICR3 + External interrupt configuration register 3 + (AFIO_EXTICR3) + 0x10 + 0x20 + read-write + 0x00000000 + + + EXTI8 + EXTI8 configuration + 0 + 4 + + + EXTI9 + EXTI9 configuration + 4 + 4 + + + EXTI10 + EXTI10 configuration + 8 + 4 + + + EXTI11 + EXTI11 configuration + 12 + 4 + + + + + EXTICR4 + EXTICR4 + External interrupt configuration register 4 + (AFIO_EXTICR4) + 0x14 + 0x20 + read-write + 0x00000000 + + + EXTI12 + EXTI12 configuration + 0 + 4 + + + EXTI13 + EXTI13 configuration + 4 + 4 + + + EXTI14 + EXTI14 configuration + 8 + 4 + + + EXTI15 + EXTI15 configuration + 12 + 4 + + + + + MAPR2 + MAPR2 + AF remap and debug I/O configuration + register + 0x1C + 0x20 + read-write + 0x00000000 + + + TIM9_REMAP + TIM9 remapping + 5 + 1 + + + TIM10_REMAP + TIM10 remapping + 6 + 1 + + + TIM11_REMAP + TIM11 remapping + 7 + 1 + + + TIM13_REMAP + TIM13 remapping + 8 + 1 + + + TIM14_REMAP + TIM14 remapping + 9 + 1 + + + FSMC_NADV + NADV connect/disconnect + 10 + 1 + + + + + + + EXTI + EXTI + EXTI + 0x40010400 + + 0x0 + 0x400 + registers + + + TAMPER_IRQ + Tamper interrupt + 2 + + + EXTI0_IRQ + EXTI Line0 interrupt + 6 + + + EXTI1_IRQ + EXTI Line1 interrupt + 7 + + + EXTI2_IRQ + EXTI Line2 interrupt + 8 + + + EXTI3_IRQ + EXTI Line3 interrupt + 9 + + + EXTI4_IRQ + EXTI Line4 interrupt + 10 + + + EXTI9_5_IRQ + EXTI Line[9:5] interrupts + 23 + + + EXTI15_10_IRQ + EXTI Line[15:10] interrupts + 40 + + + + IMR + IMR + Interrupt mask register + (EXTI_IMR) + 0x0 + 0x20 + read-write + 0x00000000 + + + MR0 + Interrupt Mask on line 0 + 0 + 1 + + + MR1 + Interrupt Mask on line 1 + 1 + 1 + + + MR2 + Interrupt Mask on line 2 + 2 + 1 + + + MR3 + Interrupt Mask on line 3 + 3 + 1 + + + MR4 + Interrupt Mask on line 4 + 4 + 1 + + + MR5 + Interrupt Mask on line 5 + 5 + 1 + + + MR6 + Interrupt Mask on line 6 + 6 + 1 + + + MR7 + Interrupt Mask on line 7 + 7 + 1 + + + MR8 + Interrupt Mask on line 8 + 8 + 1 + + + MR9 + Interrupt Mask on line 9 + 9 + 1 + + + MR10 + Interrupt Mask on line 10 + 10 + 1 + + + MR11 + Interrupt Mask on line 11 + 11 + 1 + + + MR12 + Interrupt Mask on line 12 + 12 + 1 + + + MR13 + Interrupt Mask on line 13 + 13 + 1 + + + MR14 + Interrupt Mask on line 14 + 14 + 1 + + + MR15 + Interrupt Mask on line 15 + 15 + 1 + + + MR16 + Interrupt Mask on line 16 + 16 + 1 + + + MR17 + Interrupt Mask on line 17 + 17 + 1 + + + MR18 + Interrupt Mask on line 18 + 18 + 1 + + + + + EMR + EMR + Event mask register (EXTI_EMR) + 0x4 + 0x20 + read-write + 0x00000000 + + + MR0 + Event Mask on line 0 + 0 + 1 + + + MR1 + Event Mask on line 1 + 1 + 1 + + + MR2 + Event Mask on line 2 + 2 + 1 + + + MR3 + Event Mask on line 3 + 3 + 1 + + + MR4 + Event Mask on line 4 + 4 + 1 + + + MR5 + Event Mask on line 5 + 5 + 1 + + + MR6 + Event Mask on line 6 + 6 + 1 + + + MR7 + Event Mask on line 7 + 7 + 1 + + + MR8 + Event Mask on line 8 + 8 + 1 + + + MR9 + Event Mask on line 9 + 9 + 1 + + + MR10 + Event Mask on line 10 + 10 + 1 + + + MR11 + Event Mask on line 11 + 11 + 1 + + + MR12 + Event Mask on line 12 + 12 + 1 + + + MR13 + Event Mask on line 13 + 13 + 1 + + + MR14 + Event Mask on line 14 + 14 + 1 + + + MR15 + Event Mask on line 15 + 15 + 1 + + + MR16 + Event Mask on line 16 + 16 + 1 + + + MR17 + Event Mask on line 17 + 17 + 1 + + + MR18 + Event Mask on line 18 + 18 + 1 + + + + + RTSR + RTSR + Rising Trigger selection register + (EXTI_RTSR) + 0x8 + 0x20 + read-write + 0x00000000 + + + TR0 + Rising trigger event configuration of + line 0 + 0 + 1 + + + TR1 + Rising trigger event configuration of + line 1 + 1 + 1 + + + TR2 + Rising trigger event configuration of + line 2 + 2 + 1 + + + TR3 + Rising trigger event configuration of + line 3 + 3 + 1 + + + TR4 + Rising trigger event configuration of + line 4 + 4 + 1 + + + TR5 + Rising trigger event configuration of + line 5 + 5 + 1 + + + TR6 + Rising trigger event configuration of + line 6 + 6 + 1 + + + TR7 + Rising trigger event configuration of + line 7 + 7 + 1 + + + TR8 + Rising trigger event configuration of + line 8 + 8 + 1 + + + TR9 + Rising trigger event configuration of + line 9 + 9 + 1 + + + TR10 + Rising trigger event configuration of + line 10 + 10 + 1 + + + TR11 + Rising trigger event configuration of + line 11 + 11 + 1 + + + TR12 + Rising trigger event configuration of + line 12 + 12 + 1 + + + TR13 + Rising trigger event configuration of + line 13 + 13 + 1 + + + TR14 + Rising trigger event configuration of + line 14 + 14 + 1 + + + TR15 + Rising trigger event configuration of + line 15 + 15 + 1 + + + TR16 + Rising trigger event configuration of + line 16 + 16 + 1 + + + TR17 + Rising trigger event configuration of + line 17 + 17 + 1 + + + TR18 + Rising trigger event configuration of + line 18 + 18 + 1 + + + + + FTSR + FTSR + Falling Trigger selection register + (EXTI_FTSR) + 0xC + 0x20 + read-write + 0x00000000 + + + TR0 + Falling trigger event configuration of + line 0 + 0 + 1 + + + TR1 + Falling trigger event configuration of + line 1 + 1 + 1 + + + TR2 + Falling trigger event configuration of + line 2 + 2 + 1 + + + TR3 + Falling trigger event configuration of + line 3 + 3 + 1 + + + TR4 + Falling trigger event configuration of + line 4 + 4 + 1 + + + TR5 + Falling trigger event configuration of + line 5 + 5 + 1 + + + TR6 + Falling trigger event configuration of + line 6 + 6 + 1 + + + TR7 + Falling trigger event configuration of + line 7 + 7 + 1 + + + TR8 + Falling trigger event configuration of + line 8 + 8 + 1 + + + TR9 + Falling trigger event configuration of + line 9 + 9 + 1 + + + TR10 + Falling trigger event configuration of + line 10 + 10 + 1 + + + TR11 + Falling trigger event configuration of + line 11 + 11 + 1 + + + TR12 + Falling trigger event configuration of + line 12 + 12 + 1 + + + TR13 + Falling trigger event configuration of + line 13 + 13 + 1 + + + TR14 + Falling trigger event configuration of + line 14 + 14 + 1 + + + TR15 + Falling trigger event configuration of + line 15 + 15 + 1 + + + TR16 + Falling trigger event configuration of + line 16 + 16 + 1 + + + TR17 + Falling trigger event configuration of + line 17 + 17 + 1 + + + TR18 + Falling trigger event configuration of + line 18 + 18 + 1 + + + + + SWIER + SWIER + Software interrupt event register + (EXTI_SWIER) + 0x10 + 0x20 + read-write + 0x00000000 + + + SWIER0 + Software Interrupt on line + 0 + 0 + 1 + + + SWIER1 + Software Interrupt on line + 1 + 1 + 1 + + + SWIER2 + Software Interrupt on line + 2 + 2 + 1 + + + SWIER3 + Software Interrupt on line + 3 + 3 + 1 + + + SWIER4 + Software Interrupt on line + 4 + 4 + 1 + + + SWIER5 + Software Interrupt on line + 5 + 5 + 1 + + + SWIER6 + Software Interrupt on line + 6 + 6 + 1 + + + SWIER7 + Software Interrupt on line + 7 + 7 + 1 + + + SWIER8 + Software Interrupt on line + 8 + 8 + 1 + + + SWIER9 + Software Interrupt on line + 9 + 9 + 1 + + + SWIER10 + Software Interrupt on line + 10 + 10 + 1 + + + SWIER11 + Software Interrupt on line + 11 + 11 + 1 + + + SWIER12 + Software Interrupt on line + 12 + 12 + 1 + + + SWIER13 + Software Interrupt on line + 13 + 13 + 1 + + + SWIER14 + Software Interrupt on line + 14 + 14 + 1 + + + SWIER15 + Software Interrupt on line + 15 + 15 + 1 + + + SWIER16 + Software Interrupt on line + 16 + 16 + 1 + + + SWIER17 + Software Interrupt on line + 17 + 17 + 1 + + + SWIER18 + Software Interrupt on line + 18 + 18 + 1 + + + + + PR + PR + Pending register (EXTI_PR) + 0x14 + 0x20 + read-write + 0x00000000 + + + PR0 + Pending bit 0 + 0 + 1 + + + PR1 + Pending bit 1 + 1 + 1 + + + PR2 + Pending bit 2 + 2 + 1 + + + PR3 + Pending bit 3 + 3 + 1 + + + PR4 + Pending bit 4 + 4 + 1 + + + PR5 + Pending bit 5 + 5 + 1 + + + PR6 + Pending bit 6 + 6 + 1 + + + PR7 + Pending bit 7 + 7 + 1 + + + PR8 + Pending bit 8 + 8 + 1 + + + PR9 + Pending bit 9 + 9 + 1 + + + PR10 + Pending bit 10 + 10 + 1 + + + PR11 + Pending bit 11 + 11 + 1 + + + PR12 + Pending bit 12 + 12 + 1 + + + PR13 + Pending bit 13 + 13 + 1 + + + PR14 + Pending bit 14 + 14 + 1 + + + PR15 + Pending bit 15 + 15 + 1 + + + PR16 + Pending bit 16 + 16 + 1 + + + PR17 + Pending bit 17 + 17 + 1 + + + PR18 + Pending bit 18 + 18 + 1 + + + + + + + DMA1 + DMA controller + DMA + 0x40020000 + + 0x0 + 0x400 + registers + + + DMA1_Channel1_IRQ + DMA1 Channel1 global interrupt + 11 + + + DMA1_Channel2_IRQ + DMA1 Channel2 global interrupt + 12 + + + DMA1_Channel3_IRQ + DMA1 Channel3 global interrupt + 13 + + + DMA1_Channel4_IRQ + DMA1 Channel4 global interrupt + 14 + + + DMA1_Channel5_IRQ + DMA1 Channel5 global interrupt + 15 + + + DMA1_Channel6_IRQ + DMA1 Channel6 global interrupt + 16 + + + DMA1_Channel7_IRQ + DMA1 Channel7 global interrupt + 17 + + + + ISR + ISR + DMA interrupt status register + (DMA_ISR) + 0x0 + 0x20 + read-only + 0x00000000 + + + GIF1 + Channel 1 Global interrupt + flag + 0 + 1 + + + TCIF1 + Channel 1 Transfer Complete + flag + 1 + 1 + + + HTIF1 + Channel 1 Half Transfer Complete + flag + 2 + 1 + + + TEIF1 + Channel 1 Transfer Error + flag + 3 + 1 + + + GIF2 + Channel 2 Global interrupt + flag + 4 + 1 + + + TCIF2 + Channel 2 Transfer Complete + flag + 5 + 1 + + + HTIF2 + Channel 2 Half Transfer Complete + flag + 6 + 1 + + + TEIF2 + Channel 2 Transfer Error + flag + 7 + 1 + + + GIF3 + Channel 3 Global interrupt + flag + 8 + 1 + + + TCIF3 + Channel 3 Transfer Complete + flag + 9 + 1 + + + HTIF3 + Channel 3 Half Transfer Complete + flag + 10 + 1 + + + TEIF3 + Channel 3 Transfer Error + flag + 11 + 1 + + + GIF4 + Channel 4 Global interrupt + flag + 12 + 1 + + + TCIF4 + Channel 4 Transfer Complete + flag + 13 + 1 + + + HTIF4 + Channel 4 Half Transfer Complete + flag + 14 + 1 + + + TEIF4 + Channel 4 Transfer Error + flag + 15 + 1 + + + GIF5 + Channel 5 Global interrupt + flag + 16 + 1 + + + TCIF5 + Channel 5 Transfer Complete + flag + 17 + 1 + + + HTIF5 + Channel 5 Half Transfer Complete + flag + 18 + 1 + + + TEIF5 + Channel 5 Transfer Error + flag + 19 + 1 + + + GIF6 + Channel 6 Global interrupt + flag + 20 + 1 + + + TCIF6 + Channel 6 Transfer Complete + flag + 21 + 1 + + + HTIF6 + Channel 6 Half Transfer Complete + flag + 22 + 1 + + + TEIF6 + Channel 6 Transfer Error + flag + 23 + 1 + + + GIF7 + Channel 7 Global interrupt + flag + 24 + 1 + + + TCIF7 + Channel 7 Transfer Complete + flag + 25 + 1 + + + HTIF7 + Channel 7 Half Transfer Complete + flag + 26 + 1 + + + TEIF7 + Channel 7 Transfer Error + flag + 27 + 1 + + + + + IFCR + IFCR + DMA interrupt flag clear register + (DMA_IFCR) + 0x4 + 0x20 + write-only + 0x00000000 + + + CGIF1 + Channel 1 Global interrupt + clear + 0 + 1 + + + CGIF2 + Channel 2 Global interrupt + clear + 4 + 1 + + + CGIF3 + Channel 3 Global interrupt + clear + 8 + 1 + + + CGIF4 + Channel 4 Global interrupt + clear + 12 + 1 + + + CGIF5 + Channel 5 Global interrupt + clear + 16 + 1 + + + CGIF6 + Channel 6 Global interrupt + clear + 20 + 1 + + + CGIF7 + Channel 7 Global interrupt + clear + 24 + 1 + + + CTCIF1 + Channel 1 Transfer Complete + clear + 1 + 1 + + + CTCIF2 + Channel 2 Transfer Complete + clear + 5 + 1 + + + CTCIF3 + Channel 3 Transfer Complete + clear + 9 + 1 + + + CTCIF4 + Channel 4 Transfer Complete + clear + 13 + 1 + + + CTCIF5 + Channel 5 Transfer Complete + clear + 17 + 1 + + + CTCIF6 + Channel 6 Transfer Complete + clear + 21 + 1 + + + CTCIF7 + Channel 7 Transfer Complete + clear + 25 + 1 + + + CHTIF1 + Channel 1 Half Transfer + clear + 2 + 1 + + + CHTIF2 + Channel 2 Half Transfer + clear + 6 + 1 + + + CHTIF3 + Channel 3 Half Transfer + clear + 10 + 1 + + + CHTIF4 + Channel 4 Half Transfer + clear + 14 + 1 + + + CHTIF5 + Channel 5 Half Transfer + clear + 18 + 1 + + + CHTIF6 + Channel 6 Half Transfer + clear + 22 + 1 + + + CHTIF7 + Channel 7 Half Transfer + clear + 26 + 1 + + + CTEIF1 + Channel 1 Transfer Error + clear + 3 + 1 + + + CTEIF2 + Channel 2 Transfer Error + clear + 7 + 1 + + + CTEIF3 + Channel 3 Transfer Error + clear + 11 + 1 + + + CTEIF4 + Channel 4 Transfer Error + clear + 15 + 1 + + + CTEIF5 + Channel 5 Transfer Error + clear + 19 + 1 + + + CTEIF6 + Channel 6 Transfer Error + clear + 23 + 1 + + + CTEIF7 + Channel 7 Transfer Error + clear + 27 + 1 + + + + + CCR1 + CCR1 + DMA channel configuration register + (DMA_CCR) + 0x8 + 0x20 + read-write + 0x00000000 + + + EN + Channel enable + 0 + 1 + + + TCIE + Transfer complete interrupt + enable + 1 + 1 + + + HTIE + Half Transfer interrupt + enable + 2 + 1 + + + TEIE + Transfer error interrupt + enable + 3 + 1 + + + DIR + Data transfer direction + 4 + 1 + + + CIRC + Circular mode + 5 + 1 + + + PINC + Peripheral increment mode + 6 + 1 + + + MINC + Memory increment mode + 7 + 1 + + + PSIZE + Peripheral size + 8 + 2 + + + MSIZE + Memory size + 10 + 2 + + + PL + Channel Priority level + 12 + 2 + + + MEM2MEM + Memory to memory mode + 14 + 1 + + + + + CNDTR1 + CNDTR1 + DMA channel 1 number of data + register + 0xC + 0x20 + read-write + 0x00000000 + + + NDT + Number of data to transfer + 0 + 16 + + + + + CPAR1 + CPAR1 + DMA channel 1 peripheral address + register + 0x10 + 0x20 + read-write + 0x00000000 + + + PA + Peripheral address + 0 + 32 + + + + + CMAR1 + CMAR1 + DMA channel 1 memory address + register + 0x14 + 0x20 + read-write + 0x00000000 + + + MA + Memory address + 0 + 32 + + + + + CCR2 + CCR2 + DMA channel configuration register + (DMA_CCR) + 0x1C + 0x20 + read-write + 0x00000000 + + + EN + Channel enable + 0 + 1 + + + TCIE + Transfer complete interrupt + enable + 1 + 1 + + + HTIE + Half Transfer interrupt + enable + 2 + 1 + + + TEIE + Transfer error interrupt + enable + 3 + 1 + + + DIR + Data transfer direction + 4 + 1 + + + CIRC + Circular mode + 5 + 1 + + + PINC + Peripheral increment mode + 6 + 1 + + + MINC + Memory increment mode + 7 + 1 + + + PSIZE + Peripheral size + 8 + 2 + + + MSIZE + Memory size + 10 + 2 + + + PL + Channel Priority level + 12 + 2 + + + MEM2MEM + Memory to memory mode + 14 + 1 + + + + + CNDTR2 + CNDTR2 + DMA channel 2 number of data + register + 0x20 + 0x20 + read-write + 0x00000000 + + + NDT + Number of data to transfer + 0 + 16 + + + + + CPAR2 + CPAR2 + DMA channel 2 peripheral address + register + 0x24 + 0x20 + read-write + 0x00000000 + + + PA + Peripheral address + 0 + 32 + + + + + CMAR2 + CMAR2 + DMA channel 2 memory address + register + 0x28 + 0x20 + read-write + 0x00000000 + + + MA + Memory address + 0 + 32 + + + + + CCR3 + CCR3 + DMA channel configuration register + (DMA_CCR) + 0x30 + 0x20 + read-write + 0x00000000 + + + EN + Channel enable + 0 + 1 + + + TCIE + Transfer complete interrupt + enable + 1 + 1 + + + HTIE + Half Transfer interrupt + enable + 2 + 1 + + + TEIE + Transfer error interrupt + enable + 3 + 1 + + + DIR + Data transfer direction + 4 + 1 + + + CIRC + Circular mode + 5 + 1 + + + PINC + Peripheral increment mode + 6 + 1 + + + MINC + Memory increment mode + 7 + 1 + + + PSIZE + Peripheral size + 8 + 2 + + + MSIZE + Memory size + 10 + 2 + + + PL + Channel Priority level + 12 + 2 + + + MEM2MEM + Memory to memory mode + 14 + 1 + + + + + CNDTR3 + CNDTR3 + DMA channel 3 number of data + register + 0x34 + 0x20 + read-write + 0x00000000 + + + NDT + Number of data to transfer + 0 + 16 + + + + + CPAR3 + CPAR3 + DMA channel 3 peripheral address + register + 0x38 + 0x20 + read-write + 0x00000000 + + + PA + Peripheral address + 0 + 32 + + + + + CMAR3 + CMAR3 + DMA channel 3 memory address + register + 0x3C + 0x20 + read-write + 0x00000000 + + + MA + Memory address + 0 + 32 + + + + + CCR4 + CCR4 + DMA channel configuration register + (DMA_CCR) + 0x44 + 0x20 + read-write + 0x00000000 + + + EN + Channel enable + 0 + 1 + + + TCIE + Transfer complete interrupt + enable + 1 + 1 + + + HTIE + Half Transfer interrupt + enable + 2 + 1 + + + TEIE + Transfer error interrupt + enable + 3 + 1 + + + DIR + Data transfer direction + 4 + 1 + + + CIRC + Circular mode + 5 + 1 + + + PINC + Peripheral increment mode + 6 + 1 + + + MINC + Memory increment mode + 7 + 1 + + + PSIZE + Peripheral size + 8 + 2 + + + MSIZE + Memory size + 10 + 2 + + + PL + Channel Priority level + 12 + 2 + + + MEM2MEM + Memory to memory mode + 14 + 1 + + + + + CNDTR4 + CNDTR4 + DMA channel 4 number of data + register + 0x48 + 0x20 + read-write + 0x00000000 + + + NDT + Number of data to transfer + 0 + 16 + + + + + CPAR4 + CPAR4 + DMA channel 4 peripheral address + register + 0x4C + 0x20 + read-write + 0x00000000 + + + PA + Peripheral address + 0 + 32 + + + + + CMAR4 + CMAR4 + DMA channel 4 memory address + register + 0x50 + 0x20 + read-write + 0x00000000 + + + MA + Memory address + 0 + 32 + + + + + CCR5 + CCR5 + DMA channel configuration register + (DMA_CCR) + 0x58 + 0x20 + read-write + 0x00000000 + + + EN + Channel enable + 0 + 1 + + + TCIE + Transfer complete interrupt + enable + 1 + 1 + + + HTIE + Half Transfer interrupt + enable + 2 + 1 + + + TEIE + Transfer error interrupt + enable + 3 + 1 + + + DIR + Data transfer direction + 4 + 1 + + + CIRC + Circular mode + 5 + 1 + + + PINC + Peripheral increment mode + 6 + 1 + + + MINC + Memory increment mode + 7 + 1 + + + PSIZE + Peripheral size + 8 + 2 + + + MSIZE + Memory size + 10 + 2 + + + PL + Channel Priority level + 12 + 2 + + + MEM2MEM + Memory to memory mode + 14 + 1 + + + + + CNDTR5 + CNDTR5 + DMA channel 5 number of data + register + 0x5C + 0x20 + read-write + 0x00000000 + + + NDT + Number of data to transfer + 0 + 16 + + + + + CPAR5 + CPAR5 + DMA channel 5 peripheral address + register + 0x60 + 0x20 + read-write + 0x00000000 + + + PA + Peripheral address + 0 + 32 + + + + + CMAR5 + CMAR5 + DMA channel 5 memory address + register + 0x64 + 0x20 + read-write + 0x00000000 + + + MA + Memory address + 0 + 32 + + + + + CCR6 + CCR6 + DMA channel configuration register + (DMA_CCR) + 0x6C + 0x20 + read-write + 0x00000000 + + + EN + Channel enable + 0 + 1 + + + TCIE + Transfer complete interrupt + enable + 1 + 1 + + + HTIE + Half Transfer interrupt + enable + 2 + 1 + + + TEIE + Transfer error interrupt + enable + 3 + 1 + + + DIR + Data transfer direction + 4 + 1 + + + CIRC + Circular mode + 5 + 1 + + + PINC + Peripheral increment mode + 6 + 1 + + + MINC + Memory increment mode + 7 + 1 + + + PSIZE + Peripheral size + 8 + 2 + + + MSIZE + Memory size + 10 + 2 + + + PL + Channel Priority level + 12 + 2 + + + MEM2MEM + Memory to memory mode + 14 + 1 + + + + + CNDTR6 + CNDTR6 + DMA channel 6 number of data + register + 0x70 + 0x20 + read-write + 0x00000000 + + + NDT + Number of data to transfer + 0 + 16 + + + + + CPAR6 + CPAR6 + DMA channel 6 peripheral address + register + 0x74 + 0x20 + read-write + 0x00000000 + + + PA + Peripheral address + 0 + 32 + + + + + CMAR6 + CMAR6 + DMA channel 6 memory address + register + 0x78 + 0x20 + read-write + 0x00000000 + + + MA + Memory address + 0 + 32 + + + + + CCR7 + CCR7 + DMA channel configuration register + (DMA_CCR) + 0x80 + 0x20 + read-write + 0x00000000 + + + EN + Channel enable + 0 + 1 + + + TCIE + Transfer complete interrupt + enable + 1 + 1 + + + HTIE + Half Transfer interrupt + enable + 2 + 1 + + + TEIE + Transfer error interrupt + enable + 3 + 1 + + + DIR + Data transfer direction + 4 + 1 + + + CIRC + Circular mode + 5 + 1 + + + PINC + Peripheral increment mode + 6 + 1 + + + MINC + Memory increment mode + 7 + 1 + + + PSIZE + Peripheral size + 8 + 2 + + + MSIZE + Memory size + 10 + 2 + + + PL + Channel Priority level + 12 + 2 + + + MEM2MEM + Memory to memory mode + 14 + 1 + + + + + CNDTR7 + CNDTR7 + DMA channel 7 number of data + register + 0x84 + 0x20 + read-write + 0x00000000 + + + NDT + Number of data to transfer + 0 + 16 + + + + + CPAR7 + CPAR7 + DMA channel 7 peripheral address + register + 0x88 + 0x20 + read-write + 0x00000000 + + + PA + Peripheral address + 0 + 32 + + + + + CMAR7 + CMAR7 + DMA channel 7 memory address + register + 0x8C + 0x20 + read-write + 0x00000000 + + + MA + Memory address + 0 + 32 + + + + + + + DMA2 + 0x40020400 + + DMA2_Channel1_IRQ + DMA2 Channel1 global interrupt + 56 + + + DMA2_Channel2_IRQ + DMA2 Channel2 global interrupt + 57 + + + DMA2_Channel3_IRQ + DMA2 Channel3 global interrupt + 58 + + + DMA2_Channel4_5_IRQ + DMA2 Channel4 and DMA2 Channel5 global + interrupt + 59 + + + + RTC + Real time clock + RTC + 0x40002800 + + 0x0 + 0x400 + registers + + + RTC_IRQ + RTC global interrupt + 3 + + + RTCAlarm_IRQ + RTC Alarms through EXTI line + interrupt + 41 + + + + CRH + CRH + RTC Control Register High + 0x0 + 0x20 + read-write + 0x00000000 + + + SECIE + Second interrupt Enable + 0 + 1 + + + ALRIE + Alarm interrupt Enable + 1 + 1 + + + OWIE + Overflow interrupt Enable + 2 + 1 + + + + + CRL + CRL + RTC Control Register Low + 0x4 + 0x20 + 0x00000020 + + + SECF + Second Flag + 0 + 1 + read-write + + + ALRF + Alarm Flag + 1 + 1 + read-write + + + OWF + Overflow Flag + 2 + 1 + read-write + + + RSF + Registers Synchronized + Flag + 3 + 1 + read-write + + + CNF + Configuration Flag + 4 + 1 + read-write + + + RTOFF + RTC operation OFF + 5 + 1 + read-only + + + + + PRLH + PRLH + RTC Prescaler Load Register + High + 0x8 + 0x20 + write-only + 0x00000000 + + + PRLH + RTC Prescaler Load Register + High + 0 + 4 + + + + + PRLL + PRLL + RTC Prescaler Load Register + Low + 0xC + 0x20 + write-only + 0x8000 + + + PRLL + RTC Prescaler Divider Register + Low + 0 + 16 + + + + + DIVH + DIVH + RTC Prescaler Divider Register + High + 0x10 + 0x20 + read-only + 0x00000000 + + + DIVH + RTC prescaler divider register + high + 0 + 4 + + + + + DIVL + DIVL + RTC Prescaler Divider Register + Low + 0x14 + 0x20 + read-only + 0x8000 + + + DIVL + RTC prescaler divider register + Low + 0 + 16 + + + + + CNTH + CNTH + RTC Counter Register High + 0x18 + 0x20 + read-write + 0x00000000 + + + CNTH + RTC counter register high + 0 + 16 + + + + + CNTL + CNTL + RTC Counter Register Low + 0x1C + 0x20 + read-write + 0x00000000 + + + CNTL + RTC counter register Low + 0 + 16 + + + + + ALRH + ALRH + RTC Alarm Register High + 0x20 + 0x20 + write-only + 0xFFFF + + + ALRH + RTC alarm register high + 0 + 16 + + + + + ALRL + ALRL + RTC Alarm Register Low + 0x24 + 0x20 + write-only + 0xFFFF + + + ALRL + RTC alarm register low + 0 + 16 + + + + + + + IWDG + Independent watchdog + IWDG + 0x40003000 + + 0x0 + 0x400 + registers + + + + KR + KR + Key register (IWDG_KR) + 0x0 + 0x20 + write-only + 0x00000000 + + + KEY + Key value + 0 + 16 + + + + + PR + PR + Prescaler register (IWDG_PR) + 0x4 + 0x20 + read-write + 0x00000000 + + + PR + Prescaler divider + 0 + 3 + + + + + RLR + RLR + Reload register (IWDG_RLR) + 0x8 + 0x20 + read-write + 0x00000FFF + + + RL + Watchdog counter reload + value + 0 + 12 + + + + + SR + SR + Status register (IWDG_SR) + 0xC + 0x20 + read-only + 0x00000000 + + + PVU + Watchdog prescaler value + update + 0 + 1 + + + RVU + Watchdog counter reload value + update + 1 + 1 + + + + + + + WWDG + Window watchdog + WWDG + 0x40002C00 + + 0x0 + 0x400 + registers + + + WWDG_IRQ + Window Watchdog interrupt + 0 + + + + CR + CR + Control register (WWDG_CR) + 0x0 + 0x20 + read-write + 0x0000007F + + + T + 7-bit counter (MSB to LSB) + 0 + 7 + + + WDGA + Activation bit + 7 + 1 + + + + + CFR + CFR + Configuration register + (WWDG_CFR) + 0x4 + 0x20 + read-write + 0x0000007F + + + W + 7-bit window value + 0 + 7 + + + WDGTB + Timer Base + 7 + 2 + + + EWI + Early Wakeup Interrupt + 9 + 1 + + + + + SR + SR + Status register (WWDG_SR) + 0x8 + 0x20 + read-write + 0x00000000 + + + EWI + Early Wakeup Interrupt + 0 + 1 + + + + + + + TIM2 + General purpose timer + TIM + 0x40000000 + + 0x0 + 0x400 + registers + + + TIM2_IRQ + TIM2 global interrupt + 28 + + + + CR1 + CR1 + control register 1 + 0x0 + 0x20 + read-write + 0x0000 + + + CKD + Clock division + 8 + 2 + + + ARPE + Auto-reload preload enable + 7 + 1 + + + CMS + Center-aligned mode + selection + 5 + 2 + + + DIR + Direction + 4 + 1 + + + OPM + One-pulse mode + 3 + 1 + + + URS + Update request source + 2 + 1 + + + UDIS + Update disable + 1 + 1 + + + CEN + Counter enable + 0 + 1 + + + + + CR2 + CR2 + control register 2 + 0x4 + 0x20 + read-write + 0x0000 + + + TI1S + TI1 selection + 7 + 1 + + + MMS + Master mode selection + 4 + 3 + + + CCDS + Capture/compare DMA + selection + 3 + 1 + + + + + SMCR + SMCR + slave mode control register + 0x8 + 0x20 + read-write + 0x0000 + + + ETP + External trigger polarity + 15 + 1 + + + ECE + External clock enable + 14 + 1 + + + ETPS + External trigger prescaler + 12 + 2 + + + ETF + External trigger filter + 8 + 4 + + + MSM + Master/Slave mode + 7 + 1 + + + TS + Trigger selection + 4 + 3 + + + SMS + Slave mode selection + 0 + 3 + + + + + DIER + DIER + DMA/Interrupt enable register + 0xC + 0x20 + read-write + 0x0000 + + + TDE + Trigger DMA request enable + 14 + 1 + + + CC4DE + Capture/Compare 4 DMA request + enable + 12 + 1 + + + CC3DE + Capture/Compare 3 DMA request + enable + 11 + 1 + + + CC2DE + Capture/Compare 2 DMA request + enable + 10 + 1 + + + CC1DE + Capture/Compare 1 DMA request + enable + 9 + 1 + + + UDE + Update DMA request enable + 8 + 1 + + + TIE + Trigger interrupt enable + 6 + 1 + + + CC4IE + Capture/Compare 4 interrupt + enable + 4 + 1 + + + CC3IE + Capture/Compare 3 interrupt + enable + 3 + 1 + + + CC2IE + Capture/Compare 2 interrupt + enable + 2 + 1 + + + CC1IE + Capture/Compare 1 interrupt + enable + 1 + 1 + + + UIE + Update interrupt enable + 0 + 1 + + + + + SR + SR + status register + 0x10 + 0x20 + read-write + 0x0000 + + + CC4OF + Capture/Compare 4 overcapture + flag + 12 + 1 + + + CC3OF + Capture/Compare 3 overcapture + flag + 11 + 1 + + + CC2OF + Capture/compare 2 overcapture + flag + 10 + 1 + + + CC1OF + Capture/Compare 1 overcapture + flag + 9 + 1 + + + TIF + Trigger interrupt flag + 6 + 1 + + + CC4IF + Capture/Compare 4 interrupt + flag + 4 + 1 + + + CC3IF + Capture/Compare 3 interrupt + flag + 3 + 1 + + + CC2IF + Capture/Compare 2 interrupt + flag + 2 + 1 + + + CC1IF + Capture/compare 1 interrupt + flag + 1 + 1 + + + UIF + Update interrupt flag + 0 + 1 + + + + + EGR + EGR + event generation register + 0x14 + 0x20 + write-only + 0x0000 + + + TG + Trigger generation + 6 + 1 + + + CC4G + Capture/compare 4 + generation + 4 + 1 + + + CC3G + Capture/compare 3 + generation + 3 + 1 + + + CC2G + Capture/compare 2 + generation + 2 + 1 + + + CC1G + Capture/compare 1 + generation + 1 + 1 + + + UG + Update generation + 0 + 1 + + + + + CCMR1_Output + CCMR1_Output + capture/compare mode register 1 (output + mode) + 0x18 + 0x20 + read-write + 0x00000000 + + + OC2CE + Output compare 2 clear + enable + 15 + 1 + + + OC2M + Output compare 2 mode + 12 + 3 + + + OC2PE + Output compare 2 preload + enable + 11 + 1 + + + OC2FE + Output compare 2 fast + enable + 10 + 1 + + + CC2S + Capture/Compare 2 + selection + 8 + 2 + + + OC1CE + Output compare 1 clear + enable + 7 + 1 + + + OC1M + Output compare 1 mode + 4 + 3 + + + OC1PE + Output compare 1 preload + enable + 3 + 1 + + + OC1FE + Output compare 1 fast + enable + 2 + 1 + + + CC1S + Capture/Compare 1 + selection + 0 + 2 + + + + + CCMR1_Input + CCMR1_Input + capture/compare mode register 1 (input + mode) + CCMR1_Output + 0x18 + 0x20 + read-write + 0x00000000 + + + IC2F + Input capture 2 filter + 12 + 4 + + + IC2PSC + Input capture 2 prescaler + 10 + 2 + + + CC2S + Capture/compare 2 + selection + 8 + 2 + + + IC1F + Input capture 1 filter + 4 + 4 + + + IC1PSC + Input capture 1 prescaler + 2 + 2 + + + CC1S + Capture/Compare 1 + selection + 0 + 2 + + + + + CCMR2_Output + CCMR2_Output + capture/compare mode register 2 (output + mode) + 0x1C + 0x20 + read-write + 0x00000000 + + + O24CE + Output compare 4 clear + enable + 15 + 1 + + + OC4M + Output compare 4 mode + 12 + 3 + + + OC4PE + Output compare 4 preload + enable + 11 + 1 + + + OC4FE + Output compare 4 fast + enable + 10 + 1 + + + CC4S + Capture/Compare 4 + selection + 8 + 2 + + + OC3CE + Output compare 3 clear + enable + 7 + 1 + + + OC3M + Output compare 3 mode + 4 + 3 + + + OC3PE + Output compare 3 preload + enable + 3 + 1 + + + OC3FE + Output compare 3 fast + enable + 2 + 1 + + + CC3S + Capture/Compare 3 + selection + 0 + 2 + + + + + CCMR2_Input + CCMR2_Input + capture/compare mode register 2 (input + mode) + CCMR2_Output + 0x1C + 0x20 + read-write + 0x00000000 + + + IC4F + Input capture 4 filter + 12 + 4 + + + IC4PSC + Input capture 4 prescaler + 10 + 2 + + + CC4S + Capture/Compare 4 + selection + 8 + 2 + + + IC3F + Input capture 3 filter + 4 + 4 + + + IC3PSC + Input capture 3 prescaler + 2 + 2 + + + CC3S + Capture/Compare 3 + selection + 0 + 2 + + + + + CCER + CCER + capture/compare enable + register + 0x20 + 0x20 + read-write + 0x0000 + + + CC4P + Capture/Compare 3 output + Polarity + 13 + 1 + + + CC4E + Capture/Compare 4 output + enable + 12 + 1 + + + CC3P + Capture/Compare 3 output + Polarity + 9 + 1 + + + CC3E + Capture/Compare 3 output + enable + 8 + 1 + + + CC2P + Capture/Compare 2 output + Polarity + 5 + 1 + + + CC2E + Capture/Compare 2 output + enable + 4 + 1 + + + CC1P + Capture/Compare 1 output + Polarity + 1 + 1 + + + CC1E + Capture/Compare 1 output + enable + 0 + 1 + + + + + CNT + CNT + counter + 0x24 + 0x20 + read-write + 0x00000000 + + + CNT + counter value + 0 + 16 + + + + + PSC + PSC + prescaler + 0x28 + 0x20 + read-write + 0x0000 + + + PSC + Prescaler value + 0 + 16 + + + + + ARR + ARR + auto-reload register + 0x2C + 0x20 + read-write + 0x00000000 + + + ARR + Auto-reload value + 0 + 16 + + + + + CCR1 + CCR1 + capture/compare register 1 + 0x34 + 0x20 + read-write + 0x00000000 + + + CCR1 + Capture/Compare 1 value + 0 + 16 + + + + + CCR2 + CCR2 + capture/compare register 2 + 0x38 + 0x20 + read-write + 0x00000000 + + + CCR2 + Capture/Compare 2 value + 0 + 16 + + + + + CCR3 + CCR3 + capture/compare register 3 + 0x3C + 0x20 + read-write + 0x00000000 + + + CCR3 + Capture/Compare value + 0 + 16 + + + + + CCR4 + CCR4 + capture/compare register 4 + 0x40 + 0x20 + read-write + 0x00000000 + + + CCR4 + Capture/Compare value + 0 + 16 + + + + + DCR + DCR + DMA control register + 0x48 + 0x20 + read-write + 0x0000 + + + DBL + DMA burst length + 8 + 5 + + + DBA + DMA base address + 0 + 5 + + + + + DMAR + DMAR + DMA address for full transfer + 0x4C + 0x20 + read-write + 0x0000 + + + DMAB + DMA register for burst + accesses + 0 + 16 + + + + + + + TIM3 + 0x40000400 + + TIM3_IRQ + TIM3 global interrupt + 29 + + + + I2C1 + Inter integrated circuit + I2C + 0x40005400 + + 0x0 + 0x400 + registers + + + I2C_EV_IRQ + I2C event interrupt + 31 + + + I2C_ER_IRQ + I2C errot interrupt + 32 + + + + CR1 + CR1 + Control register 1 + 0x0 + 0x20 + read-write + 0x0000 + + + SWRST + Software reset + 15 + 1 + + + ALERT + SMBus alert + 13 + 1 + + + PEC + Packet error checking + 12 + 1 + + + POS + Acknowledge/PEC Position (for data + reception) + 11 + 1 + + + ACK + Acknowledge enable + 10 + 1 + + + STOP + Stop generation + 9 + 1 + + + START + Start generation + 8 + 1 + + + NOSTRETCH + Clock stretching disable (Slave + mode) + 7 + 1 + + + ENGC + General call enable + 6 + 1 + + + ENPEC + PEC enable + 5 + 1 + + + ENARP + ARP enable + 4 + 1 + + + SMBTYPE + SMBus type + 3 + 1 + + + SMBUS + SMBus mode + 1 + 1 + + + PE + Peripheral enable + 0 + 1 + + + + + CR2 + CR2 + Control register 2 + 0x4 + 0x20 + read-write + 0x0000 + + + LAST + DMA last transfer + 12 + 1 + + + DMAEN + DMA requests enable + 11 + 1 + + + ITBUFEN + Buffer interrupt enable + 10 + 1 + + + ITEVTEN + Event interrupt enable + 9 + 1 + + + ITERREN + Error interrupt enable + 8 + 1 + + + FREQ + Peripheral clock frequency + 0 + 6 + + + + + OAR1 + OAR1 + Own address register 1 + 0x8 + 0x20 + read-write + 0x0000 + + + ADDMODE + Addressing mode (slave + mode) + 15 + 1 + + + ADD10 + Interface address + 8 + 2 + + + ADD7 + Interface address + 1 + 7 + + + ADD0 + Interface address + 0 + 1 + + + + + OAR2 + OAR2 + Own address register 2 + 0xC + 0x20 + read-write + 0x0000 + + + ADD2 + Interface address + 1 + 7 + + + ENDUAL + Dual addressing mode + enable + 0 + 1 + + + + + DR + DR + Data register + 0x10 + 0x20 + read-write + 0x0000 + + + DR + 8-bit data register + 0 + 8 + + + + + SR1 + SR1 + Status register 1 + 0x14 + 0x20 + 0x0000 + + + SMBALERT + SMBus alert + 15 + 1 + read-write + + + TIMEOUT + Timeout or Tlow error + 14 + 1 + read-write + + + PECERR + PEC Error in reception + 12 + 1 + read-write + + + OVR + Overrun/Underrun + 11 + 1 + read-write + + + AF + Acknowledge failure + 10 + 1 + read-write + + + ARLO + Arbitration lost (master + mode) + 9 + 1 + read-write + + + BERR + Bus error + 8 + 1 + read-write + + + TxE + Data register empty + (transmitters) + 7 + 1 + read-only + + + RxNE + Data register not empty + (receivers) + 6 + 1 + read-only + + + STOPF + Stop detection (slave + mode) + 4 + 1 + read-only + + + ADD10 + 10-bit header sent (Master + mode) + 3 + 1 + read-only + + + BTF + Byte transfer finished + 2 + 1 + read-only + + + ADDR + Address sent (master mode)/matched + (slave mode) + 1 + 1 + read-only + + + SB + Start bit (Master mode) + 0 + 1 + read-only + + + + + SR2 + SR2 + Status register 2 + 0x18 + 0x20 + read-only + 0x0000 + + + PEC + acket error checking + register + 8 + 8 + + + DUALF + Dual flag (Slave mode) + 7 + 1 + + + SMBHOST + SMBus host header (Slave + mode) + 6 + 1 + + + SMBDEFAULT + SMBus device default address (Slave + mode) + 5 + 1 + + + GENCALL + General call address (Slave + mode) + 4 + 1 + + + TRA + Transmitter/receiver + 2 + 1 + + + BUSY + Bus busy + 1 + 1 + + + MSL + Master/slave + 0 + 1 + + + + + CCR + CCR + Clock control register + 0x1C + 0x20 + read-write + 0x0000 + + + F_S + I2C master mode selection + 15 + 1 + + + DUTY + Fast mode duty cycle + 14 + 1 + + + CCR + Clock control register in Fast/Standard + mode (Master mode) + 0 + 12 + + + + + TRISE + TRISE + TRISE register + 0x20 + 0x20 + read-write + 0x0002 + + + TRISE + Maximum rise time in Fast/Standard mode + (Master mode) + 0 + 6 + + + + + + + SPI1 + Serial peripheral interface + SPI + 0x40013000 + + 0x0 + 0x400 + registers + + + SPI_IRQ + SPI global interrupt + 35 + + + + CR1 + CR1 + control register 1 + 0x0 + 0x20 + read-write + 0x0000 + + + BIDIMODE + Bidirectional data mode + enable + 15 + 1 + + + BIDIOE + Output enable in bidirectional + mode + 14 + 1 + + + CRCEN + Hardware CRC calculation + enable + 13 + 1 + + + CRCNEXT + CRC transfer next + 12 + 1 + + + DFF + Data frame format + 11 + 1 + + + RXONLY + Receive only + 10 + 1 + + + SSM + Software slave management + 9 + 1 + + + SSI + Internal slave select + 8 + 1 + + + LSBFIRST + Frame format + 7 + 1 + + + SPE + SPI enable + 6 + 1 + + + BR + Baud rate control + 3 + 3 + + + MSTR + Master selection + 2 + 1 + + + CPOL + Clock polarity + 1 + 1 + + + CPHA + Clock phase + 0 + 1 + + + + + CR2 + CR2 + control register 2 + 0x4 + 0x20 + read-write + 0x0000 + + + TXEIE + Tx buffer empty interrupt + enable + 7 + 1 + + + RXNEIE + RX buffer not empty interrupt + enable + 6 + 1 + + + ERRIE + Error interrupt enable + 5 + 1 + + + SSOE + SS output enable + 2 + 1 + + + TXDMAEN + Tx buffer DMA enable + 1 + 1 + + + RXDMAEN + Rx buffer DMA enable + 0 + 1 + + + + + SR + SR + status register + 0x8 + 0x20 + 0x0002 + + + BSY + Busy flag + 7 + 1 + read-only + + + OVR + Overrun flag + 6 + 1 + read-only + + + MODF + Mode fault + 5 + 1 + read-only + + + CRCERR + CRC error flag + 4 + 1 + read-write + + + UDR + Underrun flag + 3 + 1 + read-only + + + CHSIDE + Channel side + 2 + 1 + read-only + + + TXE + Transmit buffer empty + 1 + 1 + read-only + + + RXNE + Receive buffer not empty + 0 + 1 + read-only + + + + + DR + DR + data register + 0xC + 0x20 + read-write + 0x0000 + + + DR + Data register + 0 + 16 + + + + + CRCPR + CRCPR + CRC polynomial register + 0x10 + 0x20 + read-write + 0x0007 + + + CRCPOLY + CRC polynomial register + 0 + 16 + + + + + RXCRCR + RXCRCR + RX CRC register + 0x14 + 0x20 + read-only + 0x0000 + + + RxCRC + Rx CRC register + 0 + 16 + + + + + TXCRCR + TXCRCR + TX CRC register + 0x18 + 0x20 + read-only + 0x0000 + + + TxCRC + Tx CRC register + 0 + 16 + + + + + I2SCFGR + I2SCFGR + I2S configuration register + 0x1C + 0x20 + read-write + 0x0000 + + + I2SMOD + I2S mode selection + 11 + 1 + + + I2SE + I2S Enable + 10 + 1 + + + I2SCFG + I2S configuration mode + 8 + 2 + + + PCMSYNC + PCM frame synchronization + 7 + 1 + + + I2SSTD + I2S standard selection + 4 + 2 + + + CKPOL + Steady state clock + polarity + 3 + 1 + + + DATLEN + Data length to be + transferred + 1 + 2 + + + CHLEN + Channel length (number of bits per audio + channel) + 0 + 1 + + + + + I2SPR + I2SPR + I2S prescaler register + 0x20 + 0x20 + read-write + 00000010 + + + MCKOE + Master clock output enable + 9 + 1 + + + ODD + Odd factor for the + prescaler + 8 + 1 + + + I2SDIV + I2S Linear prescaler + 0 + 8 + + + + + + + USART1 + Universal synchronous asynchronous receiver + transmitter + USART + 0x40013800 + + 0x0 + 0x400 + registers + + + USART1_IRQ + USART1 global interrupt + 37 + + + + SR + SR + Status register + 0x0 + 0x20 + 0x00C0 + + + CTS + CTS flag + 9 + 1 + read-write + + + LBD + LIN break detection flag + 8 + 1 + read-write + + + TXE + Transmit data register + empty + 7 + 1 + read-only + + + TC + Transmission complete + 6 + 1 + read-write + + + RXNE + Read data register not + empty + 5 + 1 + read-write + + + IDLE + IDLE line detected + 4 + 1 + read-only + + + ORE + Overrun error + 3 + 1 + read-only + + + NE + Noise error flag + 2 + 1 + read-only + + + FE + Framing error + 1 + 1 + read-only + + + PE + Parity error + 0 + 1 + read-only + + + + + DR + DR + Data register + 0x4 + 0x20 + read-write + 0x00000000 + + + DR + Data value + 0 + 9 + + + + + BRR + BRR + Baud rate register + 0x8 + 0x20 + read-write + 0x0000 + + + DIV_Mantissa + mantissa of USARTDIV + 4 + 12 + + + DIV_Fraction + fraction of USARTDIV + 0 + 4 + + + + + CR1 + CR1 + Control register 1 + 0xC + 0x20 + read-write + 0x0000 + + + UE + USART enable + 13 + 1 + + + M + Word length + 12 + 1 + + + WAKE + Wakeup method + 11 + 1 + + + PCE + Parity control enable + 10 + 1 + + + PS + Parity selection + 9 + 1 + + + PEIE + PE interrupt enable + 8 + 1 + + + TXEIE + TXE interrupt enable + 7 + 1 + + + TCIE + Transmission complete interrupt + enable + 6 + 1 + + + RXNEIE + RXNE interrupt enable + 5 + 1 + + + IDLEIE + IDLE interrupt enable + 4 + 1 + + + TE + Transmitter enable + 3 + 1 + + + RE + Receiver enable + 2 + 1 + + + RWU + Receiver wakeup + 1 + 1 + + + SBK + Send break + 0 + 1 + + + + + CR2 + CR2 + Control register 2 + 0x10 + 0x20 + read-write + 0x0000 + + + LINEN + LIN mode enable + 14 + 1 + + + STOP + STOP bits + 12 + 2 + + + CLKEN + Clock enable + 11 + 1 + + + CPOL + Clock polarity + 10 + 1 + + + CPHA + Clock phase + 9 + 1 + + + LBCL + Last bit clock pulse + 8 + 1 + + + LBDIE + LIN break detection interrupt + enable + 6 + 1 + + + LBDL + lin break detection length + 5 + 1 + + + ADD + Address of the USART node + 0 + 4 + + + + + CR3 + CR3 + Control register 3 + 0x14 + 0x20 + read-write + 0x0000 + + + CTSIE + CTS interrupt enable + 10 + 1 + + + CTSE + CTS enable + 9 + 1 + + + RTSE + RTS enable + 8 + 1 + + + DMAT + DMA enable transmitter + 7 + 1 + + + DMAR + DMA enable receiver + 6 + 1 + + + SCEN + Smartcard mode enable + 5 + 1 + + + NACK + Smartcard NACK enable + 4 + 1 + + + HDSEL + Half-duplex selection + 3 + 1 + + + IRLP + IrDA low-power + 2 + 1 + + + IREN + IrDA mode enable + 1 + 1 + + + EIE + Error interrupt enable + 0 + 1 + + + + + GTPR + GTPR + Guard time and prescaler + register + 0x18 + 0x20 + read-write + 0x0000 + + + GT + Guard time value + 8 + 8 + + + PSC + Prescaler value + 0 + 8 + + + + + + + USART2 + 0x40004400 + + USART2_IRQ + USART2 global interrupt + 38 + + + + ADC1 + Analog to digital converter + ADC + 0x40012400 + + 0x0 + 0x400 + registers + + + ADC_IRQ + ADC1 global interrupt + 18 + + + + SR + SR + status register + 0x0 + 0x20 + read-write + 0x00000000 + + + STRT + Regular channel start flag + 4 + 1 + + + JSTRT + Injected channel start + flag + 3 + 1 + + + JEOC + Injected channel end of + conversion + 2 + 1 + + + EOC + Regular channel end of + conversion + 1 + 1 + + + AWD + Analog watchdog flag + 0 + 1 + + + + + CR1 + CR1 + control register 1 + 0x4 + 0x20 + read-write + 0x00000000 + + + AWDEN + Analog watchdog enable on regular + channels + 23 + 1 + + + JAWDEN + Analog watchdog enable on injected + channels + 22 + 1 + + + DUALMOD + Dual mode selection + 16 + 4 + + + DISCNUM + Discontinuous mode channel + count + 13 + 3 + + + JDISCEN + Discontinuous mode on injected + channels + 12 + 1 + + + DISCEN + Discontinuous mode on regular + channels + 11 + 1 + + + JAUTO + Automatic injected group + conversion + 10 + 1 + + + AWDSGL + Enable the watchdog on a single channel + in scan mode + 9 + 1 + + + SCAN + Scan mode + 8 + 1 + + + JEOCIE + Interrupt enable for injected + channels + 7 + 1 + + + AWDIE + Analog watchdog interrupt + enable + 6 + 1 + + + EOCIE + Interrupt enable for EOC + 5 + 1 + + + AWDCH + Analog watchdog channel select + bits + 0 + 5 + + + + + CR2 + CR2 + control register 2 + 0x8 + 0x20 + read-write + 0x00000000 + + + TSVREFE + Temperature sensor and VREFINT + enable + 23 + 1 + + + SWSTART + Start conversion of regular + channels + 22 + 1 + + + JSWSTART + Start conversion of injected + channels + 21 + 1 + + + EXTTRIG + External trigger conversion mode for + regular channels + 20 + 1 + + + EXTSEL + External event select for regular + group + 17 + 3 + + + JEXTTRIG + External trigger conversion mode for + injected channels + 15 + 1 + + + JEXTSEL + External event select for injected + group + 12 + 3 + + + ALIGN + Data alignment + 11 + 1 + + + DMA + Direct memory access mode + 8 + 1 + + + RSTCAL + Reset calibration + 3 + 1 + + + CAL + A/D calibration + 2 + 1 + + + CONT + Continuous conversion + 1 + 1 + + + ADON + A/D converter ON / OFF + 0 + 1 + + + + + SMPR1 + SMPR1 + sample time register 1 + 0xC + 0x20 + read-write + 0x00000000 + + + SMPx_x + Sample time bits + 0 + 32 + + + + + SMPR2 + SMPR2 + sample time register 2 + 0x10 + 0x20 + read-write + 0x00000000 + + + SMPx_x + Sample time bits + 0 + 32 + + + + + JOFR1 + JOFR1 + injected channel data offset register + x + 0x14 + 0x20 + read-write + 0x00000000 + + + JOFFSET1 + Data offset for injected channel + x + 0 + 12 + + + + + JOFR2 + JOFR2 + injected channel data offset register + x + 0x18 + 0x20 + read-write + 0x00000000 + + + JOFFSET2 + Data offset for injected channel + x + 0 + 12 + + + + + JOFR3 + JOFR3 + injected channel data offset register + x + 0x1C + 0x20 + read-write + 0x00000000 + + + JOFFSET3 + Data offset for injected channel + x + 0 + 12 + + + + + JOFR4 + JOFR4 + injected channel data offset register + x + 0x20 + 0x20 + read-write + 0x00000000 + + + JOFFSET4 + Data offset for injected channel + x + 0 + 12 + + + + + HTR + HTR + watchdog higher threshold + register + 0x24 + 0x20 + read-write + 0x00000FFF + + + HT + Analog watchdog higher + threshold + 0 + 12 + + + + + LTR + LTR + watchdog lower threshold + register + 0x28 + 0x20 + read-write + 0x00000000 + + + LT + Analog watchdog lower + threshold + 0 + 12 + + + + + SQR1 + SQR1 + regular sequence register 1 + 0x2C + 0x20 + read-write + 0x00000000 + + + L + Regular channel sequence + length + 20 + 4 + + + SQ16 + 16th conversion in regular + sequence + 15 + 5 + + + SQ15 + 15th conversion in regular + sequence + 10 + 5 + + + SQ14 + 14th conversion in regular + sequence + 5 + 5 + + + SQ13 + 13th conversion in regular + sequence + 0 + 5 + + + + + SQR2 + SQR2 + regular sequence register 2 + 0x30 + 0x20 + read-write + 0x00000000 + + + SQ12 + 12th conversion in regular + sequence + 25 + 5 + + + SQ11 + 11th conversion in regular + sequence + 20 + 5 + + + SQ10 + 10th conversion in regular + sequence + 15 + 5 + + + SQ9 + 9th conversion in regular + sequence + 10 + 5 + + + SQ8 + 8th conversion in regular + sequence + 5 + 5 + + + SQ7 + 7th conversion in regular + sequence + 0 + 5 + + + + + SQR3 + SQR3 + regular sequence register 3 + 0x34 + 0x20 + read-write + 0x00000000 + + + SQ6 + 6th conversion in regular + sequence + 25 + 5 + + + SQ5 + 5th conversion in regular + sequence + 20 + 5 + + + SQ4 + 4th conversion in regular + sequence + 15 + 5 + + + SQ3 + 3rd conversion in regular + sequence + 10 + 5 + + + SQ2 + 2nd conversion in regular + sequence + 5 + 5 + + + SQ1 + 1st conversion in regular + sequence + 0 + 5 + + + + + JSQR + JSQR + injected sequence register + 0x38 + 0x20 + read-write + 0x00000000 + + + JL + Injected sequence length + 20 + 2 + + + JSQ4 + 4th conversion in injected + sequence + 15 + 5 + + + JSQ3 + 3rd conversion in injected + sequence + 10 + 5 + + + JSQ2 + 2nd conversion in injected + sequence + 5 + 5 + + + JSQ1 + 1st conversion in injected + sequence + 0 + 5 + + + + + JDR1 + JDR1 + injected data register x + 0x3C + 0x20 + read-only + 0x00000000 + + + JDATA + Injected data + 0 + 16 + + + + + JDR2 + JDR2 + injected data register x + 0x40 + 0x20 + read-only + 0x00000000 + + + JDATA + Injected data + 0 + 16 + + + + + JDR3 + JDR3 + injected data register x + 0x44 + 0x20 + read-only + 0x00000000 + + + JDATA + Injected data + 0 + 16 + + + + + JDR4 + JDR4 + injected data register x + 0x48 + 0x20 + read-only + 0x00000000 + + + JDATA + Injected data + 0 + 16 + + + + + DR + DR + regular data register + 0x4C + 0x20 + read-only + 0x00000000 + + + DATA + Regular data + 0 + 16 + + + + + + + CRC + CRC calculation unit + CRC + 0x40023000 + + 0x0 + 0x400 + registers + + + + DR + DR + Data register + 0x0 + 0x20 + read-write + 0xFFFFFFFF + + + DR + Data Register + 0 + 32 + + + + + IDR + IDR + Independent Data register + 0x4 + 0x20 + read-write + 0x00000000 + + + IDR + Independent Data register + 0 + 8 + + + + + CR + CR + Control register + 0x8 + 0x20 + write-only + 0x00000000 + + + RESET + Reset bit + 0 + 1 + + + + + + + FLASH + FLASH + FLASH + 0x40022000 + + 0x0 + 0x400 + registers + + + FLASH_IRQ + Flash global interrupt + 4 + + + + ACR + ACR + Flash access control register + 0x0 + 0x20 + 0x00000030 + + + LATENCY + Latency + 0 + 3 + read-write + + + HLFCYA + Flash half cycle access + enable + 3 + 1 + read-write + + + PRFTBE + Prefetch buffer enable + 4 + 1 + read-write + + + PRFTBS + Prefetch buffer status + 5 + 1 + read-only + + + + + KEYR + KEYR + Flash key register + 0x4 + 0x20 + write-only + 0x00000000 + + + KEY + FPEC key + 0 + 32 + + + + + OPTKEYR + OPTKEYR + Flash option key register + 0x8 + 0x20 + write-only + 0x00000000 + + + OPTKEY + Option byte key + 0 + 32 + + + + + SR + SR + Status register + 0xC + 0x20 + 0x00000000 + + + EOP + End of operation + 5 + 1 + read-write + + + WRPRTERR + Write protection error + 4 + 1 + read-write + + + PGERR + Programming error + 2 + 1 + read-write + + + BSY + Busy + 0 + 1 + read-only + + + + + CR + CR + Control register + 0x10 + 0x20 + read-write + 0x00000080 + + + PG + Programming + 0 + 1 + + + PER + Page Erase + 1 + 1 + + + MER + Mass Erase + 2 + 1 + + + OPTPG + Option byte programming + 4 + 1 + + + OPTER + Option byte erase + 5 + 1 + + + STRT + Start + 6 + 1 + + + LOCK + Lock + 7 + 1 + + + OPTWRE + Option bytes write enable + 9 + 1 + + + ERRIE + Error interrupt enable + 10 + 1 + + + EOPIE + End of operation interrupt + enable + 12 + 1 + + + + + AR + AR + Flash address register + 0x14 + 0x20 + write-only + 0x00000000 + + + FAR + Flash Address + 0 + 32 + + + + + OBR + OBR + Option byte register + 0x1C + 0x20 + read-only + 0x03FFFFFC + + + OPTERR + Option byte error + 0 + 1 + + + RDPRT + Read protection + 1 + 1 + + + WDG_SW + WDG_SW + 2 + 1 + + + nRST_STOP + nRST_STOP + 3 + 1 + + + nRST_STDBY + nRST_STDBY + 4 + 1 + + + Data0 + Data0 + 10 + 8 + + + Data1 + Data1 + 18 + 8 + + + + + WRPR + WRPR + Write protection register + 0x20 + 0x20 + read-only + 0xFFFFFFFF + + + WRP + Write protect + 0 + 32 + + + + + + + DBG + Debug support + DBG + 0xE0042000 + + 0x0 + 0x400 + registers + + + + IDCODE + IDCODE + DBGMCU_IDCODE + 0x0 + 0x20 + read-only + 0x0 + + + DEV_ID + DEV_ID + 0 + 12 + + + REV_ID + REV_ID + 16 + 16 + + + + + CR + CR + DBGMCU_CR + 0x4 + 0x20 + read-write + 0x0 + + + DBG_SLEEP + DBG_SLEEP + 0 + 1 + + + DBG_STOP + DBG_STOP + 1 + 1 + + + DBG_STANDBY + DBG_STANDBY + 2 + 1 + + + TRACE_IOEN + TRACE_IOEN + 5 + 1 + + + TRACE_MODE + TRACE_MODE + 6 + 2 + + + DBG_IWDG_STOP + DBG_IWDG_STOP + 8 + 1 + + + DBG_WWDG_STOP + DBG_WWDG_STOP + 9 + 1 + + + DBG_TIM2_STOP + DBG_TIM2_STOP + 11 + 1 + + + DBG_TIM3_STOP + DBG_TIM3_STOP + 12 + 1 + + + DBG_I2C1_SMBUS_TIMEOUT + DBG_I2C1_SMBUS_TIMEOUT + 15 + 1 + + + + + + + BKP + Backup registers + BKP + 0x40006C04 + + 0x0 + 0x400 + registers + + + + DR1 + DR1 + Backup data register (BKP_DR) + 0x0 + 0x20 + read-write + 0x00000000 + + + D1 + Backup data + 0 + 16 + + + + + DR2 + DR2 + Backup data register (BKP_DR) + 0x4 + 0x20 + read-write + 0x00000000 + + + D2 + Backup data + 0 + 16 + + + + + DR3 + DR3 + Backup data register (BKP_DR) + 0x8 + 0x20 + read-write + 0x00000000 + + + D3 + Backup data + 0 + 16 + + + + + DR4 + DR4 + Backup data register (BKP_DR) + 0xC + 0x20 + read-write + 0x00000000 + + + D4 + Backup data + 0 + 16 + + + + + DR5 + DR5 + Backup data register (BKP_DR) + 0x10 + 0x20 + read-write + 0x00000000 + + + D5 + Backup data + 0 + 16 + + + + + DR6 + DR6 + Backup data register (BKP_DR) + 0x14 + 0x20 + read-write + 0x00000000 + + + D6 + Backup data + 0 + 16 + + + + + DR7 + DR7 + Backup data register (BKP_DR) + 0x18 + 0x20 + read-write + 0x00000000 + + + D7 + Backup data + 0 + 16 + + + + + DR8 + DR8 + Backup data register (BKP_DR) + 0x1C + 0x20 + read-write + 0x00000000 + + + D8 + Backup data + 0 + 16 + + + + + DR9 + DR9 + Backup data register (BKP_DR) + 0x20 + 0x20 + read-write + 0x00000000 + + + D9 + Backup data + 0 + 16 + + + + + DR10 + DR10 + Backup data register (BKP_DR) + 0x24 + 0x20 + read-write + 0x00000000 + + + D10 + Backup data + 0 + 16 + + + + + DR11 + DR11 + Backup data register (BKP_DR) + 0x3C + 0x20 + read-write + 0x00000000 + + + DR11 + Backup data + 0 + 16 + + + + + DR12 + DR12 + Backup data register (BKP_DR) + 0x40 + 0x20 + read-write + 0x00000000 + + + DR12 + Backup data + 0 + 16 + + + + + DR13 + DR13 + Backup data register (BKP_DR) + 0x44 + 0x20 + read-write + 0x00000000 + + + DR13 + Backup data + 0 + 16 + + + + + DR14 + DR14 + Backup data register (BKP_DR) + 0x48 + 0x20 + read-write + 0x00000000 + + + D14 + Backup data + 0 + 16 + + + + + DR15 + DR15 + Backup data register (BKP_DR) + 0x4C + 0x20 + read-write + 0x00000000 + + + D15 + Backup data + 0 + 16 + + + + + DR16 + DR16 + Backup data register (BKP_DR) + 0x50 + 0x20 + read-write + 0x00000000 + + + D16 + Backup data + 0 + 16 + + + + + DR17 + DR17 + Backup data register (BKP_DR) + 0x54 + 0x20 + read-write + 0x00000000 + + + D17 + Backup data + 0 + 16 + + + + + DR18 + DR18 + Backup data register (BKP_DR) + 0x58 + 0x20 + read-write + 0x00000000 + + + D18 + Backup data + 0 + 16 + + + + + DR19 + DR19 + Backup data register (BKP_DR) + 0x5C + 0x20 + read-write + 0x00000000 + + + D19 + Backup data + 0 + 16 + + + + + DR20 + DR20 + Backup data register (BKP_DR) + 0x60 + 0x20 + read-write + 0x00000000 + + + D20 + Backup data + 0 + 16 + + + + + DR21 + DR21 + Backup data register (BKP_DR) + 0x64 + 0x20 + read-write + 0x00000000 + + + D21 + Backup data + 0 + 16 + + + + + DR22 + DR22 + Backup data register (BKP_DR) + 0x68 + 0x20 + read-write + 0x00000000 + + + D22 + Backup data + 0 + 16 + + + + + DR23 + DR23 + Backup data register (BKP_DR) + 0x6C + 0x20 + read-write + 0x00000000 + + + D23 + Backup data + 0 + 16 + + + + + DR24 + DR24 + Backup data register (BKP_DR) + 0x70 + 0x20 + read-write + 0x00000000 + + + D24 + Backup data + 0 + 16 + + + + + DR25 + DR25 + Backup data register (BKP_DR) + 0x74 + 0x20 + read-write + 0x00000000 + + + D25 + Backup data + 0 + 16 + + + + + DR26 + DR26 + Backup data register (BKP_DR) + 0x78 + 0x20 + read-write + 0x00000000 + + + D26 + Backup data + 0 + 16 + + + + + DR27 + DR27 + Backup data register (BKP_DR) + 0x7C + 0x20 + read-write + 0x00000000 + + + D27 + Backup data + 0 + 16 + + + + + DR28 + DR28 + Backup data register (BKP_DR) + 0x80 + 0x20 + read-write + 0x00000000 + + + D28 + Backup data + 0 + 16 + + + + + DR29 + DR29 + Backup data register (BKP_DR) + 0x84 + 0x20 + read-write + 0x00000000 + + + D29 + Backup data + 0 + 16 + + + + + DR30 + DR30 + Backup data register (BKP_DR) + 0x88 + 0x20 + read-write + 0x00000000 + + + D30 + Backup data + 0 + 16 + + + + + DR31 + DR31 + Backup data register (BKP_DR) + 0x8C + 0x20 + read-write + 0x00000000 + + + D31 + Backup data + 0 + 16 + + + + + DR32 + DR32 + Backup data register (BKP_DR) + 0x90 + 0x20 + read-write + 0x00000000 + + + D32 + Backup data + 0 + 16 + + + + + DR33 + DR33 + Backup data register (BKP_DR) + 0x94 + 0x20 + read-write + 0x00000000 + + + D33 + Backup data + 0 + 16 + + + + + DR34 + DR34 + Backup data register (BKP_DR) + 0x98 + 0x20 + read-write + 0x00000000 + + + D34 + Backup data + 0 + 16 + + + + + DR35 + DR35 + Backup data register (BKP_DR) + 0x9C + 0x20 + read-write + 0x00000000 + + + D35 + Backup data + 0 + 16 + + + + + DR36 + DR36 + Backup data register (BKP_DR) + 0xA0 + 0x20 + read-write + 0x00000000 + + + D36 + Backup data + 0 + 16 + + + + + DR37 + DR37 + Backup data register (BKP_DR) + 0xA4 + 0x20 + read-write + 0x00000000 + + + D37 + Backup data + 0 + 16 + + + + + DR38 + DR38 + Backup data register (BKP_DR) + 0xA8 + 0x20 + read-write + 0x00000000 + + + D38 + Backup data + 0 + 16 + + + + + DR39 + DR39 + Backup data register (BKP_DR) + 0xAC + 0x20 + read-write + 0x00000000 + + + D39 + Backup data + 0 + 16 + + + + + DR40 + DR40 + Backup data register (BKP_DR) + 0xB0 + 0x20 + read-write + 0x00000000 + + + D40 + Backup data + 0 + 16 + + + + + DR41 + DR41 + Backup data register (BKP_DR) + 0xB4 + 0x20 + read-write + 0x00000000 + + + D41 + Backup data + 0 + 16 + + + + + DR42 + DR42 + Backup data register (BKP_DR) + 0xB8 + 0x20 + read-write + 0x00000000 + + + D42 + Backup data + 0 + 16 + + + + + RTCCR + RTCCR + RTC clock calibration register + (BKP_RTCCR) + 0x28 + 0x20 + read-write + 0x00000000 + + + CAL + Calibration value + 0 + 7 + + + CCO + Calibration Clock Output + 7 + 1 + + + ASOE + Alarm or second output + enable + 8 + 1 + + + ASOS + Alarm or second output + selection + 9 + 1 + + + + + CR + CR + Backup control register + (BKP_CR) + 0x2C + 0x20 + read-write + 0x00000000 + + + TPE + Tamper pin enable + 0 + 1 + + + TPAL + Tamper pin active level + 1 + 1 + + + + + CSR + CSR + BKP_CSR control/status register + (BKP_CSR) + 0x30 + 0x20 + 0x00000000 + + + CTE + Clear Tamper event + 0 + 1 + write-only + + + CTI + Clear Tamper Interrupt + 1 + 1 + write-only + + + TPIE + Tamper Pin interrupt + enable + 2 + 1 + read-write + + + TEF + Tamper Event Flag + 8 + 1 + read-only + + + TIF + Tamper Interrupt Flag + 9 + 1 + read-only + + + + + + NVIC Nested Vectored Interrupt Controller NVIC 0xE000E000 0x0 0x1001 registers 0x1001 0xFFFFF3FF reserved ICTR ICTR Interrupt Controller Type Register 0x4 0x20 read-only 0x00000000 INTLINESNUM Total number of interrupt lines in groups 0 4 STIR STIR Software Triggered Interrupt Register 0xF00 0x20 write-only 0x00000000 INTID interrupt to be triggered 0 9 ISER0 ISER0 Interrupt Set-Enable Register 0x100 0x20 read-write 0x00000000 SETENA SETENA 0 32 ISER1 ISER1 Interrupt Set-Enable Register 0x104 0x20 read-write 0x00000000 SETENA SETENA 0 32 ICER0 ICER0 Interrupt Clear-Enable Register 0x180 0x20 read-write 0x00000000 CLRENA CLRENA 0 32 ICER1 ICER1 Interrupt Clear-Enable Register 0x184 0x20 read-write 0x00000000 CLRENA CLRENA 0 32 ISPR0 ISPR0 Interrupt Set-Pending Register 0x200 0x20 read-write 0x00000000 SETPEND SETPEND 0 32 ISPR1 ISPR1 Interrupt Set-Pending Register 0x204 0x20 read-write 0x00000000 SETPEND SETPEND 0 32 ICPR0 ICPR0 Interrupt Clear-Pending Register 0x280 0x20 read-write 0x00000000 CLRPEND CLRPEND 0 32 ICPR1 ICPR1 Interrupt Clear-Pending Register 0x284 0x20 read-write 0x00000000 CLRPEND CLRPEND 0 32 IABR0 IABR0 Interrupt Active Bit Register 0x300 0x20 read-only 0x00000000 ACTIVE ACTIVE 0 32 IABR1 IABR1 Interrupt Active Bit Register 0x304 0x20 read-only 0x00000000 ACTIVE ACTIVE 0 32 IPR0 IPR0 Interrupt Priority Register 0x400 0x20 read-write 0x00000000 IPR_N0 IPR_N0 0 8 IPR_N1 IPR_N1 8 8 IPR_N2 IPR_N2 16 8 IPR_N3 IPR_N3 24 8 IPR1 IPR1 Interrupt Priority Register 0x404 0x20 read-write 0x00000000 IPR_N0 IPR_N0 0 8 IPR_N1 IPR_N1 8 8 IPR_N2 IPR_N2 16 8 IPR_N3 IPR_N3 24 8 IPR2 IPR2 Interrupt Priority Register 0x408 0x20 read-write 0x00000000 IPR_N0 IPR_N0 0 8 IPR_N1 IPR_N1 8 8 IPR_N2 IPR_N2 16 8 IPR_N3 IPR_N3 24 8 IPR3 IPR3 Interrupt Priority Register 0x40C 0x20 read-write 0x00000000 IPR_N0 IPR_N0 0 8 IPR_N1 IPR_N1 8 8 IPR_N2 IPR_N2 16 8 IPR_N3 IPR_N3 24 8 IPR4 IPR4 Interrupt Priority Register 0x410 0x20 read-write 0x00000000 IPR_N0 IPR_N0 0 8 IPR_N1 IPR_N1 8 8 IPR_N2 IPR_N2 16 8 IPR_N3 IPR_N3 24 8 IPR5 IPR5 Interrupt Priority Register 0x414 0x20 read-write 0x00000000 IPR_N0 IPR_N0 0 8 IPR_N1 IPR_N1 8 8 IPR_N2 IPR_N2 16 8 IPR_N3 IPR_N3 24 8 IPR6 IPR6 Interrupt Priority Register 0x418 0x20 read-write 0x00000000 IPR_N0 IPR_N0 0 8 IPR_N1 IPR_N1 8 8 IPR_N2 IPR_N2 16 8 IPR_N3 IPR_N3 24 8 IPR7 IPR7 Interrupt Priority Register 0x41C 0x20 read-write 0x00000000 IPR_N0 IPR_N0 0 8 IPR_N1 IPR_N1 8 8 IPR_N2 IPR_N2 16 8 IPR_N3 IPR_N3 24 8 IPR8 IPR8 Interrupt Priority Register 0x420 0x20 read-write 0x00000000 IPR_N0 IPR_N0 0 8 IPR_N1 IPR_N1 8 8 IPR_N2 IPR_N2 16 8 IPR_N3 IPR_N3 24 8 IPR9 IPR9 Interrupt Priority Register 0x424 0x20 read-write 0x00000000 IPR_N0 IPR_N0 0 8 IPR_N1 IPR_N1 8 8 IPR_N2 IPR_N2 16 8 IPR_N3 IPR_N3 24 8 IPR10 IPR10 Interrupt Priority Register 0x428 0x20 read-write 0x00000000 IPR_N0 IPR_N0 0 8 IPR_N1 IPR_N1 8 8 IPR_N2 IPR_N2 16 8 IPR_N3 IPR_N3 24 8 IPR11 IPR11 Interrupt Priority Register 0x42C 0x20 read-write 0x00000000 IPR_N0 IPR_N0 0 8 IPR_N1 IPR_N1 8 8 IPR_N2 IPR_N2 16 8 IPR_N3 IPR_N3 24 8 IPR12 IPR12 Interrupt Priority Register 0x430 0x20 read-write 0x00000000 IPR_N0 IPR_N0 0 8 IPR_N1 IPR_N1 8 8 IPR_N2 IPR_N2 16 8 IPR_N3 IPR_N3 24 8 IPR13 IPR13 Interrupt Priority Register 0x434 0x20 read-write 0x00000000 IPR_N0 IPR_N0 0 8 IPR_N1 IPR_N1 8 8 IPR_N2 IPR_N2 16 8 IPR_N3 IPR_N3 24 8 IPR14 IPR14 Interrupt Priority Register 0x438 0x20 read-write 0x00000000 IPR_N0 IPR_N0 0 8 IPR_N1 IPR_N1 8 8 IPR_N2 IPR_N2 16 8 IPR_N3 IPR_N3 24 8 + diff --git a/BMS_Testbench/BMS_Software_V1/STM32F302.svd b/BMS_Testbench/BMS_Software_V1/STM32F302.svd new file mode 100644 index 0000000..bf83bfd --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/STM32F302.svd @@ -0,0 +1,39943 @@ + + + STM32F302 + 1.7 + STM32F302 + + + 8 + + 32 + + 0x20 + 0x0 + 0xFFFFFFFF + + + GPIOA + General-purpose I/Os + GPIO + 0x48000000 + + 0x0 + 0x400 + registers + + + + MODER + MODER + GPIO port mode register + 0x0 + 0x20 + read-write + 0x28000000 + + + MODER15 + Port x configuration bits (y = + 0..15) + 30 + 2 + + + MODER14 + Port x configuration bits (y = + 0..15) + 28 + 2 + + + MODER13 + Port x configuration bits (y = + 0..15) + 26 + 2 + + + MODER12 + Port x configuration bits (y = + 0..15) + 24 + 2 + + + MODER11 + Port x configuration bits (y = + 0..15) + 22 + 2 + + + MODER10 + Port x configuration bits (y = + 0..15) + 20 + 2 + + + MODER9 + Port x configuration bits (y = + 0..15) + 18 + 2 + + + MODER8 + Port x configuration bits (y = + 0..15) + 16 + 2 + + + MODER7 + Port x configuration bits (y = + 0..15) + 14 + 2 + + + MODER6 + Port x configuration bits (y = + 0..15) + 12 + 2 + + + MODER5 + Port x configuration bits (y = + 0..15) + 10 + 2 + + + MODER4 + Port x configuration bits (y = + 0..15) + 8 + 2 + + + MODER3 + Port x configuration bits (y = + 0..15) + 6 + 2 + + + MODER2 + Port x configuration bits (y = + 0..15) + 4 + 2 + + + MODER1 + Port x configuration bits (y = + 0..15) + 2 + 2 + + + MODER0 + Port x configuration bits (y = + 0..15) + 0 + 2 + + + + + OTYPER + OTYPER + GPIO port output type register + 0x4 + 0x20 + read-write + 0x00000000 + + + OT15 + Port x configuration bits (y = + 0..15) + 15 + 1 + + + OT14 + Port x configuration bits (y = + 0..15) + 14 + 1 + + + OT13 + Port x configuration bits (y = + 0..15) + 13 + 1 + + + OT12 + Port x configuration bits (y = + 0..15) + 12 + 1 + + + OT11 + Port x configuration bits (y = + 0..15) + 11 + 1 + + + OT10 + Port x configuration bits (y = + 0..15) + 10 + 1 + + + OT9 + Port x configuration bits (y = + 0..15) + 9 + 1 + + + OT8 + Port x configuration bits (y = + 0..15) + 8 + 1 + + + OT7 + Port x configuration bits (y = + 0..15) + 7 + 1 + + + OT6 + Port x configuration bits (y = + 0..15) + 6 + 1 + + + OT5 + Port x configuration bits (y = + 0..15) + 5 + 1 + + + OT4 + Port x configuration bits (y = + 0..15) + 4 + 1 + + + OT3 + Port x configuration bits (y = + 0..15) + 3 + 1 + + + OT2 + Port x configuration bits (y = + 0..15) + 2 + 1 + + + OT1 + Port x configuration bits (y = + 0..15) + 1 + 1 + + + OT0 + Port x configuration bits (y = + 0..15) + 0 + 1 + + + + + OSPEEDR + OSPEEDR + GPIO port output speed + register + 0x8 + 0x20 + read-write + 0x00000000 + + + OSPEEDR15 + Port x configuration bits (y = + 0..15) + 30 + 2 + + + OSPEEDR14 + Port x configuration bits (y = + 0..15) + 28 + 2 + + + OSPEEDR13 + Port x configuration bits (y = + 0..15) + 26 + 2 + + + OSPEEDR12 + Port x configuration bits (y = + 0..15) + 24 + 2 + + + OSPEEDR11 + Port x configuration bits (y = + 0..15) + 22 + 2 + + + OSPEEDR10 + Port x configuration bits (y = + 0..15) + 20 + 2 + + + OSPEEDR9 + Port x configuration bits (y = + 0..15) + 18 + 2 + + + OSPEEDR8 + Port x configuration bits (y = + 0..15) + 16 + 2 + + + OSPEEDR7 + Port x configuration bits (y = + 0..15) + 14 + 2 + + + OSPEEDR6 + Port x configuration bits (y = + 0..15) + 12 + 2 + + + OSPEEDR5 + Port x configuration bits (y = + 0..15) + 10 + 2 + + + OSPEEDR4 + Port x configuration bits (y = + 0..15) + 8 + 2 + + + OSPEEDR3 + Port x configuration bits (y = + 0..15) + 6 + 2 + + + OSPEEDR2 + Port x configuration bits (y = + 0..15) + 4 + 2 + + + OSPEEDR1 + Port x configuration bits (y = + 0..15) + 2 + 2 + + + OSPEEDR0 + Port x configuration bits (y = + 0..15) + 0 + 2 + + + + + PUPDR + PUPDR + GPIO port pull-up/pull-down + register + 0xC + 0x20 + read-write + 0x24000000 + + + PUPDR15 + Port x configuration bits (y = + 0..15) + 30 + 2 + + + PUPDR14 + Port x configuration bits (y = + 0..15) + 28 + 2 + + + PUPDR13 + Port x configuration bits (y = + 0..15) + 26 + 2 + + + PUPDR12 + Port x configuration bits (y = + 0..15) + 24 + 2 + + + PUPDR11 + Port x configuration bits (y = + 0..15) + 22 + 2 + + + PUPDR10 + Port x configuration bits (y = + 0..15) + 20 + 2 + + + PUPDR9 + Port x configuration bits (y = + 0..15) + 18 + 2 + + + PUPDR8 + Port x configuration bits (y = + 0..15) + 16 + 2 + + + PUPDR7 + Port x configuration bits (y = + 0..15) + 14 + 2 + + + PUPDR6 + Port x configuration bits (y = + 0..15) + 12 + 2 + + + PUPDR5 + Port x configuration bits (y = + 0..15) + 10 + 2 + + + PUPDR4 + Port x configuration bits (y = + 0..15) + 8 + 2 + + + PUPDR3 + Port x configuration bits (y = + 0..15) + 6 + 2 + + + PUPDR2 + Port x configuration bits (y = + 0..15) + 4 + 2 + + + PUPDR1 + Port x configuration bits (y = + 0..15) + 2 + 2 + + + PUPDR0 + Port x configuration bits (y = + 0..15) + 0 + 2 + + + + + IDR + IDR + GPIO port input data register + 0x10 + 0x20 + read-only + 0x00000000 + + + IDR15 + Port input data (y = + 0..15) + 15 + 1 + + + IDR14 + Port input data (y = + 0..15) + 14 + 1 + + + IDR13 + Port input data (y = + 0..15) + 13 + 1 + + + IDR12 + Port input data (y = + 0..15) + 12 + 1 + + + IDR11 + Port input data (y = + 0..15) + 11 + 1 + + + IDR10 + Port input data (y = + 0..15) + 10 + 1 + + + IDR9 + Port input data (y = + 0..15) + 9 + 1 + + + IDR8 + Port input data (y = + 0..15) + 8 + 1 + + + IDR7 + Port input data (y = + 0..15) + 7 + 1 + + + IDR6 + Port input data (y = + 0..15) + 6 + 1 + + + IDR5 + Port input data (y = + 0..15) + 5 + 1 + + + IDR4 + Port input data (y = + 0..15) + 4 + 1 + + + IDR3 + Port input data (y = + 0..15) + 3 + 1 + + + IDR2 + Port input data (y = + 0..15) + 2 + 1 + + + IDR1 + Port input data (y = + 0..15) + 1 + 1 + + + IDR0 + Port input data (y = + 0..15) + 0 + 1 + + + + + ODR + ODR + GPIO port output data register + 0x14 + 0x20 + read-write + 0x00000000 + + + ODR15 + Port output data (y = + 0..15) + 15 + 1 + + + ODR14 + Port output data (y = + 0..15) + 14 + 1 + + + ODR13 + Port output data (y = + 0..15) + 13 + 1 + + + ODR12 + Port output data (y = + 0..15) + 12 + 1 + + + ODR11 + Port output data (y = + 0..15) + 11 + 1 + + + ODR10 + Port output data (y = + 0..15) + 10 + 1 + + + ODR9 + Port output data (y = + 0..15) + 9 + 1 + + + ODR8 + Port output data (y = + 0..15) + 8 + 1 + + + ODR7 + Port output data (y = + 0..15) + 7 + 1 + + + ODR6 + Port output data (y = + 0..15) + 6 + 1 + + + ODR5 + Port output data (y = + 0..15) + 5 + 1 + + + ODR4 + Port output data (y = + 0..15) + 4 + 1 + + + ODR3 + Port output data (y = + 0..15) + 3 + 1 + + + ODR2 + Port output data (y = + 0..15) + 2 + 1 + + + ODR1 + Port output data (y = + 0..15) + 1 + 1 + + + ODR0 + Port output data (y = + 0..15) + 0 + 1 + + + + + BSRR + BSRR + GPIO port bit set/reset + register + 0x18 + 0x20 + write-only + 0x00000000 + + + BR15 + Port x reset bit y (y = + 0..15) + 31 + 1 + + + BR14 + Port x reset bit y (y = + 0..15) + 30 + 1 + + + BR13 + Port x reset bit y (y = + 0..15) + 29 + 1 + + + BR12 + Port x reset bit y (y = + 0..15) + 28 + 1 + + + BR11 + Port x reset bit y (y = + 0..15) + 27 + 1 + + + BR10 + Port x reset bit y (y = + 0..15) + 26 + 1 + + + BR9 + Port x reset bit y (y = + 0..15) + 25 + 1 + + + BR8 + Port x reset bit y (y = + 0..15) + 24 + 1 + + + BR7 + Port x reset bit y (y = + 0..15) + 23 + 1 + + + BR6 + Port x reset bit y (y = + 0..15) + 22 + 1 + + + BR5 + Port x reset bit y (y = + 0..15) + 21 + 1 + + + BR4 + Port x reset bit y (y = + 0..15) + 20 + 1 + + + BR3 + Port x reset bit y (y = + 0..15) + 19 + 1 + + + BR2 + Port x reset bit y (y = + 0..15) + 18 + 1 + + + BR1 + Port x reset bit y (y = + 0..15) + 17 + 1 + + + BR0 + Port x set bit y (y= + 0..15) + 16 + 1 + + + BS15 + Port x set bit y (y= + 0..15) + 15 + 1 + + + BS14 + Port x set bit y (y= + 0..15) + 14 + 1 + + + BS13 + Port x set bit y (y= + 0..15) + 13 + 1 + + + BS12 + Port x set bit y (y= + 0..15) + 12 + 1 + + + BS11 + Port x set bit y (y= + 0..15) + 11 + 1 + + + BS10 + Port x set bit y (y= + 0..15) + 10 + 1 + + + BS9 + Port x set bit y (y= + 0..15) + 9 + 1 + + + BS8 + Port x set bit y (y= + 0..15) + 8 + 1 + + + BS7 + Port x set bit y (y= + 0..15) + 7 + 1 + + + BS6 + Port x set bit y (y= + 0..15) + 6 + 1 + + + BS5 + Port x set bit y (y= + 0..15) + 5 + 1 + + + BS4 + Port x set bit y (y= + 0..15) + 4 + 1 + + + BS3 + Port x set bit y (y= + 0..15) + 3 + 1 + + + BS2 + Port x set bit y (y= + 0..15) + 2 + 1 + + + BS1 + Port x set bit y (y= + 0..15) + 1 + 1 + + + BS0 + Port x set bit y (y= + 0..15) + 0 + 1 + + + + + LCKR + LCKR + GPIO port configuration lock + register + 0x1C + 0x20 + read-write + 0x00000000 + + + LCKK + Lok Key + 16 + 1 + + + LCK15 + Port x lock bit y (y= + 0..15) + 15 + 1 + + + LCK14 + Port x lock bit y (y= + 0..15) + 14 + 1 + + + LCK13 + Port x lock bit y (y= + 0..15) + 13 + 1 + + + LCK12 + Port x lock bit y (y= + 0..15) + 12 + 1 + + + LCK11 + Port x lock bit y (y= + 0..15) + 11 + 1 + + + LCK10 + Port x lock bit y (y= + 0..15) + 10 + 1 + + + LCK9 + Port x lock bit y (y= + 0..15) + 9 + 1 + + + LCK8 + Port x lock bit y (y= + 0..15) + 8 + 1 + + + LCK7 + Port x lock bit y (y= + 0..15) + 7 + 1 + + + LCK6 + Port x lock bit y (y= + 0..15) + 6 + 1 + + + LCK5 + Port x lock bit y (y= + 0..15) + 5 + 1 + + + LCK4 + Port x lock bit y (y= + 0..15) + 4 + 1 + + + LCK3 + Port x lock bit y (y= + 0..15) + 3 + 1 + + + LCK2 + Port x lock bit y (y= + 0..15) + 2 + 1 + + + LCK1 + Port x lock bit y (y= + 0..15) + 1 + 1 + + + LCK0 + Port x lock bit y (y= + 0..15) + 0 + 1 + + + + + AFRL + AFRL + GPIO alternate function low + register + 0x20 + 0x20 + read-write + 0x00000000 + + + AFRL7 + Alternate function selection for port x + bit y (y = 0..7) + 28 + 4 + + + AFRL6 + Alternate function selection for port x + bit y (y = 0..7) + 24 + 4 + + + AFRL5 + Alternate function selection for port x + bit y (y = 0..7) + 20 + 4 + + + AFRL4 + Alternate function selection for port x + bit y (y = 0..7) + 16 + 4 + + + AFRL3 + Alternate function selection for port x + bit y (y = 0..7) + 12 + 4 + + + AFRL2 + Alternate function selection for port x + bit y (y = 0..7) + 8 + 4 + + + AFRL1 + Alternate function selection for port x + bit y (y = 0..7) + 4 + 4 + + + AFRL0 + Alternate function selection for port x + bit y (y = 0..7) + 0 + 4 + + + + + AFRH + AFRH + GPIO alternate function high + register + 0x24 + 0x20 + read-write + 0x00000000 + + + AFRH15 + Alternate function selection for port x + bit y (y = 8..15) + 28 + 4 + + + AFRH14 + Alternate function selection for port x + bit y (y = 8..15) + 24 + 4 + + + AFRH13 + Alternate function selection for port x + bit y (y = 8..15) + 20 + 4 + + + AFRH12 + Alternate function selection for port x + bit y (y = 8..15) + 16 + 4 + + + AFRH11 + Alternate function selection for port x + bit y (y = 8..15) + 12 + 4 + + + AFRH10 + Alternate function selection for port x + bit y (y = 8..15) + 8 + 4 + + + AFRH9 + Alternate function selection for port x + bit y (y = 8..15) + 4 + 4 + + + AFRH8 + Alternate function selection for port x + bit y (y = 8..15) + 0 + 4 + + + + + BRR + BRR + Port bit reset register + 0x28 + 0x20 + write-only + 0x00000000 + + + BR0 + Port x Reset bit y + 0 + 1 + + + BR1 + Port x Reset bit y + 1 + 1 + + + BR2 + Port x Reset bit y + 2 + 1 + + + BR3 + Port x Reset bit y + 3 + 1 + + + BR4 + Port x Reset bit y + 4 + 1 + + + BR5 + Port x Reset bit y + 5 + 1 + + + BR6 + Port x Reset bit y + 6 + 1 + + + BR7 + Port x Reset bit y + 7 + 1 + + + BR8 + Port x Reset bit y + 8 + 1 + + + BR9 + Port x Reset bit y + 9 + 1 + + + BR10 + Port x Reset bit y + 10 + 1 + + + BR11 + Port x Reset bit y + 11 + 1 + + + BR12 + Port x Reset bit y + 12 + 1 + + + BR13 + Port x Reset bit y + 13 + 1 + + + BR14 + Port x Reset bit y + 14 + 1 + + + BR15 + Port x Reset bit y + 15 + 1 + + + + + + + GPIOB + General-purpose I/Os + GPIO + 0x48000400 + + 0x0 + 0x400 + registers + + + + MODER + MODER + GPIO port mode register + 0x0 + 0x20 + read-write + 0x00000000 + + + MODER15 + Port x configuration bits (y = + 0..15) + 30 + 2 + + + MODER14 + Port x configuration bits (y = + 0..15) + 28 + 2 + + + MODER13 + Port x configuration bits (y = + 0..15) + 26 + 2 + + + MODER12 + Port x configuration bits (y = + 0..15) + 24 + 2 + + + MODER11 + Port x configuration bits (y = + 0..15) + 22 + 2 + + + MODER10 + Port x configuration bits (y = + 0..15) + 20 + 2 + + + MODER9 + Port x configuration bits (y = + 0..15) + 18 + 2 + + + MODER8 + Port x configuration bits (y = + 0..15) + 16 + 2 + + + MODER7 + Port x configuration bits (y = + 0..15) + 14 + 2 + + + MODER6 + Port x configuration bits (y = + 0..15) + 12 + 2 + + + MODER5 + Port x configuration bits (y = + 0..15) + 10 + 2 + + + MODER4 + Port x configuration bits (y = + 0..15) + 8 + 2 + + + MODER3 + Port x configuration bits (y = + 0..15) + 6 + 2 + + + MODER2 + Port x configuration bits (y = + 0..15) + 4 + 2 + + + MODER1 + Port x configuration bits (y = + 0..15) + 2 + 2 + + + MODER0 + Port x configuration bits (y = + 0..15) + 0 + 2 + + + + + OTYPER + OTYPER + GPIO port output type register + 0x4 + 0x20 + read-write + 0x00000000 + + + OT15 + Port x configuration bit + 15 + 15 + 1 + + + OT14 + Port x configuration bit + 14 + 14 + 1 + + + OT13 + Port x configuration bit + 13 + 13 + 1 + + + OT12 + Port x configuration bit + 12 + 12 + 1 + + + OT11 + Port x configuration bit + 11 + 11 + 1 + + + OT10 + Port x configuration bit + 10 + 10 + 1 + + + OT9 + Port x configuration bit 9 + 9 + 1 + + + OT8 + Port x configuration bit 8 + 8 + 1 + + + OT7 + Port x configuration bit 7 + 7 + 1 + + + OT6 + Port x configuration bit 6 + 6 + 1 + + + OT5 + Port x configuration bit 5 + 5 + 1 + + + OT4 + Port x configuration bit 4 + 4 + 1 + + + OT3 + Port x configuration bit 3 + 3 + 1 + + + OT2 + Port x configuration bit 2 + 2 + 1 + + + OT1 + Port x configuration bit 1 + 1 + 1 + + + OT0 + Port x configuration bit 0 + 0 + 1 + + + + + OSPEEDR + OSPEEDR + GPIO port output speed + register + 0x8 + 0x20 + read-write + 0x00000000 + + + OSPEEDR15 + Port x configuration bits (y = + 0..15) + 30 + 2 + + + OSPEEDR14 + Port x configuration bits (y = + 0..15) + 28 + 2 + + + OSPEEDR13 + Port x configuration bits (y = + 0..15) + 26 + 2 + + + OSPEEDR12 + Port x configuration bits (y = + 0..15) + 24 + 2 + + + OSPEEDR11 + Port x configuration bits (y = + 0..15) + 22 + 2 + + + OSPEEDR10 + Port x configuration bits (y = + 0..15) + 20 + 2 + + + OSPEEDR9 + Port x configuration bits (y = + 0..15) + 18 + 2 + + + OSPEEDR8 + Port x configuration bits (y = + 0..15) + 16 + 2 + + + OSPEEDR7 + Port x configuration bits (y = + 0..15) + 14 + 2 + + + OSPEEDR6 + Port x configuration bits (y = + 0..15) + 12 + 2 + + + OSPEEDR5 + Port x configuration bits (y = + 0..15) + 10 + 2 + + + OSPEEDR4 + Port x configuration bits (y = + 0..15) + 8 + 2 + + + OSPEEDR3 + Port x configuration bits (y = + 0..15) + 6 + 2 + + + OSPEEDR2 + Port x configuration bits (y = + 0..15) + 4 + 2 + + + OSPEEDR1 + Port x configuration bits (y = + 0..15) + 2 + 2 + + + OSPEEDR0 + Port x configuration bits (y = + 0..15) + 0 + 2 + + + + + PUPDR + PUPDR + GPIO port pull-up/pull-down + register + 0xC + 0x20 + read-write + 0x00000000 + + + PUPDR15 + Port x configuration bits (y = + 0..15) + 30 + 2 + + + PUPDR14 + Port x configuration bits (y = + 0..15) + 28 + 2 + + + PUPDR13 + Port x configuration bits (y = + 0..15) + 26 + 2 + + + PUPDR12 + Port x configuration bits (y = + 0..15) + 24 + 2 + + + PUPDR11 + Port x configuration bits (y = + 0..15) + 22 + 2 + + + PUPDR10 + Port x configuration bits (y = + 0..15) + 20 + 2 + + + PUPDR9 + Port x configuration bits (y = + 0..15) + 18 + 2 + + + PUPDR8 + Port x configuration bits (y = + 0..15) + 16 + 2 + + + PUPDR7 + Port x configuration bits (y = + 0..15) + 14 + 2 + + + PUPDR6 + Port x configuration bits (y = + 0..15) + 12 + 2 + + + PUPDR5 + Port x configuration bits (y = + 0..15) + 10 + 2 + + + PUPDR4 + Port x configuration bits (y = + 0..15) + 8 + 2 + + + PUPDR3 + Port x configuration bits (y = + 0..15) + 6 + 2 + + + PUPDR2 + Port x configuration bits (y = + 0..15) + 4 + 2 + + + PUPDR1 + Port x configuration bits (y = + 0..15) + 2 + 2 + + + PUPDR0 + Port x configuration bits (y = + 0..15) + 0 + 2 + + + + + IDR + IDR + GPIO port input data register + 0x10 + 0x20 + read-only + 0x00000000 + + + IDR15 + Port input data (y = + 0..15) + 15 + 1 + + + IDR14 + Port input data (y = + 0..15) + 14 + 1 + + + IDR13 + Port input data (y = + 0..15) + 13 + 1 + + + IDR12 + Port input data (y = + 0..15) + 12 + 1 + + + IDR11 + Port input data (y = + 0..15) + 11 + 1 + + + IDR10 + Port input data (y = + 0..15) + 10 + 1 + + + IDR9 + Port input data (y = + 0..15) + 9 + 1 + + + IDR8 + Port input data (y = + 0..15) + 8 + 1 + + + IDR7 + Port input data (y = + 0..15) + 7 + 1 + + + IDR6 + Port input data (y = + 0..15) + 6 + 1 + + + IDR5 + Port input data (y = + 0..15) + 5 + 1 + + + IDR4 + Port input data (y = + 0..15) + 4 + 1 + + + IDR3 + Port input data (y = + 0..15) + 3 + 1 + + + IDR2 + Port input data (y = + 0..15) + 2 + 1 + + + IDR1 + Port input data (y = + 0..15) + 1 + 1 + + + IDR0 + Port input data (y = + 0..15) + 0 + 1 + + + + + ODR + ODR + GPIO port output data register + 0x14 + 0x20 + read-write + 0x00000000 + + + ODR15 + Port output data (y = + 0..15) + 15 + 1 + + + ODR14 + Port output data (y = + 0..15) + 14 + 1 + + + ODR13 + Port output data (y = + 0..15) + 13 + 1 + + + ODR12 + Port output data (y = + 0..15) + 12 + 1 + + + ODR11 + Port output data (y = + 0..15) + 11 + 1 + + + ODR10 + Port output data (y = + 0..15) + 10 + 1 + + + ODR9 + Port output data (y = + 0..15) + 9 + 1 + + + ODR8 + Port output data (y = + 0..15) + 8 + 1 + + + ODR7 + Port output data (y = + 0..15) + 7 + 1 + + + ODR6 + Port output data (y = + 0..15) + 6 + 1 + + + ODR5 + Port output data (y = + 0..15) + 5 + 1 + + + ODR4 + Port output data (y = + 0..15) + 4 + 1 + + + ODR3 + Port output data (y = + 0..15) + 3 + 1 + + + ODR2 + Port output data (y = + 0..15) + 2 + 1 + + + ODR1 + Port output data (y = + 0..15) + 1 + 1 + + + ODR0 + Port output data (y = + 0..15) + 0 + 1 + + + + + BSRR + BSRR + GPIO port bit set/reset + register + 0x18 + 0x20 + write-only + 0x00000000 + + + BR15 + Port x reset bit y (y = + 0..15) + 31 + 1 + + + BR14 + Port x reset bit y (y = + 0..15) + 30 + 1 + + + BR13 + Port x reset bit y (y = + 0..15) + 29 + 1 + + + BR12 + Port x reset bit y (y = + 0..15) + 28 + 1 + + + BR11 + Port x reset bit y (y = + 0..15) + 27 + 1 + + + BR10 + Port x reset bit y (y = + 0..15) + 26 + 1 + + + BR9 + Port x reset bit y (y = + 0..15) + 25 + 1 + + + BR8 + Port x reset bit y (y = + 0..15) + 24 + 1 + + + BR7 + Port x reset bit y (y = + 0..15) + 23 + 1 + + + BR6 + Port x reset bit y (y = + 0..15) + 22 + 1 + + + BR5 + Port x reset bit y (y = + 0..15) + 21 + 1 + + + BR4 + Port x reset bit y (y = + 0..15) + 20 + 1 + + + BR3 + Port x reset bit y (y = + 0..15) + 19 + 1 + + + BR2 + Port x reset bit y (y = + 0..15) + 18 + 1 + + + BR1 + Port x reset bit y (y = + 0..15) + 17 + 1 + + + BR0 + Port x set bit y (y= + 0..15) + 16 + 1 + + + BS15 + Port x set bit y (y= + 0..15) + 15 + 1 + + + BS14 + Port x set bit y (y= + 0..15) + 14 + 1 + + + BS13 + Port x set bit y (y= + 0..15) + 13 + 1 + + + BS12 + Port x set bit y (y= + 0..15) + 12 + 1 + + + BS11 + Port x set bit y (y= + 0..15) + 11 + 1 + + + BS10 + Port x set bit y (y= + 0..15) + 10 + 1 + + + BS9 + Port x set bit y (y= + 0..15) + 9 + 1 + + + BS8 + Port x set bit y (y= + 0..15) + 8 + 1 + + + BS7 + Port x set bit y (y= + 0..15) + 7 + 1 + + + BS6 + Port x set bit y (y= + 0..15) + 6 + 1 + + + BS5 + Port x set bit y (y= + 0..15) + 5 + 1 + + + BS4 + Port x set bit y (y= + 0..15) + 4 + 1 + + + BS3 + Port x set bit y (y= + 0..15) + 3 + 1 + + + BS2 + Port x set bit y (y= + 0..15) + 2 + 1 + + + BS1 + Port x set bit y (y= + 0..15) + 1 + 1 + + + BS0 + Port x set bit y (y= + 0..15) + 0 + 1 + + + + + LCKR + LCKR + GPIO port configuration lock + register + 0x1C + 0x20 + read-write + 0x00000000 + + + LCKK + Lok Key + 16 + 1 + + + LCK15 + Port x lock bit y (y= + 0..15) + 15 + 1 + + + LCK14 + Port x lock bit y (y= + 0..15) + 14 + 1 + + + LCK13 + Port x lock bit y (y= + 0..15) + 13 + 1 + + + LCK12 + Port x lock bit y (y= + 0..15) + 12 + 1 + + + LCK11 + Port x lock bit y (y= + 0..15) + 11 + 1 + + + LCK10 + Port x lock bit y (y= + 0..15) + 10 + 1 + + + LCK9 + Port x lock bit y (y= + 0..15) + 9 + 1 + + + LCK8 + Port x lock bit y (y= + 0..15) + 8 + 1 + + + LCK7 + Port x lock bit y (y= + 0..15) + 7 + 1 + + + LCK6 + Port x lock bit y (y= + 0..15) + 6 + 1 + + + LCK5 + Port x lock bit y (y= + 0..15) + 5 + 1 + + + LCK4 + Port x lock bit y (y= + 0..15) + 4 + 1 + + + LCK3 + Port x lock bit y (y= + 0..15) + 3 + 1 + + + LCK2 + Port x lock bit y (y= + 0..15) + 2 + 1 + + + LCK1 + Port x lock bit y (y= + 0..15) + 1 + 1 + + + LCK0 + Port x lock bit y (y= + 0..15) + 0 + 1 + + + + + AFRL + AFRL + GPIO alternate function low + register + 0x20 + 0x20 + read-write + 0x00000000 + + + AFRL7 + Alternate function selection for port x + bit y (y = 0..7) + 28 + 4 + + + AFRL6 + Alternate function selection for port x + bit y (y = 0..7) + 24 + 4 + + + AFRL5 + Alternate function selection for port x + bit y (y = 0..7) + 20 + 4 + + + AFRL4 + Alternate function selection for port x + bit y (y = 0..7) + 16 + 4 + + + AFRL3 + Alternate function selection for port x + bit y (y = 0..7) + 12 + 4 + + + AFRL2 + Alternate function selection for port x + bit y (y = 0..7) + 8 + 4 + + + AFRL1 + Alternate function selection for port x + bit y (y = 0..7) + 4 + 4 + + + AFRL0 + Alternate function selection for port x + bit y (y = 0..7) + 0 + 4 + + + + + AFRH + AFRH + GPIO alternate function high + register + 0x24 + 0x20 + read-write + 0x00000000 + + + AFRH15 + Alternate function selection for port x + bit y (y = 8..15) + 28 + 4 + + + AFRH14 + Alternate function selection for port x + bit y (y = 8..15) + 24 + 4 + + + AFRH13 + Alternate function selection for port x + bit y (y = 8..15) + 20 + 4 + + + AFRH12 + Alternate function selection for port x + bit y (y = 8..15) + 16 + 4 + + + AFRH11 + Alternate function selection for port x + bit y (y = 8..15) + 12 + 4 + + + AFRH10 + Alternate function selection for port x + bit y (y = 8..15) + 8 + 4 + + + AFRH9 + Alternate function selection for port x + bit y (y = 8..15) + 4 + 4 + + + AFRH8 + Alternate function selection for port x + bit y (y = 8..15) + 0 + 4 + + + + + BRR + BRR + Port bit reset register + 0x28 + 0x20 + write-only + 0x00000000 + + + BR0 + Port x Reset bit y + 0 + 1 + + + BR1 + Port x Reset bit y + 1 + 1 + + + BR2 + Port x Reset bit y + 2 + 1 + + + BR3 + Port x Reset bit y + 3 + 1 + + + BR4 + Port x Reset bit y + 4 + 1 + + + BR5 + Port x Reset bit y + 5 + 1 + + + BR6 + Port x Reset bit y + 6 + 1 + + + BR7 + Port x Reset bit y + 7 + 1 + + + BR8 + Port x Reset bit y + 8 + 1 + + + BR9 + Port x Reset bit y + 9 + 1 + + + BR10 + Port x Reset bit y + 10 + 1 + + + BR11 + Port x Reset bit y + 11 + 1 + + + BR12 + Port x Reset bit y + 12 + 1 + + + BR13 + Port x Reset bit y + 13 + 1 + + + BR14 + Port x Reset bit y + 14 + 1 + + + BR15 + Port x Reset bit y + 15 + 1 + + + + + + + GPIOC + 0x48000800 + + + GPIOD + 0x48000C00 + + + GPIOE + 0x48001000 + + + GPIOF + 0x48001400 + + + GPIOG + 0x48001800 + + + GPIOH + 0x48001C00 + + + TSC + Touch sensing controller + TSC + 0x40024000 + + 0x0 + 0x400 + registers + + + EXTI2_TSC + EXTI Line2 and Touch sensing + interrupts + 8 + + + + CR + CR + control register + 0x0 + 0x20 + read-write + 0x00000000 + + + CTPH + Charge transfer pulse high + 28 + 4 + + + CTPL + Charge transfer pulse low + 24 + 4 + + + SSD + Spread spectrum deviation + 17 + 7 + + + SSE + Spread spectrum enable + 16 + 1 + + + SSPSC + Spread spectrum prescaler + 15 + 1 + + + PGPSC + pulse generator prescaler + 12 + 3 + + + MCV + Max count value + 5 + 3 + + + IODEF + I/O Default mode + 4 + 1 + + + SYNCPOL + Synchronization pin + polarity + 3 + 1 + + + AM + Acquisition mode + 2 + 1 + + + START + Start a new acquisition + 1 + 1 + + + TSCE + Touch sensing controller + enable + 0 + 1 + + + + + IER + IER + interrupt enable register + 0x4 + 0x20 + read-write + 0x00000000 + + + MCEIE + Max count error interrupt + enable + 1 + 1 + + + EOAIE + End of acquisition interrupt + enable + 0 + 1 + + + + + ICR + ICR + interrupt clear register + 0x8 + 0x20 + read-write + 0x00000000 + + + MCEIC + Max count error interrupt + clear + 1 + 1 + + + EOAIC + End of acquisition interrupt + clear + 0 + 1 + + + + + ISR + ISR + interrupt status register + 0xC + 0x20 + read-write + 0x00000000 + + + MCEF + Max count error flag + 1 + 1 + + + EOAF + End of acquisition flag + 0 + 1 + + + + + IOHCR + IOHCR + I/O hysteresis control + register + 0x10 + 0x20 + read-write + 0xFFFFFFFF + + + G1_IO1 + G1_IO1 Schmitt trigger hysteresis + mode + 0 + 1 + + + G1_IO2 + G1_IO2 Schmitt trigger hysteresis + mode + 1 + 1 + + + G1_IO3 + G1_IO3 Schmitt trigger hysteresis + mode + 2 + 1 + + + G1_IO4 + G1_IO4 Schmitt trigger hysteresis + mode + 3 + 1 + + + G2_IO1 + G2_IO1 Schmitt trigger hysteresis + mode + 4 + 1 + + + G2_IO2 + G2_IO2 Schmitt trigger hysteresis + mode + 5 + 1 + + + G2_IO3 + G2_IO3 Schmitt trigger hysteresis + mode + 6 + 1 + + + G2_IO4 + G2_IO4 Schmitt trigger hysteresis + mode + 7 + 1 + + + G3_IO1 + G3_IO1 Schmitt trigger hysteresis + mode + 8 + 1 + + + G3_IO2 + G3_IO2 Schmitt trigger hysteresis + mode + 9 + 1 + + + G3_IO3 + G3_IO3 Schmitt trigger hysteresis + mode + 10 + 1 + + + G3_IO4 + G3_IO4 Schmitt trigger hysteresis + mode + 11 + 1 + + + G4_IO1 + G4_IO1 Schmitt trigger hysteresis + mode + 12 + 1 + + + G4_IO2 + G4_IO2 Schmitt trigger hysteresis + mode + 13 + 1 + + + G4_IO3 + G4_IO3 Schmitt trigger hysteresis + mode + 14 + 1 + + + G4_IO4 + G4_IO4 Schmitt trigger hysteresis + mode + 15 + 1 + + + G5_IO1 + G5_IO1 Schmitt trigger hysteresis + mode + 16 + 1 + + + G5_IO2 + G5_IO2 Schmitt trigger hysteresis + mode + 17 + 1 + + + G5_IO3 + G5_IO3 Schmitt trigger hysteresis + mode + 18 + 1 + + + G5_IO4 + G5_IO4 Schmitt trigger hysteresis + mode + 19 + 1 + + + G6_IO1 + G6_IO1 Schmitt trigger hysteresis + mode + 20 + 1 + + + G6_IO2 + G6_IO2 Schmitt trigger hysteresis + mode + 21 + 1 + + + G6_IO3 + G6_IO3 Schmitt trigger hysteresis + mode + 22 + 1 + + + G6_IO4 + G6_IO4 Schmitt trigger hysteresis + mode + 23 + 1 + + + G7_IO1 + G7_IO1 Schmitt trigger hysteresis + mode + 24 + 1 + + + G7_IO2 + G7_IO2 Schmitt trigger hysteresis + mode + 25 + 1 + + + G7_IO3 + G7_IO3 Schmitt trigger hysteresis + mode + 26 + 1 + + + G7_IO4 + G7_IO4 Schmitt trigger hysteresis + mode + 27 + 1 + + + G8_IO1 + G8_IO1 Schmitt trigger hysteresis + mode + 28 + 1 + + + G8_IO2 + G8_IO2 Schmitt trigger hysteresis + mode + 29 + 1 + + + G8_IO3 + G8_IO3 Schmitt trigger hysteresis + mode + 30 + 1 + + + G8_IO4 + G8_IO4 Schmitt trigger hysteresis + mode + 31 + 1 + + + + + IOASCR + IOASCR + I/O analog switch control + register + 0x18 + 0x20 + read-write + 0x00000000 + + + G1_IO1 + G1_IO1 analog switch + enable + 0 + 1 + + + G1_IO2 + G1_IO2 analog switch + enable + 1 + 1 + + + G1_IO3 + G1_IO3 analog switch + enable + 2 + 1 + + + G1_IO4 + G1_IO4 analog switch + enable + 3 + 1 + + + G2_IO1 + G2_IO1 analog switch + enable + 4 + 1 + + + G2_IO2 + G2_IO2 analog switch + enable + 5 + 1 + + + G2_IO3 + G2_IO3 analog switch + enable + 6 + 1 + + + G2_IO4 + G2_IO4 analog switch + enable + 7 + 1 + + + G3_IO1 + G3_IO1 analog switch + enable + 8 + 1 + + + G3_IO2 + G3_IO2 analog switch + enable + 9 + 1 + + + G3_IO3 + G3_IO3 analog switch + enable + 10 + 1 + + + G3_IO4 + G3_IO4 analog switch + enable + 11 + 1 + + + G4_IO1 + G4_IO1 analog switch + enable + 12 + 1 + + + G4_IO2 + G4_IO2 analog switch + enable + 13 + 1 + + + G4_IO3 + G4_IO3 analog switch + enable + 14 + 1 + + + G4_IO4 + G4_IO4 analog switch + enable + 15 + 1 + + + G5_IO1 + G5_IO1 analog switch + enable + 16 + 1 + + + G5_IO2 + G5_IO2 analog switch + enable + 17 + 1 + + + G5_IO3 + G5_IO3 analog switch + enable + 18 + 1 + + + G5_IO4 + G5_IO4 analog switch + enable + 19 + 1 + + + G6_IO1 + G6_IO1 analog switch + enable + 20 + 1 + + + G6_IO2 + G6_IO2 analog switch + enable + 21 + 1 + + + G6_IO3 + G6_IO3 analog switch + enable + 22 + 1 + + + G6_IO4 + G6_IO4 analog switch + enable + 23 + 1 + + + G7_IO1 + G7_IO1 analog switch + enable + 24 + 1 + + + G7_IO2 + G7_IO2 analog switch + enable + 25 + 1 + + + G7_IO3 + G7_IO3 analog switch + enable + 26 + 1 + + + G7_IO4 + G7_IO4 analog switch + enable + 27 + 1 + + + G8_IO1 + G8_IO1 analog switch + enable + 28 + 1 + + + G8_IO2 + G8_IO2 analog switch + enable + 29 + 1 + + + G8_IO3 + G8_IO3 analog switch + enable + 30 + 1 + + + G8_IO4 + G8_IO4 analog switch + enable + 31 + 1 + + + + + IOSCR + IOSCR + I/O sampling control register + 0x20 + 0x20 + read-write + 0x00000000 + + + G1_IO1 + G1_IO1 sampling mode + 0 + 1 + + + G1_IO2 + G1_IO2 sampling mode + 1 + 1 + + + G1_IO3 + G1_IO3 sampling mode + 2 + 1 + + + G1_IO4 + G1_IO4 sampling mode + 3 + 1 + + + G2_IO1 + G2_IO1 sampling mode + 4 + 1 + + + G2_IO2 + G2_IO2 sampling mode + 5 + 1 + + + G2_IO3 + G2_IO3 sampling mode + 6 + 1 + + + G2_IO4 + G2_IO4 sampling mode + 7 + 1 + + + G3_IO1 + G3_IO1 sampling mode + 8 + 1 + + + G3_IO2 + G3_IO2 sampling mode + 9 + 1 + + + G3_IO3 + G3_IO3 sampling mode + 10 + 1 + + + G3_IO4 + G3_IO4 sampling mode + 11 + 1 + + + G4_IO1 + G4_IO1 sampling mode + 12 + 1 + + + G4_IO2 + G4_IO2 sampling mode + 13 + 1 + + + G4_IO3 + G4_IO3 sampling mode + 14 + 1 + + + G4_IO4 + G4_IO4 sampling mode + 15 + 1 + + + G5_IO1 + G5_IO1 sampling mode + 16 + 1 + + + G5_IO2 + G5_IO2 sampling mode + 17 + 1 + + + G5_IO3 + G5_IO3 sampling mode + 18 + 1 + + + G5_IO4 + G5_IO4 sampling mode + 19 + 1 + + + G6_IO1 + G6_IO1 sampling mode + 20 + 1 + + + G6_IO2 + G6_IO2 sampling mode + 21 + 1 + + + G6_IO3 + G6_IO3 sampling mode + 22 + 1 + + + G6_IO4 + G6_IO4 sampling mode + 23 + 1 + + + G7_IO1 + G7_IO1 sampling mode + 24 + 1 + + + G7_IO2 + G7_IO2 sampling mode + 25 + 1 + + + G7_IO3 + G7_IO3 sampling mode + 26 + 1 + + + G7_IO4 + G7_IO4 sampling mode + 27 + 1 + + + G8_IO1 + G8_IO1 sampling mode + 28 + 1 + + + G8_IO2 + G8_IO2 sampling mode + 29 + 1 + + + G8_IO3 + G8_IO3 sampling mode + 30 + 1 + + + G8_IO4 + G8_IO4 sampling mode + 31 + 1 + + + + + IOCCR + IOCCR + I/O channel control register + 0x28 + 0x20 + read-write + 0x00000000 + + + G1_IO1 + G1_IO1 channel mode + 0 + 1 + + + G1_IO2 + G1_IO2 channel mode + 1 + 1 + + + G1_IO3 + G1_IO3 channel mode + 2 + 1 + + + G1_IO4 + G1_IO4 channel mode + 3 + 1 + + + G2_IO1 + G2_IO1 channel mode + 4 + 1 + + + G2_IO2 + G2_IO2 channel mode + 5 + 1 + + + G2_IO3 + G2_IO3 channel mode + 6 + 1 + + + G2_IO4 + G2_IO4 channel mode + 7 + 1 + + + G3_IO1 + G3_IO1 channel mode + 8 + 1 + + + G3_IO2 + G3_IO2 channel mode + 9 + 1 + + + G3_IO3 + G3_IO3 channel mode + 10 + 1 + + + G3_IO4 + G3_IO4 channel mode + 11 + 1 + + + G4_IO1 + G4_IO1 channel mode + 12 + 1 + + + G4_IO2 + G4_IO2 channel mode + 13 + 1 + + + G4_IO3 + G4_IO3 channel mode + 14 + 1 + + + G4_IO4 + G4_IO4 channel mode + 15 + 1 + + + G5_IO1 + G5_IO1 channel mode + 16 + 1 + + + G5_IO2 + G5_IO2 channel mode + 17 + 1 + + + G5_IO3 + G5_IO3 channel mode + 18 + 1 + + + G5_IO4 + G5_IO4 channel mode + 19 + 1 + + + G6_IO1 + G6_IO1 channel mode + 20 + 1 + + + G6_IO2 + G6_IO2 channel mode + 21 + 1 + + + G6_IO3 + G6_IO3 channel mode + 22 + 1 + + + G6_IO4 + G6_IO4 channel mode + 23 + 1 + + + G7_IO1 + G7_IO1 channel mode + 24 + 1 + + + G7_IO2 + G7_IO2 channel mode + 25 + 1 + + + G7_IO3 + G7_IO3 channel mode + 26 + 1 + + + G7_IO4 + G7_IO4 channel mode + 27 + 1 + + + G8_IO1 + G8_IO1 channel mode + 28 + 1 + + + G8_IO2 + G8_IO2 channel mode + 29 + 1 + + + G8_IO3 + G8_IO3 channel mode + 30 + 1 + + + G8_IO4 + G8_IO4 channel mode + 31 + 1 + + + + + IOGCSR + IOGCSR + I/O group control status + register + 0x30 + 0x20 + 0x00000000 + + + G8S + Analog I/O group x status + 23 + 1 + read-write + + + G7S + Analog I/O group x status + 22 + 1 + read-write + + + G6S + Analog I/O group x status + 21 + 1 + read-only + + + G5S + Analog I/O group x status + 20 + 1 + read-only + + + G4S + Analog I/O group x status + 19 + 1 + read-only + + + G3S + Analog I/O group x status + 18 + 1 + read-only + + + G2S + Analog I/O group x status + 17 + 1 + read-only + + + G1S + Analog I/O group x status + 16 + 1 + read-only + + + G8E + Analog I/O group x enable + 7 + 1 + read-write + + + G7E + Analog I/O group x enable + 6 + 1 + read-write + + + G6E + Analog I/O group x enable + 5 + 1 + read-write + + + G5E + Analog I/O group x enable + 4 + 1 + read-write + + + G4E + Analog I/O group x enable + 3 + 1 + read-write + + + G3E + Analog I/O group x enable + 2 + 1 + read-write + + + G2E + Analog I/O group x enable + 1 + 1 + read-write + + + G1E + Analog I/O group x enable + 0 + 1 + read-write + + + + + IOG1CR + IOG1CR + I/O group x counter register + 0x34 + 0x20 + read-only + 0x00000000 + + + CNT + Counter value + 0 + 14 + + + + + IOG2CR + IOG2CR + I/O group x counter register + 0x38 + 0x20 + read-only + 0x00000000 + + + CNT + Counter value + 0 + 14 + + + + + IOG3CR + IOG3CR + I/O group x counter register + 0x3C + 0x20 + read-only + 0x00000000 + + + CNT + Counter value + 0 + 14 + + + + + IOG4CR + IOG4CR + I/O group x counter register + 0x40 + 0x20 + read-only + 0x00000000 + + + CNT + Counter value + 0 + 14 + + + + + IOG5CR + IOG5CR + I/O group x counter register + 0x44 + 0x20 + read-only + 0x00000000 + + + CNT + Counter value + 0 + 14 + + + + + IOG6CR + IOG6CR + I/O group x counter register + 0x48 + 0x20 + read-only + 0x00000000 + + + CNT + Counter value + 0 + 14 + + + + + IOG7CR + IOG7CR + I/O group x counter register + 0x4C + 0x20 + read-only + 0x00000000 + + + CNT + Counter value + 0 + 14 + + + + + IOG8CR + IOG8CR + I/O group x counter register + 0x50 + 0x20 + read-only + 0x00000000 + + + CNT + Counter value + 0 + 14 + + + + + + + CRC + cyclic redundancy check calculation + unit + CRC + 0x40023000 + + 0x0 + 0x400 + registers + + + + DR + DR + Data register + 0x0 + 0x20 + read-write + 0xFFFFFFFF + + + DR + Data register bits + 0 + 32 + + + + + IDR + IDR + Independent data register + 0x4 + 0x20 + read-write + 0x00000000 + + + IDR + General-purpose 8-bit data register + bits + 0 + 8 + + + + + CR + CR + Control register + 0x8 + 0x20 + read-write + 0x00000000 + + + RESET + reset bit + 0 + 1 + + + POLYSIZE + Polynomial size + 3 + 2 + + + REV_IN + Reverse input data + 5 + 2 + + + REV_OUT + Reverse output data + 7 + 1 + + + + + INIT + INIT + Initial CRC value + 0x10 + 0x20 + read-write + 0xFFFFFFFF + + + INIT + Programmable initial CRC + value + 0 + 32 + + + + + POL + POL + CRC polynomial + 0x14 + 0x20 + read-write + 0x04C11DB7 + + + POL + Programmable polynomial + 0 + 32 + + + + + + + Flash + Flash + Flash + 0x40022000 + + 0x0 + 0x400 + registers + + + FLASH + Flash global interrupt + 4 + + + + ACR + ACR + Flash access control register + 0x0 + 0x20 + 0x00000030 + + + LATENCY + LATENCY + 0 + 3 + read-write + + + PRFTBE + PRFTBE + 4 + 1 + read-write + + + PRFTBS + PRFTBS + 5 + 1 + read-only + + + + + KEYR + KEYR + Flash key register + 0x4 + 0x20 + write-only + 0x00000000 + + + FKEYR + Flash Key + 0 + 32 + + + + + OPTKEYR + OPTKEYR + Flash option key register + 0x8 + 0x20 + write-only + 0x00000000 + + + OPTKEYR + Option byte key + 0 + 32 + + + + + SR + SR + Flash status register + 0xC + 0x20 + 0x00000000 + + + EOP + End of operation + 5 + 1 + read-write + + + WRPRT + Write protection error + 4 + 1 + read-write + + + PGERR + Programming error + 2 + 1 + read-write + + + BSY + Busy + 0 + 1 + read-only + + + + + CR + CR + Flash control register + 0x10 + 0x20 + read-write + 0x00000080 + + + FORCE_OPTLOAD + Force option byte loading + 13 + 1 + + + EOPIE + End of operation interrupt + enable + 12 + 1 + + + ERRIE + Error interrupt enable + 10 + 1 + + + OPTWRE + Option bytes write enable + 9 + 1 + + + LOCK + Lock + 7 + 1 + + + STRT + Start + 6 + 1 + + + OPTER + Option byte erase + 5 + 1 + + + OPTPG + Option byte programming + 4 + 1 + + + MER + Mass erase + 2 + 1 + + + PER + Page erase + 1 + 1 + + + PG + Programming + 0 + 1 + + + + + AR + AR + Flash address register + 0x14 + 0x20 + write-only + 0x00000000 + + + FAR + Flash address + 0 + 32 + + + + + OBR + OBR + Option byte register + 0x1C + 0x20 + read-only + 0xFFFFFF02 + + + OPTERR + Option byte error + 0 + 1 + + + LEVEL1_PROT + Level 1 protection status + 1 + 1 + + + LEVEL2_PROT + Level 2 protection status + 2 + 1 + + + WDG_SW + WDG_SW + 8 + 1 + + + nRST_STOP + nRST_STOP + 9 + 1 + + + nRST_STDBY + nRST_STDBY + 10 + 1 + + + BOOT1 + BOOT1 + 12 + 1 + + + VDDA_MONITOR + VDDA_MONITOR + 13 + 1 + + + SRAM_PARITY_CHECK + SRAM_PARITY_CHECK + 14 + 1 + + + Data0 + Data0 + 16 + 8 + + + Data1 + Data1 + 24 + 8 + + + + + WRPR + WRPR + Write protection register + 0x20 + 0x20 + read-only + 0xFFFFFFFF + + + WRP + Write protect + 0 + 32 + + + + + + + RCC + Reset and clock control + RCC + 0x40021000 + + 0x0 + 0x400 + registers + + + RCC + RCC global interrupt + 5 + + + + CR + CR + Clock control register + 0x0 + 0x20 + 0x00000083 + + + HSION + Internal High Speed clock + enable + 0 + 1 + read-write + + + HSIRDY + Internal High Speed clock ready + flag + 1 + 1 + read-only + + + HSITRIM + Internal High Speed clock + trimming + 3 + 5 + read-write + + + HSICAL + Internal High Speed clock + Calibration + 8 + 8 + read-only + + + HSEON + External High Speed clock + enable + 16 + 1 + read-write + + + HSERDY + External High Speed clock ready + flag + 17 + 1 + read-only + + + HSEBYP + External High Speed clock + Bypass + 18 + 1 + read-write + + + CSSON + Clock Security System + enable + 19 + 1 + read-write + + + PLLON + PLL enable + 24 + 1 + read-write + + + PLLRDY + PLL clock ready flag + 25 + 1 + read-only + + + + + CFGR + CFGR + Clock configuration register + (RCC_CFGR) + 0x4 + 0x20 + 0x00000000 + + + SW + System clock Switch + 0 + 2 + read-write + + + SWS + System Clock Switch Status + 2 + 2 + read-only + + + HPRE + AHB prescaler + 4 + 4 + read-write + + + PPRE1 + APB Low speed prescaler + (APB1) + 8 + 3 + read-write + + + PPRE2 + APB high speed prescaler + (APB2) + 11 + 3 + read-write + + + PLLSRC + PLL entry clock source + 15 + 2 + read-write + + + PLLXTPRE + HSE divider for PLL entry + 17 + 1 + read-write + + + PLLMUL + PLL Multiplication Factor + 18 + 4 + read-write + + + USBPRES + USB prescaler + 22 + 1 + read-write + + + MCO + Microcontroller clock + output + 24 + 3 + read-write + + + MCOF + Microcontroller Clock Output + Flag + 28 + 1 + read-only + + + I2SSRC + I2S external clock source + selection + 23 + 1 + read-write + + + + + CIR + CIR + Clock interrupt register + (RCC_CIR) + 0x8 + 0x20 + 0x00000000 + + + LSIRDYF + LSI Ready Interrupt flag + 0 + 1 + read-only + + + LSERDYF + LSE Ready Interrupt flag + 1 + 1 + read-only + + + HSIRDYF + HSI Ready Interrupt flag + 2 + 1 + read-only + + + HSERDYF + HSE Ready Interrupt flag + 3 + 1 + read-only + + + PLLRDYF + PLL Ready Interrupt flag + 4 + 1 + read-only + + + CSSF + Clock Security System Interrupt + flag + 7 + 1 + read-only + + + LSIRDYIE + LSI Ready Interrupt Enable + 8 + 1 + read-write + + + LSERDYIE + LSE Ready Interrupt Enable + 9 + 1 + read-write + + + HSIRDYIE + HSI Ready Interrupt Enable + 10 + 1 + read-write + + + HSERDYIE + HSE Ready Interrupt Enable + 11 + 1 + read-write + + + PLLRDYIE + PLL Ready Interrupt Enable + 12 + 1 + read-write + + + LSIRDYC + LSI Ready Interrupt Clear + 16 + 1 + write-only + + + LSERDYC + LSE Ready Interrupt Clear + 17 + 1 + write-only + + + HSIRDYC + HSI Ready Interrupt Clear + 18 + 1 + write-only + + + HSERDYC + HSE Ready Interrupt Clear + 19 + 1 + write-only + + + PLLRDYC + PLL Ready Interrupt Clear + 20 + 1 + write-only + + + CSSC + Clock security system interrupt + clear + 23 + 1 + write-only + + + + + APB2RSTR + APB2RSTR + APB2 peripheral reset register + (RCC_APB2RSTR) + 0xC + 0x20 + read-write + 0x00000000 + + + SYSCFGRST + SYSCFG and COMP reset + 0 + 1 + + + TIM1RST + TIM1 timer reset + 11 + 1 + + + SPI1RST + SPI 1 reset + 12 + 1 + + + TIM8RST + TIM8 timer reset + 13 + 1 + + + USART1RST + USART1 reset + 14 + 1 + + + TIM15RST + TIM15 timer reset + 16 + 1 + + + TIM16RST + TIM16 timer reset + 17 + 1 + + + TIM17RST + TIM17 timer reset + 18 + 1 + + + + + APB1RSTR + APB1RSTR + APB1 peripheral reset register + (RCC_APB1RSTR) + 0x10 + 0x20 + read-write + 0x00000000 + + + TIM2RST + Timer 2 reset + 0 + 1 + + + TIM3RST + Timer 3 reset + 1 + 1 + + + TIM4RST + Timer 14 reset + 2 + 1 + + + TIM6RST + Timer 6 reset + 4 + 1 + + + TIM7RST + Timer 7 reset + 5 + 1 + + + WWDGRST + Window watchdog reset + 11 + 1 + + + SPI2RST + SPI2 reset + 14 + 1 + + + SPI3RST + SPI3 reset + 15 + 1 + + + USART2RST + USART 2 reset + 17 + 1 + + + USART3RST + USART3 reset + 18 + 1 + + + UART4RST + UART 4 reset + 19 + 1 + + + UART5RST + UART 5 reset + 20 + 1 + + + I2C1RST + I2C1 reset + 21 + 1 + + + I2C2RST + I2C2 reset + 22 + 1 + + + USBRST + USB reset + 23 + 1 + + + CANRST + CAN reset + 25 + 1 + + + PWRRST + Power interface reset + 28 + 1 + + + DACRST + DAC interface reset + 29 + 1 + + + + + AHBENR + AHBENR + AHB Peripheral Clock enable register + (RCC_AHBENR) + 0x14 + 0x20 + read-write + 0x00000014 + + + DMAEN + DMA1 clock enable + 0 + 1 + + + DMA2EN + DMA2 clock enable + 1 + 1 + + + SRAMEN + SRAM interface clock + enable + 2 + 1 + + + FLITFEN + FLITF clock enable + 4 + 1 + + + CRCEN + CRC clock enable + 6 + 1 + + + IOPAEN + I/O port A clock enable + 17 + 1 + + + IOPBEN + I/O port B clock enable + 18 + 1 + + + IOPCEN + I/O port C clock enable + 19 + 1 + + + IOPDEN + I/O port D clock enable + 20 + 1 + + + IOPEEN + I/O port E clock enable + 21 + 1 + + + IOPFEN + I/O port F clock enable + 22 + 1 + + + TSCEN + Touch sensing controller clock + enable + 24 + 1 + + + ADC12EN + ADC1 and ADC2 clock enable + 28 + 1 + + + ADC34EN + ADC3 and ADC4 clock enable + 29 + 1 + + + + + APB2ENR + APB2ENR + APB2 peripheral clock enable register + (RCC_APB2ENR) + 0x18 + 0x20 + read-write + 0x00000000 + + + SYSCFGEN + SYSCFG clock enable + 0 + 1 + + + TIM1EN + TIM1 Timer clock enable + 11 + 1 + + + SPI1EN + SPI 1 clock enable + 12 + 1 + + + TIM8EN + TIM8 Timer clock enable + 13 + 1 + + + USART1EN + USART1 clock enable + 14 + 1 + + + TIM15EN + TIM15 timer clock enable + 16 + 1 + + + TIM16EN + TIM16 timer clock enable + 17 + 1 + + + TIM17EN + TIM17 timer clock enable + 18 + 1 + + + + + APB1ENR + APB1ENR + APB1 peripheral clock enable register + (RCC_APB1ENR) + 0x1C + 0x20 + read-write + 0x00000000 + + + TIM2EN + Timer 2 clock enable + 0 + 1 + + + TIM3EN + Timer 3 clock enable + 1 + 1 + + + TIM4EN + Timer 4 clock enable + 2 + 1 + + + TIM6EN + Timer 6 clock enable + 4 + 1 + + + TIM7EN + Timer 7 clock enable + 5 + 1 + + + WWDGEN + Window watchdog clock + enable + 11 + 1 + + + SPI2EN + SPI 2 clock enable + 14 + 1 + + + SPI3EN + SPI 3 clock enable + 15 + 1 + + + USART2EN + USART 2 clock enable + 17 + 1 + + + I2C1EN + I2C 1 clock enable + 21 + 1 + + + I2C2EN + I2C 2 clock enable + 22 + 1 + + + USBEN + USB clock enable + 23 + 1 + + + CANEN + CAN clock enable + 25 + 1 + + + PWREN + Power interface clock + enable + 28 + 1 + + + DACEN + DAC interface clock enable + 29 + 1 + + + + + BDCR + BDCR + Backup domain control register + (RCC_BDCR) + 0x20 + 0x20 + 0x00000000 + + + LSEON + External Low Speed oscillator + enable + 0 + 1 + read-write + + + LSERDY + External Low Speed oscillator + ready + 1 + 1 + read-only + + + LSEBYP + External Low Speed oscillator + bypass + 2 + 1 + read-write + + + LSEDRV + LSE oscillator drive + capability + 3 + 2 + read-write + + + RTCSEL + RTC clock source selection + 8 + 2 + read-write + + + RTCEN + RTC clock enable + 15 + 1 + read-write + + + BDRST + Backup domain software + reset + 16 + 1 + read-write + + + + + CSR + CSR + Control/status register + (RCC_CSR) + 0x24 + 0x20 + 0x0C000000 + + + LSION + Internal low speed oscillator + enable + 0 + 1 + read-write + + + LSIRDY + Internal low speed oscillator + ready + 1 + 1 + read-only + + + RMVF + Remove reset flag + 24 + 1 + read-write + + + OBLRSTF + Option byte loader reset + flag + 25 + 1 + read-write + + + PINRSTF + PIN reset flag + 26 + 1 + read-write + + + PORRSTF + POR/PDR reset flag + 27 + 1 + read-write + + + SFTRSTF + Software reset flag + 28 + 1 + read-write + + + IWDGRSTF + Independent watchdog reset + flag + 29 + 1 + read-write + + + WWDGRSTF + Window watchdog reset flag + 30 + 1 + read-write + + + LPWRRSTF + Low-power reset flag + 31 + 1 + read-write + + + + + AHBRSTR + AHBRSTR + AHB peripheral reset register + 0x28 + 0x20 + read-write + 0x00000000 + + + IOPARST + I/O port A reset + 17 + 1 + + + IOPBRST + I/O port B reset + 18 + 1 + + + IOPCRST + I/O port C reset + 19 + 1 + + + IOPDRST + I/O port D reset + 20 + 1 + + + IOPERST + I/O port E reset + 21 + 1 + + + IOPFRST + I/O port F reset + 22 + 1 + + + TSCRST + Touch sensing controller + reset + 24 + 1 + + + ADC12RST + ADC1 and ADC2 reset + 28 + 1 + + + ADC34RST + ADC3 and ADC4 reset + 29 + 1 + + + + + CFGR2 + CFGR2 + Clock configuration register 2 + 0x2C + 0x20 + read-write + 0x00000000 + + + PREDIV + PREDIV division factor + 0 + 4 + + + ADC12PRES + ADC1 and ADC2 prescaler + 4 + 5 + + + ADC34PRES + ADC3 and ADC4 prescaler + 9 + 5 + + + + + CFGR3 + CFGR3 + Clock configuration register 3 + 0x30 + 0x20 + read-write + 0x00000000 + + + USART1SW + USART1 clock source + selection + 0 + 2 + + + I2C1SW + I2C1 clock source + selection + 4 + 1 + + + I2C2SW + I2C2 clock source + selection + 5 + 1 + + + USART2SW + USART2 clock source + selection + 16 + 2 + + + USART3SW + USART3 clock source + selection + 18 + 2 + + + TIM1SW + Timer1 clock source + selection + 8 + 1 + + + TIM8SW + Timer8 clock source + selection + 9 + 1 + + + UART4SW + UART4 clock source + selection + 20 + 2 + + + UART5SW + UART5 clock source + selection + 22 + 2 + + + + + + + DMA1 + DMA controller 1 + DMA + 0x40020000 + + 0x0 + 0x400 + registers + + + DMA1_CH1 + DMA1 channel 1 interrupt + 11 + + + DMA1_CH2 + DMA1 channel 2 interrupt + 12 + + + DMA1_CH3 + DMA1 channel 3 interrupt + 13 + + + DMA1_CH4 + DMA1 channel 4 interrupt + 14 + + + DMA1_CH5 + DMA1 channel 5 interrupt + 15 + + + DMA1_CH6 + DMA1 channel 6 interrupt + 16 + + + DMA1_CH7 + DMA1 channel 7interrupt + 17 + + + + ISR + ISR + DMA interrupt status register + (DMA_ISR) + 0x0 + 0x20 + read-only + 0x00000000 + + + GIF1 + Channel 1 Global interrupt + flag + 0 + 1 + + + TCIF1 + Channel 1 Transfer Complete + flag + 1 + 1 + + + HTIF1 + Channel 1 Half Transfer Complete + flag + 2 + 1 + + + TEIF1 + Channel 1 Transfer Error + flag + 3 + 1 + + + GIF2 + Channel 2 Global interrupt + flag + 4 + 1 + + + TCIF2 + Channel 2 Transfer Complete + flag + 5 + 1 + + + HTIF2 + Channel 2 Half Transfer Complete + flag + 6 + 1 + + + TEIF2 + Channel 2 Transfer Error + flag + 7 + 1 + + + GIF3 + Channel 3 Global interrupt + flag + 8 + 1 + + + TCIF3 + Channel 3 Transfer Complete + flag + 9 + 1 + + + HTIF3 + Channel 3 Half Transfer Complete + flag + 10 + 1 + + + TEIF3 + Channel 3 Transfer Error + flag + 11 + 1 + + + GIF4 + Channel 4 Global interrupt + flag + 12 + 1 + + + TCIF4 + Channel 4 Transfer Complete + flag + 13 + 1 + + + HTIF4 + Channel 4 Half Transfer Complete + flag + 14 + 1 + + + TEIF4 + Channel 4 Transfer Error + flag + 15 + 1 + + + GIF5 + Channel 5 Global interrupt + flag + 16 + 1 + + + TCIF5 + Channel 5 Transfer Complete + flag + 17 + 1 + + + HTIF5 + Channel 5 Half Transfer Complete + flag + 18 + 1 + + + TEIF5 + Channel 5 Transfer Error + flag + 19 + 1 + + + GIF6 + Channel 6 Global interrupt + flag + 20 + 1 + + + TCIF6 + Channel 6 Transfer Complete + flag + 21 + 1 + + + HTIF6 + Channel 6 Half Transfer Complete + flag + 22 + 1 + + + TEIF6 + Channel 6 Transfer Error + flag + 23 + 1 + + + GIF7 + Channel 7 Global interrupt + flag + 24 + 1 + + + TCIF7 + Channel 7 Transfer Complete + flag + 25 + 1 + + + HTIF7 + Channel 7 Half Transfer Complete + flag + 26 + 1 + + + TEIF7 + Channel 7 Transfer Error + flag + 27 + 1 + + + + + IFCR + IFCR + DMA interrupt flag clear register + (DMA_IFCR) + 0x4 + 0x20 + write-only + 0x00000000 + + + CGIF1 + Channel 1 Global interrupt + clear + 0 + 1 + + + CTCIF1 + Channel 1 Transfer Complete + clear + 1 + 1 + + + CHTIF1 + Channel 1 Half Transfer + clear + 2 + 1 + + + CTEIF1 + Channel 1 Transfer Error + clear + 3 + 1 + + + CGIF2 + Channel 2 Global interrupt + clear + 4 + 1 + + + CTCIF2 + Channel 2 Transfer Complete + clear + 5 + 1 + + + CHTIF2 + Channel 2 Half Transfer + clear + 6 + 1 + + + CTEIF2 + Channel 2 Transfer Error + clear + 7 + 1 + + + CGIF3 + Channel 3 Global interrupt + clear + 8 + 1 + + + CTCIF3 + Channel 3 Transfer Complete + clear + 9 + 1 + + + CHTIF3 + Channel 3 Half Transfer + clear + 10 + 1 + + + CTEIF3 + Channel 3 Transfer Error + clear + 11 + 1 + + + CGIF4 + Channel 4 Global interrupt + clear + 12 + 1 + + + CTCIF4 + Channel 4 Transfer Complete + clear + 13 + 1 + + + CHTIF4 + Channel 4 Half Transfer + clear + 14 + 1 + + + CTEIF4 + Channel 4 Transfer Error + clear + 15 + 1 + + + CGIF5 + Channel 5 Global interrupt + clear + 16 + 1 + + + CTCIF5 + Channel 5 Transfer Complete + clear + 17 + 1 + + + CHTIF5 + Channel 5 Half Transfer + clear + 18 + 1 + + + CTEIF5 + Channel 5 Transfer Error + clear + 19 + 1 + + + CGIF6 + Channel 6 Global interrupt + clear + 20 + 1 + + + CTCIF6 + Channel 6 Transfer Complete + clear + 21 + 1 + + + CHTIF6 + Channel 6 Half Transfer + clear + 22 + 1 + + + CTEIF6 + Channel 6 Transfer Error + clear + 23 + 1 + + + CGIF7 + Channel 7 Global interrupt + clear + 24 + 1 + + + CTCIF7 + Channel 7 Transfer Complete + clear + 25 + 1 + + + CHTIF7 + Channel 7 Half Transfer + clear + 26 + 1 + + + CTEIF7 + Channel 7 Transfer Error + clear + 27 + 1 + + + + + CCR1 + CCR1 + DMA channel configuration register + (DMA_CCR) + 0x8 + 0x20 + read-write + 0x00000000 + + + EN + Channel enable + 0 + 1 + + + TCIE + Transfer complete interrupt + enable + 1 + 1 + + + HTIE + Half Transfer interrupt + enable + 2 + 1 + + + TEIE + Transfer error interrupt + enable + 3 + 1 + + + DIR + Data transfer direction + 4 + 1 + + + CIRC + Circular mode + 5 + 1 + + + PINC + Peripheral increment mode + 6 + 1 + + + MINC + Memory increment mode + 7 + 1 + + + PSIZE + Peripheral size + 8 + 2 + + + MSIZE + Memory size + 10 + 2 + + + PL + Channel Priority level + 12 + 2 + + + MEM2MEM + Memory to memory mode + 14 + 1 + + + + + CNDTR1 + CNDTR1 + DMA channel 1 number of data + register + 0xC + 0x20 + read-write + 0x00000000 + + + NDT + Number of data to transfer + 0 + 16 + + + + + CPAR1 + CPAR1 + DMA channel 1 peripheral address + register + 0x10 + 0x20 + read-write + 0x00000000 + + + PA + Peripheral address + 0 + 32 + + + + + CMAR1 + CMAR1 + DMA channel 1 memory address + register + 0x14 + 0x20 + read-write + 0x00000000 + + + MA + Memory address + 0 + 32 + + + + + CCR2 + CCR2 + DMA channel configuration register + (DMA_CCR) + 0x1C + 0x20 + read-write + 0x00000000 + + + EN + Channel enable + 0 + 1 + + + TCIE + Transfer complete interrupt + enable + 1 + 1 + + + HTIE + Half Transfer interrupt + enable + 2 + 1 + + + TEIE + Transfer error interrupt + enable + 3 + 1 + + + DIR + Data transfer direction + 4 + 1 + + + CIRC + Circular mode + 5 + 1 + + + PINC + Peripheral increment mode + 6 + 1 + + + MINC + Memory increment mode + 7 + 1 + + + PSIZE + Peripheral size + 8 + 2 + + + MSIZE + Memory size + 10 + 2 + + + PL + Channel Priority level + 12 + 2 + + + MEM2MEM + Memory to memory mode + 14 + 1 + + + + + CNDTR2 + CNDTR2 + DMA channel 2 number of data + register + 0x20 + 0x20 + read-write + 0x00000000 + + + NDT + Number of data to transfer + 0 + 16 + + + + + CPAR2 + CPAR2 + DMA channel 2 peripheral address + register + 0x24 + 0x20 + read-write + 0x00000000 + + + PA + Peripheral address + 0 + 32 + + + + + CMAR2 + CMAR2 + DMA channel 2 memory address + register + 0x28 + 0x20 + read-write + 0x00000000 + + + MA + Memory address + 0 + 32 + + + + + CCR3 + CCR3 + DMA channel configuration register + (DMA_CCR) + 0x30 + 0x20 + read-write + 0x00000000 + + + EN + Channel enable + 0 + 1 + + + TCIE + Transfer complete interrupt + enable + 1 + 1 + + + HTIE + Half Transfer interrupt + enable + 2 + 1 + + + TEIE + Transfer error interrupt + enable + 3 + 1 + + + DIR + Data transfer direction + 4 + 1 + + + CIRC + Circular mode + 5 + 1 + + + PINC + Peripheral increment mode + 6 + 1 + + + MINC + Memory increment mode + 7 + 1 + + + PSIZE + Peripheral size + 8 + 2 + + + MSIZE + Memory size + 10 + 2 + + + PL + Channel Priority level + 12 + 2 + + + MEM2MEM + Memory to memory mode + 14 + 1 + + + + + CNDTR3 + CNDTR3 + DMA channel 3 number of data + register + 0x34 + 0x20 + read-write + 0x00000000 + + + NDT + Number of data to transfer + 0 + 16 + + + + + CPAR3 + CPAR3 + DMA channel 3 peripheral address + register + 0x38 + 0x20 + read-write + 0x00000000 + + + PA + Peripheral address + 0 + 32 + + + + + CMAR3 + CMAR3 + DMA channel 3 memory address + register + 0x3C + 0x20 + read-write + 0x00000000 + + + MA + Memory address + 0 + 32 + + + + + CCR4 + CCR4 + DMA channel configuration register + (DMA_CCR) + 0x44 + 0x20 + read-write + 0x00000000 + + + EN + Channel enable + 0 + 1 + + + TCIE + Transfer complete interrupt + enable + 1 + 1 + + + HTIE + Half Transfer interrupt + enable + 2 + 1 + + + TEIE + Transfer error interrupt + enable + 3 + 1 + + + DIR + Data transfer direction + 4 + 1 + + + CIRC + Circular mode + 5 + 1 + + + PINC + Peripheral increment mode + 6 + 1 + + + MINC + Memory increment mode + 7 + 1 + + + PSIZE + Peripheral size + 8 + 2 + + + MSIZE + Memory size + 10 + 2 + + + PL + Channel Priority level + 12 + 2 + + + MEM2MEM + Memory to memory mode + 14 + 1 + + + + + CNDTR4 + CNDTR4 + DMA channel 4 number of data + register + 0x48 + 0x20 + read-write + 0x00000000 + + + NDT + Number of data to transfer + 0 + 16 + + + + + CPAR4 + CPAR4 + DMA channel 4 peripheral address + register + 0x4C + 0x20 + read-write + 0x00000000 + + + PA + Peripheral address + 0 + 32 + + + + + CMAR4 + CMAR4 + DMA channel 4 memory address + register + 0x50 + 0x20 + read-write + 0x00000000 + + + MA + Memory address + 0 + 32 + + + + + CCR5 + CCR5 + DMA channel configuration register + (DMA_CCR) + 0x58 + 0x20 + read-write + 0x00000000 + + + EN + Channel enable + 0 + 1 + + + TCIE + Transfer complete interrupt + enable + 1 + 1 + + + HTIE + Half Transfer interrupt + enable + 2 + 1 + + + TEIE + Transfer error interrupt + enable + 3 + 1 + + + DIR + Data transfer direction + 4 + 1 + + + CIRC + Circular mode + 5 + 1 + + + PINC + Peripheral increment mode + 6 + 1 + + + MINC + Memory increment mode + 7 + 1 + + + PSIZE + Peripheral size + 8 + 2 + + + MSIZE + Memory size + 10 + 2 + + + PL + Channel Priority level + 12 + 2 + + + MEM2MEM + Memory to memory mode + 14 + 1 + + + + + CNDTR5 + CNDTR5 + DMA channel 5 number of data + register + 0x5C + 0x20 + read-write + 0x00000000 + + + NDT + Number of data to transfer + 0 + 16 + + + + + CPAR5 + CPAR5 + DMA channel 5 peripheral address + register + 0x60 + 0x20 + read-write + 0x00000000 + + + PA + Peripheral address + 0 + 32 + + + + + CMAR5 + CMAR5 + DMA channel 5 memory address + register + 0x64 + 0x20 + read-write + 0x00000000 + + + MA + Memory address + 0 + 32 + + + + + CCR6 + CCR6 + DMA channel configuration register + (DMA_CCR) + 0x6C + 0x20 + read-write + 0x00000000 + + + EN + Channel enable + 0 + 1 + + + TCIE + Transfer complete interrupt + enable + 1 + 1 + + + HTIE + Half Transfer interrupt + enable + 2 + 1 + + + TEIE + Transfer error interrupt + enable + 3 + 1 + + + DIR + Data transfer direction + 4 + 1 + + + CIRC + Circular mode + 5 + 1 + + + PINC + Peripheral increment mode + 6 + 1 + + + MINC + Memory increment mode + 7 + 1 + + + PSIZE + Peripheral size + 8 + 2 + + + MSIZE + Memory size + 10 + 2 + + + PL + Channel Priority level + 12 + 2 + + + MEM2MEM + Memory to memory mode + 14 + 1 + + + + + CNDTR6 + CNDTR6 + DMA channel 6 number of data + register + 0x70 + 0x20 + read-write + 0x00000000 + + + NDT + Number of data to transfer + 0 + 16 + + + + + CPAR6 + CPAR6 + DMA channel 6 peripheral address + register + 0x74 + 0x20 + read-write + 0x00000000 + + + PA + Peripheral address + 0 + 32 + + + + + CMAR6 + CMAR6 + DMA channel 6 memory address + register + 0x78 + 0x20 + read-write + 0x00000000 + + + MA + Memory address + 0 + 32 + + + + + CCR7 + CCR7 + DMA channel configuration register + (DMA_CCR) + 0x80 + 0x20 + read-write + 0x00000000 + + + EN + Channel enable + 0 + 1 + + + TCIE + Transfer complete interrupt + enable + 1 + 1 + + + HTIE + Half Transfer interrupt + enable + 2 + 1 + + + TEIE + Transfer error interrupt + enable + 3 + 1 + + + DIR + Data transfer direction + 4 + 1 + + + CIRC + Circular mode + 5 + 1 + + + PINC + Peripheral increment mode + 6 + 1 + + + MINC + Memory increment mode + 7 + 1 + + + PSIZE + Peripheral size + 8 + 2 + + + MSIZE + Memory size + 10 + 2 + + + PL + Channel Priority level + 12 + 2 + + + MEM2MEM + Memory to memory mode + 14 + 1 + + + + + CNDTR7 + CNDTR7 + DMA channel 7 number of data + register + 0x84 + 0x20 + read-write + 0x00000000 + + + NDT + Number of data to transfer + 0 + 16 + + + + + CPAR7 + CPAR7 + DMA channel 7 peripheral address + register + 0x88 + 0x20 + read-write + 0x00000000 + + + PA + Peripheral address + 0 + 32 + + + + + CMAR7 + CMAR7 + DMA channel 7 memory address + register + 0x8C + 0x20 + read-write + 0x00000000 + + + MA + Memory address + 0 + 32 + + + + + + + DMA2 + 0x40020400 + + DMA2_CH1 + DMA2 channel1 global interrupt + 56 + + + DMA2_CH2 + DMA2 channel2 global interrupt + 57 + + + DMA2_CH3 + DMA2 channel3 global interrupt + 58 + + + DMA2_CH4 + DMA2 channel4 global interrupt + 59 + + + DMA2_CH5 + DMA2 channel5 global interrupt + 60 + + + + TIM2 + General purpose timer + TIMs + 0x40000000 + + 0x0 + 0x400 + registers + + + TIM2 + TIM2 global interrupt + 28 + + + + CR1 + CR1 + control register 1 + 0x0 + 0x20 + read-write + 0x0000 + + + CEN + Counter enable + 0 + 1 + + + UDIS + Update disable + 1 + 1 + + + URS + Update request source + 2 + 1 + + + OPM + One-pulse mode + 3 + 1 + + + DIR + Direction + 4 + 1 + + + CMS + Center-aligned mode + selection + 5 + 2 + + + ARPE + Auto-reload preload enable + 7 + 1 + + + CKD + Clock division + 8 + 2 + + + UIFREMAP + UIF status bit remapping + 11 + 1 + + + + + CR2 + CR2 + control register 2 + 0x4 + 0x20 + read-write + 0x0000 + + + TI1S + TI1 selection + 7 + 1 + + + MMS + Master mode selection + 4 + 3 + + + CCDS + Capture/compare DMA + selection + 3 + 1 + + + + + SMCR + SMCR + slave mode control register + 0x8 + 0x20 + read-write + 0x0000 + + + SMS + Slave mode selection + 0 + 3 + + + OCCS + OCREF clear selection + 3 + 1 + + + TS + Trigger selection + 4 + 3 + + + MSM + Master/Slave mode + 7 + 1 + + + ETF + External trigger filter + 8 + 4 + + + ETPS + External trigger prescaler + 12 + 2 + + + ECE + External clock enable + 14 + 1 + + + ETP + External trigger polarity + 15 + 1 + + + SMS_3 + Slave mode selection bit3 + 16 + 1 + + + + + DIER + DIER + DMA/Interrupt enable register + 0xC + 0x20 + read-write + 0x0000 + + + TDE + Trigger DMA request enable + 14 + 1 + + + CC4DE + Capture/Compare 4 DMA request + enable + 12 + 1 + + + CC3DE + Capture/Compare 3 DMA request + enable + 11 + 1 + + + CC2DE + Capture/Compare 2 DMA request + enable + 10 + 1 + + + CC1DE + Capture/Compare 1 DMA request + enable + 9 + 1 + + + UDE + Update DMA request enable + 8 + 1 + + + TIE + Trigger interrupt enable + 6 + 1 + + + CC4IE + Capture/Compare 4 interrupt + enable + 4 + 1 + + + CC3IE + Capture/Compare 3 interrupt + enable + 3 + 1 + + + CC2IE + Capture/Compare 2 interrupt + enable + 2 + 1 + + + CC1IE + Capture/Compare 1 interrupt + enable + 1 + 1 + + + UIE + Update interrupt enable + 0 + 1 + + + + + SR + SR + status register + 0x10 + 0x20 + read-write + 0x0000 + + + CC4OF + Capture/Compare 4 overcapture + flag + 12 + 1 + + + CC3OF + Capture/Compare 3 overcapture + flag + 11 + 1 + + + CC2OF + Capture/compare 2 overcapture + flag + 10 + 1 + + + CC1OF + Capture/Compare 1 overcapture + flag + 9 + 1 + + + TIF + Trigger interrupt flag + 6 + 1 + + + CC4IF + Capture/Compare 4 interrupt + flag + 4 + 1 + + + CC3IF + Capture/Compare 3 interrupt + flag + 3 + 1 + + + CC2IF + Capture/Compare 2 interrupt + flag + 2 + 1 + + + CC1IF + Capture/compare 1 interrupt + flag + 1 + 1 + + + UIF + Update interrupt flag + 0 + 1 + + + + + EGR + EGR + event generation register + 0x14 + 0x20 + write-only + 0x0000 + + + TG + Trigger generation + 6 + 1 + + + CC4G + Capture/compare 4 + generation + 4 + 1 + + + CC3G + Capture/compare 3 + generation + 3 + 1 + + + CC2G + Capture/compare 2 + generation + 2 + 1 + + + CC1G + Capture/compare 1 + generation + 1 + 1 + + + UG + Update generation + 0 + 1 + + + + + CCMR1_Output + CCMR1_Output + capture/compare mode register 1 (output + mode) + 0x18 + 0x20 + read-write + 0x00000000 + + + CC1S + Capture/Compare 1 + selection + 0 + 2 + + + OC1FE + Output compare 1 fast + enable + 2 + 1 + + + OC1PE + Output compare 1 preload + enable + 3 + 1 + + + OC1M + Output compare 1 mode + 4 + 3 + + + OC1CE + Output compare 1 clear + enable + 7 + 1 + + + CC2S + Capture/Compare 2 + selection + 8 + 2 + + + OC2FE + Output compare 2 fast + enable + 10 + 1 + + + OC2PE + Output compare 2 preload + enable + 11 + 1 + + + OC2M + Output compare 2 mode + 12 + 3 + + + OC2CE + Output compare 2 clear + enable + 15 + 1 + + + OC1M_3 + Output compare 1 mode bit + 3 + 16 + 1 + + + OC2M_3 + Output compare 2 mode bit + 3 + 24 + 1 + + + + + CCMR1_Input + CCMR1_Input + capture/compare mode register 1 (input + mode) + CCMR1_Output + 0x18 + 0x20 + read-write + 0x00000000 + + + IC2F + Input capture 2 filter + 12 + 4 + + + IC2PSC + Input capture 2 prescaler + 10 + 2 + + + CC2S + Capture/compare 2 + selection + 8 + 2 + + + IC1F + Input capture 1 filter + 4 + 4 + + + IC1PSC + Input capture 1 prescaler + 2 + 2 + + + CC1S + Capture/Compare 1 + selection + 0 + 2 + + + + + CCMR2_Output + CCMR2_Output + capture/compare mode register 2 (output + mode) + 0x1C + 0x20 + read-write + 0x00000000 + + + CC3S + Capture/Compare 3 + selection + 0 + 2 + + + OC3FE + Output compare 3 fast + enable + 2 + 1 + + + OC3PE + Output compare 3 preload + enable + 3 + 1 + + + OC3M + Output compare 3 mode + 4 + 3 + + + OC3CE + Output compare 3 clear + enable + 7 + 1 + + + CC4S + Capture/Compare 4 + selection + 8 + 2 + + + OC4FE + Output compare 4 fast + enable + 10 + 1 + + + OC4PE + Output compare 4 preload + enable + 11 + 1 + + + OC4M + Output compare 4 mode + 12 + 3 + + + O24CE + Output compare 4 clear + enable + 15 + 1 + + + OC3M_3 + Output compare 3 mode bit3 + 16 + 1 + + + OC4M_3 + Output compare 4 mode bit3 + 24 + 1 + + + + + CCMR2_Input + CCMR2_Input + capture/compare mode register 2 (input + mode) + CCMR2_Output + 0x1C + 0x20 + read-write + 0x00000000 + + + IC4F + Input capture 4 filter + 12 + 4 + + + IC4PSC + Input capture 4 prescaler + 10 + 2 + + + CC4S + Capture/Compare 4 + selection + 8 + 2 + + + IC3F + Input capture 3 filter + 4 + 4 + + + IC3PSC + Input capture 3 prescaler + 2 + 2 + + + CC3S + Capture/Compare 3 + selection + 0 + 2 + + + + + CCER + CCER + capture/compare enable + register + 0x20 + 0x20 + read-write + 0x0000 + + + CC1E + Capture/Compare 1 output + enable + 0 + 1 + + + CC1P + Capture/Compare 1 output + Polarity + 1 + 1 + + + CC1NP + Capture/Compare 1 output + Polarity + 3 + 1 + + + CC2E + Capture/Compare 2 output + enable + 4 + 1 + + + CC2P + Capture/Compare 2 output + Polarity + 5 + 1 + + + CC2NP + Capture/Compare 2 output + Polarity + 7 + 1 + + + CC3E + Capture/Compare 3 output + enable + 8 + 1 + + + CC3P + Capture/Compare 3 output + Polarity + 9 + 1 + + + CC3NP + Capture/Compare 3 output + Polarity + 11 + 1 + + + CC4E + Capture/Compare 4 output + enable + 12 + 1 + + + CC4P + Capture/Compare 3 output + Polarity + 13 + 1 + + + CC4NP + Capture/Compare 3 output + Polarity + 15 + 1 + + + + + CNT + CNT + counter + 0x24 + 0x20 + read-write + 0x00000000 + + + CNTL + Low counter value + 0 + 16 + + + CNTH + High counter value + 16 + 15 + + + CNT_or_UIFCPY + if IUFREMAP=0 than CNT with read write + access else UIFCPY with read only + access + 31 + 1 + + + + + PSC + PSC + prescaler + 0x28 + 0x20 + read-write + 0x0000 + + + PSC + Prescaler value + 0 + 16 + + + + + ARR + ARR + auto-reload register + 0x2C + 0x20 + read-write + 0x00000000 + + + ARRL + Low Auto-reload value + 0 + 16 + + + ARRH + High Auto-reload value + 16 + 16 + + + + + CCR1 + CCR1 + capture/compare register 1 + 0x34 + 0x20 + read-write + 0x00000000 + + + CCR1L + Low Capture/Compare 1 + value + 0 + 16 + + + CCR1H + High Capture/Compare 1 value (on + TIM2) + 16 + 16 + + + + + CCR2 + CCR2 + capture/compare register 2 + 0x38 + 0x20 + read-write + 0x00000000 + + + CCR2L + Low Capture/Compare 2 + value + 0 + 16 + + + CCR2H + High Capture/Compare 2 value (on + TIM2) + 16 + 16 + + + + + CCR3 + CCR3 + capture/compare register 3 + 0x3C + 0x20 + read-write + 0x00000000 + + + CCR3L + Low Capture/Compare value + 0 + 16 + + + CCR3H + High Capture/Compare value (on + TIM2) + 16 + 16 + + + + + CCR4 + CCR4 + capture/compare register 4 + 0x40 + 0x20 + read-write + 0x00000000 + + + CCR4L + Low Capture/Compare value + 0 + 16 + + + CCR4H + High Capture/Compare value (on + TIM2) + 16 + 16 + + + + + DCR + DCR + DMA control register + 0x48 + 0x20 + read-write + 0x0000 + + + DBL + DMA burst length + 8 + 5 + + + DBA + DMA base address + 0 + 5 + + + + + DMAR + DMAR + DMA address for full transfer + 0x4C + 0x20 + read-write + 0x0000 + + + DMAB + DMA register for burst + accesses + 0 + 16 + + + + + + + TIM3 + 0x40000400 + + TIM3 + TIM3 global interrupt + 29 + + + + TIM4 + 0x40000800 + + TIM4 + TIM4 global interrupt + 30 + + + + TIM15 + General purpose timers + TIMs + 0x40014000 + + 0x0 + 0x400 + registers + + + TIM1_BRK_TIM15 + TIM1 Break/TIM15 global + interruts + 24 + + + + CR1 + CR1 + control register 1 + 0x0 + 0x20 + read-write + 0x0000 + + + CEN + Counter enable + 0 + 1 + + + UDIS + Update disable + 1 + 1 + + + URS + Update request source + 2 + 1 + + + OPM + One-pulse mode + 3 + 1 + + + ARPE + Auto-reload preload enable + 7 + 1 + + + CKD + Clock division + 8 + 2 + + + UIFREMAP + UIF status bit remapping + 11 + 1 + + + + + CR2 + CR2 + control register 2 + 0x4 + 0x20 + read-write + 0x0000 + + + CCPC + Capture/compare preloaded + control + 0 + 1 + + + CCUS + Capture/compare control update + selection + 2 + 1 + + + CCDS + Capture/compare DMA + selection + 3 + 1 + + + MMS + Master mode selection + 4 + 3 + + + TI1S + TI1 selection + 7 + 1 + + + OIS1 + Output Idle state 1 + 8 + 1 + + + OIS1N + Output Idle state 1 + 9 + 1 + + + OIS2 + Output Idle state 2 + 10 + 1 + + + + + SMCR + SMCR + slave mode control register + 0x8 + 0x20 + read-write + 0x0000 + + + SMS + Slave mode selection + 0 + 3 + + + TS + Trigger selection + 4 + 3 + + + MSM + Master/Slave mode + 7 + 1 + + + SMS_3 + Slave mode selection bit 3 + 16 + 1 + + + + + DIER + DIER + DMA/Interrupt enable register + 0xC + 0x20 + read-write + 0x0000 + + + UIE + Update interrupt enable + 0 + 1 + + + CC1IE + Capture/Compare 1 interrupt + enable + 1 + 1 + + + CC2IE + Capture/Compare 2 interrupt + enable + 2 + 1 + + + COMIE + COM interrupt enable + 5 + 1 + + + TIE + Trigger interrupt enable + 6 + 1 + + + BIE + Break interrupt enable + 7 + 1 + + + UDE + Update DMA request enable + 8 + 1 + + + CC1DE + Capture/Compare 1 DMA request + enable + 9 + 1 + + + CC2DE + Capture/Compare 2 DMA request + enable + 10 + 1 + + + COMDE + COM DMA request enable + 13 + 1 + + + TDE + Trigger DMA request enable + 14 + 1 + + + + + SR + SR + status register + 0x10 + 0x20 + read-write + 0x0000 + + + CC2OF + Capture/compare 2 overcapture + flag + 10 + 1 + + + CC1OF + Capture/Compare 1 overcapture + flag + 9 + 1 + + + BIF + Break interrupt flag + 7 + 1 + + + TIF + Trigger interrupt flag + 6 + 1 + + + COMIF + COM interrupt flag + 5 + 1 + + + CC2IF + Capture/Compare 2 interrupt + flag + 2 + 1 + + + CC1IF + Capture/compare 1 interrupt + flag + 1 + 1 + + + UIF + Update interrupt flag + 0 + 1 + + + + + EGR + EGR + event generation register + 0x14 + 0x20 + write-only + 0x0000 + + + BG + Break generation + 7 + 1 + + + TG + Trigger generation + 6 + 1 + + + COMG + Capture/Compare control update + generation + 5 + 1 + + + CC2G + Capture/compare 2 + generation + 2 + 1 + + + CC1G + Capture/compare 1 + generation + 1 + 1 + + + UG + Update generation + 0 + 1 + + + + + CCMR1_Output + CCMR1_Output + capture/compare mode register (output + mode) + 0x18 + 0x20 + read-write + 0x00000000 + + + CC1S + Capture/Compare 1 + selection + 0 + 2 + + + OC1FE + Output Compare 1 fast + enable + 2 + 1 + + + OC1PE + Output Compare 1 preload + enable + 3 + 1 + + + OC1M + Output Compare 1 mode + 4 + 3 + + + CC2S + Capture/Compare 2 + selection + 8 + 2 + + + OC2FE + Output Compare 2 fast + enable + 10 + 1 + + + OC2PE + Output Compare 2 preload + enable + 11 + 1 + + + OC2M + Output Compare 2 mode + 12 + 3 + + + OC1M_3 + Output Compare 1 mode bit + 3 + 16 + 1 + + + OC2M_3 + Output Compare 2 mode bit + 3 + 24 + 1 + + + + + CCMR1_Input + CCMR1_Input + capture/compare mode register 1 (input + mode) + CCMR1_Output + 0x18 + 0x20 + read-write + 0x00000000 + + + IC2F + Input capture 2 filter + 12 + 4 + + + IC2PSC + Input capture 2 prescaler + 10 + 2 + + + CC2S + Capture/Compare 2 + selection + 8 + 2 + + + IC1F + Input capture 1 filter + 4 + 4 + + + IC1PSC + Input capture 1 prescaler + 2 + 2 + + + CC1S + Capture/Compare 1 + selection + 0 + 2 + + + + + CCER + CCER + capture/compare enable + register + 0x20 + 0x20 + read-write + 0x0000 + + + CC2NP + Capture/Compare 2 output + Polarity + 7 + 1 + + + CC2P + Capture/Compare 2 output + Polarity + 5 + 1 + + + CC2E + Capture/Compare 2 output + enable + 4 + 1 + + + CC1NP + Capture/Compare 1 output + Polarity + 3 + 1 + + + CC1NE + Capture/Compare 1 complementary output + enable + 2 + 1 + + + CC1P + Capture/Compare 1 output + Polarity + 1 + 1 + + + CC1E + Capture/Compare 1 output + enable + 0 + 1 + + + + + CNT + CNT + counter + 0x24 + 0x20 + 0x00000000 + + + CNT + counter value + 0 + 16 + read-write + + + UIFCPY + UIF copy + 31 + 1 + read-only + + + + + PSC + PSC + prescaler + 0x28 + 0x20 + read-write + 0x0000 + + + PSC + Prescaler value + 0 + 16 + + + + + ARR + ARR + auto-reload register + 0x2C + 0x20 + read-write + 0x00000000 + + + ARR + Auto-reload value + 0 + 16 + + + + + RCR + RCR + repetition counter register + 0x30 + 0x20 + read-write + 0x0000 + + + REP + Repetition counter value + 0 + 8 + + + + + CCR1 + CCR1 + capture/compare register 1 + 0x34 + 0x20 + read-write + 0x00000000 + + + CCR1 + Capture/Compare 1 value + 0 + 16 + + + + + CCR2 + CCR2 + capture/compare register 2 + 0x38 + 0x20 + read-write + 0x00000000 + + + CCR2 + Capture/Compare 2 value + 0 + 16 + + + + + BDTR + BDTR + break and dead-time register + 0x44 + 0x20 + read-write + 0x0000 + + + MOE + Main output enable + 15 + 1 + + + AOE + Automatic output enable + 14 + 1 + + + BKP + Break polarity + 13 + 1 + + + BKE + Break enable + 12 + 1 + + + OSSR + Off-state selection for Run + mode + 11 + 1 + + + OSSI + Off-state selection for Idle + mode + 10 + 1 + + + LOCK + Lock configuration + 8 + 2 + + + DTG + Dead-time generator setup + 0 + 8 + + + BKF + Break filter + 16 + 4 + + + + + DCR + DCR + DMA control register + 0x48 + 0x20 + read-write + 0x0000 + + + DBL + DMA burst length + 8 + 5 + + + DBA + DMA base address + 0 + 5 + + + + + DMAR + DMAR + DMA address for full transfer + 0x4C + 0x20 + read-write + 0x0000 + + + DMAB + DMA register for burst + accesses + 0 + 16 + + + + + + + TIM16 + General-purpose-timers + TIMs + 0x40014400 + + 0x0 + 0x400 + registers + + + TIM1_UP_TIM16 + TIM1 Update/TIM16 global + interrupts + 25 + + + + CR1 + CR1 + control register 1 + 0x0 + 0x20 + read-write + 0x0000 + + + CEN + Counter enable + 0 + 1 + + + UDIS + Update disable + 1 + 1 + + + URS + Update request source + 2 + 1 + + + OPM + One-pulse mode + 3 + 1 + + + ARPE + Auto-reload preload enable + 7 + 1 + + + CKD + Clock division + 8 + 2 + + + UIFREMAP + UIF status bit remapping + 11 + 1 + + + + + CR2 + CR2 + control register 2 + 0x4 + 0x20 + read-write + 0x0000 + + + OIS1N + Output Idle state 1 + 9 + 1 + + + OIS1 + Output Idle state 1 + 8 + 1 + + + CCDS + Capture/compare DMA + selection + 3 + 1 + + + CCUS + Capture/compare control update + selection + 2 + 1 + + + CCPC + Capture/compare preloaded + control + 0 + 1 + + + + + DIER + DIER + DMA/Interrupt enable register + 0xC + 0x20 + read-write + 0x0000 + + + UIE + Update interrupt enable + 0 + 1 + + + CC1IE + Capture/Compare 1 interrupt + enable + 1 + 1 + + + COMIE + COM interrupt enable + 5 + 1 + + + TIE + Trigger interrupt enable + 6 + 1 + + + BIE + Break interrupt enable + 7 + 1 + + + UDE + Update DMA request enable + 8 + 1 + + + CC1DE + Capture/Compare 1 DMA request + enable + 9 + 1 + + + COMDE + COM DMA request enable + 13 + 1 + + + TDE + Trigger DMA request enable + 14 + 1 + + + + + SR + SR + status register + 0x10 + 0x20 + read-write + 0x0000 + + + CC1OF + Capture/Compare 1 overcapture + flag + 9 + 1 + + + BIF + Break interrupt flag + 7 + 1 + + + TIF + Trigger interrupt flag + 6 + 1 + + + COMIF + COM interrupt flag + 5 + 1 + + + CC1IF + Capture/compare 1 interrupt + flag + 1 + 1 + + + UIF + Update interrupt flag + 0 + 1 + + + + + EGR + EGR + event generation register + 0x14 + 0x20 + write-only + 0x0000 + + + BG + Break generation + 7 + 1 + + + TG + Trigger generation + 6 + 1 + + + COMG + Capture/Compare control update + generation + 5 + 1 + + + CC1G + Capture/compare 1 + generation + 1 + 1 + + + UG + Update generation + 0 + 1 + + + + + CCMR1_Output + CCMR1_Output + capture/compare mode register (output + mode) + 0x18 + 0x20 + read-write + 0x00000000 + + + CC1S + Capture/Compare 1 + selection + 0 + 2 + + + OC1FE + Output Compare 1 fast + enable + 2 + 1 + + + OC1PE + Output Compare 1 preload + enable + 3 + 1 + + + OC1M + Output Compare 1 mode + 4 + 3 + + + OC1M_3 + Output Compare 1 mode + 16 + 1 + + + + + CCMR1_Input + CCMR1_Input + capture/compare mode register 1 (input + mode) + CCMR1_Output + 0x18 + 0x20 + read-write + 0x00000000 + + + IC1F + Input capture 1 filter + 4 + 4 + + + IC1PSC + Input capture 1 prescaler + 2 + 2 + + + CC1S + Capture/Compare 1 + selection + 0 + 2 + + + + + CCER + CCER + capture/compare enable + register + 0x20 + 0x20 + read-write + 0x0000 + + + CC1NP + Capture/Compare 1 output + Polarity + 3 + 1 + + + CC1NE + Capture/Compare 1 complementary output + enable + 2 + 1 + + + CC1P + Capture/Compare 1 output + Polarity + 1 + 1 + + + CC1E + Capture/Compare 1 output + enable + 0 + 1 + + + + + CNT + CNT + counter + 0x24 + 0x20 + 0x00000000 + + + CNT + counter value + 0 + 16 + read-write + + + UIFCPY + UIF Copy + 31 + 1 + read-only + + + + + PSC + PSC + prescaler + 0x28 + 0x20 + read-write + 0x0000 + + + PSC + Prescaler value + 0 + 16 + + + + + ARR + ARR + auto-reload register + 0x2C + 0x20 + read-write + 0x00000000 + + + ARR + Auto-reload value + 0 + 16 + + + + + RCR + RCR + repetition counter register + 0x30 + 0x20 + read-write + 0x0000 + + + REP + Repetition counter value + 0 + 8 + + + + + CCR1 + CCR1 + capture/compare register 1 + 0x34 + 0x20 + read-write + 0x00000000 + + + CCR1 + Capture/Compare 1 value + 0 + 16 + + + + + BDTR + BDTR + break and dead-time register + 0x44 + 0x20 + read-write + 0x0000 + + + DTG + Dead-time generator setup + 0 + 8 + + + LOCK + Lock configuration + 8 + 2 + + + OSSI + Off-state selection for Idle + mode + 10 + 1 + + + OSSR + Off-state selection for Run + mode + 11 + 1 + + + BKE + Break enable + 12 + 1 + + + BKP + Break polarity + 13 + 1 + + + AOE + Automatic output enable + 14 + 1 + + + MOE + Main output enable + 15 + 1 + + + BKF + Break filter + 16 + 4 + + + + + DCR + DCR + DMA control register + 0x48 + 0x20 + read-write + 0x0000 + + + DBL + DMA burst length + 8 + 5 + + + DBA + DMA base address + 0 + 5 + + + + + DMAR + DMAR + DMA address for full transfer + 0x4C + 0x20 + read-write + 0x0000 + + + DMAB + DMA register for burst + accesses + 0 + 16 + + + + + OR + OR + option register + 0x50 + 0x20 + read-write + 0x0000 + + + + + TIM17 + General purpose timer + TIMs + 0x40014800 + + 0x0 + 0x400 + registers + + + TIM1_TRG_COM_TIM17 + TIM1 trigger and commutation/TIM17 + interrupts + 26 + + + + CR1 + CR1 + control register 1 + 0x0 + 0x20 + read-write + 0x0000 + + + CEN + Counter enable + 0 + 1 + + + UDIS + Update disable + 1 + 1 + + + URS + Update request source + 2 + 1 + + + OPM + One-pulse mode + 3 + 1 + + + ARPE + Auto-reload preload enable + 7 + 1 + + + CKD + Clock division + 8 + 2 + + + UIFREMAP + UIF status bit remapping + 11 + 1 + + + + + CR2 + CR2 + control register 2 + 0x4 + 0x20 + read-write + 0x0000 + + + OIS1N + Output Idle state 1 + 9 + 1 + + + OIS1 + Output Idle state 1 + 8 + 1 + + + CCDS + Capture/compare DMA + selection + 3 + 1 + + + CCUS + Capture/compare control update + selection + 2 + 1 + + + CCPC + Capture/compare preloaded + control + 0 + 1 + + + + + DIER + DIER + DMA/Interrupt enable register + 0xC + 0x20 + read-write + 0x0000 + + + UIE + Update interrupt enable + 0 + 1 + + + CC1IE + Capture/Compare 1 interrupt + enable + 1 + 1 + + + COMIE + COM interrupt enable + 5 + 1 + + + TIE + Trigger interrupt enable + 6 + 1 + + + BIE + Break interrupt enable + 7 + 1 + + + UDE + Update DMA request enable + 8 + 1 + + + CC1DE + Capture/Compare 1 DMA request + enable + 9 + 1 + + + COMDE + COM DMA request enable + 13 + 1 + + + TDE + Trigger DMA request enable + 14 + 1 + + + + + SR + SR + status register + 0x10 + 0x20 + read-write + 0x0000 + + + CC1OF + Capture/Compare 1 overcapture + flag + 9 + 1 + + + BIF + Break interrupt flag + 7 + 1 + + + TIF + Trigger interrupt flag + 6 + 1 + + + COMIF + COM interrupt flag + 5 + 1 + + + CC1IF + Capture/compare 1 interrupt + flag + 1 + 1 + + + UIF + Update interrupt flag + 0 + 1 + + + + + EGR + EGR + event generation register + 0x14 + 0x20 + write-only + 0x0000 + + + BG + Break generation + 7 + 1 + + + TG + Trigger generation + 6 + 1 + + + COMG + Capture/Compare control update + generation + 5 + 1 + + + CC1G + Capture/compare 1 + generation + 1 + 1 + + + UG + Update generation + 0 + 1 + + + + + CCMR1_Output + CCMR1_Output + capture/compare mode register (output + mode) + 0x18 + 0x20 + read-write + 0x00000000 + + + CC1S + Capture/Compare 1 + selection + 0 + 2 + + + OC1FE + Output Compare 1 fast + enable + 2 + 1 + + + OC1PE + Output Compare 1 preload + enable + 3 + 1 + + + OC1M + Output Compare 1 mode + 4 + 3 + + + OC1M_3 + Output Compare 1 mode + 16 + 1 + + + + + CCMR1_Input + CCMR1_Input + capture/compare mode register 1 (input + mode) + CCMR1_Output + 0x18 + 0x20 + read-write + 0x00000000 + + + IC1F + Input capture 1 filter + 4 + 4 + + + IC1PSC + Input capture 1 prescaler + 2 + 2 + + + CC1S + Capture/Compare 1 + selection + 0 + 2 + + + + + CCER + CCER + capture/compare enable + register + 0x20 + 0x20 + read-write + 0x0000 + + + CC1NP + Capture/Compare 1 output + Polarity + 3 + 1 + + + CC1NE + Capture/Compare 1 complementary output + enable + 2 + 1 + + + CC1P + Capture/Compare 1 output + Polarity + 1 + 1 + + + CC1E + Capture/Compare 1 output + enable + 0 + 1 + + + + + CNT + CNT + counter + 0x24 + 0x20 + 0x00000000 + + + CNT + counter value + 0 + 16 + read-write + + + UIFCPY + UIF Copy + 31 + 1 + read-only + + + + + PSC + PSC + prescaler + 0x28 + 0x20 + read-write + 0x0000 + + + PSC + Prescaler value + 0 + 16 + + + + + ARR + ARR + auto-reload register + 0x2C + 0x20 + read-write + 0x00000000 + + + ARR + Auto-reload value + 0 + 16 + + + + + RCR + RCR + repetition counter register + 0x30 + 0x20 + read-write + 0x0000 + + + REP + Repetition counter value + 0 + 8 + + + + + CCR1 + CCR1 + capture/compare register 1 + 0x34 + 0x20 + read-write + 0x00000000 + + + CCR1 + Capture/Compare 1 value + 0 + 16 + + + + + BDTR + BDTR + break and dead-time register + 0x44 + 0x20 + read-write + 0x0000 + + + DTG + Dead-time generator setup + 0 + 8 + + + LOCK + Lock configuration + 8 + 2 + + + OSSI + Off-state selection for Idle + mode + 10 + 1 + + + OSSR + Off-state selection for Run + mode + 11 + 1 + + + BKE + Break enable + 12 + 1 + + + BKP + Break polarity + 13 + 1 + + + AOE + Automatic output enable + 14 + 1 + + + MOE + Main output enable + 15 + 1 + + + BKF + Break filter + 16 + 4 + + + + + DCR + DCR + DMA control register + 0x48 + 0x20 + read-write + 0x0000 + + + DBL + DMA burst length + 8 + 5 + + + DBA + DMA base address + 0 + 5 + + + + + DMAR + DMAR + DMA address for full transfer + 0x4C + 0x20 + read-write + 0x0000 + + + DMAB + DMA register for burst + accesses + 0 + 16 + + + + + + + USART1 + Universal synchronous asynchronous receiver + transmitter + USART + 0x40013800 + + 0x0 + 0x400 + registers + + + USART1_EXTI25 + USART1 global interrupt and EXTI Line 25 + interrupt + 37 + + + + CR1 + CR1 + Control register 1 + 0x0 + 0x20 + read-write + 0x0000 + + + EOBIE + End of Block interrupt + enable + 27 + 1 + + + RTOIE + Receiver timeout interrupt + enable + 26 + 1 + + + DEAT + Driver Enable assertion + time + 21 + 5 + + + DEDT + Driver Enable deassertion + time + 16 + 5 + + + OVER8 + Oversampling mode + 15 + 1 + + + CMIE + Character match interrupt + enable + 14 + 1 + + + MME + Mute mode enable + 13 + 1 + + + M + Word length + 12 + 1 + + + WAKE + Receiver wakeup method + 11 + 1 + + + PCE + Parity control enable + 10 + 1 + + + PS + Parity selection + 9 + 1 + + + PEIE + PE interrupt enable + 8 + 1 + + + TXEIE + interrupt enable + 7 + 1 + + + TCIE + Transmission complete interrupt + enable + 6 + 1 + + + RXNEIE + RXNE interrupt enable + 5 + 1 + + + IDLEIE + IDLE interrupt enable + 4 + 1 + + + TE + Transmitter enable + 3 + 1 + + + RE + Receiver enable + 2 + 1 + + + UESM + USART enable in Stop mode + 1 + 1 + + + UE + USART enable + 0 + 1 + + + + + CR2 + CR2 + Control register 2 + 0x4 + 0x20 + read-write + 0x0000 + + + ADD4 + Address of the USART node + 28 + 4 + + + ADD0 + Address of the USART node + 24 + 4 + + + RTOEN + Receiver timeout enable + 23 + 1 + + + ABRMOD + Auto baud rate mode + 21 + 2 + + + ABREN + Auto baud rate enable + 20 + 1 + + + MSBFIRST + Most significant bit first + 19 + 1 + + + DATAINV + Binary data inversion + 18 + 1 + + + TXINV + TX pin active level + inversion + 17 + 1 + + + RXINV + RX pin active level + inversion + 16 + 1 + + + SWAP + Swap TX/RX pins + 15 + 1 + + + LINEN + LIN mode enable + 14 + 1 + + + STOP + STOP bits + 12 + 2 + + + CLKEN + Clock enable + 11 + 1 + + + CPOL + Clock polarity + 10 + 1 + + + CPHA + Clock phase + 9 + 1 + + + LBCL + Last bit clock pulse + 8 + 1 + + + LBDIE + LIN break detection interrupt + enable + 6 + 1 + + + LBDL + LIN break detection length + 5 + 1 + + + ADDM7 + 7-bit Address Detection/4-bit Address + Detection + 4 + 1 + + + + + CR3 + CR3 + Control register 3 + 0x8 + 0x20 + read-write + 0x0000 + + + WUFIE + Wakeup from Stop mode interrupt + enable + 22 + 1 + + + WUS + Wakeup from Stop mode interrupt flag + selection + 20 + 2 + + + SCARCNT + Smartcard auto-retry count + 17 + 3 + + + DEP + Driver enable polarity + selection + 15 + 1 + + + DEM + Driver enable mode + 14 + 1 + + + DDRE + DMA Disable on Reception + Error + 13 + 1 + + + OVRDIS + Overrun Disable + 12 + 1 + + + ONEBIT + One sample bit method + enable + 11 + 1 + + + CTSIE + CTS interrupt enable + 10 + 1 + + + CTSE + CTS enable + 9 + 1 + + + RTSE + RTS enable + 8 + 1 + + + DMAT + DMA enable transmitter + 7 + 1 + + + DMAR + DMA enable receiver + 6 + 1 + + + SCEN + Smartcard mode enable + 5 + 1 + + + NACK + Smartcard NACK enable + 4 + 1 + + + HDSEL + Half-duplex selection + 3 + 1 + + + IRLP + IrDA low-power + 2 + 1 + + + IREN + IrDA mode enable + 1 + 1 + + + EIE + Error interrupt enable + 0 + 1 + + + + + BRR + BRR + Baud rate register + 0xC + 0x20 + read-write + 0x0000 + + + DIV_Mantissa + mantissa of USARTDIV + 4 + 12 + + + DIV_Fraction + fraction of USARTDIV + 0 + 4 + + + + + GTPR + GTPR + Guard time and prescaler + register + 0x10 + 0x20 + read-write + 0x0000 + + + GT + Guard time value + 8 + 8 + + + PSC + Prescaler value + 0 + 8 + + + + + RTOR + RTOR + Receiver timeout register + 0x14 + 0x20 + read-write + 0x0000 + + + BLEN + Block Length + 24 + 8 + + + RTO + Receiver timeout value + 0 + 24 + + + + + RQR + RQR + Request register + 0x18 + 0x20 + read-write + 0x0000 + + + TXFRQ + Transmit data flush + request + 4 + 1 + + + RXFRQ + Receive data flush request + 3 + 1 + + + MMRQ + Mute mode request + 2 + 1 + + + SBKRQ + Send break request + 1 + 1 + + + ABRRQ + Auto baud rate request + 0 + 1 + + + + + ISR + ISR + Interrupt & status + register + 0x1C + 0x20 + read-only + 0x00C0 + + + REACK + Receive enable acknowledge + flag + 22 + 1 + + + TEACK + Transmit enable acknowledge + flag + 21 + 1 + + + WUF + Wakeup from Stop mode flag + 20 + 1 + + + RWU + Receiver wakeup from Mute + mode + 19 + 1 + + + SBKF + Send break flag + 18 + 1 + + + CMF + character match flag + 17 + 1 + + + BUSY + Busy flag + 16 + 1 + + + ABRF + Auto baud rate flag + 15 + 1 + + + ABRE + Auto baud rate error + 14 + 1 + + + EOBF + End of block flag + 12 + 1 + + + RTOF + Receiver timeout + 11 + 1 + + + CTS + CTS flag + 10 + 1 + + + CTSIF + CTS interrupt flag + 9 + 1 + + + LBDF + LIN break detection flag + 8 + 1 + + + TXE + Transmit data register + empty + 7 + 1 + + + TC + Transmission complete + 6 + 1 + + + RXNE + Read data register not + empty + 5 + 1 + + + IDLE + Idle line detected + 4 + 1 + + + ORE + Overrun error + 3 + 1 + + + NF + Noise detected flag + 2 + 1 + + + FE + Framing error + 1 + 1 + + + PE + Parity error + 0 + 1 + + + + + ICR + ICR + Interrupt flag clear register + 0x20 + 0x20 + read-write + 0x0000 + + + WUCF + Wakeup from Stop mode clear + flag + 20 + 1 + + + CMCF + Character match clear flag + 17 + 1 + + + EOBCF + End of timeout clear flag + 12 + 1 + + + RTOCF + Receiver timeout clear + flag + 11 + 1 + + + CTSCF + CTS clear flag + 9 + 1 + + + LBDCF + LIN break detection clear + flag + 8 + 1 + + + TCCF + Transmission complete clear + flag + 6 + 1 + + + IDLECF + Idle line detected clear + flag + 4 + 1 + + + ORECF + Overrun error clear flag + 3 + 1 + + + NCF + Noise detected clear flag + 2 + 1 + + + FECF + Framing error clear flag + 1 + 1 + + + PECF + Parity error clear flag + 0 + 1 + + + + + RDR + RDR + Receive data register + 0x24 + 0x20 + read-only + 0x0000 + + + RDR + Receive data value + 0 + 9 + + + + + TDR + TDR + Transmit data register + 0x28 + 0x20 + read-write + 0x0000 + + + TDR + Transmit data value + 0 + 9 + + + + + + + USART2 + 0x40004400 + + + USART3 + 0x40004800 + + + UART4 + 0x40004C00 + + + UART5 + 0x40005000 + + + SPI1 + Serial peripheral interface/Inter-IC + sound + SPI + 0x40013000 + + 0x0 + 0x400 + registers + + + SPI1 + SPI1 global interrupt + 35 + + + + CR1 + CR1 + control register 1 + 0x0 + 0x20 + read-write + 0x00000000 + + + BIDIMODE + Bidirectional data mode + enable + 15 + 1 + + + BIDIOE + Output enable in bidirectional + mode + 14 + 1 + + + CRCEN + Hardware CRC calculation + enable + 13 + 1 + + + CRCNEXT + CRC transfer next + 12 + 1 + + + CRCL + CRC length + 11 + 1 + + + RXONLY + Receive only + 10 + 1 + + + SSM + Software slave management + 9 + 1 + + + SSI + Internal slave select + 8 + 1 + + + LSBFIRST + Frame format + 7 + 1 + + + SPE + SPI enable + 6 + 1 + + + BR + Baud rate control + 3 + 3 + + + MSTR + Master selection + 2 + 1 + + + CPOL + Clock polarity + 1 + 1 + + + CPHA + Clock phase + 0 + 1 + + + + + CR2 + CR2 + control register 2 + 0x4 + 0x20 + read-write + 0x00000700 + + + RXDMAEN + Rx buffer DMA enable + 0 + 1 + + + TXDMAEN + Tx buffer DMA enable + 1 + 1 + + + SSOE + SS output enable + 2 + 1 + + + NSSP + NSS pulse management + 3 + 1 + + + FRF + Frame format + 4 + 1 + + + ERRIE + Error interrupt enable + 5 + 1 + + + RXNEIE + RX buffer not empty interrupt + enable + 6 + 1 + + + TXEIE + Tx buffer empty interrupt + enable + 7 + 1 + + + DS + Data size + 8 + 4 + + + FRXTH + FIFO reception threshold + 12 + 1 + + + LDMA_RX + Last DMA transfer for + reception + 13 + 1 + + + LDMA_TX + Last DMA transfer for + transmission + 14 + 1 + + + + + SR + SR + status register + 0x8 + 0x20 + 0x00000002 + + + RXNE + Receive buffer not empty + 0 + 1 + read-only + + + TXE + Transmit buffer empty + 1 + 1 + read-only + + + CHSIDE + Channel side + 2 + 1 + read-only + + + UDR + Underrun flag + 3 + 1 + read-only + + + CRCERR + CRC error flag + 4 + 1 + read-write + + + MODF + Mode fault + 5 + 1 + read-only + + + OVR + Overrun flag + 6 + 1 + read-only + + + BSY + Busy flag + 7 + 1 + read-only + + + TIFRFE + TI frame format error + 8 + 1 + read-only + + + FRLVL + FIFO reception level + 9 + 2 + read-only + + + FTLVL + FIFO transmission level + 11 + 2 + read-only + + + + + DR + DR + data register + 0xC + 0x20 + read-write + 0x00000000 + + + DR + Data register + 0 + 16 + + + + + CRCPR + CRCPR + CRC polynomial register + 0x10 + 0x20 + read-write + 0x00000007 + + + CRCPOLY + CRC polynomial register + 0 + 16 + + + + + RXCRCR + RXCRCR + RX CRC register + 0x14 + 0x20 + read-only + 0x00000000 + + + RxCRC + Rx CRC register + 0 + 16 + + + + + TXCRCR + TXCRCR + TX CRC register + 0x18 + 0x20 + read-only + 0x00000000 + + + TxCRC + Tx CRC register + 0 + 16 + + + + + I2SCFGR + I2SCFGR + I2S configuration register + 0x1C + 0x20 + read-write + 0x00000000 + + + I2SMOD + I2S mode selection + 11 + 1 + + + I2SE + I2S Enable + 10 + 1 + + + I2SCFG + I2S configuration mode + 8 + 2 + + + PCMSYNC + PCM frame synchronization + 7 + 1 + + + I2SSTD + I2S standard selection + 4 + 2 + + + CKPOL + Steady state clock + polarity + 3 + 1 + + + DATLEN + Data length to be + transferred + 1 + 2 + + + CHLEN + Channel length (number of bits per audio + channel) + 0 + 1 + + + + + I2SPR + I2SPR + I2S prescaler register + 0x20 + 0x20 + read-write + 0x00000010 + + + MCKOE + Master clock output enable + 9 + 1 + + + ODD + Odd factor for the + prescaler + 8 + 1 + + + I2SDIV + I2S Linear prescaler + 0 + 8 + + + + + + + SPI2 + 0x40003800 + + SPI2 + SPI2 global interrupt + 36 + + + + SPI3 + 0x40003C00 + + SPI3 + SPI3 global interrupt + 51 + + + + SPI4 + 0x40013C00 + + + I2S2ext + Serial peripheral interface/Inter-IC + sound + SPI + 0x40003400 + + 0x0 + 0x400 + registers + + + + CR1 + CR1 + control register 1 + 0x0 + 0x20 + read-write + 0x00000000 + + + BIDIMODE + Bidirectional data mode + enable + 15 + 1 + + + BIDIOE + Output enable in bidirectional + mode + 14 + 1 + + + CRCEN + Hardware CRC calculation + enable + 13 + 1 + + + CRCNEXT + CRC transfer next + 12 + 1 + + + CRCL + CRC length + 11 + 1 + + + RXONLY + Receive only + 10 + 1 + + + SSM + Software slave management + 9 + 1 + + + SSI + Internal slave select + 8 + 1 + + + LSBFIRST + Frame format + 7 + 1 + + + SPE + SPI enable + 6 + 1 + + + BR + Baud rate control + 3 + 3 + + + MSTR + Master selection + 2 + 1 + + + CPOL + Clock polarity + 1 + 1 + + + CPHA + Clock phase + 0 + 1 + + + + + CR2 + CR2 + control register 2 + 0x4 + 0x20 + read-write + 0x00000700 + + + RXDMAEN + Rx buffer DMA enable + 0 + 1 + + + TXDMAEN + Tx buffer DMA enable + 1 + 1 + + + SSOE + SS output enable + 2 + 1 + + + NSSP + NSS pulse management + 3 + 1 + + + FRF + Frame format + 4 + 1 + + + ERRIE + Error interrupt enable + 5 + 1 + + + RXNEIE + RX buffer not empty interrupt + enable + 6 + 1 + + + TXEIE + Tx buffer empty interrupt + enable + 7 + 1 + + + DS + Data size + 8 + 4 + + + FRXTH + FIFO reception threshold + 12 + 1 + + + LDMA_RX + Last DMA transfer for + reception + 13 + 1 + + + LDMA_TX + Last DMA transfer for + transmission + 14 + 1 + + + + + SR + SR + status register + 0x8 + 0x20 + 0x00000002 + + + RXNE + Receive buffer not empty + 0 + 1 + read-only + + + TXE + Transmit buffer empty + 1 + 1 + read-only + + + CHSIDE + Channel side + 2 + 1 + read-only + + + UDR + Underrun flag + 3 + 1 + read-only + + + CRCERR + CRC error flag + 4 + 1 + read-write + + + MODF + Mode fault + 5 + 1 + read-only + + + OVR + Overrun flag + 6 + 1 + read-only + + + BSY + Busy flag + 7 + 1 + read-only + + + TIFRFE + TI frame format error + 8 + 1 + read-only + + + FRLVL + FIFO reception level + 9 + 2 + read-only + + + FTLVL + FIFO transmission level + 11 + 2 + read-only + + + + + DR + DR + data register + 0xC + 0x20 + read-write + 0x00000000 + + + DR + Data register + 0 + 16 + + + + + CRCPR + CRCPR + CRC polynomial register + 0x10 + 0x20 + read-write + 0x00000007 + + + CRCPOLY + CRC polynomial register + 0 + 16 + + + + + RXCRCR + RXCRCR + RX CRC register + 0x14 + 0x20 + read-only + 0x00000000 + + + RxCRC + Rx CRC register + 0 + 16 + + + + + TXCRCR + TXCRCR + TX CRC register + 0x18 + 0x20 + read-only + 0x00000000 + + + TxCRC + Tx CRC register + 0 + 16 + + + + + I2SCFGR + I2SCFGR + I2S configuration register + 0x1C + 0x20 + read-write + 0x00000000 + + + I2SMOD + I2S mode selection + 11 + 1 + + + I2SE + I2S Enable + 10 + 1 + + + I2SCFG + I2S configuration mode + 8 + 2 + + + PCMSYNC + PCM frame synchronization + 7 + 1 + + + I2SSTD + I2S standard selection + 4 + 2 + + + CKPOL + Steady state clock + polarity + 3 + 1 + + + DATLEN + Data length to be + transferred + 1 + 2 + + + CHLEN + Channel length (number of bits per audio + channel) + 0 + 1 + + + + + I2SPR + I2SPR + I2S prescaler register + 0x20 + 0x20 + read-write + 0x00000002 + + + MCKOE + Master clock output enable + 9 + 1 + + + ODD + Odd factor for the + prescaler + 8 + 1 + + + I2SDIV + I2S Linear prescaler + 0 + 8 + + + + + + + I2S3ext + 0x40004000 + + + EXTI + External interrupt/event + controller + EXTI + 0x40010400 + + 0x0 + 0x400 + registers + + + TAMP_STAMP + Tamper and TimeStamp interrupts + 2 + + + EXTI0 + EXTI Line0 interrupt + 6 + + + EXTI1 + EXTI Line3 interrupt + 7 + + + EXTI3 + EXTI Line3 interrupt + 9 + + + EXTI4 + EXTI Line4 interrupt + 10 + + + EXTI9_5 + EXTI Line5 to Line9 interrupts + 23 + + + I2C1_EV_EXTI23 + I2C1 event interrupt and EXTI Line23 + interrupt + 31 + + + USART2_EXTI26 + USART2 global interrupt and EXTI Line 26 + interrupt + 38 + + + USART3_EXTI28 + USART3 global interrupt and EXTI Line 28 + interrupt + 39 + + + EXTI15_10 + EXTI Line15 to Line10 interrupts + 40 + + + UART4_EXTI34 + UART4 global and EXTI Line 34 + interrupts + 52 + + + UART5_EXTI35 + UART5 global and EXTI Line 35 + interrupts + 53 + + + USB_WKUP_EXTI + USB wakeup from Suspend and EXTI Line + 18 + 76 + + + + IMR1 + IMR1 + Interrupt mask register + 0x0 + 0x20 + read-write + 0x1F800000 + + + MR0 + Interrupt Mask on line 0 + 0 + 1 + + + MR1 + Interrupt Mask on line 1 + 1 + 1 + + + MR2 + Interrupt Mask on line 2 + 2 + 1 + + + MR3 + Interrupt Mask on line 3 + 3 + 1 + + + MR4 + Interrupt Mask on line 4 + 4 + 1 + + + MR5 + Interrupt Mask on line 5 + 5 + 1 + + + MR6 + Interrupt Mask on line 6 + 6 + 1 + + + MR7 + Interrupt Mask on line 7 + 7 + 1 + + + MR8 + Interrupt Mask on line 8 + 8 + 1 + + + MR9 + Interrupt Mask on line 9 + 9 + 1 + + + MR10 + Interrupt Mask on line 10 + 10 + 1 + + + MR11 + Interrupt Mask on line 11 + 11 + 1 + + + MR12 + Interrupt Mask on line 12 + 12 + 1 + + + MR13 + Interrupt Mask on line 13 + 13 + 1 + + + MR14 + Interrupt Mask on line 14 + 14 + 1 + + + MR15 + Interrupt Mask on line 15 + 15 + 1 + + + MR16 + Interrupt Mask on line 16 + 16 + 1 + + + MR17 + Interrupt Mask on line 17 + 17 + 1 + + + MR18 + Interrupt Mask on line 18 + 18 + 1 + + + MR19 + Interrupt Mask on line 19 + 19 + 1 + + + MR20 + Interrupt Mask on line 20 + 20 + 1 + + + MR21 + Interrupt Mask on line 21 + 21 + 1 + + + MR22 + Interrupt Mask on line 22 + 22 + 1 + + + MR23 + Interrupt Mask on line 23 + 23 + 1 + + + MR24 + Interrupt Mask on line 24 + 24 + 1 + + + MR25 + Interrupt Mask on line 25 + 25 + 1 + + + MR26 + Interrupt Mask on line 26 + 26 + 1 + + + MR27 + Interrupt Mask on line 27 + 27 + 1 + + + MR28 + Interrupt Mask on line 28 + 28 + 1 + + + MR29 + Interrupt Mask on line 29 + 29 + 1 + + + MR30 + Interrupt Mask on line 30 + 30 + 1 + + + MR31 + Interrupt Mask on line 31 + 31 + 1 + + + + + EMR1 + EMR1 + Event mask register + 0x4 + 0x20 + read-write + 0x00000000 + + + MR0 + Event Mask on line 0 + 0 + 1 + + + MR1 + Event Mask on line 1 + 1 + 1 + + + MR2 + Event Mask on line 2 + 2 + 1 + + + MR3 + Event Mask on line 3 + 3 + 1 + + + MR4 + Event Mask on line 4 + 4 + 1 + + + MR5 + Event Mask on line 5 + 5 + 1 + + + MR6 + Event Mask on line 6 + 6 + 1 + + + MR7 + Event Mask on line 7 + 7 + 1 + + + MR8 + Event Mask on line 8 + 8 + 1 + + + MR9 + Event Mask on line 9 + 9 + 1 + + + MR10 + Event Mask on line 10 + 10 + 1 + + + MR11 + Event Mask on line 11 + 11 + 1 + + + MR12 + Event Mask on line 12 + 12 + 1 + + + MR13 + Event Mask on line 13 + 13 + 1 + + + MR14 + Event Mask on line 14 + 14 + 1 + + + MR15 + Event Mask on line 15 + 15 + 1 + + + MR16 + Event Mask on line 16 + 16 + 1 + + + MR17 + Event Mask on line 17 + 17 + 1 + + + MR18 + Event Mask on line 18 + 18 + 1 + + + MR19 + Event Mask on line 19 + 19 + 1 + + + MR20 + Event Mask on line 20 + 20 + 1 + + + MR21 + Event Mask on line 21 + 21 + 1 + + + MR22 + Event Mask on line 22 + 22 + 1 + + + MR23 + Event Mask on line 23 + 23 + 1 + + + MR24 + Event Mask on line 24 + 24 + 1 + + + MR25 + Event Mask on line 25 + 25 + 1 + + + MR26 + Event Mask on line 26 + 26 + 1 + + + MR27 + Event Mask on line 27 + 27 + 1 + + + MR28 + Event Mask on line 28 + 28 + 1 + + + MR29 + Event Mask on line 29 + 29 + 1 + + + MR30 + Event Mask on line 30 + 30 + 1 + + + MR31 + Event Mask on line 31 + 31 + 1 + + + + + RTSR1 + RTSR1 + Rising Trigger selection + register + 0x8 + 0x20 + read-write + 0x00000000 + + + TR0 + Rising trigger event configuration of + line 0 + 0 + 1 + + + TR1 + Rising trigger event configuration of + line 1 + 1 + 1 + + + TR2 + Rising trigger event configuration of + line 2 + 2 + 1 + + + TR3 + Rising trigger event configuration of + line 3 + 3 + 1 + + + TR4 + Rising trigger event configuration of + line 4 + 4 + 1 + + + TR5 + Rising trigger event configuration of + line 5 + 5 + 1 + + + TR6 + Rising trigger event configuration of + line 6 + 6 + 1 + + + TR7 + Rising trigger event configuration of + line 7 + 7 + 1 + + + TR8 + Rising trigger event configuration of + line 8 + 8 + 1 + + + TR9 + Rising trigger event configuration of + line 9 + 9 + 1 + + + TR10 + Rising trigger event configuration of + line 10 + 10 + 1 + + + TR11 + Rising trigger event configuration of + line 11 + 11 + 1 + + + TR12 + Rising trigger event configuration of + line 12 + 12 + 1 + + + TR13 + Rising trigger event configuration of + line 13 + 13 + 1 + + + TR14 + Rising trigger event configuration of + line 14 + 14 + 1 + + + TR15 + Rising trigger event configuration of + line 15 + 15 + 1 + + + TR16 + Rising trigger event configuration of + line 16 + 16 + 1 + + + TR17 + Rising trigger event configuration of + line 17 + 17 + 1 + + + TR18 + Rising trigger event configuration of + line 18 + 18 + 1 + + + TR19 + Rising trigger event configuration of + line 19 + 19 + 1 + + + TR20 + Rising trigger event configuration of + line 20 + 20 + 1 + + + TR21 + Rising trigger event configuration of + line 21 + 21 + 1 + + + TR22 + Rising trigger event configuration of + line 22 + 22 + 1 + + + TR29 + Rising trigger event configuration of + line 29 + 29 + 1 + + + TR30 + Rising trigger event configuration of + line 30 + 30 + 1 + + + TR31 + Rising trigger event configuration of + line 31 + 31 + 1 + + + + + FTSR1 + FTSR1 + Falling Trigger selection + register + 0xC + 0x20 + read-write + 0x00000000 + + + TR0 + Falling trigger event configuration of + line 0 + 0 + 1 + + + TR1 + Falling trigger event configuration of + line 1 + 1 + 1 + + + TR2 + Falling trigger event configuration of + line 2 + 2 + 1 + + + TR3 + Falling trigger event configuration of + line 3 + 3 + 1 + + + TR4 + Falling trigger event configuration of + line 4 + 4 + 1 + + + TR5 + Falling trigger event configuration of + line 5 + 5 + 1 + + + TR6 + Falling trigger event configuration of + line 6 + 6 + 1 + + + TR7 + Falling trigger event configuration of + line 7 + 7 + 1 + + + TR8 + Falling trigger event configuration of + line 8 + 8 + 1 + + + TR9 + Falling trigger event configuration of + line 9 + 9 + 1 + + + TR10 + Falling trigger event configuration of + line 10 + 10 + 1 + + + TR11 + Falling trigger event configuration of + line 11 + 11 + 1 + + + TR12 + Falling trigger event configuration of + line 12 + 12 + 1 + + + TR13 + Falling trigger event configuration of + line 13 + 13 + 1 + + + TR14 + Falling trigger event configuration of + line 14 + 14 + 1 + + + TR15 + Falling trigger event configuration of + line 15 + 15 + 1 + + + TR16 + Falling trigger event configuration of + line 16 + 16 + 1 + + + TR17 + Falling trigger event configuration of + line 17 + 17 + 1 + + + TR18 + Falling trigger event configuration of + line 18 + 18 + 1 + + + TR19 + Falling trigger event configuration of + line 19 + 19 + 1 + + + TR20 + Falling trigger event configuration of + line 20 + 20 + 1 + + + TR21 + Falling trigger event configuration of + line 21 + 21 + 1 + + + TR22 + Falling trigger event configuration of + line 22 + 22 + 1 + + + TR29 + Falling trigger event configuration of + line 29 + 29 + 1 + + + TR30 + Falling trigger event configuration of + line 30. + 30 + 1 + + + TR31 + Falling trigger event configuration of + line 31 + 31 + 1 + + + + + SWIER1 + SWIER1 + Software interrupt event + register + 0x10 + 0x20 + read-write + 0x00000000 + + + SWIER0 + Software Interrupt on line + 0 + 0 + 1 + + + SWIER1 + Software Interrupt on line + 1 + 1 + 1 + + + SWIER2 + Software Interrupt on line + 2 + 2 + 1 + + + SWIER3 + Software Interrupt on line + 3 + 3 + 1 + + + SWIER4 + Software Interrupt on line + 4 + 4 + 1 + + + SWIER5 + Software Interrupt on line + 5 + 5 + 1 + + + SWIER6 + Software Interrupt on line + 6 + 6 + 1 + + + SWIER7 + Software Interrupt on line + 7 + 7 + 1 + + + SWIER8 + Software Interrupt on line + 8 + 8 + 1 + + + SWIER9 + Software Interrupt on line + 9 + 9 + 1 + + + SWIER10 + Software Interrupt on line + 10 + 10 + 1 + + + SWIER11 + Software Interrupt on line + 11 + 11 + 1 + + + SWIER12 + Software Interrupt on line + 12 + 12 + 1 + + + SWIER13 + Software Interrupt on line + 13 + 13 + 1 + + + SWIER14 + Software Interrupt on line + 14 + 14 + 1 + + + SWIER15 + Software Interrupt on line + 15 + 15 + 1 + + + SWIER16 + Software Interrupt on line + 16 + 16 + 1 + + + SWIER17 + Software Interrupt on line + 17 + 17 + 1 + + + SWIER18 + Software Interrupt on line + 18 + 18 + 1 + + + SWIER19 + Software Interrupt on line + 19 + 19 + 1 + + + SWIER20 + Software Interrupt on line + 20 + 20 + 1 + + + SWIER21 + Software Interrupt on line + 21 + 21 + 1 + + + SWIER22 + Software Interrupt on line + 22 + 22 + 1 + + + SWIER29 + Software Interrupt on line + 29 + 29 + 1 + + + SWIER30 + Software Interrupt on line + 309 + 30 + 1 + + + SWIER31 + Software Interrupt on line + 319 + 31 + 1 + + + + + PR1 + PR1 + Pending register + 0x14 + 0x20 + read-write + 0x00000000 + + + PR0 + Pending bit 0 + 0 + 1 + + + PR1 + Pending bit 1 + 1 + 1 + + + PR2 + Pending bit 2 + 2 + 1 + + + PR3 + Pending bit 3 + 3 + 1 + + + PR4 + Pending bit 4 + 4 + 1 + + + PR5 + Pending bit 5 + 5 + 1 + + + PR6 + Pending bit 6 + 6 + 1 + + + PR7 + Pending bit 7 + 7 + 1 + + + PR8 + Pending bit 8 + 8 + 1 + + + PR9 + Pending bit 9 + 9 + 1 + + + PR10 + Pending bit 10 + 10 + 1 + + + PR11 + Pending bit 11 + 11 + 1 + + + PR12 + Pending bit 12 + 12 + 1 + + + PR13 + Pending bit 13 + 13 + 1 + + + PR14 + Pending bit 14 + 14 + 1 + + + PR15 + Pending bit 15 + 15 + 1 + + + PR16 + Pending bit 16 + 16 + 1 + + + PR17 + Pending bit 17 + 17 + 1 + + + PR18 + Pending bit 18 + 18 + 1 + + + PR19 + Pending bit 19 + 19 + 1 + + + PR20 + Pending bit 20 + 20 + 1 + + + PR21 + Pending bit 21 + 21 + 1 + + + PR22 + Pending bit 22 + 22 + 1 + + + PR29 + Pending bit 29 + 29 + 1 + + + PR30 + Pending bit 30 + 30 + 1 + + + PR31 + Pending bit 31 + 31 + 1 + + + + + IMR2 + IMR2 + Interrupt mask register + 0x18 + 0x20 + read-write + 0xFFFFFFFC + + + MR32 + Interrupt Mask on external/internal line + 32 + 0 + 1 + + + MR33 + Interrupt Mask on external/internal line + 33 + 1 + 1 + + + MR34 + Interrupt Mask on external/internal line + 34 + 2 + 1 + + + MR35 + Interrupt Mask on external/internal line + 35 + 3 + 1 + + + + + EMR2 + EMR2 + Event mask register + 0x1C + 0x20 + read-write + 0x00000000 + + + MR32 + Event mask on external/internal line + 32 + 0 + 1 + + + MR33 + Event mask on external/internal line + 33 + 1 + 1 + + + MR34 + Event mask on external/internal line + 34 + 2 + 1 + + + MR35 + Event mask on external/internal line + 35 + 3 + 1 + + + + + RTSR2 + RTSR2 + Rising Trigger selection + register + 0x20 + 0x20 + read-write + 0x00000000 + + + TR32 + Rising trigger event configuration bit + of line 32 + 0 + 1 + + + TR33 + Rising trigger event configuration bit + of line 33 + 1 + 1 + + + + + FTSR2 + FTSR2 + Falling Trigger selection + register + 0x24 + 0x20 + read-write + 0x00000000 + + + TR32 + Falling trigger event configuration bit + of line 32 + 0 + 1 + + + TR33 + Falling trigger event configuration bit + of line 33 + 1 + 1 + + + + + SWIER2 + SWIER2 + Software interrupt event + register + 0x28 + 0x20 + read-write + 0x00000000 + + + SWIER32 + Software interrupt on line + 32 + 0 + 1 + + + SWIER33 + Software interrupt on line + 33 + 1 + 1 + + + + + PR2 + PR2 + Pending register + 0x2C + 0x20 + read-write + 0x00000000 + + + PR32 + Pending bit on line 32 + 0 + 1 + + + PR33 + Pending bit on line 33 + 1 + 1 + + + + + + + PWR + Power control + PWR + 0x40007000 + + 0x0 + 0x400 + registers + + + PVD + PVD through EXTI line detection + interrupt + 1 + + + + CR + CR + power control register + 0x0 + 0x20 + read-write + 0x00000000 + + + LPDS + Low-power deep sleep + 0 + 1 + + + PDDS + Power down deepsleep + 1 + 1 + + + CWUF + Clear wakeup flag + 2 + 1 + + + CSBF + Clear standby flag + 3 + 1 + + + PVDE + Power voltage detector + enable + 4 + 1 + + + PLS + PVD level selection + 5 + 3 + + + DBP + Disable backup domain write + protection + 8 + 1 + + + + + CSR + CSR + power control/status register + 0x4 + 0x20 + 0x00000000 + + + WUF + Wakeup flag + 0 + 1 + read-only + + + SBF + Standby flag + 1 + 1 + read-only + + + PVDO + PVD output + 2 + 1 + read-only + + + EWUP1 + Enable WKUP1 pin + 8 + 1 + read-write + + + EWUP2 + Enable WKUP2 pin + 9 + 1 + read-write + + + + + + + CAN + Controller area network + CAN + 0x40006400 + + 0x0 + 0x400 + registers + + + USB_HP_CAN_TX + USB High Priority/CAN_TX + interrupts + 19 + + + USB_LP_CAN_RX0 + USB Low Priority/CAN_RX0 + interrupts + 20 + + + CAN_RX1 + CAN_RX1 interrupt + 21 + + + CAN_SCE + CAN_SCE interrupt + 22 + + + + MCR + MCR + master control register + 0x0 + 0x20 + read-write + 0x00010002 + + + DBF + DBF + 16 + 1 + + + RESET + RESET + 15 + 1 + + + TTCM + TTCM + 7 + 1 + + + ABOM + ABOM + 6 + 1 + + + AWUM + AWUM + 5 + 1 + + + NART + NART + 4 + 1 + + + RFLM + RFLM + 3 + 1 + + + TXFP + TXFP + 2 + 1 + + + SLEEP + SLEEP + 1 + 1 + + + INRQ + INRQ + 0 + 1 + + + + + MSR + MSR + master status register + 0x4 + 0x20 + 0x00000C02 + + + RX + RX + 11 + 1 + read-only + + + SAMP + SAMP + 10 + 1 + read-only + + + RXM + RXM + 9 + 1 + read-only + + + TXM + TXM + 8 + 1 + read-only + + + SLAKI + SLAKI + 4 + 1 + read-write + + + WKUI + WKUI + 3 + 1 + read-write + + + ERRI + ERRI + 2 + 1 + read-write + + + SLAK + SLAK + 1 + 1 + read-only + + + INAK + INAK + 0 + 1 + read-only + + + + + TSR + TSR + transmit status register + 0x8 + 0x20 + 0x1C000000 + + + LOW2 + Lowest priority flag for mailbox + 2 + 31 + 1 + read-only + + + LOW1 + Lowest priority flag for mailbox + 1 + 30 + 1 + read-only + + + LOW0 + Lowest priority flag for mailbox + 0 + 29 + 1 + read-only + + + TME2 + Lowest priority flag for mailbox + 2 + 28 + 1 + read-only + + + TME1 + Lowest priority flag for mailbox + 1 + 27 + 1 + read-only + + + TME0 + Lowest priority flag for mailbox + 0 + 26 + 1 + read-only + + + CODE + CODE + 24 + 2 + read-only + + + ABRQ2 + ABRQ2 + 23 + 1 + read-write + + + TERR2 + TERR2 + 19 + 1 + read-write + + + ALST2 + ALST2 + 18 + 1 + read-write + + + TXOK2 + TXOK2 + 17 + 1 + read-write + + + RQCP2 + RQCP2 + 16 + 1 + read-write + + + ABRQ1 + ABRQ1 + 15 + 1 + read-write + + + TERR1 + TERR1 + 11 + 1 + read-write + + + ALST1 + ALST1 + 10 + 1 + read-write + + + TXOK1 + TXOK1 + 9 + 1 + read-write + + + RQCP1 + RQCP1 + 8 + 1 + read-write + + + ABRQ0 + ABRQ0 + 7 + 1 + read-write + + + TERR0 + TERR0 + 3 + 1 + read-write + + + ALST0 + ALST0 + 2 + 1 + read-write + + + TXOK0 + TXOK0 + 1 + 1 + read-write + + + RQCP0 + RQCP0 + 0 + 1 + read-write + + + + + RF0R + RF0R + receive FIFO 0 register + 0xC + 0x20 + 0x00000000 + + + RFOM0 + RFOM0 + 5 + 1 + read-write + + + FOVR0 + FOVR0 + 4 + 1 + read-write + + + FULL0 + FULL0 + 3 + 1 + read-write + + + FMP0 + FMP0 + 0 + 2 + read-only + + + + + RF1R + RF1R + receive FIFO 1 register + 0x10 + 0x20 + 0x00000000 + + + RFOM1 + RFOM1 + 5 + 1 + read-write + + + FOVR1 + FOVR1 + 4 + 1 + read-write + + + FULL1 + FULL1 + 3 + 1 + read-write + + + FMP1 + FMP1 + 0 + 2 + read-only + + + + + IER + IER + interrupt enable register + 0x14 + 0x20 + read-write + 0x00000000 + + + SLKIE + SLKIE + 17 + 1 + + + WKUIE + WKUIE + 16 + 1 + + + ERRIE + ERRIE + 15 + 1 + + + LECIE + LECIE + 11 + 1 + + + BOFIE + BOFIE + 10 + 1 + + + EPVIE + EPVIE + 9 + 1 + + + EWGIE + EWGIE + 8 + 1 + + + FOVIE1 + FOVIE1 + 6 + 1 + + + FFIE1 + FFIE1 + 5 + 1 + + + FMPIE1 + FMPIE1 + 4 + 1 + + + FOVIE0 + FOVIE0 + 3 + 1 + + + FFIE0 + FFIE0 + 2 + 1 + + + FMPIE0 + FMPIE0 + 1 + 1 + + + TMEIE + TMEIE + 0 + 1 + + + + + ESR + ESR + error status register + 0x18 + 0x20 + 0x00000000 + + + REC + REC + 24 + 8 + read-only + + + TEC + TEC + 16 + 8 + read-only + + + LEC + LEC + 4 + 3 + read-write + + + BOFF + BOFF + 2 + 1 + read-only + + + EPVF + EPVF + 1 + 1 + read-only + + + EWGF + EWGF + 0 + 1 + read-only + + + + + BTR + BTR + bit timing register + 0x1C + 0x20 + read-write + 0x01230000 + + + SILM + SILM + 31 + 1 + + + LBKM + LBKM + 30 + 1 + + + SJW + SJW + 24 + 2 + + + TS2 + TS2 + 20 + 3 + + + TS1 + TS1 + 16 + 4 + + + BRP + BRP + 0 + 10 + + + + + TI0R + TI0R + TX mailbox identifier register + 0x180 + 0x20 + read-write + 0x00000000 + + + STID + STID + 21 + 11 + + + EXID + EXID + 3 + 18 + + + IDE + IDE + 2 + 1 + + + RTR + RTR + 1 + 1 + + + TXRQ + TXRQ + 0 + 1 + + + + + TDT0R + TDT0R + mailbox data length control and time stamp + register + 0x184 + 0x20 + read-write + 0x00000000 + + + TIME + TIME + 16 + 16 + + + TGT + TGT + 8 + 1 + + + DLC + DLC + 0 + 4 + + + + + TDL0R + TDL0R + mailbox data low register + 0x188 + 0x20 + read-write + 0x00000000 + + + DATA3 + DATA3 + 24 + 8 + + + DATA2 + DATA2 + 16 + 8 + + + DATA1 + DATA1 + 8 + 8 + + + DATA0 + DATA0 + 0 + 8 + + + + + TDH0R + TDH0R + mailbox data high register + 0x18C + 0x20 + read-write + 0x00000000 + + + DATA7 + DATA7 + 24 + 8 + + + DATA6 + DATA6 + 16 + 8 + + + DATA5 + DATA5 + 8 + 8 + + + DATA4 + DATA4 + 0 + 8 + + + + + TI1R + TI1R + TX mailbox identifier register + 0x190 + 0x20 + read-write + 0x00000000 + + + STID + STID + 21 + 11 + + + EXID + EXID + 3 + 18 + + + IDE + IDE + 2 + 1 + + + RTR + RTR + 1 + 1 + + + TXRQ + TXRQ + 0 + 1 + + + + + TDT1R + TDT1R + mailbox data length control and time stamp + register + 0x194 + 0x20 + read-write + 0x00000000 + + + TIME + TIME + 16 + 16 + + + TGT + TGT + 8 + 1 + + + DLC + DLC + 0 + 4 + + + + + TDL1R + TDL1R + mailbox data low register + 0x198 + 0x20 + read-write + 0x00000000 + + + DATA3 + DATA3 + 24 + 8 + + + DATA2 + DATA2 + 16 + 8 + + + DATA1 + DATA1 + 8 + 8 + + + DATA0 + DATA0 + 0 + 8 + + + + + TDH1R + TDH1R + mailbox data high register + 0x19C + 0x20 + read-write + 0x00000000 + + + DATA7 + DATA7 + 24 + 8 + + + DATA6 + DATA6 + 16 + 8 + + + DATA5 + DATA5 + 8 + 8 + + + DATA4 + DATA4 + 0 + 8 + + + + + TI2R + TI2R + TX mailbox identifier register + 0x1A0 + 0x20 + read-write + 0x00000000 + + + STID + STID + 21 + 11 + + + EXID + EXID + 3 + 18 + + + IDE + IDE + 2 + 1 + + + RTR + RTR + 1 + 1 + + + TXRQ + TXRQ + 0 + 1 + + + + + TDT2R + TDT2R + mailbox data length control and time stamp + register + 0x1A4 + 0x20 + read-write + 0x00000000 + + + TIME + TIME + 16 + 16 + + + TGT + TGT + 8 + 1 + + + DLC + DLC + 0 + 4 + + + + + TDL2R + TDL2R + mailbox data low register + 0x1A8 + 0x20 + read-write + 0x00000000 + + + DATA3 + DATA3 + 24 + 8 + + + DATA2 + DATA2 + 16 + 8 + + + DATA1 + DATA1 + 8 + 8 + + + DATA0 + DATA0 + 0 + 8 + + + + + TDH2R + TDH2R + mailbox data high register + 0x1AC + 0x20 + read-write + 0x00000000 + + + DATA7 + DATA7 + 24 + 8 + + + DATA6 + DATA6 + 16 + 8 + + + DATA5 + DATA5 + 8 + 8 + + + DATA4 + DATA4 + 0 + 8 + + + + + RI0R + RI0R + receive FIFO mailbox identifier + register + 0x1B0 + 0x20 + read-only + 0x00000000 + + + STID + STID + 21 + 11 + + + EXID + EXID + 3 + 18 + + + IDE + IDE + 2 + 1 + + + RTR + RTR + 1 + 1 + + + + + RDT0R + RDT0R + receive FIFO mailbox data length control and + time stamp register + 0x1B4 + 0x20 + read-only + 0x00000000 + + + TIME + TIME + 16 + 16 + + + FMI + FMI + 8 + 8 + + + DLC + DLC + 0 + 4 + + + + + RDL0R + RDL0R + receive FIFO mailbox data low + register + 0x1B8 + 0x20 + read-only + 0x00000000 + + + DATA3 + DATA3 + 24 + 8 + + + DATA2 + DATA2 + 16 + 8 + + + DATA1 + DATA1 + 8 + 8 + + + DATA0 + DATA0 + 0 + 8 + + + + + RDH0R + RDH0R + receive FIFO mailbox data high + register + 0x1BC + 0x20 + read-only + 0x00000000 + + + DATA7 + DATA7 + 24 + 8 + + + DATA6 + DATA6 + 16 + 8 + + + DATA5 + DATA5 + 8 + 8 + + + DATA4 + DATA4 + 0 + 8 + + + + + RI1R + RI1R + receive FIFO mailbox identifier + register + 0x1C0 + 0x20 + read-only + 0x00000000 + + + STID + STID + 21 + 11 + + + EXID + EXID + 3 + 18 + + + IDE + IDE + 2 + 1 + + + RTR + RTR + 1 + 1 + + + + + RDT1R + RDT1R + receive FIFO mailbox data length control and + time stamp register + 0x1C4 + 0x20 + read-only + 0x00000000 + + + TIME + TIME + 16 + 16 + + + FMI + FMI + 8 + 8 + + + DLC + DLC + 0 + 4 + + + + + RDL1R + RDL1R + receive FIFO mailbox data low + register + 0x1C8 + 0x20 + read-only + 0x00000000 + + + DATA3 + DATA3 + 24 + 8 + + + DATA2 + DATA2 + 16 + 8 + + + DATA1 + DATA1 + 8 + 8 + + + DATA0 + DATA0 + 0 + 8 + + + + + RDH1R + RDH1R + receive FIFO mailbox data high + register + 0x1CC + 0x20 + read-only + 0x00000000 + + + DATA7 + DATA7 + 24 + 8 + + + DATA6 + DATA6 + 16 + 8 + + + DATA5 + DATA5 + 8 + 8 + + + DATA4 + DATA4 + 0 + 8 + + + + + FMR + FMR + filter master register + 0x200 + 0x20 + read-write + 0x2A1C0E01 + + + CAN2SB + CAN2 start bank + 8 + 6 + + + FINIT + Filter init mode + 0 + 1 + + + + + FM1R + FM1R + filter mode register + 0x204 + 0x20 + read-write + 0x00000000 + + + FBM0 + Filter mode + 0 + 1 + + + FBM1 + Filter mode + 1 + 1 + + + FBM2 + Filter mode + 2 + 1 + + + FBM3 + Filter mode + 3 + 1 + + + FBM4 + Filter mode + 4 + 1 + + + FBM5 + Filter mode + 5 + 1 + + + FBM6 + Filter mode + 6 + 1 + + + FBM7 + Filter mode + 7 + 1 + + + FBM8 + Filter mode + 8 + 1 + + + FBM9 + Filter mode + 9 + 1 + + + FBM10 + Filter mode + 10 + 1 + + + FBM11 + Filter mode + 11 + 1 + + + FBM12 + Filter mode + 12 + 1 + + + FBM13 + Filter mode + 13 + 1 + + + FBM14 + Filter mode + 14 + 1 + + + FBM15 + Filter mode + 15 + 1 + + + FBM16 + Filter mode + 16 + 1 + + + FBM17 + Filter mode + 17 + 1 + + + FBM18 + Filter mode + 18 + 1 + + + FBM19 + Filter mode + 19 + 1 + + + FBM20 + Filter mode + 20 + 1 + + + FBM21 + Filter mode + 21 + 1 + + + FBM22 + Filter mode + 22 + 1 + + + FBM23 + Filter mode + 23 + 1 + + + FBM24 + Filter mode + 24 + 1 + + + FBM25 + Filter mode + 25 + 1 + + + FBM26 + Filter mode + 26 + 1 + + + FBM27 + Filter mode + 27 + 1 + + + + + FS1R + FS1R + filter scale register + 0x20C + 0x20 + read-write + 0x00000000 + + + FSC0 + Filter scale configuration + 0 + 1 + + + FSC1 + Filter scale configuration + 1 + 1 + + + FSC2 + Filter scale configuration + 2 + 1 + + + FSC3 + Filter scale configuration + 3 + 1 + + + FSC4 + Filter scale configuration + 4 + 1 + + + FSC5 + Filter scale configuration + 5 + 1 + + + FSC6 + Filter scale configuration + 6 + 1 + + + FSC7 + Filter scale configuration + 7 + 1 + + + FSC8 + Filter scale configuration + 8 + 1 + + + FSC9 + Filter scale configuration + 9 + 1 + + + FSC10 + Filter scale configuration + 10 + 1 + + + FSC11 + Filter scale configuration + 11 + 1 + + + FSC12 + Filter scale configuration + 12 + 1 + + + FSC13 + Filter scale configuration + 13 + 1 + + + FSC14 + Filter scale configuration + 14 + 1 + + + FSC15 + Filter scale configuration + 15 + 1 + + + FSC16 + Filter scale configuration + 16 + 1 + + + FSC17 + Filter scale configuration + 17 + 1 + + + FSC18 + Filter scale configuration + 18 + 1 + + + FSC19 + Filter scale configuration + 19 + 1 + + + FSC20 + Filter scale configuration + 20 + 1 + + + FSC21 + Filter scale configuration + 21 + 1 + + + FSC22 + Filter scale configuration + 22 + 1 + + + FSC23 + Filter scale configuration + 23 + 1 + + + FSC24 + Filter scale configuration + 24 + 1 + + + FSC25 + Filter scale configuration + 25 + 1 + + + FSC26 + Filter scale configuration + 26 + 1 + + + FSC27 + Filter scale configuration + 27 + 1 + + + + + FFA1R + FFA1R + filter FIFO assignment + register + 0x214 + 0x20 + read-write + 0x00000000 + + + FFA0 + Filter FIFO assignment for filter + 0 + 0 + 1 + + + FFA1 + Filter FIFO assignment for filter + 1 + 1 + 1 + + + FFA2 + Filter FIFO assignment for filter + 2 + 2 + 1 + + + FFA3 + Filter FIFO assignment for filter + 3 + 3 + 1 + + + FFA4 + Filter FIFO assignment for filter + 4 + 4 + 1 + + + FFA5 + Filter FIFO assignment for filter + 5 + 5 + 1 + + + FFA6 + Filter FIFO assignment for filter + 6 + 6 + 1 + + + FFA7 + Filter FIFO assignment for filter + 7 + 7 + 1 + + + FFA8 + Filter FIFO assignment for filter + 8 + 8 + 1 + + + FFA9 + Filter FIFO assignment for filter + 9 + 9 + 1 + + + FFA10 + Filter FIFO assignment for filter + 10 + 10 + 1 + + + FFA11 + Filter FIFO assignment for filter + 11 + 11 + 1 + + + FFA12 + Filter FIFO assignment for filter + 12 + 12 + 1 + + + FFA13 + Filter FIFO assignment for filter + 13 + 13 + 1 + + + FFA14 + Filter FIFO assignment for filter + 14 + 14 + 1 + + + FFA15 + Filter FIFO assignment for filter + 15 + 15 + 1 + + + FFA16 + Filter FIFO assignment for filter + 16 + 16 + 1 + + + FFA17 + Filter FIFO assignment for filter + 17 + 17 + 1 + + + FFA18 + Filter FIFO assignment for filter + 18 + 18 + 1 + + + FFA19 + Filter FIFO assignment for filter + 19 + 19 + 1 + + + FFA20 + Filter FIFO assignment for filter + 20 + 20 + 1 + + + FFA21 + Filter FIFO assignment for filter + 21 + 21 + 1 + + + FFA22 + Filter FIFO assignment for filter + 22 + 22 + 1 + + + FFA23 + Filter FIFO assignment for filter + 23 + 23 + 1 + + + FFA24 + Filter FIFO assignment for filter + 24 + 24 + 1 + + + FFA25 + Filter FIFO assignment for filter + 25 + 25 + 1 + + + FFA26 + Filter FIFO assignment for filter + 26 + 26 + 1 + + + FFA27 + Filter FIFO assignment for filter + 27 + 27 + 1 + + + + + FA1R + FA1R + CAN filter activation register + 0x21C + 0x20 + read-write + 0x00000000 + + + FACT0 + Filter active + 0 + 1 + + + FACT1 + Filter active + 1 + 1 + + + FACT2 + Filter active + 2 + 1 + + + FACT3 + Filter active + 3 + 1 + + + FACT4 + Filter active + 4 + 1 + + + FACT5 + Filter active + 5 + 1 + + + FACT6 + Filter active + 6 + 1 + + + FACT7 + Filter active + 7 + 1 + + + FACT8 + Filter active + 8 + 1 + + + FACT9 + Filter active + 9 + 1 + + + FACT10 + Filter active + 10 + 1 + + + FACT11 + Filter active + 11 + 1 + + + FACT12 + Filter active + 12 + 1 + + + FACT13 + Filter active + 13 + 1 + + + FACT14 + Filter active + 14 + 1 + + + FACT15 + Filter active + 15 + 1 + + + FACT16 + Filter active + 16 + 1 + + + FACT17 + Filter active + 17 + 1 + + + FACT18 + Filter active + 18 + 1 + + + FACT19 + Filter active + 19 + 1 + + + FACT20 + Filter active + 20 + 1 + + + FACT21 + Filter active + 21 + 1 + + + FACT22 + Filter active + 22 + 1 + + + FACT23 + Filter active + 23 + 1 + + + FACT24 + Filter active + 24 + 1 + + + FACT25 + Filter active + 25 + 1 + + + FACT26 + Filter active + 26 + 1 + + + FACT27 + Filter active + 27 + 1 + + + + + F0R1 + F0R1 + Filter bank 0 register 1 + 0x240 + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F0R2 + F0R2 + Filter bank 0 register 2 + 0x244 + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F1R1 + F1R1 + Filter bank 1 register 1 + 0x248 + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F1R2 + F1R2 + Filter bank 1 register 2 + 0x24C + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F2R1 + F2R1 + Filter bank 2 register 1 + 0x250 + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F2R2 + F2R2 + Filter bank 2 register 2 + 0x254 + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F3R1 + F3R1 + Filter bank 3 register 1 + 0x258 + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F3R2 + F3R2 + Filter bank 3 register 2 + 0x25C + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F4R1 + F4R1 + Filter bank 4 register 1 + 0x260 + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F4R2 + F4R2 + Filter bank 4 register 2 + 0x264 + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F5R1 + F5R1 + Filter bank 5 register 1 + 0x268 + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F5R2 + F5R2 + Filter bank 5 register 2 + 0x26C + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F6R1 + F6R1 + Filter bank 6 register 1 + 0x270 + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F6R2 + F6R2 + Filter bank 6 register 2 + 0x274 + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F7R1 + F7R1 + Filter bank 7 register 1 + 0x278 + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F7R2 + F7R2 + Filter bank 7 register 2 + 0x27C + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F8R1 + F8R1 + Filter bank 8 register 1 + 0x280 + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F8R2 + F8R2 + Filter bank 8 register 2 + 0x284 + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F9R1 + F9R1 + Filter bank 9 register 1 + 0x288 + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F9R2 + F9R2 + Filter bank 9 register 2 + 0x28C + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F10R1 + F10R1 + Filter bank 10 register 1 + 0x290 + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F10R2 + F10R2 + Filter bank 10 register 2 + 0x294 + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F11R1 + F11R1 + Filter bank 11 register 1 + 0x298 + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F11R2 + F11R2 + Filter bank 11 register 2 + 0x29C + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F12R1 + F12R1 + Filter bank 4 register 1 + 0x2A0 + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F12R2 + F12R2 + Filter bank 12 register 2 + 0x2A4 + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F13R1 + F13R1 + Filter bank 13 register 1 + 0x2A8 + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F13R2 + F13R2 + Filter bank 13 register 2 + 0x2AC + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F14R1 + F14R1 + Filter bank 14 register 1 + 0x2B0 + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F14R2 + F14R2 + Filter bank 14 register 2 + 0x2B4 + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F15R1 + F15R1 + Filter bank 15 register 1 + 0x2B8 + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F15R2 + F15R2 + Filter bank 15 register 2 + 0x2BC + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F16R1 + F16R1 + Filter bank 16 register 1 + 0x2C0 + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F16R2 + F16R2 + Filter bank 16 register 2 + 0x2C4 + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F17R1 + F17R1 + Filter bank 17 register 1 + 0x2C8 + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F17R2 + F17R2 + Filter bank 17 register 2 + 0x2CC + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F18R1 + F18R1 + Filter bank 18 register 1 + 0x2D0 + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F18R2 + F18R2 + Filter bank 18 register 2 + 0x2D4 + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F19R1 + F19R1 + Filter bank 19 register 1 + 0x2D8 + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F19R2 + F19R2 + Filter bank 19 register 2 + 0x2DC + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F20R1 + F20R1 + Filter bank 20 register 1 + 0x2E0 + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F20R2 + F20R2 + Filter bank 20 register 2 + 0x2E4 + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F21R1 + F21R1 + Filter bank 21 register 1 + 0x2E8 + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F21R2 + F21R2 + Filter bank 21 register 2 + 0x2EC + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F22R1 + F22R1 + Filter bank 22 register 1 + 0x2F0 + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F22R2 + F22R2 + Filter bank 22 register 2 + 0x2F4 + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F23R1 + F23R1 + Filter bank 23 register 1 + 0x2F8 + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F23R2 + F23R2 + Filter bank 23 register 2 + 0x2FC + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F24R1 + F24R1 + Filter bank 24 register 1 + 0x300 + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F24R2 + F24R2 + Filter bank 24 register 2 + 0x304 + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F25R1 + F25R1 + Filter bank 25 register 1 + 0x308 + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F25R2 + F25R2 + Filter bank 25 register 2 + 0x30C + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F26R1 + F26R1 + Filter bank 26 register 1 + 0x310 + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F26R2 + F26R2 + Filter bank 26 register 2 + 0x314 + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F27R1 + F27R1 + Filter bank 27 register 1 + 0x318 + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + F27R2 + F27R2 + Filter bank 27 register 2 + 0x31C + 0x20 + read-write + 0x00000000 + + + FB0 + Filter bits + 0 + 1 + + + FB1 + Filter bits + 1 + 1 + + + FB2 + Filter bits + 2 + 1 + + + FB3 + Filter bits + 3 + 1 + + + FB4 + Filter bits + 4 + 1 + + + FB5 + Filter bits + 5 + 1 + + + FB6 + Filter bits + 6 + 1 + + + FB7 + Filter bits + 7 + 1 + + + FB8 + Filter bits + 8 + 1 + + + FB9 + Filter bits + 9 + 1 + + + FB10 + Filter bits + 10 + 1 + + + FB11 + Filter bits + 11 + 1 + + + FB12 + Filter bits + 12 + 1 + + + FB13 + Filter bits + 13 + 1 + + + FB14 + Filter bits + 14 + 1 + + + FB15 + Filter bits + 15 + 1 + + + FB16 + Filter bits + 16 + 1 + + + FB17 + Filter bits + 17 + 1 + + + FB18 + Filter bits + 18 + 1 + + + FB19 + Filter bits + 19 + 1 + + + FB20 + Filter bits + 20 + 1 + + + FB21 + Filter bits + 21 + 1 + + + FB22 + Filter bits + 22 + 1 + + + FB23 + Filter bits + 23 + 1 + + + FB24 + Filter bits + 24 + 1 + + + FB25 + Filter bits + 25 + 1 + + + FB26 + Filter bits + 26 + 1 + + + FB27 + Filter bits + 27 + 1 + + + FB28 + Filter bits + 28 + 1 + + + FB29 + Filter bits + 29 + 1 + + + FB30 + Filter bits + 30 + 1 + + + FB31 + Filter bits + 31 + 1 + + + + + + + USB_FS + Universal serial bus full-speed device + interface + USB_FS + 0x40005C00 + + 0x0 + 0x400 + registers + + + USB_WKUP + USB wakeup from Suspend + 42 + + + USB_HP + USB High priority interrupt + 74 + + + USB_LP + USB Low priority interrupt + 75 + + + + USB_EP0R + USB_EP0R + endpoint 0 register + 0x0 + 0x20 + 0x00000000 + + + EA + Endpoint address + 0 + 4 + read-write + + + STAT_TX + Status bits, for transmission + transfers + 4 + 2 + read-write + + + DTOG_TX + Data Toggle, for transmission + transfers + 6 + 1 + read-write + + + CTR_TX + Correct Transfer for + transmission + 7 + 1 + read-write + + + EP_KIND + Endpoint kind + 8 + 1 + read-write + + + EP_TYPE + Endpoint type + 9 + 2 + read-write + + + SETUP + Setup transaction + completed + 11 + 1 + read-only + + + STAT_RX + Status bits, for reception + transfers + 12 + 2 + read-write + + + DTOG_RX + Data Toggle, for reception + transfers + 14 + 1 + read-write + + + CTR_RX + Correct transfer for + reception + 15 + 1 + read-write + + + + + USB_EP1R + USB_EP1R + endpoint 1 register + 0x4 + 0x20 + 0x00000000 + + + EA + Endpoint address + 0 + 4 + read-write + + + STAT_TX + Status bits, for transmission + transfers + 4 + 2 + read-write + + + DTOG_TX + Data Toggle, for transmission + transfers + 6 + 1 + read-write + + + CTR_TX + Correct Transfer for + transmission + 7 + 1 + read-write + + + EP_KIND + Endpoint kind + 8 + 1 + read-write + + + EP_TYPE + Endpoint type + 9 + 2 + read-write + + + SETUP + Setup transaction + completed + 11 + 1 + read-only + + + STAT_RX + Status bits, for reception + transfers + 12 + 2 + read-write + + + DTOG_RX + Data Toggle, for reception + transfers + 14 + 1 + read-write + + + CTR_RX + Correct transfer for + reception + 15 + 1 + read-write + + + + + USB_EP2R + USB_EP2R + endpoint 2 register + 0x8 + 0x20 + 0x00000000 + + + EA + Endpoint address + 0 + 4 + read-write + + + STAT_TX + Status bits, for transmission + transfers + 4 + 2 + read-write + + + DTOG_TX + Data Toggle, for transmission + transfers + 6 + 1 + read-write + + + CTR_TX + Correct Transfer for + transmission + 7 + 1 + read-write + + + EP_KIND + Endpoint kind + 8 + 1 + read-write + + + EP_TYPE + Endpoint type + 9 + 2 + read-write + + + SETUP + Setup transaction + completed + 11 + 1 + read-only + + + STAT_RX + Status bits, for reception + transfers + 12 + 2 + read-write + + + DTOG_RX + Data Toggle, for reception + transfers + 14 + 1 + read-write + + + CTR_RX + Correct transfer for + reception + 15 + 1 + read-write + + + + + USB_EP3R + USB_EP3R + endpoint 3 register + 0xC + 0x20 + 0x00000000 + + + EA + Endpoint address + 0 + 4 + read-write + + + STAT_TX + Status bits, for transmission + transfers + 4 + 2 + read-write + + + DTOG_TX + Data Toggle, for transmission + transfers + 6 + 1 + read-write + + + CTR_TX + Correct Transfer for + transmission + 7 + 1 + read-write + + + EP_KIND + Endpoint kind + 8 + 1 + read-write + + + EP_TYPE + Endpoint type + 9 + 2 + read-write + + + SETUP + Setup transaction + completed + 11 + 1 + read-only + + + STAT_RX + Status bits, for reception + transfers + 12 + 2 + read-write + + + DTOG_RX + Data Toggle, for reception + transfers + 14 + 1 + read-write + + + CTR_RX + Correct transfer for + reception + 15 + 1 + read-write + + + + + USB_EP4R + USB_EP4R + endpoint 4 register + 0x10 + 0x20 + 0x00000000 + + + EA + Endpoint address + 0 + 4 + read-write + + + STAT_TX + Status bits, for transmission + transfers + 4 + 2 + read-write + + + DTOG_TX + Data Toggle, for transmission + transfers + 6 + 1 + read-write + + + CTR_TX + Correct Transfer for + transmission + 7 + 1 + read-write + + + EP_KIND + Endpoint kind + 8 + 1 + read-write + + + EP_TYPE + Endpoint type + 9 + 2 + read-write + + + SETUP + Setup transaction + completed + 11 + 1 + read-only + + + STAT_RX + Status bits, for reception + transfers + 12 + 2 + read-write + + + DTOG_RX + Data Toggle, for reception + transfers + 14 + 1 + read-write + + + CTR_RX + Correct transfer for + reception + 15 + 1 + read-write + + + + + USB_EP5R + USB_EP5R + endpoint 5 register + 0x14 + 0x20 + 0x00000000 + + + EA + Endpoint address + 0 + 4 + read-write + + + STAT_TX + Status bits, for transmission + transfers + 4 + 2 + read-write + + + DTOG_TX + Data Toggle, for transmission + transfers + 6 + 1 + read-write + + + CTR_TX + Correct Transfer for + transmission + 7 + 1 + read-write + + + EP_KIND + Endpoint kind + 8 + 1 + read-write + + + EP_TYPE + Endpoint type + 9 + 2 + read-write + + + SETUP + Setup transaction + completed + 11 + 1 + read-only + + + STAT_RX + Status bits, for reception + transfers + 12 + 2 + read-write + + + DTOG_RX + Data Toggle, for reception + transfers + 14 + 1 + read-write + + + CTR_RX + Correct transfer for + reception + 15 + 1 + read-write + + + + + USB_EP6R + USB_EP6R + endpoint 6 register + 0x18 + 0x20 + 0x00000000 + + + EA + Endpoint address + 0 + 4 + read-write + + + STAT_TX + Status bits, for transmission + transfers + 4 + 2 + read-write + + + DTOG_TX + Data Toggle, for transmission + transfers + 6 + 1 + read-write + + + CTR_TX + Correct Transfer for + transmission + 7 + 1 + read-write + + + EP_KIND + Endpoint kind + 8 + 1 + read-write + + + EP_TYPE + Endpoint type + 9 + 2 + read-write + + + SETUP + Setup transaction + completed + 11 + 1 + read-only + + + STAT_RX + Status bits, for reception + transfers + 12 + 2 + read-write + + + DTOG_RX + Data Toggle, for reception + transfers + 14 + 1 + read-write + + + CTR_RX + Correct transfer for + reception + 15 + 1 + read-write + + + + + USB_EP7R + USB_EP7R + endpoint 7 register + 0x1C + 0x20 + 0x00000000 + + + EA + Endpoint address + 0 + 4 + read-write + + + STAT_TX + Status bits, for transmission + transfers + 4 + 2 + read-write + + + DTOG_TX + Data Toggle, for transmission + transfers + 6 + 1 + read-write + + + CTR_TX + Correct Transfer for + transmission + 7 + 1 + read-write + + + EP_KIND + Endpoint kind + 8 + 1 + read-write + + + EP_TYPE + Endpoint type + 9 + 2 + read-write + + + SETUP + Setup transaction + completed + 11 + 1 + read-only + + + STAT_RX + Status bits, for reception + transfers + 12 + 2 + read-write + + + DTOG_RX + Data Toggle, for reception + transfers + 14 + 1 + read-write + + + CTR_RX + Correct transfer for + reception + 15 + 1 + read-write + + + + + USB_CNTR + USB_CNTR + control register + 0x40 + 0x20 + read-write + 0x00000003 + + + FRES + Force USB Reset + 0 + 1 + + + PDWN + Power down + 1 + 1 + + + LPMODE + Low-power mode + 2 + 1 + + + FSUSP + Force suspend + 3 + 1 + + + RESUME + Resume request + 4 + 1 + + + ESOFM + Expected start of frame interrupt + mask + 8 + 1 + + + SOFM + Start of frame interrupt + mask + 9 + 1 + + + RESETM + USB reset interrupt mask + 10 + 1 + + + SUSPM + Suspend mode interrupt + mask + 11 + 1 + + + WKUPM + Wakeup interrupt mask + 12 + 1 + + + ERRM + Error interrupt mask + 13 + 1 + + + PMAOVRM + Packet memory area over / underrun + interrupt mask + 14 + 1 + + + CTRM + Correct transfer interrupt + mask + 15 + 1 + + + + + ISTR + ISTR + interrupt status register + 0x44 + 0x20 + 0x00000000 + + + EP_ID + Endpoint Identifier + 0 + 4 + read-only + + + DIR + Direction of transaction + 4 + 1 + read-only + + + ESOF + Expected start frame + 8 + 1 + read-write + + + SOF + start of frame + 9 + 1 + read-write + + + RESET + reset request + 10 + 1 + read-write + + + SUSP + Suspend mode request + 11 + 1 + read-write + + + WKUP + Wakeup + 12 + 1 + read-write + + + ERR + Error + 13 + 1 + read-write + + + PMAOVR + Packet memory area over / + underrun + 14 + 1 + read-write + + + CTR + Correct transfer + 15 + 1 + read-only + + + + + FNR + FNR + frame number register + 0x48 + 0x20 + read-only + 0x0000 + + + FN + Frame number + 0 + 11 + + + LSOF + Lost SOF + 11 + 2 + + + LCK + Locked + 13 + 1 + + + RXDM + Receive data - line status + 14 + 1 + + + RXDP + Receive data + line status + 15 + 1 + + + + + DADDR + DADDR + device address + 0x4C + 0x20 + read-write + 0x0000 + + + ADD + Device address + 0 + 1 + + + ADD1 + Device address + 1 + 1 + + + ADD2 + Device address + 2 + 1 + + + ADD3 + Device address + 3 + 1 + + + ADD4 + Device address + 4 + 1 + + + ADD5 + Device address + 5 + 1 + + + ADD6 + Device address + 6 + 1 + + + EF + Enable function + 7 + 1 + + + + + BTABLE + BTABLE + Buffer table address + 0x50 + 0x20 + read-write + 0x0000 + + + BTABLE + Buffer table + 3 + 13 + + + + + + + I2C1 + Inter-integrated circuit + I2C + 0x40005400 + + 0x0 + 0x400 + registers + + + I2C1_ER + I2C1 error interrupt + 32 + + + + CR1 + CR1 + Control register 1 + 0x0 + 0x20 + 0x00000000 + + + PE + Peripheral enable + 0 + 1 + read-write + + + TXIE + TX Interrupt enable + 1 + 1 + read-write + + + RXIE + RX Interrupt enable + 2 + 1 + read-write + + + ADDRIE + Address match interrupt enable (slave + only) + 3 + 1 + read-write + + + NACKIE + Not acknowledge received interrupt + enable + 4 + 1 + read-write + + + STOPIE + STOP detection Interrupt + enable + 5 + 1 + read-write + + + TCIE + Transfer Complete interrupt + enable + 6 + 1 + read-write + + + ERRIE + Error interrupts enable + 7 + 1 + read-write + + + DNF + Digital noise filter + 8 + 4 + read-write + + + ANFOFF + Analog noise filter OFF + 12 + 1 + read-write + + + SWRST + Software reset + 13 + 1 + write-only + + + TXDMAEN + DMA transmission requests + enable + 14 + 1 + read-write + + + RXDMAEN + DMA reception requests + enable + 15 + 1 + read-write + + + SBC + Slave byte control + 16 + 1 + read-write + + + NOSTRETCH + Clock stretching disable + 17 + 1 + read-write + + + WUPEN + Wakeup from STOP enable + 18 + 1 + read-write + + + GCEN + General call enable + 19 + 1 + read-write + + + SMBHEN + SMBus Host address enable + 20 + 1 + read-write + + + SMBDEN + SMBus Device Default address + enable + 21 + 1 + read-write + + + ALERTEN + SMBUS alert enable + 22 + 1 + read-write + + + PECEN + PEC enable + 23 + 1 + read-write + + + + + CR2 + CR2 + Control register 2 + 0x4 + 0x20 + read-write + 0x00000000 + + + PECBYTE + Packet error checking byte + 26 + 1 + + + AUTOEND + Automatic end mode (master + mode) + 25 + 1 + + + RELOAD + NBYTES reload mode + 24 + 1 + + + NBYTES + Number of bytes + 16 + 8 + + + NACK + NACK generation (slave + mode) + 15 + 1 + + + STOP + Stop generation (master + mode) + 14 + 1 + + + START + Start generation + 13 + 1 + + + HEAD10R + 10-bit address header only read + direction (master receiver mode) + 12 + 1 + + + ADD10 + 10-bit addressing mode (master + mode) + 11 + 1 + + + RD_WRN + Transfer direction (master + mode) + 10 + 1 + + + SADD8 + Slave address bit 9:8 (master + mode) + 8 + 2 + + + SADD1 + Slave address bit 7:1 (master + mode) + 1 + 7 + + + SADD0 + Slave address bit 0 (master + mode) + 0 + 1 + + + + + OAR1 + OAR1 + Own address register 1 + 0x8 + 0x20 + read-write + 0x00000000 + + + OA1_0 + Interface address + 0 + 1 + + + OA1_1 + Interface address + 1 + 7 + + + OA1_8 + Interface address + 8 + 2 + + + OA1MODE + Own Address 1 10-bit mode + 10 + 1 + + + OA1EN + Own Address 1 enable + 15 + 1 + + + + + OAR2 + OAR2 + Own address register 2 + 0xC + 0x20 + read-write + 0x00000000 + + + OA2 + Interface address + 1 + 7 + + + OA2MSK + Own Address 2 masks + 8 + 3 + + + OA2EN + Own Address 2 enable + 15 + 1 + + + + + TIMINGR + TIMINGR + Timing register + 0x10 + 0x20 + read-write + 0x00000000 + + + SCLL + SCL low period (master + mode) + 0 + 8 + + + SCLH + SCL high period (master + mode) + 8 + 8 + + + SDADEL + Data hold time + 16 + 4 + + + SCLDEL + Data setup time + 20 + 4 + + + PRESC + Timing prescaler + 28 + 4 + + + + + TIMEOUTR + TIMEOUTR + Status register 1 + 0x14 + 0x20 + read-write + 0x00000000 + + + TIMEOUTA + Bus timeout A + 0 + 12 + + + TIDLE + Idle clock timeout + detection + 12 + 1 + + + TIMOUTEN + Clock timeout enable + 15 + 1 + + + TIMEOUTB + Bus timeout B + 16 + 12 + + + TEXTEN + Extended clock timeout + enable + 31 + 1 + + + + + ISR + ISR + Interrupt and Status register + 0x18 + 0x20 + 0x00000001 + + + ADDCODE + Address match code (Slave + mode) + 17 + 7 + read-only + + + DIR + Transfer direction (Slave + mode) + 16 + 1 + read-only + + + BUSY + Bus busy + 15 + 1 + read-only + + + ALERT + SMBus alert + 13 + 1 + read-only + + + TIMEOUT + Timeout or t_low detection + flag + 12 + 1 + read-only + + + PECERR + PEC Error in reception + 11 + 1 + read-only + + + OVR + Overrun/Underrun (slave + mode) + 10 + 1 + read-only + + + ARLO + Arbitration lost + 9 + 1 + read-only + + + BERR + Bus error + 8 + 1 + read-only + + + TCR + Transfer Complete Reload + 7 + 1 + read-only + + + TC + Transfer Complete (master + mode) + 6 + 1 + read-only + + + STOPF + Stop detection flag + 5 + 1 + read-only + + + NACKF + Not acknowledge received + flag + 4 + 1 + read-only + + + ADDR + Address matched (slave + mode) + 3 + 1 + read-only + + + RXNE + Receive data register not empty + (receivers) + 2 + 1 + read-only + + + TXIS + Transmit interrupt status + (transmitters) + 1 + 1 + read-write + + + TXE + Transmit data register empty + (transmitters) + 0 + 1 + read-write + + + + + ICR + ICR + Interrupt clear register + 0x1C + 0x20 + write-only + 0x00000000 + + + ALERTCF + Alert flag clear + 13 + 1 + + + TIMOUTCF + Timeout detection flag + clear + 12 + 1 + + + PECCF + PEC Error flag clear + 11 + 1 + + + OVRCF + Overrun/Underrun flag + clear + 10 + 1 + + + ARLOCF + Arbitration lost flag + clear + 9 + 1 + + + BERRCF + Bus error flag clear + 8 + 1 + + + STOPCF + Stop detection flag clear + 5 + 1 + + + NACKCF + Not Acknowledge flag clear + 4 + 1 + + + ADDRCF + Address Matched flag clear + 3 + 1 + + + + + PECR + PECR + PEC register + 0x20 + 0x20 + read-only + 0x00000000 + + + PEC + Packet error checking + register + 0 + 8 + + + + + RXDR + RXDR + Receive data register + 0x24 + 0x20 + read-only + 0x00000000 + + + RXDATA + 8-bit receive data + 0 + 8 + + + + + TXDR + TXDR + Transmit data register + 0x28 + 0x20 + read-write + 0x00000000 + + + TXDATA + 8-bit transmit data + 0 + 8 + + + + + + + I2C2 + 0x40005800 + + I2C2_ER + I2C2 error interrupt + 34 + + + + I2C3 + 0x40007800 + + I2C2_EV_EXTI24 + I2C2 event interrupt & EXTI Line24 + interrupt + 33 + + + + IWDG + Independent watchdog + IWDG + 0x40003000 + + 0x0 + 0x400 + registers + + + + KR + KR + Key register + 0x0 + 0x20 + write-only + 0x00000000 + + + KEY + Key value + 0 + 16 + + + + + PR + PR + Prescaler register + 0x4 + 0x20 + read-write + 0x00000000 + + + PR + Prescaler divider + 0 + 3 + + + + + RLR + RLR + Reload register + 0x8 + 0x20 + read-write + 0x00000FFF + + + RL + Watchdog counter reload + value + 0 + 12 + + + + + SR + SR + Status register + 0xC + 0x20 + read-only + 0x00000000 + + + PVU + Watchdog prescaler value + update + 0 + 1 + + + RVU + Watchdog counter reload value + update + 1 + 1 + + + WVU + Watchdog counter window value + update + 2 + 1 + + + + + WINR + WINR + Window register + 0x10 + 0x20 + read-write + 0x00000FFF + + + WIN + Watchdog counter window + value + 0 + 12 + + + + + + + WWDG + Window watchdog + WWDG + 0x40002C00 + + 0x0 + 0x400 + registers + + + WWDG + Window Watchdog interrupt + 0 + + + + CR + CR + Control register + 0x0 + 0x20 + read-write + 0x0000007F + + + T + 7-bit counter + 0 + 7 + + + WDGA + Activation bit + 7 + 1 + + + + + CFR + CFR + Configuration register + 0x4 + 0x20 + read-write + 0x0000007F + + + EWI + Early wakeup interrupt + 9 + 1 + + + WDGTB + Timer base + 7 + 2 + + + W + 7-bit window value + 0 + 7 + + + + + SR + SR + Status register + 0x8 + 0x20 + read-write + 0x00000000 + + + EWIF + Early wakeup interrupt + flag + 0 + 1 + + + + + + + RTC + Real-time clock + RTC + 0x40002800 + + 0x0 + 0x400 + registers + + + RTC_WKUP + RTC Wakeup interrupt through the EXTI + line + 3 + + + RTCAlarm + RTC alarm interrupt + 41 + + + + TR + TR + time register + 0x0 + 0x20 + read-write + 0x00000000 + + + PM + AM/PM notation + 22 + 1 + + + HT + Hour tens in BCD format + 20 + 2 + + + HU + Hour units in BCD format + 16 + 4 + + + MNT + Minute tens in BCD format + 12 + 3 + + + MNU + Minute units in BCD format + 8 + 4 + + + ST + Second tens in BCD format + 4 + 3 + + + SU + Second units in BCD format + 0 + 4 + + + + + DR + DR + date register + 0x4 + 0x20 + read-write + 0x00002101 + + + YT + Year tens in BCD format + 20 + 4 + + + YU + Year units in BCD format + 16 + 4 + + + WDU + Week day units + 13 + 3 + + + MT + Month tens in BCD format + 12 + 1 + + + MU + Month units in BCD format + 8 + 4 + + + DT + Date tens in BCD format + 4 + 2 + + + DU + Date units in BCD format + 0 + 4 + + + + + CR + CR + control register + 0x8 + 0x20 + read-write + 0x00000000 + + + WCKSEL + Wakeup clock selection + 0 + 3 + + + TSEDGE + Time-stamp event active + edge + 3 + 1 + + + REFCKON + Reference clock detection enable (50 or + 60 Hz) + 4 + 1 + + + BYPSHAD + Bypass the shadow + registers + 5 + 1 + + + FMT + Hour format + 6 + 1 + + + ALRAE + Alarm A enable + 8 + 1 + + + ALRBE + Alarm B enable + 9 + 1 + + + WUTE + Wakeup timer enable + 10 + 1 + + + TSE + Time stamp enable + 11 + 1 + + + ALRAIE + Alarm A interrupt enable + 12 + 1 + + + ALRBIE + Alarm B interrupt enable + 13 + 1 + + + WUTIE + Wakeup timer interrupt + enable + 14 + 1 + + + TSIE + Time-stamp interrupt + enable + 15 + 1 + + + ADD1H + Add 1 hour (summer time + change) + 16 + 1 + + + SUB1H + Subtract 1 hour (winter time + change) + 17 + 1 + + + BKP + Backup + 18 + 1 + + + COSEL + Calibration output + selection + 19 + 1 + + + POL + Output polarity + 20 + 1 + + + OSEL + Output selection + 21 + 2 + + + COE + Calibration output enable + 23 + 1 + + + + + ISR + ISR + initialization and status + register + 0xC + 0x20 + 0x00000007 + + + ALRAWF + Alarm A write flag + 0 + 1 + read-only + + + ALRBWF + Alarm B write flag + 1 + 1 + read-only + + + WUTWF + Wakeup timer write flag + 2 + 1 + read-only + + + SHPF + Shift operation pending + 3 + 1 + read-write + + + INITS + Initialization status flag + 4 + 1 + read-only + + + RSF + Registers synchronization + flag + 5 + 1 + read-write + + + INITF + Initialization flag + 6 + 1 + read-only + + + INIT + Initialization mode + 7 + 1 + read-write + + + ALRAF + Alarm A flag + 8 + 1 + read-write + + + ALRBF + Alarm B flag + 9 + 1 + read-write + + + WUTF + Wakeup timer flag + 10 + 1 + read-write + + + TSF + Time-stamp flag + 11 + 1 + read-write + + + TSOVF + Time-stamp overflow flag + 12 + 1 + read-write + + + TAMP1F + Tamper detection flag + 13 + 1 + read-write + + + TAMP2F + RTC_TAMP2 detection flag + 14 + 1 + read-write + + + TAMP3F + RTC_TAMP3 detection flag + 15 + 1 + read-write + + + RECALPF + Recalibration pending Flag + 16 + 1 + read-only + + + + + PRER + PRER + prescaler register + 0x10 + 0x20 + read-write + 0x007F00FF + + + PREDIV_A + Asynchronous prescaler + factor + 16 + 7 + + + PREDIV_S + Synchronous prescaler + factor + 0 + 15 + + + + + WUTR + WUTR + wakeup timer register + 0x14 + 0x20 + read-write + 0x0000FFFF + + + WUT + Wakeup auto-reload value + bits + 0 + 16 + + + + + ALRMAR + ALRMAR + alarm A register + 0x1C + 0x20 + read-write + 0x00000000 + + + MSK4 + Alarm A date mask + 31 + 1 + + + WDSEL + Week day selection + 30 + 1 + + + DT + Date tens in BCD format + 28 + 2 + + + DU + Date units or day in BCD + format + 24 + 4 + + + MSK3 + Alarm A hours mask + 23 + 1 + + + PM + AM/PM notation + 22 + 1 + + + HT + Hour tens in BCD format + 20 + 2 + + + HU + Hour units in BCD format + 16 + 4 + + + MSK2 + Alarm A minutes mask + 15 + 1 + + + MNT + Minute tens in BCD format + 12 + 3 + + + MNU + Minute units in BCD format + 8 + 4 + + + MSK1 + Alarm A seconds mask + 7 + 1 + + + ST + Second tens in BCD format + 4 + 3 + + + SU + Second units in BCD format + 0 + 4 + + + + + ALRMBR + ALRMBR + alarm B register + 0x20 + 0x20 + read-write + 0x00000000 + + + MSK4 + Alarm B date mask + 31 + 1 + + + WDSEL + Week day selection + 30 + 1 + + + DT + Date tens in BCD format + 28 + 2 + + + DU + Date units or day in BCD + format + 24 + 4 + + + MSK3 + Alarm B hours mask + 23 + 1 + + + PM + AM/PM notation + 22 + 1 + + + HT + Hour tens in BCD format + 20 + 2 + + + HU + Hour units in BCD format + 16 + 4 + + + MSK2 + Alarm B minutes mask + 15 + 1 + + + MNT + Minute tens in BCD format + 12 + 3 + + + MNU + Minute units in BCD format + 8 + 4 + + + MSK1 + Alarm B seconds mask + 7 + 1 + + + ST + Second tens in BCD format + 4 + 3 + + + SU + Second units in BCD format + 0 + 4 + + + + + WPR + WPR + write protection register + 0x24 + 0x20 + write-only + 0x00000000 + + + KEY + Write protection key + 0 + 8 + + + + + SSR + SSR + sub second register + 0x28 + 0x20 + read-only + 0x00000000 + + + SS + Sub second value + 0 + 16 + + + + + SHIFTR + SHIFTR + shift control register + 0x2C + 0x20 + write-only + 0x00000000 + + + ADD1S + Add one second + 31 + 1 + + + SUBFS + Subtract a fraction of a + second + 0 + 15 + + + + + TSTR + TSTR + time stamp time register + 0x30 + 0x20 + read-only + 0x00000000 + + + SU + Second units in BCD format + 0 + 4 + + + ST + Second tens in BCD format + 4 + 3 + + + MNU + Minute units in BCD format + 8 + 4 + + + MNT + Minute tens in BCD format + 12 + 3 + + + HU + Hour units in BCD format + 16 + 4 + + + HT + Hour tens in BCD format + 20 + 2 + + + PM + AM/PM notation + 22 + 1 + + + + + TSDR + TSDR + time stamp date register + 0x34 + 0x20 + read-only + 0x00000000 + + + WDU + Week day units + 13 + 3 + + + MT + Month tens in BCD format + 12 + 1 + + + MU + Month units in BCD format + 8 + 4 + + + DT + Date tens in BCD format + 4 + 2 + + + DU + Date units in BCD format + 0 + 4 + + + + + TSSSR + TSSSR + timestamp sub second register + 0x38 + 0x20 + read-only + 0x00000000 + + + SS + Sub second value + 0 + 16 + + + + + CALR + CALR + calibration register + 0x3C + 0x20 + read-write + 0x00000000 + + + CALP + Increase frequency of RTC by 488.5 + ppm + 15 + 1 + + + CALW8 + Use an 8-second calibration cycle + period + 14 + 1 + + + CALW16 + Use a 16-second calibration cycle + period + 13 + 1 + + + CALM + Calibration minus + 0 + 9 + + + + + TAFCR + TAFCR + tamper and alternate function configuration + register + 0x40 + 0x20 + read-write + 0x00000000 + + + TAMP1E + Tamper 1 detection enable + 0 + 1 + + + TAMP1TRG + Active level for tamper 1 + 1 + 1 + + + TAMPIE + Tamper interrupt enable + 2 + 1 + + + TAMP2E + Tamper 2 detection enable + 3 + 1 + + + TAMP2TRG + Active level for tamper 2 + 4 + 1 + + + TAMP3E + Tamper 3 detection enable + 5 + 1 + + + TAMP3TRG + Active level for tamper 3 + 6 + 1 + + + TAMPTS + Activate timestamp on tamper detection + event + 7 + 1 + + + TAMPFREQ + Tamper sampling frequency + 8 + 3 + + + TAMPFLT + Tamper filter count + 11 + 2 + + + TAMPPRCH + Tamper precharge duration + 13 + 2 + + + TAMPPUDIS + TAMPER pull-up disable + 15 + 1 + + + PC13VALUE + PC13 value + 18 + 1 + + + PC13MODE + PC13 mode + 19 + 1 + + + PC14VALUE + PC14 value + 20 + 1 + + + PC14MODE + PC 14 mode + 21 + 1 + + + PC15VALUE + PC15 value + 22 + 1 + + + PC15MODE + PC15 mode + 23 + 1 + + + + + ALRMASSR + ALRMASSR + alarm A sub second register + 0x44 + 0x20 + read-write + 0x00000000 + + + MASKSS + Mask the most-significant bits starting + at this bit + 24 + 4 + + + SS + Sub seconds value + 0 + 15 + + + + + ALRMBSSR + ALRMBSSR + alarm B sub second register + 0x48 + 0x20 + read-write + 0x00000000 + + + MASKSS + Mask the most-significant bits starting + at this bit + 24 + 4 + + + SS + Sub seconds value + 0 + 15 + + + + + BKP0R + BKP0R + backup register + 0x50 + 0x20 + read-write + 0x00000000 + + + BKP + BKP + 0 + 32 + + + + + BKP1R + BKP1R + backup register + 0x54 + 0x20 + read-write + 0x00000000 + + + BKP + BKP + 0 + 32 + + + + + BKP2R + BKP2R + backup register + 0x58 + 0x20 + read-write + 0x00000000 + + + BKP + BKP + 0 + 32 + + + + + BKP3R + BKP3R + backup register + 0x5C + 0x20 + read-write + 0x00000000 + + + BKP + BKP + 0 + 32 + + + + + BKP4R + BKP4R + backup register + 0x60 + 0x20 + read-write + 0x00000000 + + + BKP + BKP + 0 + 32 + + + + + BKP5R + BKP5R + backup register + 0x64 + 0x20 + read-write + 0x00000000 + + + BKP + BKP + 0 + 32 + + + + + BKP6R + BKP6R + backup register + 0x68 + 0x20 + read-write + 0x00000000 + + + BKP + BKP + 0 + 32 + + + + + BKP7R + BKP7R + backup register + 0x6C + 0x20 + read-write + 0x00000000 + + + BKP + BKP + 0 + 32 + + + + + BKP8R + BKP8R + backup register + 0x70 + 0x20 + read-write + 0x00000000 + + + BKP + BKP + 0 + 32 + + + + + BKP9R + BKP9R + backup register + 0x74 + 0x20 + read-write + 0x00000000 + + + BKP + BKP + 0 + 32 + + + + + BKP10R + BKP10R + backup register + 0x78 + 0x20 + read-write + 0x00000000 + + + BKP + BKP + 0 + 32 + + + + + BKP11R + BKP11R + backup register + 0x7C + 0x20 + read-write + 0x00000000 + + + BKP + BKP + 0 + 32 + + + + + BKP12R + BKP12R + backup register + 0x80 + 0x20 + read-write + 0x00000000 + + + BKP + BKP + 0 + 32 + + + + + BKP13R + BKP13R + backup register + 0x84 + 0x20 + read-write + 0x00000000 + + + BKP + BKP + 0 + 32 + + + + + BKP14R + BKP14R + backup register + 0x88 + 0x20 + read-write + 0x00000000 + + + BKP + BKP + 0 + 32 + + + + + BKP15R + BKP15R + backup register + 0x8C + 0x20 + read-write + 0x00000000 + + + BKP + BKP + 0 + 32 + + + + + BKP16R + BKP16R + backup register + 0x90 + 0x20 + read-write + 0x00000000 + + + BKP + BKP + 0 + 32 + + + + + BKP17R + BKP17R + backup register + 0x94 + 0x20 + read-write + 0x00000000 + + + BKP + BKP + 0 + 32 + + + + + BKP18R + BKP18R + backup register + 0x98 + 0x20 + read-write + 0x00000000 + + + BKP + BKP + 0 + 32 + + + + + BKP19R + BKP19R + backup register + 0x9C + 0x20 + read-write + 0x00000000 + + + BKP + BKP + 0 + 32 + + + + + BKP20R + BKP20R + backup register + 0xA0 + 0x20 + read-write + 0x00000000 + + + BKP + BKP + 0 + 32 + + + + + BKP21R + BKP21R + backup register + 0xA4 + 0x20 + read-write + 0x00000000 + + + BKP + BKP + 0 + 32 + + + + + BKP22R + BKP22R + backup register + 0xA8 + 0x20 + read-write + 0x00000000 + + + BKP + BKP + 0 + 32 + + + + + BKP23R + BKP23R + backup register + 0xAC + 0x20 + read-write + 0x00000000 + + + BKP + BKP + 0 + 32 + + + + + BKP24R + BKP24R + backup register + 0xB0 + 0x20 + read-write + 0x00000000 + + + BKP + BKP + 0 + 32 + + + + + BKP25R + BKP25R + backup register + 0xB4 + 0x20 + read-write + 0x00000000 + + + BKP + BKP + 0 + 32 + + + + + BKP26R + BKP26R + backup register + 0xB8 + 0x20 + read-write + 0x00000000 + + + BKP + BKP + 0 + 32 + + + + + BKP27R + BKP27R + backup register + 0xBC + 0x20 + read-write + 0x00000000 + + + BKP + BKP + 0 + 32 + + + + + BKP28R + BKP28R + backup register + 0xC0 + 0x20 + read-write + 0x00000000 + + + BKP + BKP + 0 + 32 + + + + + BKP29R + BKP29R + backup register + 0xC4 + 0x20 + read-write + 0x00000000 + + + BKP + BKP + 0 + 32 + + + + + BKP30R + BKP30R + backup register + 0xC8 + 0x20 + read-write + 0x00000000 + + + BKP + BKP + 0 + 32 + + + + + BKP31R + BKP31R + backup register + 0xCC + 0x20 + read-write + 0x00000000 + + + BKP + BKP + 0 + 32 + + + + + + + TIM6 + Basic timers + TIMs + 0x40001000 + + 0x0 + 0x400 + registers + + + + CR1 + CR1 + control register 1 + 0x0 + 0x20 + read-write + 0x0000 + + + CEN + Counter enable + 0 + 1 + + + UDIS + Update disable + 1 + 1 + + + URS + Update request source + 2 + 1 + + + OPM + One-pulse mode + 3 + 1 + + + ARPE + Auto-reload preload enable + 7 + 1 + + + UIFREMAP + UIF status bit remapping + 11 + 1 + + + + + CR2 + CR2 + control register 2 + 0x4 + 0x20 + read-write + 0x0000 + + + MMS + Master mode selection + 4 + 3 + + + + + DIER + DIER + DMA/Interrupt enable register + 0xC + 0x20 + read-write + 0x0000 + + + UDE + Update DMA request enable + 8 + 1 + + + UIE + Update interrupt enable + 0 + 1 + + + + + SR + SR + status register + 0x10 + 0x20 + read-write + 0x0000 + + + UIF + Update interrupt flag + 0 + 1 + + + + + EGR + EGR + event generation register + 0x14 + 0x20 + write-only + 0x0000 + + + UG + Update generation + 0 + 1 + + + + + CNT + CNT + counter + 0x24 + 0x20 + 0x00000000 + + + CNT + Low counter value + 0 + 16 + read-write + + + UIFCPY + UIF Copy + 31 + 1 + read-only + + + + + PSC + PSC + prescaler + 0x28 + 0x20 + read-write + 0x0000 + + + PSC + Prescaler value + 0 + 16 + + + + + ARR + ARR + auto-reload register + 0x2C + 0x20 + read-write + 0x00000000 + + + ARR + Low Auto-reload value + 0 + 16 + + + + + + + TIM7 + 0x40001400 + + TIM7 + TIM7 global interrupt + 55 + + + + DAC + Digital-to-analog converter + DAC + 0x40007400 + + 0x0 + 0x400 + registers + + + TIM6_DACUNDER + TIM6 global and DAC12 underrun + interrupts + 54 + + + + CR + CR + control register + 0x0 + 0x20 + read-write + 0x00000000 + + + DMAUDRIE2 + DAC channel2 DMA underrun interrupt + enable + 29 + 1 + + + DMAEN2 + DAC channel2 DMA enable + 28 + 1 + + + MAMP2 + DAC channel2 mask/amplitude + selector + 24 + 4 + + + WAVE2 + DAC channel2 noise/triangle wave + generation enable + 22 + 2 + + + TSEL2 + DAC channel2 trigger + selection + 19 + 3 + + + TEN2 + DAC channel2 trigger + enable + 18 + 1 + + + BOFF2 + DAC channel2 output buffer + disable + 17 + 1 + + + EN2 + DAC channel2 enable + 16 + 1 + + + DMAUDRIE1 + DAC channel1 DMA Underrun Interrupt + enable + 13 + 1 + + + DMAEN1 + DAC channel1 DMA enable + 12 + 1 + + + MAMP1 + DAC channel1 mask/amplitude + selector + 8 + 4 + + + WAVE1 + DAC channel1 noise/triangle wave + generation enable + 6 + 2 + + + TSEL1 + DAC channel1 trigger + selection + 3 + 3 + + + TEN1 + DAC channel1 trigger + enable + 2 + 1 + + + BOFF1 + DAC channel1 output buffer + disable + 1 + 1 + + + EN1 + DAC channel1 enable + 0 + 1 + + + + + SWTRIGR + SWTRIGR + software trigger register + 0x4 + 0x20 + write-only + 0x00000000 + + + SWTRIG2 + DAC channel2 software + trigger + 1 + 1 + + + SWTRIG1 + DAC channel1 software + trigger + 0 + 1 + + + + + DHR12R1 + DHR12R1 + channel1 12-bit right-aligned data holding + register + 0x8 + 0x20 + read-write + 0x00000000 + + + DACC1DHR + DAC channel1 12-bit right-aligned + data + 0 + 12 + + + + + DHR12L1 + DHR12L1 + channel1 12-bit left aligned data holding + register + 0xC + 0x20 + read-write + 0x00000000 + + + DACC1DHR + DAC channel1 12-bit left-aligned + data + 4 + 12 + + + + + DHR8R1 + DHR8R1 + channel1 8-bit right aligned data holding + register + 0x10 + 0x20 + read-write + 0x00000000 + + + DACC1DHR + DAC channel1 8-bit right-aligned + data + 0 + 8 + + + + + DHR12R2 + DHR12R2 + channel2 12-bit right aligned data holding + register + 0x14 + 0x20 + read-write + 0x00000000 + + + DACC2DHR + DAC channel2 12-bit right-aligned + data + 0 + 12 + + + + + DHR12L2 + DHR12L2 + channel2 12-bit left aligned data holding + register + 0x18 + 0x20 + read-write + 0x00000000 + + + DACC2DHR + DAC channel2 12-bit left-aligned + data + 4 + 12 + + + + + DHR8R2 + DHR8R2 + channel2 8-bit right-aligned data holding + register + 0x1C + 0x20 + read-write + 0x00000000 + + + DACC2DHR + DAC channel2 8-bit right-aligned + data + 0 + 8 + + + + + DHR12RD + DHR12RD + Dual DAC 12-bit right-aligned data holding + register + 0x20 + 0x20 + read-write + 0x00000000 + + + DACC2DHR + DAC channel2 12-bit right-aligned + data + 16 + 12 + + + DACC1DHR + DAC channel1 12-bit right-aligned + data + 0 + 12 + + + + + DHR12LD + DHR12LD + DUAL DAC 12-bit left aligned data holding + register + 0x24 + 0x20 + read-write + 0x00000000 + + + DACC2DHR + DAC channel2 12-bit left-aligned + data + 20 + 12 + + + DACC1DHR + DAC channel1 12-bit left-aligned + data + 4 + 12 + + + + + DHR8RD + DHR8RD + DUAL DAC 8-bit right aligned data holding + register + 0x28 + 0x20 + read-write + 0x00000000 + + + DACC2DHR + DAC channel2 8-bit right-aligned + data + 8 + 8 + + + DACC1DHR + DAC channel1 8-bit right-aligned + data + 0 + 8 + + + + + DOR1 + DOR1 + channel1 data output register + 0x2C + 0x20 + read-only + 0x00000000 + + + DACC1DOR + DAC channel1 data output + 0 + 12 + + + + + DOR2 + DOR2 + channel2 data output register + 0x30 + 0x20 + read-only + 0x00000000 + + + DACC2DOR + DAC channel2 data output + 0 + 12 + + + + + SR + SR + status register + 0x34 + 0x20 + read-write + 0x00000000 + + + DMAUDR2 + DAC channel2 DMA underrun + flag + 29 + 1 + + + DMAUDR1 + DAC channel1 DMA underrun + flag + 13 + 1 + + + + + + + DBGMCU + Debug support + DBGMCU + 0xE0042000 + + 0x0 + 0x400 + registers + + + + IDCODE + IDCODE + MCU Device ID Code Register + 0x0 + 0x20 + read-only + 0x0 + + + DEV_ID + Device Identifier + 0 + 12 + + + REV_ID + Revision Identifier + 16 + 16 + + + + + CR + CR + Debug MCU Configuration + Register + 0x4 + 0x20 + read-write + 0x0 + + + DBG_SLEEP + Debug Sleep mode + 0 + 1 + + + DBG_STOP + Debug Stop Mode + 1 + 1 + + + DBG_STANDBY + Debug Standby Mode + 2 + 1 + + + TRACE_IOEN + Trace pin assignment + control + 5 + 1 + + + TRACE_MODE + Trace pin assignment + control + 6 + 2 + + + + + APB1FZ + APB1FZ + APB Low Freeze Register + 0x8 + 0x20 + read-write + 0x0 + + + DBG_TIM2_STOP + Debug Timer 2 stopped when Core is + halted + 0 + 1 + + + DBG_TIM3_STOP + Debug Timer 3 stopped when Core is + halted + 1 + 1 + + + DBG_TIM4_STOP + Debug Timer 4 stopped when Core is + halted + 2 + 1 + + + DBG_TIM5_STOP + Debug Timer 5 stopped when Core is + halted + 3 + 1 + + + DBG_TIM6_STOP + Debug Timer 6 stopped when Core is + halted + 4 + 1 + + + DBG_TIM7_STOP + Debug Timer 7 stopped when Core is + halted + 5 + 1 + + + DBG_TIM12_STOP + Debug Timer 12 stopped when Core is + halted + 6 + 1 + + + DBG_TIM13_STOP + Debug Timer 13 stopped when Core is + halted + 7 + 1 + + + DBG_TIMER14_STOP + Debug Timer 14 stopped when Core is + halted + 8 + 1 + + + DBG_TIM18_STOP + Debug Timer 18 stopped when Core is + halted + 9 + 1 + + + DBG_RTC_STOP + Debug RTC stopped when Core is + halted + 10 + 1 + + + DBG_WWDG_STOP + Debug Window Wachdog stopped when Core + is halted + 11 + 1 + + + DBG_IWDG_STOP + Debug Independent Wachdog stopped when + Core is halted + 12 + 1 + + + I2C1_SMBUS_TIMEOUT + SMBUS timeout mode stopped when Core is + halted + 21 + 1 + + + I2C2_SMBUS_TIMEOUT + SMBUS timeout mode stopped when Core is + halted + 22 + 1 + + + DBG_CAN_STOP + Debug CAN stopped when core is + halted + 25 + 1 + + + + + APB2FZ + APB2FZ + APB High Freeze Register + 0xC + 0x20 + read-write + 0x0 + + + DBG_TIM15_STOP + Debug Timer 15 stopped when Core is + halted + 2 + 1 + + + DBG_TIM16_STOP + Debug Timer 16 stopped when Core is + halted + 3 + 1 + + + DBG_TIM17_STO + Debug Timer 17 stopped when Core is + halted + 4 + 1 + + + DBG_TIM19_STOP + Debug Timer 19 stopped when Core is + halted + 5 + 1 + + + + + + + TIM1 + Advanced timer + TIMs + 0x40012C00 + + 0x0 + 0x400 + registers + + + + CR1 + CR1 + control register 1 + 0x0 + 0x20 + read-write + 0x0000 + + + CEN + Counter enable + 0 + 1 + + + UDIS + Update disable + 1 + 1 + + + URS + Update request source + 2 + 1 + + + OPM + One-pulse mode + 3 + 1 + + + DIR + Direction + 4 + 1 + + + CMS + Center-aligned mode + selection + 5 + 2 + + + ARPE + Auto-reload preload enable + 7 + 1 + + + CKD + Clock division + 8 + 2 + + + UIFREMAP + UIF status bit remapping + 11 + 1 + + + + + CR2 + CR2 + control register 2 + 0x4 + 0x20 + read-write + 0x0000 + + + CCPC + Capture/compare preloaded + control + 0 + 1 + + + CCUS + Capture/compare control update + selection + 2 + 1 + + + CCDS + Capture/compare DMA + selection + 3 + 1 + + + MMS + Master mode selection + 4 + 3 + + + TI1S + TI1 selection + 7 + 1 + + + OIS1 + Output Idle state 1 + 8 + 1 + + + OIS1N + Output Idle state 1 + 9 + 1 + + + OIS2 + Output Idle state 2 + 10 + 1 + + + OIS2N + Output Idle state 2 + 11 + 1 + + + OIS3 + Output Idle state 3 + 12 + 1 + + + OIS3N + Output Idle state 3 + 13 + 1 + + + OIS4 + Output Idle state 4 + 14 + 1 + + + OIS5 + Output Idle state 5 + 16 + 1 + + + OIS6 + Output Idle state 6 + 18 + 1 + + + MMS2 + Master mode selection 2 + 20 + 4 + + + + + SMCR + SMCR + slave mode control register + 0x8 + 0x20 + read-write + 0x0000 + + + SMS + Slave mode selection + 0 + 3 + + + OCCS + OCREF clear selection + 3 + 1 + + + TS + Trigger selection + 4 + 3 + + + MSM + Master/Slave mode + 7 + 1 + + + ETF + External trigger filter + 8 + 4 + + + ETPS + External trigger prescaler + 12 + 2 + + + ECE + External clock enable + 14 + 1 + + + ETP + External trigger polarity + 15 + 1 + + + SMS3 + Slave mode selection bit 3 + 16 + 1 + + + + + DIER + DIER + DMA/Interrupt enable register + 0xC + 0x20 + read-write + 0x0000 + + + TDE + Trigger DMA request enable + 14 + 1 + + + COMDE + COM DMA request enable + 13 + 1 + + + CC4DE + Capture/Compare 4 DMA request + enable + 12 + 1 + + + CC3DE + Capture/Compare 3 DMA request + enable + 11 + 1 + + + CC2DE + Capture/Compare 2 DMA request + enable + 10 + 1 + + + CC1DE + Capture/Compare 1 DMA request + enable + 9 + 1 + + + UDE + Update DMA request enable + 8 + 1 + + + BIE + Break interrupt enable + 7 + 1 + + + TIE + Trigger interrupt enable + 6 + 1 + + + COMIE + COM interrupt enable + 5 + 1 + + + CC4IE + Capture/Compare 4 interrupt + enable + 4 + 1 + + + CC3IE + Capture/Compare 3 interrupt + enable + 3 + 1 + + + CC2IE + Capture/Compare 2 interrupt + enable + 2 + 1 + + + CC1IE + Capture/Compare 1 interrupt + enable + 1 + 1 + + + UIE + Update interrupt enable + 0 + 1 + + + + + SR + SR + status register + 0x10 + 0x20 + read-write + 0x0000 + + + UIF + Update interrupt flag + 0 + 1 + + + CC1IF + Capture/compare 1 interrupt + flag + 1 + 1 + + + CC2IF + Capture/Compare 2 interrupt + flag + 2 + 1 + + + CC3IF + Capture/Compare 3 interrupt + flag + 3 + 1 + + + CC4IF + Capture/Compare 4 interrupt + flag + 4 + 1 + + + COMIF + COM interrupt flag + 5 + 1 + + + TIF + Trigger interrupt flag + 6 + 1 + + + BIF + Break interrupt flag + 7 + 1 + + + B2IF + Break 2 interrupt flag + 8 + 1 + + + CC1OF + Capture/Compare 1 overcapture + flag + 9 + 1 + + + CC2OF + Capture/compare 2 overcapture + flag + 10 + 1 + + + CC3OF + Capture/Compare 3 overcapture + flag + 11 + 1 + + + CC4OF + Capture/Compare 4 overcapture + flag + 12 + 1 + + + C5IF + Capture/Compare 5 interrupt + flag + 16 + 1 + + + C6IF + Capture/Compare 6 interrupt + flag + 17 + 1 + + + + + EGR + EGR + event generation register + 0x14 + 0x20 + write-only + 0x0000 + + + UG + Update generation + 0 + 1 + + + CC1G + Capture/compare 1 + generation + 1 + 1 + + + CC2G + Capture/compare 2 + generation + 2 + 1 + + + CC3G + Capture/compare 3 + generation + 3 + 1 + + + CC4G + Capture/compare 4 + generation + 4 + 1 + + + COMG + Capture/Compare control update + generation + 5 + 1 + + + TG + Trigger generation + 6 + 1 + + + BG + Break generation + 7 + 1 + + + B2G + Break 2 generation + 8 + 1 + + + + + CCMR1_Output + CCMR1_Output + capture/compare mode register (output + mode) + 0x18 + 0x20 + read-write + 0x00000000 + + + OC2CE + Output Compare 2 clear + enable + 15 + 1 + + + OC2M + Output Compare 2 mode + 12 + 3 + + + OC2PE + Output Compare 2 preload + enable + 11 + 1 + + + OC2FE + Output Compare 2 fast + enable + 10 + 1 + + + CC2S + Capture/Compare 2 + selection + 8 + 2 + + + OC1CE + Output Compare 1 clear + enable + 7 + 1 + + + OC1M + Output Compare 1 mode + 4 + 3 + + + OC1PE + Output Compare 1 preload + enable + 3 + 1 + + + OC1FE + Output Compare 1 fast + enable + 2 + 1 + + + CC1S + Capture/Compare 1 + selection + 0 + 2 + + + OC1M_3 + Output Compare 1 mode bit + 3 + 16 + 1 + + + OC2M_3 + Output Compare 2 mode bit + 3 + 24 + 1 + + + + + CCMR1_Input + CCMR1_Input + capture/compare mode register 1 (input + mode) + CCMR1_Output + 0x18 + 0x20 + read-write + 0x00000000 + + + IC2F + Input capture 2 filter + 12 + 4 + + + IC2PCS + Input capture 2 prescaler + 10 + 2 + + + CC2S + Capture/Compare 2 + selection + 8 + 2 + + + IC1F + Input capture 1 filter + 4 + 4 + + + IC1PCS + Input capture 1 prescaler + 2 + 2 + + + CC1S + Capture/Compare 1 + selection + 0 + 2 + + + + + CCMR2_Output + CCMR2_Output + capture/compare mode register (output + mode) + 0x1C + 0x20 + read-write + 0x00000000 + + + OC4CE + Output compare 4 clear + enable + 15 + 1 + + + OC4M + Output compare 4 mode + 12 + 3 + + + OC4PE + Output compare 4 preload + enable + 11 + 1 + + + OC4FE + Output compare 4 fast + enable + 10 + 1 + + + CC4S + Capture/Compare 4 + selection + 8 + 2 + + + OC3CE + Output compare 3 clear + enable + 7 + 1 + + + OC3M + Output compare 3 mode + 4 + 3 + + + OC3PE + Output compare 3 preload + enable + 3 + 1 + + + OC3FE + Output compare 3 fast + enable + 2 + 1 + + + CC3S + Capture/Compare 3 + selection + 0 + 2 + + + OC3M_3 + Output Compare 3 mode bit + 3 + 16 + 1 + + + OC4M_3 + Output Compare 4 mode bit + 3 + 24 + 1 + + + + + CCMR2_Input + CCMR2_Input + capture/compare mode register 2 (input + mode) + CCMR2_Output + 0x1C + 0x20 + read-write + 0x00000000 + + + IC4F + Input capture 4 filter + 12 + 4 + + + IC4PSC + Input capture 4 prescaler + 10 + 2 + + + CC4S + Capture/Compare 4 + selection + 8 + 2 + + + IC3F + Input capture 3 filter + 4 + 4 + + + IC3PSC + Input capture 3 prescaler + 2 + 2 + + + CC3S + Capture/compare 3 + selection + 0 + 2 + + + + + CCER + CCER + capture/compare enable + register + 0x20 + 0x20 + read-write + 0x0000 + + + CC1E + Capture/Compare 1 output + enable + 0 + 1 + + + CC1P + Capture/Compare 1 output + Polarity + 1 + 1 + + + CC1NE + Capture/Compare 1 complementary output + enable + 2 + 1 + + + CC1NP + Capture/Compare 1 output + Polarity + 3 + 1 + + + CC2E + Capture/Compare 2 output + enable + 4 + 1 + + + CC2P + Capture/Compare 2 output + Polarity + 5 + 1 + + + CC2NE + Capture/Compare 2 complementary output + enable + 6 + 1 + + + CC2NP + Capture/Compare 2 output + Polarity + 7 + 1 + + + CC3E + Capture/Compare 3 output + enable + 8 + 1 + + + CC3P + Capture/Compare 3 output + Polarity + 9 + 1 + + + CC3NE + Capture/Compare 3 complementary output + enable + 10 + 1 + + + CC3NP + Capture/Compare 3 output + Polarity + 11 + 1 + + + CC4E + Capture/Compare 4 output + enable + 12 + 1 + + + CC4P + Capture/Compare 3 output + Polarity + 13 + 1 + + + CC4NP + Capture/Compare 4 output + Polarity + 15 + 1 + + + CC5E + Capture/Compare 5 output + enable + 16 + 1 + + + CC5P + Capture/Compare 5 output + Polarity + 17 + 1 + + + CC6E + Capture/Compare 6 output + enable + 20 + 1 + + + CC6P + Capture/Compare 6 output + Polarity + 21 + 1 + + + + + CNT + CNT + counter + 0x24 + 0x20 + 0x00000000 + + + CNT + counter value + 0 + 16 + read-write + + + UIFCPY + UIF copy + 31 + 1 + read-only + + + + + PSC + PSC + prescaler + 0x28 + 0x20 + read-write + 0x0000 + + + PSC + Prescaler value + 0 + 16 + + + + + ARR + ARR + auto-reload register + 0x2C + 0x20 + read-write + 0x00000000 + + + ARR + Auto-reload value + 0 + 16 + + + + + RCR + RCR + repetition counter register + 0x30 + 0x20 + read-write + 0x0000 + + + REP + Repetition counter value + 0 + 16 + + + + + CCR1 + CCR1 + capture/compare register 1 + 0x34 + 0x20 + read-write + 0x00000000 + + + CCR1 + Capture/Compare 1 value + 0 + 16 + + + + + CCR2 + CCR2 + capture/compare register 2 + 0x38 + 0x20 + read-write + 0x00000000 + + + CCR2 + Capture/Compare 2 value + 0 + 16 + + + + + CCR3 + CCR3 + capture/compare register 3 + 0x3C + 0x20 + read-write + 0x00000000 + + + CCR3 + Capture/Compare 3 value + 0 + 16 + + + + + CCR4 + CCR4 + capture/compare register 4 + 0x40 + 0x20 + read-write + 0x00000000 + + + CCR4 + Capture/Compare 3 value + 0 + 16 + + + + + BDTR + BDTR + break and dead-time register + 0x44 + 0x20 + read-write + 0x00000000 + + + DTG + Dead-time generator setup + 0 + 8 + + + LOCK + Lock configuration + 8 + 2 + + + OSSI + Off-state selection for Idle + mode + 10 + 1 + + + OSSR + Off-state selection for Run + mode + 11 + 1 + + + BKE + Break enable + 12 + 1 + + + BKP + Break polarity + 13 + 1 + + + AOE + Automatic output enable + 14 + 1 + + + MOE + Main output enable + 15 + 1 + + + BKF + Break filter + 16 + 4 + + + BK2F + Break 2 filter + 20 + 4 + + + BK2E + Break 2 enable + 24 + 1 + + + BK2P + Break 2 polarity + 25 + 1 + + + + + DCR + DCR + DMA control register + 0x48 + 0x20 + read-write + 0x00000000 + + + DBL + DMA burst length + 8 + 5 + + + DBA + DMA base address + 0 + 5 + + + + + DMAR + DMAR + DMA address for full transfer + 0x4C + 0x20 + read-write + 0x00000000 + + + DMAB + DMA register for burst + accesses + 0 + 16 + + + + + CCMR3_Output + CCMR3_Output + capture/compare mode register 3 (output + mode) + 0x54 + 0x20 + read-write + 0x00000000 + + + OC5FE + Output compare 5 fast + enable + 2 + 1 + + + OC5PE + Output compare 5 preload + enable + 3 + 1 + + + OC5M + Output compare 5 mode + 4 + 3 + + + OC5CE + Output compare 5 clear + enable + 7 + 1 + + + OC6FE + Output compare 6 fast + enable + 10 + 1 + + + OC6PE + Output compare 6 preload + enable + 11 + 1 + + + OC6M + Output compare 6 mode + 12 + 3 + + + OC6CE + Output compare 6 clear + enable + 15 + 1 + + + OC5M_3 + Outout Compare 5 mode bit + 3 + 16 + 1 + + + OC6M_3 + Outout Compare 6 mode bit + 3 + 24 + 1 + + + + + CCR5 + CCR5 + capture/compare register 5 + 0x58 + 0x20 + read-write + 0x00000000 + + + CCR5 + Capture/Compare 5 value + 0 + 16 + + + GC5C1 + Group Channel 5 and Channel + 1 + 29 + 1 + + + GC5C2 + Group Channel 5 and Channel + 2 + 30 + 1 + + + GC5C3 + Group Channel 5 and Channel + 3 + 31 + 1 + + + + + CCR6 + CCR6 + capture/compare register 6 + 0x5C + 0x20 + read-write + 0x00000000 + + + CCR6 + Capture/Compare 6 value + 0 + 16 + + + + + OR + OR + option registers + 0x60 + 0x20 + read-write + 0x00000000 + + + TIM1_ETR_ADC1_RMP + TIM1_ETR_ADC1 remapping + capability + 0 + 2 + + + TIM1_ETR_ADC4_RMP + TIM1_ETR_ADC4 remapping + capability + 2 + 2 + + + + + + + TIM20 + 0x40015000 + + TIM1_CC + TIM1 capture compare interrupt + 27 + + + + TIM8 + Advanced-timers + TIMs + 0x40013400 + + 0x0 + 0x400 + registers + + + TIM8_BRK + TIM8 break interrupt + 43 + + + TIM8_UP + TIM8 update interrupt + 44 + + + TIM8_TRG_COM + TIM8 Trigger and commutation + interrupts + 45 + + + TIM8_CC + TIM8 capture compare interrupt + 46 + + + + CR1 + CR1 + control register 1 + 0x0 + 0x20 + read-write + 0x0000 + + + CEN + Counter enable + 0 + 1 + + + UDIS + Update disable + 1 + 1 + + + URS + Update request source + 2 + 1 + + + OPM + One-pulse mode + 3 + 1 + + + DIR + Direction + 4 + 1 + + + CMS + Center-aligned mode + selection + 5 + 2 + + + ARPE + Auto-reload preload enable + 7 + 1 + + + CKD + Clock division + 8 + 2 + + + UIFREMAP + UIF status bit remapping + 11 + 1 + + + + + CR2 + CR2 + control register 2 + 0x4 + 0x20 + read-write + 0x0000 + + + CCPC + Capture/compare preloaded + control + 0 + 1 + + + CCUS + Capture/compare control update + selection + 2 + 1 + + + CCDS + Capture/compare DMA + selection + 3 + 1 + + + MMS + Master mode selection + 4 + 3 + + + TI1S + TI1 selection + 7 + 1 + + + OIS1 + Output Idle state 1 + 8 + 1 + + + OIS1N + Output Idle state 1 + 9 + 1 + + + OIS2 + Output Idle state 2 + 10 + 1 + + + OIS2N + Output Idle state 2 + 11 + 1 + + + OIS3 + Output Idle state 3 + 12 + 1 + + + OIS3N + Output Idle state 3 + 13 + 1 + + + OIS4 + Output Idle state 4 + 14 + 1 + + + OIS5 + Output Idle state 5 + 16 + 1 + + + OIS6 + Output Idle state 6 + 18 + 1 + + + MMS2 + Master mode selection 2 + 20 + 4 + + + + + SMCR + SMCR + slave mode control register + 0x8 + 0x20 + read-write + 0x0000 + + + SMS + Slave mode selection + 0 + 3 + + + OCCS + OCREF clear selection + 3 + 1 + + + TS + Trigger selection + 4 + 3 + + + MSM + Master/Slave mode + 7 + 1 + + + ETF + External trigger filter + 8 + 4 + + + ETPS + External trigger prescaler + 12 + 2 + + + ECE + External clock enable + 14 + 1 + + + ETP + External trigger polarity + 15 + 1 + + + SMS3 + Slave mode selection bit 3 + 16 + 1 + + + + + DIER + DIER + DMA/Interrupt enable register + 0xC + 0x20 + read-write + 0x0000 + + + TDE + Trigger DMA request enable + 14 + 1 + + + COMDE + COM DMA request enable + 13 + 1 + + + CC4DE + Capture/Compare 4 DMA request + enable + 12 + 1 + + + CC3DE + Capture/Compare 3 DMA request + enable + 11 + 1 + + + CC2DE + Capture/Compare 2 DMA request + enable + 10 + 1 + + + CC1DE + Capture/Compare 1 DMA request + enable + 9 + 1 + + + UDE + Update DMA request enable + 8 + 1 + + + BIE + Break interrupt enable + 7 + 1 + + + TIE + Trigger interrupt enable + 6 + 1 + + + COMIE + COM interrupt enable + 5 + 1 + + + CC4IE + Capture/Compare 4 interrupt + enable + 4 + 1 + + + CC3IE + Capture/Compare 3 interrupt + enable + 3 + 1 + + + CC2IE + Capture/Compare 2 interrupt + enable + 2 + 1 + + + CC1IE + Capture/Compare 1 interrupt + enable + 1 + 1 + + + UIE + Update interrupt enable + 0 + 1 + + + + + SR + SR + status register + 0x10 + 0x20 + read-write + 0x0000 + + + UIF + Update interrupt flag + 0 + 1 + + + CC1IF + Capture/compare 1 interrupt + flag + 1 + 1 + + + CC2IF + Capture/Compare 2 interrupt + flag + 2 + 1 + + + CC3IF + Capture/Compare 3 interrupt + flag + 3 + 1 + + + CC4IF + Capture/Compare 4 interrupt + flag + 4 + 1 + + + COMIF + COM interrupt flag + 5 + 1 + + + TIF + Trigger interrupt flag + 6 + 1 + + + BIF + Break interrupt flag + 7 + 1 + + + B2IF + Break 2 interrupt flag + 8 + 1 + + + CC1OF + Capture/Compare 1 overcapture + flag + 9 + 1 + + + CC2OF + Capture/compare 2 overcapture + flag + 10 + 1 + + + CC3OF + Capture/Compare 3 overcapture + flag + 11 + 1 + + + CC4OF + Capture/Compare 4 overcapture + flag + 12 + 1 + + + C5IF + Capture/Compare 5 interrupt + flag + 16 + 1 + + + C6IF + Capture/Compare 6 interrupt + flag + 17 + 1 + + + + + EGR + EGR + event generation register + 0x14 + 0x20 + write-only + 0x0000 + + + UG + Update generation + 0 + 1 + + + CC1G + Capture/compare 1 + generation + 1 + 1 + + + CC2G + Capture/compare 2 + generation + 2 + 1 + + + CC3G + Capture/compare 3 + generation + 3 + 1 + + + CC4G + Capture/compare 4 + generation + 4 + 1 + + + COMG + Capture/Compare control update + generation + 5 + 1 + + + TG + Trigger generation + 6 + 1 + + + BG + Break generation + 7 + 1 + + + B2G + Break 2 generation + 8 + 1 + + + + + CCMR1_Output + CCMR1_Output + capture/compare mode register (output + mode) + 0x18 + 0x20 + read-write + 0x00000000 + + + OC2CE + Output Compare 2 clear + enable + 15 + 1 + + + OC2M + Output Compare 2 mode + 12 + 3 + + + OC2PE + Output Compare 2 preload + enable + 11 + 1 + + + OC2FE + Output Compare 2 fast + enable + 10 + 1 + + + CC2S + Capture/Compare 2 + selection + 8 + 2 + + + OC1CE + Output Compare 1 clear + enable + 7 + 1 + + + OC1M + Output Compare 1 mode + 4 + 3 + + + OC1PE + Output Compare 1 preload + enable + 3 + 1 + + + OC1FE + Output Compare 1 fast + enable + 2 + 1 + + + CC1S + Capture/Compare 1 + selection + 0 + 2 + + + OC1M_3 + Output Compare 1 mode bit + 3 + 16 + 1 + + + OC2M_3 + Output Compare 2 mode bit + 3 + 24 + 1 + + + + + CCMR1_Input + CCMR1_Input + capture/compare mode register 1 (input + mode) + CCMR1_Output + 0x18 + 0x20 + read-write + 0x00000000 + + + IC2F + Input capture 2 filter + 12 + 4 + + + IC2PCS + Input capture 2 prescaler + 10 + 2 + + + CC2S + Capture/Compare 2 + selection + 8 + 2 + + + IC1F + Input capture 1 filter + 4 + 4 + + + IC1PCS + Input capture 1 prescaler + 2 + 2 + + + CC1S + Capture/Compare 1 + selection + 0 + 2 + + + + + CCMR2_Output + CCMR2_Output + capture/compare mode register (output + mode) + 0x1C + 0x20 + read-write + 0x00000000 + + + OC4CE + Output compare 4 clear + enable + 15 + 1 + + + OC4M + Output compare 4 mode + 12 + 3 + + + OC4PE + Output compare 4 preload + enable + 11 + 1 + + + OC4FE + Output compare 4 fast + enable + 10 + 1 + + + CC4S + Capture/Compare 4 + selection + 8 + 2 + + + OC3CE + Output compare 3 clear + enable + 7 + 1 + + + OC3M + Output compare 3 mode + 4 + 3 + + + OC3PE + Output compare 3 preload + enable + 3 + 1 + + + OC3FE + Output compare 3 fast + enable + 2 + 1 + + + CC3S + Capture/Compare 3 + selection + 0 + 2 + + + OC3M_3 + Output Compare 3 mode bit + 3 + 16 + 1 + + + OC4M_3 + Output Compare 4 mode bit + 3 + 24 + 1 + + + + + CCMR2_Input + CCMR2_Input + capture/compare mode register 2 (input + mode) + CCMR2_Output + 0x1C + 0x20 + read-write + 0x00000000 + + + IC4F + Input capture 4 filter + 12 + 4 + + + IC4PSC + Input capture 4 prescaler + 10 + 2 + + + CC4S + Capture/Compare 4 + selection + 8 + 2 + + + IC3F + Input capture 3 filter + 4 + 4 + + + IC3PSC + Input capture 3 prescaler + 2 + 2 + + + CC3S + Capture/compare 3 + selection + 0 + 2 + + + + + CCER + CCER + capture/compare enable + register + 0x20 + 0x20 + read-write + 0x0000 + + + CC1E + Capture/Compare 1 output + enable + 0 + 1 + + + CC1P + Capture/Compare 1 output + Polarity + 1 + 1 + + + CC1NE + Capture/Compare 1 complementary output + enable + 2 + 1 + + + CC1NP + Capture/Compare 1 output + Polarity + 3 + 1 + + + CC2E + Capture/Compare 2 output + enable + 4 + 1 + + + CC2P + Capture/Compare 2 output + Polarity + 5 + 1 + + + CC2NE + Capture/Compare 2 complementary output + enable + 6 + 1 + + + CC2NP + Capture/Compare 2 output + Polarity + 7 + 1 + + + CC3E + Capture/Compare 3 output + enable + 8 + 1 + + + CC3P + Capture/Compare 3 output + Polarity + 9 + 1 + + + CC3NE + Capture/Compare 3 complementary output + enable + 10 + 1 + + + CC3NP + Capture/Compare 3 output + Polarity + 11 + 1 + + + CC4E + Capture/Compare 4 output + enable + 12 + 1 + + + CC4P + Capture/Compare 3 output + Polarity + 13 + 1 + + + CC4NP + Capture/Compare 4 output + Polarity + 15 + 1 + + + CC5E + Capture/Compare 5 output + enable + 16 + 1 + + + CC5P + Capture/Compare 5 output + Polarity + 17 + 1 + + + CC6E + Capture/Compare 6 output + enable + 20 + 1 + + + CC6P + Capture/Compare 6 output + Polarity + 21 + 1 + + + + + CNT + CNT + counter + 0x24 + 0x20 + 0x00000000 + + + CNT + counter value + 0 + 16 + read-write + + + UIFCPY + UIF copy + 31 + 1 + read-only + + + + + PSC + PSC + prescaler + 0x28 + 0x20 + read-write + 0x0000 + + + PSC + Prescaler value + 0 + 16 + + + + + ARR + ARR + auto-reload register + 0x2C + 0x20 + read-write + 0x00000000 + + + ARR + Auto-reload value + 0 + 16 + + + + + RCR + RCR + repetition counter register + 0x30 + 0x20 + read-write + 0x0000 + + + REP + Repetition counter value + 0 + 16 + + + + + CCR1 + CCR1 + capture/compare register 1 + 0x34 + 0x20 + read-write + 0x00000000 + + + CCR1 + Capture/Compare 1 value + 0 + 16 + + + + + CCR2 + CCR2 + capture/compare register 2 + 0x38 + 0x20 + read-write + 0x00000000 + + + CCR2 + Capture/Compare 2 value + 0 + 16 + + + + + CCR3 + CCR3 + capture/compare register 3 + 0x3C + 0x20 + read-write + 0x00000000 + + + CCR3 + Capture/Compare 3 value + 0 + 16 + + + + + CCR4 + CCR4 + capture/compare register 4 + 0x40 + 0x20 + read-write + 0x00000000 + + + CCR4 + Capture/Compare 3 value + 0 + 16 + + + + + BDTR + BDTR + break and dead-time register + 0x44 + 0x20 + read-write + 0x00000000 + + + DTG + Dead-time generator setup + 0 + 8 + + + LOCK + Lock configuration + 8 + 2 + + + OSSI + Off-state selection for Idle + mode + 10 + 1 + + + OSSR + Off-state selection for Run + mode + 11 + 1 + + + BKE + Break enable + 12 + 1 + + + BKP + Break polarity + 13 + 1 + + + AOE + Automatic output enable + 14 + 1 + + + MOE + Main output enable + 15 + 1 + + + BKF + Break filter + 16 + 4 + + + BK2F + Break 2 filter + 20 + 4 + + + BK2E + Break 2 enable + 24 + 1 + + + BK2P + Break 2 polarity + 25 + 1 + + + + + DCR + DCR + DMA control register + 0x48 + 0x20 + read-write + 0x00000000 + + + DBL + DMA burst length + 8 + 5 + + + DBA + DMA base address + 0 + 5 + + + + + DMAR + DMAR + DMA address for full transfer + 0x4C + 0x20 + read-write + 0x00000000 + + + DMAB + DMA register for burst + accesses + 0 + 16 + + + + + CCMR3_Output + CCMR3_Output + capture/compare mode register 3 (output + mode) + 0x54 + 0x20 + read-write + 0x00000000 + + + OC5FE + Output compare 5 fast + enable + 2 + 1 + + + OC5PE + Output compare 5 preload + enable + 3 + 1 + + + OC5M + Output compare 5 mode + 4 + 3 + + + OC5CE + Output compare 5 clear + enable + 7 + 1 + + + OC6FE + Output compare 6 fast + enable + 10 + 1 + + + OC6PE + Output compare 6 preload + enable + 11 + 1 + + + OC6M + Output compare 6 mode + 12 + 3 + + + OC6CE + Output compare 6 clear + enable + 15 + 1 + + + OC5M_3 + Outout Compare 5 mode bit + 3 + 16 + 1 + + + OC6M_3 + Outout Compare 6 mode bit + 3 + 24 + 1 + + + + + CCR5 + CCR5 + capture/compare register 5 + 0x58 + 0x20 + read-write + 0x00000000 + + + CCR5 + Capture/Compare 5 value + 0 + 16 + + + GC5C1 + Group Channel 5 and Channel + 1 + 29 + 1 + + + GC5C2 + Group Channel 5 and Channel + 2 + 30 + 1 + + + GC5C3 + Group Channel 5 and Channel + 3 + 31 + 1 + + + + + CCR6 + CCR6 + capture/compare register 6 + 0x5C + 0x20 + read-write + 0x00000000 + + + CCR6 + Capture/Compare 6 value + 0 + 16 + + + + + OR + OR + option registers + 0x60 + 0x20 + read-write + 0x00000000 + + + TIM8_ETR_ADC2_RMP + TIM8_ETR_ADC2 remapping + capability + 0 + 2 + + + TIM8_ETR_ADC3_RMP + TIM8_ETR_ADC3 remapping + capability + 2 + 2 + + + + + + + ADC1 + Analog-to-Digital Converter + ADC + 0x50000000 + + 0x0 + 0x100 + registers + + + + ISR + ISR + interrupt and status register + 0x0 + 0x20 + read-write + 0x00000000 + + + JQOVF + JQOVF + 10 + 1 + + + AWD3 + AWD3 + 9 + 1 + + + AWD2 + AWD2 + 8 + 1 + + + AWD1 + AWD1 + 7 + 1 + + + JEOS + JEOS + 6 + 1 + + + JEOC + JEOC + 5 + 1 + + + OVR + OVR + 4 + 1 + + + EOS + EOS + 3 + 1 + + + EOC + EOC + 2 + 1 + + + EOSMP + EOSMP + 1 + 1 + + + ADRDY + ADRDY + 0 + 1 + + + + + IER + IER + interrupt enable register + 0x4 + 0x20 + read-write + 0x00000000 + + + JQOVFIE + JQOVFIE + 10 + 1 + + + AWD3IE + AWD3IE + 9 + 1 + + + AWD2IE + AWD2IE + 8 + 1 + + + AWD1IE + AWD1IE + 7 + 1 + + + JEOSIE + JEOSIE + 6 + 1 + + + JEOCIE + JEOCIE + 5 + 1 + + + OVRIE + OVRIE + 4 + 1 + + + EOSIE + EOSIE + 3 + 1 + + + EOCIE + EOCIE + 2 + 1 + + + EOSMPIE + EOSMPIE + 1 + 1 + + + ADRDYIE + ADRDYIE + 0 + 1 + + + + + CR + CR + control register + 0x8 + 0x20 + read-write + 0x00000000 + + + ADCAL + ADCAL + 31 + 1 + + + ADCALDIF + ADCALDIF + 30 + 1 + + + DEEPPWD + DEEPPWD + 29 + 1 + + + ADVREGEN + ADVREGEN + 28 + 1 + + + JADSTP + JADSTP + 5 + 1 + + + ADSTP + ADSTP + 4 + 1 + + + JADSTART + JADSTART + 3 + 1 + + + ADSTART + ADSTART + 2 + 1 + + + ADDIS + ADDIS + 1 + 1 + + + ADEN + ADEN + 0 + 1 + + + + + CFGR + CFGR + configuration register + 0xC + 0x20 + read-write + 0x00000000 + + + AWDCH1CH + AWDCH1CH + 26 + 5 + + + JAUTO + JAUTO + 25 + 1 + + + JAWD1EN + JAWD1EN + 24 + 1 + + + AWD1EN + AWD1EN + 23 + 1 + + + AWD1SGL + AWD1SGL + 22 + 1 + + + JQM + JQM + 21 + 1 + + + JDISCEN + JDISCEN + 20 + 1 + + + DISCNUM + DISCNUM + 17 + 3 + + + DISCEN + DISCEN + 16 + 1 + + + AUTOFF + AUTOFF + 15 + 1 + + + AUTDLY + AUTDLY + 14 + 1 + + + CONT + CONT + 13 + 1 + + + OVRMOD + OVRMOD + 12 + 1 + + + EXTEN + EXTEN + 10 + 2 + + + EXTSEL + EXTSEL + 6 + 4 + + + ALIGN + ALIGN + 5 + 1 + + + RES + RES + 3 + 2 + + + DMACFG + DMACFG + 1 + 1 + + + DMAEN + DMAEN + 0 + 1 + + + + + SMPR1 + SMPR1 + sample time register 1 + 0x14 + 0x20 + read-write + 0x00000000 + + + SMP9 + SMP9 + 27 + 3 + + + SMP8 + SMP8 + 24 + 3 + + + SMP7 + SMP7 + 21 + 3 + + + SMP6 + SMP6 + 18 + 3 + + + SMP5 + SMP5 + 15 + 3 + + + SMP4 + SMP4 + 12 + 3 + + + SMP3 + SMP3 + 9 + 3 + + + SMP2 + SMP2 + 6 + 3 + + + SMP1 + SMP1 + 3 + 3 + + + + + SMPR2 + SMPR2 + sample time register 2 + 0x18 + 0x20 + read-write + 0x00000000 + + + SMP18 + SMP18 + 24 + 3 + + + SMP17 + SMP17 + 21 + 3 + + + SMP16 + SMP16 + 18 + 3 + + + SMP15 + SMP15 + 15 + 3 + + + SMP14 + SMP14 + 12 + 3 + + + SMP13 + SMP13 + 9 + 3 + + + SMP12 + SMP12 + 6 + 3 + + + SMP11 + SMP11 + 3 + 3 + + + SMP10 + SMP10 + 0 + 3 + + + + + TR1 + TR1 + watchdog threshold register 1 + 0x20 + 0x20 + read-write + 0x0FFF0000 + + + HT1 + HT1 + 16 + 12 + + + LT1 + LT1 + 0 + 12 + + + + + TR2 + TR2 + watchdog threshold register + 0x24 + 0x20 + read-write + 0x0FFF0000 + + + HT2 + HT2 + 16 + 8 + + + LT2 + LT2 + 0 + 8 + + + + + TR3 + TR3 + watchdog threshold register 3 + 0x28 + 0x20 + read-write + 0x0FFF0000 + + + HT3 + HT3 + 16 + 8 + + + LT3 + LT3 + 0 + 8 + + + + + SQR1 + SQR1 + regular sequence register 1 + 0x30 + 0x20 + read-write + 0x00000000 + + + SQ4 + SQ4 + 24 + 5 + + + SQ3 + SQ3 + 18 + 5 + + + SQ2 + SQ2 + 12 + 5 + + + SQ1 + SQ1 + 6 + 5 + + + L3 + L3 + 0 + 4 + + + + + SQR2 + SQR2 + regular sequence register 2 + 0x34 + 0x20 + read-write + 0x00000000 + + + SQ9 + SQ9 + 24 + 5 + + + SQ8 + SQ8 + 18 + 5 + + + SQ7 + SQ7 + 12 + 5 + + + SQ6 + SQ6 + 6 + 5 + + + SQ5 + SQ5 + 0 + 5 + + + + + SQR3 + SQR3 + regular sequence register 3 + 0x38 + 0x20 + read-write + 0x00000000 + + + SQ14 + SQ14 + 24 + 5 + + + SQ13 + SQ13 + 18 + 5 + + + SQ12 + SQ12 + 12 + 5 + + + SQ11 + SQ11 + 6 + 5 + + + SQ10 + SQ10 + 0 + 5 + + + + + SQR4 + SQR4 + regular sequence register 4 + 0x3C + 0x20 + read-write + 0x00000000 + + + SQ16 + SQ16 + 6 + 5 + + + SQ15 + SQ15 + 0 + 5 + + + + + DR + DR + regular Data Register + 0x40 + 0x20 + read-only + 0x00000000 + + + regularDATA + regularDATA + 0 + 16 + + + + + JSQR + JSQR + injected sequence register + 0x4C + 0x20 + read-write + 0x00000000 + + + JSQ4 + JSQ4 + 26 + 5 + + + JSQ3 + JSQ3 + 20 + 5 + + + JSQ2 + JSQ2 + 14 + 5 + + + JSQ1 + JSQ1 + 8 + 5 + + + JEXTEN + JEXTEN + 6 + 2 + + + JEXTSEL + JEXTSEL + 2 + 4 + + + JL + JL + 0 + 2 + + + + + OFR1 + OFR1 + offset register 1 + 0x60 + 0x20 + read-write + 0x00000000 + + + OFFSET1_EN + OFFSET1_EN + 31 + 1 + + + OFFSET1_CH + OFFSET1_CH + 26 + 5 + + + OFFSET1 + OFFSET1 + 0 + 12 + + + + + OFR2 + OFR2 + offset register 2 + 0x64 + 0x20 + read-write + 0x00000000 + + + OFFSET2_EN + OFFSET2_EN + 31 + 1 + + + OFFSET2_CH + OFFSET2_CH + 26 + 5 + + + OFFSET2 + OFFSET2 + 0 + 12 + + + + + OFR3 + OFR3 + offset register 3 + 0x68 + 0x20 + read-write + 0x00000000 + + + OFFSET3_EN + OFFSET3_EN + 31 + 1 + + + OFFSET3_CH + OFFSET3_CH + 26 + 5 + + + OFFSET3 + OFFSET3 + 0 + 12 + + + + + OFR4 + OFR4 + offset register 4 + 0x6C + 0x20 + read-write + 0x00000000 + + + OFFSET4_EN + OFFSET4_EN + 31 + 1 + + + OFFSET4_CH + OFFSET4_CH + 26 + 5 + + + OFFSET4 + OFFSET4 + 0 + 12 + + + + + JDR1 + JDR1 + injected data register 1 + 0x80 + 0x20 + read-only + 0x00000000 + + + JDATA1 + JDATA1 + 0 + 16 + + + + + JDR2 + JDR2 + injected data register 2 + 0x84 + 0x20 + read-only + 0x00000000 + + + JDATA2 + JDATA2 + 0 + 16 + + + + + JDR3 + JDR3 + injected data register 3 + 0x88 + 0x20 + read-only + 0x00000000 + + + JDATA3 + JDATA3 + 0 + 16 + + + + + JDR4 + JDR4 + injected data register 4 + 0x8C + 0x20 + read-only + 0x00000000 + + + JDATA4 + JDATA4 + 0 + 16 + + + + + AWD2CR + AWD2CR + Analog Watchdog 2 Configuration + Register + 0xA0 + 0x20 + read-write + 0x00000000 + + + AWD2CH + AWD2CH + 1 + 18 + + + + + AWD3CR + AWD3CR + Analog Watchdog 3 Configuration + Register + 0xA4 + 0x20 + read-write + 0x00000000 + + + AWD3CH + AWD3CH + 1 + 18 + + + + + DIFSEL + DIFSEL + Differential Mode Selection Register + 2 + 0xB0 + 0x20 + 0x00000000 + + + DIFSEL_1_15 + Differential mode for channels 15 to + 1 + 1 + 15 + read-write + + + DIFSEL_16_18 + Differential mode for channels 18 to + 16 + 16 + 3 + read-only + + + + + CALFACT + CALFACT + Calibration Factors + 0xB4 + 0x20 + read-write + 0x00000000 + + + CALFACT_D + CALFACT_D + 16 + 7 + + + CALFACT_S + CALFACT_S + 0 + 7 + + + + + + + ADC2 + 0x50000100 + + ADC1_2 + ADC1 and ADC2 global interrupt + 18 + + + + ADC3 + 0x50000400 + + ADC3 + ADC3 global interrupt + 47 + + + + ADC4 + 0x50000500 + + ADC4 + ADC4 global interrupt + 61 + + + + ADC1_2 + Analog-to-Digital Converter + ADC + 0x50000300 + + 0x0 + 0x11 + registers + + + + CSR + CSR + ADC Common status register + 0x0 + 0x20 + read-only + 0x00000000 + + + ADDRDY_MST + ADDRDY_MST + 0 + 1 + + + EOSMP_MST + EOSMP_MST + 1 + 1 + + + EOC_MST + EOC_MST + 2 + 1 + + + EOS_MST + EOS_MST + 3 + 1 + + + OVR_MST + OVR_MST + 4 + 1 + + + JEOC_MST + JEOC_MST + 5 + 1 + + + JEOS_MST + JEOS_MST + 6 + 1 + + + AWD1_MST + AWD1_MST + 7 + 1 + + + AWD2_MST + AWD2_MST + 8 + 1 + + + AWD3_MST + AWD3_MST + 9 + 1 + + + JQOVF_MST + JQOVF_MST + 10 + 1 + + + ADRDY_SLV + ADRDY_SLV + 16 + 1 + + + EOSMP_SLV + EOSMP_SLV + 17 + 1 + + + EOC_SLV + End of regular conversion of the slave + ADC + 18 + 1 + + + EOS_SLV + End of regular sequence flag of the + slave ADC + 19 + 1 + + + OVR_SLV + Overrun flag of the slave + ADC + 20 + 1 + + + JEOC_SLV + End of injected conversion flag of the + slave ADC + 21 + 1 + + + JEOS_SLV + End of injected sequence flag of the + slave ADC + 22 + 1 + + + AWD1_SLV + Analog watchdog 1 flag of the slave + ADC + 23 + 1 + + + AWD2_SLV + Analog watchdog 2 flag of the slave + ADC + 24 + 1 + + + AWD3_SLV + Analog watchdog 3 flag of the slave + ADC + 25 + 1 + + + JQOVF_SLV + Injected Context Queue Overflow flag of + the slave ADC + 26 + 1 + + + + + CCR + CCR + ADC common control register + 0x8 + 0x20 + read-write + 0x00000000 + + + MULT + Multi ADC mode selection + 0 + 5 + + + DELAY + Delay between 2 sampling + phases + 8 + 4 + + + DMACFG + DMA configuration (for multi-ADC + mode) + 13 + 1 + + + MDMA + Direct memory access mode for multi ADC + mode + 14 + 2 + + + CKMODE + ADC clock mode + 16 + 2 + + + VREFEN + VREFINT enable + 22 + 1 + + + TSEN + Temperature sensor enable + 23 + 1 + + + VBATEN + VBAT enable + 24 + 1 + + + + + CDR + CDR + ADC common regular data register for dual + and triple modes + 0xC + 0x20 + read-only + 0x00000000 + + + RDATA_SLV + Regular data of the slave + ADC + 16 + 16 + + + RDATA_MST + Regular data of the master + ADC + 0 + 16 + + + + + + + ADC3_4 + 0x50000700 + + + FMC + Flexible memory controller + FMC + 0xA0000000 + + 0x0 + 0x1000 + registers + + + FMC + FSMC global interrupt + 48 + + + + BCR1 + BCR1 + SRAM/NOR-Flash chip-select control register + 1 + 0x0 + 0x20 + read-write + 0x000030D0 + + + CCLKEN + CCLKEN + 20 + 1 + + + CBURSTRW + CBURSTRW + 19 + 1 + + + ASYNCWAIT + ASYNCWAIT + 15 + 1 + + + EXTMOD + EXTMOD + 14 + 1 + + + WAITEN + WAITEN + 13 + 1 + + + WREN + WREN + 12 + 1 + + + WAITCFG + WAITCFG + 11 + 1 + + + WAITPOL + WAITPOL + 9 + 1 + + + BURSTEN + BURSTEN + 8 + 1 + + + FACCEN + FACCEN + 6 + 1 + + + MWID + MWID + 4 + 2 + + + MTYP + MTYP + 2 + 2 + + + MUXEN + MUXEN + 1 + 1 + + + MBKEN + MBKEN + 0 + 1 + + + + + BTR1 + BTR1 + SRAM/NOR-Flash chip-select timing register + 1 + 0x4 + 0x20 + read-write + 0xFFFFFFFF + + + ACCMOD + ACCMOD + 28 + 2 + + + DATLAT + DATLAT + 24 + 4 + + + CLKDIV + CLKDIV + 20 + 4 + + + BUSTURN + BUSTURN + 16 + 4 + + + DATAST + DATAST + 8 + 8 + + + ADDHLD + ADDHLD + 4 + 4 + + + ADDSET + ADDSET + 0 + 4 + + + + + BCR2 + BCR2 + SRAM/NOR-Flash chip-select control register + 2 + 0x8 + 0x20 + read-write + 0x000030D0 + + + CBURSTRW + CBURSTRW + 19 + 1 + + + ASYNCWAIT + ASYNCWAIT + 15 + 1 + + + EXTMOD + EXTMOD + 14 + 1 + + + WAITEN + WAITEN + 13 + 1 + + + WREN + WREN + 12 + 1 + + + WAITCFG + WAITCFG + 11 + 1 + + + WRAPMOD + WRAPMOD + 10 + 1 + + + WAITPOL + WAITPOL + 9 + 1 + + + BURSTEN + BURSTEN + 8 + 1 + + + FACCEN + FACCEN + 6 + 1 + + + MWID + MWID + 4 + 2 + + + MTYP + MTYP + 2 + 2 + + + MUXEN + MUXEN + 1 + 1 + + + MBKEN + MBKEN + 0 + 1 + + + + + BTR2 + BTR2 + SRAM/NOR-Flash chip-select timing register + 2 + 0xC + 0x20 + read-write + 0xFFFFFFFF + + + ACCMOD + ACCMOD + 28 + 2 + + + DATLAT + DATLAT + 24 + 4 + + + CLKDIV + CLKDIV + 20 + 4 + + + BUSTURN + BUSTURN + 16 + 4 + + + DATAST + DATAST + 8 + 8 + + + ADDHLD + ADDHLD + 4 + 4 + + + ADDSET + ADDSET + 0 + 4 + + + + + BCR3 + BCR3 + SRAM/NOR-Flash chip-select control register + 3 + 0x10 + 0x20 + read-write + 0x000030D0 + + + CBURSTRW + CBURSTRW + 19 + 1 + + + ASYNCWAIT + ASYNCWAIT + 15 + 1 + + + EXTMOD + EXTMOD + 14 + 1 + + + WAITEN + WAITEN + 13 + 1 + + + WREN + WREN + 12 + 1 + + + WAITCFG + WAITCFG + 11 + 1 + + + WRAPMOD + WRAPMOD + 10 + 1 + + + WAITPOL + WAITPOL + 9 + 1 + + + BURSTEN + BURSTEN + 8 + 1 + + + FACCEN + FACCEN + 6 + 1 + + + MWID + MWID + 4 + 2 + + + MTYP + MTYP + 2 + 2 + + + MUXEN + MUXEN + 1 + 1 + + + MBKEN + MBKEN + 0 + 1 + + + + + BTR3 + BTR3 + SRAM/NOR-Flash chip-select timing register + 3 + 0x14 + 0x20 + read-write + 0xFFFFFFFF + + + ACCMOD + ACCMOD + 28 + 2 + + + DATLAT + DATLAT + 24 + 4 + + + CLKDIV + CLKDIV + 20 + 4 + + + BUSTURN + BUSTURN + 16 + 4 + + + DATAST + DATAST + 8 + 8 + + + ADDHLD + ADDHLD + 4 + 4 + + + ADDSET + ADDSET + 0 + 4 + + + + + BCR4 + BCR4 + SRAM/NOR-Flash chip-select control register + 4 + 0x18 + 0x20 + read-write + 0x000030D0 + + + CBURSTRW + CBURSTRW + 19 + 1 + + + ASYNCWAIT + ASYNCWAIT + 15 + 1 + + + EXTMOD + EXTMOD + 14 + 1 + + + WAITEN + WAITEN + 13 + 1 + + + WREN + WREN + 12 + 1 + + + WAITCFG + WAITCFG + 11 + 1 + + + WRAPMOD + WRAPMOD + 10 + 1 + + + WAITPOL + WAITPOL + 9 + 1 + + + BURSTEN + BURSTEN + 8 + 1 + + + FACCEN + FACCEN + 6 + 1 + + + MWID + MWID + 4 + 2 + + + MTYP + MTYP + 2 + 2 + + + MUXEN + MUXEN + 1 + 1 + + + MBKEN + MBKEN + 0 + 1 + + + + + BTR4 + BTR4 + SRAM/NOR-Flash chip-select timing register + 4 + 0x1C + 0x20 + read-write + 0xFFFFFFFF + + + ACCMOD + ACCMOD + 28 + 2 + + + DATLAT + DATLAT + 24 + 4 + + + CLKDIV + CLKDIV + 20 + 4 + + + BUSTURN + BUSTURN + 16 + 4 + + + DATAST + DATAST + 8 + 8 + + + ADDHLD + ADDHLD + 4 + 4 + + + ADDSET + ADDSET + 0 + 4 + + + + + PCR2 + PCR2 + PC Card/NAND Flash control register + 2 + 0x60 + 0x20 + read-write + 0x00000018 + + + ECCPS + ECCPS + 17 + 3 + + + TAR + TAR + 13 + 4 + + + TCLR + TCLR + 9 + 4 + + + ECCEN + ECCEN + 6 + 1 + + + PWID + PWID + 4 + 2 + + + PTYP + PTYP + 3 + 1 + + + PBKEN + PBKEN + 2 + 1 + + + PWAITEN + PWAITEN + 1 + 1 + + + + + SR2 + SR2 + FIFO status and interrupt register + 2 + 0x64 + 0x20 + 0x00000040 + + + FEMPT + FEMPT + 6 + 1 + read-only + + + IFEN + IFEN + 5 + 1 + read-write + + + ILEN + ILEN + 4 + 1 + read-write + + + IREN + IREN + 3 + 1 + read-write + + + IFS + IFS + 2 + 1 + read-write + + + ILS + ILS + 1 + 1 + read-write + + + IRS + IRS + 0 + 1 + read-write + + + + + PMEM2 + PMEM2 + Common memory space timing register + 2 + 0x68 + 0x20 + read-write + 0xFCFCFCFC + + + MEMHIZx + MEMHIZx + 24 + 8 + + + MEMHOLDx + MEMHOLDx + 16 + 8 + + + MEMWAITx + MEMWAITx + 8 + 8 + + + MEMSETx + MEMSETx + 0 + 8 + + + + + PATT2 + PATT2 + Attribute memory space timing register + 2 + 0x6C + 0x20 + read-write + 0xFCFCFCFC + + + ATTHIZx + ATTHIZx + 24 + 8 + + + ATTHOLDx + ATTHOLDx + 16 + 8 + + + ATTWAITx + ATTWAITx + 8 + 8 + + + ATTSETx + ATTSETx + 0 + 8 + + + + + ECCR2 + ECCR2 + ECC result register 2 + 0x74 + 0x20 + read-only + 0x00000000 + + + ECCx + ECCx + 0 + 32 + + + + + PCR3 + PCR3 + PC Card/NAND Flash control register + 3 + 0x80 + 0x20 + read-write + 0x00000018 + + + ECCPS + ECCPS + 17 + 3 + + + TAR + TAR + 13 + 4 + + + TCLR + TCLR + 9 + 4 + + + ECCEN + ECCEN + 6 + 1 + + + PWID + PWID + 4 + 2 + + + PTYP + PTYP + 3 + 1 + + + PBKEN + PBKEN + 2 + 1 + + + PWAITEN + PWAITEN + 1 + 1 + + + + + SR3 + SR3 + FIFO status and interrupt register + 3 + 0x84 + 0x20 + 0x00000040 + + + FEMPT + FEMPT + 6 + 1 + read-only + + + IFEN + IFEN + 5 + 1 + read-write + + + ILEN + ILEN + 4 + 1 + read-write + + + IREN + IREN + 3 + 1 + read-write + + + IFS + IFS + 2 + 1 + read-write + + + ILS + ILS + 1 + 1 + read-write + + + IRS + IRS + 0 + 1 + read-write + + + + + PMEM3 + PMEM3 + Common memory space timing register + 3 + 0x88 + 0x20 + read-write + 0xFCFCFCFC + + + MEMHIZx + MEMHIZx + 24 + 8 + + + MEMHOLDx + MEMHOLDx + 16 + 8 + + + MEMWAITx + MEMWAITx + 8 + 8 + + + MEMSETx + MEMSETx + 0 + 8 + + + + + PATT3 + PATT3 + Attribute memory space timing register + 3 + 0x8C + 0x20 + read-write + 0xFCFCFCFC + + + ATTHIZx + ATTHIZx + 24 + 8 + + + ATTHOLDx + ATTHOLDx + 16 + 8 + + + ATTWAITx + ATTWAITx + 8 + 8 + + + ATTSETx + ATTSETx + 0 + 8 + + + + + ECCR3 + ECCR3 + ECC result register 3 + 0x94 + 0x20 + read-only + 0x00000000 + + + ECCx + ECCx + 0 + 32 + + + + + PCR4 + PCR4 + PC Card/NAND Flash control register + 4 + 0xA0 + 0x20 + read-write + 0x00000018 + + + ECCPS + ECCPS + 17 + 3 + + + TAR + TAR + 13 + 4 + + + TCLR + TCLR + 9 + 4 + + + ECCEN + ECCEN + 6 + 1 + + + PWID + PWID + 4 + 2 + + + PTYP + PTYP + 3 + 1 + + + PBKEN + PBKEN + 2 + 1 + + + PWAITEN + PWAITEN + 1 + 1 + + + + + SR4 + SR4 + FIFO status and interrupt register + 4 + 0xA4 + 0x20 + 0x00000040 + + + FEMPT + FEMPT + 6 + 1 + read-only + + + IFEN + IFEN + 5 + 1 + read-write + + + ILEN + ILEN + 4 + 1 + read-write + + + IREN + IREN + 3 + 1 + read-write + + + IFS + IFS + 2 + 1 + read-write + + + ILS + ILS + 1 + 1 + read-write + + + IRS + IRS + 0 + 1 + read-write + + + + + PMEM4 + PMEM4 + Common memory space timing register + 4 + 0xA8 + 0x20 + read-write + 0xFCFCFCFC + + + MEMHIZx + MEMHIZx + 24 + 8 + + + MEMHOLDx + MEMHOLDx + 16 + 8 + + + MEMWAITx + MEMWAITx + 8 + 8 + + + MEMSETx + MEMSETx + 0 + 8 + + + + + PATT4 + PATT4 + Attribute memory space timing register + 4 + 0xAC + 0x20 + read-write + 0xFCFCFCFC + + + ATTHIZx + ATTHIZx + 24 + 8 + + + ATTHOLDx + ATTHOLDx + 16 + 8 + + + ATTWAITx + ATTWAITx + 8 + 8 + + + ATTSETx + ATTSETx + 0 + 8 + + + + + PIO4 + PIO4 + I/O space timing register 4 + 0xB0 + 0x20 + read-write + 0xFCFCFCFC + + + IOHIZx + IOHIZx + 24 + 8 + + + IOHOLDx + IOHOLDx + 16 + 8 + + + IOWAITx + IOWAITx + 8 + 8 + + + IOSETx + IOSETx + 0 + 8 + + + + + BWTR1 + BWTR1 + SRAM/NOR-Flash write timing registers + 1 + 0x104 + 0x20 + read-write + 0x0FFFFFFF + + + ACCMOD + ACCMOD + 28 + 2 + + + DATLAT + DATLAT + 24 + 4 + + + CLKDIV + CLKDIV + 20 + 4 + + + BUSTURN + Bus turnaround phase + duration + 16 + 4 + + + DATAST + DATAST + 8 + 8 + + + ADDHLD + ADDHLD + 4 + 4 + + + ADDSET + ADDSET + 0 + 4 + + + + + BWTR2 + BWTR2 + SRAM/NOR-Flash write timing registers + 2 + 0x10C + 0x20 + read-write + 0x0FFFFFFF + + + ACCMOD + ACCMOD + 28 + 2 + + + DATLAT + DATLAT + 24 + 4 + + + CLKDIV + CLKDIV + 20 + 4 + + + BUSTURN + Bus turnaround phase + duration + 16 + 4 + + + DATAST + DATAST + 8 + 8 + + + ADDHLD + ADDHLD + 4 + 4 + + + ADDSET + ADDSET + 0 + 4 + + + + + BWTR3 + BWTR3 + SRAM/NOR-Flash write timing registers + 3 + 0x114 + 0x20 + read-write + 0x0FFFFFFF + + + ACCMOD + ACCMOD + 28 + 2 + + + DATLAT + DATLAT + 24 + 4 + + + CLKDIV + CLKDIV + 20 + 4 + + + BUSTURN + Bus turnaround phase + duration + 16 + 4 + + + DATAST + DATAST + 8 + 8 + + + ADDHLD + ADDHLD + 4 + 4 + + + ADDSET + ADDSET + 0 + 4 + + + + + BWTR4 + BWTR4 + SRAM/NOR-Flash write timing registers + 4 + 0x11C + 0x20 + read-write + 0x0FFFFFFF + + + ACCMOD + ACCMOD + 28 + 2 + + + DATLAT + DATLAT + 24 + 4 + + + CLKDIV + CLKDIV + 20 + 4 + + + BUSTURN + Bus turnaround phase + duration + 16 + 4 + + + DATAST + DATAST + 8 + 8 + + + ADDHLD + ADDHLD + 4 + 4 + + + ADDSET + ADDSET + 0 + 4 + + + + + + + SYSCFG_COMP_OPAMP + System configuration controller + SYSCFG + 0x40010000 + + 0x0 + 0x400 + registers + + + + SYSCFG_CFGR1 + SYSCFG_CFGR1 + configuration register 1 + 0x0 + 0x20 + read-write + 0x00000000 + + + MEM_MODE + Memory mapping selection + bits + 0 + 2 + + + USB_IT_RMP + USB interrupt remap + 5 + 1 + + + TIM1_ITR_RMP + Timer 1 ITR3 selection + 6 + 1 + + + DAC_TRIG_RMP + DAC trigger remap (when TSEL = + 001) + 7 + 1 + + + ADC24_DMA_RMP + ADC24 DMA remapping bit + 8 + 1 + + + TIM16_DMA_RMP + TIM16 DMA request remapping + bit + 11 + 1 + + + TIM17_DMA_RMP + TIM17 DMA request remapping + bit + 12 + 1 + + + TIM6_DAC1_DMA_RMP + TIM6 and DAC1 DMA request remapping + bit + 13 + 1 + + + TIM7_DAC2_DMA_RMP + TIM7 and DAC2 DMA request remapping + bit + 14 + 1 + + + I2C_PB6_FM + Fast Mode Plus (FM+) driving capability + activation bits. + 16 + 1 + + + I2C_PB7_FM + Fast Mode Plus (FM+) driving capability + activation bits. + 17 + 1 + + + I2C_PB8_FM + Fast Mode Plus (FM+) driving capability + activation bits. + 18 + 1 + + + I2C_PB9_FM + Fast Mode Plus (FM+) driving capability + activation bits. + 19 + 1 + + + I2C1_FM + I2C1 Fast Mode Plus + 20 + 1 + + + I2C2_FM + I2C2 Fast Mode Plus + 21 + 1 + + + ENCODER_MODE + Encoder mode + 22 + 2 + + + FPU_IT + Interrupt enable bits from + FPU + 26 + 6 + + + + + SYSCFG_EXTICR1 + SYSCFG_EXTICR1 + external interrupt configuration register + 1 + 0x8 + 0x20 + read-write + 0x0000 + + + EXTI3 + EXTI 3 configuration bits + 12 + 4 + + + EXTI2 + EXTI 2 configuration bits + 8 + 4 + + + EXTI1 + EXTI 1 configuration bits + 4 + 4 + + + EXTI0 + EXTI 0 configuration bits + 0 + 4 + + + + + SYSCFG_EXTICR2 + SYSCFG_EXTICR2 + external interrupt configuration register + 2 + 0xC + 0x20 + read-write + 0x0000 + + + EXTI7 + EXTI 7 configuration bits + 12 + 4 + + + EXTI6 + EXTI 6 configuration bits + 8 + 4 + + + EXTI5 + EXTI 5 configuration bits + 4 + 4 + + + EXTI4 + EXTI 4 configuration bits + 0 + 4 + + + + + SYSCFG_EXTICR3 + SYSCFG_EXTICR3 + external interrupt configuration register + 3 + 0x10 + 0x20 + read-write + 0x0000 + + + EXTI11 + EXTI 11 configuration bits + 12 + 4 + + + EXTI10 + EXTI 10 configuration bits + 8 + 4 + + + EXTI9 + EXTI 9 configuration bits + 4 + 4 + + + EXTI8 + EXTI 8 configuration bits + 0 + 4 + + + + + SYSCFG_EXTICR4 + SYSCFG_EXTICR4 + external interrupt configuration register + 4 + 0x14 + 0x20 + read-write + 0x0000 + + + EXTI15 + EXTI 15 configuration bits + 12 + 4 + + + EXTI14 + EXTI 14 configuration bits + 8 + 4 + + + EXTI13 + EXTI 13 configuration bits + 4 + 4 + + + EXTI12 + EXTI 12 configuration bits + 0 + 4 + + + + + SYSCFG_CFGR2 + SYSCFG_CFGR2 + configuration register 2 + 0x18 + 0x20 + read-write + 0x0000 + + + LOCUP_LOCK + Cortex-M0 LOCKUP bit enable + bit + 0 + 1 + + + SRAM_PARITY_LOCK + SRAM parity lock bit + 1 + 1 + + + PVD_LOCK + PVD lock enable bit + 2 + 1 + + + BYP_ADD_PAR + Bypass address bit 29 in parity + calculation + 4 + 1 + + + SRAM_PEF + SRAM parity flag + 8 + 1 + + + + + SYSCFG_RCR + SYSCFG_RCR + CCM SRAM protection register + 0x4 + 0x20 + read-write + 0x0000 + + + PAGE0_WP + CCM SRAM page write protection + bit + 0 + 1 + + + PAGE1_WP + CCM SRAM page write protection + bit + 1 + 1 + + + PAGE2_WP + CCM SRAM page write protection + bit + 2 + 1 + + + PAGE3_WP + CCM SRAM page write protection + bit + 3 + 1 + + + PAGE4_WP + CCM SRAM page write protection + bit + 4 + 1 + + + PAGE5_WP + CCM SRAM page write protection + bit + 5 + 1 + + + PAGE6_WP + CCM SRAM page write protection + bit + 6 + 1 + + + PAGE7_WP + CCM SRAM page write protection + bit + 7 + 1 + + + + + SYSCFG_CFGR3 + SYSCFG_CFGR3 + configuration register 3 + 0x50 + 0x20 + read-write + 0x0000 + + + DAC1_TRIG5_RMP + DAC1_CH1 / DAC1_CH2 Trigger + remap + 17 + 1 + + + DAC1_TRIG3_RMP + DAC1_CH1 / DAC1_CH2 Trigger + remap + 16 + 1 + + + ADC2_DMA_RMP_1 + ADC2 DMA controller remapping + bit + 9 + 1 + + + ADC2_DMA_RMP_0 + ADC2 DMA channel remapping + bit + 6 + 2 + + + I2C1_RX_DMA_RMP + I2C1_RX DMA remapping bit + 4 + 2 + + + SPI1_TX_DMA_RMP + SPI1_TX DMA remapping bit + 2 + 2 + + + SPI1_RX_DMA_RMP + SPI1_RX DMA remapping bit + 0 + 2 + + + + + OPAMP2_CSR + OPAMP2_CSR + OPAMP2 control register + 0x3C + 0x20 + 0x00000000 + + + OPAMP2EN + OPAMP2 enable + 0 + 1 + read-write + + + FORCE_VP + FORCE_VP + 1 + 1 + read-write + + + VP_SEL + OPAMP2 Non inverting input + selection + 2 + 2 + read-write + + + VM_SEL + OPAMP2 inverting input + selection + 5 + 2 + read-write + + + TCM_EN + Timer controlled Mux mode + enable + 7 + 1 + read-write + + + VMS_SEL + OPAMP2 inverting input secondary + selection + 8 + 1 + read-write + + + VPS_SEL + OPAMP2 Non inverting input secondary + selection + 9 + 2 + read-write + + + CALON + Calibration mode enable + 11 + 1 + read-write + + + CAL_SEL + Calibration selection + 12 + 2 + read-write + + + PGA_GAIN + Gain in PGA mode + 14 + 4 + read-write + + + USER_TRIM + User trimming enable + 18 + 1 + read-write + + + TRIMOFFSETP + Offset trimming value + (PMOS) + 19 + 5 + read-write + + + TRIMOFFSETN + Offset trimming value + (NMOS) + 24 + 5 + read-write + + + TSTREF + TSTREF + 29 + 1 + read-write + + + OUTCAL + OPAMP 2 ouput status flag + 30 + 1 + read-only + + + LOCK + OPAMP 2 lock + 31 + 1 + read-write + + + + + COMP2_CSR + COMP2_CSR + control and status register + 0x20 + 0x20 + 0x00000000 + + + COMP2EN + Comparator 2 enable + 0 + 1 + read-write + + + COMP2MODE + Comparator 2 mode + 2 + 2 + read-write + + + COMP2INSEL + Comparator 2 inverting input + selection + 4 + 3 + read-write + + + COMP2INPSEL + Comparator 2 non inverted input + selection + 7 + 1 + read-write + + + COMP2INMSEL + Comparator 1inverting input + selection + 9 + 1 + read-write + + + COMP2_OUT_SEL + Comparator 2 output + selection + 10 + 4 + read-write + + + COMP2POL + Comparator 2 output + polarity + 15 + 1 + read-write + + + COMP2HYST + Comparator 2 hysteresis + 16 + 2 + read-write + + + COMP2_BLANKING + Comparator 2 blanking + source + 18 + 3 + read-write + + + COMP2OUT + Comparator 2 output + 30 + 1 + read-only + + + COMP2LOCK + Comparator 2 lock + 31 + 1 + read-write + + + + + COMP4_CSR + COMP4_CSR + control and status register + 0x28 + 0x20 + 0x00000000 + + + COMP4EN + Comparator 4 enable + 0 + 1 + read-write + + + COMP4MODE + Comparator 4 mode + 2 + 2 + read-write + + + COMP4INSEL + Comparator 4 inverting input + selection + 4 + 3 + read-write + + + COMP4INPSEL + Comparator 4 non inverted input + selection + 7 + 1 + read-write + + + COM4WINMODE + Comparator 4 window mode + 9 + 1 + read-write + + + COMP4_OUT_SEL + Comparator 4 output + selection + 10 + 4 + read-write + + + COMP4POL + Comparator 4 output + polarity + 15 + 1 + read-write + + + COMP4HYST + Comparator 4 hysteresis + 16 + 2 + read-write + + + COMP4_BLANKING + Comparator 4 blanking + source + 18 + 3 + read-write + + + COMP4OUT + Comparator 4 output + 30 + 1 + read-only + + + COMP4LOCK + Comparator 4 lock + 31 + 1 + read-write + + + + + COMP6_CSR + COMP6_CSR + control and status register + 0x30 + 0x20 + 0x00000000 + + + COMP6EN + Comparator 6 enable + 0 + 1 + read-write + + + COMP6MODE + Comparator 6 mode + 2 + 2 + read-write + + + COMP6INSEL + Comparator 6 inverting input + selection + 4 + 3 + read-write + + + COMP6INPSEL + Comparator 6 non inverted input + selection + 7 + 1 + read-write + + + COM6WINMODE + Comparator 6 window mode + 9 + 1 + read-write + + + COMP6_OUT_SEL + Comparator 6 output + selection + 10 + 4 + read-write + + + COMP6POL + Comparator 6 output + polarity + 15 + 1 + read-write + + + COMP6HYST + Comparator 6 hysteresis + 16 + 2 + read-write + + + COMP6_BLANKING + Comparator 6 blanking + source + 18 + 3 + read-write + + + COMP6OUT + Comparator 6 output + 30 + 1 + read-only + + + COMP6LOCK + Comparator 6 lock + 31 + 1 + read-write + + + + + + + NVIC + Nested Vectored Interrupt + Controller + NVIC + 0xE000E100 + + 0x0 + 0x355 + registers + + + + ISER0 + ISER0 + Interrupt Set-Enable Register + 0x0 + 0x20 + read-write + 0x00000000 + + + SETENA + SETENA + 0 + 32 + + + + + ISER1 + ISER1 + Interrupt Set-Enable Register + 0x4 + 0x20 + read-write + 0x00000000 + + + SETENA + SETENA + 0 + 32 + + + + + ISER2 + ISER2 + Interrupt Set-Enable Register + 0x8 + 0x20 + read-write + 0x00000000 + + + SETENA + SETENA + 0 + 32 + + + + + ICER0 + ICER0 + Interrupt Clear-Enable + Register + 0x80 + 0x20 + read-write + 0x00000000 + + + CLRENA + CLRENA + 0 + 32 + + + + + ICER1 + ICER1 + Interrupt Clear-Enable + Register + 0x84 + 0x20 + read-write + 0x00000000 + + + CLRENA + CLRENA + 0 + 32 + + + + + ICER2 + ICER2 + Interrupt Clear-Enable + Register + 0x88 + 0x20 + read-write + 0x00000000 + + + CLRENA + CLRENA + 0 + 32 + + + + + ISPR0 + ISPR0 + Interrupt Set-Pending Register + 0x100 + 0x20 + read-write + 0x00000000 + + + SETPEND + SETPEND + 0 + 32 + + + + + ISPR1 + ISPR1 + Interrupt Set-Pending Register + 0x104 + 0x20 + read-write + 0x00000000 + + + SETPEND + SETPEND + 0 + 32 + + + + + ISPR2 + ISPR2 + Interrupt Set-Pending Register + 0x108 + 0x20 + read-write + 0x00000000 + + + SETPEND + SETPEND + 0 + 32 + + + + + ICPR0 + ICPR0 + Interrupt Clear-Pending + Register + 0x180 + 0x20 + read-write + 0x00000000 + + + CLRPEND + CLRPEND + 0 + 32 + + + + + ICPR1 + ICPR1 + Interrupt Clear-Pending + Register + 0x184 + 0x20 + read-write + 0x00000000 + + + CLRPEND + CLRPEND + 0 + 32 + + + + + ICPR2 + ICPR2 + Interrupt Clear-Pending + Register + 0x188 + 0x20 + read-write + 0x00000000 + + + CLRPEND + CLRPEND + 0 + 32 + + + + + IABR0 + IABR0 + Interrupt Active Bit Register + 0x200 + 0x20 + read-only + 0x00000000 + + + ACTIVE + ACTIVE + 0 + 32 + + + + + IABR1 + IABR1 + Interrupt Active Bit Register + 0x204 + 0x20 + read-only + 0x00000000 + + + ACTIVE + ACTIVE + 0 + 32 + + + + + IABR2 + IABR2 + Interrupt Active Bit Register + 0x208 + 0x20 + read-only + 0x00000000 + + + ACTIVE + ACTIVE + 0 + 32 + + + + + IPR0 + IPR0 + Interrupt Priority Register + 0x300 + 0x20 + read-write + 0x00000000 + + + IPR_N0 + IPR_N0 + 0 + 8 + + + IPR_N1 + IPR_N1 + 8 + 8 + + + IPR_N2 + IPR_N2 + 16 + 8 + + + IPR_N3 + IPR_N3 + 24 + 8 + + + + + IPR1 + IPR1 + Interrupt Priority Register + 0x304 + 0x20 + read-write + 0x00000000 + + + IPR_N0 + IPR_N0 + 0 + 8 + + + IPR_N1 + IPR_N1 + 8 + 8 + + + IPR_N2 + IPR_N2 + 16 + 8 + + + IPR_N3 + IPR_N3 + 24 + 8 + + + + + IPR2 + IPR2 + Interrupt Priority Register + 0x308 + 0x20 + read-write + 0x00000000 + + + IPR_N0 + IPR_N0 + 0 + 8 + + + IPR_N1 + IPR_N1 + 8 + 8 + + + IPR_N2 + IPR_N2 + 16 + 8 + + + IPR_N3 + IPR_N3 + 24 + 8 + + + + + IPR3 + IPR3 + Interrupt Priority Register + 0x30C + 0x20 + read-write + 0x00000000 + + + IPR_N0 + IPR_N0 + 0 + 8 + + + IPR_N1 + IPR_N1 + 8 + 8 + + + IPR_N2 + IPR_N2 + 16 + 8 + + + IPR_N3 + IPR_N3 + 24 + 8 + + + + + IPR4 + IPR4 + Interrupt Priority Register + 0x310 + 0x20 + read-write + 0x00000000 + + + IPR_N0 + IPR_N0 + 0 + 8 + + + IPR_N1 + IPR_N1 + 8 + 8 + + + IPR_N2 + IPR_N2 + 16 + 8 + + + IPR_N3 + IPR_N3 + 24 + 8 + + + + + IPR5 + IPR5 + Interrupt Priority Register + 0x314 + 0x20 + read-write + 0x00000000 + + + IPR_N0 + IPR_N0 + 0 + 8 + + + IPR_N1 + IPR_N1 + 8 + 8 + + + IPR_N2 + IPR_N2 + 16 + 8 + + + IPR_N3 + IPR_N3 + 24 + 8 + + + + + IPR6 + IPR6 + Interrupt Priority Register + 0x318 + 0x20 + read-write + 0x00000000 + + + IPR_N0 + IPR_N0 + 0 + 8 + + + IPR_N1 + IPR_N1 + 8 + 8 + + + IPR_N2 + IPR_N2 + 16 + 8 + + + IPR_N3 + IPR_N3 + 24 + 8 + + + + + IPR7 + IPR7 + Interrupt Priority Register + 0x31C + 0x20 + read-write + 0x00000000 + + + IPR_N0 + IPR_N0 + 0 + 8 + + + IPR_N1 + IPR_N1 + 8 + 8 + + + IPR_N2 + IPR_N2 + 16 + 8 + + + IPR_N3 + IPR_N3 + 24 + 8 + + + + + IPR8 + IPR8 + Interrupt Priority Register + 0x320 + 0x20 + read-write + 0x00000000 + + + IPR_N0 + IPR_N0 + 0 + 8 + + + IPR_N1 + IPR_N1 + 8 + 8 + + + IPR_N2 + IPR_N2 + 16 + 8 + + + IPR_N3 + IPR_N3 + 24 + 8 + + + + + IPR9 + IPR9 + Interrupt Priority Register + 0x324 + 0x20 + read-write + 0x00000000 + + + IPR_N0 + IPR_N0 + 0 + 8 + + + IPR_N1 + IPR_N1 + 8 + 8 + + + IPR_N2 + IPR_N2 + 16 + 8 + + + IPR_N3 + IPR_N3 + 24 + 8 + + + + + IPR10 + IPR10 + Interrupt Priority Register + 0x328 + 0x20 + read-write + 0x00000000 + + + IPR_N0 + IPR_N0 + 0 + 8 + + + IPR_N1 + IPR_N1 + 8 + 8 + + + IPR_N2 + IPR_N2 + 16 + 8 + + + IPR_N3 + IPR_N3 + 24 + 8 + + + + + IPR11 + IPR11 + Interrupt Priority Register + 0x32C + 0x20 + read-write + 0x00000000 + + + IPR_N0 + IPR_N0 + 0 + 8 + + + IPR_N1 + IPR_N1 + 8 + 8 + + + IPR_N2 + IPR_N2 + 16 + 8 + + + IPR_N3 + IPR_N3 + 24 + 8 + + + + + IPR12 + IPR12 + Interrupt Priority Register + 0x330 + 0x20 + read-write + 0x00000000 + + + IPR_N0 + IPR_N0 + 0 + 8 + + + IPR_N1 + IPR_N1 + 8 + 8 + + + IPR_N2 + IPR_N2 + 16 + 8 + + + IPR_N3 + IPR_N3 + 24 + 8 + + + + + IPR13 + IPR13 + Interrupt Priority Register + 0x334 + 0x20 + read-write + 0x00000000 + + + IPR_N0 + IPR_N0 + 0 + 8 + + + IPR_N1 + IPR_N1 + 8 + 8 + + + IPR_N2 + IPR_N2 + 16 + 8 + + + IPR_N3 + IPR_N3 + 24 + 8 + + + + + IPR14 + IPR14 + Interrupt Priority Register + 0x338 + 0x20 + read-write + 0x00000000 + + + IPR_N0 + IPR_N0 + 0 + 8 + + + IPR_N1 + IPR_N1 + 8 + 8 + + + IPR_N2 + IPR_N2 + 16 + 8 + + + IPR_N3 + IPR_N3 + 24 + 8 + + + + + IPR15 + IPR15 + Interrupt Priority Register + 0x33C + 0x20 + read-write + 0x00000000 + + + IPR_N0 + IPR_N0 + 0 + 8 + + + IPR_N1 + IPR_N1 + 8 + 8 + + + IPR_N2 + IPR_N2 + 16 + 8 + + + IPR_N3 + IPR_N3 + 24 + 8 + + + + + IPR16 + IPR16 + Interrupt Priority Register + 0x340 + 0x20 + read-write + 0x00000000 + + + IPR_N0 + IPR_N0 + 0 + 8 + + + IPR_N1 + IPR_N1 + 8 + 8 + + + IPR_N2 + IPR_N2 + 16 + 8 + + + IPR_N3 + IPR_N3 + 24 + 8 + + + + + IPR17 + IPR17 + Interrupt Priority Register + 0x344 + 0x20 + read-write + 0x00000000 + + + IPR_N0 + IPR_N0 + 0 + 8 + + + IPR_N1 + IPR_N1 + 8 + 8 + + + IPR_N2 + IPR_N2 + 16 + 8 + + + IPR_N3 + IPR_N3 + 24 + 8 + + + + + IPR18 + IPR18 + Interrupt Priority Register + 0x348 + 0x20 + read-write + 0x00000000 + + + IPR_N0 + IPR_N0 + 0 + 8 + + + IPR_N1 + IPR_N1 + 8 + 8 + + + IPR_N2 + IPR_N2 + 16 + 8 + + + IPR_N3 + IPR_N3 + 24 + 8 + + + + + IPR19 + IPR19 + Interrupt Priority Register + 0x34C + 0x20 + read-write + 0x00000000 + + + IPR_N0 + IPR_N0 + 0 + 8 + + + IPR_N1 + IPR_N1 + 8 + 8 + + + IPR_N2 + IPR_N2 + 16 + 8 + + + IPR_N3 + IPR_N3 + 24 + 8 + + + + + IPR20 + IPR20 + Interrupt Priority Register + 0x350 + 0x20 + read-write + 0x00000000 + + + IPR_N0 + IPR_N0 + 0 + 8 + + + IPR_N1 + IPR_N1 + 8 + 8 + + + IPR_N2 + IPR_N2 + 16 + 8 + + + IPR_N3 + IPR_N3 + 24 + 8 + + + + + + + FPU + Floting point unit + FPU + 0xE000EF34 + + 0x0 + 0xD + registers + + + FPU + Floating point unit interrupt + 81 + + + + FPCCR + FPCCR + Floating-point context control + register + 0x0 + 0x20 + read-write + 0x00000000 + + + LSPACT + LSPACT + 0 + 1 + + + USER + USER + 1 + 1 + + + THREAD + THREAD + 3 + 1 + + + HFRDY + HFRDY + 4 + 1 + + + MMRDY + MMRDY + 5 + 1 + + + BFRDY + BFRDY + 6 + 1 + + + MONRDY + MONRDY + 8 + 1 + + + LSPEN + LSPEN + 30 + 1 + + + ASPEN + ASPEN + 31 + 1 + + + + + FPCAR + FPCAR + Floating-point context address + register + 0x4 + 0x20 + read-write + 0x00000000 + + + ADDRESS + Location of unpopulated + floating-point + 3 + 29 + + + + + FPSCR + FPSCR + Floating-point status control + register + 0x8 + 0x20 + read-write + 0x00000000 + + + IOC + Invalid operation cumulative exception + bit + 0 + 1 + + + DZC + Division by zero cumulative exception + bit. + 1 + 1 + + + OFC + Overflow cumulative exception + bit + 2 + 1 + + + UFC + Underflow cumulative exception + bit + 3 + 1 + + + IXC + Inexact cumulative exception + bit + 4 + 1 + + + IDC + Input denormal cumulative exception + bit. + 7 + 1 + + + RMode + Rounding Mode control + field + 22 + 2 + + + FZ + Flush-to-zero mode control + bit: + 24 + 1 + + + DN + Default NaN mode control + bit + 25 + 1 + + + AHP + Alternative half-precision control + bit + 26 + 1 + + + V + Overflow condition code + flag + 28 + 1 + + + C + Carry condition code flag + 29 + 1 + + + Z + Zero condition code flag + 30 + 1 + + + N + Negative condition code + flag + 31 + 1 + + + + + + + MPU + Memory protection unit + MPU + 0xE000ED90 + + 0x0 + 0x15 + registers + + + + MPU_TYPER + MPU_TYPER + MPU type register + 0x0 + 0x20 + read-only + 0X00000800 + + + SEPARATE + Separate flag + 0 + 1 + + + DREGION + Number of MPU data regions + 8 + 8 + + + IREGION + Number of MPU instruction + regions + 16 + 8 + + + + + MPU_CTRL + MPU_CTRL + MPU control register + 0x4 + 0x20 + read-only + 0X00000000 + + + ENABLE + Enables the MPU + 0 + 1 + + + HFNMIENA + Enables the operation of MPU during hard + fault + 1 + 1 + + + PRIVDEFENA + Enable priviliged software access to + default memory map + 2 + 1 + + + + + MPU_RNR + MPU_RNR + MPU region number register + 0x8 + 0x20 + read-write + 0X00000000 + + + REGION + MPU region + 0 + 8 + + + + + MPU_RBAR + MPU_RBAR + MPU region base address + register + 0xC + 0x20 + read-write + 0X00000000 + + + REGION + MPU region field + 0 + 4 + + + VALID + MPU region number valid + 4 + 1 + + + ADDR + Region base address field + 5 + 27 + + + + + MPU_RASR + MPU_RASR + MPU region attribute and size + register + 0x10 + 0x20 + read-write + 0X00000000 + + + ENABLE + Region enable bit. + 0 + 1 + + + SIZE + Size of the MPU protection + region + 1 + 5 + + + SRD + Subregion disable bits + 8 + 8 + + + B + memory attribute + 16 + 1 + + + C + memory attribute + 17 + 1 + + + S + Shareable memory attribute + 18 + 1 + + + TEX + memory attribute + 19 + 3 + + + AP + Access permission + 24 + 3 + + + XN + Instruction access disable + bit + 28 + 1 + + + + + + + STK + SysTick timer + STK + 0xE000E010 + + 0x0 + 0x11 + registers + + + + CTRL + CTRL + SysTick control and status + register + 0x0 + 0x20 + read-write + 0X00000000 + + + ENABLE + Counter enable + 0 + 1 + + + TICKINT + SysTick exception request + enable + 1 + 1 + + + CLKSOURCE + Clock source selection + 2 + 1 + + + COUNTFLAG + COUNTFLAG + 16 + 1 + + + + + LOAD + LOAD + SysTick reload value register + 0x4 + 0x20 + read-write + 0X00000000 + + + RELOAD + RELOAD value + 0 + 24 + + + + + VAL + VAL + SysTick current value register + 0x8 + 0x20 + read-write + 0X00000000 + + + CURRENT + Current counter value + 0 + 24 + + + + + CALIB + CALIB + SysTick calibration value + register + 0xC + 0x20 + read-write + 0X00000000 + + + TENMS + Calibration value + 0 + 24 + + + SKEW + SKEW flag: Indicates whether the TENMS + value is exact + 30 + 1 + + + NOREF + NOREF flag. Reads as zero + 31 + 1 + + + + + + + SCB + System control block + SCB + 0xE000ED00 + + 0x0 + 0x41 + registers + + + + CPUID + CPUID + CPUID base register + 0x0 + 0x20 + read-only + 0x410FC241 + + + Revision + Revision number + 0 + 4 + + + PartNo + Part number of the + processor + 4 + 12 + + + Constant + Reads as 0xF + 16 + 4 + + + Variant + Variant number + 20 + 4 + + + Implementer + Implementer code + 24 + 8 + + + + + ICSR + ICSR + Interrupt control and state + register + 0x4 + 0x20 + read-write + 0x00000000 + + + VECTACTIVE + Active vector + 0 + 9 + + + RETTOBASE + Return to base level + 11 + 1 + + + VECTPENDING + Pending vector + 12 + 7 + + + ISRPENDING + Interrupt pending flag + 22 + 1 + + + PENDSTCLR + SysTick exception clear-pending + bit + 25 + 1 + + + PENDSTSET + SysTick exception set-pending + bit + 26 + 1 + + + PENDSVCLR + PendSV clear-pending bit + 27 + 1 + + + PENDSVSET + PendSV set-pending bit + 28 + 1 + + + NMIPENDSET + NMI set-pending bit. + 31 + 1 + + + + + VTOR + VTOR + Vector table offset register + 0x8 + 0x20 + read-write + 0x00000000 + + + TBLOFF + Vector table base offset + field + 9 + 21 + + + + + AIRCR + AIRCR + Application interrupt and reset control + register + 0xC + 0x20 + read-write + 0x00000000 + + + VECTRESET + VECTRESET + 0 + 1 + + + VECTCLRACTIVE + VECTCLRACTIVE + 1 + 1 + + + SYSRESETREQ + SYSRESETREQ + 2 + 1 + + + PRIGROUP + PRIGROUP + 8 + 3 + + + ENDIANESS + ENDIANESS + 15 + 1 + + + VECTKEYSTAT + Register key + 16 + 16 + + + + + SCR + SCR + System control register + 0x10 + 0x20 + read-write + 0x00000000 + + + SLEEPONEXIT + SLEEPONEXIT + 1 + 1 + + + SLEEPDEEP + SLEEPDEEP + 2 + 1 + + + SEVEONPEND + Send Event on Pending bit + 4 + 1 + + + + + CCR + CCR + Configuration and control + register + 0x14 + 0x20 + read-write + 0x00000000 + + + NONBASETHRDENA + Configures how the processor enters + Thread mode + 0 + 1 + + + USERSETMPEND + USERSETMPEND + 1 + 1 + + + UNALIGN__TRP + UNALIGN_ TRP + 3 + 1 + + + DIV_0_TRP + DIV_0_TRP + 4 + 1 + + + BFHFNMIGN + BFHFNMIGN + 8 + 1 + + + STKALIGN + STKALIGN + 9 + 1 + + + + + SHPR1 + SHPR1 + System handler priority + registers + 0x18 + 0x20 + read-write + 0x00000000 + + + PRI_4 + Priority of system handler + 4 + 0 + 8 + + + PRI_5 + Priority of system handler + 5 + 8 + 8 + + + PRI_6 + Priority of system handler + 6 + 16 + 8 + + + + + SHPR2 + SHPR2 + System handler priority + registers + 0x1C + 0x20 + read-write + 0x00000000 + + + PRI_11 + Priority of system handler + 11 + 24 + 8 + + + + + SHPR3 + SHPR3 + System handler priority + registers + 0x20 + 0x20 + read-write + 0x00000000 + + + PRI_14 + Priority of system handler + 14 + 16 + 8 + + + PRI_15 + Priority of system handler + 15 + 24 + 8 + + + + + SHCSR + SHCSR + System handler control and state + register + 0x24 + 0x20 + read-write + 0x00000000 + + + MEMFAULTACT + Memory management fault exception active + bit + 0 + 1 + + + BUSFAULTACT + Bus fault exception active + bit + 1 + 1 + + + USGFAULTACT + Usage fault exception active + bit + 3 + 1 + + + SVCALLACT + SVC call active bit + 7 + 1 + + + MONITORACT + Debug monitor active bit + 8 + 1 + + + PENDSVACT + PendSV exception active + bit + 10 + 1 + + + SYSTICKACT + SysTick exception active + bit + 11 + 1 + + + USGFAULTPENDED + Usage fault exception pending + bit + 12 + 1 + + + MEMFAULTPENDED + Memory management fault exception + pending bit + 13 + 1 + + + BUSFAULTPENDED + Bus fault exception pending + bit + 14 + 1 + + + SVCALLPENDED + SVC call pending bit + 15 + 1 + + + MEMFAULTENA + Memory management fault enable + bit + 16 + 1 + + + BUSFAULTENA + Bus fault enable bit + 17 + 1 + + + USGFAULTENA + Usage fault enable bit + 18 + 1 + + + + + CFSR_UFSR_BFSR_MMFSR + CFSR_UFSR_BFSR_MMFSR + Configurable fault status + register + 0x28 + 0x20 + read-write + 0x00000000 + + + IACCVIOL + Instruction access violation + flag + 1 + 1 + + + MUNSTKERR + Memory manager fault on unstacking for a + return from exception + 3 + 1 + + + MSTKERR + Memory manager fault on stacking for + exception entry. + 4 + 1 + + + MLSPERR + MLSPERR + 5 + 1 + + + MMARVALID + Memory Management Fault Address Register + (MMAR) valid flag + 7 + 1 + + + IBUSERR + Instruction bus error + 8 + 1 + + + PRECISERR + Precise data bus error + 9 + 1 + + + IMPRECISERR + Imprecise data bus error + 10 + 1 + + + UNSTKERR + Bus fault on unstacking for a return + from exception + 11 + 1 + + + STKERR + Bus fault on stacking for exception + entry + 12 + 1 + + + LSPERR + Bus fault on floating-point lazy state + preservation + 13 + 1 + + + BFARVALID + Bus Fault Address Register (BFAR) valid + flag + 15 + 1 + + + UNDEFINSTR + Undefined instruction usage + fault + 16 + 1 + + + INVSTATE + Invalid state usage fault + 17 + 1 + + + INVPC + Invalid PC load usage + fault + 18 + 1 + + + NOCP + No coprocessor usage + fault. + 19 + 1 + + + UNALIGNED + Unaligned access usage + fault + 24 + 1 + + + DIVBYZERO + Divide by zero usage fault + 25 + 1 + + + + + HFSR + HFSR + Hard fault status register + 0x2C + 0x20 + read-write + 0x00000000 + + + VECTTBL + Vector table hard fault + 1 + 1 + + + FORCED + Forced hard fault + 30 + 1 + + + DEBUG_VT + Reserved for Debug use + 31 + 1 + + + + + MMFAR + MMFAR + Memory management fault address + register + 0x34 + 0x20 + read-write + 0x00000000 + + + MMFAR + Memory management fault + address + 0 + 32 + + + + + BFAR + BFAR + Bus fault address register + 0x38 + 0x20 + read-write + 0x00000000 + + + BFAR + Bus fault address + 0 + 32 + + + + + AFSR + AFSR + Auxiliary fault status + register + 0x3C + 0x20 + read-write + 0x00000000 + + + IMPDEF + Implementation defined + 0 + 32 + + + + + + + NVIC_STIR + Nested vectored interrupt + controller + NVIC + 0xE000EF00 + + 0x0 + 0x5 + registers + + + + STIR + STIR + Software trigger interrupt + register + 0x0 + 0x20 + read-write + 0x00000000 + + + INTID + Software generated interrupt + ID + 0 + 9 + + + + + + + FPU_CPACR + Floating point unit CPACR + FPU + 0xE000ED88 + + 0x0 + 0x5 + registers + + + + CPACR + CPACR + Coprocessor access control + register + 0x0 + 0x20 + read-write + 0x0000000 + + + CP + CP + 20 + 4 + + + + + + + SCB_ACTRL + System control block ACTLR + SCB + 0xE000E008 + + 0x0 + 0x5 + registers + + + + ACTRL + ACTRL + Auxiliary control register + 0x0 + 0x20 + read-write + 0x00000000 + + + DISMCYCINT + DISMCYCINT + 0 + 1 + + + DISDEFWBUF + DISDEFWBUF + 1 + 1 + + + DISFOLD + DISFOLD + 2 + 1 + + + DISFPCA + DISFPCA + 8 + 1 + + + DISOOFP + DISOOFP + 9 + 1 + + + + + + + diff --git a/BMS_Testbench/BMS_Software_V1/STM32F302CCTX_FLASH.ld b/BMS_Testbench/BMS_Software_V1/STM32F302CCTX_FLASH.ld new file mode 100644 index 0000000..bef8c8f --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/STM32F302CCTX_FLASH.ld @@ -0,0 +1,185 @@ +/* +****************************************************************************** +** +** @file : LinkerScript.ld +** +** @author : Auto-generated by STM32CubeIDE +** +** @brief : Linker script for STM32F302CCTx Device from STM32F3 series +** 256Kbytes FLASH +** 40Kbytes RAM +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used +** +** Target : STMicroelectronics STM32 +** +** Distribution: The file is distributed as is, without any warranty +** of any kind. +** +****************************************************************************** +** @attention +** +** Copyright (c) 2023 STMicroelectronics. +** All rights reserved. +** +** This software is licensed under terms that can be found in the LICENSE file +** in the root directory of this software component. +** If no LICENSE file comes with this software, it is provided AS-IS. +** +****************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of "RAM" Ram type memory */ + +_Min_Heap_Size = 0x200; /* required amount of heap */ +_Min_Stack_Size = 0x400; /* required amount of stack */ + +/* Memories definition */ +MEMORY +{ + RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 40K + FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 256K +} + +/* Sections */ +SECTIONS +{ + /* The startup code into "FLASH" Rom type memory */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >FLASH + + /* The program code and other data into "FLASH" Rom type memory */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >FLASH + + /* Constant data into "FLASH" Rom type memory */ + .rodata : + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >FLASH + + .ARM.extab : { + . = ALIGN(4); + *(.ARM.extab* .gnu.linkonce.armextab.*) + . = ALIGN(4); + } >FLASH + + .ARM : { + . = ALIGN(4); + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + . = ALIGN(4); + } >FLASH + + .preinit_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + . = ALIGN(4); + } >FLASH + + .init_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + . = ALIGN(4); + } >FLASH + + .fini_array : + { + . = ALIGN(4); + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + . = ALIGN(4); + } >FLASH + + /* Used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections into "RAM" Ram type memory */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + *(.RamFunc) /* .RamFunc sections */ + *(.RamFunc*) /* .RamFunc* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + + } >RAM AT> FLASH + + /* Uninitialized data section into "RAM" Ram type memory */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss section */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough "RAM" Ram type memory left */ + ._user_heap_stack : + { + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(8); + } >RAM + + /* Remove information from the compiler libraries */ + /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } + + .ARM.attributes 0 : { *(.ARM.attributes) } +} diff --git a/BMS_Testbench/BMS_Software_V1/STM32F302CCTx_FLASH.ld b/BMS_Testbench/BMS_Software_V1/STM32F302CCTx_FLASH.ld new file mode 100644 index 0000000..4bddf4d --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/STM32F302CCTx_FLASH.ld @@ -0,0 +1,189 @@ +/* +****************************************************************************** +** + +** File : LinkerScript.ld +** +** Author : STM32CubeMX +** +** Abstract : Linker script for STM32F302CCTx series +** 256Kbytes FLASH and 40Kbytes RAM +** +** Set heap size, stack size and stack location according +** to application requirements. +** +** Set memory bank area and size if external memory is used. +** +** Target : STMicroelectronics STM32 +** +** Distribution: The file is distributed “as is,†without any warranty +** of any kind. +** +***************************************************************************** +** @attention +** +**

    © COPYRIGHT(c) 2019 STMicroelectronics

    +** +** Redistribution and use in source and binary forms, with or without modification, +** are permitted provided that the following conditions are met: +** 1. Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** 3. Neither the name of STMicroelectronics nor the names of its contributors +** may be used to endorse or promote products derived from this software +** without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +** +***************************************************************************** +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) + +/* Highest address of the user mode stack */ +_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of RAM */ +/* Generate a link error if heap and stack don't fit into RAM */ +_Min_Heap_Size = 0x200; /* required amount of heap */ +_Min_Stack_Size = 0x400; /* required amount of stack */ + +/* Specify the memory areas */ +MEMORY +{ +RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 40K +FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 256K +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into FLASH */ + .isr_vector : + { + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + . = ALIGN(4); + } >FLASH + + /* The program code and other data goes into FLASH */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + + KEEP (*(.init)) + KEEP (*(.fini)) + + . = ALIGN(4); + _etext = .; /* define a global symbols at end of code */ + } >FLASH + + /* Constant data goes into FLASH */ + .rodata : + { + . = ALIGN(4); + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + . = ALIGN(4); + } >FLASH + + .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH + .ARM : { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } >FLASH + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >FLASH + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } >FLASH + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } >FLASH + + /* used by the startup to initialize data */ + _sidata = LOADADDR(.data); + + /* Initialized data sections goes into RAM, load LMA copy after code */ + .data : + { + . = ALIGN(4); + _sdata = .; /* create a global symbol at data start */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + + . = ALIGN(4); + _edata = .; /* define a global symbol at data end */ + } >RAM AT> FLASH + + + /* Uninitialized data section */ + . = ALIGN(4); + .bss : + { + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; /* define a global symbol at bss start */ + __bss_start__ = _sbss; + *(.bss) + *(.bss*) + *(COMMON) + + . = ALIGN(4); + _ebss = .; /* define a global symbol at bss end */ + __bss_end__ = _ebss; + } >RAM + + /* User_heap_stack section, used to check that there is enough RAM left */ + ._user_heap_stack : + { + . = ALIGN(8); + PROVIDE ( end = . ); + PROVIDE ( _end = . ); + . = . + _Min_Heap_Size; + . = . + _Min_Stack_Size; + . = ALIGN(8); + } >RAM + + + + /* Remove information from the standard libraries */ + /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } + + .ARM.attributes 0 : { *(.ARM.attributes) } +} + + diff --git a/BMS_Testbench/BMS_Software_V1/STM32Make.make b/BMS_Testbench/BMS_Software_V1/STM32Make.make new file mode 100644 index 0000000..d0d120a --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/STM32Make.make @@ -0,0 +1,265 @@ +########################################################################################################################## +# File automatically-generated by STM32forVSCode +########################################################################################################################## + +# ------------------------------------------------ +# Generic Makefile (based on gcc) +# +# ChangeLog : +# 2017-02-10 - Several enhancements + project update mode +# 2015-07-22 - first version +# ------------------------------------------------ + +###################################### +# target +###################################### +TARGET = ams-slave-23 + + +###################################### +# building variables +###################################### +# debug build? +DEBUG = 1 +# optimization +OPT = -Og + + +####################################### +# paths +####################################### +# Build path +BUILD_DIR = build + +###################################### +# source +###################################### +# C sources +C_SOURCES = \ +Core/Src/ADBMS_Abstraction.c \ +Core/Src/ADBMS_LL_Driver.c \ +Core/Src/AMS_CAN.c \ +Core/Src/AMS_HighLevel.c \ +Core/Src/Testbench.c \ +Core/Src/main.c \ +Core/Src/stm32f3xx_hal_msp.c \ +Core/Src/stm32f3xx_it.c \ +Core/Src/syscalls.c \ +Core/Src/sysmem.c \ +Core/Src/system_stm32f3xx.c \ +Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c \ +Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c \ +Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c \ +Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c \ +Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c \ +Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c \ +Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c \ +Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c \ +Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c \ +Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c \ +Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c \ +Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c \ +Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c \ +Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c \ +Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c \ +Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c \ +Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.c \ +Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.c + + +CPP_SOURCES = \ + + +# ASM sources +ASM_SOURCES = \ +startup_stm32f302xc.s + + + +####################################### +# binaries +####################################### +PREFIX = arm-none-eabi- +POSTFIX = " +# The gcc compiler bin path can be either defined in make command via GCC_PATH variable (> make GCC_PATH=xxx) +# either it can be added to the PATH environment variable. +GCC_PATH="/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin +ifdef GCC_PATH +CXX = $(GCC_PATH)/$(PREFIX)g++$(POSTFIX) +CC = $(GCC_PATH)/$(PREFIX)gcc$(POSTFIX) +AS = $(GCC_PATH)/$(PREFIX)gcc$(POSTFIX) -x assembler-with-cpp +CP = $(GCC_PATH)/$(PREFIX)objcopy$(POSTFIX) +SZ = $(GCC_PATH)/$(PREFIX)size$(POSTFIX) +else +CXX = $(PREFIX)g++ +CC = $(PREFIX)gcc +AS = $(PREFIX)gcc -x assembler-with-cpp +CP = $(PREFIX)objcopy +SZ = $(PREFIX)size +endif +HEX = $(CP) -O ihex +BIN = $(CP) -O binary -S + +####################################### +# CFLAGS +####################################### +# cpu +CPU = -mcpu=cortex-m4 + +# fpu +FPU = -mfpu=fpv4-sp-d16 + +# float-abi +FLOAT-ABI = -mfloat-abi=hard + +# mcu +MCU = $(CPU) -mthumb $(FPU) $(FLOAT-ABI) + +# macros for gcc +# AS defines +AS_DEFS = + +# C defines +C_DEFS = \ +-DSTM32F302xC \ +-DUSE_HAL_DRIVER + + +# CXX defines +CXX_DEFS = \ +-DSTM32F302xC \ +-DUSE_HAL_DRIVER + + +# AS includes +AS_INCLUDES = \ + +# C includes +C_INCLUDES = \ +-ICore/Inc \ +-IDrivers/CMSIS/Device/ST/STM32F3xx/Include \ +-IDrivers/CMSIS/Include \ +-IDrivers/STM32F3xx_HAL_Driver/Inc \ +-IDrivers/STM32F3xx_HAL_Driver/Inc/Legacy + + + +# compile gcc flags +ASFLAGS = $(MCU) $(AS_DEFS) $(AS_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections + +CFLAGS = $(MCU) $(C_DEFS) $(C_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections + +CXXFLAGS = $(MCU) $(CXX_DEFS) $(C_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections -feliminate-unused-debug-types + +ifeq ($(DEBUG), 1) +CFLAGS += -g -gdwarf -ggdb +CXXFLAGS += -g -gdwarf -ggdb +endif + +# Add additional flags +CFLAGS += -Wall -fdata-sections -ffunction-sections +ASFLAGS += -Wall -fdata-sections -ffunction-sections +CXXFLAGS += + +# Generate dependency information +CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)" +CXXFLAGS += -MMD -MP -MF"$(@:%.o=%.d)" + +####################################### +# LDFLAGS +####################################### +# link script +LDSCRIPT = STM32F302CCTx_FLASH.ld + +# libraries +LIBS = -lc -lm -lnosys +LIBDIR = \ + + +# Additional LD Flags from config file +ADDITIONALLDFLAGS = -specs=nano.specs + +LDFLAGS = $(MCU) $(ADDITIONALLDFLAGS) -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections + +# default action: build all +all: $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).bin + + +####################################### +# build the application +####################################### +# list of cpp program objects +OBJECTS = $(addprefix $(BUILD_DIR)/,$(notdir $(CPP_SOURCES:.cpp=.o))) +vpath %.cpp $(sort $(dir $(CPP_SOURCES))) + +# list of C objects +OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(C_SOURCES:.c=.o))) +vpath %.c $(sort $(dir $(C_SOURCES))) + +# list of ASM program objects +# list of ASM program objects +UPPER_CASE_ASM_SOURCES = $(filter %.S,$(ASM_SOURCES)) +LOWER_CASE_ASM_SOURCES = $(filter %.s,$(ASM_SOURCES)) + +OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(UPPER_CASE_ASM_SOURCES:.S=.o))) +OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(LOWER_CASE_ASM_SOURCES:.s=.o))) +vpath %.s $(sort $(dir $(ASM_SOURCES))) + +$(BUILD_DIR)/%.o: %.cpp STM32Make.make | $(BUILD_DIR) + $(CXX) -c $(CXXFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.cpp=.lst)) $< -o $@ + +$(BUILD_DIR)/%.o: %.cxx STM32Make.make | $(BUILD_DIR) + $(CXX) -c $(CXXFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.cxx=.lst)) $< -o $@ + +$(BUILD_DIR)/%.o: %.c STM32Make.make | $(BUILD_DIR) + $(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) $< -o $@ + +$(BUILD_DIR)/%.o: %.s STM32Make.make | $(BUILD_DIR) + $(AS) -c $(CFLAGS) $< -o $@ + +$(BUILD_DIR)/%.o: %.S STM32Make.make | $(BUILD_DIR) + $(AS) -c $(CFLAGS) $< -o $@ + +$(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) STM32Make.make + $(CC) $(OBJECTS) $(LDFLAGS) -o $@ + $(SZ) $@ + +$(BUILD_DIR)/%.hex: $(BUILD_DIR)/%.elf | $(BUILD_DIR) + $(HEX) $< $@ + +$(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf | $(BUILD_DIR) + $(BIN) $< $@ + +$(BUILD_DIR): + mkdir $@ + +####################################### +# flash +####################################### +flash: $(BUILD_DIR)/$(TARGET).elf + "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/openocd/0.12.0-1.1/.content/bin/openocd" -f ./openocd.cfg -c "program $(BUILD_DIR)/$(TARGET).elf verify reset exit" + +####################################### +# erase +####################################### +erase: $(BUILD_DIR)/$(TARGET).elf + "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/openocd/0.12.0-1.1/.content/bin/openocd" -f ./openocd.cfg -c "init; reset halt; stm32f3x mass_erase 0; exit" + +####################################### +# clean up +####################################### +clean: + -rm -fR $(BUILD_DIR) + +####################################### +# custom makefile rules +####################################### + + + +####################################### +# dependencies +####################################### +-include $(wildcard $(BUILD_DIR)/*.d) + +# *** EOF *** \ No newline at end of file diff --git a/BMS_Testbench/BMS_Software_V1/ams-slave-23 Debug.launch b/BMS_Testbench/BMS_Software_V1/ams-slave-23 Debug.launch new file mode 100644 index 0000000..18bbbbf --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/ams-slave-23 Debug.launch @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BMS_Testbench/BMS_Software_V1/ams-slave-23.ioc b/BMS_Testbench/BMS_Software_V1/ams-slave-23.ioc new file mode 100644 index 0000000..47e2279 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/ams-slave-23.ioc @@ -0,0 +1,199 @@ +#MicroXplorer Configuration settings - do not modify +CAD.formats= +CAD.pinconfig= +CAD.provider= +CAN.ABOM=ENABLE +CAN.BS1=CAN_BS1_13TQ +CAN.BS2=CAN_BS2_2TQ +CAN.CalculateBaudRate=500000 +CAN.CalculateTimeBit=2000 +CAN.CalculateTimeQuantum=125.0 +CAN.IPParameters=CalculateTimeQuantum,CalculateTimeBit,CalculateBaudRate,BS1,BS2,Prescaler,NART,ABOM +CAN.NART=ENABLE +CAN.Prescaler=2 +File.Version=6 +KeepUserPlacement=false +Mcu.CPN=STM32F302CCT6 +Mcu.Family=STM32F3 +Mcu.IP0=CAN +Mcu.IP1=I2C1 +Mcu.IP2=I2C2 +Mcu.IP3=NVIC +Mcu.IP4=RCC +Mcu.IP5=SPI1 +Mcu.IP6=SYS +Mcu.IPNb=7 +Mcu.Name=STM32F302C(B-C)Tx +Mcu.Package=LQFP48 +Mcu.Pin0=PF0-OSC_IN +Mcu.Pin1=PF1-OSC_OUT +Mcu.Pin10=PA9 +Mcu.Pin11=PA10 +Mcu.Pin12=PA11 +Mcu.Pin13=PA12 +Mcu.Pin14=PA13 +Mcu.Pin15=PA14 +Mcu.Pin16=PA15 +Mcu.Pin17=PB3 +Mcu.Pin18=PB7 +Mcu.Pin2=PA4 +Mcu.Pin3=PA5 +Mcu.Pin4=PA6 +Mcu.Pin5=PA7 +Mcu.Pin6=PB13 +Mcu.Pin7=PB14 +Mcu.Pin8=PB15 +Mcu.Pin9=PA8 +Mcu.PinsNb=19 +Mcu.ThirdPartyNb=0 +Mcu.UserConstants= +Mcu.UserName=STM32F302CCTx +MxCube.Version=6.7.0 +MxDb.Version=DB.6.0.70 +NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.ForceEnableDMAVector=true +NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 +NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:false +NVIC.USB_LP_CAN_RX0_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true +NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +PA10.Locked=true +PA10.Mode=I2C +PA10.Signal=I2C2_SDA +PA11.Locked=true +PA11.Mode=CAN_Activate +PA11.Signal=CAN_RX +PA12.Locked=true +PA12.Mode=CAN_Activate +PA12.Signal=CAN_TX +PA13.Locked=true +PA13.Mode=Trace_Asynchronous_SW +PA13.Signal=SYS_JTMS-SWDIO +PA14.Locked=true +PA14.Mode=Trace_Asynchronous_SW +PA14.Signal=SYS_JTCK-SWCLK +PA15.GPIOParameters=GPIO_Label +PA15.GPIO_Label=TMP_SCL +PA15.Locked=true +PA15.Mode=I2C +PA15.Signal=I2C1_SCL +PA4.GPIOParameters=GPIO_Label +PA4.GPIO_Label=CSB +PA4.Locked=true +PA4.Signal=GPIO_Output +PA5.Locked=true +PA5.Mode=Full_Duplex_Master +PA5.Signal=SPI1_SCK +PA6.Locked=true +PA6.Mode=Full_Duplex_Master +PA6.Signal=SPI1_MISO +PA7.Locked=true +PA7.Mode=Full_Duplex_Master +PA7.Signal=SPI1_MOSI +PA8.GPIOParameters=GPIO_Label +PA8.GPIO_Label=Status_3 +PA8.Locked=true +PA8.Signal=GPIO_Output +PA9.Locked=true +PA9.Mode=I2C +PA9.Signal=I2C2_SCL +PB13.GPIOParameters=GPIO_Label +PB13.GPIO_Label=Status_0 +PB13.Locked=true +PB13.Signal=GPIO_Output +PB14.GPIOParameters=GPIO_Label +PB14.GPIO_Label=Status_1 +PB14.Locked=true +PB14.Signal=GPIO_Output +PB15.GPIOParameters=GPIO_Label +PB15.GPIO_Label=Status_2 +PB15.Locked=true +PB15.Signal=GPIO_Output +PB3.Mode=Trace_Asynchronous_SW +PB3.Signal=SYS_JTDO-TRACESWO +PB7.GPIOParameters=GPIO_Label +PB7.GPIO_Label=TMP_SDA +PB7.Locked=true +PB7.Mode=I2C +PB7.Signal=I2C1_SDA +PF0-OSC_IN.Mode=HSE-External-Oscillator +PF0-OSC_IN.Signal=RCC_OSC_IN +PF1-OSC_OUT.Mode=HSE-External-Oscillator +PF1-OSC_OUT.Signal=RCC_OSC_OUT +PinOutPanel.RotationAngle=0 +ProjectManager.AskForMigrate=true +ProjectManager.BackupPrevious=false +ProjectManager.CompilerOptimize=6 +ProjectManager.ComputerToolchain=false +ProjectManager.CoupleFile=false +ProjectManager.CustomerFirmwarePackage= +ProjectManager.DefaultFWLocation=true +ProjectManager.DeletePrevious=true +ProjectManager.DeviceId=STM32F302CCTx +ProjectManager.FirmwarePackage=STM32Cube FW_F3 V1.11.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=STM32CubeIDE +ProjectManager.ProjectBuild=false +ProjectManager.ProjectFileName=ams-slave-23.ioc +ProjectManager.ProjectName=ams-slave-23 +ProjectManager.ProjectStructure= +ProjectManager.RegisterCallBack= +ProjectManager.StackSize=0x400 +ProjectManager.TargetToolchain=Makefile +ProjectManager.ToolChainLocation= +ProjectManager.UnderRoot=false +ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_CAN_Init-CAN-false-HAL-true,4-MX_I2C1_Init-I2C1-false-HAL-true,5-MX_I2C2_Init-I2C2-false-HAL-true,6-MX_SPI1_Init-SPI1-false-HAL-true +RCC.ADC12outputFreq_Value=32000000 +RCC.AHBFreq_Value=16000000 +RCC.APB1Freq_Value=16000000 +RCC.APB1TimFreq_Value=16000000 +RCC.APB2Freq_Value=16000000 +RCC.APB2TimFreq_Value=16000000 +RCC.CortexFreq_Value=16000000 +RCC.FCLKCortexFreq_Value=16000000 +RCC.FamilyName=M +RCC.HCLKFreq_Value=16000000 +RCC.HSEPLLFreq_Value=16000000 +RCC.HSE_VALUE=16000000 +RCC.HSIPLLFreq_Value=4000000 +RCC.HSI_VALUE=8000000 +RCC.I2C1Freq_Value=8000000 +RCC.I2C2Freq_Value=8000000 +RCC.IPParameters=ADC12outputFreq_Value,AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSEPLLFreq_Value,HSE_VALUE,HSIPLLFreq_Value,HSI_VALUE,I2C1Freq_Value,I2C2Freq_Value,LSE_VALUE,LSI_VALUE,MCOFreq_Value,PLLCLKFreq_Value,PLLMCOFreq_Value,PLLSourceVirtual,RTCFreq_Value,RTCHSEDivFreq_Value,SYSCLKFreq_VALUE,SYSCLKSourceVirtual,TIM1Freq_Value,TIM2Freq_Value,USART1Freq_Value,USART2Freq_Value,USART3Freq_Value,USBFreq_Value,VCOOutput2Freq_Value +RCC.LSE_VALUE=32768 +RCC.LSI_VALUE=40000 +RCC.MCOFreq_Value=16000000 +RCC.PLLCLKFreq_Value=32000000 +RCC.PLLMCOFreq_Value=16000000 +RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE +RCC.RTCFreq_Value=40000 +RCC.RTCHSEDivFreq_Value=500000 +RCC.SYSCLKFreq_VALUE=16000000 +RCC.SYSCLKSourceVirtual=RCC_SYSCLKSOURCE_HSE +RCC.TIM1Freq_Value=16000000 +RCC.TIM2Freq_Value=16000000 +RCC.USART1Freq_Value=16000000 +RCC.USART2Freq_Value=16000000 +RCC.USART3Freq_Value=16000000 +RCC.USBFreq_Value=32000000 +RCC.VCOOutput2Freq_Value=16000000 +SPI1.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_32 +SPI1.CalculateBaudRate=500.0 KBits/s +SPI1.DataSize=SPI_DATASIZE_8BIT +SPI1.Direction=SPI_DIRECTION_2LINES +SPI1.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,BaudRatePrescaler,DataSize +SPI1.Mode=SPI_MODE_MASTER +SPI1.VirtualType=VM_MASTER +board=custom diff --git a/BMS_Testbench/BMS_Software_V1/build/ADBMS_Abstraction.d b/BMS_Testbench/BMS_Software_V1/build/ADBMS_Abstraction.d new file mode 100644 index 0000000..2806c08 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/ADBMS_Abstraction.d @@ -0,0 +1,63 @@ +build/ADBMS_Abstraction.o: Core/Src/ADBMS_Abstraction.c \ + Core/Inc/ADBMS_Abstraction.h Core/Inc/ADBMS_LL_Driver.h Core/Inc/main.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h \ + Core/Inc/stm32f3xx_hal_conf.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h \ + Drivers/CMSIS/Include/core_cm4.h Drivers/CMSIS/Include/cmsis_version.h \ + Drivers/CMSIS/Include/cmsis_compiler.h Drivers/CMSIS/Include/cmsis_gcc.h \ + Drivers/CMSIS/Include/mpu_armv7.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h \ + Core/Inc/ADBMS_CMD_MAKROS.h +Core/Inc/ADBMS_Abstraction.h: +Core/Inc/ADBMS_LL_Driver.h: +Core/Inc/main.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h: +Core/Inc/stm32f3xx_hal_conf.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h: +Drivers/CMSIS/Include/core_cm4.h: +Drivers/CMSIS/Include/cmsis_version.h: +Drivers/CMSIS/Include/cmsis_compiler.h: +Drivers/CMSIS/Include/cmsis_gcc.h: +Drivers/CMSIS/Include/mpu_armv7.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h: +Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h: +Core/Inc/ADBMS_CMD_MAKROS.h: diff --git a/BMS_Testbench/BMS_Software_V1/build/ADBMS_Abstraction.lst b/BMS_Testbench/BMS_Software_V1/build/ADBMS_Abstraction.lst new file mode 100644 index 0000000..150da99 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/ADBMS_Abstraction.lst @@ -0,0 +1,2389 @@ +ARM GAS /tmp/ccKQpHxH.s page 1 + + + 1 .cpu cortex-m4 + 2 .arch armv7e-m + 3 .fpu fpv4-sp-d16 + 4 .eabi_attribute 27, 1 + 5 .eabi_attribute 28, 1 + 6 .eabi_attribute 20, 1 + 7 .eabi_attribute 21, 1 + 8 .eabi_attribute 23, 3 + 9 .eabi_attribute 24, 1 + 10 .eabi_attribute 25, 1 + 11 .eabi_attribute 26, 1 + 12 .eabi_attribute 30, 1 + 13 .eabi_attribute 34, 1 + 14 .eabi_attribute 18, 4 + 15 .file "ADBMS_Abstraction.c" + 16 .text + 17 .Ltext0: + 18 .cfi_sections .debug_frame + 19 .file 1 "Core/Src/ADBMS_Abstraction.c" + 20 .section .text.amsWakeUp,"ax",%progbits + 21 .align 1 + 22 .global amsWakeUp + 23 .syntax unified + 24 .thumb + 25 .thumb_func + 27 amsWakeUp: + 28 .LFB131: + 1:Core/Src/ADBMS_Abstraction.c **** /* + 2:Core/Src/ADBMS_Abstraction.c **** * ADBMS_Abstraction.c + 3:Core/Src/ADBMS_Abstraction.c **** * + 4:Core/Src/ADBMS_Abstraction.c **** * Created on: 14.07.2022 + 5:Core/Src/ADBMS_Abstraction.c **** * Author: max + 6:Core/Src/ADBMS_Abstraction.c **** */ + 7:Core/Src/ADBMS_Abstraction.c **** + 8:Core/Src/ADBMS_Abstraction.c **** #include "ADBMS_Abstraction.h" + 9:Core/Src/ADBMS_Abstraction.c **** + 10:Core/Src/ADBMS_Abstraction.c **** + 11:Core/Src/ADBMS_Abstraction.c **** + 12:Core/Src/ADBMS_Abstraction.c **** uint8 numberofcells; + 13:Core/Src/ADBMS_Abstraction.c **** uint8 numberofauxchannels; + 14:Core/Src/ADBMS_Abstraction.c **** + 15:Core/Src/ADBMS_Abstraction.c **** uint8 initAMS(SPI_HandleTypeDef* hspi, uint8 numofcells, uint8 numofaux) + 16:Core/Src/ADBMS_Abstraction.c **** { + 17:Core/Src/ADBMS_Abstraction.c **** adbmsDriverInit(hspi); + 18:Core/Src/ADBMS_Abstraction.c **** numberofcells = numofcells; + 19:Core/Src/ADBMS_Abstraction.c **** numberofauxchannels = numofaux; + 20:Core/Src/ADBMS_Abstraction.c **** + 21:Core/Src/ADBMS_Abstraction.c **** + 22:Core/Src/ADBMS_Abstraction.c **** amsWakeUp(); + 23:Core/Src/ADBMS_Abstraction.c **** amsStopBalancing(); + 24:Core/Src/ADBMS_Abstraction.c **** amsConfigOverVoltage(DEFAULT_OV); + 25:Core/Src/ADBMS_Abstraction.c **** amsConfigUnderVoltage(DEFAULT_UV); + 26:Core/Src/ADBMS_Abstraction.c **** amsConfigAuxMeasurement(0xFFFF); + 27:Core/Src/ADBMS_Abstraction.c **** + 28:Core/Src/ADBMS_Abstraction.c **** return 0; + 29:Core/Src/ADBMS_Abstraction.c **** } + 30:Core/Src/ADBMS_Abstraction.c **** + ARM GAS /tmp/ccKQpHxH.s page 2 + + + 31:Core/Src/ADBMS_Abstraction.c **** uint8 amsWakeUp() + 32:Core/Src/ADBMS_Abstraction.c **** { + 29 .loc 1 32 1 view -0 + 30 .cfi_startproc + 31 @ args = 0, pretend = 0, frame = 8 + 32 @ frame_needed = 0, uses_anonymous_args = 0 + 33 0000 00B5 push {lr} + 34 .cfi_def_cfa_offset 4 + 35 .cfi_offset 14, -4 + 36 0002 83B0 sub sp, sp, #12 + 37 .cfi_def_cfa_offset 16 + 33:Core/Src/ADBMS_Abstraction.c **** uint8 buf[6]; + 38 .loc 1 33 2 view .LVU1 + 34:Core/Src/ADBMS_Abstraction.c **** readCMD(RDCFGA, buf, 6); + 39 .loc 1 34 2 view .LVU2 + 40 0004 0622 movs r2, #6 + 41 0006 6946 mov r1, sp + 42 0008 0220 movs r0, #2 + 43 000a FFF7FEFF bl readCMD + 44 .LVL0: + 35:Core/Src/ADBMS_Abstraction.c **** return 0; + 45 .loc 1 35 2 view .LVU3 + 36:Core/Src/ADBMS_Abstraction.c **** } + 46 .loc 1 36 1 is_stmt 0 view .LVU4 + 47 000e 0020 movs r0, #0 + 48 0010 03B0 add sp, sp, #12 + 49 .cfi_def_cfa_offset 4 + 50 @ sp needed + 51 0012 5DF804FB ldr pc, [sp], #4 + 52 .cfi_endproc + 53 .LFE131: + 55 .section .text.amsConfigCellMeasurement,"ax",%progbits + 56 .align 1 + 57 .global amsConfigCellMeasurement + 58 .syntax unified + 59 .thumb + 60 .thumb_func + 62 amsConfigCellMeasurement: + 63 .LVL1: + 64 .LFB133: + 37:Core/Src/ADBMS_Abstraction.c **** + 38:Core/Src/ADBMS_Abstraction.c **** uint8 amsCellMeasurement(Cell_Module *module) + 39:Core/Src/ADBMS_Abstraction.c **** { + 40:Core/Src/ADBMS_Abstraction.c **** uint8_t rxbuffer[CV_GROUP_A_SIZE]; + 41:Core/Src/ADBMS_Abstraction.c **** writeCMD((ADCV | CH000 | MD10), rxbuffer, 0); + 42:Core/Src/ADBMS_Abstraction.c **** mcuDelay(5); + 43:Core/Src/ADBMS_Abstraction.c **** amsReadCellVoltages(module); + 44:Core/Src/ADBMS_Abstraction.c **** return 0; + 45:Core/Src/ADBMS_Abstraction.c **** } + 46:Core/Src/ADBMS_Abstraction.c **** + 47:Core/Src/ADBMS_Abstraction.c **** uint8 amsConfigCellMeasurement(uint8 numberofChannels) + 48:Core/Src/ADBMS_Abstraction.c **** { + 65 .loc 1 48 1 is_stmt 1 view -0 + 66 .cfi_startproc + 67 @ args = 0, pretend = 0, frame = 0 + 68 @ frame_needed = 0, uses_anonymous_args = 0 + 69 @ link register save eliminated. + ARM GAS /tmp/ccKQpHxH.s page 3 + + + 49:Core/Src/ADBMS_Abstraction.c **** numberofcells = numberofChannels; + 70 .loc 1 49 2 view .LVU6 + 71 .loc 1 49 16 is_stmt 0 view .LVU7 + 72 0000 014B ldr r3, .L4 + 73 0002 1870 strb r0, [r3] + 50:Core/Src/ADBMS_Abstraction.c **** return 0; + 74 .loc 1 50 2 is_stmt 1 view .LVU8 + 51:Core/Src/ADBMS_Abstraction.c **** } + 75 .loc 1 51 1 is_stmt 0 view .LVU9 + 76 0004 0020 movs r0, #0 + 77 .LVL2: + 78 .loc 1 51 1 view .LVU10 + 79 0006 7047 bx lr + 80 .L5: + 81 .align 2 + 82 .L4: + 83 0008 00000000 .word numberofcells + 84 .cfi_endproc + 85 .LFE133: + 87 .section .text.amsAuxMeasurement,"ax",%progbits + 88 .align 1 + 89 .global amsAuxMeasurement + 90 .syntax unified + 91 .thumb + 92 .thumb_func + 94 amsAuxMeasurement: + 95 .LVL3: + 96 .LFB134: + 52:Core/Src/ADBMS_Abstraction.c **** + 53:Core/Src/ADBMS_Abstraction.c **** uint8 amsAuxMeasurement(Cell_Module *module) + 54:Core/Src/ADBMS_Abstraction.c **** { + 97 .loc 1 54 1 is_stmt 1 view -0 + 98 .cfi_startproc + 99 @ args = 0, pretend = 0, frame = 8 + 100 @ frame_needed = 0, uses_anonymous_args = 0 + 101 .loc 1 54 1 is_stmt 0 view .LVU12 + 102 0000 10B5 push {r4, lr} + 103 .cfi_def_cfa_offset 8 + 104 .cfi_offset 4, -8 + 105 .cfi_offset 14, -4 + 106 0002 82B0 sub sp, sp, #8 + 107 .cfi_def_cfa_offset 16 + 108 0004 0446 mov r4, r0 + 55:Core/Src/ADBMS_Abstraction.c **** uint8 args; + 109 .loc 1 55 2 is_stmt 1 view .LVU13 + 56:Core/Src/ADBMS_Abstraction.c **** uint8 rxbuf[AUX_GROUP_A_SIZE]; + 110 .loc 1 56 2 view .LVU14 + 57:Core/Src/ADBMS_Abstraction.c **** writeCMD(ADAX | MD01 | CHG000, &args, 0); + 111 .loc 1 57 2 view .LVU15 + 112 0006 0022 movs r2, #0 + 113 0008 0DF10701 add r1, sp, #7 + 114 000c 4FF49C60 mov r0, #1248 + 115 .LVL4: + 116 .loc 1 57 2 is_stmt 0 view .LVU16 + 117 0010 FFF7FEFF bl writeCMD + 118 .LVL5: + 58:Core/Src/ADBMS_Abstraction.c **** + ARM GAS /tmp/ccKQpHxH.s page 4 + + + 59:Core/Src/ADBMS_Abstraction.c **** mcuDelay(5); + 119 .loc 1 59 2 is_stmt 1 view .LVU17 + 120 0014 0520 movs r0, #5 + 121 0016 FFF7FEFF bl mcuDelay + 122 .LVL6: + 60:Core/Src/ADBMS_Abstraction.c **** + 61:Core/Src/ADBMS_Abstraction.c **** readCMD(RDAUXA, rxbuf, AUX_GROUP_A_SIZE); + 123 .loc 1 61 2 view .LVU18 + 124 001a 0622 movs r2, #6 + 125 001c 6946 mov r1, sp + 126 001e 0C20 movs r0, #12 + 127 0020 FFF7FEFF bl readCMD + 128 .LVL7: + 62:Core/Src/ADBMS_Abstraction.c **** + 63:Core/Src/ADBMS_Abstraction.c **** module->auxVoltages[0] = rxbuf[0] | (rxbuf[1]<<8); + 129 .loc 1 63 2 view .LVU19 + 130 .loc 1 63 32 is_stmt 0 view .LVU20 + 131 0024 9DF80030 ldrb r3, [sp] @ zero_extendqisi2 + 132 .loc 1 63 44 view .LVU21 + 133 0028 9DF80120 ldrb r2, [sp, #1] @ zero_extendqisi2 + 134 .loc 1 63 36 view .LVU22 + 135 002c 43EA0223 orr r3, r3, r2, lsl #8 + 136 .loc 1 63 25 view .LVU23 + 137 0030 A384 strh r3, [r4, #36] @ movhi + 64:Core/Src/ADBMS_Abstraction.c **** module->auxVoltages[1] = rxbuf[2] | (rxbuf[3]<<8); + 138 .loc 1 64 2 is_stmt 1 view .LVU24 + 139 .loc 1 64 32 is_stmt 0 view .LVU25 + 140 0032 9DF80230 ldrb r3, [sp, #2] @ zero_extendqisi2 + 141 .loc 1 64 44 view .LVU26 + 142 0036 9DF80320 ldrb r2, [sp, #3] @ zero_extendqisi2 + 143 .loc 1 64 36 view .LVU27 + 144 003a 43EA0223 orr r3, r3, r2, lsl #8 + 145 .loc 1 64 25 view .LVU28 + 146 003e E384 strh r3, [r4, #38] @ movhi + 65:Core/Src/ADBMS_Abstraction.c **** module->auxVoltages[2] = rxbuf[4] | (rxbuf[5]<<8); + 147 .loc 1 65 2 is_stmt 1 view .LVU29 + 148 .loc 1 65 32 is_stmt 0 view .LVU30 + 149 0040 9DF80430 ldrb r3, [sp, #4] @ zero_extendqisi2 + 150 .loc 1 65 44 view .LVU31 + 151 0044 9DF80520 ldrb r2, [sp, #5] @ zero_extendqisi2 + 152 .loc 1 65 36 view .LVU32 + 153 0048 43EA0223 orr r3, r3, r2, lsl #8 + 154 .loc 1 65 25 view .LVU33 + 155 004c 2385 strh r3, [r4, #40] @ movhi + 66:Core/Src/ADBMS_Abstraction.c **** + 67:Core/Src/ADBMS_Abstraction.c **** readCMD(RDAUXB, rxbuf, AUX_GROUP_A_SIZE); + 156 .loc 1 67 2 is_stmt 1 view .LVU34 + 157 004e 0622 movs r2, #6 + 158 0050 6946 mov r1, sp + 159 0052 0E20 movs r0, #14 + 160 0054 FFF7FEFF bl readCMD + 161 .LVL8: + 68:Core/Src/ADBMS_Abstraction.c **** + 69:Core/Src/ADBMS_Abstraction.c **** module->auxVoltages[3] = rxbuf[0] | (rxbuf[1]<<8); + 162 .loc 1 69 2 view .LVU35 + 163 .loc 1 69 32 is_stmt 0 view .LVU36 + 164 0058 9DF80030 ldrb r3, [sp] @ zero_extendqisi2 + ARM GAS /tmp/ccKQpHxH.s page 5 + + + 165 .loc 1 69 44 view .LVU37 + 166 005c 9DF80120 ldrb r2, [sp, #1] @ zero_extendqisi2 + 167 .loc 1 69 36 view .LVU38 + 168 0060 43EA0223 orr r3, r3, r2, lsl #8 + 169 .loc 1 69 25 view .LVU39 + 170 0064 6385 strh r3, [r4, #42] @ movhi + 70:Core/Src/ADBMS_Abstraction.c **** module->auxVoltages[4] = rxbuf[2] | (rxbuf[3]<<8); + 171 .loc 1 70 2 is_stmt 1 view .LVU40 + 172 .loc 1 70 32 is_stmt 0 view .LVU41 + 173 0066 9DF80230 ldrb r3, [sp, #2] @ zero_extendqisi2 + 174 .loc 1 70 44 view .LVU42 + 175 006a 9DF80320 ldrb r2, [sp, #3] @ zero_extendqisi2 + 176 .loc 1 70 36 view .LVU43 + 177 006e 43EA0223 orr r3, r3, r2, lsl #8 + 178 .loc 1 70 25 view .LVU44 + 179 0072 A385 strh r3, [r4, #44] @ movhi + 71:Core/Src/ADBMS_Abstraction.c **** module->refVoltage = rxbuf[4] | (rxbuf[5]<<8); + 180 .loc 1 71 2 is_stmt 1 view .LVU45 + 181 .loc 1 71 28 is_stmt 0 view .LVU46 + 182 0074 9DF80430 ldrb r3, [sp, #4] @ zero_extendqisi2 + 183 .loc 1 71 40 view .LVU47 + 184 0078 9DF80520 ldrb r2, [sp, #5] @ zero_extendqisi2 + 185 .loc 1 71 32 view .LVU48 + 186 007c 43EA0223 orr r3, r3, r2, lsl #8 + 187 .loc 1 71 21 view .LVU49 + 188 0080 A4F84030 strh r3, [r4, #64] @ movhi + 72:Core/Src/ADBMS_Abstraction.c **** + 73:Core/Src/ADBMS_Abstraction.c **** readCMD(RDAUXC, rxbuf, AUX_GROUP_A_SIZE); + 189 .loc 1 73 2 is_stmt 1 view .LVU50 + 190 0084 0622 movs r2, #6 + 191 0086 6946 mov r1, sp + 192 0088 0D20 movs r0, #13 + 193 008a FFF7FEFF bl readCMD + 194 .LVL9: + 74:Core/Src/ADBMS_Abstraction.c **** + 75:Core/Src/ADBMS_Abstraction.c **** module->auxVoltages[5] = rxbuf[0] | (rxbuf[1]<<8); + 195 .loc 1 75 2 view .LVU51 + 196 .loc 1 75 32 is_stmt 0 view .LVU52 + 197 008e 9DF80030 ldrb r3, [sp] @ zero_extendqisi2 + 198 .loc 1 75 44 view .LVU53 + 199 0092 9DF80120 ldrb r2, [sp, #1] @ zero_extendqisi2 + 200 .loc 1 75 36 view .LVU54 + 201 0096 43EA0223 orr r3, r3, r2, lsl #8 + 202 .loc 1 75 25 view .LVU55 + 203 009a E385 strh r3, [r4, #46] @ movhi + 76:Core/Src/ADBMS_Abstraction.c **** module->auxVoltages[6] = rxbuf[2] | (rxbuf[3]<<8); + 204 .loc 1 76 2 is_stmt 1 view .LVU56 + 205 .loc 1 76 32 is_stmt 0 view .LVU57 + 206 009c 9DF80230 ldrb r3, [sp, #2] @ zero_extendqisi2 + 207 .loc 1 76 44 view .LVU58 + 208 00a0 9DF80320 ldrb r2, [sp, #3] @ zero_extendqisi2 + 209 .loc 1 76 36 view .LVU59 + 210 00a4 43EA0223 orr r3, r3, r2, lsl #8 + 211 .loc 1 76 25 view .LVU60 + 212 00a8 2386 strh r3, [r4, #48] @ movhi + 77:Core/Src/ADBMS_Abstraction.c **** module->auxVoltages[7] = rxbuf[4] | (rxbuf[5]<<8); + 213 .loc 1 77 2 is_stmt 1 view .LVU61 + ARM GAS /tmp/ccKQpHxH.s page 6 + + + 214 .loc 1 77 32 is_stmt 0 view .LVU62 + 215 00aa 9DF80430 ldrb r3, [sp, #4] @ zero_extendqisi2 + 216 .loc 1 77 44 view .LVU63 + 217 00ae 9DF80520 ldrb r2, [sp, #5] @ zero_extendqisi2 + 218 .loc 1 77 36 view .LVU64 + 219 00b2 43EA0223 orr r3, r3, r2, lsl #8 + 220 .loc 1 77 25 view .LVU65 + 221 00b6 6386 strh r3, [r4, #50] @ movhi + 78:Core/Src/ADBMS_Abstraction.c **** + 79:Core/Src/ADBMS_Abstraction.c **** readCMD(RDAUXD, rxbuf, AUX_GROUP_A_SIZE); + 222 .loc 1 79 2 is_stmt 1 view .LVU66 + 223 00b8 0622 movs r2, #6 + 224 00ba 6946 mov r1, sp + 225 00bc 0F20 movs r0, #15 + 226 00be FFF7FEFF bl readCMD + 227 .LVL10: + 80:Core/Src/ADBMS_Abstraction.c **** + 81:Core/Src/ADBMS_Abstraction.c **** module->auxVoltages[8] = rxbuf[0] | (rxbuf[1]<<8); + 228 .loc 1 81 2 view .LVU67 + 229 .loc 1 81 32 is_stmt 0 view .LVU68 + 230 00c2 9DF80030 ldrb r3, [sp] @ zero_extendqisi2 + 231 .loc 1 81 44 view .LVU69 + 232 00c6 9DF80120 ldrb r2, [sp, #1] @ zero_extendqisi2 + 233 .loc 1 81 36 view .LVU70 + 234 00ca 43EA0223 orr r3, r3, r2, lsl #8 + 235 .loc 1 81 25 view .LVU71 + 236 00ce A386 strh r3, [r4, #52] @ movhi + 82:Core/Src/ADBMS_Abstraction.c **** + 83:Core/Src/ADBMS_Abstraction.c **** return 0; + 237 .loc 1 83 2 is_stmt 1 view .LVU72 + 84:Core/Src/ADBMS_Abstraction.c **** } + 238 .loc 1 84 1 is_stmt 0 view .LVU73 + 239 00d0 0020 movs r0, #0 + 240 00d2 02B0 add sp, sp, #8 + 241 .cfi_def_cfa_offset 8 + 242 @ sp needed + 243 00d4 10BD pop {r4, pc} + 244 .loc 1 84 1 view .LVU74 + 245 .cfi_endproc + 246 .LFE134: + 248 .section .text.amsInternalStatusMeasurement,"ax",%progbits + 249 .align 1 + 250 .global amsInternalStatusMeasurement + 251 .syntax unified + 252 .thumb + 253 .thumb_func + 255 amsInternalStatusMeasurement: + 256 .LVL11: + 257 .LFB135: + 85:Core/Src/ADBMS_Abstraction.c **** + 86:Core/Src/ADBMS_Abstraction.c **** uint8 amsInternalStatusMeasurement(Cell_Module *module) + 87:Core/Src/ADBMS_Abstraction.c **** { + 258 .loc 1 87 1 is_stmt 1 view -0 + 259 .cfi_startproc + 260 @ args = 0, pretend = 0, frame = 8 + 261 @ frame_needed = 0, uses_anonymous_args = 0 + 262 .loc 1 87 1 is_stmt 0 view .LVU76 + ARM GAS /tmp/ccKQpHxH.s page 7 + + + 263 0000 10B5 push {r4, lr} + 264 .cfi_def_cfa_offset 8 + 265 .cfi_offset 4, -8 + 266 .cfi_offset 14, -4 + 267 0002 82B0 sub sp, sp, #8 + 268 .cfi_def_cfa_offset 16 + 269 0004 0446 mov r4, r0 + 88:Core/Src/ADBMS_Abstraction.c **** uint8 rxbuffer[STATUS_GROUP_A_SIZE]; + 270 .loc 1 88 2 is_stmt 1 view .LVU77 + 89:Core/Src/ADBMS_Abstraction.c **** writeCMD(ADSTAT | MD01 | CHST000, rxbuffer, STATUS_GROUP_A_SIZE); + 271 .loc 1 89 2 view .LVU78 + 272 0006 0622 movs r2, #6 + 273 0008 6946 mov r1, sp + 274 000a 4FF49D60 mov r0, #1256 + 275 .LVL12: + 276 .loc 1 89 2 is_stmt 0 view .LVU79 + 277 000e FFF7FEFF bl writeCMD + 278 .LVL13: + 90:Core/Src/ADBMS_Abstraction.c **** mcuDelay(5); + 279 .loc 1 90 2 is_stmt 1 view .LVU80 + 280 0012 0520 movs r0, #5 + 281 0014 FFF7FEFF bl mcuDelay + 282 .LVL14: + 91:Core/Src/ADBMS_Abstraction.c **** + 92:Core/Src/ADBMS_Abstraction.c **** readCMD(RDSTATA, rxbuffer, STATUS_GROUP_A_SIZE); + 283 .loc 1 92 2 view .LVU81 + 284 0018 0622 movs r2, #6 + 285 001a 6946 mov r1, sp + 286 001c 1020 movs r0, #16 + 287 001e FFF7FEFF bl readCMD + 288 .LVL15: + 93:Core/Src/ADBMS_Abstraction.c **** + 94:Core/Src/ADBMS_Abstraction.c **** module->sumOfCellMeasurements = rxbuffer[0] | (rxbuffer[1]<<8); + 289 .loc 1 94 2 view .LVU82 + 290 .loc 1 94 42 is_stmt 0 view .LVU83 + 291 0022 9DF80030 ldrb r3, [sp] @ zero_extendqisi2 + 292 .loc 1 94 57 view .LVU84 + 293 0026 9DF80120 ldrb r2, [sp, #1] @ zero_extendqisi2 + 294 .loc 1 94 46 view .LVU85 + 295 002a 43EA0223 orr r3, r3, r2, lsl #8 + 296 .loc 1 94 32 view .LVU86 + 297 002e E387 strh r3, [r4, #62] @ movhi + 95:Core/Src/ADBMS_Abstraction.c **** module->internalDieTemp = rxbuffer[2] | (rxbuffer[3]<<8); + 298 .loc 1 95 2 is_stmt 1 view .LVU87 + 299 .loc 1 95 39 is_stmt 0 view .LVU88 + 300 0030 9DF80230 ldrb r3, [sp, #2] @ zero_extendqisi2 + 301 .loc 1 95 54 view .LVU89 + 302 0034 9DF80320 ldrb r2, [sp, #3] @ zero_extendqisi2 + 303 .loc 1 95 43 view .LVU90 + 304 0038 43EA0223 orr r3, r3, r2, lsl #8 + 305 .loc 1 95 29 view .LVU91 + 306 003c 2387 strh r3, [r4, #56] @ movhi + 96:Core/Src/ADBMS_Abstraction.c **** module->analogSupplyVoltage = rxbuffer[4] | (rxbuffer[5]<<8); + 307 .loc 1 96 2 is_stmt 1 view .LVU92 + 308 .loc 1 96 42 is_stmt 0 view .LVU93 + 309 003e 9DF80430 ldrb r3, [sp, #4] @ zero_extendqisi2 + 310 .loc 1 96 57 view .LVU94 + ARM GAS /tmp/ccKQpHxH.s page 8 + + + 311 0042 9DF80520 ldrb r2, [sp, #5] @ zero_extendqisi2 + 312 .loc 1 96 46 view .LVU95 + 313 0046 43EA0223 orr r3, r3, r2, lsl #8 + 314 .loc 1 96 32 view .LVU96 + 315 004a 6387 strh r3, [r4, #58] @ movhi + 97:Core/Src/ADBMS_Abstraction.c **** + 98:Core/Src/ADBMS_Abstraction.c **** readCMD(RDSTATB, rxbuffer, STATUS_GROUP_B_SIZE); + 316 .loc 1 98 2 is_stmt 1 view .LVU97 + 317 004c 0622 movs r2, #6 + 318 004e 6946 mov r1, sp + 319 0050 1220 movs r0, #18 + 320 0052 FFF7FEFF bl readCMD + 321 .LVL16: + 99:Core/Src/ADBMS_Abstraction.c **** module->digitalSupplyVoltage = rxbuffer[0] | (rxbuffer[1]<<8); + 322 .loc 1 99 2 view .LVU98 + 323 .loc 1 99 41 is_stmt 0 view .LVU99 + 324 0056 9DF80030 ldrb r3, [sp] @ zero_extendqisi2 + 325 .loc 1 99 56 view .LVU100 + 326 005a 9DF80120 ldrb r2, [sp, #1] @ zero_extendqisi2 + 327 .loc 1 99 45 view .LVU101 + 328 005e 43EA0223 orr r3, r3, r2, lsl #8 + 329 .loc 1 99 31 view .LVU102 + 330 0062 A387 strh r3, [r4, #60] @ movhi + 100:Core/Src/ADBMS_Abstraction.c **** + 101:Core/Src/ADBMS_Abstraction.c **** + 102:Core/Src/ADBMS_Abstraction.c **** return 0; + 331 .loc 1 102 2 is_stmt 1 view .LVU103 + 103:Core/Src/ADBMS_Abstraction.c **** } + 332 .loc 1 103 1 is_stmt 0 view .LVU104 + 333 0064 0020 movs r0, #0 + 334 0066 02B0 add sp, sp, #8 + 335 .cfi_def_cfa_offset 8 + 336 @ sp needed + 337 0068 10BD pop {r4, pc} + 338 .loc 1 103 1 view .LVU105 + 339 .cfi_endproc + 340 .LFE135: + 342 .section .text.amsConfigAuxMeasurement,"ax",%progbits + 343 .align 1 + 344 .global amsConfigAuxMeasurement + 345 .syntax unified + 346 .thumb + 347 .thumb_func + 349 amsConfigAuxMeasurement: + 350 .LVL17: + 351 .LFB136: + 104:Core/Src/ADBMS_Abstraction.c **** + 105:Core/Src/ADBMS_Abstraction.c **** uint8 amsConfigAuxMeasurement(uint16 Channels) + 106:Core/Src/ADBMS_Abstraction.c **** { + 352 .loc 1 106 1 is_stmt 1 view -0 + 353 .cfi_startproc + 354 @ args = 0, pretend = 0, frame = 8 + 355 @ frame_needed = 0, uses_anonymous_args = 0 + 356 .loc 1 106 1 is_stmt 0 view .LVU107 + 357 0000 00B5 push {lr} + 358 .cfi_def_cfa_offset 4 + 359 .cfi_offset 14, -4 + ARM GAS /tmp/ccKQpHxH.s page 9 + + + 360 0002 83B0 sub sp, sp, #12 + 361 .cfi_def_cfa_offset 16 + 107:Core/Src/ADBMS_Abstraction.c **** uint8 buf[CFG_GROUP_A_SIZE]; + 362 .loc 1 107 2 is_stmt 1 view .LVU108 + 108:Core/Src/ADBMS_Abstraction.c **** + 109:Core/Src/ADBMS_Abstraction.c **** readCMD(RDCFGA, buf, CFG_GROUP_A_SIZE); + 363 .loc 1 109 2 view .LVU109 + 364 0004 0622 movs r2, #6 + 365 0006 6946 mov r1, sp + 366 0008 0220 movs r0, #2 + 367 .LVL18: + 368 .loc 1 109 2 is_stmt 0 view .LVU110 + 369 000a FFF7FEFF bl readCMD + 370 .LVL19: + 110:Core/Src/ADBMS_Abstraction.c **** buf[0] |= 0xF8; + 371 .loc 1 110 2 is_stmt 1 view .LVU111 + 372 .loc 1 110 5 is_stmt 0 view .LVU112 + 373 000e 9DF80030 ldrb r3, [sp] @ zero_extendqisi2 + 374 .loc 1 110 9 view .LVU113 + 375 0012 63F00703 orn r3, r3, #7 + 376 0016 8DF80030 strb r3, [sp] + 111:Core/Src/ADBMS_Abstraction.c **** writeCMD(WRCFGA, buf, CFG_GROUP_A_SIZE); + 377 .loc 1 111 2 is_stmt 1 view .LVU114 + 378 001a 0622 movs r2, #6 + 379 001c 6946 mov r1, sp + 380 001e 0120 movs r0, #1 + 381 0020 FFF7FEFF bl writeCMD + 382 .LVL20: + 112:Core/Src/ADBMS_Abstraction.c **** + 113:Core/Src/ADBMS_Abstraction.c **** readCMD(RDCFGB, buf, CFG_GROUP_B_SIZE); + 383 .loc 1 113 2 view .LVU115 + 384 0024 0622 movs r2, #6 + 385 0026 6946 mov r1, sp + 386 0028 2620 movs r0, #38 + 387 002a FFF7FEFF bl readCMD + 388 .LVL21: + 114:Core/Src/ADBMS_Abstraction.c **** buf[0] |= 0x0F; + 389 .loc 1 114 2 view .LVU116 + 390 .loc 1 114 5 is_stmt 0 view .LVU117 + 391 002e 9DF80030 ldrb r3, [sp] @ zero_extendqisi2 + 392 .loc 1 114 9 view .LVU118 + 393 0032 43F00F03 orr r3, r3, #15 + 394 0036 8DF80030 strb r3, [sp] + 115:Core/Src/ADBMS_Abstraction.c **** writeCMD(WRCFGB, buf, CFG_GROUP_B_SIZE); + 395 .loc 1 115 2 is_stmt 1 view .LVU119 + 396 003a 0622 movs r2, #6 + 397 003c 6946 mov r1, sp + 398 003e 2420 movs r0, #36 + 399 0040 FFF7FEFF bl writeCMD + 400 .LVL22: + 116:Core/Src/ADBMS_Abstraction.c **** return 0; + 401 .loc 1 116 2 view .LVU120 + 117:Core/Src/ADBMS_Abstraction.c **** } + 402 .loc 1 117 1 is_stmt 0 view .LVU121 + 403 0044 0020 movs r0, #0 + 404 0046 03B0 add sp, sp, #12 + 405 .cfi_def_cfa_offset 4 + ARM GAS /tmp/ccKQpHxH.s page 10 + + + 406 @ sp needed + 407 0048 5DF804FB ldr pc, [sp], #4 + 408 .cfi_endproc + 409 .LFE136: + 411 .section .text.amsConfigGPIO,"ax",%progbits + 412 .align 1 + 413 .global amsConfigGPIO + 414 .syntax unified + 415 .thumb + 416 .thumb_func + 418 amsConfigGPIO: + 419 .LVL23: + 420 .LFB137: + 118:Core/Src/ADBMS_Abstraction.c **** + 119:Core/Src/ADBMS_Abstraction.c **** uint8 amsConfigGPIO(uint16 gpios) + 120:Core/Src/ADBMS_Abstraction.c **** { + 421 .loc 1 120 1 is_stmt 1 view -0 + 422 .cfi_startproc + 423 @ args = 0, pretend = 0, frame = 0 + 424 @ frame_needed = 0, uses_anonymous_args = 0 + 425 @ link register save eliminated. + 121:Core/Src/ADBMS_Abstraction.c **** return 0; + 426 .loc 1 121 2 view .LVU123 + 122:Core/Src/ADBMS_Abstraction.c **** } + 427 .loc 1 122 1 is_stmt 0 view .LVU124 + 428 0000 0020 movs r0, #0 + 429 .LVL24: + 430 .loc 1 122 1 view .LVU125 + 431 0002 7047 bx lr + 432 .cfi_endproc + 433 .LFE137: + 435 .section .text.amsSetGPIO,"ax",%progbits + 436 .align 1 + 437 .global amsSetGPIO + 438 .syntax unified + 439 .thumb + 440 .thumb_func + 442 amsSetGPIO: + 443 .LVL25: + 444 .LFB138: + 123:Core/Src/ADBMS_Abstraction.c **** + 124:Core/Src/ADBMS_Abstraction.c **** uint8 amsSetGPIO(uint16 gpios) + 125:Core/Src/ADBMS_Abstraction.c **** { + 445 .loc 1 125 1 is_stmt 1 view -0 + 446 .cfi_startproc + 447 @ args = 0, pretend = 0, frame = 0 + 448 @ frame_needed = 0, uses_anonymous_args = 0 + 449 @ link register save eliminated. + 126:Core/Src/ADBMS_Abstraction.c **** return 0; + 450 .loc 1 126 2 view .LVU127 + 127:Core/Src/ADBMS_Abstraction.c **** } + 451 .loc 1 127 1 is_stmt 0 view .LVU128 + 452 0000 0020 movs r0, #0 + 453 .LVL26: + 454 .loc 1 127 1 view .LVU129 + 455 0002 7047 bx lr + 456 .cfi_endproc + ARM GAS /tmp/ccKQpHxH.s page 11 + + + 457 .LFE138: + 459 .section .text.readGPIO,"ax",%progbits + 460 .align 1 + 461 .global readGPIO + 462 .syntax unified + 463 .thumb + 464 .thumb_func + 466 readGPIO: + 467 .LVL27: + 468 .LFB139: + 128:Core/Src/ADBMS_Abstraction.c **** + 129:Core/Src/ADBMS_Abstraction.c **** uint8 readGPIO(Cell_Module* module) + 130:Core/Src/ADBMS_Abstraction.c **** { + 469 .loc 1 130 1 is_stmt 1 view -0 + 470 .cfi_startproc + 471 @ args = 0, pretend = 0, frame = 0 + 472 @ frame_needed = 0, uses_anonymous_args = 0 + 473 @ link register save eliminated. + 131:Core/Src/ADBMS_Abstraction.c **** return 0; + 474 .loc 1 131 2 view .LVU131 + 132:Core/Src/ADBMS_Abstraction.c **** } + 475 .loc 1 132 1 is_stmt 0 view .LVU132 + 476 0000 0020 movs r0, #0 + 477 .LVL28: + 478 .loc 1 132 1 view .LVU133 + 479 0002 7047 bx lr + 480 .cfi_endproc + 481 .LFE139: + 483 .section .text.amsConfigBalancing,"ax",%progbits + 484 .align 1 + 485 .global amsConfigBalancing + 486 .syntax unified + 487 .thumb + 488 .thumb_func + 490 amsConfigBalancing: + 491 .LVL29: + 492 .LFB140: + 133:Core/Src/ADBMS_Abstraction.c **** + 134:Core/Src/ADBMS_Abstraction.c **** uint8 amsConfigBalancing(uint32 Channels) + 135:Core/Src/ADBMS_Abstraction.c **** { + 493 .loc 1 135 1 is_stmt 1 view -0 + 494 .cfi_startproc + 495 @ args = 0, pretend = 0, frame = 8 + 496 @ frame_needed = 0, uses_anonymous_args = 0 + 497 .loc 1 135 1 is_stmt 0 view .LVU135 + 498 0000 30B5 push {r4, r5, lr} + 499 .cfi_def_cfa_offset 12 + 500 .cfi_offset 4, -12 + 501 .cfi_offset 5, -8 + 502 .cfi_offset 14, -4 + 503 0002 83B0 sub sp, sp, #12 + 504 .cfi_def_cfa_offset 24 + 505 0004 0446 mov r4, r0 + 136:Core/Src/ADBMS_Abstraction.c **** + 137:Core/Src/ADBMS_Abstraction.c **** uint8 regbuffer[CFG_GROUP_A_SIZE]; + 506 .loc 1 137 2 is_stmt 1 view .LVU136 + 138:Core/Src/ADBMS_Abstraction.c **** readCMD(RDCFGA, regbuffer, CFG_GROUP_A_SIZE); + ARM GAS /tmp/ccKQpHxH.s page 12 + + + 507 .loc 1 138 2 view .LVU137 + 508 0006 0622 movs r2, #6 + 509 0008 6946 mov r1, sp + 510 000a 0220 movs r0, #2 + 511 .LVL30: + 512 .loc 1 138 2 is_stmt 0 view .LVU138 + 513 000c FFF7FEFF bl readCMD + 514 .LVL31: + 139:Core/Src/ADBMS_Abstraction.c **** + 140:Core/Src/ADBMS_Abstraction.c **** regbuffer[4] = Channels & 0xFF; + 515 .loc 1 140 2 is_stmt 1 view .LVU139 + 516 .loc 1 140 15 is_stmt 0 view .LVU140 + 517 0010 8DF80440 strb r4, [sp, #4] + 141:Core/Src/ADBMS_Abstraction.c **** regbuffer[5] &= 0xF0; + 518 .loc 1 141 2 is_stmt 1 view .LVU141 + 519 .loc 1 141 11 is_stmt 0 view .LVU142 + 520 0014 9DF80530 ldrb r3, [sp, #5] @ zero_extendqisi2 + 521 .loc 1 141 15 view .LVU143 + 522 0018 03F0F003 and r3, r3, #240 + 523 001c 8DF80530 strb r3, [sp, #5] + 142:Core/Src/ADBMS_Abstraction.c **** regbuffer[5] |= (Channels>>8) & 0x0F; + 524 .loc 1 142 2 is_stmt 1 view .LVU144 + 525 .loc 1 142 32 is_stmt 0 view .LVU145 + 526 0020 C4F30725 ubfx r5, r4, #8, #8 + 527 0024 C4F30322 ubfx r2, r4, #8, #4 + 528 .loc 1 142 15 view .LVU146 + 529 0028 1343 orrs r3, r3, r2 + 530 002a 8DF80530 strb r3, [sp, #5] + 143:Core/Src/ADBMS_Abstraction.c **** writeCMD(WRCFGA, regbuffer, CFG_GROUP_A_SIZE); + 531 .loc 1 143 2 is_stmt 1 view .LVU147 + 532 002e 0622 movs r2, #6 + 533 0030 6946 mov r1, sp + 534 0032 0120 movs r0, #1 + 535 0034 FFF7FEFF bl writeCMD + 536 .LVL32: + 144:Core/Src/ADBMS_Abstraction.c **** + 145:Core/Src/ADBMS_Abstraction.c **** readCMD(RDCFGB, regbuffer, CFG_GROUP_B_SIZE); + 537 .loc 1 145 2 view .LVU148 + 538 0038 0622 movs r2, #6 + 539 003a 6946 mov r1, sp + 540 003c 2620 movs r0, #38 + 541 003e FFF7FEFF bl readCMD + 542 .LVL33: + 146:Core/Src/ADBMS_Abstraction.c **** regbuffer[0] &= 0x0F; + 543 .loc 1 146 2 view .LVU149 + 544 .loc 1 146 11 is_stmt 0 view .LVU150 + 545 0042 9DF80030 ldrb r3, [sp] @ zero_extendqisi2 + 546 .loc 1 146 15 view .LVU151 + 547 0046 03F00F03 and r3, r3, #15 + 548 004a 8DF80030 strb r3, [sp] + 147:Core/Src/ADBMS_Abstraction.c **** regbuffer[0] |= (Channels>>8) & 0xF0; + 549 .loc 1 147 2 is_stmt 1 view .LVU152 + 550 .loc 1 147 32 is_stmt 0 view .LVU153 + 551 004e 05F0F005 and r5, r5, #240 + 552 .loc 1 147 15 view .LVU154 + 553 0052 2B43 orrs r3, r3, r5 + 554 0054 8DF80030 strb r3, [sp] + ARM GAS /tmp/ccKQpHxH.s page 13 + + + 148:Core/Src/ADBMS_Abstraction.c **** regbuffer[1] &= 0xFC; + 555 .loc 1 148 2 is_stmt 1 view .LVU155 + 556 .loc 1 148 11 is_stmt 0 view .LVU156 + 557 0058 9DF80130 ldrb r3, [sp, #1] @ zero_extendqisi2 + 558 .loc 1 148 15 view .LVU157 + 559 005c 03F0FC03 and r3, r3, #252 + 560 0060 8DF80130 strb r3, [sp, #1] + 149:Core/Src/ADBMS_Abstraction.c **** regbuffer[1] |= 0x03 & (Channels>>16); + 561 .loc 1 149 2 is_stmt 1 view .LVU158 + 562 .loc 1 149 23 is_stmt 0 view .LVU159 + 563 0064 C4F30144 ubfx r4, r4, #16, #2 + 564 .LVL34: + 565 .loc 1 149 15 view .LVU160 + 566 0068 2343 orrs r3, r3, r4 + 567 006a 8DF80130 strb r3, [sp, #1] + 150:Core/Src/ADBMS_Abstraction.c **** writeCMD(WRCFGB, regbuffer, CFG_GROUP_B_SIZE); + 568 .loc 1 150 2 is_stmt 1 view .LVU161 + 569 006e 0622 movs r2, #6 + 570 0070 6946 mov r1, sp + 571 0072 2420 movs r0, #36 + 572 0074 FFF7FEFF bl writeCMD + 573 .LVL35: + 151:Core/Src/ADBMS_Abstraction.c **** + 152:Core/Src/ADBMS_Abstraction.c **** return 0; + 574 .loc 1 152 2 view .LVU162 + 153:Core/Src/ADBMS_Abstraction.c **** } + 575 .loc 1 153 1 is_stmt 0 view .LVU163 + 576 0078 0020 movs r0, #0 + 577 007a 03B0 add sp, sp, #12 + 578 .cfi_def_cfa_offset 12 + 579 @ sp needed + 580 007c 30BD pop {r4, r5, pc} + 581 .cfi_endproc + 582 .LFE140: + 584 .section .text.amsStartBalancing,"ax",%progbits + 585 .align 1 + 586 .global amsStartBalancing + 587 .syntax unified + 588 .thumb + 589 .thumb_func + 591 amsStartBalancing: + 592 .LVL36: + 593 .LFB141: + 154:Core/Src/ADBMS_Abstraction.c **** + 155:Core/Src/ADBMS_Abstraction.c **** uint8 amsStartBalancing(uint8 dutyCycle) + 156:Core/Src/ADBMS_Abstraction.c **** { + 594 .loc 1 156 1 is_stmt 1 view -0 + 595 .cfi_startproc + 596 @ args = 0, pretend = 0, frame = 0 + 597 @ frame_needed = 0, uses_anonymous_args = 0 + 598 .loc 1 156 1 is_stmt 0 view .LVU165 + 599 0000 08B5 push {r3, lr} + 600 .cfi_def_cfa_offset 8 + 601 .cfi_offset 3, -8 + 602 .cfi_offset 14, -4 + 157:Core/Src/ADBMS_Abstraction.c **** writeCMD(UNMUTE, NULL, 0); + 603 .loc 1 157 2 is_stmt 1 view .LVU166 + ARM GAS /tmp/ccKQpHxH.s page 14 + + + 604 0002 0022 movs r2, #0 + 605 0004 1146 mov r1, r2 + 606 0006 2920 movs r0, #41 + 607 .LVL37: + 608 .loc 1 157 2 is_stmt 0 view .LVU167 + 609 0008 FFF7FEFF bl writeCMD + 610 .LVL38: + 158:Core/Src/ADBMS_Abstraction.c **** return 0; + 611 .loc 1 158 2 is_stmt 1 view .LVU168 + 159:Core/Src/ADBMS_Abstraction.c **** } + 612 .loc 1 159 1 is_stmt 0 view .LVU169 + 613 000c 0020 movs r0, #0 + 614 000e 08BD pop {r3, pc} + 615 .cfi_endproc + 616 .LFE141: + 618 .section .text.amsStopBalancing,"ax",%progbits + 619 .align 1 + 620 .global amsStopBalancing + 621 .syntax unified + 622 .thumb + 623 .thumb_func + 625 amsStopBalancing: + 626 .LFB142: + 160:Core/Src/ADBMS_Abstraction.c **** + 161:Core/Src/ADBMS_Abstraction.c **** uint8 amsStopBalancing() + 162:Core/Src/ADBMS_Abstraction.c **** { + 627 .loc 1 162 1 is_stmt 1 view -0 + 628 .cfi_startproc + 629 @ args = 0, pretend = 0, frame = 0 + 630 @ frame_needed = 0, uses_anonymous_args = 0 + 631 0000 08B5 push {r3, lr} + 632 .cfi_def_cfa_offset 8 + 633 .cfi_offset 3, -8 + 634 .cfi_offset 14, -4 + 163:Core/Src/ADBMS_Abstraction.c **** writeCMD(MUTE, NULL, 0); + 635 .loc 1 163 2 view .LVU171 + 636 0002 0022 movs r2, #0 + 637 0004 1146 mov r1, r2 + 638 0006 2820 movs r0, #40 + 639 0008 FFF7FEFF bl writeCMD + 640 .LVL39: + 164:Core/Src/ADBMS_Abstraction.c **** return 0; + 641 .loc 1 164 2 view .LVU172 + 165:Core/Src/ADBMS_Abstraction.c **** } + 642 .loc 1 165 1 is_stmt 0 view .LVU173 + 643 000c 0020 movs r0, #0 + 644 000e 08BD pop {r3, pc} + 645 .cfi_endproc + 646 .LFE142: + 648 .section .text.amsSelfTest,"ax",%progbits + 649 .align 1 + 650 .global amsSelfTest + 651 .syntax unified + 652 .thumb + 653 .thumb_func + 655 amsSelfTest: + 656 .LFB143: + ARM GAS /tmp/ccKQpHxH.s page 15 + + + 166:Core/Src/ADBMS_Abstraction.c **** + 167:Core/Src/ADBMS_Abstraction.c **** uint8 amsSelfTest() + 168:Core/Src/ADBMS_Abstraction.c **** { + 657 .loc 1 168 1 is_stmt 1 view -0 + 658 .cfi_startproc + 659 @ args = 0, pretend = 0, frame = 0 + 660 @ frame_needed = 0, uses_anonymous_args = 0 + 661 @ link register save eliminated. + 169:Core/Src/ADBMS_Abstraction.c **** return 0; + 662 .loc 1 169 2 view .LVU175 + 170:Core/Src/ADBMS_Abstraction.c **** } + 663 .loc 1 170 1 is_stmt 0 view .LVU176 + 664 0000 0020 movs r0, #0 + 665 0002 7047 bx lr + 666 .cfi_endproc + 667 .LFE143: + 669 .section .text.amsConfigUnderVoltage,"ax",%progbits + 670 .align 1 + 671 .global amsConfigUnderVoltage + 672 .syntax unified + 673 .thumb + 674 .thumb_func + 676 amsConfigUnderVoltage: + 677 .LVL40: + 678 .LFB144: + 171:Core/Src/ADBMS_Abstraction.c **** + 172:Core/Src/ADBMS_Abstraction.c **** + 173:Core/Src/ADBMS_Abstraction.c **** + 174:Core/Src/ADBMS_Abstraction.c **** uint8 amsConfigUnderVoltage(uint16 underVoltage) + 175:Core/Src/ADBMS_Abstraction.c **** { + 679 .loc 1 175 1 is_stmt 1 view -0 + 680 .cfi_startproc + 681 @ args = 0, pretend = 0, frame = 8 + 682 @ frame_needed = 0, uses_anonymous_args = 0 + 683 .loc 1 175 1 is_stmt 0 view .LVU178 + 684 0000 10B5 push {r4, lr} + 685 .cfi_def_cfa_offset 8 + 686 .cfi_offset 4, -8 + 687 .cfi_offset 14, -4 + 688 0002 82B0 sub sp, sp, #8 + 689 .cfi_def_cfa_offset 16 + 690 0004 0446 mov r4, r0 + 176:Core/Src/ADBMS_Abstraction.c **** uint8 buffer[CFG_GROUP_A_SIZE]; + 691 .loc 1 176 2 is_stmt 1 view .LVU179 + 177:Core/Src/ADBMS_Abstraction.c **** readCMD(RDCFGA, buffer, CFG_GROUP_A_SIZE); + 692 .loc 1 177 2 view .LVU180 + 693 0006 0622 movs r2, #6 + 694 0008 6946 mov r1, sp + 695 000a 0220 movs r0, #2 + 696 .LVL41: + 697 .loc 1 177 2 is_stmt 0 view .LVU181 + 698 000c FFF7FEFF bl readCMD + 699 .LVL42: + 178:Core/Src/ADBMS_Abstraction.c **** + 179:Core/Src/ADBMS_Abstraction.c **** buffer[1] = (uint8) underVoltage & 0xFF; + 700 .loc 1 179 2 is_stmt 1 view .LVU182 + 701 .loc 1 179 12 is_stmt 0 view .LVU183 + ARM GAS /tmp/ccKQpHxH.s page 16 + + + 702 0010 8DF80140 strb r4, [sp, #1] + 180:Core/Src/ADBMS_Abstraction.c **** uint8 ovuv = buffer[2] & 0xF0; + 703 .loc 1 180 2 is_stmt 1 view .LVU184 + 704 .loc 1 180 21 is_stmt 0 view .LVU185 + 705 0014 9DF80230 ldrb r3, [sp, #2] @ zero_extendqisi2 + 706 .loc 1 180 8 view .LVU186 + 707 0018 03F0F003 and r3, r3, #240 + 708 .LVL43: + 181:Core/Src/ADBMS_Abstraction.c **** ovuv |= (uint8) (underVoltage >> 8) & 0x0F; + 709 .loc 1 181 2 is_stmt 1 view .LVU187 + 710 .loc 1 181 38 is_stmt 0 view .LVU188 + 711 001c C4F30324 ubfx r4, r4, #8, #4 + 712 .loc 1 181 7 view .LVU189 + 713 0020 2343 orrs r3, r3, r4 + 714 .LVL44: + 182:Core/Src/ADBMS_Abstraction.c **** buffer[2] = ovuv; + 715 .loc 1 182 2 is_stmt 1 view .LVU190 + 716 .loc 1 182 12 is_stmt 0 view .LVU191 + 717 0022 8DF80230 strb r3, [sp, #2] + 183:Core/Src/ADBMS_Abstraction.c **** + 184:Core/Src/ADBMS_Abstraction.c **** writeCMD(WRCFGA, buffer, CFG_GROUP_A_SIZE); + 718 .loc 1 184 2 is_stmt 1 view .LVU192 + 719 0026 0622 movs r2, #6 + 720 0028 6946 mov r1, sp + 721 002a 0120 movs r0, #1 + 722 002c FFF7FEFF bl writeCMD + 723 .LVL45: + 185:Core/Src/ADBMS_Abstraction.c **** + 186:Core/Src/ADBMS_Abstraction.c **** return 0; + 724 .loc 1 186 2 view .LVU193 + 187:Core/Src/ADBMS_Abstraction.c **** } + 725 .loc 1 187 1 is_stmt 0 view .LVU194 + 726 0030 0020 movs r0, #0 + 727 0032 02B0 add sp, sp, #8 + 728 .cfi_def_cfa_offset 8 + 729 @ sp needed + 730 0034 10BD pop {r4, pc} + 731 .cfi_endproc + 732 .LFE144: + 734 .section .text.amsCheckUnderOverVoltage,"ax",%progbits + 735 .align 1 + 736 .global amsCheckUnderOverVoltage + 737 .syntax unified + 738 .thumb + 739 .thumb_func + 741 amsCheckUnderOverVoltage: + 742 .LVL46: + 743 .LFB145: + 188:Core/Src/ADBMS_Abstraction.c **** + 189:Core/Src/ADBMS_Abstraction.c **** uint8 amsCheckUnderOverVoltage(Cell_Module *module) + 190:Core/Src/ADBMS_Abstraction.c **** { + 744 .loc 1 190 1 is_stmt 1 view -0 + 745 .cfi_startproc + 746 @ args = 0, pretend = 0, frame = 8 + 747 @ frame_needed = 0, uses_anonymous_args = 0 + 748 .loc 1 190 1 is_stmt 0 view .LVU196 + 749 0000 10B5 push {r4, lr} + ARM GAS /tmp/ccKQpHxH.s page 17 + + + 750 .cfi_def_cfa_offset 8 + 751 .cfi_offset 4, -8 + 752 .cfi_offset 14, -4 + 753 0002 82B0 sub sp, sp, #8 + 754 .cfi_def_cfa_offset 16 + 755 0004 0446 mov r4, r0 + 191:Core/Src/ADBMS_Abstraction.c **** uint8 regbuffer[STATUS_GROUP_B_SIZE]; + 756 .loc 1 191 2 is_stmt 1 view .LVU197 + 192:Core/Src/ADBMS_Abstraction.c **** uint32 overundervoltages = 0; + 757 .loc 1 192 2 view .LVU198 + 758 .LVL47: + 193:Core/Src/ADBMS_Abstraction.c **** readCMD(RDSTATB, regbuffer, STATUS_GROUP_B_SIZE); + 759 .loc 1 193 2 view .LVU199 + 760 0006 0622 movs r2, #6 + 761 0008 6946 mov r1, sp + 762 000a 1220 movs r0, #18 + 763 .LVL48: + 764 .loc 1 193 2 is_stmt 0 view .LVU200 + 765 000c FFF7FEFF bl readCMD + 766 .LVL49: + 194:Core/Src/ADBMS_Abstraction.c **** overundervoltages = regbuffer[2] | (regbuffer[3]<<8) | (regbuffer[4]<<16); + 767 .loc 1 194 2 is_stmt 1 view .LVU201 + 768 .loc 1 194 31 is_stmt 0 view .LVU202 + 769 0010 9DF802C0 ldrb ip, [sp, #2] @ zero_extendqisi2 + 770 .loc 1 194 47 view .LVU203 + 771 0014 9DF80330 ldrb r3, [sp, #3] @ zero_extendqisi2 + 772 .loc 1 194 35 view .LVU204 + 773 0018 4CEA032C orr ip, ip, r3, lsl #8 + 774 .loc 1 194 67 view .LVU205 + 775 001c 9DF80430 ldrb r3, [sp, #4] @ zero_extendqisi2 + 776 .loc 1 194 55 view .LVU206 + 777 0020 4CEA034C orr ip, ip, r3, lsl #16 + 778 .LVL50: + 195:Core/Src/ADBMS_Abstraction.c **** module->overVoltage = 0; + 779 .loc 1 195 2 is_stmt 1 view .LVU207 + 780 .loc 1 195 22 is_stmt 0 view .LVU208 + 781 0024 0022 movs r2, #0 + 782 0026 A265 str r2, [r4, #88] + 196:Core/Src/ADBMS_Abstraction.c **** module->underVoltage = 0; + 783 .loc 1 196 2 is_stmt 1 view .LVU209 + 784 .loc 1 196 23 is_stmt 0 view .LVU210 + 785 0028 E265 str r2, [r4, #92] + 197:Core/Src/ADBMS_Abstraction.c **** for(uint8 n = 0; n < 12; n++) + 786 .loc 1 197 2 is_stmt 1 view .LVU211 + 787 .LBB2: + 788 .loc 1 197 6 view .LVU212 + 789 .LVL51: + 790 .loc 1 197 2 is_stmt 0 view .LVU213 + 791 002a 13E0 b .L25 + 792 .LVL52: + 793 .L26: + 794 .LBB3: + 198:Core/Src/ADBMS_Abstraction.c **** { + 199:Core/Src/ADBMS_Abstraction.c **** uint8 overvolt = (overundervoltages>>(2*n+1)) & 0x01; + 795 .loc 1 199 3 is_stmt 1 discriminator 3 view .LVU214 + 796 .loc 1 199 42 is_stmt 0 discriminator 3 view .LVU215 + 797 002c 5300 lsls r3, r2, #1 + ARM GAS /tmp/ccKQpHxH.s page 18 + + + 798 .loc 1 199 44 discriminator 3 view .LVU216 + 799 002e 591C adds r1, r3, #1 + 800 .loc 1 199 38 discriminator 3 view .LVU217 + 801 0030 2CFA01F1 lsr r1, ip, r1 + 802 .loc 1 199 9 discriminator 3 view .LVU218 + 803 0034 01F00101 and r1, r1, #1 + 804 .LVL53: + 200:Core/Src/ADBMS_Abstraction.c **** uint8 undervolt = (overundervoltages>>(2*n))&0x01; + 805 .loc 1 200 3 is_stmt 1 discriminator 3 view .LVU219 + 806 .loc 1 200 39 is_stmt 0 discriminator 3 view .LVU220 + 807 0038 2CFA03F3 lsr r3, ip, r3 + 808 .loc 1 200 9 discriminator 3 view .LVU221 + 809 003c 03F00103 and r3, r3, #1 + 810 .LVL54: + 201:Core/Src/ADBMS_Abstraction.c **** + 202:Core/Src/ADBMS_Abstraction.c **** module->overVoltage |= overvolt<underVoltage |= undervolt<>(2*n+1)) & 0x01; + 869 .loc 1 212 3 discriminator 3 view .LVU244 + 870 .loc 1 212 42 is_stmt 0 discriminator 3 view .LVU245 + 871 0074 4B00 lsls r3, r1, #1 + 872 .loc 1 212 44 discriminator 3 view .LVU246 + 873 0076 5A1C adds r2, r3, #1 + 874 .loc 1 212 38 discriminator 3 view .LVU247 + 875 0078 2CFA02F2 lsr r2, ip, r2 + 876 .loc 1 212 9 discriminator 3 view .LVU248 + 877 007c 02F00102 and r2, r2, #1 + 878 .LVL63: + 213:Core/Src/ADBMS_Abstraction.c **** uint8 undervolt = (overundervoltages>>(2*n))&0x01; + 879 .loc 1 213 3 is_stmt 1 discriminator 3 view .LVU249 + 880 .loc 1 213 39 is_stmt 0 discriminator 3 view .LVU250 + 881 0080 2CFA03F3 lsr r3, ip, r3 + 882 .loc 1 213 9 discriminator 3 view .LVU251 + 883 0084 03F00103 and r3, r3, #1 + 884 .LVL64: + 214:Core/Src/ADBMS_Abstraction.c **** + 215:Core/Src/ADBMS_Abstraction.c **** module->overVoltage |= (uint32) overvolt<<(n+12); + 885 .loc 1 215 3 is_stmt 1 discriminator 3 view .LVU252 + 886 .loc 1 215 9 is_stmt 0 discriminator 3 view .LVU253 + 887 0088 A06D ldr r0, [r4, #88] + 888 .loc 1 215 47 discriminator 3 view .LVU254 + 889 008a 01F10C0E add lr, r1, #12 + 890 .loc 1 215 43 discriminator 3 view .LVU255 + 891 008e 02FA0EF2 lsl r2, r2, lr + 892 .LVL65: + ARM GAS /tmp/ccKQpHxH.s page 20 + + + 893 .loc 1 215 23 discriminator 3 view .LVU256 + 894 0092 1043 orrs r0, r0, r2 + 895 0094 A065 str r0, [r4, #88] + 216:Core/Src/ADBMS_Abstraction.c **** module->underVoltage |= (uint32) undervolt<<(n+12); + 896 .loc 1 216 3 is_stmt 1 discriminator 3 view .LVU257 + 897 .loc 1 216 9 is_stmt 0 discriminator 3 view .LVU258 + 898 0096 E26D ldr r2, [r4, #92] + 899 .loc 1 216 45 discriminator 3 view .LVU259 + 900 0098 03FA0EF3 lsl r3, r3, lr + 901 .LVL66: + 902 .loc 1 216 24 discriminator 3 view .LVU260 + 903 009c 1A43 orrs r2, r2, r3 + 904 009e E265 str r2, [r4, #92] + 905 .LBE5: + 210:Core/Src/ADBMS_Abstraction.c **** { + 906 .loc 1 210 27 is_stmt 1 discriminator 3 view .LVU261 + 907 00a0 0131 adds r1, r1, #1 + 908 .LVL67: + 210:Core/Src/ADBMS_Abstraction.c **** { + 909 .loc 1 210 27 is_stmt 0 discriminator 3 view .LVU262 + 910 00a2 C9B2 uxtb r1, r1 + 911 .LVL68: + 210:Core/Src/ADBMS_Abstraction.c **** { + 912 .loc 1 210 27 discriminator 3 view .LVU263 + 913 00a4 E4E7 b .L27 + 914 .LVL69: + 915 .L30: + 210:Core/Src/ADBMS_Abstraction.c **** { + 916 .loc 1 210 27 discriminator 3 view .LVU264 + 917 .LBE4: + 217:Core/Src/ADBMS_Abstraction.c **** } + 218:Core/Src/ADBMS_Abstraction.c **** + 219:Core/Src/ADBMS_Abstraction.c **** + 220:Core/Src/ADBMS_Abstraction.c **** return 0; + 918 .loc 1 220 2 is_stmt 1 view .LVU265 + 221:Core/Src/ADBMS_Abstraction.c **** } + 919 .loc 1 221 1 is_stmt 0 view .LVU266 + 920 00a6 0020 movs r0, #0 + 921 00a8 02B0 add sp, sp, #8 + 922 .cfi_def_cfa_offset 8 + 923 @ sp needed + 924 00aa 10BD pop {r4, pc} + 925 .loc 1 221 1 view .LVU267 + 926 .cfi_endproc + 927 .LFE145: + 929 .section .text.amsConfigOverVoltage,"ax",%progbits + 930 .align 1 + 931 .global amsConfigOverVoltage + 932 .syntax unified + 933 .thumb + 934 .thumb_func + 936 amsConfigOverVoltage: + 937 .LVL70: + 938 .LFB146: + 222:Core/Src/ADBMS_Abstraction.c **** + 223:Core/Src/ADBMS_Abstraction.c **** uint8 amsConfigOverVoltage(uint16 overVoltage) + 224:Core/Src/ADBMS_Abstraction.c **** { + ARM GAS /tmp/ccKQpHxH.s page 21 + + + 939 .loc 1 224 1 is_stmt 1 view -0 + 940 .cfi_startproc + 941 @ args = 0, pretend = 0, frame = 8 + 942 @ frame_needed = 0, uses_anonymous_args = 0 + 943 .loc 1 224 1 is_stmt 0 view .LVU269 + 944 0000 10B5 push {r4, lr} + 945 .cfi_def_cfa_offset 8 + 946 .cfi_offset 4, -8 + 947 .cfi_offset 14, -4 + 948 0002 82B0 sub sp, sp, #8 + 949 .cfi_def_cfa_offset 16 + 950 0004 0446 mov r4, r0 + 225:Core/Src/ADBMS_Abstraction.c **** uint8 buffer[CFG_GROUP_B_SIZE]; + 951 .loc 1 225 2 is_stmt 1 view .LVU270 + 226:Core/Src/ADBMS_Abstraction.c **** + 227:Core/Src/ADBMS_Abstraction.c **** readCMD(RDCFGA, buffer, CFG_GROUP_A_SIZE); + 952 .loc 1 227 2 view .LVU271 + 953 0006 0622 movs r2, #6 + 954 0008 6946 mov r1, sp + 955 000a 0220 movs r0, #2 + 956 .LVL71: + 957 .loc 1 227 2 is_stmt 0 view .LVU272 + 958 000c FFF7FEFF bl readCMD + 959 .LVL72: + 228:Core/Src/ADBMS_Abstraction.c **** buffer[2] &= 0x0F; + 960 .loc 1 228 2 is_stmt 1 view .LVU273 + 961 .loc 1 228 8 is_stmt 0 view .LVU274 + 962 0010 9DF80230 ldrb r3, [sp, #2] @ zero_extendqisi2 + 963 .loc 1 228 12 view .LVU275 + 964 0014 03F00F03 and r3, r3, #15 + 965 0018 8DF80230 strb r3, [sp, #2] + 229:Core/Src/ADBMS_Abstraction.c **** buffer[2] |= (uint8) overVoltage << 4; + 966 .loc 1 229 2 is_stmt 1 view .LVU276 + 967 .loc 1 229 15 is_stmt 0 view .LVU277 + 968 001c E2B2 uxtb r2, r4 + 969 .loc 1 229 12 view .LVU278 + 970 001e 43EA0213 orr r3, r3, r2, lsl #4 + 971 0022 8DF80230 strb r3, [sp, #2] + 230:Core/Src/ADBMS_Abstraction.c **** buffer[3] = (uint8)(overVoltage>>4); + 972 .loc 1 230 2 is_stmt 1 view .LVU279 + 973 .loc 1 230 14 is_stmt 0 view .LVU280 + 974 0026 C4F30714 ubfx r4, r4, #4, #8 + 975 .loc 1 230 12 view .LVU281 + 976 002a 8DF80340 strb r4, [sp, #3] + 231:Core/Src/ADBMS_Abstraction.c **** + 232:Core/Src/ADBMS_Abstraction.c **** writeCMD(WRCFGA, buffer, CFG_GROUP_A_SIZE); + 977 .loc 1 232 2 is_stmt 1 view .LVU282 + 978 002e 0622 movs r2, #6 + 979 0030 6946 mov r1, sp + 980 0032 0120 movs r0, #1 + 981 0034 FFF7FEFF bl writeCMD + 982 .LVL73: + 233:Core/Src/ADBMS_Abstraction.c **** + 234:Core/Src/ADBMS_Abstraction.c **** return 0; + 983 .loc 1 234 2 view .LVU283 + 235:Core/Src/ADBMS_Abstraction.c **** } + 984 .loc 1 235 1 is_stmt 0 view .LVU284 + ARM GAS /tmp/ccKQpHxH.s page 22 + + + 985 0038 0020 movs r0, #0 + 986 003a 02B0 add sp, sp, #8 + 987 .cfi_def_cfa_offset 8 + 988 @ sp needed + 989 003c 10BD pop {r4, pc} + 990 .cfi_endproc + 991 .LFE146: + 993 .section .text.initAMS,"ax",%progbits + 994 .align 1 + 995 .global initAMS + 996 .syntax unified + 997 .thumb + 998 .thumb_func + 1000 initAMS: + 1001 .LVL74: + 1002 .LFB130: + 16:Core/Src/ADBMS_Abstraction.c **** adbmsDriverInit(hspi); + 1003 .loc 1 16 1 is_stmt 1 view -0 + 1004 .cfi_startproc + 1005 @ args = 0, pretend = 0, frame = 0 + 1006 @ frame_needed = 0, uses_anonymous_args = 0 + 16:Core/Src/ADBMS_Abstraction.c **** adbmsDriverInit(hspi); + 1007 .loc 1 16 1 is_stmt 0 view .LVU286 + 1008 0000 38B5 push {r3, r4, r5, lr} + 1009 .cfi_def_cfa_offset 16 + 1010 .cfi_offset 3, -16 + 1011 .cfi_offset 4, -12 + 1012 .cfi_offset 5, -8 + 1013 .cfi_offset 14, -4 + 1014 0002 0D46 mov r5, r1 + 1015 0004 1446 mov r4, r2 + 17:Core/Src/ADBMS_Abstraction.c **** numberofcells = numofcells; + 1016 .loc 1 17 2 is_stmt 1 view .LVU287 + 1017 0006 FFF7FEFF bl adbmsDriverInit + 1018 .LVL75: + 18:Core/Src/ADBMS_Abstraction.c **** numberofauxchannels = numofaux; + 1019 .loc 1 18 2 view .LVU288 + 18:Core/Src/ADBMS_Abstraction.c **** numberofauxchannels = numofaux; + 1020 .loc 1 18 16 is_stmt 0 view .LVU289 + 1021 000a 0B4B ldr r3, .L35 + 1022 000c 1D70 strb r5, [r3] + 19:Core/Src/ADBMS_Abstraction.c **** + 1023 .loc 1 19 2 is_stmt 1 view .LVU290 + 19:Core/Src/ADBMS_Abstraction.c **** + 1024 .loc 1 19 22 is_stmt 0 view .LVU291 + 1025 000e 0B4B ldr r3, .L35+4 + 1026 0010 1C70 strb r4, [r3] + 22:Core/Src/ADBMS_Abstraction.c **** amsStopBalancing(); + 1027 .loc 1 22 2 is_stmt 1 view .LVU292 + 1028 0012 FFF7FEFF bl amsWakeUp + 1029 .LVL76: + 23:Core/Src/ADBMS_Abstraction.c **** amsConfigOverVoltage(DEFAULT_OV); + 1030 .loc 1 23 2 view .LVU293 + 1031 0016 FFF7FEFF bl amsStopBalancing + 1032 .LVL77: + 24:Core/Src/ADBMS_Abstraction.c **** amsConfigUnderVoltage(DEFAULT_UV); + 1033 .loc 1 24 2 view .LVU294 + ARM GAS /tmp/ccKQpHxH.s page 23 + + + 1034 001a 40F64120 movw r0, #2625 + 1035 001e FFF7FEFF bl amsConfigOverVoltage + 1036 .LVL78: + 25:Core/Src/ADBMS_Abstraction.c **** amsConfigAuxMeasurement(0xFFFF); + 1037 .loc 1 25 2 view .LVU295 + 1038 0022 40F21A60 movw r0, #1562 + 1039 0026 FFF7FEFF bl amsConfigUnderVoltage + 1040 .LVL79: + 26:Core/Src/ADBMS_Abstraction.c **** + 1041 .loc 1 26 2 view .LVU296 + 1042 002a 4FF6FF70 movw r0, #65535 + 1043 002e FFF7FEFF bl amsConfigAuxMeasurement + 1044 .LVL80: + 28:Core/Src/ADBMS_Abstraction.c **** } + 1045 .loc 1 28 2 view .LVU297 + 29:Core/Src/ADBMS_Abstraction.c **** + 1046 .loc 1 29 1 is_stmt 0 view .LVU298 + 1047 0032 0020 movs r0, #0 + 1048 0034 38BD pop {r3, r4, r5, pc} + 1049 .L36: + 1050 0036 00BF .align 2 + 1051 .L35: + 1052 0038 00000000 .word numberofcells + 1053 003c 00000000 .word numberofauxchannels + 1054 .cfi_endproc + 1055 .LFE130: + 1057 .section .text.amsClearStatus,"ax",%progbits + 1058 .align 1 + 1059 .global amsClearStatus + 1060 .syntax unified + 1061 .thumb + 1062 .thumb_func + 1064 amsClearStatus: + 1065 .LFB147: + 236:Core/Src/ADBMS_Abstraction.c **** + 237:Core/Src/ADBMS_Abstraction.c **** /* + 238:Core/Src/ADBMS_Abstraction.c **** void dumpRegister(UART_HandleTypeDef *huart, uint8 RegID, uint8* buffer) + 239:Core/Src/ADBMS_Abstraction.c **** { + 240:Core/Src/ADBMS_Abstraction.c **** switch(RegID) + 241:Core/Src/ADBMS_Abstraction.c **** { + 242:Core/Src/ADBMS_Abstraction.c **** case CFG_GROUP_A_ID: + 243:Core/Src/ADBMS_Abstraction.c **** readCMD(RDCFGA, buffer, CFG_GROUP_A_SIZE); + 244:Core/Src/ADBMS_Abstraction.c **** break; + 245:Core/Src/ADBMS_Abstraction.c **** case CFG_GROUP_B_ID: + 246:Core/Src/ADBMS_Abstraction.c **** readCMD(RDCFGB, buffer, CFG_GROUP_A_SIZE); + 247:Core/Src/ADBMS_Abstraction.c **** break; + 248:Core/Src/ADBMS_Abstraction.c **** case CV_GROUP_A_ID: + 249:Core/Src/ADBMS_Abstraction.c **** readCMD(RDCVA, buffer, CFG_GROUP_A_SIZE); + 250:Core/Src/ADBMS_Abstraction.c **** break; + 251:Core/Src/ADBMS_Abstraction.c **** case CV_GROUP_B_ID: + 252:Core/Src/ADBMS_Abstraction.c **** readCMD(RDCVB, buffer, CFG_GROUP_A_SIZE); + 253:Core/Src/ADBMS_Abstraction.c **** break; + 254:Core/Src/ADBMS_Abstraction.c **** case CV_GROUP_C_ID: + 255:Core/Src/ADBMS_Abstraction.c **** readCMD(RDCVC, buffer, CFG_GROUP_A_SIZE); + 256:Core/Src/ADBMS_Abstraction.c **** break; + 257:Core/Src/ADBMS_Abstraction.c **** case CV_GROUP_D_ID: + 258:Core/Src/ADBMS_Abstraction.c **** readCMD(RDCVD, buffer, CFG_GROUP_A_SIZE); + ARM GAS /tmp/ccKQpHxH.s page 24 + + + 259:Core/Src/ADBMS_Abstraction.c **** break; + 260:Core/Src/ADBMS_Abstraction.c **** case CV_GROUP_E_ID: + 261:Core/Src/ADBMS_Abstraction.c **** readCMD(RDCVE, buffer, CFG_GROUP_A_SIZE); + 262:Core/Src/ADBMS_Abstraction.c **** break; + 263:Core/Src/ADBMS_Abstraction.c **** case CV_GROUP_F_ID: + 264:Core/Src/ADBMS_Abstraction.c **** readCMD(RDCVF, buffer, CFG_GROUP_A_SIZE); + 265:Core/Src/ADBMS_Abstraction.c **** break; + 266:Core/Src/ADBMS_Abstraction.c **** case AUX_GROUP_A_ID: + 267:Core/Src/ADBMS_Abstraction.c **** readCMD(RDAUXA, buffer, CFG_GROUP_A_SIZE); + 268:Core/Src/ADBMS_Abstraction.c **** break; + 269:Core/Src/ADBMS_Abstraction.c **** case AUX_GROUP_B_ID: + 270:Core/Src/ADBMS_Abstraction.c **** readCMD(RDAUXB, buffer, CFG_GROUP_A_SIZE); + 271:Core/Src/ADBMS_Abstraction.c **** break; + 272:Core/Src/ADBMS_Abstraction.c **** case AUX_GROUP_C_ID: + 273:Core/Src/ADBMS_Abstraction.c **** readCMD(RDAUXC, buffer, CFG_GROUP_A_SIZE); + 274:Core/Src/ADBMS_Abstraction.c **** break; + 275:Core/Src/ADBMS_Abstraction.c **** case AUX_GROUP_D_ID: + 276:Core/Src/ADBMS_Abstraction.c **** readCMD(RDAUXD, buffer, CFG_GROUP_A_SIZE); + 277:Core/Src/ADBMS_Abstraction.c **** break; + 278:Core/Src/ADBMS_Abstraction.c **** case STATUS_GROUP_A_ID: + 279:Core/Src/ADBMS_Abstraction.c **** readCMD(RDSTATA, buffer, CFG_GROUP_A_SIZE); + 280:Core/Src/ADBMS_Abstraction.c **** break; + 281:Core/Src/ADBMS_Abstraction.c **** case STATUS_GROUP_B_ID: + 282:Core/Src/ADBMS_Abstraction.c **** readCMD(RDSTATB, buffer, CFG_GROUP_A_SIZE); + 283:Core/Src/ADBMS_Abstraction.c **** break; + 284:Core/Src/ADBMS_Abstraction.c **** case COMM_GROUP_ID: + 285:Core/Src/ADBMS_Abstraction.c **** readCMD(RDCOMM, buffer, CFG_GROUP_A_SIZE); + 286:Core/Src/ADBMS_Abstraction.c **** break; + 287:Core/Src/ADBMS_Abstraction.c **** case S_CONTROL_GROUP_ID: + 288:Core/Src/ADBMS_Abstraction.c **** readCMD(RDSCTRL, buffer, CFG_GROUP_A_SIZE); + 289:Core/Src/ADBMS_Abstraction.c **** break; + 290:Core/Src/ADBMS_Abstraction.c **** case PWM_GROUP_ID: + 291:Core/Src/ADBMS_Abstraction.c **** readCMD(RDPWM, buffer, CFG_GROUP_A_SIZE); + 292:Core/Src/ADBMS_Abstraction.c **** break; + 293:Core/Src/ADBMS_Abstraction.c **** case PWM_S_CONTROL_GROUP_B_ID: + 294:Core/Src/ADBMS_Abstraction.c **** readCMD(RDPSB, buffer, CFG_GROUP_A_SIZE); + 295:Core/Src/ADBMS_Abstraction.c **** break; + 296:Core/Src/ADBMS_Abstraction.c **** } + 297:Core/Src/ADBMS_Abstraction.c **** } + 298:Core/Src/ADBMS_Abstraction.c **** */ + 299:Core/Src/ADBMS_Abstraction.c **** + 300:Core/Src/ADBMS_Abstraction.c **** uint8 amsClearStatus() + 301:Core/Src/ADBMS_Abstraction.c **** { + 1066 .loc 1 301 1 is_stmt 1 view -0 + 1067 .cfi_startproc + 1068 @ args = 0, pretend = 0, frame = 8 + 1069 @ frame_needed = 0, uses_anonymous_args = 0 + 1070 0000 00B5 push {lr} + 1071 .cfi_def_cfa_offset 4 + 1072 .cfi_offset 14, -4 + 1073 0002 83B0 sub sp, sp, #12 + 1074 .cfi_def_cfa_offset 16 + 302:Core/Src/ADBMS_Abstraction.c **** uint8 buffer[6]; + 1075 .loc 1 302 2 view .LVU300 + 303:Core/Src/ADBMS_Abstraction.c **** writeCMD(CLRSTAT, buffer, 0); + 1076 .loc 1 303 2 view .LVU301 + 1077 0004 0022 movs r2, #0 + ARM GAS /tmp/ccKQpHxH.s page 25 + + + 1078 0006 6946 mov r1, sp + 1079 0008 40F21370 movw r0, #1811 + 1080 000c FFF7FEFF bl writeCMD + 1081 .LVL81: + 304:Core/Src/ADBMS_Abstraction.c **** return 0; + 1082 .loc 1 304 2 view .LVU302 + 305:Core/Src/ADBMS_Abstraction.c **** } + 1083 .loc 1 305 1 is_stmt 0 view .LVU303 + 1084 0010 0020 movs r0, #0 + 1085 0012 03B0 add sp, sp, #12 + 1086 .cfi_def_cfa_offset 4 + 1087 @ sp needed + 1088 0014 5DF804FB ldr pc, [sp], #4 + 1089 .cfi_endproc + 1090 .LFE147: + 1092 .section .text.amsClearAux,"ax",%progbits + 1093 .align 1 + 1094 .global amsClearAux + 1095 .syntax unified + 1096 .thumb + 1097 .thumb_func + 1099 amsClearAux: + 1100 .LFB148: + 306:Core/Src/ADBMS_Abstraction.c **** uint8 amsClearAux() + 307:Core/Src/ADBMS_Abstraction.c **** { + 1101 .loc 1 307 1 is_stmt 1 view -0 + 1102 .cfi_startproc + 1103 @ args = 0, pretend = 0, frame = 8 + 1104 @ frame_needed = 0, uses_anonymous_args = 0 + 1105 0000 00B5 push {lr} + 1106 .cfi_def_cfa_offset 4 + 1107 .cfi_offset 14, -4 + 1108 0002 83B0 sub sp, sp, #12 + 1109 .cfi_def_cfa_offset 16 + 308:Core/Src/ADBMS_Abstraction.c **** uint8 buffer[6]; + 1110 .loc 1 308 2 view .LVU305 + 309:Core/Src/ADBMS_Abstraction.c **** writeCMD(CLRAUX, buffer, 0); + 1111 .loc 1 309 2 view .LVU306 + 1112 0004 0022 movs r2, #0 + 1113 0006 6946 mov r1, sp + 1114 0008 40F21270 movw r0, #1810 + 1115 000c FFF7FEFF bl writeCMD + 1116 .LVL82: + 310:Core/Src/ADBMS_Abstraction.c **** return 0; + 1117 .loc 1 310 2 view .LVU307 + 311:Core/Src/ADBMS_Abstraction.c **** } + 1118 .loc 1 311 1 is_stmt 0 view .LVU308 + 1119 0010 0020 movs r0, #0 + 1120 0012 03B0 add sp, sp, #12 + 1121 .cfi_def_cfa_offset 4 + 1122 @ sp needed + 1123 0014 5DF804FB ldr pc, [sp], #4 + 1124 .cfi_endproc + 1125 .LFE148: + 1127 .section .text.amsClearCells,"ax",%progbits + 1128 .align 1 + 1129 .global amsClearCells + ARM GAS /tmp/ccKQpHxH.s page 26 + + + 1130 .syntax unified + 1131 .thumb + 1132 .thumb_func + 1134 amsClearCells: + 1135 .LFB149: + 312:Core/Src/ADBMS_Abstraction.c **** uint8 amsClearCells() + 313:Core/Src/ADBMS_Abstraction.c **** { + 1136 .loc 1 313 1 is_stmt 1 view -0 + 1137 .cfi_startproc + 1138 @ args = 0, pretend = 0, frame = 8 + 1139 @ frame_needed = 0, uses_anonymous_args = 0 + 1140 0000 00B5 push {lr} + 1141 .cfi_def_cfa_offset 4 + 1142 .cfi_offset 14, -4 + 1143 0002 83B0 sub sp, sp, #12 + 1144 .cfi_def_cfa_offset 16 + 314:Core/Src/ADBMS_Abstraction.c **** uint8 buffer[6]; + 1145 .loc 1 314 2 view .LVU310 + 315:Core/Src/ADBMS_Abstraction.c **** writeCMD(CLRCELL, buffer, 0); + 1146 .loc 1 315 2 view .LVU311 + 1147 0004 0022 movs r2, #0 + 1148 0006 6946 mov r1, sp + 1149 0008 40F21170 movw r0, #1809 + 1150 000c FFF7FEFF bl writeCMD + 1151 .LVL83: + 316:Core/Src/ADBMS_Abstraction.c **** return 0; + 1152 .loc 1 316 2 view .LVU312 + 317:Core/Src/ADBMS_Abstraction.c **** } + 1153 .loc 1 317 1 is_stmt 0 view .LVU313 + 1154 0010 0020 movs r0, #0 + 1155 0012 03B0 add sp, sp, #12 + 1156 .cfi_def_cfa_offset 4 + 1157 @ sp needed + 1158 0014 5DF804FB ldr pc, [sp], #4 + 1159 .cfi_endproc + 1160 .LFE149: + 1162 .section .text.amsSendWarning,"ax",%progbits + 1163 .align 1 + 1164 .global amsSendWarning + 1165 .syntax unified + 1166 .thumb + 1167 .thumb_func + 1169 amsSendWarning: + 1170 .LFB150: + 318:Core/Src/ADBMS_Abstraction.c **** + 319:Core/Src/ADBMS_Abstraction.c **** uint8 amsSendWarning() + 320:Core/Src/ADBMS_Abstraction.c **** { + 1171 .loc 1 320 1 is_stmt 1 view -0 + 1172 .cfi_startproc + 1173 @ args = 0, pretend = 0, frame = 0 + 1174 @ frame_needed = 0, uses_anonymous_args = 0 + 1175 @ link register save eliminated. + 321:Core/Src/ADBMS_Abstraction.c **** //HAL_GPIO_WritePin(AMS_Warning_GPIO_Port, AMS_Warning_Pin, GPIO_PIN_SET); + 322:Core/Src/ADBMS_Abstraction.c **** return 0; + 1176 .loc 1 322 2 view .LVU315 + 323:Core/Src/ADBMS_Abstraction.c **** } + 1177 .loc 1 323 1 is_stmt 0 view .LVU316 + ARM GAS /tmp/ccKQpHxH.s page 27 + + + 1178 0000 0020 movs r0, #0 + 1179 0002 7047 bx lr + 1180 .cfi_endproc + 1181 .LFE150: + 1183 .section .text.amsSendError,"ax",%progbits + 1184 .align 1 + 1185 .global amsSendError + 1186 .syntax unified + 1187 .thumb + 1188 .thumb_func + 1190 amsSendError: + 1191 .LFB151: + 324:Core/Src/ADBMS_Abstraction.c **** + 325:Core/Src/ADBMS_Abstraction.c **** uint8 amsSendError() + 326:Core/Src/ADBMS_Abstraction.c **** { + 1192 .loc 1 326 1 is_stmt 1 view -0 + 1193 .cfi_startproc + 1194 @ args = 0, pretend = 0, frame = 0 + 1195 @ frame_needed = 0, uses_anonymous_args = 0 + 1196 @ link register save eliminated. + 327:Core/Src/ADBMS_Abstraction.c **** //HAL_GPIO_WritePin(AMS_Error_GPIO_Port, AMS_Error_Pin, GPIO_PIN_SET); + 328:Core/Src/ADBMS_Abstraction.c **** return 0; + 1197 .loc 1 328 2 view .LVU318 + 329:Core/Src/ADBMS_Abstraction.c **** } + 1198 .loc 1 329 1 is_stmt 0 view .LVU319 + 1199 0000 0020 movs r0, #0 + 1200 0002 7047 bx lr + 1201 .cfi_endproc + 1202 .LFE151: + 1204 .section .text.amsClearWarning,"ax",%progbits + 1205 .align 1 + 1206 .global amsClearWarning + 1207 .syntax unified + 1208 .thumb + 1209 .thumb_func + 1211 amsClearWarning: + 1212 .LFB152: + 330:Core/Src/ADBMS_Abstraction.c **** + 331:Core/Src/ADBMS_Abstraction.c **** uint8 amsClearWarning() + 332:Core/Src/ADBMS_Abstraction.c **** { + 1213 .loc 1 332 1 is_stmt 1 view -0 + 1214 .cfi_startproc + 1215 @ args = 0, pretend = 0, frame = 0 + 1216 @ frame_needed = 0, uses_anonymous_args = 0 + 1217 @ link register save eliminated. + 333:Core/Src/ADBMS_Abstraction.c **** //HAL_GPIO_WritePin(AMS_Warning_GPIO_Port, AMS_Warning_Pin, GPIO_PIN_RESET); + 334:Core/Src/ADBMS_Abstraction.c **** return 0; + 1218 .loc 1 334 2 view .LVU321 + 335:Core/Src/ADBMS_Abstraction.c **** } + 1219 .loc 1 335 1 is_stmt 0 view .LVU322 + 1220 0000 0020 movs r0, #0 + 1221 0002 7047 bx lr + 1222 .cfi_endproc + 1223 .LFE152: + 1225 .section .text.amsClearError,"ax",%progbits + 1226 .align 1 + 1227 .global amsClearError + ARM GAS /tmp/ccKQpHxH.s page 28 + + + 1228 .syntax unified + 1229 .thumb + 1230 .thumb_func + 1232 amsClearError: + 1233 .LFB153: + 336:Core/Src/ADBMS_Abstraction.c **** + 337:Core/Src/ADBMS_Abstraction.c **** uint8 amsClearError() + 338:Core/Src/ADBMS_Abstraction.c **** { + 1234 .loc 1 338 1 is_stmt 1 view -0 + 1235 .cfi_startproc + 1236 @ args = 0, pretend = 0, frame = 0 + 1237 @ frame_needed = 0, uses_anonymous_args = 0 + 1238 @ link register save eliminated. + 339:Core/Src/ADBMS_Abstraction.c **** //HAL_GPIO_WritePin(AMS_Error_GPIO_Port, AMS_Error_Pin, GPIO_PIN_RESET); + 340:Core/Src/ADBMS_Abstraction.c **** return 0; + 1239 .loc 1 340 2 view .LVU324 + 341:Core/Src/ADBMS_Abstraction.c **** } + 1240 .loc 1 341 1 is_stmt 0 view .LVU325 + 1241 0000 0020 movs r0, #0 + 1242 0002 7047 bx lr + 1243 .cfi_endproc + 1244 .LFE153: + 1246 .section .text.amsReadCellVoltages,"ax",%progbits + 1247 .align 1 + 1248 .global amsReadCellVoltages + 1249 .syntax unified + 1250 .thumb + 1251 .thumb_func + 1253 amsReadCellVoltages: + 1254 .LVL84: + 1255 .LFB155: + 342:Core/Src/ADBMS_Abstraction.c **** + 343:Core/Src/ADBMS_Abstraction.c **** uint8 amscheckOpenCellWire(Cell_Module *module) + 344:Core/Src/ADBMS_Abstraction.c **** { + 345:Core/Src/ADBMS_Abstraction.c **** uint8 args; + 346:Core/Src/ADBMS_Abstraction.c **** uint16 cellspu[18]; + 347:Core/Src/ADBMS_Abstraction.c **** + 348:Core/Src/ADBMS_Abstraction.c **** writeCMD(ADOW |MD01|CH000|PUP , &args, 0); //run Pull Up at least Twice + 349:Core/Src/ADBMS_Abstraction.c **** HAL_Delay(5); + 350:Core/Src/ADBMS_Abstraction.c **** writeCMD(ADOW |MD01|CH000|PUP , &args, 0); //run Pull Up at least Twice + 351:Core/Src/ADBMS_Abstraction.c **** HAL_Delay(5); + 352:Core/Src/ADBMS_Abstraction.c **** + 353:Core/Src/ADBMS_Abstraction.c **** amsReadCellVoltages(module); + 354:Core/Src/ADBMS_Abstraction.c **** + 355:Core/Src/ADBMS_Abstraction.c **** for(uint8_t n = 0; n cellVoltages[n]; + 358:Core/Src/ADBMS_Abstraction.c **** } + 359:Core/Src/ADBMS_Abstraction.c **** + 360:Core/Src/ADBMS_Abstraction.c **** + 361:Core/Src/ADBMS_Abstraction.c **** writeCMD(ADOW |MD01|CH000, &args, 0); //run Pull Up at least Twice + 362:Core/Src/ADBMS_Abstraction.c **** HAL_Delay(5); + 363:Core/Src/ADBMS_Abstraction.c **** writeCMD(ADOW |MD01|CH000, &args, 0); //run Pull Up at least Twice + 364:Core/Src/ADBMS_Abstraction.c **** HAL_Delay(5); + 365:Core/Src/ADBMS_Abstraction.c **** + 366:Core/Src/ADBMS_Abstraction.c **** amsReadCellVoltages(module); + 367:Core/Src/ADBMS_Abstraction.c **** + ARM GAS /tmp/ccKQpHxH.s page 29 + + + 368:Core/Src/ADBMS_Abstraction.c **** for(uint8 n = 1; n < numberofcells; n++) + 369:Core/Src/ADBMS_Abstraction.c **** { + 370:Core/Src/ADBMS_Abstraction.c **** int dv = cellspu[n]-module->cellVoltages[n]; + 371:Core/Src/ADBMS_Abstraction.c **** if(dv < -4000) + 372:Core/Src/ADBMS_Abstraction.c **** { + 373:Core/Src/ADBMS_Abstraction.c **** return (1+n); + 374:Core/Src/ADBMS_Abstraction.c **** } + 375:Core/Src/ADBMS_Abstraction.c **** } + 376:Core/Src/ADBMS_Abstraction.c **** if((cellspu[0] == 0) || (cellspu[0] == 0xFFFF)) + 377:Core/Src/ADBMS_Abstraction.c **** { + 378:Core/Src/ADBMS_Abstraction.c **** return 1; + 379:Core/Src/ADBMS_Abstraction.c **** } + 380:Core/Src/ADBMS_Abstraction.c **** if(module->cellVoltages[numberofcells-1] == 0) + 381:Core/Src/ADBMS_Abstraction.c **** { + 382:Core/Src/ADBMS_Abstraction.c **** return 19; + 383:Core/Src/ADBMS_Abstraction.c **** } + 384:Core/Src/ADBMS_Abstraction.c **** + 385:Core/Src/ADBMS_Abstraction.c **** return 0; + 386:Core/Src/ADBMS_Abstraction.c **** } + 387:Core/Src/ADBMS_Abstraction.c **** + 388:Core/Src/ADBMS_Abstraction.c **** uint8 amsReadCellVoltages(Cell_Module *module) + 389:Core/Src/ADBMS_Abstraction.c **** { + 1256 .loc 1 389 1 is_stmt 1 view -0 + 1257 .cfi_startproc + 1258 @ args = 0, pretend = 0, frame = 8 + 1259 @ frame_needed = 0, uses_anonymous_args = 0 + 1260 .loc 1 389 1 is_stmt 0 view .LVU327 + 1261 0000 10B5 push {r4, lr} + 1262 .cfi_def_cfa_offset 8 + 1263 .cfi_offset 4, -8 + 1264 .cfi_offset 14, -4 + 1265 0002 82B0 sub sp, sp, #8 + 1266 .cfi_def_cfa_offset 16 + 1267 0004 0446 mov r4, r0 + 390:Core/Src/ADBMS_Abstraction.c **** uint8 rxbuffer[CV_GROUP_A_SIZE]; + 1268 .loc 1 390 2 is_stmt 1 view .LVU328 + 391:Core/Src/ADBMS_Abstraction.c **** readCMD(RDCVA, rxbuffer, CV_GROUP_A_SIZE); + 1269 .loc 1 391 2 view .LVU329 + 1270 0006 0622 movs r2, #6 + 1271 0008 6946 mov r1, sp + 1272 000a 0420 movs r0, #4 + 1273 .LVL85: + 1274 .loc 1 391 2 is_stmt 0 view .LVU330 + 1275 000c FFF7FEFF bl readCMD + 1276 .LVL86: + 392:Core/Src/ADBMS_Abstraction.c **** module->cellVoltages[0] = rxbuffer[0] | (rxbuffer[1]<<8); + 1277 .loc 1 392 2 is_stmt 1 view .LVU331 + 1278 .loc 1 392 36 is_stmt 0 view .LVU332 + 1279 0010 9DF80030 ldrb r3, [sp] @ zero_extendqisi2 + 1280 .loc 1 392 51 view .LVU333 + 1281 0014 9DF80120 ldrb r2, [sp, #1] @ zero_extendqisi2 + 1282 .loc 1 392 40 view .LVU334 + 1283 0018 43EA0223 orr r3, r3, r2, lsl #8 + 1284 .loc 1 392 26 view .LVU335 + 1285 001c 2380 strh r3, [r4] @ movhi + 393:Core/Src/ADBMS_Abstraction.c **** module->cellVoltages[1] = rxbuffer[2] | (rxbuffer[3]<<8); + 1286 .loc 1 393 2 is_stmt 1 view .LVU336 + ARM GAS /tmp/ccKQpHxH.s page 30 + + + 1287 .loc 1 393 36 is_stmt 0 view .LVU337 + 1288 001e 9DF80230 ldrb r3, [sp, #2] @ zero_extendqisi2 + 1289 .loc 1 393 51 view .LVU338 + 1290 0022 9DF80320 ldrb r2, [sp, #3] @ zero_extendqisi2 + 1291 .loc 1 393 40 view .LVU339 + 1292 0026 43EA0223 orr r3, r3, r2, lsl #8 + 1293 .loc 1 393 26 view .LVU340 + 1294 002a 6380 strh r3, [r4, #2] @ movhi + 394:Core/Src/ADBMS_Abstraction.c **** module->cellVoltages[2] = rxbuffer[4] | (rxbuffer[5]<<8); + 1295 .loc 1 394 2 is_stmt 1 view .LVU341 + 1296 .loc 1 394 36 is_stmt 0 view .LVU342 + 1297 002c 9DF80430 ldrb r3, [sp, #4] @ zero_extendqisi2 + 1298 .loc 1 394 51 view .LVU343 + 1299 0030 9DF80520 ldrb r2, [sp, #5] @ zero_extendqisi2 + 1300 .loc 1 394 40 view .LVU344 + 1301 0034 43EA0223 orr r3, r3, r2, lsl #8 + 1302 .loc 1 394 26 view .LVU345 + 1303 0038 A380 strh r3, [r4, #4] @ movhi + 395:Core/Src/ADBMS_Abstraction.c **** + 396:Core/Src/ADBMS_Abstraction.c **** readCMD(RDCVB, rxbuffer, CV_GROUP_A_SIZE); + 1304 .loc 1 396 2 is_stmt 1 view .LVU346 + 1305 003a 0622 movs r2, #6 + 1306 003c 6946 mov r1, sp + 1307 003e 1046 mov r0, r2 + 1308 0040 FFF7FEFF bl readCMD + 1309 .LVL87: + 397:Core/Src/ADBMS_Abstraction.c **** module->cellVoltages[3] = rxbuffer[0] | (rxbuffer[1]<<8); + 1310 .loc 1 397 2 view .LVU347 + 1311 .loc 1 397 36 is_stmt 0 view .LVU348 + 1312 0044 9DF80030 ldrb r3, [sp] @ zero_extendqisi2 + 1313 .loc 1 397 51 view .LVU349 + 1314 0048 9DF80120 ldrb r2, [sp, #1] @ zero_extendqisi2 + 1315 .loc 1 397 40 view .LVU350 + 1316 004c 43EA0223 orr r3, r3, r2, lsl #8 + 1317 .loc 1 397 26 view .LVU351 + 1318 0050 E380 strh r3, [r4, #6] @ movhi + 398:Core/Src/ADBMS_Abstraction.c **** module->cellVoltages[4] = rxbuffer[2] | (rxbuffer[3]<<8); + 1319 .loc 1 398 2 is_stmt 1 view .LVU352 + 1320 .loc 1 398 36 is_stmt 0 view .LVU353 + 1321 0052 9DF80230 ldrb r3, [sp, #2] @ zero_extendqisi2 + 1322 .loc 1 398 51 view .LVU354 + 1323 0056 9DF80320 ldrb r2, [sp, #3] @ zero_extendqisi2 + 1324 .loc 1 398 40 view .LVU355 + 1325 005a 43EA0223 orr r3, r3, r2, lsl #8 + 1326 .loc 1 398 26 view .LVU356 + 1327 005e 2381 strh r3, [r4, #8] @ movhi + 399:Core/Src/ADBMS_Abstraction.c **** module->cellVoltages[5] = rxbuffer[4] | (rxbuffer[5]<<8); + 1328 .loc 1 399 2 is_stmt 1 view .LVU357 + 1329 .loc 1 399 36 is_stmt 0 view .LVU358 + 1330 0060 9DF80430 ldrb r3, [sp, #4] @ zero_extendqisi2 + 1331 .loc 1 399 51 view .LVU359 + 1332 0064 9DF80520 ldrb r2, [sp, #5] @ zero_extendqisi2 + 1333 .loc 1 399 40 view .LVU360 + 1334 0068 43EA0223 orr r3, r3, r2, lsl #8 + 1335 .loc 1 399 26 view .LVU361 + 1336 006c 6381 strh r3, [r4, #10] @ movhi + 400:Core/Src/ADBMS_Abstraction.c **** + ARM GAS /tmp/ccKQpHxH.s page 31 + + + 401:Core/Src/ADBMS_Abstraction.c **** readCMD(RDCVC, rxbuffer, CV_GROUP_A_SIZE); + 1337 .loc 1 401 2 is_stmt 1 view .LVU362 + 1338 006e 0622 movs r2, #6 + 1339 0070 6946 mov r1, sp + 1340 0072 0820 movs r0, #8 + 1341 0074 FFF7FEFF bl readCMD + 1342 .LVL88: + 402:Core/Src/ADBMS_Abstraction.c **** module->cellVoltages[6] = rxbuffer[0] | (rxbuffer[1]<<8); + 1343 .loc 1 402 2 view .LVU363 + 1344 .loc 1 402 36 is_stmt 0 view .LVU364 + 1345 0078 9DF80030 ldrb r3, [sp] @ zero_extendqisi2 + 1346 .loc 1 402 51 view .LVU365 + 1347 007c 9DF80120 ldrb r2, [sp, #1] @ zero_extendqisi2 + 1348 .loc 1 402 40 view .LVU366 + 1349 0080 43EA0223 orr r3, r3, r2, lsl #8 + 1350 .loc 1 402 26 view .LVU367 + 1351 0084 A381 strh r3, [r4, #12] @ movhi + 403:Core/Src/ADBMS_Abstraction.c **** module->cellVoltages[7] = rxbuffer[2] | (rxbuffer[3]<<8); + 1352 .loc 1 403 2 is_stmt 1 view .LVU368 + 1353 .loc 1 403 36 is_stmt 0 view .LVU369 + 1354 0086 9DF80230 ldrb r3, [sp, #2] @ zero_extendqisi2 + 1355 .loc 1 403 51 view .LVU370 + 1356 008a 9DF80320 ldrb r2, [sp, #3] @ zero_extendqisi2 + 1357 .loc 1 403 40 view .LVU371 + 1358 008e 43EA0223 orr r3, r3, r2, lsl #8 + 1359 .loc 1 403 26 view .LVU372 + 1360 0092 E381 strh r3, [r4, #14] @ movhi + 404:Core/Src/ADBMS_Abstraction.c **** module->cellVoltages[8] = rxbuffer[4] | (rxbuffer[5]<<8); + 1361 .loc 1 404 2 is_stmt 1 view .LVU373 + 1362 .loc 1 404 36 is_stmt 0 view .LVU374 + 1363 0094 9DF80430 ldrb r3, [sp, #4] @ zero_extendqisi2 + 1364 .loc 1 404 51 view .LVU375 + 1365 0098 9DF80520 ldrb r2, [sp, #5] @ zero_extendqisi2 + 1366 .loc 1 404 40 view .LVU376 + 1367 009c 43EA0223 orr r3, r3, r2, lsl #8 + 1368 .loc 1 404 26 view .LVU377 + 1369 00a0 2382 strh r3, [r4, #16] @ movhi + 405:Core/Src/ADBMS_Abstraction.c **** + 406:Core/Src/ADBMS_Abstraction.c **** readCMD(RDCVD, rxbuffer, CV_GROUP_A_SIZE); + 1370 .loc 1 406 2 is_stmt 1 view .LVU378 + 1371 00a2 0622 movs r2, #6 + 1372 00a4 6946 mov r1, sp + 1373 00a6 0A20 movs r0, #10 + 1374 00a8 FFF7FEFF bl readCMD + 1375 .LVL89: + 407:Core/Src/ADBMS_Abstraction.c **** module->cellVoltages[9] = rxbuffer[0] | (rxbuffer[1]<<8); + 1376 .loc 1 407 2 view .LVU379 + 1377 .loc 1 407 36 is_stmt 0 view .LVU380 + 1378 00ac 9DF80030 ldrb r3, [sp] @ zero_extendqisi2 + 1379 .loc 1 407 51 view .LVU381 + 1380 00b0 9DF80120 ldrb r2, [sp, #1] @ zero_extendqisi2 + 1381 .loc 1 407 40 view .LVU382 + 1382 00b4 43EA0223 orr r3, r3, r2, lsl #8 + 1383 .loc 1 407 26 view .LVU383 + 1384 00b8 6382 strh r3, [r4, #18] @ movhi + 408:Core/Src/ADBMS_Abstraction.c **** module->cellVoltages[10] = rxbuffer[2] | (rxbuffer[3]<<8); + 1385 .loc 1 408 2 is_stmt 1 view .LVU384 + ARM GAS /tmp/ccKQpHxH.s page 32 + + + 1386 .loc 1 408 37 is_stmt 0 view .LVU385 + 1387 00ba 9DF80230 ldrb r3, [sp, #2] @ zero_extendqisi2 + 1388 .loc 1 408 52 view .LVU386 + 1389 00be 9DF80320 ldrb r2, [sp, #3] @ zero_extendqisi2 + 1390 .loc 1 408 41 view .LVU387 + 1391 00c2 43EA0223 orr r3, r3, r2, lsl #8 + 1392 .loc 1 408 27 view .LVU388 + 1393 00c6 A382 strh r3, [r4, #20] @ movhi + 409:Core/Src/ADBMS_Abstraction.c **** module->cellVoltages[11] = rxbuffer[4] | (rxbuffer[5]<<8); + 1394 .loc 1 409 2 is_stmt 1 view .LVU389 + 1395 .loc 1 409 37 is_stmt 0 view .LVU390 + 1396 00c8 9DF80430 ldrb r3, [sp, #4] @ zero_extendqisi2 + 1397 .loc 1 409 52 view .LVU391 + 1398 00cc 9DF80520 ldrb r2, [sp, #5] @ zero_extendqisi2 + 1399 .loc 1 409 41 view .LVU392 + 1400 00d0 43EA0223 orr r3, r3, r2, lsl #8 + 1401 .loc 1 409 27 view .LVU393 + 1402 00d4 E382 strh r3, [r4, #22] @ movhi + 410:Core/Src/ADBMS_Abstraction.c **** + 411:Core/Src/ADBMS_Abstraction.c **** readCMD(RDCVE, rxbuffer, CV_GROUP_A_SIZE); + 1403 .loc 1 411 2 is_stmt 1 view .LVU394 + 1404 00d6 0622 movs r2, #6 + 1405 00d8 6946 mov r1, sp + 1406 00da 0920 movs r0, #9 + 1407 00dc FFF7FEFF bl readCMD + 1408 .LVL90: + 412:Core/Src/ADBMS_Abstraction.c **** module->cellVoltages[12] = rxbuffer[0] | (rxbuffer[1]<<8); + 1409 .loc 1 412 2 view .LVU395 + 1410 .loc 1 412 37 is_stmt 0 view .LVU396 + 1411 00e0 9DF80030 ldrb r3, [sp] @ zero_extendqisi2 + 1412 .loc 1 412 52 view .LVU397 + 1413 00e4 9DF80120 ldrb r2, [sp, #1] @ zero_extendqisi2 + 1414 .loc 1 412 41 view .LVU398 + 1415 00e8 43EA0223 orr r3, r3, r2, lsl #8 + 1416 .loc 1 412 27 view .LVU399 + 1417 00ec 2383 strh r3, [r4, #24] @ movhi + 413:Core/Src/ADBMS_Abstraction.c **** module->cellVoltages[13] = rxbuffer[2] | (rxbuffer[3]<<8); + 1418 .loc 1 413 2 is_stmt 1 view .LVU400 + 1419 .loc 1 413 37 is_stmt 0 view .LVU401 + 1420 00ee 9DF80230 ldrb r3, [sp, #2] @ zero_extendqisi2 + 1421 .loc 1 413 52 view .LVU402 + 1422 00f2 9DF80320 ldrb r2, [sp, #3] @ zero_extendqisi2 + 1423 .loc 1 413 41 view .LVU403 + 1424 00f6 43EA0223 orr r3, r3, r2, lsl #8 + 1425 .loc 1 413 27 view .LVU404 + 1426 00fa 6383 strh r3, [r4, #26] @ movhi + 414:Core/Src/ADBMS_Abstraction.c **** module->cellVoltages[14] = rxbuffer[4] | (rxbuffer[5]<<8); + 1427 .loc 1 414 2 is_stmt 1 view .LVU405 + 1428 .loc 1 414 37 is_stmt 0 view .LVU406 + 1429 00fc 9DF80430 ldrb r3, [sp, #4] @ zero_extendqisi2 + 1430 .loc 1 414 52 view .LVU407 + 1431 0100 9DF80520 ldrb r2, [sp, #5] @ zero_extendqisi2 + 1432 .loc 1 414 41 view .LVU408 + 1433 0104 43EA0223 orr r3, r3, r2, lsl #8 + 1434 .loc 1 414 27 view .LVU409 + 1435 0108 A383 strh r3, [r4, #28] @ movhi + 415:Core/Src/ADBMS_Abstraction.c **** + ARM GAS /tmp/ccKQpHxH.s page 33 + + + 416:Core/Src/ADBMS_Abstraction.c **** readCMD(RDCVF, rxbuffer, CV_GROUP_A_SIZE); + 1436 .loc 1 416 2 is_stmt 1 view .LVU410 + 1437 010a 0622 movs r2, #6 + 1438 010c 6946 mov r1, sp + 1439 010e 0B20 movs r0, #11 + 1440 0110 FFF7FEFF bl readCMD + 1441 .LVL91: + 417:Core/Src/ADBMS_Abstraction.c **** module->cellVoltages[15] = rxbuffer[0] | (rxbuffer[1]<<8); + 1442 .loc 1 417 2 view .LVU411 + 1443 .loc 1 417 37 is_stmt 0 view .LVU412 + 1444 0114 9DF80030 ldrb r3, [sp] @ zero_extendqisi2 + 1445 .loc 1 417 52 view .LVU413 + 1446 0118 9DF80120 ldrb r2, [sp, #1] @ zero_extendqisi2 + 1447 .loc 1 417 41 view .LVU414 + 1448 011c 43EA0223 orr r3, r3, r2, lsl #8 + 1449 .loc 1 417 27 view .LVU415 + 1450 0120 E383 strh r3, [r4, #30] @ movhi + 418:Core/Src/ADBMS_Abstraction.c **** module->cellVoltages[16] = rxbuffer[2] | (rxbuffer[3]<<8); + 1451 .loc 1 418 2 is_stmt 1 view .LVU416 + 1452 .loc 1 418 37 is_stmt 0 view .LVU417 + 1453 0122 9DF80230 ldrb r3, [sp, #2] @ zero_extendqisi2 + 1454 .loc 1 418 52 view .LVU418 + 1455 0126 9DF80320 ldrb r2, [sp, #3] @ zero_extendqisi2 + 1456 .loc 1 418 41 view .LVU419 + 1457 012a 43EA0223 orr r3, r3, r2, lsl #8 + 1458 .loc 1 418 27 view .LVU420 + 1459 012e 2384 strh r3, [r4, #32] @ movhi + 419:Core/Src/ADBMS_Abstraction.c **** module->cellVoltages[17] = rxbuffer[4] | (rxbuffer[5]<<8); + 1460 .loc 1 419 2 is_stmt 1 view .LVU421 + 1461 .loc 1 419 37 is_stmt 0 view .LVU422 + 1462 0130 9DF80430 ldrb r3, [sp, #4] @ zero_extendqisi2 + 1463 .loc 1 419 52 view .LVU423 + 1464 0134 9DF80520 ldrb r2, [sp, #5] @ zero_extendqisi2 + 1465 .loc 1 419 41 view .LVU424 + 1466 0138 43EA0223 orr r3, r3, r2, lsl #8 + 1467 .loc 1 419 27 view .LVU425 + 1468 013c 6384 strh r3, [r4, #34] @ movhi + 420:Core/Src/ADBMS_Abstraction.c **** + 421:Core/Src/ADBMS_Abstraction.c **** return 0; + 1469 .loc 1 421 2 is_stmt 1 view .LVU426 + 422:Core/Src/ADBMS_Abstraction.c **** } + 1470 .loc 1 422 1 is_stmt 0 view .LVU427 + 1471 013e 0020 movs r0, #0 + 1472 0140 02B0 add sp, sp, #8 + 1473 .cfi_def_cfa_offset 8 + 1474 @ sp needed + 1475 0142 10BD pop {r4, pc} + 1476 .loc 1 422 1 view .LVU428 + 1477 .cfi_endproc + 1478 .LFE155: + 1480 .section .text.amsCellMeasurement,"ax",%progbits + 1481 .align 1 + 1482 .global amsCellMeasurement + 1483 .syntax unified + 1484 .thumb + 1485 .thumb_func + 1487 amsCellMeasurement: + ARM GAS /tmp/ccKQpHxH.s page 34 + + + 1488 .LVL92: + 1489 .LFB132: + 39:Core/Src/ADBMS_Abstraction.c **** uint8_t rxbuffer[CV_GROUP_A_SIZE]; + 1490 .loc 1 39 1 is_stmt 1 view -0 + 1491 .cfi_startproc + 1492 @ args = 0, pretend = 0, frame = 8 + 1493 @ frame_needed = 0, uses_anonymous_args = 0 + 39:Core/Src/ADBMS_Abstraction.c **** uint8_t rxbuffer[CV_GROUP_A_SIZE]; + 1494 .loc 1 39 1 is_stmt 0 view .LVU430 + 1495 0000 10B5 push {r4, lr} + 1496 .cfi_def_cfa_offset 8 + 1497 .cfi_offset 4, -8 + 1498 .cfi_offset 14, -4 + 1499 0002 82B0 sub sp, sp, #8 + 1500 .cfi_def_cfa_offset 16 + 1501 0004 0446 mov r4, r0 + 40:Core/Src/ADBMS_Abstraction.c **** writeCMD((ADCV | CH000 | MD10), rxbuffer, 0); + 1502 .loc 1 40 2 is_stmt 1 view .LVU431 + 41:Core/Src/ADBMS_Abstraction.c **** mcuDelay(5); + 1503 .loc 1 41 2 view .LVU432 + 1504 0006 0022 movs r2, #0 + 1505 0008 6946 mov r1, sp + 1506 000a 4FF45870 mov r0, #864 + 1507 .LVL93: + 41:Core/Src/ADBMS_Abstraction.c **** mcuDelay(5); + 1508 .loc 1 41 2 is_stmt 0 view .LVU433 + 1509 000e FFF7FEFF bl writeCMD + 1510 .LVL94: + 42:Core/Src/ADBMS_Abstraction.c **** amsReadCellVoltages(module); + 1511 .loc 1 42 2 is_stmt 1 view .LVU434 + 1512 0012 0520 movs r0, #5 + 1513 0014 FFF7FEFF bl mcuDelay + 1514 .LVL95: + 43:Core/Src/ADBMS_Abstraction.c **** return 0; + 1515 .loc 1 43 2 view .LVU435 + 1516 0018 2046 mov r0, r4 + 1517 001a FFF7FEFF bl amsReadCellVoltages + 1518 .LVL96: + 44:Core/Src/ADBMS_Abstraction.c **** } + 1519 .loc 1 44 2 view .LVU436 + 45:Core/Src/ADBMS_Abstraction.c **** + 1520 .loc 1 45 1 is_stmt 0 view .LVU437 + 1521 001e 0020 movs r0, #0 + 1522 0020 02B0 add sp, sp, #8 + 1523 .cfi_def_cfa_offset 8 + 1524 @ sp needed + 1525 0022 10BD pop {r4, pc} + 45:Core/Src/ADBMS_Abstraction.c **** + 1526 .loc 1 45 1 view .LVU438 + 1527 .cfi_endproc + 1528 .LFE132: + 1530 .section .text.amscheckOpenCellWire,"ax",%progbits + 1531 .align 1 + 1532 .global amscheckOpenCellWire + 1533 .syntax unified + 1534 .thumb + 1535 .thumb_func + ARM GAS /tmp/ccKQpHxH.s page 35 + + + 1537 amscheckOpenCellWire: + 1538 .LVL97: + 1539 .LFB154: + 344:Core/Src/ADBMS_Abstraction.c **** uint8 args; + 1540 .loc 1 344 1 is_stmt 1 view -0 + 1541 .cfi_startproc + 1542 @ args = 0, pretend = 0, frame = 40 + 1543 @ frame_needed = 0, uses_anonymous_args = 0 + 344:Core/Src/ADBMS_Abstraction.c **** uint8 args; + 1544 .loc 1 344 1 is_stmt 0 view .LVU440 + 1545 0000 10B5 push {r4, lr} + 1546 .cfi_def_cfa_offset 8 + 1547 .cfi_offset 4, -8 + 1548 .cfi_offset 14, -4 + 1549 0002 8AB0 sub sp, sp, #40 + 1550 .cfi_def_cfa_offset 48 + 1551 0004 0446 mov r4, r0 + 345:Core/Src/ADBMS_Abstraction.c **** uint16 cellspu[18]; + 1552 .loc 1 345 2 is_stmt 1 view .LVU441 + 346:Core/Src/ADBMS_Abstraction.c **** + 1553 .loc 1 346 2 view .LVU442 + 348:Core/Src/ADBMS_Abstraction.c **** HAL_Delay(5); + 1554 .loc 1 348 2 view .LVU443 + 1555 0006 0022 movs r2, #0 + 1556 0008 0DF12701 add r1, sp, #39 + 1557 000c 4FF43A70 mov r0, #744 + 1558 .LVL98: + 348:Core/Src/ADBMS_Abstraction.c **** HAL_Delay(5); + 1559 .loc 1 348 2 is_stmt 0 view .LVU444 + 1560 0010 FFF7FEFF bl writeCMD + 1561 .LVL99: + 349:Core/Src/ADBMS_Abstraction.c **** writeCMD(ADOW |MD01|CH000|PUP , &args, 0); //run Pull Up at least Twice + 1562 .loc 1 349 2 is_stmt 1 view .LVU445 + 1563 0014 0520 movs r0, #5 + 1564 0016 FFF7FEFF bl HAL_Delay + 1565 .LVL100: + 350:Core/Src/ADBMS_Abstraction.c **** HAL_Delay(5); + 1566 .loc 1 350 2 view .LVU446 + 1567 001a 0022 movs r2, #0 + 1568 001c 0DF12701 add r1, sp, #39 + 1569 0020 4FF43A70 mov r0, #744 + 1570 0024 FFF7FEFF bl writeCMD + 1571 .LVL101: + 351:Core/Src/ADBMS_Abstraction.c **** + 1572 .loc 1 351 2 view .LVU447 + 1573 0028 0520 movs r0, #5 + 1574 002a FFF7FEFF bl HAL_Delay + 1575 .LVL102: + 353:Core/Src/ADBMS_Abstraction.c **** + 1576 .loc 1 353 2 view .LVU448 + 1577 002e 2046 mov r0, r4 + 1578 0030 FFF7FEFF bl amsReadCellVoltages + 1579 .LVL103: + 355:Core/Src/ADBMS_Abstraction.c **** { + 1580 .loc 1 355 2 view .LVU449 + 1581 .LBB6: + 355:Core/Src/ADBMS_Abstraction.c **** { + ARM GAS /tmp/ccKQpHxH.s page 36 + + + 1582 .loc 1 355 6 view .LVU450 + 355:Core/Src/ADBMS_Abstraction.c **** { + 1583 .loc 1 355 14 is_stmt 0 view .LVU451 + 1584 0034 0023 movs r3, #0 + 355:Core/Src/ADBMS_Abstraction.c **** { + 1585 .loc 1 355 2 view .LVU452 + 1586 0036 08E0 b .L52 + 1587 .LVL104: + 1588 .L53: + 357:Core/Src/ADBMS_Abstraction.c **** } + 1589 .loc 1 357 3 is_stmt 1 discriminator 3 view .LVU453 + 357:Core/Src/ADBMS_Abstraction.c **** } + 1590 .loc 1 357 36 is_stmt 0 discriminator 3 view .LVU454 + 1591 0038 34F81310 ldrh r1, [r4, r3, lsl #1] + 357:Core/Src/ADBMS_Abstraction.c **** } + 1592 .loc 1 357 14 discriminator 3 view .LVU455 + 1593 003c 0AAA add r2, sp, #40 + 1594 003e 02EB4302 add r2, r2, r3, lsl #1 + 1595 0042 22F8281C strh r1, [r2, #-40] @ movhi + 355:Core/Src/ADBMS_Abstraction.c **** { + 1596 .loc 1 355 40 is_stmt 1 discriminator 3 view .LVU456 + 1597 0046 0133 adds r3, r3, #1 + 1598 .LVL105: + 355:Core/Src/ADBMS_Abstraction.c **** { + 1599 .loc 1 355 40 is_stmt 0 discriminator 3 view .LVU457 + 1600 0048 DBB2 uxtb r3, r3 + 1601 .LVL106: + 1602 .L52: + 355:Core/Src/ADBMS_Abstraction.c **** { + 1603 .loc 1 355 23 is_stmt 1 discriminator 1 view .LVU458 + 1604 004a 224A ldr r2, .L62 + 1605 004c 1278 ldrb r2, [r2] @ zero_extendqisi2 + 1606 004e 9A42 cmp r2, r3 + 1607 0050 F2D8 bhi .L53 + 1608 .LBE6: + 361:Core/Src/ADBMS_Abstraction.c **** HAL_Delay(5); + 1609 .loc 1 361 2 view .LVU459 + 1610 0052 0022 movs r2, #0 + 1611 0054 0DF12701 add r1, sp, #39 + 1612 0058 4FF42A70 mov r0, #680 + 1613 005c FFF7FEFF bl writeCMD + 1614 .LVL107: + 362:Core/Src/ADBMS_Abstraction.c **** writeCMD(ADOW |MD01|CH000, &args, 0); //run Pull Up at least Twice + 1615 .loc 1 362 2 view .LVU460 + 1616 0060 0520 movs r0, #5 + 1617 0062 FFF7FEFF bl HAL_Delay + 1618 .LVL108: + 363:Core/Src/ADBMS_Abstraction.c **** HAL_Delay(5); + 1619 .loc 1 363 2 view .LVU461 + 1620 0066 0022 movs r2, #0 + 1621 0068 0DF12701 add r1, sp, #39 + 1622 006c 4FF42A70 mov r0, #680 + 1623 0070 FFF7FEFF bl writeCMD + 1624 .LVL109: + 364:Core/Src/ADBMS_Abstraction.c **** + 1625 .loc 1 364 2 view .LVU462 + 1626 0074 0520 movs r0, #5 + ARM GAS /tmp/ccKQpHxH.s page 37 + + + 1627 0076 FFF7FEFF bl HAL_Delay + 1628 .LVL110: + 366:Core/Src/ADBMS_Abstraction.c **** + 1629 .loc 1 366 2 view .LVU463 + 1630 007a 2046 mov r0, r4 + 1631 007c FFF7FEFF bl amsReadCellVoltages + 1632 .LVL111: + 368:Core/Src/ADBMS_Abstraction.c **** { + 1633 .loc 1 368 2 view .LVU464 + 1634 .LBB7: + 368:Core/Src/ADBMS_Abstraction.c **** { + 1635 .loc 1 368 6 view .LVU465 + 368:Core/Src/ADBMS_Abstraction.c **** { + 1636 .loc 1 368 12 is_stmt 0 view .LVU466 + 1637 0080 0123 movs r3, #1 + 368:Core/Src/ADBMS_Abstraction.c **** { + 1638 .loc 1 368 2 view .LVU467 + 1639 0082 01E0 b .L54 + 1640 .LVL112: + 1641 .L55: + 368:Core/Src/ADBMS_Abstraction.c **** { + 1642 .loc 1 368 39 is_stmt 1 discriminator 2 view .LVU468 + 1643 0084 0133 adds r3, r3, #1 + 1644 .LVL113: + 368:Core/Src/ADBMS_Abstraction.c **** { + 1645 .loc 1 368 39 is_stmt 0 discriminator 2 view .LVU469 + 1646 0086 DBB2 uxtb r3, r3 + 1647 .LVL114: + 1648 .L54: + 368:Core/Src/ADBMS_Abstraction.c **** { + 1649 .loc 1 368 21 is_stmt 1 discriminator 1 view .LVU470 + 1650 0088 124A ldr r2, .L62 + 1651 008a 1278 ldrb r2, [r2] @ zero_extendqisi2 + 1652 008c 9A42 cmp r2, r3 + 1653 008e 0ED9 bls .L61 + 1654 .LBB8: + 370:Core/Src/ADBMS_Abstraction.c **** if(dv < -4000) + 1655 .loc 1 370 3 view .LVU471 + 370:Core/Src/ADBMS_Abstraction.c **** if(dv < -4000) + 1656 .loc 1 370 19 is_stmt 0 view .LVU472 + 1657 0090 0AAA add r2, sp, #40 + 1658 0092 02EB4302 add r2, r2, r3, lsl #1 + 1659 0096 32F8282C ldrh r2, [r2, #-40] + 370:Core/Src/ADBMS_Abstraction.c **** if(dv < -4000) + 1660 .loc 1 370 43 view .LVU473 + 1661 009a 34F81310 ldrh r1, [r4, r3, lsl #1] + 370:Core/Src/ADBMS_Abstraction.c **** if(dv < -4000) + 1662 .loc 1 370 7 view .LVU474 + 1663 009e 521A subs r2, r2, r1 + 1664 .LVL115: + 371:Core/Src/ADBMS_Abstraction.c **** { + 1665 .loc 1 371 3 is_stmt 1 view .LVU475 + 371:Core/Src/ADBMS_Abstraction.c **** { + 1666 .loc 1 371 5 is_stmt 0 view .LVU476 + 1667 00a0 12F57A6F cmn r2, #4000 + 1668 00a4 EEDA bge .L55 + 373:Core/Src/ADBMS_Abstraction.c **** } + ARM GAS /tmp/ccKQpHxH.s page 38 + + + 1669 .loc 1 373 4 is_stmt 1 view .LVU477 + 373:Core/Src/ADBMS_Abstraction.c **** } + 1670 .loc 1 373 13 is_stmt 0 view .LVU478 + 1671 00a6 0133 adds r3, r3, #1 + 1672 .LVL116: + 373:Core/Src/ADBMS_Abstraction.c **** } + 1673 .loc 1 373 13 view .LVU479 + 1674 00a8 D8B2 uxtb r0, r3 + 1675 .LVL117: + 1676 .L56: + 373:Core/Src/ADBMS_Abstraction.c **** } + 1677 .loc 1 373 13 view .LVU480 + 1678 .LBE8: + 1679 .LBE7: + 386:Core/Src/ADBMS_Abstraction.c **** + 1680 .loc 1 386 1 view .LVU481 + 1681 00aa 0AB0 add sp, sp, #40 + 1682 .cfi_remember_state + 1683 .cfi_def_cfa_offset 8 + 1684 @ sp needed + 1685 00ac 10BD pop {r4, pc} + 1686 .LVL118: + 1687 .L61: + 1688 .cfi_restore_state + 376:Core/Src/ADBMS_Abstraction.c **** { + 1689 .loc 1 376 2 is_stmt 1 view .LVU482 + 376:Core/Src/ADBMS_Abstraction.c **** { + 1690 .loc 1 376 13 is_stmt 0 view .LVU483 + 1691 00ae BDF80030 ldrh r3, [sp] + 1692 .LVL119: + 376:Core/Src/ADBMS_Abstraction.c **** { + 1693 .loc 1 376 23 view .LVU484 + 1694 00b2 013B subs r3, r3, #1 + 1695 00b4 9BB2 uxth r3, r3 + 376:Core/Src/ADBMS_Abstraction.c **** { + 1696 .loc 1 376 4 view .LVU485 + 1697 00b6 4FF6FD71 movw r1, #65533 + 1698 00ba 8B42 cmp r3, r1 + 1699 00bc 05D8 bhi .L58 + 380:Core/Src/ADBMS_Abstraction.c **** { + 1700 .loc 1 380 2 is_stmt 1 view .LVU486 + 380:Core/Src/ADBMS_Abstraction.c **** { + 1701 .loc 1 380 39 is_stmt 0 view .LVU487 + 1702 00be 013A subs r2, r2, #1 + 380:Core/Src/ADBMS_Abstraction.c **** { + 1703 .loc 1 380 25 view .LVU488 + 1704 00c0 34F81230 ldrh r3, [r4, r2, lsl #1] + 380:Core/Src/ADBMS_Abstraction.c **** { + 1705 .loc 1 380 4 view .LVU489 + 1706 00c4 1BB1 cbz r3, .L59 + 385:Core/Src/ADBMS_Abstraction.c **** } + 1707 .loc 1 385 9 view .LVU490 + 1708 00c6 0020 movs r0, #0 + 1709 00c8 EFE7 b .L56 + 1710 .L58: + 378:Core/Src/ADBMS_Abstraction.c **** } + 1711 .loc 1 378 10 view .LVU491 + ARM GAS /tmp/ccKQpHxH.s page 39 + + + 1712 00ca 0120 movs r0, #1 + 1713 00cc EDE7 b .L56 + 1714 .L59: + 382:Core/Src/ADBMS_Abstraction.c **** } + 1715 .loc 1 382 10 view .LVU492 + 1716 00ce 1320 movs r0, #19 + 1717 00d0 EBE7 b .L56 + 1718 .L63: + 1719 00d2 00BF .align 2 + 1720 .L62: + 1721 00d4 00000000 .word numberofcells + 1722 .cfi_endproc + 1723 .LFE154: + 1725 .global numberofauxchannels + 1726 .section .bss.numberofauxchannels,"aw",%nobits + 1729 numberofauxchannels: + 1730 0000 00 .space 1 + 1731 .global numberofcells + 1732 .section .bss.numberofcells,"aw",%nobits + 1735 numberofcells: + 1736 0000 00 .space 1 + 1737 .text + 1738 .Letext0: + 1739 .file 2 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 1740 .file 3 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 1741 .file 4 "Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h" + 1742 .file 5 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h" + 1743 .file 6 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h" + 1744 .file 7 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h" + 1745 .file 8 "Core/Inc/ADBMS_LL_Driver.h" + 1746 .file 9 "Core/Inc/ADBMS_Abstraction.h" + 1747 .file 10 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h" + ARM GAS /tmp/ccKQpHxH.s page 40 + + +DEFINED SYMBOLS + *ABS*:0000000000000000 ADBMS_Abstraction.c + /tmp/ccKQpHxH.s:21 .text.amsWakeUp:0000000000000000 $t + /tmp/ccKQpHxH.s:27 .text.amsWakeUp:0000000000000000 amsWakeUp + /tmp/ccKQpHxH.s:56 .text.amsConfigCellMeasurement:0000000000000000 $t + /tmp/ccKQpHxH.s:62 .text.amsConfigCellMeasurement:0000000000000000 amsConfigCellMeasurement + /tmp/ccKQpHxH.s:83 .text.amsConfigCellMeasurement:0000000000000008 $d + /tmp/ccKQpHxH.s:1735 .bss.numberofcells:0000000000000000 numberofcells + /tmp/ccKQpHxH.s:88 .text.amsAuxMeasurement:0000000000000000 $t + /tmp/ccKQpHxH.s:94 .text.amsAuxMeasurement:0000000000000000 amsAuxMeasurement + /tmp/ccKQpHxH.s:249 .text.amsInternalStatusMeasurement:0000000000000000 $t + /tmp/ccKQpHxH.s:255 .text.amsInternalStatusMeasurement:0000000000000000 amsInternalStatusMeasurement + /tmp/ccKQpHxH.s:343 .text.amsConfigAuxMeasurement:0000000000000000 $t + /tmp/ccKQpHxH.s:349 .text.amsConfigAuxMeasurement:0000000000000000 amsConfigAuxMeasurement + /tmp/ccKQpHxH.s:412 .text.amsConfigGPIO:0000000000000000 $t + /tmp/ccKQpHxH.s:418 .text.amsConfigGPIO:0000000000000000 amsConfigGPIO + /tmp/ccKQpHxH.s:436 .text.amsSetGPIO:0000000000000000 $t + /tmp/ccKQpHxH.s:442 .text.amsSetGPIO:0000000000000000 amsSetGPIO + /tmp/ccKQpHxH.s:460 .text.readGPIO:0000000000000000 $t + /tmp/ccKQpHxH.s:466 .text.readGPIO:0000000000000000 readGPIO + /tmp/ccKQpHxH.s:484 .text.amsConfigBalancing:0000000000000000 $t + /tmp/ccKQpHxH.s:490 .text.amsConfigBalancing:0000000000000000 amsConfigBalancing + /tmp/ccKQpHxH.s:585 .text.amsStartBalancing:0000000000000000 $t + /tmp/ccKQpHxH.s:591 .text.amsStartBalancing:0000000000000000 amsStartBalancing + /tmp/ccKQpHxH.s:619 .text.amsStopBalancing:0000000000000000 $t + /tmp/ccKQpHxH.s:625 .text.amsStopBalancing:0000000000000000 amsStopBalancing + /tmp/ccKQpHxH.s:649 .text.amsSelfTest:0000000000000000 $t + /tmp/ccKQpHxH.s:655 .text.amsSelfTest:0000000000000000 amsSelfTest + /tmp/ccKQpHxH.s:670 .text.amsConfigUnderVoltage:0000000000000000 $t + /tmp/ccKQpHxH.s:676 .text.amsConfigUnderVoltage:0000000000000000 amsConfigUnderVoltage + /tmp/ccKQpHxH.s:735 .text.amsCheckUnderOverVoltage:0000000000000000 $t + /tmp/ccKQpHxH.s:741 .text.amsCheckUnderOverVoltage:0000000000000000 amsCheckUnderOverVoltage + /tmp/ccKQpHxH.s:930 .text.amsConfigOverVoltage:0000000000000000 $t + /tmp/ccKQpHxH.s:936 .text.amsConfigOverVoltage:0000000000000000 amsConfigOverVoltage + /tmp/ccKQpHxH.s:994 .text.initAMS:0000000000000000 $t + /tmp/ccKQpHxH.s:1000 .text.initAMS:0000000000000000 initAMS + /tmp/ccKQpHxH.s:1052 .text.initAMS:0000000000000038 $d + /tmp/ccKQpHxH.s:1729 .bss.numberofauxchannels:0000000000000000 numberofauxchannels + /tmp/ccKQpHxH.s:1058 .text.amsClearStatus:0000000000000000 $t + /tmp/ccKQpHxH.s:1064 .text.amsClearStatus:0000000000000000 amsClearStatus + /tmp/ccKQpHxH.s:1093 .text.amsClearAux:0000000000000000 $t + /tmp/ccKQpHxH.s:1099 .text.amsClearAux:0000000000000000 amsClearAux + /tmp/ccKQpHxH.s:1128 .text.amsClearCells:0000000000000000 $t + /tmp/ccKQpHxH.s:1134 .text.amsClearCells:0000000000000000 amsClearCells + /tmp/ccKQpHxH.s:1163 .text.amsSendWarning:0000000000000000 $t + /tmp/ccKQpHxH.s:1169 .text.amsSendWarning:0000000000000000 amsSendWarning + /tmp/ccKQpHxH.s:1184 .text.amsSendError:0000000000000000 $t + /tmp/ccKQpHxH.s:1190 .text.amsSendError:0000000000000000 amsSendError + /tmp/ccKQpHxH.s:1205 .text.amsClearWarning:0000000000000000 $t + /tmp/ccKQpHxH.s:1211 .text.amsClearWarning:0000000000000000 amsClearWarning + /tmp/ccKQpHxH.s:1226 .text.amsClearError:0000000000000000 $t + /tmp/ccKQpHxH.s:1232 .text.amsClearError:0000000000000000 amsClearError + /tmp/ccKQpHxH.s:1247 .text.amsReadCellVoltages:0000000000000000 $t + /tmp/ccKQpHxH.s:1253 .text.amsReadCellVoltages:0000000000000000 amsReadCellVoltages + /tmp/ccKQpHxH.s:1481 .text.amsCellMeasurement:0000000000000000 $t + /tmp/ccKQpHxH.s:1487 .text.amsCellMeasurement:0000000000000000 amsCellMeasurement + /tmp/ccKQpHxH.s:1531 .text.amscheckOpenCellWire:0000000000000000 $t + ARM GAS /tmp/ccKQpHxH.s page 41 + + + /tmp/ccKQpHxH.s:1537 .text.amscheckOpenCellWire:0000000000000000 amscheckOpenCellWire + /tmp/ccKQpHxH.s:1721 .text.amscheckOpenCellWire:00000000000000d4 $d + /tmp/ccKQpHxH.s:1730 .bss.numberofauxchannels:0000000000000000 $d + /tmp/ccKQpHxH.s:1736 .bss.numberofcells:0000000000000000 $d + +UNDEFINED SYMBOLS +readCMD +writeCMD +mcuDelay +adbmsDriverInit +HAL_Delay diff --git a/BMS_Testbench/BMS_Software_V1/build/ADBMS_Abstraction.o b/BMS_Testbench/BMS_Software_V1/build/ADBMS_Abstraction.o new file mode 100644 index 0000000000000000000000000000000000000000..9afe59341c9eb481d5a12ec8f2d4a7c55a22f194 GIT binary patch literal 24584 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 3) + 28:Core/Src/ADBMS_LL_Driver.c **** { + 29:Core/Src/ADBMS_LL_Driver.c **** for(int i = 0; i < (datalen-2); i++) + ARM GAS /tmp/ccJRsTlY.s page 2 + + + 30:Core/Src/ADBMS_LL_Driver.c **** { + 31:Core/Src/ADBMS_LL_Driver.c **** for(int n = 0; n < 8;n++) + 32:Core/Src/ADBMS_LL_Driver.c **** { + 33:Core/Src/ADBMS_LL_Driver.c **** uint8 din = data[i] << (n); + 34:Core/Src/ADBMS_LL_Driver.c **** currentpec = updatePEC(currentpec, din); + 35:Core/Src/ADBMS_LL_Driver.c **** } + 36:Core/Src/ADBMS_LL_Driver.c **** } + 37:Core/Src/ADBMS_LL_Driver.c **** + 38:Core/Src/ADBMS_LL_Driver.c **** data[datalen-2] = (currentpec>>7) & 0xFF; + 39:Core/Src/ADBMS_LL_Driver.c **** data[datalen-1] = (currentpec<<1) & 0xFF; + 40:Core/Src/ADBMS_LL_Driver.c **** return 0; + 41:Core/Src/ADBMS_LL_Driver.c **** } + 42:Core/Src/ADBMS_LL_Driver.c **** + 43:Core/Src/ADBMS_LL_Driver.c **** else + 44:Core/Src/ADBMS_LL_Driver.c **** { + 45:Core/Src/ADBMS_LL_Driver.c **** return 1; + 46:Core/Src/ADBMS_LL_Driver.c **** } + 47:Core/Src/ADBMS_LL_Driver.c **** } + 48:Core/Src/ADBMS_LL_Driver.c **** + 49:Core/Src/ADBMS_LL_Driver.c **** uint8 checkPEC(uint8* data, uint8 datalen) + 50:Core/Src/ADBMS_LL_Driver.c **** { + 51:Core/Src/ADBMS_LL_Driver.c **** if(datalen <= 3) + 52:Core/Src/ADBMS_LL_Driver.c **** { + 53:Core/Src/ADBMS_LL_Driver.c **** return 255; + 54:Core/Src/ADBMS_LL_Driver.c **** } + 55:Core/Src/ADBMS_LL_Driver.c **** + 56:Core/Src/ADBMS_LL_Driver.c **** uint16 currentpec = INITAL_PEC; + 57:Core/Src/ADBMS_LL_Driver.c **** + 58:Core/Src/ADBMS_LL_Driver.c **** for(int i = 0; i < (datalen-2); i++) + 59:Core/Src/ADBMS_LL_Driver.c **** { + 60:Core/Src/ADBMS_LL_Driver.c **** for(int n = 0; n < 8;n++) + 61:Core/Src/ADBMS_LL_Driver.c **** { + 62:Core/Src/ADBMS_LL_Driver.c **** uint8 din = data[i] << (n); + 63:Core/Src/ADBMS_LL_Driver.c **** currentpec = updatePEC(currentpec, din); + 64:Core/Src/ADBMS_LL_Driver.c **** } + 65:Core/Src/ADBMS_LL_Driver.c **** } + 66:Core/Src/ADBMS_LL_Driver.c **** + 67:Core/Src/ADBMS_LL_Driver.c **** uint8 pechigh = (currentpec>>7) & 0xFF; + 68:Core/Src/ADBMS_LL_Driver.c **** uint8 peclow = (currentpec<<1) & 0xFF; + 69:Core/Src/ADBMS_LL_Driver.c **** + 70:Core/Src/ADBMS_LL_Driver.c **** if((pechigh == data[datalen-2]) && (peclow == data[datalen-1])) + 71:Core/Src/ADBMS_LL_Driver.c **** { + 72:Core/Src/ADBMS_LL_Driver.c **** return 0; + 73:Core/Src/ADBMS_LL_Driver.c **** } + 74:Core/Src/ADBMS_LL_Driver.c **** + 75:Core/Src/ADBMS_LL_Driver.c **** return 1; + 76:Core/Src/ADBMS_LL_Driver.c **** + 77:Core/Src/ADBMS_LL_Driver.c **** } + 78:Core/Src/ADBMS_LL_Driver.c **** + 79:Core/Src/ADBMS_LL_Driver.c **** uint16 updatePEC(uint16 currentPEC, uint8 din) + 80:Core/Src/ADBMS_LL_Driver.c **** { + 30 .loc 1 80 1 view -0 + 31 .cfi_startproc + 32 @ args = 0, pretend = 0, frame = 0 + 33 @ frame_needed = 0, uses_anonymous_args = 0 + 34 .loc 1 80 1 is_stmt 0 view .LVU1 + 35 0000 70B5 push {r4, r5, r6, lr} + ARM GAS /tmp/ccJRsTlY.s page 3 + + + 36 .cfi_def_cfa_offset 16 + 37 .cfi_offset 4, -16 + 38 .cfi_offset 5, -12 + 39 .cfi_offset 6, -8 + 40 .cfi_offset 14, -4 + 81:Core/Src/ADBMS_LL_Driver.c **** din = (din>>7) & 0x01; + 41 .loc 1 81 5 is_stmt 1 view .LVU2 + 42 .LVL1: + 82:Core/Src/ADBMS_LL_Driver.c **** uint8 in0 = din ^ ((currentPEC >> 14) &0x01); + 43 .loc 1 82 5 view .LVU3 + 44 .loc 1 82 43 is_stmt 0 view .LVU4 + 45 0002 C0F38032 ubfx r2, r0, #14, #1 + 46 .loc 1 82 21 view .LVU5 + 47 0006 82EAD113 eor r3, r2, r1, lsr #7 + 48 .loc 1 82 11 view .LVU6 + 49 000a 1946 mov r1, r3 + 50 .LVL2: + 83:Core/Src/ADBMS_LL_Driver.c **** uint8 in3 = in0 ^ ((currentPEC >> 2) &0x01); + 51 .loc 1 83 5 is_stmt 1 view .LVU7 + 52 .loc 1 83 42 is_stmt 0 view .LVU8 + 53 000c C0F38002 ubfx r2, r0, #2, #1 + 54 .loc 1 83 11 view .LVU9 + 55 0010 5A40 eors r2, r2, r3 + 56 .LVL3: + 84:Core/Src/ADBMS_LL_Driver.c **** uint8 in4 = in0 ^ ((currentPEC >> 3) &0x01); + 57 .loc 1 84 5 is_stmt 1 view .LVU10 + 58 .loc 1 84 42 is_stmt 0 view .LVU11 + 59 0012 C0F3C00C ubfx ip, r0, #3, #1 + 60 .loc 1 84 11 view .LVU12 + 61 0016 83EA0C0C eor ip, r3, ip + 62 .LVL4: + 85:Core/Src/ADBMS_LL_Driver.c **** uint8 in7 = in0 ^ ((currentPEC >> 6) &0x01); + 63 .loc 1 85 5 is_stmt 1 view .LVU13 + 64 .loc 1 85 42 is_stmt 0 view .LVU14 + 65 001a C0F3801E ubfx lr, r0, #6, #1 + 66 .loc 1 85 11 view .LVU15 + 67 001e 83EA0E0E eor lr, r3, lr + 68 .LVL5: + 86:Core/Src/ADBMS_LL_Driver.c **** uint8 in8 = in0 ^ ((currentPEC >> 7) &0x01); + 69 .loc 1 86 5 is_stmt 1 view .LVU16 + 70 .loc 1 86 42 is_stmt 0 view .LVU17 + 71 0022 C0F3C014 ubfx r4, r0, #7, #1 + 72 .loc 1 86 11 view .LVU18 + 73 0026 5C40 eors r4, r4, r3 + 74 .LVL6: + 87:Core/Src/ADBMS_LL_Driver.c **** uint8 in10 = in0 ^ ((currentPEC >> 9) &0x01); + 75 .loc 1 87 5 is_stmt 1 view .LVU19 + 76 .loc 1 87 43 is_stmt 0 view .LVU20 + 77 0028 C0F34025 ubfx r5, r0, #9, #1 + 78 .loc 1 87 11 view .LVU21 + 79 002c 5D40 eors r5, r5, r3 + 80 .LVL7: + 88:Core/Src/ADBMS_LL_Driver.c **** uint8 in14 = in0 ^ ((currentPEC >> 13) &0x01); + 81 .loc 1 88 5 is_stmt 1 view .LVU22 + 82 .loc 1 88 44 is_stmt 0 view .LVU23 + 83 002e C0F34036 ubfx r6, r0, #13, #1 + 84 .loc 1 88 11 view .LVU24 + ARM GAS /tmp/ccJRsTlY.s page 4 + + + 85 0032 5E40 eors r6, r6, r3 + 86 .LVL8: + 89:Core/Src/ADBMS_LL_Driver.c **** + 90:Core/Src/ADBMS_LL_Driver.c **** uint16 newPEC = 0; + 87 .loc 1 90 5 is_stmt 1 view .LVU25 + 91:Core/Src/ADBMS_LL_Driver.c **** + 92:Core/Src/ADBMS_LL_Driver.c **** newPEC |= in14<<14; + 88 .loc 1 92 5 view .LVU26 + 93:Core/Src/ADBMS_LL_Driver.c **** newPEC |= (currentPEC & (0x01<<12))<<1; + 89 .loc 1 93 5 view .LVU27 + 90 .loc 1 93 40 is_stmt 0 view .LVU28 + 91 0034 4000 lsls r0, r0, #1 + 92 .LVL9: + 93 .loc 1 93 40 view .LVU29 + 94 0036 00F40053 and r3, r0, #8192 + 95 .LVL10: + 96 .loc 1 93 12 view .LVU30 + 97 003a 43EA8633 orr r3, r3, r6, lsl #14 + 98 .LVL11: + 94:Core/Src/ADBMS_LL_Driver.c **** newPEC |= (currentPEC & (0x01<<11))<<1; + 99 .loc 1 94 5 is_stmt 1 view .LVU31 + 100 .loc 1 94 40 is_stmt 0 view .LVU32 + 101 003e 00F48056 and r6, r0, #4096 + 102 .LVL12: + 103 .loc 1 94 12 view .LVU33 + 104 0042 3343 orrs r3, r3, r6 + 105 .LVL13: + 106 .loc 1 94 12 view .LVU34 + 107 0044 1BB2 sxth r3, r3 + 108 .LVL14: + 95:Core/Src/ADBMS_LL_Driver.c **** newPEC |= (currentPEC & (0x01<<10))<<1; + 109 .loc 1 95 5 is_stmt 1 view .LVU35 + 110 .loc 1 95 40 is_stmt 0 view .LVU36 + 111 0046 00F40066 and r6, r0, #2048 + 112 .loc 1 95 12 view .LVU37 + 113 004a 3343 orrs r3, r3, r6 + 114 .LVL15: + 96:Core/Src/ADBMS_LL_Driver.c **** newPEC |= in10<<10; + 115 .loc 1 96 5 is_stmt 1 view .LVU38 + 116 .loc 1 96 12 is_stmt 0 view .LVU39 + 117 004c 43EA8523 orr r3, r3, r5, lsl #10 + 118 .LVL16: + 97:Core/Src/ADBMS_LL_Driver.c **** newPEC |= (currentPEC & (0x01<<8))<<1; + 119 .loc 1 97 5 is_stmt 1 view .LVU40 + 120 .loc 1 97 39 is_stmt 0 view .LVU41 + 121 0050 00F40075 and r5, r0, #512 + 122 .LVL17: + 123 .loc 1 97 12 view .LVU42 + 124 0054 2B43 orrs r3, r3, r5 + 125 .LVL18: + 126 .loc 1 97 12 view .LVU43 + 127 0056 1BB2 sxth r3, r3 + 128 .LVL19: + 98:Core/Src/ADBMS_LL_Driver.c **** newPEC |= in8<<8; + 129 .loc 1 98 5 is_stmt 1 view .LVU44 + 130 .loc 1 98 12 is_stmt 0 view .LVU45 + 131 0058 43EA0423 orr r3, r3, r4, lsl #8 + ARM GAS /tmp/ccJRsTlY.s page 5 + + + 132 .LVL20: + 99:Core/Src/ADBMS_LL_Driver.c **** newPEC |= in7<<7; + 133 .loc 1 99 5 is_stmt 1 view .LVU46 + 134 .loc 1 99 12 is_stmt 0 view .LVU47 + 135 005c 43EACE13 orr r3, r3, lr, lsl #7 + 136 .LVL21: + 100:Core/Src/ADBMS_LL_Driver.c **** newPEC |= (currentPEC & (0x01<<5))<<1; + 137 .loc 1 100 5 is_stmt 1 view .LVU48 + 138 .loc 1 100 39 is_stmt 0 view .LVU49 + 139 0060 00F04004 and r4, r0, #64 + 140 .LVL22: + 141 .loc 1 100 12 view .LVU50 + 142 0064 2343 orrs r3, r3, r4 + 143 .LVL23: + 144 .loc 1 100 12 view .LVU51 + 145 0066 1BB2 sxth r3, r3 + 146 .LVL24: + 101:Core/Src/ADBMS_LL_Driver.c **** newPEC |= (currentPEC & (0x01<<4))<<1; + 147 .loc 1 101 5 is_stmt 1 view .LVU52 + 148 .loc 1 101 39 is_stmt 0 view .LVU53 + 149 0068 00F02004 and r4, r0, #32 + 150 .loc 1 101 12 view .LVU54 + 151 006c 2343 orrs r3, r3, r4 + 152 .LVL25: + 102:Core/Src/ADBMS_LL_Driver.c **** newPEC |= in4<<4; + 153 .loc 1 102 5 is_stmt 1 view .LVU55 + 154 .loc 1 102 12 is_stmt 0 view .LVU56 + 155 006e 43EA0C13 orr r3, r3, ip, lsl #4 + 156 .LVL26: + 103:Core/Src/ADBMS_LL_Driver.c **** newPEC |= in3<<3; + 157 .loc 1 103 5 is_stmt 1 view .LVU57 + 158 .loc 1 103 12 is_stmt 0 view .LVU58 + 159 0072 43EAC203 orr r3, r3, r2, lsl #3 + 160 .LVL27: + 104:Core/Src/ADBMS_LL_Driver.c **** newPEC |= (currentPEC & (0x01<<1))<<1; + 161 .loc 1 104 5 is_stmt 1 view .LVU59 + 162 .loc 1 104 39 is_stmt 0 view .LVU60 + 163 0076 00F00402 and r2, r0, #4 + 164 .LVL28: + 165 .loc 1 104 12 view .LVU61 + 166 007a 1343 orrs r3, r3, r2 + 167 .LVL29: + 168 .loc 1 104 12 view .LVU62 + 169 007c 1BB2 sxth r3, r3 + 170 .LVL30: + 105:Core/Src/ADBMS_LL_Driver.c **** newPEC |= (currentPEC & (0x01))<<1; + 171 .loc 1 105 5 is_stmt 1 view .LVU63 + 172 .loc 1 105 36 is_stmt 0 view .LVU64 + 173 007e 00F00200 and r0, r0, #2 + 174 .loc 1 105 12 view .LVU65 + 175 0082 0343 orrs r3, r3, r0 + 176 .LVL31: + 177 .loc 1 105 12 view .LVU66 + 178 0084 9BB2 uxth r3, r3 + 179 .LVL32: + 106:Core/Src/ADBMS_LL_Driver.c **** newPEC |= in0; + 180 .loc 1 106 5 is_stmt 1 view .LVU67 + ARM GAS /tmp/ccJRsTlY.s page 6 + + + 107:Core/Src/ADBMS_LL_Driver.c **** + 108:Core/Src/ADBMS_LL_Driver.c **** + 109:Core/Src/ADBMS_LL_Driver.c **** return newPEC; + 181 .loc 1 109 5 view .LVU68 + 110:Core/Src/ADBMS_LL_Driver.c **** } + 182 .loc 1 110 1 is_stmt 0 view .LVU69 + 183 0086 41EA0300 orr r0, r1, r3 + 184 .LVL33: + 185 .loc 1 110 1 view .LVU70 + 186 008a 70BD pop {r4, r5, r6, pc} + 187 .cfi_endproc + 188 .LFE133: + 190 .section .text.calculatePEC,"ax",%progbits + 191 .align 1 + 192 .global calculatePEC + 193 .syntax unified + 194 .thumb + 195 .thumb_func + 197 calculatePEC: + 198 .LVL34: + 199 .LFB131: + 25:Core/Src/ADBMS_LL_Driver.c **** uint16 currentpec = INITAL_PEC; + 200 .loc 1 25 1 is_stmt 1 view -0 + 201 .cfi_startproc + 202 @ args = 0, pretend = 0, frame = 0 + 203 @ frame_needed = 0, uses_anonymous_args = 0 + 26:Core/Src/ADBMS_LL_Driver.c **** if(datalen >= 3) + 204 .loc 1 26 5 view .LVU72 + 27:Core/Src/ADBMS_LL_Driver.c **** { + 205 .loc 1 27 5 view .LVU73 + 27:Core/Src/ADBMS_LL_Driver.c **** { + 206 .loc 1 27 7 is_stmt 0 view .LVU74 + 207 0000 0229 cmp r1, #2 + 208 0002 0FD8 bhi .L8 + 45:Core/Src/ADBMS_LL_Driver.c **** } + 209 .loc 1 45 16 view .LVU75 + 210 0004 0120 movs r0, #1 + 211 .LVL35: + 47:Core/Src/ADBMS_LL_Driver.c **** + 212 .loc 1 47 1 view .LVU76 + 213 0006 7047 bx lr + 214 .LVL36: + 215 .L6: + 216 .cfi_def_cfa_offset 24 + 217 .cfi_offset 3, -24 + 218 .cfi_offset 4, -20 + 219 .cfi_offset 5, -16 + 220 .cfi_offset 6, -12 + 221 .cfi_offset 7, -8 + 222 .cfi_offset 14, -4 + 223 .LBB2: + 224 .LBB3: + 225 .LBB4: + 33:Core/Src/ADBMS_LL_Driver.c **** currentpec = updatePEC(currentpec, din); + 226 .loc 1 33 17 is_stmt 1 discriminator 3 view .LVU77 + 33:Core/Src/ADBMS_LL_Driver.c **** currentpec = updatePEC(currentpec, din); + 227 .loc 1 33 33 is_stmt 0 discriminator 3 view .LVU78 + ARM GAS /tmp/ccJRsTlY.s page 7 + + + 228 0008 E95D ldrb r1, [r5, r7] @ zero_extendqisi2 + 33:Core/Src/ADBMS_LL_Driver.c **** currentpec = updatePEC(currentpec, din); + 229 .loc 1 33 37 discriminator 3 view .LVU79 + 230 000a A140 lsls r1, r1, r4 + 231 .LVL37: + 34:Core/Src/ADBMS_LL_Driver.c **** } + 232 .loc 1 34 17 is_stmt 1 discriminator 3 view .LVU80 + 34:Core/Src/ADBMS_LL_Driver.c **** } + 233 .loc 1 34 30 is_stmt 0 discriminator 3 view .LVU81 + 234 000c C9B2 uxtb r1, r1 + 34:Core/Src/ADBMS_LL_Driver.c **** } + 235 .loc 1 34 30 discriminator 3 view .LVU82 + 236 000e FFF7FEFF bl updatePEC + 237 .LVL38: + 34:Core/Src/ADBMS_LL_Driver.c **** } + 238 .loc 1 34 30 discriminator 3 view .LVU83 + 239 .LBE4: + 31:Core/Src/ADBMS_LL_Driver.c **** { + 240 .loc 1 31 35 is_stmt 1 discriminator 3 view .LVU84 + 241 0012 0134 adds r4, r4, #1 + 242 .LVL39: + 243 .L7: + 31:Core/Src/ADBMS_LL_Driver.c **** { + 244 .loc 1 31 30 discriminator 1 view .LVU85 + 245 0014 072C cmp r4, #7 + 246 0016 F7DD ble .L6 + 31:Core/Src/ADBMS_LL_Driver.c **** { + 247 .loc 1 31 30 is_stmt 0 discriminator 1 view .LVU86 + 248 .LBE3: + 29:Core/Src/ADBMS_LL_Driver.c **** { + 249 .loc 1 29 42 is_stmt 1 discriminator 2 view .LVU87 + 250 0018 0137 adds r7, r7, #1 + 251 .LVL40: + 252 .L4: + 29:Core/Src/ADBMS_LL_Driver.c **** { + 253 .loc 1 29 26 discriminator 1 view .LVU88 + 29:Core/Src/ADBMS_LL_Driver.c **** { + 254 .loc 1 29 36 is_stmt 0 discriminator 1 view .LVU89 + 255 001a B31E subs r3, r6, #2 + 29:Core/Src/ADBMS_LL_Driver.c **** { + 256 .loc 1 29 26 discriminator 1 view .LVU90 + 257 001c BB42 cmp r3, r7 + 258 001e 07DD ble .L13 + 259 .LBB5: + 31:Core/Src/ADBMS_LL_Driver.c **** { + 260 .loc 1 31 21 view .LVU91 + 261 0020 0024 movs r4, #0 + 262 0022 F7E7 b .L7 + 263 .LVL41: + 264 .L8: + 265 .cfi_def_cfa_offset 0 + 266 .cfi_restore 3 + 267 .cfi_restore 4 + 268 .cfi_restore 5 + 269 .cfi_restore 6 + 270 .cfi_restore 7 + 271 .cfi_restore 14 + ARM GAS /tmp/ccJRsTlY.s page 8 + + + 31:Core/Src/ADBMS_LL_Driver.c **** { + 272 .loc 1 31 21 view .LVU92 + 273 .LBE5: + 274 .LBE2: + 25:Core/Src/ADBMS_LL_Driver.c **** uint16 currentpec = INITAL_PEC; + 275 .loc 1 25 1 view .LVU93 + 276 0024 F8B5 push {r3, r4, r5, r6, r7, lr} + 277 .cfi_def_cfa_offset 24 + 278 .cfi_offset 3, -24 + 279 .cfi_offset 4, -20 + 280 .cfi_offset 5, -16 + 281 .cfi_offset 6, -12 + 282 .cfi_offset 7, -8 + 283 .cfi_offset 14, -4 + 284 0026 0546 mov r5, r0 + 285 0028 0E46 mov r6, r1 + 286 .LBB6: + 29:Core/Src/ADBMS_LL_Driver.c **** { + 287 .loc 1 29 17 view .LVU94 + 288 002a 0027 movs r7, #0 + 289 .LBE6: + 26:Core/Src/ADBMS_LL_Driver.c **** if(datalen >= 3) + 290 .loc 1 26 12 view .LVU95 + 291 002c 1020 movs r0, #16 + 292 .LVL42: + 26:Core/Src/ADBMS_LL_Driver.c **** if(datalen >= 3) + 293 .loc 1 26 12 view .LVU96 + 294 002e F4E7 b .L4 + 295 .LVL43: + 296 .L13: + 38:Core/Src/ADBMS_LL_Driver.c **** data[datalen-1] = (currentpec<<1) & 0xFF; + 297 .loc 1 38 9 is_stmt 1 view .LVU97 + 38:Core/Src/ADBMS_LL_Driver.c **** data[datalen-1] = (currentpec<<1) & 0xFF; + 298 .loc 1 38 25 is_stmt 0 view .LVU98 + 299 0030 C209 lsrs r2, r0, #7 + 300 0032 EA54 strb r2, [r5, r3] + 39:Core/Src/ADBMS_LL_Driver.c **** return 0; + 301 .loc 1 39 9 is_stmt 1 view .LVU99 + 39:Core/Src/ADBMS_LL_Driver.c **** return 0; + 302 .loc 1 39 38 is_stmt 0 view .LVU100 + 303 0034 4300 lsls r3, r0, #1 + 39:Core/Src/ADBMS_LL_Driver.c **** return 0; + 304 .loc 1 39 13 view .LVU101 + 305 0036 013E subs r6, r6, #1 + 39:Core/Src/ADBMS_LL_Driver.c **** return 0; + 306 .loc 1 39 25 view .LVU102 + 307 0038 AB55 strb r3, [r5, r6] + 40:Core/Src/ADBMS_LL_Driver.c **** } + 308 .loc 1 40 9 is_stmt 1 view .LVU103 + 40:Core/Src/ADBMS_LL_Driver.c **** } + 309 .loc 1 40 16 is_stmt 0 view .LVU104 + 310 003a 0020 movs r0, #0 + 311 .LVL44: + 47:Core/Src/ADBMS_LL_Driver.c **** + 312 .loc 1 47 1 view .LVU105 + 313 003c F8BD pop {r3, r4, r5, r6, r7, pc} + 47:Core/Src/ADBMS_LL_Driver.c **** + ARM GAS /tmp/ccJRsTlY.s page 9 + + + 314 .loc 1 47 1 view .LVU106 + 315 .cfi_endproc + 316 .LFE131: + 318 .section .text.checkPEC,"ax",%progbits + 319 .align 1 + 320 .global checkPEC + 321 .syntax unified + 322 .thumb + 323 .thumb_func + 325 checkPEC: + 326 .LVL45: + 327 .LFB132: + 50:Core/Src/ADBMS_LL_Driver.c **** if(datalen <= 3) + 328 .loc 1 50 1 is_stmt 1 view -0 + 329 .cfi_startproc + 330 @ args = 0, pretend = 0, frame = 0 + 331 @ frame_needed = 0, uses_anonymous_args = 0 + 51:Core/Src/ADBMS_LL_Driver.c **** { + 332 .loc 1 51 2 view .LVU108 + 51:Core/Src/ADBMS_LL_Driver.c **** { + 333 .loc 1 51 4 is_stmt 0 view .LVU109 + 334 0000 0329 cmp r1, #3 + 335 0002 25D9 bls .L19 + 50:Core/Src/ADBMS_LL_Driver.c **** if(datalen <= 3) + 336 .loc 1 50 1 view .LVU110 + 337 0004 F8B5 push {r3, r4, r5, r6, r7, lr} + 338 .cfi_def_cfa_offset 24 + 339 .cfi_offset 3, -24 + 340 .cfi_offset 4, -20 + 341 .cfi_offset 5, -16 + 342 .cfi_offset 6, -12 + 343 .cfi_offset 7, -8 + 344 .cfi_offset 14, -4 + 345 0006 0546 mov r5, r0 + 346 0008 0E46 mov r6, r1 + 347 .LBB7: + 58:Core/Src/ADBMS_LL_Driver.c **** { + 348 .loc 1 58 10 view .LVU111 + 349 000a 0027 movs r7, #0 + 350 .LBE7: + 56:Core/Src/ADBMS_LL_Driver.c **** + 351 .loc 1 56 9 view .LVU112 + 352 000c 1020 movs r0, #16 + 353 .LVL46: + 56:Core/Src/ADBMS_LL_Driver.c **** + 354 .loc 1 56 9 view .LVU113 + 355 000e 08E0 b .L16 + 356 .LVL47: + 357 .L17: + 358 .LBB11: + 359 .LBB8: + 360 .LBB9: + 62:Core/Src/ADBMS_LL_Driver.c **** currentpec = updatePEC(currentpec, din); + 361 .loc 1 62 10 is_stmt 1 discriminator 3 view .LVU114 + 62:Core/Src/ADBMS_LL_Driver.c **** currentpec = updatePEC(currentpec, din); + 362 .loc 1 62 26 is_stmt 0 discriminator 3 view .LVU115 + 363 0010 E95D ldrb r1, [r5, r7] @ zero_extendqisi2 + ARM GAS /tmp/ccJRsTlY.s page 10 + + + 62:Core/Src/ADBMS_LL_Driver.c **** currentpec = updatePEC(currentpec, din); + 364 .loc 1 62 30 discriminator 3 view .LVU116 + 365 0012 A140 lsls r1, r1, r4 + 366 .LVL48: + 63:Core/Src/ADBMS_LL_Driver.c **** } + 367 .loc 1 63 10 is_stmt 1 discriminator 3 view .LVU117 + 63:Core/Src/ADBMS_LL_Driver.c **** } + 368 .loc 1 63 23 is_stmt 0 discriminator 3 view .LVU118 + 369 0014 C9B2 uxtb r1, r1 + 63:Core/Src/ADBMS_LL_Driver.c **** } + 370 .loc 1 63 23 discriminator 3 view .LVU119 + 371 0016 FFF7FEFF bl updatePEC + 372 .LVL49: + 63:Core/Src/ADBMS_LL_Driver.c **** } + 373 .loc 1 63 23 discriminator 3 view .LVU120 + 374 .LBE9: + 60:Core/Src/ADBMS_LL_Driver.c **** { + 375 .loc 1 60 28 is_stmt 1 discriminator 3 view .LVU121 + 376 001a 0134 adds r4, r4, #1 + 377 .LVL50: + 378 .L18: + 60:Core/Src/ADBMS_LL_Driver.c **** { + 379 .loc 1 60 23 discriminator 1 view .LVU122 + 380 001c 072C cmp r4, #7 + 381 001e F7DD ble .L17 + 60:Core/Src/ADBMS_LL_Driver.c **** { + 382 .loc 1 60 23 is_stmt 0 discriminator 1 view .LVU123 + 383 .LBE8: + 58:Core/Src/ADBMS_LL_Driver.c **** { + 384 .loc 1 58 35 is_stmt 1 discriminator 2 view .LVU124 + 385 0020 0137 adds r7, r7, #1 + 386 .LVL51: + 387 .L16: + 58:Core/Src/ADBMS_LL_Driver.c **** { + 388 .loc 1 58 19 discriminator 1 view .LVU125 + 58:Core/Src/ADBMS_LL_Driver.c **** { + 389 .loc 1 58 29 is_stmt 0 discriminator 1 view .LVU126 + 390 0022 B31E subs r3, r6, #2 + 58:Core/Src/ADBMS_LL_Driver.c **** { + 391 .loc 1 58 19 discriminator 1 view .LVU127 + 392 0024 BB42 cmp r3, r7 + 393 0026 01DD ble .L27 + 394 .LBB10: + 60:Core/Src/ADBMS_LL_Driver.c **** { + 395 .loc 1 60 14 view .LVU128 + 396 0028 0024 movs r4, #0 + 397 002a F7E7 b .L18 + 398 .L27: + 399 .LBE10: + 400 .LBE11: + 67:Core/Src/ADBMS_LL_Driver.c **** uint8 peclow = (currentpec<<1) & 0xFF; + 401 .loc 1 67 2 is_stmt 1 view .LVU129 + 67:Core/Src/ADBMS_LL_Driver.c **** uint8 peclow = (currentpec<<1) & 0xFF; + 402 .loc 1 67 8 is_stmt 0 view .LVU130 + 403 002c C0F3C712 ubfx r2, r0, #7, #8 + 404 .LVL52: + 68:Core/Src/ADBMS_LL_Driver.c **** + ARM GAS /tmp/ccJRsTlY.s page 11 + + + 405 .loc 1 68 2 is_stmt 1 view .LVU131 + 68:Core/Src/ADBMS_LL_Driver.c **** + 406 .loc 1 68 28 is_stmt 0 view .LVU132 + 407 0030 4300 lsls r3, r0, #1 + 68:Core/Src/ADBMS_LL_Driver.c **** + 408 .loc 1 68 8 view .LVU133 + 409 0032 DBB2 uxtb r3, r3 + 410 .LVL53: + 70:Core/Src/ADBMS_LL_Driver.c **** { + 411 .loc 1 70 2 is_stmt 1 view .LVU134 + 70:Core/Src/ADBMS_LL_Driver.c **** { + 412 .loc 1 70 21 is_stmt 0 view .LVU135 + 413 0034 A919 adds r1, r5, r6 + 414 0036 11F8021C ldrb r1, [r1, #-2] @ zero_extendqisi2 + 70:Core/Src/ADBMS_LL_Driver.c **** { + 415 .loc 1 70 4 view .LVU136 + 416 003a 9142 cmp r1, r2 + 417 003c 01D0 beq .L28 + 75:Core/Src/ADBMS_LL_Driver.c **** + 418 .loc 1 75 9 view .LVU137 + 419 003e 0120 movs r0, #1 + 420 .LVL54: + 421 .L15: + 77:Core/Src/ADBMS_LL_Driver.c **** + 422 .loc 1 77 1 view .LVU138 + 423 0040 F8BD pop {r3, r4, r5, r6, r7, pc} + 424 .LVL55: + 425 .L28: + 70:Core/Src/ADBMS_LL_Driver.c **** { + 426 .loc 1 70 52 discriminator 1 view .LVU139 + 427 0042 3544 add r5, r5, r6 + 428 .LVL56: + 70:Core/Src/ADBMS_LL_Driver.c **** { + 429 .loc 1 70 52 discriminator 1 view .LVU140 + 430 0044 15F8012C ldrb r2, [r5, #-1] @ zero_extendqisi2 + 431 .LVL57: + 70:Core/Src/ADBMS_LL_Driver.c **** { + 432 .loc 1 70 34 discriminator 1 view .LVU141 + 433 0048 9A42 cmp r2, r3 + 434 004a 03D0 beq .L22 + 75:Core/Src/ADBMS_LL_Driver.c **** + 435 .loc 1 75 9 view .LVU142 + 436 004c 0120 movs r0, #1 + 437 .LVL58: + 75:Core/Src/ADBMS_LL_Driver.c **** + 438 .loc 1 75 9 view .LVU143 + 439 004e F7E7 b .L15 + 440 .LVL59: + 441 .L19: + 442 .cfi_def_cfa_offset 0 + 443 .cfi_restore 3 + 444 .cfi_restore 4 + 445 .cfi_restore 5 + 446 .cfi_restore 6 + 447 .cfi_restore 7 + 448 .cfi_restore 14 + 53:Core/Src/ADBMS_LL_Driver.c **** } + ARM GAS /tmp/ccJRsTlY.s page 12 + + + 449 .loc 1 53 10 view .LVU144 + 450 0050 FF20 movs r0, #255 + 451 .LVL60: + 77:Core/Src/ADBMS_LL_Driver.c **** + 452 .loc 1 77 1 view .LVU145 + 453 0052 7047 bx lr + 454 .LVL61: + 455 .L22: + 456 .cfi_def_cfa_offset 24 + 457 .cfi_offset 3, -24 + 458 .cfi_offset 4, -20 + 459 .cfi_offset 5, -16 + 460 .cfi_offset 6, -12 + 461 .cfi_offset 7, -8 + 462 .cfi_offset 14, -4 + 72:Core/Src/ADBMS_LL_Driver.c **** } + 463 .loc 1 72 10 view .LVU146 + 464 0054 0020 movs r0, #0 + 465 .LVL62: + 72:Core/Src/ADBMS_LL_Driver.c **** } + 466 .loc 1 72 10 view .LVU147 + 467 0056 F3E7 b .L15 + 468 .cfi_endproc + 469 .LFE132: + 471 .section .text.mcuAdbmsCSLow,"ax",%progbits + 472 .align 1 + 473 .global mcuAdbmsCSLow + 474 .syntax unified + 475 .thumb + 476 .thumb_func + 478 mcuAdbmsCSLow: + 479 .LFB136: + 111:Core/Src/ADBMS_LL_Driver.c **** + 112:Core/Src/ADBMS_LL_Driver.c **** uint8 writeCMD(uint16 command, uint8* args, uint8 arglen) + 113:Core/Src/ADBMS_LL_Driver.c **** { + 114:Core/Src/ADBMS_LL_Driver.c **** if(arglen > 0) + 115:Core/Src/ADBMS_LL_Driver.c **** { + 116:Core/Src/ADBMS_LL_Driver.c **** uint8 buffer[6+arglen]; + 117:Core/Src/ADBMS_LL_Driver.c **** buffer[0] = (command >> 8) & 0xFF; + 118:Core/Src/ADBMS_LL_Driver.c **** buffer[1] = (command) & 0xFF; + 119:Core/Src/ADBMS_LL_Driver.c **** calculatePEC(buffer, 4); + 120:Core/Src/ADBMS_LL_Driver.c **** for(uint8 i = 0; i < arglen; i++) + 121:Core/Src/ADBMS_LL_Driver.c **** { + 122:Core/Src/ADBMS_LL_Driver.c **** buffer[4+i] = args[i]; + 123:Core/Src/ADBMS_LL_Driver.c **** } + 124:Core/Src/ADBMS_LL_Driver.c **** + 125:Core/Src/ADBMS_LL_Driver.c **** calculatePEC(&buffer[4], arglen+2); //Calculate PEC of Data Part with offset of 4 Bytes for CMD an + 126:Core/Src/ADBMS_LL_Driver.c **** + 127:Core/Src/ADBMS_LL_Driver.c **** mcuAdbmsCSLow(); + 128:Core/Src/ADBMS_LL_Driver.c **** mcuSPITransmit(buffer, 6+arglen); + 129:Core/Src/ADBMS_LL_Driver.c **** mcuAdbmsCSHigh(); + 130:Core/Src/ADBMS_LL_Driver.c **** + 131:Core/Src/ADBMS_LL_Driver.c **** } + 132:Core/Src/ADBMS_LL_Driver.c **** else + 133:Core/Src/ADBMS_LL_Driver.c **** { + 134:Core/Src/ADBMS_LL_Driver.c **** uint8 buffer[4]; + 135:Core/Src/ADBMS_LL_Driver.c **** buffer[0] = (command >> 8) & 0xFF; + ARM GAS /tmp/ccJRsTlY.s page 13 + + + 136:Core/Src/ADBMS_LL_Driver.c **** buffer[1] = (command) & 0xFF; + 137:Core/Src/ADBMS_LL_Driver.c **** calculatePEC(buffer, 4); + 138:Core/Src/ADBMS_LL_Driver.c **** + 139:Core/Src/ADBMS_LL_Driver.c **** mcuAdbmsCSLow(); + 140:Core/Src/ADBMS_LL_Driver.c **** + 141:Core/Src/ADBMS_LL_Driver.c **** mcuSPITransmit(buffer, 4); + 142:Core/Src/ADBMS_LL_Driver.c **** + 143:Core/Src/ADBMS_LL_Driver.c **** mcuAdbmsCSHigh(); + 144:Core/Src/ADBMS_LL_Driver.c **** } + 145:Core/Src/ADBMS_LL_Driver.c **** + 146:Core/Src/ADBMS_LL_Driver.c **** return 0; + 147:Core/Src/ADBMS_LL_Driver.c **** } + 148:Core/Src/ADBMS_LL_Driver.c **** + 149:Core/Src/ADBMS_LL_Driver.c **** uint8 readCMD(uint16 command, uint8* buffer, uint8 buflen) + 150:Core/Src/ADBMS_LL_Driver.c **** { + 151:Core/Src/ADBMS_LL_Driver.c **** //uint8* txbuffer = (uint8*) malloc(6+buflen); + 152:Core/Src/ADBMS_LL_Driver.c **** //uint8* rxbuffer = (uint8*) malloc(6+buflen); + 153:Core/Src/ADBMS_LL_Driver.c **** uint8 txbuffer[6+buflen]; + 154:Core/Src/ADBMS_LL_Driver.c **** uint8 rxbuffer[6+buflen]; + 155:Core/Src/ADBMS_LL_Driver.c **** + 156:Core/Src/ADBMS_LL_Driver.c **** txbuffer[0] = (command >> 8) & 0xFF; + 157:Core/Src/ADBMS_LL_Driver.c **** txbuffer[1] = (command) & 0xFF; + 158:Core/Src/ADBMS_LL_Driver.c **** calculatePEC(txbuffer, 4); + 159:Core/Src/ADBMS_LL_Driver.c **** + 160:Core/Src/ADBMS_LL_Driver.c **** mcuAdbmsCSLow(); + 161:Core/Src/ADBMS_LL_Driver.c **** mcuSPITransmitReceive(rxbuffer, txbuffer, 6+buflen); + 162:Core/Src/ADBMS_LL_Driver.c **** mcuAdbmsCSHigh(); + 163:Core/Src/ADBMS_LL_Driver.c **** + 164:Core/Src/ADBMS_LL_Driver.c **** + 165:Core/Src/ADBMS_LL_Driver.c **** for(uint8 i = 0; i 100) { + 181:Core/Src/ADBMS_LL_Driver.c **** Error_Handler(); + 182:Core/Src/ADBMS_LL_Driver.c **** } else { + 183:Core/Src/ADBMS_LL_Driver.c **** return 1; + 184:Core/Src/ADBMS_LL_Driver.c **** } + 185:Core/Src/ADBMS_LL_Driver.c **** } + 186:Core/Src/ADBMS_LL_Driver.c **** + 187:Core/Src/ADBMS_LL_Driver.c **** } + 188:Core/Src/ADBMS_LL_Driver.c **** + 189:Core/Src/ADBMS_LL_Driver.c **** void mcuAdbmsCSLow() + 190:Core/Src/ADBMS_LL_Driver.c **** { + 480 .loc 1 190 1 is_stmt 1 view -0 + 481 .cfi_startproc + ARM GAS /tmp/ccJRsTlY.s page 14 + + + 482 @ args = 0, pretend = 0, frame = 0 + 483 @ frame_needed = 0, uses_anonymous_args = 0 + 484 0000 08B5 push {r3, lr} + 485 .cfi_def_cfa_offset 8 + 486 .cfi_offset 3, -8 + 487 .cfi_offset 14, -4 + 191:Core/Src/ADBMS_LL_Driver.c **** HAL_GPIO_WritePin(CSB_GPIO_Port, CSB_Pin, GPIO_PIN_RESET); + 488 .loc 1 191 2 view .LVU149 + 489 0002 0022 movs r2, #0 + 490 0004 1021 movs r1, #16 + 491 0006 4FF09040 mov r0, #1207959552 + 492 000a FFF7FEFF bl HAL_GPIO_WritePin + 493 .LVL63: + 192:Core/Src/ADBMS_LL_Driver.c **** } + 494 .loc 1 192 1 is_stmt 0 view .LVU150 + 495 000e 08BD pop {r3, pc} + 496 .cfi_endproc + 497 .LFE136: + 499 .section .text.mcuAdbmsCSHigh,"ax",%progbits + 500 .align 1 + 501 .global mcuAdbmsCSHigh + 502 .syntax unified + 503 .thumb + 504 .thumb_func + 506 mcuAdbmsCSHigh: + 507 .LFB137: + 193:Core/Src/ADBMS_LL_Driver.c **** + 194:Core/Src/ADBMS_LL_Driver.c **** void mcuAdbmsCSHigh() + 195:Core/Src/ADBMS_LL_Driver.c **** { + 508 .loc 1 195 1 is_stmt 1 view -0 + 509 .cfi_startproc + 510 @ args = 0, pretend = 0, frame = 0 + 511 @ frame_needed = 0, uses_anonymous_args = 0 + 512 0000 08B5 push {r3, lr} + 513 .cfi_def_cfa_offset 8 + 514 .cfi_offset 3, -8 + 515 .cfi_offset 14, -4 + 196:Core/Src/ADBMS_LL_Driver.c **** HAL_GPIO_WritePin(CSB_GPIO_Port, CSB_Pin, GPIO_PIN_SET); + 516 .loc 1 196 2 view .LVU152 + 517 0002 0122 movs r2, #1 + 518 0004 1021 movs r1, #16 + 519 0006 4FF09040 mov r0, #1207959552 + 520 000a FFF7FEFF bl HAL_GPIO_WritePin + 521 .LVL64: + 197:Core/Src/ADBMS_LL_Driver.c **** } + 522 .loc 1 197 1 is_stmt 0 view .LVU153 + 523 000e 08BD pop {r3, pc} + 524 .cfi_endproc + 525 .LFE137: + 527 .section .text.adbmsDriverInit,"ax",%progbits + 528 .align 1 + 529 .global adbmsDriverInit + 530 .syntax unified + 531 .thumb + 532 .thumb_func + 534 adbmsDriverInit: + 535 .LVL65: + ARM GAS /tmp/ccJRsTlY.s page 15 + + + 536 .LFB130: + 16:Core/Src/ADBMS_LL_Driver.c **** mcuAdbmsCSLow(); + 537 .loc 1 16 1 is_stmt 1 view -0 + 538 .cfi_startproc + 539 @ args = 0, pretend = 0, frame = 0 + 540 @ frame_needed = 0, uses_anonymous_args = 0 + 16:Core/Src/ADBMS_LL_Driver.c **** mcuAdbmsCSLow(); + 541 .loc 1 16 1 is_stmt 0 view .LVU155 + 542 0000 10B5 push {r4, lr} + 543 .cfi_def_cfa_offset 8 + 544 .cfi_offset 4, -8 + 545 .cfi_offset 14, -4 + 546 0002 0446 mov r4, r0 + 17:Core/Src/ADBMS_LL_Driver.c **** HAL_Delay(1); + 547 .loc 1 17 2 is_stmt 1 view .LVU156 + 548 0004 FFF7FEFF bl mcuAdbmsCSLow + 549 .LVL66: + 18:Core/Src/ADBMS_LL_Driver.c **** mcuAdbmsCSHigh(); + 550 .loc 1 18 2 view .LVU157 + 551 0008 0120 movs r0, #1 + 552 000a FFF7FEFF bl HAL_Delay + 553 .LVL67: + 19:Core/Src/ADBMS_LL_Driver.c **** adbmsspi = hspi; + 554 .loc 1 19 2 view .LVU158 + 555 000e FFF7FEFF bl mcuAdbmsCSHigh + 556 .LVL68: + 20:Core/Src/ADBMS_LL_Driver.c **** return 0; + 557 .loc 1 20 2 view .LVU159 + 20:Core/Src/ADBMS_LL_Driver.c **** return 0; + 558 .loc 1 20 11 is_stmt 0 view .LVU160 + 559 0012 024B ldr r3, .L35 + 560 0014 1C60 str r4, [r3] + 21:Core/Src/ADBMS_LL_Driver.c **** } + 561 .loc 1 21 2 is_stmt 1 view .LVU161 + 22:Core/Src/ADBMS_LL_Driver.c **** + 562 .loc 1 22 1 is_stmt 0 view .LVU162 + 563 0016 0020 movs r0, #0 + 564 0018 10BD pop {r4, pc} + 565 .LVL69: + 566 .L36: + 22:Core/Src/ADBMS_LL_Driver.c **** + 567 .loc 1 22 1 view .LVU163 + 568 001a 00BF .align 2 + 569 .L35: + 570 001c 00000000 .word adbmsspi + 571 .cfi_endproc + 572 .LFE130: + 574 .section .text.mcuSPITransmit,"ax",%progbits + 575 .align 1 + 576 .global mcuSPITransmit + 577 .syntax unified + 578 .thumb + 579 .thumb_func + 581 mcuSPITransmit: + 582 .LVL70: + 583 .LFB138: + 198:Core/Src/ADBMS_LL_Driver.c **** + ARM GAS /tmp/ccJRsTlY.s page 16 + + + 199:Core/Src/ADBMS_LL_Driver.c **** uint8 mcuSPITransmit(uint8* buffer, uint8 buffersize) + 200:Core/Src/ADBMS_LL_Driver.c **** { + 584 .loc 1 200 1 is_stmt 1 view -0 + 585 .cfi_startproc + 586 @ args = 0, pretend = 0, frame = 8 + 587 @ frame_needed = 1, uses_anonymous_args = 0 + 588 .loc 1 200 1 is_stmt 0 view .LVU165 + 589 0000 90B5 push {r4, r7, lr} + 590 .cfi_def_cfa_offset 12 + 591 .cfi_offset 4, -12 + 592 .cfi_offset 7, -8 + 593 .cfi_offset 14, -4 + 594 0002 85B0 sub sp, sp, #20 + 595 .cfi_def_cfa_offset 32 + 596 0004 02AF add r7, sp, #8 + 597 .cfi_def_cfa 7, 24 + 598 0006 0B46 mov r3, r1 + 201:Core/Src/ADBMS_LL_Driver.c **** HAL_StatusTypeDef status; + 599 .loc 1 201 2 is_stmt 1 view .LVU166 + 202:Core/Src/ADBMS_LL_Driver.c **** //status = HAL_SPI_Transmit(adbmsspi, buffer, buffersize, ADBMS_SPI_TIMEOUT); + 203:Core/Src/ADBMS_LL_Driver.c **** //uint8 *rxbuf = (uint8*) malloc(buffersize); + 204:Core/Src/ADBMS_LL_Driver.c **** uint8 rxbuf[buffersize]; + 600 .loc 1 204 2 view .LVU167 + 601 .LVL71: + 602 .loc 1 204 8 is_stmt 0 view .LVU168 + 603 0008 CA1D adds r2, r1, #7 + 604 000a 02F4FC72 and r2, r2, #504 + 605 000e ADEB020D sub sp, sp, r2 + 606 0012 6A46 mov r2, sp + 607 .LVL72: + 205:Core/Src/ADBMS_LL_Driver.c **** status = HAL_SPI_TransmitReceive(adbmsspi, buffer, rxbuf, buffersize, ADBMS_SPI_TIMEOUT); + 608 .loc 1 205 2 is_stmt 1 view .LVU169 + 609 .loc 1 205 11 is_stmt 0 view .LVU170 + 610 0014 0A4C ldr r4, .L39 + 611 0016 4FF47A71 mov r1, #1000 + 612 .LVL73: + 613 .loc 1 205 11 view .LVU171 + 614 001a 42F8081B str r1, [r2], #8 + 615 .LVL74: + 616 .loc 1 205 11 view .LVU172 + 617 001e 0146 mov r1, r0 + 618 0020 2068 ldr r0, [r4] + 619 .LVL75: + 620 .loc 1 205 11 view .LVU173 + 621 0022 FFF7FEFF bl HAL_SPI_TransmitReceive + 622 .LVL76: + 206:Core/Src/ADBMS_LL_Driver.c **** __HAL_SPI_CLEAR_OVRFLAG(adbmsspi); + 623 .loc 1 206 2 is_stmt 1 view .LVU174 + 624 .LBB12: + 625 .loc 1 206 2 view .LVU175 + 626 0026 0023 movs r3, #0 + 627 0028 7B60 str r3, [r7, #4] + 628 .loc 1 206 2 view .LVU176 + 629 002a 2368 ldr r3, [r4] + 630 002c 1B68 ldr r3, [r3] + 631 002e DA68 ldr r2, [r3, #12] + 632 0030 7A60 str r2, [r7, #4] + ARM GAS /tmp/ccJRsTlY.s page 17 + + + 633 .loc 1 206 2 view .LVU177 + 634 0032 9B68 ldr r3, [r3, #8] + 635 0034 7B60 str r3, [r7, #4] + 636 .loc 1 206 2 view .LVU178 + 637 0036 7B68 ldr r3, [r7, #4] + 638 .LBE12: + 639 .loc 1 206 2 view .LVU179 + 207:Core/Src/ADBMS_LL_Driver.c **** //free(rxbuf); + 208:Core/Src/ADBMS_LL_Driver.c **** return status; + 640 .loc 1 208 2 view .LVU180 + 209:Core/Src/ADBMS_LL_Driver.c **** } + 641 .loc 1 209 1 is_stmt 0 view .LVU181 + 642 0038 0C37 adds r7, r7, #12 + 643 .cfi_def_cfa_offset 12 + 644 003a BD46 mov sp, r7 + 645 .cfi_def_cfa_register 13 + 646 .LVL77: + 647 .loc 1 209 1 view .LVU182 + 648 @ sp needed + 649 003c 90BD pop {r4, r7, pc} + 650 .L40: + 651 003e 00BF .align 2 + 652 .L39: + 653 0040 00000000 .word adbmsspi + 654 .cfi_endproc + 655 .LFE138: + 657 .section .text.writeCMD,"ax",%progbits + 658 .align 1 + 659 .global writeCMD + 660 .syntax unified + 661 .thumb + 662 .thumb_func + 664 writeCMD: + 665 .LVL78: + 666 .LFB134: + 113:Core/Src/ADBMS_LL_Driver.c **** if(arglen > 0) + 667 .loc 1 113 1 is_stmt 1 view -0 + 668 .cfi_startproc + 669 @ args = 0, pretend = 0, frame = 8 + 670 @ frame_needed = 1, uses_anonymous_args = 0 + 113:Core/Src/ADBMS_LL_Driver.c **** if(arglen > 0) + 671 .loc 1 113 1 is_stmt 0 view .LVU184 + 672 0000 2DE9F041 push {r4, r5, r6, r7, r8, lr} + 673 .cfi_def_cfa_offset 24 + 674 .cfi_offset 4, -24 + 675 .cfi_offset 5, -20 + 676 .cfi_offset 6, -16 + 677 .cfi_offset 7, -12 + 678 .cfi_offset 8, -8 + 679 .cfi_offset 14, -4 + 680 0004 82B0 sub sp, sp, #8 + 681 .cfi_def_cfa_offset 32 + 682 0006 00AF add r7, sp, #0 + 683 .cfi_def_cfa_register 7 + 114:Core/Src/ADBMS_LL_Driver.c **** { + 684 .loc 1 114 2 is_stmt 1 view .LVU185 + 114:Core/Src/ADBMS_LL_Driver.c **** { + ARM GAS /tmp/ccJRsTlY.s page 18 + + + 685 .loc 1 114 4 is_stmt 0 view .LVU186 + 686 0008 7AB3 cbz r2, .L42 + 687 000a 0D46 mov r5, r1 + 688 000c 1446 mov r4, r2 + 689 .LBB13: + 115:Core/Src/ADBMS_LL_Driver.c **** uint8 buffer[6+arglen]; + 690 .loc 1 115 2 view .LVU187 + 691 000e E846 mov r8, sp + 116:Core/Src/ADBMS_LL_Driver.c **** buffer[0] = (command >> 8) & 0xFF; + 692 .loc 1 116 2 is_stmt 1 view .LVU188 + 693 .LVL79: + 116:Core/Src/ADBMS_LL_Driver.c **** buffer[0] = (command >> 8) & 0xFF; + 694 .loc 1 116 8 is_stmt 0 view .LVU189 + 695 0010 02F10D03 add r3, r2, #13 + 696 0014 03F4FC73 and r3, r3, #504 + 697 0018 ADEB030D sub sp, sp, r3 + 698 001c 6E46 mov r6, sp + 699 .LVL80: + 117:Core/Src/ADBMS_LL_Driver.c **** buffer[1] = (command) & 0xFF; + 700 .loc 1 117 2 is_stmt 1 view .LVU190 + 117:Core/Src/ADBMS_LL_Driver.c **** buffer[1] = (command) & 0xFF; + 701 .loc 1 117 12 is_stmt 0 view .LVU191 + 702 001e 030A lsrs r3, r0, #8 + 703 0020 8DF80030 strb r3, [sp] + 118:Core/Src/ADBMS_LL_Driver.c **** calculatePEC(buffer, 4); + 704 .loc 1 118 2 is_stmt 1 view .LVU192 + 118:Core/Src/ADBMS_LL_Driver.c **** calculatePEC(buffer, 4); + 705 .loc 1 118 12 is_stmt 0 view .LVU193 + 706 0024 8DF80100 strb r0, [sp, #1] + 119:Core/Src/ADBMS_LL_Driver.c **** for(uint8 i = 0; i < arglen; i++) + 707 .loc 1 119 2 is_stmt 1 view .LVU194 + 708 0028 0421 movs r1, #4 + 709 .LVL81: + 119:Core/Src/ADBMS_LL_Driver.c **** for(uint8 i = 0; i < arglen; i++) + 710 .loc 1 119 2 is_stmt 0 view .LVU195 + 711 002a 6846 mov r0, sp + 712 .LVL82: + 119:Core/Src/ADBMS_LL_Driver.c **** for(uint8 i = 0; i < arglen; i++) + 713 .loc 1 119 2 view .LVU196 + 714 002c FFF7FEFF bl calculatePEC + 715 .LVL83: + 120:Core/Src/ADBMS_LL_Driver.c **** { + 716 .loc 1 120 2 is_stmt 1 view .LVU197 + 717 .LBB14: + 120:Core/Src/ADBMS_LL_Driver.c **** { + 718 .loc 1 120 6 view .LVU198 + 120:Core/Src/ADBMS_LL_Driver.c **** { + 719 .loc 1 120 12 is_stmt 0 view .LVU199 + 720 0030 0023 movs r3, #0 + 120:Core/Src/ADBMS_LL_Driver.c **** { + 721 .loc 1 120 2 view .LVU200 + 722 0032 04E0 b .L43 + 723 .LVL84: + 724 .L44: + 122:Core/Src/ADBMS_LL_Driver.c **** } + 725 .loc 1 122 3 is_stmt 1 discriminator 3 view .LVU201 + 122:Core/Src/ADBMS_LL_Driver.c **** } + ARM GAS /tmp/ccJRsTlY.s page 19 + + + 726 .loc 1 122 11 is_stmt 0 discriminator 3 view .LVU202 + 727 0034 1A1D adds r2, r3, #4 + 122:Core/Src/ADBMS_LL_Driver.c **** } + 728 .loc 1 122 21 discriminator 3 view .LVU203 + 729 0036 E95C ldrb r1, [r5, r3] @ zero_extendqisi2 + 122:Core/Src/ADBMS_LL_Driver.c **** } + 730 .loc 1 122 15 discriminator 3 view .LVU204 + 731 0038 B154 strb r1, [r6, r2] + 120:Core/Src/ADBMS_LL_Driver.c **** { + 732 .loc 1 120 32 is_stmt 1 discriminator 3 view .LVU205 + 733 003a 0133 adds r3, r3, #1 + 734 .LVL85: + 120:Core/Src/ADBMS_LL_Driver.c **** { + 735 .loc 1 120 32 is_stmt 0 discriminator 3 view .LVU206 + 736 003c DBB2 uxtb r3, r3 + 737 .LVL86: + 738 .L43: + 120:Core/Src/ADBMS_LL_Driver.c **** { + 739 .loc 1 120 21 is_stmt 1 discriminator 1 view .LVU207 + 740 003e A342 cmp r3, r4 + 741 0040 F8D3 bcc .L44 + 742 .LBE14: + 125:Core/Src/ADBMS_LL_Driver.c **** + 743 .loc 1 125 2 view .LVU208 + 744 0042 A11C adds r1, r4, #2 + 745 0044 C9B2 uxtb r1, r1 + 746 0046 301D adds r0, r6, #4 + 747 0048 FFF7FEFF bl calculatePEC + 748 .LVL87: + 127:Core/Src/ADBMS_LL_Driver.c **** mcuSPITransmit(buffer, 6+arglen); + 749 .loc 1 127 2 view .LVU209 + 750 004c FFF7FEFF bl mcuAdbmsCSLow + 751 .LVL88: + 128:Core/Src/ADBMS_LL_Driver.c **** mcuAdbmsCSHigh(); + 752 .loc 1 128 2 view .LVU210 + 753 0050 A11D adds r1, r4, #6 + 754 0052 C9B2 uxtb r1, r1 + 755 0054 3046 mov r0, r6 + 756 0056 FFF7FEFF bl mcuSPITransmit + 757 .LVL89: + 129:Core/Src/ADBMS_LL_Driver.c **** + 758 .loc 1 129 2 view .LVU211 + 759 005a FFF7FEFF bl mcuAdbmsCSHigh + 760 .LVL90: + 761 005e C546 mov sp, r8 + 762 .LVL91: + 763 .L45: + 129:Core/Src/ADBMS_LL_Driver.c **** + 764 .loc 1 129 2 is_stmt 0 view .LVU212 + 765 .LBE13: + 146:Core/Src/ADBMS_LL_Driver.c **** } + 766 .loc 1 146 2 is_stmt 1 view .LVU213 + 147:Core/Src/ADBMS_LL_Driver.c **** + 767 .loc 1 147 1 is_stmt 0 view .LVU214 + 768 0060 0020 movs r0, #0 + 769 0062 0837 adds r7, r7, #8 + 770 .cfi_remember_state + ARM GAS /tmp/ccJRsTlY.s page 20 + + + 771 .cfi_def_cfa_offset 24 + 772 0064 BD46 mov sp, r7 + 773 .cfi_def_cfa_register 13 + 774 @ sp needed + 775 0066 BDE8F081 pop {r4, r5, r6, r7, r8, pc} + 776 .LVL92: + 777 .L42: + 778 .cfi_restore_state + 779 .LBB15: + 134:Core/Src/ADBMS_LL_Driver.c **** buffer[0] = (command >> 8) & 0xFF; + 780 .loc 1 134 2 is_stmt 1 view .LVU215 + 135:Core/Src/ADBMS_LL_Driver.c **** buffer[1] = (command) & 0xFF; + 781 .loc 1 135 2 view .LVU216 + 135:Core/Src/ADBMS_LL_Driver.c **** buffer[1] = (command) & 0xFF; + 782 .loc 1 135 12 is_stmt 0 view .LVU217 + 783 006a 030A lsrs r3, r0, #8 + 784 006c 3B71 strb r3, [r7, #4] + 136:Core/Src/ADBMS_LL_Driver.c **** calculatePEC(buffer, 4); + 785 .loc 1 136 2 is_stmt 1 view .LVU218 + 136:Core/Src/ADBMS_LL_Driver.c **** calculatePEC(buffer, 4); + 786 .loc 1 136 12 is_stmt 0 view .LVU219 + 787 006e 7871 strb r0, [r7, #5] + 137:Core/Src/ADBMS_LL_Driver.c **** + 788 .loc 1 137 2 is_stmt 1 view .LVU220 + 789 0070 0421 movs r1, #4 + 790 .LVL93: + 137:Core/Src/ADBMS_LL_Driver.c **** + 791 .loc 1 137 2 is_stmt 0 view .LVU221 + 792 0072 7818 adds r0, r7, r1 + 793 .LVL94: + 137:Core/Src/ADBMS_LL_Driver.c **** + 794 .loc 1 137 2 view .LVU222 + 795 0074 FFF7FEFF bl calculatePEC + 796 .LVL95: + 139:Core/Src/ADBMS_LL_Driver.c **** + 797 .loc 1 139 2 is_stmt 1 view .LVU223 + 798 0078 FFF7FEFF bl mcuAdbmsCSLow + 799 .LVL96: + 141:Core/Src/ADBMS_LL_Driver.c **** + 800 .loc 1 141 2 view .LVU224 + 801 007c 0421 movs r1, #4 + 802 007e 7818 adds r0, r7, r1 + 803 0080 FFF7FEFF bl mcuSPITransmit + 804 .LVL97: + 143:Core/Src/ADBMS_LL_Driver.c **** } + 805 .loc 1 143 2 view .LVU225 + 806 0084 FFF7FEFF bl mcuAdbmsCSHigh + 807 .LVL98: + 808 0088 EAE7 b .L45 + 809 .LBE15: + 810 .cfi_endproc + 811 .LFE134: + 813 .section .text.mcuSPIReceive,"ax",%progbits + 814 .align 1 + 815 .global mcuSPIReceive + 816 .syntax unified + 817 .thumb + ARM GAS /tmp/ccJRsTlY.s page 21 + + + 818 .thumb_func + 820 mcuSPIReceive: + 821 .LVL99: + 822 .LFB139: + 210:Core/Src/ADBMS_LL_Driver.c **** + 211:Core/Src/ADBMS_LL_Driver.c **** uint8 mcuSPIReceive(uint8* buffer, uint8 buffersize) + 212:Core/Src/ADBMS_LL_Driver.c **** { + 823 .loc 1 212 1 view -0 + 824 .cfi_startproc + 825 @ args = 0, pretend = 0, frame = 0 + 826 @ frame_needed = 0, uses_anonymous_args = 0 + 827 .loc 1 212 1 is_stmt 0 view .LVU227 + 828 0000 08B5 push {r3, lr} + 829 .cfi_def_cfa_offset 8 + 830 .cfi_offset 3, -8 + 831 .cfi_offset 14, -4 + 832 0002 0A46 mov r2, r1 + 213:Core/Src/ADBMS_LL_Driver.c **** HAL_StatusTypeDef status; + 833 .loc 1 213 2 is_stmt 1 view .LVU228 + 214:Core/Src/ADBMS_LL_Driver.c **** status = HAL_SPI_Receive(adbmsspi, buffer, buffersize, ADBMS_SPI_TIMEOUT); + 834 .loc 1 214 2 view .LVU229 + 835 .loc 1 214 11 is_stmt 0 view .LVU230 + 836 0004 4FF47A73 mov r3, #1000 + 837 0008 0146 mov r1, r0 + 838 .LVL100: + 839 .loc 1 214 11 view .LVU231 + 840 000a 0248 ldr r0, .L49 + 841 .LVL101: + 842 .loc 1 214 11 view .LVU232 + 843 000c 0068 ldr r0, [r0] + 844 000e FFF7FEFF bl HAL_SPI_Receive + 845 .LVL102: + 215:Core/Src/ADBMS_LL_Driver.c **** return status; + 846 .loc 1 215 2 is_stmt 1 view .LVU233 + 216:Core/Src/ADBMS_LL_Driver.c **** } + 847 .loc 1 216 1 is_stmt 0 view .LVU234 + 848 0012 08BD pop {r3, pc} + 849 .L50: + 850 .align 2 + 851 .L49: + 852 0014 00000000 .word adbmsspi + 853 .cfi_endproc + 854 .LFE139: + 856 .section .text.mcuSPITransmitReceive,"ax",%progbits + 857 .align 1 + 858 .global mcuSPITransmitReceive + 859 .syntax unified + 860 .thumb + 861 .thumb_func + 863 mcuSPITransmitReceive: + 864 .LVL103: + 865 .LFB140: + 217:Core/Src/ADBMS_LL_Driver.c **** + 218:Core/Src/ADBMS_LL_Driver.c **** uint8 mcuSPITransmitReceive(uint8* rxbuffer, uint8* txbuffer, uint8 buffersize) + 219:Core/Src/ADBMS_LL_Driver.c **** { + 866 .loc 1 219 1 is_stmt 1 view -0 + 867 .cfi_startproc + ARM GAS /tmp/ccJRsTlY.s page 22 + + + 868 @ args = 0, pretend = 0, frame = 0 + 869 @ frame_needed = 0, uses_anonymous_args = 0 + 870 .loc 1 219 1 is_stmt 0 view .LVU236 + 871 0000 00B5 push {lr} + 872 .cfi_def_cfa_offset 4 + 873 .cfi_offset 14, -4 + 874 0002 83B0 sub sp, sp, #12 + 875 .cfi_def_cfa_offset 16 + 876 0004 1346 mov r3, r2 + 220:Core/Src/ADBMS_LL_Driver.c **** HAL_StatusTypeDef status; + 877 .loc 1 220 2 is_stmt 1 view .LVU237 + 221:Core/Src/ADBMS_LL_Driver.c **** status = HAL_SPI_TransmitReceive(adbmsspi, txbuffer, rxbuffer, buffersize, ADBMS_SPI_TIMEOUT); + 878 .loc 1 221 2 view .LVU238 + 879 .loc 1 221 11 is_stmt 0 view .LVU239 + 880 0006 4FF47A72 mov r2, #1000 + 881 .LVL104: + 882 .loc 1 221 11 view .LVU240 + 883 000a 0092 str r2, [sp] + 884 000c 0246 mov r2, r0 + 885 000e 0348 ldr r0, .L53 + 886 .LVL105: + 887 .loc 1 221 11 view .LVU241 + 888 0010 0068 ldr r0, [r0] + 889 0012 FFF7FEFF bl HAL_SPI_TransmitReceive + 890 .LVL106: + 222:Core/Src/ADBMS_LL_Driver.c **** return status; + 891 .loc 1 222 2 is_stmt 1 view .LVU242 + 223:Core/Src/ADBMS_LL_Driver.c **** } + 892 .loc 1 223 1 is_stmt 0 view .LVU243 + 893 0016 03B0 add sp, sp, #12 + 894 .cfi_def_cfa_offset 4 + 895 @ sp needed + 896 0018 5DF804FB ldr pc, [sp], #4 + 897 .L54: + 898 .align 2 + 899 .L53: + 900 001c 00000000 .word adbmsspi + 901 .cfi_endproc + 902 .LFE140: + 904 .section .text.readCMD,"ax",%progbits + 905 .align 1 + 906 .global readCMD + 907 .syntax unified + 908 .thumb + 909 .thumb_func + 911 readCMD: + 912 .LVL107: + 913 .LFB135: + 150:Core/Src/ADBMS_LL_Driver.c **** //uint8* txbuffer = (uint8*) malloc(6+buflen); + 914 .loc 1 150 1 is_stmt 1 view -0 + 915 .cfi_startproc + 916 @ args = 0, pretend = 0, frame = 0 + 917 @ frame_needed = 1, uses_anonymous_args = 0 + 150:Core/Src/ADBMS_LL_Driver.c **** //uint8* txbuffer = (uint8*) malloc(6+buflen); + 918 .loc 1 150 1 is_stmt 0 view .LVU245 + 919 0000 2DE9F843 push {r3, r4, r5, r6, r7, r8, r9, lr} + 920 .cfi_def_cfa_offset 32 + ARM GAS /tmp/ccJRsTlY.s page 23 + + + 921 .cfi_offset 3, -32 + 922 .cfi_offset 4, -28 + 923 .cfi_offset 5, -24 + 924 .cfi_offset 6, -20 + 925 .cfi_offset 7, -16 + 926 .cfi_offset 8, -12 + 927 .cfi_offset 9, -8 + 928 .cfi_offset 14, -4 + 929 0004 00AF add r7, sp, #0 + 930 .cfi_def_cfa_register 7 + 931 0006 0E46 mov r6, r1 + 932 0008 1446 mov r4, r2 + 153:Core/Src/ADBMS_LL_Driver.c **** uint8 rxbuffer[6+buflen]; + 933 .loc 1 153 2 is_stmt 1 view .LVU246 + 153:Core/Src/ADBMS_LL_Driver.c **** uint8 rxbuffer[6+buflen]; + 934 .loc 1 153 18 is_stmt 0 view .LVU247 + 935 000a 02F10609 add r9, r2, #6 + 936 .LVL108: + 153:Core/Src/ADBMS_LL_Driver.c **** uint8 rxbuffer[6+buflen]; + 937 .loc 1 153 8 view .LVU248 + 938 000e 02F10D03 add r3, r2, #13 + 939 0012 03F4FC73 and r3, r3, #504 + 940 0016 ADEB030D sub sp, sp, r3 + 941 001a E846 mov r8, sp + 942 .LVL109: + 154:Core/Src/ADBMS_LL_Driver.c **** + 943 .loc 1 154 2 is_stmt 1 view .LVU249 + 154:Core/Src/ADBMS_LL_Driver.c **** + 944 .loc 1 154 8 is_stmt 0 view .LVU250 + 945 001c ADEB030D sub sp, sp, r3 + 946 0020 6D46 mov r5, sp + 947 .LVL110: + 156:Core/Src/ADBMS_LL_Driver.c **** txbuffer[1] = (command) & 0xFF; + 948 .loc 1 156 2 is_stmt 1 view .LVU251 + 156:Core/Src/ADBMS_LL_Driver.c **** txbuffer[1] = (command) & 0xFF; + 949 .loc 1 156 14 is_stmt 0 view .LVU252 + 950 0022 030A lsrs r3, r0, #8 + 951 0024 88F80030 strb r3, [r8] + 157:Core/Src/ADBMS_LL_Driver.c **** calculatePEC(txbuffer, 4); + 952 .loc 1 157 2 is_stmt 1 view .LVU253 + 157:Core/Src/ADBMS_LL_Driver.c **** calculatePEC(txbuffer, 4); + 953 .loc 1 157 14 is_stmt 0 view .LVU254 + 954 0028 88F80100 strb r0, [r8, #1] + 158:Core/Src/ADBMS_LL_Driver.c **** + 955 .loc 1 158 2 is_stmt 1 view .LVU255 + 956 002c 0421 movs r1, #4 + 957 .LVL111: + 158:Core/Src/ADBMS_LL_Driver.c **** + 958 .loc 1 158 2 is_stmt 0 view .LVU256 + 959 002e 4046 mov r0, r8 + 960 .LVL112: + 158:Core/Src/ADBMS_LL_Driver.c **** + 961 .loc 1 158 2 view .LVU257 + 962 0030 FFF7FEFF bl calculatePEC + 963 .LVL113: + 160:Core/Src/ADBMS_LL_Driver.c **** mcuSPITransmitReceive(rxbuffer, txbuffer, 6+buflen); + 964 .loc 1 160 2 is_stmt 1 view .LVU258 + ARM GAS /tmp/ccJRsTlY.s page 24 + + + 965 0034 FFF7FEFF bl mcuAdbmsCSLow + 966 .LVL114: + 161:Core/Src/ADBMS_LL_Driver.c **** mcuAdbmsCSHigh(); + 967 .loc 1 161 2 view .LVU259 + 968 0038 5FFA89F2 uxtb r2, r9 + 969 003c 4146 mov r1, r8 + 970 003e 6846 mov r0, sp + 971 0040 FFF7FEFF bl mcuSPITransmitReceive + 972 .LVL115: + 162:Core/Src/ADBMS_LL_Driver.c **** + 973 .loc 1 162 2 view .LVU260 + 974 0044 FFF7FEFF bl mcuAdbmsCSHigh + 975 .LVL116: + 165:Core/Src/ADBMS_LL_Driver.c **** { + 976 .loc 1 165 2 view .LVU261 + 977 .LBB16: + 165:Core/Src/ADBMS_LL_Driver.c **** { + 978 .loc 1 165 6 view .LVU262 + 165:Core/Src/ADBMS_LL_Driver.c **** { + 979 .loc 1 165 12 is_stmt 0 view .LVU263 + 980 0048 0023 movs r3, #0 + 165:Core/Src/ADBMS_LL_Driver.c **** { + 981 .loc 1 165 2 view .LVU264 + 982 004a 04E0 b .L56 + 983 .LVL117: + 984 .L57: + 167:Core/Src/ADBMS_LL_Driver.c **** } + 985 .loc 1 167 3 is_stmt 1 discriminator 3 view .LVU265 + 167:Core/Src/ADBMS_LL_Driver.c **** } + 986 .loc 1 167 25 is_stmt 0 discriminator 3 view .LVU266 + 987 004c 1A1D adds r2, r3, #4 + 167:Core/Src/ADBMS_LL_Driver.c **** } + 988 .loc 1 167 23 discriminator 3 view .LVU267 + 989 004e AA5C ldrb r2, [r5, r2] @ zero_extendqisi2 + 167:Core/Src/ADBMS_LL_Driver.c **** } + 990 .loc 1 167 13 discriminator 3 view .LVU268 + 991 0050 F254 strb r2, [r6, r3] + 165:Core/Src/ADBMS_LL_Driver.c **** { + 992 .loc 1 165 30 is_stmt 1 discriminator 3 view .LVU269 + 993 0052 0133 adds r3, r3, #1 + 994 .LVL118: + 165:Core/Src/ADBMS_LL_Driver.c **** { + 995 .loc 1 165 30 is_stmt 0 discriminator 3 view .LVU270 + 996 0054 DBB2 uxtb r3, r3 + 997 .LVL119: + 998 .L56: + 165:Core/Src/ADBMS_LL_Driver.c **** { + 999 .loc 1 165 20 is_stmt 1 discriminator 1 view .LVU271 + 1000 0056 A342 cmp r3, r4 + 1001 0058 F8D3 bcc .L57 + 1002 .LBE16: + 170:Core/Src/ADBMS_LL_Driver.c **** + 1003 .loc 1 170 2 view .LVU272 + 170:Core/Src/ADBMS_LL_Driver.c **** + 1004 .loc 1 170 19 is_stmt 0 view .LVU273 + 1005 005a A11C adds r1, r4, #2 + 1006 005c C9B2 uxtb r1, r1 + ARM GAS /tmp/ccJRsTlY.s page 25 + + + 1007 005e 281D adds r0, r5, #4 + 1008 0060 FFF7FEFF bl checkPEC + 1009 .LVL120: + 175:Core/Src/ADBMS_LL_Driver.c **** return 0; + 1010 .loc 1 175 2 is_stmt 1 view .LVU274 + 175:Core/Src/ADBMS_LL_Driver.c **** return 0; + 1011 .loc 1 175 4 is_stmt 0 view .LVU275 + 1012 0064 30B1 cbz r0, .L55 + 1013 .LBB17: + 179:Core/Src/ADBMS_LL_Driver.c **** if (err_cnt++ > 100) { + 1014 .loc 1 179 3 is_stmt 1 view .LVU276 + 180:Core/Src/ADBMS_LL_Driver.c **** Error_Handler(); + 1015 .loc 1 180 3 view .LVU277 + 180:Core/Src/ADBMS_LL_Driver.c **** Error_Handler(); + 1016 .loc 1 180 14 is_stmt 0 view .LVU278 + 1017 0066 064A ldr r2, .L62 + 1018 0068 1368 ldr r3, [r2] + 1019 006a 591C adds r1, r3, #1 + 1020 006c 1160 str r1, [r2] + 180:Core/Src/ADBMS_LL_Driver.c **** Error_Handler(); + 1021 .loc 1 180 6 view .LVU279 + 1022 006e 642B cmp r3, #100 + 1023 0070 03DC bgt .L61 + 183:Core/Src/ADBMS_LL_Driver.c **** } + 1024 .loc 1 183 11 view .LVU280 + 1025 0072 0120 movs r0, #1 + 1026 .LVL121: + 1027 .L55: + 183:Core/Src/ADBMS_LL_Driver.c **** } + 1028 .loc 1 183 11 view .LVU281 + 1029 .LBE17: + 187:Core/Src/ADBMS_LL_Driver.c **** + 1030 .loc 1 187 1 view .LVU282 + 1031 0074 BD46 mov sp, r7 + 1032 .cfi_remember_state + 1033 .cfi_def_cfa_register 13 + 1034 @ sp needed + 1035 0076 BDE8F883 pop {r3, r4, r5, r6, r7, r8, r9, pc} + 1036 .LVL122: + 1037 .L61: + 1038 .cfi_restore_state + 1039 .LBB18: + 181:Core/Src/ADBMS_LL_Driver.c **** } else { + 1040 .loc 1 181 3 is_stmt 1 view .LVU283 + 1041 007a FFF7FEFF bl Error_Handler + 1042 .LVL123: + 181:Core/Src/ADBMS_LL_Driver.c **** } else { + 1043 .loc 1 181 3 is_stmt 0 view .LVU284 + 1044 .LBE18: + 187:Core/Src/ADBMS_LL_Driver.c **** + 1045 .loc 1 187 1 view .LVU285 + 1046 007e F9E7 b .L55 + 1047 .L63: + 1048 .align 2 + 1049 .L62: + 1050 0080 00000000 .word err_cnt.0 + 1051 .cfi_endproc + ARM GAS /tmp/ccJRsTlY.s page 26 + + + 1052 .LFE135: + 1054 .section .text.mcuDelay,"ax",%progbits + 1055 .align 1 + 1056 .global mcuDelay + 1057 .syntax unified + 1058 .thumb + 1059 .thumb_func + 1061 mcuDelay: + 1062 .LVL124: + 1063 .LFB141: + 224:Core/Src/ADBMS_LL_Driver.c **** + 225:Core/Src/ADBMS_LL_Driver.c **** inline void mcuDelay(uint16 delay) + 226:Core/Src/ADBMS_LL_Driver.c **** { + 1064 .loc 1 226 1 is_stmt 1 view -0 + 1065 .cfi_startproc + 1066 @ args = 0, pretend = 0, frame = 0 + 1067 @ frame_needed = 0, uses_anonymous_args = 0 + 1068 .loc 1 226 1 is_stmt 0 view .LVU287 + 1069 0000 08B5 push {r3, lr} + 1070 .cfi_def_cfa_offset 8 + 1071 .cfi_offset 3, -8 + 1072 .cfi_offset 14, -4 + 227:Core/Src/ADBMS_LL_Driver.c **** HAL_Delay(delay); + 1073 .loc 1 227 2 is_stmt 1 view .LVU288 + 1074 0002 FFF7FEFF bl HAL_Delay + 1075 .LVL125: + 228:Core/Src/ADBMS_LL_Driver.c **** } + 1076 .loc 1 228 1 is_stmt 0 view .LVU289 + 1077 0006 08BD pop {r3, pc} + 1078 .cfi_endproc + 1079 .LFE141: + 1081 .section .bss.err_cnt.0,"aw",%nobits + 1082 .align 2 + 1085 err_cnt.0: + 1086 0000 00000000 .space 4 + 1087 .global adbmsspi + 1088 .section .bss.adbmsspi,"aw",%nobits + 1089 .align 2 + 1092 adbmsspi: + 1093 0000 00000000 .space 4 + 1094 .text + 1095 .Letext0: + 1096 .file 2 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 1097 .file 3 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 1098 .file 4 "Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h" + 1099 .file 5 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h" + 1100 .file 6 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h" + 1101 .file 7 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h" + 1102 .file 8 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h" + 1103 .file 9 "Core/Inc/ADBMS_LL_Driver.h" + 1104 .file 10 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h" + 1105 .file 11 "Core/Inc/main.h" + ARM GAS /tmp/ccJRsTlY.s page 27 + + +DEFINED SYMBOLS + *ABS*:0000000000000000 ADBMS_LL_Driver.c + /tmp/ccJRsTlY.s:21 .text.updatePEC:0000000000000000 $t + /tmp/ccJRsTlY.s:27 .text.updatePEC:0000000000000000 updatePEC + /tmp/ccJRsTlY.s:191 .text.calculatePEC:0000000000000000 $t + /tmp/ccJRsTlY.s:197 .text.calculatePEC:0000000000000000 calculatePEC + /tmp/ccJRsTlY.s:319 .text.checkPEC:0000000000000000 $t + /tmp/ccJRsTlY.s:325 .text.checkPEC:0000000000000000 checkPEC + /tmp/ccJRsTlY.s:472 .text.mcuAdbmsCSLow:0000000000000000 $t + /tmp/ccJRsTlY.s:478 .text.mcuAdbmsCSLow:0000000000000000 mcuAdbmsCSLow + /tmp/ccJRsTlY.s:500 .text.mcuAdbmsCSHigh:0000000000000000 $t + /tmp/ccJRsTlY.s:506 .text.mcuAdbmsCSHigh:0000000000000000 mcuAdbmsCSHigh + /tmp/ccJRsTlY.s:528 .text.adbmsDriverInit:0000000000000000 $t + /tmp/ccJRsTlY.s:534 .text.adbmsDriverInit:0000000000000000 adbmsDriverInit + /tmp/ccJRsTlY.s:570 .text.adbmsDriverInit:000000000000001c $d + /tmp/ccJRsTlY.s:1092 .bss.adbmsspi:0000000000000000 adbmsspi + /tmp/ccJRsTlY.s:575 .text.mcuSPITransmit:0000000000000000 $t + /tmp/ccJRsTlY.s:581 .text.mcuSPITransmit:0000000000000000 mcuSPITransmit + /tmp/ccJRsTlY.s:653 .text.mcuSPITransmit:0000000000000040 $d + /tmp/ccJRsTlY.s:658 .text.writeCMD:0000000000000000 $t + /tmp/ccJRsTlY.s:664 .text.writeCMD:0000000000000000 writeCMD + /tmp/ccJRsTlY.s:814 .text.mcuSPIReceive:0000000000000000 $t + /tmp/ccJRsTlY.s:820 .text.mcuSPIReceive:0000000000000000 mcuSPIReceive + /tmp/ccJRsTlY.s:852 .text.mcuSPIReceive:0000000000000014 $d + /tmp/ccJRsTlY.s:857 .text.mcuSPITransmitReceive:0000000000000000 $t + /tmp/ccJRsTlY.s:863 .text.mcuSPITransmitReceive:0000000000000000 mcuSPITransmitReceive + /tmp/ccJRsTlY.s:900 .text.mcuSPITransmitReceive:000000000000001c $d + /tmp/ccJRsTlY.s:905 .text.readCMD:0000000000000000 $t + /tmp/ccJRsTlY.s:911 .text.readCMD:0000000000000000 readCMD + /tmp/ccJRsTlY.s:1050 .text.readCMD:0000000000000080 $d + /tmp/ccJRsTlY.s:1085 .bss.err_cnt.0:0000000000000000 err_cnt.0 + /tmp/ccJRsTlY.s:1055 .text.mcuDelay:0000000000000000 $t + /tmp/ccJRsTlY.s:1061 .text.mcuDelay:0000000000000000 mcuDelay + /tmp/ccJRsTlY.s:1082 .bss.err_cnt.0:0000000000000000 $d + /tmp/ccJRsTlY.s:1089 .bss.adbmsspi:0000000000000000 $d + +UNDEFINED SYMBOLS +HAL_GPIO_WritePin +HAL_Delay +HAL_SPI_TransmitReceive +HAL_SPI_Receive +Error_Handler diff --git a/BMS_Testbench/BMS_Software_V1/build/ADBMS_LL_Driver.o b/BMS_Testbench/BMS_Software_V1/build/ADBMS_LL_Driver.o new file mode 100644 index 0000000000000000000000000000000000000000..8dbc05d0d54f31a5ae57d70536b77346e750ff6b GIT binary patch literal 19084 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 Jxxxg!{{yC(qzM23 literal 0 HcmV?d00001 diff --git a/BMS_Testbench/BMS_Software_V1/build/AMS_CAN.d b/BMS_Testbench/BMS_Software_V1/build/AMS_CAN.d new file mode 100644 index 0000000..a881180 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/AMS_CAN.d @@ -0,0 +1,71 @@ +build/AMS_CAN.o: Core/Src/AMS_CAN.c Core/Inc/AMS_CAN.h Core/Inc/main.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h \ + Core/Inc/stm32f3xx_hal_conf.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h \ + Drivers/CMSIS/Include/core_cm4.h Drivers/CMSIS/Include/cmsis_version.h \ + Drivers/CMSIS/Include/cmsis_compiler.h Drivers/CMSIS/Include/cmsis_gcc.h \ + Drivers/CMSIS/Include/mpu_armv7.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h \ + Core/Inc/ADBMS_Abstraction.h Core/Inc/ADBMS_LL_Driver.h \ + Core/Inc/ADBMS_CMD_MAKROS.h Core/Inc/common_defs.h Core/Inc/main.h \ + Core/Inc/AMS_HighLevel.h Core/Inc/ADBMS_Abstraction.h +Core/Inc/AMS_CAN.h: +Core/Inc/main.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h: +Core/Inc/stm32f3xx_hal_conf.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h: +Drivers/CMSIS/Include/core_cm4.h: +Drivers/CMSIS/Include/cmsis_version.h: +Drivers/CMSIS/Include/cmsis_compiler.h: +Drivers/CMSIS/Include/cmsis_gcc.h: +Drivers/CMSIS/Include/mpu_armv7.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h: +Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h: +Core/Inc/ADBMS_Abstraction.h: +Core/Inc/ADBMS_LL_Driver.h: +Core/Inc/ADBMS_CMD_MAKROS.h: +Core/Inc/common_defs.h: +Core/Inc/main.h: +Core/Inc/AMS_HighLevel.h: +Core/Inc/ADBMS_Abstraction.h: diff --git a/BMS_Testbench/BMS_Software_V1/build/AMS_CAN.lst b/BMS_Testbench/BMS_Software_V1/build/AMS_CAN.lst new file mode 100644 index 0000000..ce50efe --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/AMS_CAN.lst @@ -0,0 +1,942 @@ +ARM GAS /tmp/ccf8kWw2.s page 1 + + + 1 .cpu cortex-m4 + 2 .arch armv7e-m + 3 .fpu fpv4-sp-d16 + 4 .eabi_attribute 27, 1 + 5 .eabi_attribute 28, 1 + 6 .eabi_attribute 20, 1 + 7 .eabi_attribute 21, 1 + 8 .eabi_attribute 23, 3 + 9 .eabi_attribute 24, 1 + 10 .eabi_attribute 25, 1 + 11 .eabi_attribute 26, 1 + 12 .eabi_attribute 30, 1 + 13 .eabi_attribute 34, 1 + 14 .eabi_attribute 18, 4 + 15 .file "AMS_CAN.c" + 16 .text + 17 .Ltext0: + 18 .cfi_sections .debug_frame + 19 .file 1 "Core/Src/AMS_CAN.c" + 20 .section .text.ams_can_init,"ax",%progbits + 21 .align 1 + 22 .global ams_can_init + 23 .syntax unified + 24 .thumb + 25 .thumb_func + 27 ams_can_init: + 28 .LVL0: + 29 .LFB130: + 1:Core/Src/AMS_CAN.c **** /* + 2:Core/Src/AMS_CAN.c **** * AMS_CAN.c + 3:Core/Src/AMS_CAN.c **** * + 4:Core/Src/AMS_CAN.c **** * Created on: Mar 19, 2022 + 5:Core/Src/AMS_CAN.c **** * Author: jasper + 6:Core/Src/AMS_CAN.c **** */ + 7:Core/Src/AMS_CAN.c **** + 8:Core/Src/AMS_CAN.c **** #include "AMS_CAN.h" + 9:Core/Src/AMS_CAN.c **** + 10:Core/Src/AMS_CAN.c **** #include "ADBMS_Abstraction.h" + 11:Core/Src/AMS_CAN.c **** + 12:Core/Src/AMS_CAN.c **** + 13:Core/Src/AMS_CAN.c **** #include "common_defs.h" + 14:Core/Src/AMS_CAN.c **** #include "main.h" + 15:Core/Src/AMS_CAN.c **** #include "AMS_HighLevel.h" + 16:Core/Src/AMS_CAN.c **** #include "stm32f3xx.h" + 17:Core/Src/AMS_CAN.c **** #include "stm32f3xx_hal.h" + 18:Core/Src/AMS_CAN.c **** #include "stm32f3xx_hal_can.h" + 19:Core/Src/AMS_CAN.c **** + 20:Core/Src/AMS_CAN.c **** #include + 21:Core/Src/AMS_CAN.c **** + 22:Core/Src/AMS_CAN.c **** int PENDING_MESSAGE_HANDLE = 0; + 23:Core/Src/AMS_CAN.c **** uint8_t canTestData[8] = {0,0,0,0,0,0,0,0}; + 24:Core/Src/AMS_CAN.c **** + 25:Core/Src/AMS_CAN.c **** + 26:Core/Src/AMS_CAN.c **** CAN_HandleTypeDef* ams_can_handle; + 27:Core/Src/AMS_CAN.c **** + 28:Core/Src/AMS_CAN.c **** void ams_can_init(CAN_HandleTypeDef* ams_handle, + 29:Core/Src/AMS_CAN.c **** CAN_HandleTypeDef* car_handle) { + ARM GAS /tmp/ccf8kWw2.s page 2 + + + 30 .loc 1 29 50 view -0 + 31 .cfi_startproc + 32 @ args = 0, pretend = 0, frame = 40 + 33 @ frame_needed = 0, uses_anonymous_args = 0 + 34 .loc 1 29 50 is_stmt 0 view .LVU1 + 35 0000 10B5 push {r4, lr} + 36 .cfi_def_cfa_offset 8 + 37 .cfi_offset 4, -8 + 38 .cfi_offset 14, -4 + 39 0002 8AB0 sub sp, sp, #40 + 40 .cfi_def_cfa_offset 48 + 41 0004 0C46 mov r4, r1 + 30:Core/Src/AMS_CAN.c **** ams_can_handle = ams_handle; + 42 .loc 1 30 3 is_stmt 1 view .LVU2 + 43 .loc 1 30 18 is_stmt 0 view .LVU3 + 44 0006 204B ldr r3, .L11 + 45 0008 1860 str r0, [r3] + 31:Core/Src/AMS_CAN.c **** + 32:Core/Src/AMS_CAN.c **** // Start peripheral + 33:Core/Src/AMS_CAN.c **** if (HAL_CAN_Start(ams_can_handle) != HAL_OK) { + 46 .loc 1 33 3 is_stmt 1 view .LVU4 + 47 .loc 1 33 7 is_stmt 0 view .LVU5 + 48 000a FFF7FEFF bl HAL_CAN_Start + 49 .LVL1: + 50 .loc 1 33 6 view .LVU6 + 51 000e 40BB cbnz r0, .L7 + 52 .L2: + 34:Core/Src/AMS_CAN.c **** ams_can_handle = car_handle; + 35:Core/Src/AMS_CAN.c **** if (HAL_CAN_Start(ams_can_handle) != HAL_OK) { + 36:Core/Src/AMS_CAN.c **** Error_Handler(); + 37:Core/Src/AMS_CAN.c **** } + 38:Core/Src/AMS_CAN.c **** } + 39:Core/Src/AMS_CAN.c **** + 40:Core/Src/AMS_CAN.c **** // Config filter + 41:Core/Src/AMS_CAN.c **** CAN_FilterTypeDef can_filter; + 53 .loc 1 41 3 is_stmt 1 view .LVU7 + 42:Core/Src/AMS_CAN.c **** can_filter.FilterActivation = CAN_FILTER_ENABLE; + 54 .loc 1 42 3 view .LVU8 + 55 .loc 1 42 31 is_stmt 0 view .LVU9 + 56 0010 0122 movs r2, #1 + 57 0012 0892 str r2, [sp, #32] + 43:Core/Src/AMS_CAN.c **** can_filter.FilterBank = 0; + 58 .loc 1 43 3 is_stmt 1 view .LVU10 + 59 .loc 1 43 25 is_stmt 0 view .LVU11 + 60 0014 0023 movs r3, #0 + 61 0016 0593 str r3, [sp, #20] + 44:Core/Src/AMS_CAN.c **** can_filter.FilterFIFOAssignment = CAN_FILTER_FIFO0; + 62 .loc 1 44 3 is_stmt 1 view .LVU12 + 63 .loc 1 44 35 is_stmt 0 view .LVU13 + 64 0018 0493 str r3, [sp, #16] + 45:Core/Src/AMS_CAN.c **** /* Message ID is in the MSBs of the FilterId register */ + 46:Core/Src/AMS_CAN.c **** can_filter.FilterIdHigh = CAN_ID_CLOCK_SYNC << (16 - 11); + 65 .loc 1 46 3 is_stmt 1 view .LVU14 + 66 .loc 1 46 27 is_stmt 0 view .LVU15 + 67 001a 4021 movs r1, #64 + 68 001c 0091 str r1, [sp] + 47:Core/Src/AMS_CAN.c **** can_filter.FilterIdLow = 0; + ARM GAS /tmp/ccf8kWw2.s page 3 + + + 69 .loc 1 47 3 is_stmt 1 view .LVU16 + 70 .loc 1 47 26 is_stmt 0 view .LVU17 + 71 001e 0193 str r3, [sp, #4] + 48:Core/Src/AMS_CAN.c **** /* Filter the 11 MSBs (i.e. a StdId) */ + 49:Core/Src/AMS_CAN.c **** + 50:Core/Src/AMS_CAN.c **** if(BMS_IN_TEST_MODE == 1){ + 72 .loc 1 50 3 is_stmt 1 view .LVU18 + 51:Core/Src/AMS_CAN.c **** can_filter.FilterMaskIdHigh = BMS_TEST_ID; // alleNachrichtenIds werden akzeptiert + 73 .loc 1 51 4 view .LVU19 + 74 .loc 1 51 32 is_stmt 0 view .LVU20 + 75 0020 0293 str r3, [sp, #8] + 52:Core/Src/AMS_CAN.c **** }else{ + 53:Core/Src/AMS_CAN.c **** can_filter.FilterMaskIdHigh = 0xFFE0; + 54:Core/Src/AMS_CAN.c **** } + 55:Core/Src/AMS_CAN.c **** + 56:Core/Src/AMS_CAN.c **** can_filter.FilterMaskIdLow = 0; + 76 .loc 1 56 3 is_stmt 1 view .LVU21 + 77 .loc 1 56 30 is_stmt 0 view .LVU22 + 78 0022 0393 str r3, [sp, #12] + 57:Core/Src/AMS_CAN.c **** can_filter.FilterMode = CAN_FILTERMODE_IDMASK; + 79 .loc 1 57 3 is_stmt 1 view .LVU23 + 80 .loc 1 57 25 is_stmt 0 view .LVU24 + 81 0024 0693 str r3, [sp, #24] + 58:Core/Src/AMS_CAN.c **** can_filter.FilterScale = CAN_FILTERSCALE_32BIT; + 82 .loc 1 58 3 is_stmt 1 view .LVU25 + 83 .loc 1 58 26 is_stmt 0 view .LVU26 + 84 0026 0792 str r2, [sp, #28] + 59:Core/Src/AMS_CAN.c **** can_filter.SlaveStartFilterBank = 0; + 85 .loc 1 59 3 is_stmt 1 view .LVU27 + 86 .loc 1 59 35 is_stmt 0 view .LVU28 + 87 0028 0993 str r3, [sp, #36] + 60:Core/Src/AMS_CAN.c **** if (HAL_CAN_ConfigFilter(ams_can_handle, &can_filter) != HAL_OK) { + 88 .loc 1 60 3 is_stmt 1 view .LVU29 + 89 .loc 1 60 7 is_stmt 0 view .LVU30 + 90 002a 6946 mov r1, sp + 91 002c 164B ldr r3, .L11 + 92 002e 1868 ldr r0, [r3] + 93 0030 FFF7FEFF bl HAL_CAN_ConfigFilter + 94 .LVL2: + 95 .loc 1 60 6 view .LVU31 + 96 0034 F8B9 cbnz r0, .L8 + 97 .L3: + 61:Core/Src/AMS_CAN.c **** Error_Handler(); + 62:Core/Src/AMS_CAN.c **** } + 63:Core/Src/AMS_CAN.c **** can_filter.FilterBank++; + 98 .loc 1 63 3 is_stmt 1 view .LVU32 + 99 .loc 1 63 13 is_stmt 0 view .LVU33 + 100 0036 059B ldr r3, [sp, #20] + 101 .loc 1 63 24 view .LVU34 + 102 0038 0133 adds r3, r3, #1 + 103 003a 0593 str r3, [sp, #20] + 64:Core/Src/AMS_CAN.c **** can_filter.FilterIdHigh = CAN_ID_MASTER_HEARTBEAT << (16 - 11); + 104 .loc 1 64 3 is_stmt 1 view .LVU35 + 105 .loc 1 64 27 is_stmt 0 view .LVU36 + 106 003c 4FF40073 mov r3, #512 + 107 0040 0093 str r3, [sp] + 65:Core/Src/AMS_CAN.c **** can_filter.FilterIdLow = 0; + ARM GAS /tmp/ccf8kWw2.s page 4 + + + 108 .loc 1 65 3 is_stmt 1 view .LVU37 + 109 .loc 1 65 26 is_stmt 0 view .LVU38 + 110 0042 0023 movs r3, #0 + 111 0044 0193 str r3, [sp, #4] + 66:Core/Src/AMS_CAN.c **** if (HAL_CAN_ConfigFilter(ams_can_handle, &can_filter) != HAL_OK) { + 112 .loc 1 66 3 is_stmt 1 view .LVU39 + 113 .loc 1 66 7 is_stmt 0 view .LVU40 + 114 0046 6946 mov r1, sp + 115 0048 0F4B ldr r3, .L11 + 116 004a 1868 ldr r0, [r3] + 117 004c FFF7FEFF bl HAL_CAN_ConfigFilter + 118 .LVL3: + 119 .loc 1 66 6 view .LVU41 + 120 0050 A0B9 cbnz r0, .L9 + 121 .L4: + 67:Core/Src/AMS_CAN.c **** Error_Handler(); + 68:Core/Src/AMS_CAN.c **** } + 69:Core/Src/AMS_CAN.c **** + 70:Core/Src/AMS_CAN.c **** // Activate RX notifications + 71:Core/Src/AMS_CAN.c **** if (HAL_CAN_ActivateNotification(ams_can_handle, + 122 .loc 1 71 3 is_stmt 1 view .LVU42 + 123 .loc 1 71 7 is_stmt 0 view .LVU43 + 124 0052 0221 movs r1, #2 + 125 0054 0C4B ldr r3, .L11 + 126 0056 1868 ldr r0, [r3] + 127 0058 FFF7FEFF bl HAL_CAN_ActivateNotification + 128 .LVL4: + 129 .loc 1 71 6 view .LVU44 + 130 005c 88B9 cbnz r0, .L10 + 131 .L1: + 72:Core/Src/AMS_CAN.c **** CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK) { + 73:Core/Src/AMS_CAN.c **** Error_Handler(); + 74:Core/Src/AMS_CAN.c **** } + 75:Core/Src/AMS_CAN.c **** } + 132 .loc 1 75 1 view .LVU45 + 133 005e 0AB0 add sp, sp, #40 + 134 .cfi_remember_state + 135 .cfi_def_cfa_offset 8 + 136 @ sp needed + 137 0060 10BD pop {r4, pc} + 138 .LVL5: + 139 .L7: + 140 .cfi_restore_state + 34:Core/Src/AMS_CAN.c **** if (HAL_CAN_Start(ams_can_handle) != HAL_OK) { + 141 .loc 1 34 5 is_stmt 1 view .LVU46 + 34:Core/Src/AMS_CAN.c **** if (HAL_CAN_Start(ams_can_handle) != HAL_OK) { + 142 .loc 1 34 20 is_stmt 0 view .LVU47 + 143 0062 094B ldr r3, .L11 + 144 0064 1C60 str r4, [r3] + 35:Core/Src/AMS_CAN.c **** Error_Handler(); + 145 .loc 1 35 5 is_stmt 1 view .LVU48 + 35:Core/Src/AMS_CAN.c **** Error_Handler(); + 146 .loc 1 35 9 is_stmt 0 view .LVU49 + 147 0066 2046 mov r0, r4 + 148 0068 FFF7FEFF bl HAL_CAN_Start + 149 .LVL6: + 35:Core/Src/AMS_CAN.c **** Error_Handler(); + ARM GAS /tmp/ccf8kWw2.s page 5 + + + 150 .loc 1 35 8 view .LVU50 + 151 006c 0028 cmp r0, #0 + 152 006e CFD0 beq .L2 + 36:Core/Src/AMS_CAN.c **** } + 153 .loc 1 36 7 is_stmt 1 view .LVU51 + 154 0070 FFF7FEFF bl Error_Handler + 155 .LVL7: + 156 0074 CCE7 b .L2 + 157 .L8: + 61:Core/Src/AMS_CAN.c **** } + 158 .loc 1 61 5 view .LVU52 + 159 0076 FFF7FEFF bl Error_Handler + 160 .LVL8: + 161 007a DCE7 b .L3 + 162 .L9: + 67:Core/Src/AMS_CAN.c **** } + 163 .loc 1 67 5 view .LVU53 + 164 007c FFF7FEFF bl Error_Handler + 165 .LVL9: + 166 0080 E7E7 b .L4 + 167 .L10: + 73:Core/Src/AMS_CAN.c **** } + 168 .loc 1 73 5 view .LVU54 + 169 0082 FFF7FEFF bl Error_Handler + 170 .LVL10: + 171 .loc 1 75 1 is_stmt 0 view .LVU55 + 172 0086 EAE7 b .L1 + 173 .L12: + 174 .align 2 + 175 .L11: + 176 0088 00000000 .word ams_can_handle + 177 .cfi_endproc + 178 .LFE130: + 180 .section .text.ams_can_handle_ams_msg,"ax",%progbits + 181 .align 1 + 182 .global ams_can_handle_ams_msg + 183 .syntax unified + 184 .thumb + 185 .thumb_func + 187 ams_can_handle_ams_msg: + 188 .LVL11: + 189 .LFB132: + 76:Core/Src/AMS_CAN.c **** + 77:Core/Src/AMS_CAN.c **** static int cb_triggered = 0; + 78:Core/Src/AMS_CAN.c **** + 79:Core/Src/AMS_CAN.c **** void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef* handle) { + 80:Core/Src/AMS_CAN.c **** static CAN_RxHeaderTypeDef header; + 81:Core/Src/AMS_CAN.c **** static uint8_t data[8]; + 82:Core/Src/AMS_CAN.c **** cb_triggered = 1; + 83:Core/Src/AMS_CAN.c **** + 84:Core/Src/AMS_CAN.c **** if (HAL_CAN_GetRxMessage(handle, CAN_RX_FIFO0, &header, data) != HAL_OK) { + 85:Core/Src/AMS_CAN.c **** Error_Handler(); + 86:Core/Src/AMS_CAN.c **** } + 87:Core/Src/AMS_CAN.c **** + 88:Core/Src/AMS_CAN.c **** if (handle == ams_can_handle) { + 89:Core/Src/AMS_CAN.c **** ams_can_handle_ams_msg(&header, data); + 90:Core/Src/AMS_CAN.c **** } else { + ARM GAS /tmp/ccf8kWw2.s page 6 + + + 91:Core/Src/AMS_CAN.c **** Error_Handler(); + 92:Core/Src/AMS_CAN.c **** } + 93:Core/Src/AMS_CAN.c **** } + 94:Core/Src/AMS_CAN.c **** + 95:Core/Src/AMS_CAN.c **** void ams_can_handle_ams_msg(CAN_RxHeaderTypeDef* header, uint8_t* data) { + 190 .loc 1 95 73 is_stmt 1 view -0 + 191 .cfi_startproc + 192 @ args = 0, pretend = 0, frame = 0 + 193 @ frame_needed = 0, uses_anonymous_args = 0 + 194 @ link register save eliminated. + 96:Core/Src/AMS_CAN.c **** + 97:Core/Src/AMS_CAN.c **** if(BMS_IN_TEST_MODE == 1){ + 195 .loc 1 97 3 view .LVU57 + 98:Core/Src/AMS_CAN.c **** PENDING_MESSAGE_HANDLE = 1; + 196 .loc 1 98 5 view .LVU58 + 197 .loc 1 98 28 is_stmt 0 view .LVU59 + 198 0000 054B ldr r3, .L16 + 199 0002 0122 movs r2, #1 + 200 0004 1A60 str r2, [r3] + 99:Core/Src/AMS_CAN.c **** for(int i = 0; i < 8; i++){ + 201 .loc 1 99 5 is_stmt 1 view .LVU60 + 202 .LBB2: + 203 .loc 1 99 9 view .LVU61 + 204 .LVL12: + 205 .loc 1 99 13 is_stmt 0 view .LVU62 + 206 0006 0023 movs r3, #0 + 207 .loc 1 99 5 view .LVU63 + 208 0008 03E0 b .L14 + 209 .LVL13: + 210 .L15: + 100:Core/Src/AMS_CAN.c **** canTestData[i] = data[i]; + 211 .loc 1 100 6 is_stmt 1 discriminator 3 view .LVU64 + 212 .loc 1 100 27 is_stmt 0 discriminator 3 view .LVU65 + 213 000a C85C ldrb r0, [r1, r3] @ zero_extendqisi2 + 214 .loc 1 100 21 discriminator 3 view .LVU66 + 215 000c 034A ldr r2, .L16+4 + 216 000e D054 strb r0, [r2, r3] + 99:Core/Src/AMS_CAN.c **** for(int i = 0; i < 8; i++){ + 217 .loc 1 99 28 is_stmt 1 discriminator 3 view .LVU67 + 218 0010 0133 adds r3, r3, #1 + 219 .LVL14: + 220 .L14: + 99:Core/Src/AMS_CAN.c **** for(int i = 0; i < 8; i++){ + 221 .loc 1 99 22 discriminator 1 view .LVU68 + 222 0012 072B cmp r3, #7 + 223 0014 F9DD ble .L15 + 224 .LBE2: + 101:Core/Src/AMS_CAN.c **** } + 102:Core/Src/AMS_CAN.c **** return; + 103:Core/Src/AMS_CAN.c **** } + 104:Core/Src/AMS_CAN.c **** + 105:Core/Src/AMS_CAN.c **** + 106:Core/Src/AMS_CAN.c **** if (header->IDE != CAN_ID_STD) { + 107:Core/Src/AMS_CAN.c **** return; + 108:Core/Src/AMS_CAN.c **** } + 109:Core/Src/AMS_CAN.c **** + 110:Core/Src/AMS_CAN.c **** switch (header->StdId) { + ARM GAS /tmp/ccf8kWw2.s page 7 + + + 111:Core/Src/AMS_CAN.c **** case CAN_ID_CLOCK_SYNC: + 112:Core/Src/AMS_CAN.c **** // clock_sync_handle_clock_sync_frame(data[0]); + 113:Core/Src/AMS_CAN.c **** break; + 114:Core/Src/AMS_CAN.c **** case CAN_ID_MASTER_HEARTBEAT: + 115:Core/Src/AMS_CAN.c **** // clock_sync_handle_master_heartbeat(); + 116:Core/Src/AMS_CAN.c **** break; + 117:Core/Src/AMS_CAN.c **** } + 118:Core/Src/AMS_CAN.c **** } + 225 .loc 1 118 1 is_stmt 0 view .LVU69 + 226 0016 7047 bx lr + 227 .L17: + 228 .align 2 + 229 .L16: + 230 0018 00000000 .word PENDING_MESSAGE_HANDLE + 231 001c 00000000 .word canTestData + 232 .cfi_endproc + 233 .LFE132: + 235 .section .text.HAL_CAN_RxFifo0MsgPendingCallback,"ax",%progbits + 236 .align 1 + 237 .global HAL_CAN_RxFifo0MsgPendingCallback + 238 .syntax unified + 239 .thumb + 240 .thumb_func + 242 HAL_CAN_RxFifo0MsgPendingCallback: + 243 .LVL15: + 244 .LFB131: + 79:Core/Src/AMS_CAN.c **** static CAN_RxHeaderTypeDef header; + 245 .loc 1 79 67 is_stmt 1 view -0 + 246 .cfi_startproc + 247 @ args = 0, pretend = 0, frame = 0 + 248 @ frame_needed = 0, uses_anonymous_args = 0 + 79:Core/Src/AMS_CAN.c **** static CAN_RxHeaderTypeDef header; + 249 .loc 1 79 67 is_stmt 0 view .LVU71 + 250 0000 10B5 push {r4, lr} + 251 .cfi_def_cfa_offset 8 + 252 .cfi_offset 4, -8 + 253 .cfi_offset 14, -4 + 254 0002 0446 mov r4, r0 + 80:Core/Src/AMS_CAN.c **** static uint8_t data[8]; + 255 .loc 1 80 3 is_stmt 1 view .LVU72 + 81:Core/Src/AMS_CAN.c **** cb_triggered = 1; + 256 .loc 1 81 3 view .LVU73 + 82:Core/Src/AMS_CAN.c **** + 257 .loc 1 82 3 view .LVU74 + 82:Core/Src/AMS_CAN.c **** + 258 .loc 1 82 16 is_stmt 0 view .LVU75 + 259 0004 0B4B ldr r3, .L25 + 260 0006 0122 movs r2, #1 + 261 0008 1A60 str r2, [r3] + 84:Core/Src/AMS_CAN.c **** Error_Handler(); + 262 .loc 1 84 3 is_stmt 1 view .LVU76 + 84:Core/Src/AMS_CAN.c **** Error_Handler(); + 263 .loc 1 84 7 is_stmt 0 view .LVU77 + 264 000a 0B4B ldr r3, .L25+4 + 265 000c 0B4A ldr r2, .L25+8 + 266 000e 0021 movs r1, #0 + 267 0010 FFF7FEFF bl HAL_CAN_GetRxMessage + ARM GAS /tmp/ccf8kWw2.s page 8 + + + 268 .LVL16: + 84:Core/Src/AMS_CAN.c **** Error_Handler(); + 269 .loc 1 84 6 view .LVU78 + 270 0014 30B9 cbnz r0, .L23 + 271 .L19: + 88:Core/Src/AMS_CAN.c **** ams_can_handle_ams_msg(&header, data); + 272 .loc 1 88 3 is_stmt 1 view .LVU79 + 88:Core/Src/AMS_CAN.c **** ams_can_handle_ams_msg(&header, data); + 273 .loc 1 88 14 is_stmt 0 view .LVU80 + 274 0016 0A4B ldr r3, .L25+12 + 275 0018 1B68 ldr r3, [r3] + 88:Core/Src/AMS_CAN.c **** ams_can_handle_ams_msg(&header, data); + 276 .loc 1 88 6 view .LVU81 + 277 001a A342 cmp r3, r4 + 278 001c 05D0 beq .L24 + 91:Core/Src/AMS_CAN.c **** } + 279 .loc 1 91 5 is_stmt 1 view .LVU82 + 280 001e FFF7FEFF bl Error_Handler + 281 .LVL17: + 282 .L18: + 93:Core/Src/AMS_CAN.c **** + 283 .loc 1 93 1 is_stmt 0 view .LVU83 + 284 0022 10BD pop {r4, pc} + 285 .LVL18: + 286 .L23: + 85:Core/Src/AMS_CAN.c **** } + 287 .loc 1 85 5 is_stmt 1 view .LVU84 + 288 0024 FFF7FEFF bl Error_Handler + 289 .LVL19: + 290 0028 F5E7 b .L19 + 291 .L24: + 89:Core/Src/AMS_CAN.c **** } else { + 292 .loc 1 89 5 view .LVU85 + 293 002a 0349 ldr r1, .L25+4 + 294 002c 0348 ldr r0, .L25+8 + 295 002e FFF7FEFF bl ams_can_handle_ams_msg + 296 .LVL20: + 297 0032 F6E7 b .L18 + 298 .L26: + 299 .align 2 + 300 .L25: + 301 0034 00000000 .word cb_triggered + 302 0038 00000000 .word data.2 + 303 003c 00000000 .word header.3 + 304 0040 00000000 .word ams_can_handle + 305 .cfi_endproc + 306 .LFE131: + 308 .section .text.ams_can_wait_for_free_mailboxes,"ax",%progbits + 309 .align 1 + 310 .global ams_can_wait_for_free_mailboxes + 311 .syntax unified + 312 .thumb + 313 .thumb_func + 315 ams_can_wait_for_free_mailboxes: + 316 .LVL21: + 317 .LFB134: + 119:Core/Src/AMS_CAN.c **** + ARM GAS /tmp/ccf8kWw2.s page 9 + + + 120:Core/Src/AMS_CAN.c **** void ams_can_send_heartbeat() { + 121:Core/Src/AMS_CAN.c **** static CAN_TxHeaderTypeDef header; + 122:Core/Src/AMS_CAN.c **** static uint8_t data[8]; + 123:Core/Src/AMS_CAN.c **** + 124:Core/Src/AMS_CAN.c **** header.IDE = CAN_ID_STD; + 125:Core/Src/AMS_CAN.c **** header.DLC = 8; + 126:Core/Src/AMS_CAN.c **** header.RTR = CAN_RTR_DATA; + 127:Core/Src/AMS_CAN.c **** header.TransmitGlobalTime = DISABLE; + 128:Core/Src/AMS_CAN.c **** + 129:Core/Src/AMS_CAN.c **** // Send voltages + 130:Core/Src/AMS_CAN.c **** for (int msg_id = 0; msg_id < 5; msg_id++) { + 131:Core/Src/AMS_CAN.c **** header.StdId = CAN_ID_AMS_SLAVE_HEARTBEAT_BASE | (0 << 4) | msg_id; //TODO: Use slave_id/new fo + 132:Core/Src/AMS_CAN.c **** for (int i = 0; i < 4; i++) { + 133:Core/Src/AMS_CAN.c **** int cell = msg_id * 4 + i; + 134:Core/Src/AMS_CAN.c **** uint16_t v = (cell < N_CELLS) ? module.cellVoltages[cell] : 0; + 135:Core/Src/AMS_CAN.c **** data[2 * i + 0] = v & 0xFF; + 136:Core/Src/AMS_CAN.c **** data[2 * i + 1] = v >> 8; + 137:Core/Src/AMS_CAN.c **** } + 138:Core/Src/AMS_CAN.c **** if (ams_can_wait_for_free_mailboxes(ams_can_handle, 1, + 139:Core/Src/AMS_CAN.c **** CAN_HEARTBEAT_TX_TIMEOUT) == HAL_OK) { + 140:Core/Src/AMS_CAN.c **** uint32_t mailbox; + 141:Core/Src/AMS_CAN.c **** HAL_CAN_AddTxMessage(ams_can_handle, &header, data, &mailbox); + 142:Core/Src/AMS_CAN.c **** } + 143:Core/Src/AMS_CAN.c **** } + 144:Core/Src/AMS_CAN.c **** + 145:Core/Src/AMS_CAN.c **** // Send temperatures + 146:Core/Src/AMS_CAN.c **** /*for (int temp_msg_id = 0; temp_msg_id < 8; temp_msg_id++) { + 147:Core/Src/AMS_CAN.c **** int msg_id = temp_msg_id + 3; + 148:Core/Src/AMS_CAN.c **** header.StdId = CAN_ID_AMS_SLAVE_HEARTBEAT_BASE | (slave_id << 4) | msg_id; + 149:Core/Src/AMS_CAN.c **** for (int i = 0; i < 4; i++) { + 150:Core/Src/AMS_CAN.c **** int sensor = temp_msg_id * 4 + i; + 151:Core/Src/AMS_CAN.c **** uint16_t temp = temperatures[sensor]; + 152:Core/Src/AMS_CAN.c **** data[2 * i + 0] = temp & 0xFF; + 153:Core/Src/AMS_CAN.c **** data[2 * i + 1] = temp >> 8; + 154:Core/Src/AMS_CAN.c **** } + 155:Core/Src/AMS_CAN.c **** if (ams_can_wait_for_free_mailboxes(ams_can_handle, 1, + 156:Core/Src/AMS_CAN.c **** CAN_HEARTBEAT_TX_TIMEOUT) == HAL_OK) { + 157:Core/Src/AMS_CAN.c **** uint32_t mailbox; + 158:Core/Src/AMS_CAN.c **** HAL_CAN_AddTxMessage(ams_can_handle, &header, data, &mailbox); + 159:Core/Src/AMS_CAN.c **** } + 160:Core/Src/AMS_CAN.c **** }*/ + 161:Core/Src/AMS_CAN.c **** } + 162:Core/Src/AMS_CAN.c **** + 163:Core/Src/AMS_CAN.c **** /*void ams_can_send_error(AMS_ErrorCode error_code, + 164:Core/Src/AMS_CAN.c **** uint32_t transmission_timeout) { + 165:Core/Src/AMS_CAN.c **** static CAN_TxHeaderTypeDef header; + 166:Core/Src/AMS_CAN.c **** header.IDE = CAN_ID_STD; + 167:Core/Src/AMS_CAN.c **** header.DLC = 8; + 168:Core/Src/AMS_CAN.c **** header.RTR = CAN_RTR_DATA; + 169:Core/Src/AMS_CAN.c **** header.TransmitGlobalTime = DISABLE; + 170:Core/Src/AMS_CAN.c **** header.StdId = CAN_ID_SLAVE_ERROR; + 171:Core/Src/AMS_CAN.c **** + 172:Core/Src/AMS_CAN.c **** static uint8_t data[8]; + 173:Core/Src/AMS_CAN.c **** data[0] = slave_id; + 174:Core/Src/AMS_CAN.c **** data[1] = error_code; + 175:Core/Src/AMS_CAN.c **** + 176:Core/Src/AMS_CAN.c **** HAL_CAN_AbortTxRequest(ams_can_handle, + ARM GAS /tmp/ccf8kWw2.s page 10 + + + 177:Core/Src/AMS_CAN.c **** CAN_TX_MAILBOX0 | CAN_TX_MAILBOX1 | CAN_TX_MAILBOX2); + 178:Core/Src/AMS_CAN.c **** uint32_t mailbox; + 179:Core/Src/AMS_CAN.c **** HAL_CAN_AddTxMessage(ams_can_handle, &header, data, &mailbox); + 180:Core/Src/AMS_CAN.c **** ams_can_wait_for_free_mailboxes(ams_can_handle, 3, transmission_timeout); + 181:Core/Src/AMS_CAN.c **** }*/ + 182:Core/Src/AMS_CAN.c **** + 183:Core/Src/AMS_CAN.c **** HAL_StatusTypeDef ams_can_wait_for_free_mailboxes(CAN_HandleTypeDef* handle, + 184:Core/Src/AMS_CAN.c **** int num_mailboxes, + 185:Core/Src/AMS_CAN.c **** uint32_t timeout) { + 318 .loc 1 185 69 view -0 + 319 .cfi_startproc + 320 @ args = 0, pretend = 0, frame = 0 + 321 @ frame_needed = 0, uses_anonymous_args = 0 + 322 .loc 1 185 69 is_stmt 0 view .LVU87 + 323 0000 70B5 push {r4, r5, r6, lr} + 324 .cfi_def_cfa_offset 16 + 325 .cfi_offset 4, -16 + 326 .cfi_offset 5, -12 + 327 .cfi_offset 6, -8 + 328 .cfi_offset 14, -4 + 329 0002 0646 mov r6, r0 + 330 0004 0D46 mov r5, r1 + 331 0006 1446 mov r4, r2 + 186:Core/Src/AMS_CAN.c **** uint32_t end = HAL_GetTick() + timeout; + 332 .loc 1 186 3 is_stmt 1 view .LVU88 + 333 .loc 1 186 18 is_stmt 0 view .LVU89 + 334 0008 FFF7FEFF bl HAL_GetTick + 335 .LVL22: + 336 .loc 1 186 12 view .LVU90 + 337 000c 0444 add r4, r4, r0 + 338 .LVL23: + 187:Core/Src/AMS_CAN.c **** while (HAL_GetTick() < end) { + 339 .loc 1 187 3 is_stmt 1 view .LVU91 + 340 .L28: + 341 .loc 1 187 24 view .LVU92 + 342 .loc 1 187 10 is_stmt 0 view .LVU93 + 343 000e FFF7FEFF bl HAL_GetTick + 344 .LVL24: + 345 .loc 1 187 24 view .LVU94 + 346 0012 A042 cmp r0, r4 + 347 0014 06D2 bcs .L33 + 188:Core/Src/AMS_CAN.c **** if (HAL_CAN_GetTxMailboxesFreeLevel(handle) >= num_mailboxes) { + 348 .loc 1 188 5 is_stmt 1 view .LVU95 + 349 .loc 1 188 9 is_stmt 0 view .LVU96 + 350 0016 3046 mov r0, r6 + 351 0018 FFF7FEFF bl HAL_CAN_GetTxMailboxesFreeLevel + 352 .LVL25: + 353 .loc 1 188 8 view .LVU97 + 354 001c A842 cmp r0, r5 + 355 001e F6D3 bcc .L28 + 189:Core/Src/AMS_CAN.c **** return HAL_OK; + 356 .loc 1 189 14 view .LVU98 + 357 0020 0020 movs r0, #0 + 358 0022 00E0 b .L29 + 359 .L33: + 190:Core/Src/AMS_CAN.c **** } + 191:Core/Src/AMS_CAN.c **** } + ARM GAS /tmp/ccf8kWw2.s page 11 + + + 192:Core/Src/AMS_CAN.c **** return HAL_TIMEOUT; + 360 .loc 1 192 10 view .LVU99 + 361 0024 0320 movs r0, #3 + 362 .L29: + 193:Core/Src/AMS_CAN.c **** } + 363 .loc 1 193 1 view .LVU100 + 364 0026 70BD pop {r4, r5, r6, pc} + 365 .loc 1 193 1 view .LVU101 + 366 .cfi_endproc + 367 .LFE134: + 369 .section .text.ams_can_send_heartbeat,"ax",%progbits + 370 .align 1 + 371 .global ams_can_send_heartbeat + 372 .syntax unified + 373 .thumb + 374 .thumb_func + 376 ams_can_send_heartbeat: + 377 .LFB133: + 120:Core/Src/AMS_CAN.c **** static CAN_TxHeaderTypeDef header; + 378 .loc 1 120 31 is_stmt 1 view -0 + 379 .cfi_startproc + 380 @ args = 0, pretend = 0, frame = 8 + 381 @ frame_needed = 0, uses_anonymous_args = 0 + 382 0000 10B5 push {r4, lr} + 383 .cfi_def_cfa_offset 8 + 384 .cfi_offset 4, -8 + 385 .cfi_offset 14, -4 + 386 0002 82B0 sub sp, sp, #8 + 387 .cfi_def_cfa_offset 16 + 121:Core/Src/AMS_CAN.c **** static uint8_t data[8]; + 388 .loc 1 121 3 view .LVU103 + 122:Core/Src/AMS_CAN.c **** + 389 .loc 1 122 3 view .LVU104 + 124:Core/Src/AMS_CAN.c **** header.DLC = 8; + 390 .loc 1 124 3 view .LVU105 + 124:Core/Src/AMS_CAN.c **** header.DLC = 8; + 391 .loc 1 124 14 is_stmt 0 view .LVU106 + 392 0004 1A4B ldr r3, .L46 + 393 0006 0024 movs r4, #0 + 394 0008 9C60 str r4, [r3, #8] + 125:Core/Src/AMS_CAN.c **** header.RTR = CAN_RTR_DATA; + 395 .loc 1 125 3 is_stmt 1 view .LVU107 + 125:Core/Src/AMS_CAN.c **** header.RTR = CAN_RTR_DATA; + 396 .loc 1 125 14 is_stmt 0 view .LVU108 + 397 000a 0822 movs r2, #8 + 398 000c 1A61 str r2, [r3, #16] + 126:Core/Src/AMS_CAN.c **** header.TransmitGlobalTime = DISABLE; + 399 .loc 1 126 3 is_stmt 1 view .LVU109 + 126:Core/Src/AMS_CAN.c **** header.TransmitGlobalTime = DISABLE; + 400 .loc 1 126 14 is_stmt 0 view .LVU110 + 401 000e DC60 str r4, [r3, #12] + 127:Core/Src/AMS_CAN.c **** + 402 .loc 1 127 3 is_stmt 1 view .LVU111 + 127:Core/Src/AMS_CAN.c **** + 403 .loc 1 127 29 is_stmt 0 view .LVU112 + 404 0010 1C75 strb r4, [r3, #20] + 130:Core/Src/AMS_CAN.c **** header.StdId = CAN_ID_AMS_SLAVE_HEARTBEAT_BASE | (0 << 4) | msg_id; //TODO: Use slave_id/new fo + ARM GAS /tmp/ccf8kWw2.s page 12 + + + 405 .loc 1 130 3 is_stmt 1 view .LVU113 + 406 .LBB3: + 130:Core/Src/AMS_CAN.c **** header.StdId = CAN_ID_AMS_SLAVE_HEARTBEAT_BASE | (0 << 4) | msg_id; //TODO: Use slave_id/new fo + 407 .loc 1 130 8 view .LVU114 + 408 .LVL26: + 130:Core/Src/AMS_CAN.c **** header.StdId = CAN_ID_AMS_SLAVE_HEARTBEAT_BASE | (0 << 4) | msg_id; //TODO: Use slave_id/new fo + 409 .loc 1 130 3 is_stmt 0 view .LVU115 + 410 0012 1AE0 b .L35 + 411 .LVL27: + 412 .L41: + 413 .LBB4: + 414 .LBB5: + 134:Core/Src/AMS_CAN.c **** data[2 * i + 0] = v & 0xFF; + 415 .loc 1 134 16 view .LVU116 + 416 0014 0022 movs r2, #0 + 417 .LVL28: + 418 .L37: + 135:Core/Src/AMS_CAN.c **** data[2 * i + 1] = v >> 8; + 419 .loc 1 135 7 is_stmt 1 discriminator 4 view .LVU117 + 135:Core/Src/AMS_CAN.c **** data[2 * i + 1] = v >> 8; + 420 .loc 1 135 18 is_stmt 0 discriminator 4 view .LVU118 + 421 0016 5900 lsls r1, r3, #1 + 135:Core/Src/AMS_CAN.c **** data[2 * i + 1] = v >> 8; + 422 .loc 1 135 23 discriminator 4 view .LVU119 + 423 0018 1648 ldr r0, .L46+4 + 424 001a 00F81320 strb r2, [r0, r3, lsl #1] + 136:Core/Src/AMS_CAN.c **** } + 425 .loc 1 136 7 is_stmt 1 discriminator 4 view .LVU120 + 136:Core/Src/AMS_CAN.c **** } + 426 .loc 1 136 18 is_stmt 0 discriminator 4 view .LVU121 + 427 001e 0131 adds r1, r1, #1 + 136:Core/Src/AMS_CAN.c **** } + 428 .loc 1 136 23 discriminator 4 view .LVU122 + 429 0020 120A lsrs r2, r2, #8 + 430 .LVL29: + 136:Core/Src/AMS_CAN.c **** } + 431 .loc 1 136 23 discriminator 4 view .LVU123 + 432 0022 4254 strb r2, [r0, r1] + 433 .LBE5: + 132:Core/Src/AMS_CAN.c **** int cell = msg_id * 4 + i; + 434 .loc 1 132 29 is_stmt 1 discriminator 4 view .LVU124 + 435 0024 0133 adds r3, r3, #1 + 436 .LVL30: + 437 .L36: + 132:Core/Src/AMS_CAN.c **** int cell = msg_id * 4 + i; + 438 .loc 1 132 23 discriminator 2 view .LVU125 + 439 0026 032B cmp r3, #3 + 440 0028 07DC bgt .L43 + 441 .LBB6: + 133:Core/Src/AMS_CAN.c **** uint16_t v = (cell < N_CELLS) ? module.cellVoltages[cell] : 0; + 442 .loc 1 133 7 view .LVU126 + 133:Core/Src/AMS_CAN.c **** uint16_t v = (cell < N_CELLS) ? module.cellVoltages[cell] : 0; + 443 .loc 1 133 11 is_stmt 0 view .LVU127 + 444 002a 03EB8402 add r2, r3, r4, lsl #2 + 445 .LVL31: + 134:Core/Src/AMS_CAN.c **** data[2 * i + 0] = v & 0xFF; + 446 .loc 1 134 7 is_stmt 1 view .LVU128 + ARM GAS /tmp/ccf8kWw2.s page 13 + + + 134:Core/Src/AMS_CAN.c **** data[2 * i + 0] = v & 0xFF; + 447 .loc 1 134 16 is_stmt 0 view .LVU129 + 448 002e 102A cmp r2, #16 + 449 0030 F0DC bgt .L41 + 134:Core/Src/AMS_CAN.c **** data[2 * i + 0] = v & 0xFF; + 450 .loc 1 134 16 discriminator 1 view .LVU130 + 451 0032 1149 ldr r1, .L46+8 + 452 0034 31F81220 ldrh r2, [r1, r2, lsl #1] + 453 .LVL32: + 134:Core/Src/AMS_CAN.c **** data[2 * i + 0] = v & 0xFF; + 454 .loc 1 134 16 discriminator 1 view .LVU131 + 455 0038 EDE7 b .L37 + 456 .LVL33: + 457 .L43: + 134:Core/Src/AMS_CAN.c **** data[2 * i + 0] = v & 0xFF; + 458 .loc 1 134 16 discriminator 1 view .LVU132 + 459 .LBE6: + 460 .LBE4: + 138:Core/Src/AMS_CAN.c **** CAN_HEARTBEAT_TX_TIMEOUT) == HAL_OK) { + 461 .loc 1 138 5 is_stmt 1 view .LVU133 + 138:Core/Src/AMS_CAN.c **** CAN_HEARTBEAT_TX_TIMEOUT) == HAL_OK) { + 462 .loc 1 138 9 is_stmt 0 view .LVU134 + 463 003a 0A22 movs r2, #10 + 464 003c 0121 movs r1, #1 + 465 003e 0F4B ldr r3, .L46+12 + 466 .LVL34: + 138:Core/Src/AMS_CAN.c **** CAN_HEARTBEAT_TX_TIMEOUT) == HAL_OK) { + 467 .loc 1 138 9 view .LVU135 + 468 0040 1868 ldr r0, [r3] + 469 0042 FFF7FEFF bl ams_can_wait_for_free_mailboxes + 470 .LVL35: + 138:Core/Src/AMS_CAN.c **** CAN_HEARTBEAT_TX_TIMEOUT) == HAL_OK) { + 471 .loc 1 138 8 view .LVU136 + 472 0046 40B1 cbz r0, .L44 + 473 .L39: + 130:Core/Src/AMS_CAN.c **** header.StdId = CAN_ID_AMS_SLAVE_HEARTBEAT_BASE | (0 << 4) | msg_id; //TODO: Use slave_id/new fo + 474 .loc 1 130 42 is_stmt 1 discriminator 2 view .LVU137 + 475 0048 0134 adds r4, r4, #1 + 476 .LVL36: + 477 .L35: + 130:Core/Src/AMS_CAN.c **** header.StdId = CAN_ID_AMS_SLAVE_HEARTBEAT_BASE | (0 << 4) | msg_id; //TODO: Use slave_id/new fo + 478 .loc 1 130 31 discriminator 1 view .LVU138 + 479 004a 042C cmp r4, #4 + 480 004c 0DDC bgt .L45 + 131:Core/Src/AMS_CAN.c **** for (int i = 0; i < 4; i++) { + 481 .loc 1 131 5 view .LVU139 + 131:Core/Src/AMS_CAN.c **** for (int i = 0; i < 4; i++) { + 482 .loc 1 131 63 is_stmt 0 view .LVU140 + 483 004e 44F4C063 orr r3, r4, #1536 + 131:Core/Src/AMS_CAN.c **** for (int i = 0; i < 4; i++) { + 484 .loc 1 131 18 view .LVU141 + 485 0052 074A ldr r2, .L46 + 486 0054 1360 str r3, [r2] + 132:Core/Src/AMS_CAN.c **** int cell = msg_id * 4 + i; + 487 .loc 1 132 5 is_stmt 1 view .LVU142 + 488 .LBB7: + 132:Core/Src/AMS_CAN.c **** int cell = msg_id * 4 + i; + ARM GAS /tmp/ccf8kWw2.s page 14 + + + 489 .loc 1 132 10 view .LVU143 + 490 .LVL37: + 132:Core/Src/AMS_CAN.c **** int cell = msg_id * 4 + i; + 491 .loc 1 132 14 is_stmt 0 view .LVU144 + 492 0056 0023 movs r3, #0 + 132:Core/Src/AMS_CAN.c **** int cell = msg_id * 4 + i; + 493 .loc 1 132 5 view .LVU145 + 494 0058 E5E7 b .L36 + 495 .LVL38: + 496 .L44: + 132:Core/Src/AMS_CAN.c **** int cell = msg_id * 4 + i; + 497 .loc 1 132 5 view .LVU146 + 498 .LBE7: + 499 .LBB8: + 140:Core/Src/AMS_CAN.c **** HAL_CAN_AddTxMessage(ams_can_handle, &header, data, &mailbox); + 500 .loc 1 140 7 is_stmt 1 view .LVU147 + 141:Core/Src/AMS_CAN.c **** } + 501 .loc 1 141 7 view .LVU148 + 502 005a 01AB add r3, sp, #4 + 503 005c 054A ldr r2, .L46+4 + 504 005e 0449 ldr r1, .L46 + 505 0060 0648 ldr r0, .L46+12 + 506 0062 0068 ldr r0, [r0] + 507 0064 FFF7FEFF bl HAL_CAN_AddTxMessage + 508 .LVL39: + 509 0068 EEE7 b .L39 + 510 .LVL40: + 511 .L45: + 141:Core/Src/AMS_CAN.c **** } + 512 .loc 1 141 7 is_stmt 0 view .LVU149 + 513 .LBE8: + 514 .LBE3: + 161:Core/Src/AMS_CAN.c **** + 515 .loc 1 161 1 view .LVU150 + 516 006a 02B0 add sp, sp, #8 + 517 .cfi_def_cfa_offset 8 + 518 @ sp needed + 519 006c 10BD pop {r4, pc} + 520 .LVL41: + 521 .L47: + 161:Core/Src/AMS_CAN.c **** + 522 .loc 1 161 1 view .LVU151 + 523 006e 00BF .align 2 + 524 .L46: + 525 0070 00000000 .word header.1 + 526 0074 00000000 .word data.0 + 527 0078 00000000 .word module + 528 007c 00000000 .word ams_can_handle + 529 .cfi_endproc + 530 .LFE133: + 532 .section .bss.data.0,"aw",%nobits + 533 .align 2 + 536 data.0: + 537 0000 00000000 .space 8 + 537 00000000 + 538 .section .bss.header.1,"aw",%nobits + 539 .align 2 + ARM GAS /tmp/ccf8kWw2.s page 15 + + + 542 header.1: + 543 0000 00000000 .space 24 + 543 00000000 + 543 00000000 + 543 00000000 + 543 00000000 + 544 .section .bss.data.2,"aw",%nobits + 545 .align 2 + 548 data.2: + 549 0000 00000000 .space 8 + 549 00000000 + 550 .section .bss.header.3,"aw",%nobits + 551 .align 2 + 554 header.3: + 555 0000 00000000 .space 28 + 555 00000000 + 555 00000000 + 555 00000000 + 555 00000000 + 556 .section .bss.cb_triggered,"aw",%nobits + 557 .align 2 + 560 cb_triggered: + 561 0000 00000000 .space 4 + 562 .global ams_can_handle + 563 .section .bss.ams_can_handle,"aw",%nobits + 564 .align 2 + 567 ams_can_handle: + 568 0000 00000000 .space 4 + 569 .global canTestData + 570 .section .bss.canTestData,"aw",%nobits + 571 .align 2 + 574 canTestData: + 575 0000 00000000 .space 8 + 575 00000000 + 576 .global PENDING_MESSAGE_HANDLE + 577 .section .bss.PENDING_MESSAGE_HANDLE,"aw",%nobits + 578 .align 2 + 581 PENDING_MESSAGE_HANDLE: + 582 0000 00000000 .space 4 + 583 .text + 584 .Letext0: + 585 .file 2 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 586 .file 3 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 587 .file 4 "Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h" + 588 .file 5 "Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h" + 589 .file 6 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h" + 590 .file 7 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h" + 591 .file 8 "Core/Inc/ADBMS_LL_Driver.h" + 592 .file 9 "Core/Inc/ADBMS_Abstraction.h" + 593 .file 10 "Core/Inc/AMS_CAN.h" + 594 .file 11 "Core/Inc/AMS_HighLevel.h" + 595 .file 12 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h" + 596 .file 13 "Core/Inc/main.h" + ARM GAS /tmp/ccf8kWw2.s page 16 + + +DEFINED SYMBOLS + *ABS*:0000000000000000 AMS_CAN.c + /tmp/ccf8kWw2.s:21 .text.ams_can_init:0000000000000000 $t + /tmp/ccf8kWw2.s:27 .text.ams_can_init:0000000000000000 ams_can_init + /tmp/ccf8kWw2.s:176 .text.ams_can_init:0000000000000088 $d + /tmp/ccf8kWw2.s:567 .bss.ams_can_handle:0000000000000000 ams_can_handle + /tmp/ccf8kWw2.s:181 .text.ams_can_handle_ams_msg:0000000000000000 $t + /tmp/ccf8kWw2.s:187 .text.ams_can_handle_ams_msg:0000000000000000 ams_can_handle_ams_msg + /tmp/ccf8kWw2.s:230 .text.ams_can_handle_ams_msg:0000000000000018 $d + /tmp/ccf8kWw2.s:581 .bss.PENDING_MESSAGE_HANDLE:0000000000000000 PENDING_MESSAGE_HANDLE + /tmp/ccf8kWw2.s:574 .bss.canTestData:0000000000000000 canTestData + /tmp/ccf8kWw2.s:236 .text.HAL_CAN_RxFifo0MsgPendingCallback:0000000000000000 $t + /tmp/ccf8kWw2.s:242 .text.HAL_CAN_RxFifo0MsgPendingCallback:0000000000000000 HAL_CAN_RxFifo0MsgPendingCallback + /tmp/ccf8kWw2.s:301 .text.HAL_CAN_RxFifo0MsgPendingCallback:0000000000000034 $d + /tmp/ccf8kWw2.s:560 .bss.cb_triggered:0000000000000000 cb_triggered + /tmp/ccf8kWw2.s:548 .bss.data.2:0000000000000000 data.2 + /tmp/ccf8kWw2.s:554 .bss.header.3:0000000000000000 header.3 + /tmp/ccf8kWw2.s:309 .text.ams_can_wait_for_free_mailboxes:0000000000000000 $t + /tmp/ccf8kWw2.s:315 .text.ams_can_wait_for_free_mailboxes:0000000000000000 ams_can_wait_for_free_mailboxes + /tmp/ccf8kWw2.s:370 .text.ams_can_send_heartbeat:0000000000000000 $t + /tmp/ccf8kWw2.s:376 .text.ams_can_send_heartbeat:0000000000000000 ams_can_send_heartbeat + /tmp/ccf8kWw2.s:525 .text.ams_can_send_heartbeat:0000000000000070 $d + /tmp/ccf8kWw2.s:542 .bss.header.1:0000000000000000 header.1 + /tmp/ccf8kWw2.s:536 .bss.data.0:0000000000000000 data.0 + /tmp/ccf8kWw2.s:533 .bss.data.0:0000000000000000 $d + /tmp/ccf8kWw2.s:539 .bss.header.1:0000000000000000 $d + /tmp/ccf8kWw2.s:545 .bss.data.2:0000000000000000 $d + /tmp/ccf8kWw2.s:551 .bss.header.3:0000000000000000 $d + /tmp/ccf8kWw2.s:557 .bss.cb_triggered:0000000000000000 $d + /tmp/ccf8kWw2.s:564 .bss.ams_can_handle:0000000000000000 $d + /tmp/ccf8kWw2.s:571 .bss.canTestData:0000000000000000 $d + /tmp/ccf8kWw2.s:578 .bss.PENDING_MESSAGE_HANDLE:0000000000000000 $d + +UNDEFINED SYMBOLS +HAL_CAN_Start +HAL_CAN_ConfigFilter +HAL_CAN_ActivateNotification +Error_Handler +HAL_CAN_GetRxMessage +HAL_GetTick +HAL_CAN_GetTxMailboxesFreeLevel +HAL_CAN_AddTxMessage +module diff --git a/BMS_Testbench/BMS_Software_V1/build/AMS_CAN.o b/BMS_Testbench/BMS_Software_V1/build/AMS_CAN.o new file mode 100644 index 0000000000000000000000000000000000000000..cf3dd49fb923bc5cb18d6a7889c80e89560a6b1d GIT binary patch literal 14036 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 literal 0 HcmV?d00001 diff --git a/BMS_Testbench/BMS_Software_V1/build/AMS_HighLevel.d b/BMS_Testbench/BMS_Software_V1/build/AMS_HighLevel.d new file mode 100644 index 0000000..690af56 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/AMS_HighLevel.d @@ -0,0 +1,64 @@ +build/AMS_HighLevel.o: Core/Src/AMS_HighLevel.c Core/Inc/AMS_HighLevel.h \ + Core/Inc/ADBMS_Abstraction.h Core/Inc/ADBMS_LL_Driver.h Core/Inc/main.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h \ + Core/Inc/stm32f3xx_hal_conf.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h \ + Drivers/CMSIS/Include/core_cm4.h Drivers/CMSIS/Include/cmsis_version.h \ + Drivers/CMSIS/Include/cmsis_compiler.h Drivers/CMSIS/Include/cmsis_gcc.h \ + Drivers/CMSIS/Include/mpu_armv7.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h \ + Core/Inc/ADBMS_CMD_MAKROS.h +Core/Inc/AMS_HighLevel.h: +Core/Inc/ADBMS_Abstraction.h: +Core/Inc/ADBMS_LL_Driver.h: +Core/Inc/main.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h: +Core/Inc/stm32f3xx_hal_conf.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h: +Drivers/CMSIS/Include/core_cm4.h: +Drivers/CMSIS/Include/cmsis_version.h: +Drivers/CMSIS/Include/cmsis_compiler.h: +Drivers/CMSIS/Include/cmsis_gcc.h: +Drivers/CMSIS/Include/mpu_armv7.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h: +Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h: +Core/Inc/ADBMS_CMD_MAKROS.h: diff --git a/BMS_Testbench/BMS_Software_V1/build/AMS_HighLevel.lst b/BMS_Testbench/BMS_Software_V1/build/AMS_HighLevel.lst new file mode 100644 index 0000000..827dfa4 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/AMS_HighLevel.lst @@ -0,0 +1,1530 @@ +ARM GAS /tmp/ccaolay4.s page 1 + + + 1 .cpu cortex-m4 + 2 .arch armv7e-m + 3 .fpu fpv4-sp-d16 + 4 .eabi_attribute 27, 1 + 5 .eabi_attribute 28, 1 + 6 .eabi_attribute 20, 1 + 7 .eabi_attribute 21, 1 + 8 .eabi_attribute 23, 3 + 9 .eabi_attribute 24, 1 + 10 .eabi_attribute 25, 1 + 11 .eabi_attribute 26, 1 + 12 .eabi_attribute 30, 1 + 13 .eabi_attribute 34, 1 + 14 .eabi_attribute 18, 4 + 15 .file "AMS_HighLevel.c" + 16 .text + 17 .Ltext0: + 18 .cfi_sections .debug_frame + 19 .file 1 "Core/Src/AMS_HighLevel.c" + 20 .section .text.AMS_Init,"ax",%progbits + 21 .align 1 + 22 .global AMS_Init + 23 .syntax unified + 24 .thumb + 25 .thumb_func + 27 AMS_Init: + 28 .LVL0: + 29 .LFB130: + 1:Core/Src/AMS_HighLevel.c **** /* + 2:Core/Src/AMS_HighLevel.c **** * AMS_HighLevel.c + 3:Core/Src/AMS_HighLevel.c **** * + 4:Core/Src/AMS_HighLevel.c **** * Created on: 20.07.2022 + 5:Core/Src/AMS_HighLevel.c **** * Author: max + 6:Core/Src/AMS_HighLevel.c **** */ + 7:Core/Src/AMS_HighLevel.c **** + 8:Core/Src/AMS_HighLevel.c **** + 9:Core/Src/AMS_HighLevel.c **** #include "AMS_HighLevel.h" + 10:Core/Src/AMS_HighLevel.c **** + 11:Core/Src/AMS_HighLevel.c **** Cell_Module module; + 12:Core/Src/AMS_HighLevel.c **** uint32_t balancedCells = 0; + 13:Core/Src/AMS_HighLevel.c **** uint8_t BalancingActive = 0; + 14:Core/Src/AMS_HighLevel.c **** uint8_t stateofcharge = 100; + 15:Core/Src/AMS_HighLevel.c **** int64_t currentintegrator = 0; + 16:Core/Src/AMS_HighLevel.c **** uint32_t lastticks = 0; + 17:Core/Src/AMS_HighLevel.c **** uint32_t currenttick = 0; + 18:Core/Src/AMS_HighLevel.c **** uint8_t eepromconfigured = 0; + 19:Core/Src/AMS_HighLevel.c **** + 20:Core/Src/AMS_HighLevel.c **** uint8_t internalbalancingalgo = 1; + 21:Core/Src/AMS_HighLevel.c **** uint16_t startbalancingthreshold = 41000; + 22:Core/Src/AMS_HighLevel.c **** uint16_t stopbalancingthreshold = 30000; + 23:Core/Src/AMS_HighLevel.c **** uint16_t balancingvoltagedelta = 10; + 24:Core/Src/AMS_HighLevel.c **** + 25:Core/Src/AMS_HighLevel.c **** + 26:Core/Src/AMS_HighLevel.c **** uint16_t amsuv = 0; + 27:Core/Src/AMS_HighLevel.c **** uint16_t amsov = 0; + 28:Core/Src/AMS_HighLevel.c **** + 29:Core/Src/AMS_HighLevel.c **** uint8_t amserrorcode = 0; + ARM GAS /tmp/ccaolay4.s page 2 + + + 30:Core/Src/AMS_HighLevel.c **** uint8_t amswarningcode = 0; + 31:Core/Src/AMS_HighLevel.c **** + 32:Core/Src/AMS_HighLevel.c **** uint8_t numberofCells = 17; + 33:Core/Src/AMS_HighLevel.c **** uint8_t numberofAux = 0; + 34:Core/Src/AMS_HighLevel.c **** + 35:Core/Src/AMS_HighLevel.c **** + 36:Core/Src/AMS_HighLevel.c **** amsState currentAMSState = AMSDEACTIVE; + 37:Core/Src/AMS_HighLevel.c **** amsState lastAMSState = AMSDEACTIVE; + 38:Core/Src/AMS_HighLevel.c **** + 39:Core/Src/AMS_HighLevel.c **** void AMS_Init(SPI_HandleTypeDef *hspi) + 40:Core/Src/AMS_HighLevel.c **** { + 30 .loc 1 40 1 view -0 + 31 .cfi_startproc + 32 @ args = 0, pretend = 0, frame = 0 + 33 @ frame_needed = 0, uses_anonymous_args = 0 + 34 .loc 1 40 1 is_stmt 0 view .LVU1 + 35 0000 08B5 push {r3, lr} + 36 .cfi_def_cfa_offset 8 + 37 .cfi_offset 3, -8 + 38 .cfi_offset 14, -4 + 41:Core/Src/AMS_HighLevel.c **** if(eepromconfigured == 1) + 39 .loc 1 41 2 is_stmt 1 view .LVU2 + 40 .loc 1 41 22 is_stmt 0 view .LVU3 + 41 0002 0F4B ldr r3, .L6 + 42 0004 1B78 ldrb r3, [r3] @ zero_extendqisi2 + 43 .loc 1 41 4 view .LVU4 + 44 0006 012B cmp r3, #1 + 45 0008 11D0 beq .L5 + 42:Core/Src/AMS_HighLevel.c **** { + 43:Core/Src/AMS_HighLevel.c **** /*amsov = eepromcellovervoltage>>4; + 44:Core/Src/AMS_HighLevel.c **** amsuv = (eepromcellundervoltage-1)>>4; + 45:Core/Src/AMS_HighLevel.c **** numberofCells = eepromnumofcells; + 46:Core/Src/AMS_HighLevel.c **** numberofAux = eepromnumofaux; + 47:Core/Src/AMS_HighLevel.c **** initAMS(hspi, eepromnumofcells, eepromnumofaux);*/ + 48:Core/Src/AMS_HighLevel.c **** amsConfigOverVoltage(amsov); + 49:Core/Src/AMS_HighLevel.c **** amsConfigUnderVoltage(amsuv); + 50:Core/Src/AMS_HighLevel.c **** } + 51:Core/Src/AMS_HighLevel.c **** else + 52:Core/Src/AMS_HighLevel.c **** { + 53:Core/Src/AMS_HighLevel.c **** initAMS(hspi, numberofCells, numberofAux); + 46 .loc 1 53 3 is_stmt 1 view .LVU5 + 47 000a 0E4B ldr r3, .L6+4 + 48 000c 1A78 ldrb r2, [r3] @ zero_extendqisi2 + 49 000e 0E4B ldr r3, .L6+8 + 50 0010 1978 ldrb r1, [r3] @ zero_extendqisi2 + 51 0012 FFF7FEFF bl initAMS + 52 .LVL1: + 54:Core/Src/AMS_HighLevel.c **** amsov = DEFAULT_OV; + 53 .loc 1 54 3 view .LVU6 + 54 .loc 1 54 9 is_stmt 0 view .LVU7 + 55 0016 0D4B ldr r3, .L6+12 + 56 0018 40F64122 movw r2, #2625 + 57 001c 1A80 strh r2, [r3] @ movhi + 55:Core/Src/AMS_HighLevel.c **** amsuv = DEFAULT_UV; + 58 .loc 1 55 3 is_stmt 1 view .LVU8 + 59 .loc 1 55 9 is_stmt 0 view .LVU9 + 60 001e 0C4B ldr r3, .L6+16 + ARM GAS /tmp/ccaolay4.s page 3 + + + 61 0020 40F21A62 movw r2, #1562 + 62 0024 1A80 strh r2, [r3] @ movhi + 63 .L3: + 56:Core/Src/AMS_HighLevel.c **** } + 57:Core/Src/AMS_HighLevel.c **** + 58:Core/Src/AMS_HighLevel.c **** + 59:Core/Src/AMS_HighLevel.c **** currentAMSState = AMSIDLE; + 64 .loc 1 59 2 is_stmt 1 view .LVU10 + 65 .loc 1 59 18 is_stmt 0 view .LVU11 + 66 0026 0B4B ldr r3, .L6+20 + 67 0028 0122 movs r2, #1 + 68 002a 1A70 strb r2, [r3] + 60:Core/Src/AMS_HighLevel.c **** + 61:Core/Src/AMS_HighLevel.c **** + 62:Core/Src/AMS_HighLevel.c **** } + 69 .loc 1 62 1 view .LVU12 + 70 002c 08BD pop {r3, pc} + 71 .LVL2: + 72 .L5: + 48:Core/Src/AMS_HighLevel.c **** amsConfigUnderVoltage(amsuv); + 73 .loc 1 48 3 is_stmt 1 view .LVU13 + 74 002e 074B ldr r3, .L6+12 + 75 0030 1888 ldrh r0, [r3] + 76 .LVL3: + 48:Core/Src/AMS_HighLevel.c **** amsConfigUnderVoltage(amsuv); + 77 .loc 1 48 3 is_stmt 0 view .LVU14 + 78 0032 FFF7FEFF bl amsConfigOverVoltage + 79 .LVL4: + 49:Core/Src/AMS_HighLevel.c **** } + 80 .loc 1 49 3 is_stmt 1 view .LVU15 + 81 0036 064B ldr r3, .L6+16 + 82 0038 1888 ldrh r0, [r3] + 83 003a FFF7FEFF bl amsConfigUnderVoltage + 84 .LVL5: + 85 003e F2E7 b .L3 + 86 .L7: + 87 .align 2 + 88 .L6: + 89 0040 00000000 .word eepromconfigured + 90 0044 00000000 .word numberofAux + 91 0048 00000000 .word numberofCells + 92 004c 00000000 .word amsov + 93 0050 00000000 .word amsuv + 94 0054 00000000 .word currentAMSState + 95 .cfi_endproc + 96 .LFE130: + 98 .section .text.AMS_Warning_Loop,"ax",%progbits + 99 .align 1 + 100 .global AMS_Warning_Loop + 101 .syntax unified + 102 .thumb + 103 .thumb_func + 105 AMS_Warning_Loop: + 106 .LFB133: + 63:Core/Src/AMS_HighLevel.c **** + 64:Core/Src/AMS_HighLevel.c **** void AMS_Loop() + 65:Core/Src/AMS_HighLevel.c **** { + ARM GAS /tmp/ccaolay4.s page 4 + + + 66:Core/Src/AMS_HighLevel.c **** + 67:Core/Src/AMS_HighLevel.c **** //On Transition Functions called ones if the State Changed + 68:Core/Src/AMS_HighLevel.c **** + 69:Core/Src/AMS_HighLevel.c **** if(currentAMSState != lastAMSState) + 70:Core/Src/AMS_HighLevel.c **** { + 71:Core/Src/AMS_HighLevel.c **** switch(currentAMSState) + 72:Core/Src/AMS_HighLevel.c **** { + 73:Core/Src/AMS_HighLevel.c **** case AMSIDLE: + 74:Core/Src/AMS_HighLevel.c **** break; + 75:Core/Src/AMS_HighLevel.c **** case AMSDEACTIVE: + 76:Core/Src/AMS_HighLevel.c **** break; + 77:Core/Src/AMS_HighLevel.c **** case AMSCHARGING: + 78:Core/Src/AMS_HighLevel.c **** break; + 79:Core/Src/AMS_HighLevel.c **** case AMSIDLEBALANCING: + 80:Core/Src/AMS_HighLevel.c **** break; + 81:Core/Src/AMS_HighLevel.c **** case AMSDISCHARGING: + 82:Core/Src/AMS_HighLevel.c **** break; + 83:Core/Src/AMS_HighLevel.c **** case AMSWARNING: + 84:Core/Src/AMS_HighLevel.c **** writeWarningLog(0x01); + 85:Core/Src/AMS_HighLevel.c **** break; + 86:Core/Src/AMS_HighLevel.c **** case AMSERROR: + 87:Core/Src/AMS_HighLevel.c **** writeErrorLog(amserrorcode); + 88:Core/Src/AMS_HighLevel.c **** break; + 89:Core/Src/AMS_HighLevel.c **** } + 90:Core/Src/AMS_HighLevel.c **** lastAMSState = currentAMSState; + 91:Core/Src/AMS_HighLevel.c **** } + 92:Core/Src/AMS_HighLevel.c **** + 93:Core/Src/AMS_HighLevel.c **** //Main Loops for different AMS States + 94:Core/Src/AMS_HighLevel.c **** + 95:Core/Src/AMS_HighLevel.c **** switch(currentAMSState) + 96:Core/Src/AMS_HighLevel.c **** { + 97:Core/Src/AMS_HighLevel.c **** case AMSIDLE: + 98:Core/Src/AMS_HighLevel.c **** AMS_Idle_Loop(); + 99:Core/Src/AMS_HighLevel.c **** break; + 100:Core/Src/AMS_HighLevel.c **** case AMSDEACTIVE: + 101:Core/Src/AMS_HighLevel.c **** break; + 102:Core/Src/AMS_HighLevel.c **** case AMSCHARGING: + 103:Core/Src/AMS_HighLevel.c **** break; + 104:Core/Src/AMS_HighLevel.c **** case AMSIDLEBALANCING: + 105:Core/Src/AMS_HighLevel.c **** AMS_Idle_Loop(); + 106:Core/Src/AMS_HighLevel.c **** break; + 107:Core/Src/AMS_HighLevel.c **** case AMSDISCHARGING: + 108:Core/Src/AMS_HighLevel.c **** break; + 109:Core/Src/AMS_HighLevel.c **** case AMSWARNING: + 110:Core/Src/AMS_HighLevel.c **** AMS_Warning_Loop(); + 111:Core/Src/AMS_HighLevel.c **** break; + 112:Core/Src/AMS_HighLevel.c **** case AMSERROR: + 113:Core/Src/AMS_HighLevel.c **** break; + 114:Core/Src/AMS_HighLevel.c **** } + 115:Core/Src/AMS_HighLevel.c **** } + 116:Core/Src/AMS_HighLevel.c **** + 117:Core/Src/AMS_HighLevel.c **** uint8_t AMS_Idle_Loop() + 118:Core/Src/AMS_HighLevel.c **** { + 119:Core/Src/AMS_HighLevel.c **** amsWakeUp(); + 120:Core/Src/AMS_HighLevel.c **** amsConfigOverVoltage(amsov); + 121:Core/Src/AMS_HighLevel.c **** amsConfigUnderVoltage(amsuv); + 122:Core/Src/AMS_HighLevel.c **** amsConfigAuxMeasurement(0xFFFF); + ARM GAS /tmp/ccaolay4.s page 5 + + + 123:Core/Src/AMS_HighLevel.c **** amsClearAux(); + 124:Core/Src/AMS_HighLevel.c **** amsCellMeasurement(&module); + 125:Core/Src/AMS_HighLevel.c **** amsInternalStatusMeasurement(&module); + 126:Core/Src/AMS_HighLevel.c **** amsAuxMeasurement(&module); + 127:Core/Src/AMS_HighLevel.c **** amsCheckUnderOverVoltage(&module); + 128:Core/Src/AMS_HighLevel.c **** integrateCurrent(); + 129:Core/Src/AMS_HighLevel.c **** + 130:Core/Src/AMS_HighLevel.c **** static uint32_t channelstobalance = 1; + 131:Core/Src/AMS_HighLevel.c **** + 132:Core/Src/AMS_HighLevel.c **** channelstobalance = 0x1FFFF; + 133:Core/Src/AMS_HighLevel.c **** /* if(channelstobalance & 0x20000){ + 134:Core/Src/AMS_HighLevel.c **** channelstobalance = 1; + 135:Core/Src/AMS_HighLevel.c **** }*/ + 136:Core/Src/AMS_HighLevel.c **** + 137:Core/Src/AMS_HighLevel.c **** amsConfigBalancing(channelstobalance); + 138:Core/Src/AMS_HighLevel.c **** amsStartBalancing(100); + 139:Core/Src/AMS_HighLevel.c **** + 140:Core/Src/AMS_HighLevel.c **** if((module.overVoltage | module.underVoltage)) + 141:Core/Src/AMS_HighLevel.c **** { + 142:Core/Src/AMS_HighLevel.c **** //amsSendWarning(); + 143:Core/Src/AMS_HighLevel.c **** // currentAMSState = AMSWARNING; + 144:Core/Src/AMS_HighLevel.c **** } + 145:Core/Src/AMS_HighLevel.c **** + 146:Core/Src/AMS_HighLevel.c **** // AMS_Balancing_Loop(); + 147:Core/Src/AMS_HighLevel.c **** + 148:Core/Src/AMS_HighLevel.c **** /* if(BalancingActive) + 149:Core/Src/AMS_HighLevel.c **** { + 150:Core/Src/AMS_HighLevel.c **** amsStartBalancing(100); + 151:Core/Src/AMS_HighLevel.c **** } + 152:Core/Src/AMS_HighLevel.c **** else + 153:Core/Src/AMS_HighLevel.c **** { + 154:Core/Src/AMS_HighLevel.c **** amsStopBalancing(); + 155:Core/Src/AMS_HighLevel.c **** }*/ + 156:Core/Src/AMS_HighLevel.c **** //amsConfigBalancing(balancedCells); + 157:Core/Src/AMS_HighLevel.c **** //volatile amscheck = amscheckOpenCellWire(&module); + 158:Core/Src/AMS_HighLevel.c **** return 0; + 159:Core/Src/AMS_HighLevel.c **** } + 160:Core/Src/AMS_HighLevel.c **** + 161:Core/Src/AMS_HighLevel.c **** uint8_t AMS_Warning_Loop() + 162:Core/Src/AMS_HighLevel.c **** { + 107 .loc 1 162 1 view -0 + 108 .cfi_startproc + 109 @ args = 0, pretend = 0, frame = 0 + 110 @ frame_needed = 0, uses_anonymous_args = 0 + 111 0000 10B5 push {r4, lr} + 112 .cfi_def_cfa_offset 8 + 113 .cfi_offset 4, -8 + 114 .cfi_offset 14, -4 + 163:Core/Src/AMS_HighLevel.c **** + 164:Core/Src/AMS_HighLevel.c **** amsWakeUp(); + 115 .loc 1 164 4 view .LVU17 + 116 0002 FFF7FEFF bl amsWakeUp + 117 .LVL6: + 165:Core/Src/AMS_HighLevel.c **** amsConfigOverVoltage(amsov); + 118 .loc 1 165 4 view .LVU18 + 119 0006 144B ldr r3, .L12 + 120 0008 1888 ldrh r0, [r3] + ARM GAS /tmp/ccaolay4.s page 6 + + + 121 000a FFF7FEFF bl amsConfigOverVoltage + 122 .LVL7: + 166:Core/Src/AMS_HighLevel.c **** amsConfigUnderVoltage(amsuv); + 123 .loc 1 166 4 view .LVU19 + 124 000e 134B ldr r3, .L12+4 + 125 0010 1888 ldrh r0, [r3] + 126 0012 FFF7FEFF bl amsConfigUnderVoltage + 127 .LVL8: + 167:Core/Src/AMS_HighLevel.c **** amsConfigAuxMeasurement(0xFFFF); + 128 .loc 1 167 4 view .LVU20 + 129 0016 4FF6FF70 movw r0, #65535 + 130 001a FFF7FEFF bl amsConfigAuxMeasurement + 131 .LVL9: + 168:Core/Src/AMS_HighLevel.c **** amsClearAux(); + 132 .loc 1 168 4 view .LVU21 + 133 001e FFF7FEFF bl amsClearAux + 134 .LVL10: + 169:Core/Src/AMS_HighLevel.c **** amsCellMeasurement(&module); + 135 .loc 1 169 4 view .LVU22 + 136 0022 0F4C ldr r4, .L12+8 + 137 0024 2046 mov r0, r4 + 138 0026 FFF7FEFF bl amsCellMeasurement + 139 .LVL11: + 170:Core/Src/AMS_HighLevel.c **** amsInternalStatusMeasurement(&module); + 140 .loc 1 170 4 view .LVU23 + 141 002a 2046 mov r0, r4 + 142 002c FFF7FEFF bl amsInternalStatusMeasurement + 143 .LVL12: + 171:Core/Src/AMS_HighLevel.c **** amsAuxMeasurement(&module); + 144 .loc 1 171 4 view .LVU24 + 145 0030 2046 mov r0, r4 + 146 0032 FFF7FEFF bl amsAuxMeasurement + 147 .LVL13: + 172:Core/Src/AMS_HighLevel.c **** amsCheckUnderOverVoltage(&module); + 148 .loc 1 172 4 view .LVU25 + 149 0036 2046 mov r0, r4 + 150 0038 FFF7FEFF bl amsCheckUnderOverVoltage + 151 .LVL14: + 173:Core/Src/AMS_HighLevel.c **** + 174:Core/Src/AMS_HighLevel.c **** if(!(module.overVoltage | module.underVoltage)) + 152 .loc 1 174 4 view .LVU26 + 153 .loc 1 174 15 is_stmt 0 view .LVU27 + 154 003c A36D ldr r3, [r4, #88] + 155 .loc 1 174 36 view .LVU28 + 156 003e E26D ldr r2, [r4, #92] + 157 .loc 1 174 6 view .LVU29 + 158 0040 1343 orrs r3, r3, r2 + 159 0042 03D0 beq .L11 + 160 .L9: + 175:Core/Src/AMS_HighLevel.c **** { + 176:Core/Src/AMS_HighLevel.c **** currentAMSState = AMSIDLE; + 177:Core/Src/AMS_HighLevel.c **** amsClearWarning(); + 178:Core/Src/AMS_HighLevel.c **** } + 179:Core/Src/AMS_HighLevel.c **** amsStopBalancing(); + 161 .loc 1 179 4 is_stmt 1 view .LVU30 + 162 0044 FFF7FEFF bl amsStopBalancing + 163 .LVL15: + ARM GAS /tmp/ccaolay4.s page 7 + + + 180:Core/Src/AMS_HighLevel.c **** + 181:Core/Src/AMS_HighLevel.c **** return 0; + 164 .loc 1 181 2 view .LVU31 + 182:Core/Src/AMS_HighLevel.c **** } + 165 .loc 1 182 1 is_stmt 0 view .LVU32 + 166 0048 0020 movs r0, #0 + 167 004a 10BD pop {r4, pc} + 168 .L11: + 176:Core/Src/AMS_HighLevel.c **** amsClearWarning(); + 169 .loc 1 176 5 is_stmt 1 view .LVU33 + 176:Core/Src/AMS_HighLevel.c **** amsClearWarning(); + 170 .loc 1 176 21 is_stmt 0 view .LVU34 + 171 004c 054B ldr r3, .L12+12 + 172 004e 0122 movs r2, #1 + 173 0050 1A70 strb r2, [r3] + 177:Core/Src/AMS_HighLevel.c **** } + 174 .loc 1 177 5 is_stmt 1 view .LVU35 + 175 0052 FFF7FEFF bl amsClearWarning + 176 .LVL16: + 177 0056 F5E7 b .L9 + 178 .L13: + 179 .align 2 + 180 .L12: + 181 0058 00000000 .word amsov + 182 005c 00000000 .word amsuv + 183 0060 00000000 .word module + 184 0064 00000000 .word currentAMSState + 185 .cfi_endproc + 186 .LFE133: + 188 .section .text.AMS_Error_Loop,"ax",%progbits + 189 .align 1 + 190 .global AMS_Error_Loop + 191 .syntax unified + 192 .thumb + 193 .thumb_func + 195 AMS_Error_Loop: + 196 .LFB134: + 183:Core/Src/AMS_HighLevel.c **** + 184:Core/Src/AMS_HighLevel.c **** uint8_t AMS_Error_Loop() + 185:Core/Src/AMS_HighLevel.c **** { + 197 .loc 1 185 1 view -0 + 198 .cfi_startproc + 199 @ args = 0, pretend = 0, frame = 0 + 200 @ frame_needed = 0, uses_anonymous_args = 0 + 201 @ link register save eliminated. + 186:Core/Src/AMS_HighLevel.c **** return 0; + 202 .loc 1 186 2 view .LVU37 + 187:Core/Src/AMS_HighLevel.c **** } + 203 .loc 1 187 1 is_stmt 0 view .LVU38 + 204 0000 0020 movs r0, #0 + 205 0002 7047 bx lr + 206 .cfi_endproc + 207 .LFE134: + 209 .section .text.AMS_Charging_Loop,"ax",%progbits + 210 .align 1 + 211 .global AMS_Charging_Loop + 212 .syntax unified + ARM GAS /tmp/ccaolay4.s page 8 + + + 213 .thumb + 214 .thumb_func + 216 AMS_Charging_Loop: + 217 .LFB135: + 188:Core/Src/AMS_HighLevel.c **** + 189:Core/Src/AMS_HighLevel.c **** uint8_t AMS_Charging_Loop() + 190:Core/Src/AMS_HighLevel.c **** { + 218 .loc 1 190 1 is_stmt 1 view -0 + 219 .cfi_startproc + 220 @ args = 0, pretend = 0, frame = 0 + 221 @ frame_needed = 0, uses_anonymous_args = 0 + 222 @ link register save eliminated. + 191:Core/Src/AMS_HighLevel.c **** return 0; + 223 .loc 1 191 2 view .LVU40 + 192:Core/Src/AMS_HighLevel.c **** } + 224 .loc 1 192 1 is_stmt 0 view .LVU41 + 225 0000 0020 movs r0, #0 + 226 0002 7047 bx lr + 227 .cfi_endproc + 228 .LFE135: + 230 .section .text.AMS_Discharging_Loop,"ax",%progbits + 231 .align 1 + 232 .global AMS_Discharging_Loop + 233 .syntax unified + 234 .thumb + 235 .thumb_func + 237 AMS_Discharging_Loop: + 238 .LFB136: + 193:Core/Src/AMS_HighLevel.c **** + 194:Core/Src/AMS_HighLevel.c **** uint8_t AMS_Discharging_Loop() + 195:Core/Src/AMS_HighLevel.c **** { + 239 .loc 1 195 1 is_stmt 1 view -0 + 240 .cfi_startproc + 241 @ args = 0, pretend = 0, frame = 0 + 242 @ frame_needed = 0, uses_anonymous_args = 0 + 243 @ link register save eliminated. + 196:Core/Src/AMS_HighLevel.c **** return 0; + 244 .loc 1 196 2 view .LVU43 + 197:Core/Src/AMS_HighLevel.c **** } + 245 .loc 1 197 1 is_stmt 0 view .LVU44 + 246 0000 0020 movs r0, #0 + 247 0002 7047 bx lr + 248 .cfi_endproc + 249 .LFE136: + 251 .section .text.AMS_Balancing_Loop,"ax",%progbits + 252 .align 1 + 253 .global AMS_Balancing_Loop + 254 .syntax unified + 255 .thumb + 256 .thumb_func + 258 AMS_Balancing_Loop: + 259 .LFB137: + 198:Core/Src/AMS_HighLevel.c **** + 199:Core/Src/AMS_HighLevel.c **** uint8_t AMS_Balancing_Loop() + 200:Core/Src/AMS_HighLevel.c **** { + 260 .loc 1 200 1 is_stmt 1 view -0 + 261 .cfi_startproc + ARM GAS /tmp/ccaolay4.s page 9 + + + 262 @ args = 0, pretend = 0, frame = 0 + 263 @ frame_needed = 0, uses_anonymous_args = 0 + 264 0000 70B5 push {r4, r5, r6, lr} + 265 .cfi_def_cfa_offset 16 + 266 .cfi_offset 4, -16 + 267 .cfi_offset 5, -12 + 268 .cfi_offset 6, -8 + 269 .cfi_offset 14, -4 + 201:Core/Src/AMS_HighLevel.c **** uint8_t balancingdone = 1; + 270 .loc 1 201 2 view .LVU46 + 271 .LVL17: + 202:Core/Src/AMS_HighLevel.c **** if((eepromconfigured == 1) && (internalbalancingalgo == 1) && (module.internalDieTemp<28000/*Therm + 272 .loc 1 202 2 view .LVU47 + 273 .loc 1 202 23 is_stmt 0 view .LVU48 + 274 0002 3E4B ldr r3, .L42 + 275 0004 1B78 ldrb r3, [r3] @ zero_extendqisi2 + 276 .loc 1 202 4 view .LVU49 + 277 0006 012B cmp r3, #1 + 278 0008 03D1 bne .L18 + 279 .loc 1 202 55 discriminator 1 view .LVU50 + 280 000a 3D4B ldr r3, .L42+4 + 281 000c 1C78 ldrb r4, [r3] @ zero_extendqisi2 + 282 .loc 1 202 29 discriminator 1 view .LVU51 + 283 000e 012C cmp r4, #1 + 284 0010 04D0 beq .L37 + 285 .L18: + 203:Core/Src/AMS_HighLevel.c **** { + 204:Core/Src/AMS_HighLevel.c **** uint16_t highestcellvoltage = module.cellVoltages[0]; + 205:Core/Src/AMS_HighLevel.c **** uint16_t lowestcellvoltage = module.cellVoltages[0]; + 206:Core/Src/AMS_HighLevel.c **** uint8_t highestcell = 0; + 207:Core/Src/AMS_HighLevel.c **** uint8_t lowestcell = 0; + 208:Core/Src/AMS_HighLevel.c **** + 209:Core/Src/AMS_HighLevel.c **** for(uint8_t n = 0; n < numberofCells; n++) + 210:Core/Src/AMS_HighLevel.c **** { + 211:Core/Src/AMS_HighLevel.c **** if(module.cellVoltages[n] > highestcellvoltage) + 212:Core/Src/AMS_HighLevel.c **** { + 213:Core/Src/AMS_HighLevel.c **** highestcellvoltage = module.cellVoltages[n]; + 214:Core/Src/AMS_HighLevel.c **** highestcell = n; + 215:Core/Src/AMS_HighLevel.c **** } + 216:Core/Src/AMS_HighLevel.c **** if(module.cellVoltages[n] < lowestcellvoltage) + 217:Core/Src/AMS_HighLevel.c **** { + 218:Core/Src/AMS_HighLevel.c **** lowestcellvoltage = module.cellVoltages[n]; + 219:Core/Src/AMS_HighLevel.c **** lowestcell = n; + 220:Core/Src/AMS_HighLevel.c **** } + 221:Core/Src/AMS_HighLevel.c **** } + 222:Core/Src/AMS_HighLevel.c **** + 223:Core/Src/AMS_HighLevel.c **** if(currentAMSState == AMSCHARGING) //Balancing is only Active if the BMS is in Charging Mode + 224:Core/Src/AMS_HighLevel.c **** { + 225:Core/Src/AMS_HighLevel.c **** + 226:Core/Src/AMS_HighLevel.c **** uint32_t channelstobalance = 0; + 227:Core/Src/AMS_HighLevel.c **** + 228:Core/Src/AMS_HighLevel.c **** if(highestcellvoltage > startbalancingthreshold) + 229:Core/Src/AMS_HighLevel.c **** { + 230:Core/Src/AMS_HighLevel.c **** for(uint8_t n = 0; n < numberofCells; n++) + 231:Core/Src/AMS_HighLevel.c **** { + 232:Core/Src/AMS_HighLevel.c **** if(module.cellVoltages[n] > stopbalancingthreshold) + 233:Core/Src/AMS_HighLevel.c **** { + ARM GAS /tmp/ccaolay4.s page 10 + + + 234:Core/Src/AMS_HighLevel.c **** uint16_t dv = module.cellVoltages[n]-lowestcellvoltage; + 235:Core/Src/AMS_HighLevel.c **** if(dv > (balancingvoltagedelta*1000)) + 236:Core/Src/AMS_HighLevel.c **** { + 237:Core/Src/AMS_HighLevel.c **** balancingdone = 0; + 238:Core/Src/AMS_HighLevel.c **** channelstobalance |= 1< balancingvoltagedelta) + 264:Core/Src/AMS_HighLevel.c **** { + 265:Core/Src/AMS_HighLevel.c **** balancingdone = 0; + 266:Core/Src/AMS_HighLevel.c **** channelstobalance |= 1< (balancingvoltagedelta*1000)) + 449 .loc 1 234 7 is_stmt 1 view .LVU110 + 234:Core/Src/AMS_HighLevel.c **** if(dv > (balancingvoltagedelta*1000)) + 450 .loc 1 234 16 is_stmt 0 view .LVU111 + 451 009a ACEB010C sub ip, ip, r1 + 452 009e 1FFA8CFC uxth ip, ip + 453 .LVL38: + 235:Core/Src/AMS_HighLevel.c **** { + 454 .loc 1 235 7 is_stmt 1 view .LVU112 + 235:Core/Src/AMS_HighLevel.c **** { + 455 .loc 1 235 37 is_stmt 0 view .LVU113 + 456 00a2 1D4D ldr r5, .L42+28 + 457 00a4 2D88 ldrh r5, [r5] + 458 00a6 4FF47A7E mov lr, #1000 + 459 00aa 0EFB05F5 mul r5, lr, r5 + 235:Core/Src/AMS_HighLevel.c **** { + 460 .loc 1 235 9 view .LVU114 + 461 00ae AC45 cmp ip, r5 + 462 00b0 E7DD ble .L26 + 237:Core/Src/AMS_HighLevel.c **** channelstobalance |= 1< balancingvoltagedelta) + 512 .loc 1 262 7 view .LVU131 + 262:Core/Src/AMS_HighLevel.c **** if(dv > balancingvoltagedelta) + 513 .loc 1 262 40 is_stmt 0 view .LVU132 + 514 00d0 0C4D ldr r5, .L42+8 + 515 00d2 35F813C0 ldrh ip, [r5, r3, lsl #1] + 262:Core/Src/AMS_HighLevel.c **** if(dv > balancingvoltagedelta) + 516 .loc 1 262 16 view .LVU133 + 517 00d6 ACEB010C sub ip, ip, r1 + 518 00da 1FFA8CFC uxth ip, ip + 519 .LVL48: + 263:Core/Src/AMS_HighLevel.c **** { + 520 .loc 1 263 7 is_stmt 1 view .LVU134 + 263:Core/Src/AMS_HighLevel.c **** { + 521 .loc 1 263 13 is_stmt 0 view .LVU135 + 522 00de 0E4D ldr r5, .L42+28 + 523 00e0 2D88 ldrh r5, [r5] + 263:Core/Src/AMS_HighLevel.c **** { + 524 .loc 1 263 9 view .LVU136 + 525 00e2 6545 cmp r5, ip + 526 00e4 F0D2 bcs .L30 + 265:Core/Src/AMS_HighLevel.c **** channelstobalance |= 1<0>ed1+wbE({ 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 + 17:Core/Src/Testbench.c **** #include "ADBMS_Abstraction.h" + 18:Core/Src/Testbench.c **** #include "main.h" + 19:Core/Src/Testbench.c **** + 20:Core/Src/Testbench.c **** + 21:Core/Src/Testbench.c **** void canTestSendTemperatures(uint16_t* data){ + 30 .loc 1 21 45 view -0 + 31 .cfi_startproc + 32 @ args = 0, pretend = 0, frame = 40 + 33 @ frame_needed = 0, uses_anonymous_args = 0 + 34 .loc 1 21 45 is_stmt 0 view .LVU1 + 35 0000 00B5 push {lr} + 36 .cfi_def_cfa_offset 4 + 37 .cfi_offset 14, -4 + ARM GAS /tmp/ccSPu85t.s page 2 + + + 38 0002 8BB0 sub sp, sp, #44 + 39 .cfi_def_cfa_offset 48 + 22:Core/Src/Testbench.c **** static CAN_TxHeaderTypeDef header; + 40 .loc 1 22 2 is_stmt 1 view .LVU2 + 23:Core/Src/Testbench.c **** + 24:Core/Src/Testbench.c **** header.IDE = CAN_ID_STD; + 41 .loc 1 24 2 view .LVU3 + 42 .loc 1 24 13 is_stmt 0 view .LVU4 + 43 0004 3B4A ldr r2, .L17 + 44 0006 0023 movs r3, #0 + 45 0008 9360 str r3, [r2, #8] + 25:Core/Src/Testbench.c **** header.DLC = 8; + 46 .loc 1 25 2 is_stmt 1 view .LVU5 + 47 .loc 1 25 13 is_stmt 0 view .LVU6 + 48 000a 0821 movs r1, #8 + 49 000c 1161 str r1, [r2, #16] + 26:Core/Src/Testbench.c **** header.RTR = CAN_RTR_DATA; + 50 .loc 1 26 2 is_stmt 1 view .LVU7 + 51 .loc 1 26 13 is_stmt 0 view .LVU8 + 52 000e D360 str r3, [r2, #12] + 27:Core/Src/Testbench.c **** header.TransmitGlobalTime = DISABLE; + 53 .loc 1 27 2 is_stmt 1 view .LVU9 + 54 .loc 1 27 28 is_stmt 0 view .LVU10 + 55 0010 1375 strb r3, [r2, #20] + 28:Core/Src/Testbench.c **** uint8_t buffer[24]; + 56 .loc 1 28 2 is_stmt 1 view .LVU11 + 29:Core/Src/Testbench.c **** uint8_t tmp[8]; + 57 .loc 1 29 2 view .LVU12 + 30:Core/Src/Testbench.c **** + 31:Core/Src/Testbench.c **** for(int i = 0; i < 12; i++){ + 58 .loc 1 31 2 view .LVU13 + 59 .LBB2: + 60 .loc 1 31 6 view .LVU14 + 61 .LVL1: + 62 .loc 1 31 2 is_stmt 0 view .LVU15 + 63 0012 0EE0 b .L2 + 64 .LVL2: + 65 .L3: + 32:Core/Src/Testbench.c **** buffer[((i*2)+1)] = data[i] >> 8; + 66 .loc 1 32 3 is_stmt 1 discriminator 3 view .LVU16 + 67 .loc 1 32 27 is_stmt 0 discriminator 3 view .LVU17 + 68 0014 30F813C0 ldrh ip, [r0, r3, lsl #1] + 69 .loc 1 32 13 discriminator 3 view .LVU18 + 70 0018 5A00 lsls r2, r3, #1 + 71 .loc 1 32 21 discriminator 3 view .LVU19 + 72 001a 02F12901 add r1, r2, #41 + 73 001e 6944 add r1, sp, r1 + 74 0020 4FEA1C2E lsr lr, ip, #8 + 75 0024 01F818EC strb lr, [r1, #-24] + 33:Core/Src/Testbench.c **** buffer[(i*2)] = data[i]; + 76 .loc 1 33 3 is_stmt 1 discriminator 3 view .LVU20 + 77 .loc 1 33 17 is_stmt 0 discriminator 3 view .LVU21 + 78 0028 2832 adds r2, r2, #40 + 79 002a 6A44 add r2, sp, r2 + 80 002c 02F818CC strb ip, [r2, #-24] + 31:Core/Src/Testbench.c **** buffer[((i*2)+1)] = data[i] >> 8; + 81 .loc 1 31 26 is_stmt 1 discriminator 3 view .LVU22 + ARM GAS /tmp/ccSPu85t.s page 3 + + + 82 0030 0133 adds r3, r3, #1 + 83 .LVL3: + 84 .L2: + 31:Core/Src/Testbench.c **** buffer[((i*2)+1)] = data[i] >> 8; + 85 .loc 1 31 19 discriminator 1 view .LVU23 + 86 0032 0B2B cmp r3, #11 + 87 0034 EEDD ble .L3 + 88 .LBE2: + 89 .LBB3: + 34:Core/Src/Testbench.c **** } + 35:Core/Src/Testbench.c **** + 36:Core/Src/Testbench.c **** for(int i = 0; i < 8; i++){ + 90 .loc 1 36 10 is_stmt 0 view .LVU24 + 91 0036 0023 movs r3, #0 + 92 .LVL4: + 93 .loc 1 36 10 view .LVU25 + 94 0038 07E0 b .L4 + 95 .LVL5: + 96 .L5: + 37:Core/Src/Testbench.c **** tmp[i] = buffer[i]; + 97 .loc 1 37 3 is_stmt 1 discriminator 3 view .LVU26 + 98 .loc 1 37 18 is_stmt 0 discriminator 3 view .LVU27 + 99 003a 03F12802 add r2, r3, #40 + 100 003e 6A44 add r2, sp, r2 + 101 0040 12F8181C ldrb r1, [r2, #-24] @ zero_extendqisi2 + 102 .loc 1 37 10 discriminator 3 view .LVU28 + 103 0044 02F8201C strb r1, [r2, #-32] + 36:Core/Src/Testbench.c **** tmp[i] = buffer[i]; + 104 .loc 1 36 25 is_stmt 1 discriminator 3 view .LVU29 + 105 0048 0133 adds r3, r3, #1 + 106 .LVL6: + 107 .L4: + 36:Core/Src/Testbench.c **** tmp[i] = buffer[i]; + 108 .loc 1 36 19 discriminator 1 view .LVU30 + 109 004a 072B cmp r3, #7 + 110 004c F5DD ble .L5 + 111 .LBE3: + 38:Core/Src/Testbench.c **** } + 39:Core/Src/Testbench.c **** if (ams_can_wait_for_free_mailboxes(ams_can_handle, 1, CAN_HEARTBEAT_TX_TIMEOUT) == HAL_OK) { + 112 .loc 1 39 2 view .LVU31 + 113 .loc 1 39 6 is_stmt 0 view .LVU32 + 114 004e 0A22 movs r2, #10 + 115 0050 0121 movs r1, #1 + 116 0052 294B ldr r3, .L17+4 + 117 .LVL7: + 118 .loc 1 39 6 view .LVU33 + 119 0054 1868 ldr r0, [r3] + 120 .LVL8: + 121 .loc 1 39 6 view .LVU34 + 122 0056 FFF7FEFF bl ams_can_wait_for_free_mailboxes + 123 .LVL9: + 124 .loc 1 39 5 view .LVU35 + 125 005a 10B1 cbz r0, .L14 + 126 .L6: + 127 .LBB4: + 36:Core/Src/Testbench.c **** tmp[i] = buffer[i]; + 128 .loc 1 36 10 discriminator 1 view .LVU36 + ARM GAS /tmp/ccSPu85t.s page 4 + + + 129 005c 0823 movs r3, #8 + 130 005e 0022 movs r2, #0 + 131 0060 13E0 b .L7 + 132 .L14: + 133 .LBE4: + 134 .LBB5: + 40:Core/Src/Testbench.c **** uint32_t mailbox; + 135 .loc 1 40 3 is_stmt 1 view .LVU37 + 41:Core/Src/Testbench.c **** HAL_CAN_AddTxMessage(ams_can_handle, &header, tmp, &mailbox); + 136 .loc 1 41 3 view .LVU38 + 137 0062 01AB add r3, sp, #4 + 138 0064 02AA add r2, sp, #8 + 139 0066 2349 ldr r1, .L17 + 140 0068 2348 ldr r0, .L17+4 + 141 006a 0068 ldr r0, [r0] + 142 006c FFF7FEFF bl HAL_CAN_AddTxMessage + 143 .LVL10: + 144 0070 F4E7 b .L6 + 145 .LVL11: + 146 .L8: + 147 .loc 1 41 3 is_stmt 0 view .LVU39 + 148 .LBE5: + 149 .LBB6: + 42:Core/Src/Testbench.c **** } + 43:Core/Src/Testbench.c **** + 44:Core/Src/Testbench.c **** int m = 0; + 45:Core/Src/Testbench.c **** for(int i = 8; i < 16; i++){ + 46:Core/Src/Testbench.c **** tmp[m] = buffer[i]; + 150 .loc 1 46 3 is_stmt 1 discriminator 3 view .LVU40 + 151 .loc 1 46 18 is_stmt 0 discriminator 3 view .LVU41 + 152 0072 03F12801 add r1, r3, #40 + 153 0076 6944 add r1, sp, r1 + 154 0078 11F8180C ldrb r0, [r1, #-24] @ zero_extendqisi2 + 155 .loc 1 46 10 discriminator 3 view .LVU42 + 156 007c 02F12801 add r1, r2, #40 + 157 0080 6944 add r1, sp, r1 + 158 0082 01F8200C strb r0, [r1, #-32] + 47:Core/Src/Testbench.c **** m++; + 159 .loc 1 47 3 is_stmt 1 discriminator 3 view .LVU43 + 160 .loc 1 47 4 is_stmt 0 discriminator 3 view .LVU44 + 161 0086 0132 adds r2, r2, #1 + 162 .LVL12: + 45:Core/Src/Testbench.c **** tmp[m] = buffer[i]; + 163 .loc 1 45 26 is_stmt 1 discriminator 3 view .LVU45 + 164 0088 0133 adds r3, r3, #1 + 165 .LVL13: + 166 .L7: + 45:Core/Src/Testbench.c **** tmp[m] = buffer[i]; + 167 .loc 1 45 19 discriminator 1 view .LVU46 + 168 008a 0F2B cmp r3, #15 + 169 008c F1DD ble .L8 + 170 .LBE6: + 48:Core/Src/Testbench.c **** } + 49:Core/Src/Testbench.c **** + 50:Core/Src/Testbench.c **** if (ams_can_wait_for_free_mailboxes(ams_can_handle, 1, CAN_HEARTBEAT_TX_TIMEOUT) == HAL_OK) { + 171 .loc 1 50 2 view .LVU47 + 172 .loc 1 50 6 is_stmt 0 view .LVU48 + ARM GAS /tmp/ccSPu85t.s page 5 + + + 173 008e 0A22 movs r2, #10 + 174 .LVL14: + 175 .loc 1 50 6 view .LVU49 + 176 0090 0121 movs r1, #1 + 177 0092 194B ldr r3, .L17+4 + 178 .LVL15: + 179 .loc 1 50 6 view .LVU50 + 180 0094 1868 ldr r0, [r3] + 181 0096 FFF7FEFF bl ams_can_wait_for_free_mailboxes + 182 .LVL16: + 183 .loc 1 50 5 view .LVU51 + 184 009a 10B1 cbz r0, .L15 + 185 .L9: + 186 .LBB7: + 36:Core/Src/Testbench.c **** tmp[i] = buffer[i]; + 187 .loc 1 36 10 discriminator 1 view .LVU52 + 188 009c 1023 movs r3, #16 + 189 009e 0022 movs r2, #0 + 190 00a0 13E0 b .L10 + 191 .L15: + 192 .LBE7: + 193 .LBB8: + 51:Core/Src/Testbench.c **** uint32_t mailbox; + 194 .loc 1 51 3 is_stmt 1 view .LVU53 + 52:Core/Src/Testbench.c **** HAL_CAN_AddTxMessage(ams_can_handle, &header, tmp, &mailbox); + 195 .loc 1 52 3 view .LVU54 + 196 00a2 01AB add r3, sp, #4 + 197 00a4 02AA add r2, sp, #8 + 198 00a6 1349 ldr r1, .L17 + 199 00a8 1348 ldr r0, .L17+4 + 200 00aa 0068 ldr r0, [r0] + 201 00ac FFF7FEFF bl HAL_CAN_AddTxMessage + 202 .LVL17: + 203 00b0 F4E7 b .L9 + 204 .LVL18: + 205 .L11: + 206 .loc 1 52 3 is_stmt 0 view .LVU55 + 207 .LBE8: + 208 .LBB9: + 53:Core/Src/Testbench.c **** } + 54:Core/Src/Testbench.c **** m = 0; + 55:Core/Src/Testbench.c **** for(int i = 16; i < 24; i++){ + 56:Core/Src/Testbench.c **** tmp[m] = buffer[i]; + 209 .loc 1 56 3 is_stmt 1 discriminator 3 view .LVU56 + 210 .loc 1 56 18 is_stmt 0 discriminator 3 view .LVU57 + 211 00b2 03F12801 add r1, r3, #40 + 212 00b6 6944 add r1, sp, r1 + 213 00b8 11F8180C ldrb r0, [r1, #-24] @ zero_extendqisi2 + 214 .loc 1 56 10 discriminator 3 view .LVU58 + 215 00bc 02F12801 add r1, r2, #40 + 216 00c0 6944 add r1, sp, r1 + 217 00c2 01F8200C strb r0, [r1, #-32] + 57:Core/Src/Testbench.c **** m++; + 218 .loc 1 57 3 is_stmt 1 discriminator 3 view .LVU59 + 219 .loc 1 57 4 is_stmt 0 discriminator 3 view .LVU60 + 220 00c6 0132 adds r2, r2, #1 + 221 .LVL19: + ARM GAS /tmp/ccSPu85t.s page 6 + + + 55:Core/Src/Testbench.c **** tmp[m] = buffer[i]; + 222 .loc 1 55 27 is_stmt 1 discriminator 3 view .LVU61 + 223 00c8 0133 adds r3, r3, #1 + 224 .LVL20: + 225 .L10: + 55:Core/Src/Testbench.c **** tmp[m] = buffer[i]; + 226 .loc 1 55 20 discriminator 1 view .LVU62 + 227 00ca 172B cmp r3, #23 + 228 00cc F1DD ble .L11 + 229 .LBE9: + 58:Core/Src/Testbench.c **** } + 59:Core/Src/Testbench.c **** + 60:Core/Src/Testbench.c **** if (ams_can_wait_for_free_mailboxes(ams_can_handle, 1, CAN_HEARTBEAT_TX_TIMEOUT) == HAL_OK) { + 230 .loc 1 60 2 view .LVU63 + 231 .loc 1 60 6 is_stmt 0 view .LVU64 + 232 00ce 0A22 movs r2, #10 + 233 .LVL21: + 234 .loc 1 60 6 view .LVU65 + 235 00d0 0121 movs r1, #1 + 236 00d2 094B ldr r3, .L17+4 + 237 .LVL22: + 238 .loc 1 60 6 view .LVU66 + 239 00d4 1868 ldr r0, [r3] + 240 00d6 FFF7FEFF bl ams_can_wait_for_free_mailboxes + 241 .LVL23: + 242 .loc 1 60 5 view .LVU67 + 243 00da 10B1 cbz r0, .L16 + 244 .L1: + 61:Core/Src/Testbench.c **** uint32_t mailbox; + 62:Core/Src/Testbench.c **** HAL_CAN_AddTxMessage(ams_can_handle, &header, tmp, &mailbox); + 63:Core/Src/Testbench.c **** } + 64:Core/Src/Testbench.c **** } + 245 .loc 1 64 1 view .LVU68 + 246 00dc 0BB0 add sp, sp, #44 + 247 .cfi_remember_state + 248 .cfi_def_cfa_offset 4 + 249 @ sp needed + 250 00de 5DF804FB ldr pc, [sp], #4 + 251 .L16: + 252 .cfi_restore_state + 253 .LBB10: + 61:Core/Src/Testbench.c **** uint32_t mailbox; + 254 .loc 1 61 3 is_stmt 1 view .LVU69 + 62:Core/Src/Testbench.c **** } + 255 .loc 1 62 3 view .LVU70 + 256 00e2 01AB add r3, sp, #4 + 257 00e4 02AA add r2, sp, #8 + 258 00e6 0349 ldr r1, .L17 + 259 00e8 0348 ldr r0, .L17+4 + 260 00ea 0068 ldr r0, [r0] + 261 00ec FFF7FEFF bl HAL_CAN_AddTxMessage + 262 .LVL24: + 263 .LBE10: + 264 .loc 1 64 1 is_stmt 0 view .LVU71 + 265 00f0 F4E7 b .L1 + 266 .L18: + 267 00f2 00BF .align 2 + ARM GAS /tmp/ccSPu85t.s page 7 + + + 268 .L17: + 269 00f4 00000000 .word header.1 + 270 00f8 00000000 .word ams_can_handle + 271 .cfi_endproc + 272 .LFE130: + 274 .section .text.canTestSendAnswer,"ax",%progbits + 275 .align 1 + 276 .global canTestSendAnswer + 277 .syntax unified + 278 .thumb + 279 .thumb_func + 281 canTestSendAnswer: + 282 .LVL25: + 283 .LFB131: + 65:Core/Src/Testbench.c **** + 66:Core/Src/Testbench.c **** void canTestSendAnswer(uint8_t* data){ + 284 .loc 1 66 38 is_stmt 1 view -0 + 285 .cfi_startproc + 286 @ args = 0, pretend = 0, frame = 8 + 287 @ frame_needed = 0, uses_anonymous_args = 0 + 288 .loc 1 66 38 is_stmt 0 view .LVU73 + 289 0000 10B5 push {r4, lr} + 290 .cfi_def_cfa_offset 8 + 291 .cfi_offset 4, -8 + 292 .cfi_offset 14, -4 + 293 0002 82B0 sub sp, sp, #8 + 294 .cfi_def_cfa_offset 16 + 295 0004 0446 mov r4, r0 + 67:Core/Src/Testbench.c **** static CAN_TxHeaderTypeDef header; + 296 .loc 1 67 2 is_stmt 1 view .LVU74 + 68:Core/Src/Testbench.c **** + 69:Core/Src/Testbench.c **** header.IDE = CAN_ID_STD; + 297 .loc 1 69 2 view .LVU75 + 298 .loc 1 69 13 is_stmt 0 view .LVU76 + 299 0006 0C4B ldr r3, .L23 + 300 0008 0021 movs r1, #0 + 301 000a 9960 str r1, [r3, #8] + 70:Core/Src/Testbench.c **** header.DLC = 8; + 302 .loc 1 70 2 is_stmt 1 view .LVU77 + 303 .loc 1 70 13 is_stmt 0 view .LVU78 + 304 000c 0822 movs r2, #8 + 305 000e 1A61 str r2, [r3, #16] + 71:Core/Src/Testbench.c **** header.RTR = CAN_RTR_DATA; + 306 .loc 1 71 2 is_stmt 1 view .LVU79 + 307 .loc 1 71 13 is_stmt 0 view .LVU80 + 308 0010 D960 str r1, [r3, #12] + 72:Core/Src/Testbench.c **** header.TransmitGlobalTime = DISABLE; + 309 .loc 1 72 2 is_stmt 1 view .LVU81 + 310 .loc 1 72 28 is_stmt 0 view .LVU82 + 311 0012 1975 strb r1, [r3, #20] + 73:Core/Src/Testbench.c **** + 74:Core/Src/Testbench.c **** if (ams_can_wait_for_free_mailboxes(ams_can_handle, 1, + 312 .loc 1 74 4 is_stmt 1 view .LVU83 + 313 .loc 1 74 8 is_stmt 0 view .LVU84 + 314 0014 0A22 movs r2, #10 + 315 0016 0121 movs r1, #1 + 316 0018 084B ldr r3, .L23+4 + ARM GAS /tmp/ccSPu85t.s page 8 + + + 317 001a 1868 ldr r0, [r3] + 318 .LVL26: + 319 .loc 1 74 8 view .LVU85 + 320 001c FFF7FEFF bl ams_can_wait_for_free_mailboxes + 321 .LVL27: + 322 .loc 1 74 7 view .LVU86 + 323 0020 08B1 cbz r0, .L22 + 324 .L19: + 75:Core/Src/Testbench.c **** CAN_HEARTBEAT_TX_TIMEOUT) == HAL_OK) { + 76:Core/Src/Testbench.c **** uint32_t mailbox; + 77:Core/Src/Testbench.c **** HAL_CAN_AddTxMessage(ams_can_handle, &header, data, &mailbox); + 78:Core/Src/Testbench.c **** } + 79:Core/Src/Testbench.c **** } + 325 .loc 1 79 1 view .LVU87 + 326 0022 02B0 add sp, sp, #8 + 327 .cfi_remember_state + 328 .cfi_def_cfa_offset 8 + 329 @ sp needed + 330 0024 10BD pop {r4, pc} + 331 .LVL28: + 332 .L22: + 333 .cfi_restore_state + 334 .LBB11: + 76:Core/Src/Testbench.c **** HAL_CAN_AddTxMessage(ams_can_handle, &header, data, &mailbox); + 335 .loc 1 76 3 is_stmt 1 view .LVU88 + 77:Core/Src/Testbench.c **** } + 336 .loc 1 77 3 view .LVU89 + 337 0026 01AB add r3, sp, #4 + 338 0028 2246 mov r2, r4 + 339 002a 0349 ldr r1, .L23 + 340 002c 0348 ldr r0, .L23+4 + 341 002e 0068 ldr r0, [r0] + 342 0030 FFF7FEFF bl HAL_CAN_AddTxMessage + 343 .LVL29: + 344 .LBE11: + 345 .loc 1 79 1 is_stmt 0 view .LVU90 + 346 0034 F5E7 b .L19 + 347 .L24: + 348 0036 00BF .align 2 + 349 .L23: + 350 0038 00000000 .word header.0 + 351 003c 00000000 .word ams_can_handle + 352 .cfi_endproc + 353 .LFE131: + 355 .section .text.resetData,"ax",%progbits + 356 .align 1 + 357 .global resetData + 358 .syntax unified + 359 .thumb + 360 .thumb_func + 362 resetData: + 363 .LVL30: + 364 .LFB132: + 80:Core/Src/Testbench.c **** + 81:Core/Src/Testbench.c **** void resetData(uint8_t* data){ + 365 .loc 1 81 30 is_stmt 1 view -0 + 366 .cfi_startproc + ARM GAS /tmp/ccSPu85t.s page 9 + + + 367 @ args = 0, pretend = 0, frame = 0 + 368 @ frame_needed = 0, uses_anonymous_args = 0 + 369 @ link register save eliminated. + 82:Core/Src/Testbench.c **** for(int i = 0; i < 8; i++){ + 370 .loc 1 82 2 view .LVU92 + 371 .LBB12: + 372 .loc 1 82 6 view .LVU93 + 373 .loc 1 82 10 is_stmt 0 view .LVU94 + 374 0000 0023 movs r3, #0 + 375 .loc 1 82 2 view .LVU95 + 376 0002 02E0 b .L26 + 377 .LVL31: + 378 .L27: + 83:Core/Src/Testbench.c **** data[0] = 0; + 379 .loc 1 83 3 is_stmt 1 discriminator 3 view .LVU96 + 380 .loc 1 83 11 is_stmt 0 discriminator 3 view .LVU97 + 381 0004 0022 movs r2, #0 + 382 0006 0270 strb r2, [r0] + 82:Core/Src/Testbench.c **** for(int i = 0; i < 8; i++){ + 383 .loc 1 82 25 is_stmt 1 discriminator 3 view .LVU98 + 384 0008 0133 adds r3, r3, #1 + 385 .LVL32: + 386 .L26: + 82:Core/Src/Testbench.c **** for(int i = 0; i < 8; i++){ + 387 .loc 1 82 19 discriminator 1 view .LVU99 + 388 000a 072B cmp r3, #7 + 389 000c FADD ble .L27 + 390 .LBE12: + 84:Core/Src/Testbench.c **** } + 85:Core/Src/Testbench.c **** + 86:Core/Src/Testbench.c **** } + 391 .loc 1 86 1 is_stmt 0 view .LVU100 + 392 000e 7047 bx lr + 393 .cfi_endproc + 394 .LFE132: + 396 .section .text.readTemperatures,"ax",%progbits + 397 .align 1 + 398 .global readTemperatures + 399 .syntax unified + 400 .thumb + 401 .thumb_func + 403 readTemperatures: + 404 .LFB133: + 87:Core/Src/Testbench.c **** void readTemperatures(){ + 405 .loc 1 87 24 is_stmt 1 view -0 + 406 .cfi_startproc + 407 @ args = 0, pretend = 0, frame = 24 + 408 @ frame_needed = 0, uses_anonymous_args = 0 + 409 0000 10B5 push {r4, lr} + 410 .cfi_def_cfa_offset 8 + 411 .cfi_offset 4, -8 + 412 .cfi_offset 14, -4 + 413 0002 86B0 sub sp, sp, #24 + 414 .cfi_def_cfa_offset 32 + 88:Core/Src/Testbench.c **** uint8_t last_error = 0; + 415 .loc 1 88 2 view .LVU102 + 416 .LVL33: + ARM GAS /tmp/ccSPu85t.s page 10 + + + 89:Core/Src/Testbench.c **** int N_SENSORS = 12; + 417 .loc 1 89 2 view .LVU103 + 90:Core/Src/Testbench.c **** uint16_t temperatures[N_SENSORS]; + 418 .loc 1 90 2 view .LVU104 + 91:Core/Src/Testbench.c **** for (int i = 0; i < N_SENSORS; i++) { + 419 .loc 1 91 2 view .LVU105 + 420 .LBB13: + 421 .loc 1 91 7 view .LVU106 + 422 .loc 1 91 11 is_stmt 0 view .LVU107 + 423 0004 0024 movs r4, #0 + 424 .loc 1 91 2 view .LVU108 + 425 0006 00E0 b .L29 + 426 .LVL34: + 427 .L30: + 428 .loc 1 91 34 is_stmt 1 discriminator 2 view .LVU109 + 429 0008 0134 adds r4, r4, #1 + 430 .LVL35: + 431 .L29: + 432 .loc 1 91 20 discriminator 1 view .LVU110 + 433 000a 0B2C cmp r4, #11 + 434 000c 0CDC bgt .L33 + 92:Core/Src/Testbench.c **** if (sensor_read(i, &temperatures[i]) != HAL_OK) { + 435 .loc 1 92 10 view .LVU111 + 436 .LBB14: + 437 .loc 1 92 14 is_stmt 0 view .LVU112 + 438 000e 0DEB4401 add r1, sp, r4, lsl #1 + 439 0012 2046 mov r0, r4 + 440 0014 FFF7FEFF bl sensor_read + 441 .LVL36: + 442 .loc 1 92 13 view .LVU113 + 443 0018 0028 cmp r0, #0 + 444 001a F5D0 beq .L30 + 445 .LBB15: + 93:Core/Src/Testbench.c **** sensor_init(i); + 446 .loc 1 93 12 is_stmt 1 view .LVU114 + 447 001c 2046 mov r0, r4 + 448 001e FFF7FEFF bl sensor_init + 449 .LVL37: + 94:Core/Src/Testbench.c **** last_error = HAL_GetTick(); + 450 .loc 1 94 12 view .LVU115 + 451 .loc 1 94 25 is_stmt 0 view .LVU116 + 452 0022 FFF7FEFF bl HAL_GetTick + 453 .LVL38: + 454 0026 EFE7 b .L30 + 455 .L33: + 456 .LBE15: + 457 .LBE14: + 458 .LBE13: + 95:Core/Src/Testbench.c **** } + 96:Core/Src/Testbench.c **** } + 97:Core/Src/Testbench.c **** canTestSendTemperatures(temperatures); + 459 .loc 1 97 2 is_stmt 1 view .LVU117 + 460 0028 6846 mov r0, sp + 461 002a FFF7FEFF bl canTestSendTemperatures + 462 .LVL39: + 98:Core/Src/Testbench.c **** } + 463 .loc 1 98 1 is_stmt 0 view .LVU118 + ARM GAS /tmp/ccSPu85t.s page 11 + + + 464 002e 06B0 add sp, sp, #24 + 465 .cfi_def_cfa_offset 8 + 466 .LVL40: + 467 .loc 1 98 1 view .LVU119 + 468 @ sp needed + 469 0030 10BD pop {r4, pc} + 470 .loc 1 98 1 view .LVU120 + 471 .cfi_endproc + 472 .LFE133: + 474 .section .text.testLoop,"ax",%progbits + 475 .align 1 + 476 .global testLoop + 477 .syntax unified + 478 .thumb + 479 .thumb_func + 481 testLoop: + 482 .LVL41: + 483 .LFB134: + 99:Core/Src/Testbench.c **** + 100:Core/Src/Testbench.c **** void testLoop(uint8_t* data){ + 484 .loc 1 100 29 is_stmt 1 view -0 + 485 .cfi_startproc + 486 @ args = 0, pretend = 0, frame = 0 + 487 @ frame_needed = 0, uses_anonymous_args = 0 + 488 .loc 1 100 29 is_stmt 0 view .LVU122 + 489 0000 38B5 push {r3, r4, r5, lr} + 490 .cfi_def_cfa_offset 16 + 491 .cfi_offset 3, -16 + 492 .cfi_offset 4, -12 + 493 .cfi_offset 5, -8 + 494 .cfi_offset 14, -4 + 495 0002 0546 mov r5, r0 + 101:Core/Src/Testbench.c **** uint8_t action = data[0]; + 496 .loc 1 101 2 is_stmt 1 view .LVU123 + 497 .loc 1 101 10 is_stmt 0 view .LVU124 + 498 0004 0378 ldrb r3, [r0] @ zero_extendqisi2 + 499 .LVL42: + 102:Core/Src/Testbench.c **** switch(action){ + 500 .loc 1 102 2 is_stmt 1 view .LVU125 + 501 0006 013B subs r3, r3, #1 + 502 0008 042B cmp r3, #4 + 503 000a 0AD8 bhi .L35 + 504 000c DFE803F0 tbb [pc, r3] + 505 .L37: + 506 0010 03 .byte (.L41-.L37)/2 + 507 0011 0D .byte (.L40-.L37)/2 + 508 0012 16 .byte (.L39-.L37)/2 + 509 0013 1D .byte (.L38-.L37)/2 + 510 0014 48 .byte (.L36-.L37)/2 + 511 0015 00 .p2align 1 + 512 .L41: + 103:Core/Src/Testbench.c **** case CAN_TEST: + 104:Core/Src/Testbench.c **** HAL_Delay(100); + 513 .loc 1 104 4 view .LVU126 + 514 0016 6420 movs r0, #100 + 515 .LVL43: + 516 .loc 1 104 4 is_stmt 0 view .LVU127 + ARM GAS /tmp/ccSPu85t.s page 12 + + + 517 0018 FFF7FEFF bl HAL_Delay + 518 .LVL44: + 105:Core/Src/Testbench.c **** canTestSendAnswer(data); + 519 .loc 1 105 4 is_stmt 1 view .LVU128 + 520 001c 2846 mov r0, r5 + 521 001e FFF7FEFF bl canTestSendAnswer + 522 .LVL45: + 106:Core/Src/Testbench.c **** break; + 523 .loc 1 106 4 view .LVU129 + 524 .L35: + 107:Core/Src/Testbench.c **** case VOLTAGE_TEST: + 108:Core/Src/Testbench.c **** HAL_Delay(100); + 109:Core/Src/Testbench.c **** amsReadCellVoltages(&module); + 110:Core/Src/Testbench.c **** ams_can_send_heartbeat(); + 111:Core/Src/Testbench.c **** break; + 112:Core/Src/Testbench.c **** case TEMP_TEST: + 113:Core/Src/Testbench.c **** HAL_Delay(1000); + 114:Core/Src/Testbench.c **** readTemperatures(); + 115:Core/Src/Testbench.c **** break; + 116:Core/Src/Testbench.c **** case EPROM_TEST: + 117:Core/Src/Testbench.c **** HAL_Delay(1000); + 118:Core/Src/Testbench.c **** for(uint16_t i = 1; i < 9; i++ ){ + 119:Core/Src/Testbench.c **** if(i == 4){ + 120:Core/Src/Testbench.c **** writeeeprom(i*3, 0x42); + 121:Core/Src/Testbench.c **** }else{ + 122:Core/Src/Testbench.c **** writeeeprom(i*3, 0x69); + 123:Core/Src/Testbench.c **** } + 124:Core/Src/Testbench.c **** } + 125:Core/Src/Testbench.c **** + 126:Core/Src/Testbench.c **** HAL_Delay(1000); + 127:Core/Src/Testbench.c **** for(uint16_t i = 1; i < 9; i++ ){ + 128:Core/Src/Testbench.c **** data[i-1] = readeeprom(i*3); + 129:Core/Src/Testbench.c **** } + 130:Core/Src/Testbench.c **** canTestSendAnswer(data); + 131:Core/Src/Testbench.c **** break; + 132:Core/Src/Testbench.c **** case BALANCING_TEST: + 133:Core/Src/Testbench.c **** HAL_Delay(1000); + 134:Core/Src/Testbench.c **** for(int i = 0; i < 17; i++){ + 135:Core/Src/Testbench.c **** amsConfigBalancing(0x00001<15_48JJ|^ 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

    #~?B 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 D$-v$acQ8lOl;Gg504vPFrt6Wg}G zeTEt}R=(;5Rjv2RTtTSag^|#aH%sV6c8u!ZThPUkpy>p~W_TPlqVWrYR!ubHB~Qmh zYk4wP=xc@=+5oZOYC8vMx2wo>6*&J3n?u_zw8rUwAQkkVQhi^0O zO2+3(=;;}Ar99j7Yfibb#m#)vm7&kl<@$vqxlV8jddsyil4~@UXQ(3wC4AZ@lCg2P zi$l3&p!a1FLop>HG1)bfFiqVV7^EOlO=%75a$%a9l@i%%XsuPAoJ?_Af8BahmzI&3 zt#DaI_%c;3?8|_frEghRv2$9;DWjcY(^9oDs#)0L>TO+0<6WcIy5fMS>Y0Nt6g-;G zV0|}xt+zaC;6bWy6{?Tww`UBdc1_$^W;fW-II8q86FV9Y0IGq?EovLL6bhz(v~Z)1K%WXy+~UW_Ey86jQ<0wbZ2Y0iN--_k8j$&t0XmT4B7Ovj09(&%h$$m3LNOl0YwKs9&739IGVo6xq(U;lNs+ z_F>t(&sy)Wi)12G9HRLUuYqP9bmONjV8(4xHDa~m4B;a`_Pj=HEm$WbCDIrfv_9Mg zi1Ve3NLti7Ii8?99!gGh-xzB0D!M<&=Fi$b#N1qLNllZPYJAA5n)Y3G&%wR*t}4>I zA=Xe;L!r@rHFhOTmc(=g=n~s;l&0vRwZU4w%W0d`3yAbo)he2MXQ@PJh+>+gD?1rd zkIpG%j^@dz@$h7xIe}x=bmAI-H67J}xP{G82VFOWW38edg8-ye^857q`l*W8%?BNx zW!*5YUDn|YTdpYP&*^$-f7|Gy_*s+mV#~O8Qnac$zkrRlsDE<4$rc~byT!|*79VKs zpPpbqn-9{audq#jS+rWBtF)$7i~)^iCJBnqIUFUg=OjRUAHnz0s9W*cpw9kecS9Lp@9^wO7b!zk1s zyIT|vJSqnrDpZdP?YjJsXkD|~I%q2OrA2&n8hSv4uXsaIF*&|N9jD=3) zqhlz7t7ikQ$eaz?uGhzQX_R!O^*&{bl+BWHs4A}5Ol&l4$4v*kIa?L+f>ArWODbY^ zoYC>h#;lwqQ=2_IUdCOlEbC@f7Uu>+Cpe`_V#iI@^|aM1U6&W{S$dqVV(T7{ap}-m zLSlKD;!~Oawl$kR&0*i?3A88wmIX#N!)nfq!BOoPU{wiopt!hgQ?hmJ2CEs5GX3gu z=?&IpQc(?xHw=wtMW*azPlJ>%vpuiU_Pogci3Y~m(5)(45~vQLY306Qbbc$#XtInN z!(d#u%mFSY+c~%M-_NLJ{!g?*dz_X6p%97JU~-?7$6yh` zU$8OBm)hmKt$zLy&+Skke|@}BuGKF(=>mvj<@l3FNqoomns)hqsXNmzyV9L$(qgHj zks2U1-GHCQF+hoDcH8~RdbeF+=l!toNj^SyzDvQABJh*8c&LXHOp$~tGEns?cb-3Q z34=@ax$Zp6;}Svf2=^LL*zhJ(7_zT6bld#=iu`rXN@sN4Q1|lD6}$Y3O2)rn+x)SU@HrX#7aWq*VsKPki?Z&I%C4JNzXNM5#s{JY@3x|7CEM6p#xdxiex!4tiv$0N{e9Rx3~8s|-df zU!htEgZ%OF0;*O&$WJElyh1f0PH-#;3DjBK2GR8#;O4Z%%Cg`#1-BV3wBU9Hx9@UR zqcdf6o+CLdBng7}VrQtoD7{(|qyr5=lMkqlQccTD`2V-?KOe*Sd)O7d)cb30^_-(uVr7HnhDfmVmh;Imwf(S+tu^ot?LF6-n zsPZ^~vL}11VdSNR;E3>&RbQ#hUP&1eRc1(QR%L=Wq|b~6?_;-E-d)!*a1T6s`N{j8 zahIDO@}A%~(#)^NTN%JX8gJ`PFAugz=lF;b(d)e%jml(;3|F zta560`JG*%_FA&R(?U;dOA8vIWwJKfzWX0;t-8mMlED9y_Q{mxHmwQY2AL@X&Hzak|?XQ@6^gg%?o= zKwW(Z0A~7qkjS_GPM6S=!On~b6lO4Az}jgmZ2PVeUrlLXWy< z2tMP!Dd0EVoz|x$RYQusp=COLwz=E!$f3W({Tgm!a)}k%To|*H z-HMtk`VF=fFn>9+ln+N&9xg-BM1&@`00t4y@~7X7(9OGD1b4f8Deb-PJBUS8VxeG% z5G?jq;4RDpFtS3K8Lq#A;jt4Kp71e-r%Ypb+9w&_=|1W*_Ne;}7jYx!;B}$pQ!D%; z=tOao>1t@7qCzt6G0iJQT3NM83&u-|c7+)L!sS~)LTns9l^aM5?`!_NSp++sfOTH9;~wD~1YU(s-7+6tn9o-S zwE|N+QLoxD9U$$tY39J71jO|7Cdi3xhUt2yh^1AdwCZMQbzpR~^Rm zOpwK6izCkvu=wlaBO0Kh3FV+tJ_dpv!_@f5)F~PLUDi{TM+!5psy=p~K)pn;?7 zTIyQr)4x|^x`YS%Rp2mEu*+L#BC4A`XeiKhssEmc@!&To2rO6(;?L zR)1Pw8DA@5AyV^N%~-ntxC^$bg7{lu`4E2=1~0Q%YhI8TRzt|d+D}+pBqd~2V?Hv? zU!(M%0g@F_G~|X=O4IJ7IT@^=Uoc`U+HmZ6geFaf{&~iZhv?NrA3K@9lc%LtIX7Ql zhiUKhPGp$3B9_5$ujo^VKBYai(rKAU^m+4b&=in?y_ndGx6wTRD8@VM3O3#wKzYi@ zUdA5JVYt<3nODX%nPis3G@;KEQf|7ZA;6nKD$oWgD22F62PPA+&(;1wqb9cIwjIb- zuFx)Huxz*tHDc1M!V-c-!k!SE1okG)Q1+$(&o+Yc5lXZSg_o5pC*{(>c1YL3)9PL+ zOD)ymQyQDH1ufwKgN%?h%w`YJTBJ$T**T0+k=5ifM9N~l!yuBGYM2bmu$HjlG79+< zNc+SLj0Q7qLFkrtgxbaM9rs1@sNQBlY$e;RM|^Rv(pvyK?2EY4+Yo-vce_9~{V>AM z`s&r~K=^6j{S@Il5kBC%bG7J45%ZnHo;$~X&3i53&Ji$w496L=tOH|p^;SJH#3Wg! z3bl+ZVjtgRi0|>9 zCg5qM4ZtA}EjQCYtlZ61-K{_c=cX;jYLY$#Qp;nt?hQ^PZ4aM$1cMTe}`tIBj{ulUTv(TDmE<^=Nq1u~(Z1 z$EB?^sEZjH1E!#kYKbitwWp|(zm@RxNbf~tkL#)_IzzpuLpi1!i_`}Tls*4~7t5)3 z;zHW-?Kuuo&$)-psC5XAIRJ0E7YyKn`#u5hyK%=y$%O=$pcR$~g*Iq|`x^c5*L2(i z;0!6WSqgDqL)qC$)!nHaP*aKCZqa2TW{cCisl{-p+;G+c8rVDukx4SpB6h|-i+9NS zXSEIhTyWna;4Q6#C@4t<7epMJu{i8+c6;2!150*c{_s2(iy_4mNKG3R4o(W{2w47C zK{gx~`c@ukUTf@G5KDuvz-FzghPIGAVexil+#rsHz{jfF=8w;?3*xMIsp9lOqc7cv zEAOSV$iO3$w_zxJ*h1EjD?8*0ZY^NW_}HW%SSj+5T$K?Uhu?HQY?T zrFzQ-Qvb9psf1tAgp5s_vdmhbh%jnxFlq;>icqA3R*?ifu1LFu?sBy8^7XF2&Z*wz zuXkTyo4??`tN@gsUJkU4Y6jCQ5sr)B)Ku1fu^ucY+^>&0A*=xZ0z5m9N{Gie6^K)B zL=A3)eeMwZjL32C1zVqRnjEx9E)fZqwEPhh@H1fouqQn3L9kat$Z2 z0?2`xr>kpAfNdth*5OKBZKfIQGOIM1*#Dbo%essDKIFkNn1}Yvvu>NIVjem>U^?Lp zVKWIc3%w+O2?Ipo$4G+c_A0i7)Ve&e!rkSUoAxqBx_7!-bUKiGkT>mJw<`=Ma(=^p z8SEga3SPSNU%}jz=GQq46CPJYA{d8__Q2; zI*ld3f2|vh6~HtEtjsnGf{ZSvErqKXIHo74+;}C3u94;nX*uVmlzL!tBv&}&;K>)% z1sI(Wl2SsUh-I1})$}J!vOExnTP$sUV3q()F5FCumLajMBGJ7Leo`|?x3Q3Bos$r1 zG8pVqSme_B!Og&{9#^5iEuXBb%||a;KfJ-k<4n8!`r&G)nH95Qp%Ah0qj$tZ>A*AXaB=X`7T_7qhJb9;B{O0jGJf|T~!$=W= zRekvDrd@;${uq^wgI|ymM3b{jPM}F5T=rowURH@(R1y#Ba|d)iZa8A4WK5K0ozUnl zarkGX4QCa?1i98-W{F6B(m0N68*y488Y_dBT``GK5_Qj2N;;*|nHW&ac&Ga=reKe1 z?QMyhVJQC*iL72!BDt3m03A#iv~4IE5kFLOAw^ zm_j`q)wtTb8vaiQoE41e*j!-2hqZ%9k2{hu%?bDsfx|gy_g`^ebp!79f~QyACljHj z2>p-z6C4$iMHmT+xX4vni%@MnLXDI0GkJzP-=EQrQ2Tr&%*QsTzjRq@9Tt;6?bQ0q zRsy(^+hP7j7e34^_%Lv#I%T;Hu}57jz;l!3$&gC)p~EUN2kYokg*-! zKHm0u2MIjrJ;T^Dm~wE@?zHzr0>=3i-Z+=3W~POvLl>uah+_C1E6}4nGrP57Fn9q4 z8dN0GlQ~mj1iSn*{ra&ea%?L?9bE`@aj8N7Oum~z|K?7m-`P$2mayCnRv8JFHG@p^ z6b7eolc#eogL4-nxVRfZ&9J|komn(hU931*>;u8pFe~<0?;$L2j>no}_!pcLI<@FK zwLO$@4^}x5dDPtgLRvpkt!z7eKn@W*=wr1xPPO{VOr6aXwXvpj%;&sM> z*nR;J17{rAE)goFLa<^J9&%%(ol}s}4=9;kRPK#$@$lGb@Ss3zm+PtSE zudJ!`g5hjMC)Wm8hQ(_K3_`cHwqTs9kYXq=3e7kH6+jikE;a>*jcFMep|c|xg?(W3 zo_5lq!}t0!h!voDif|-D3a~$h6>(f!gcZMK3NlZbt`Y1qVz*#!29qMeEGENoS(qHC z!wCz)Hnc5E?*EYjNxTEZhi^$x~^l_un z01J)6Y*^f2bi04PyYur!A`AF?%z=X@^C zXqdkk+!b$Sm)xo|Kn$4|+->l({cYa4Os-FP*6gzsngysffEnH>Yf?8dtb$h42vz$3 zdYabt?ibnrzvyy<&EMia#MndbQ<*%5T-KtbT4bDsj2k%5*}#mmkP)o6fpuh5E;7n1 zfksaLEPmGQ;z+c|{T^=z-M_>w!!#QHjD#sfydZWWv~Sf!RA{1@&PXNKioJDpSZCS3Q-Ac{k1fSmw}_p)>uJUSQ}uG&KgwNxhL2x zV;FET6snkDvlL;#(>cmaUxQ!yi=e(hxw`}=nuUqMU}Eq(%Y=os0TyFI!4;@Z1;LgH z1q%}dTP74dgG|g=7cvn-eSsJ zZiP#YB4Qya?C6>$=r;cr({qIsnp#L~B*p$pNp3*pdpz@hsis{bG1Q}2j9Nf)lwf8KqOu@~WkBKE3#nz7T|R&T}1*LlXy zb6369-$@a5_`AKmjP3QFVC)IHcdc;m4lyQ6x2;&ZeLk~6F2Sqea0)uxl+9*UW-}y% z_#Unk&oFsFd??$^l!m! z{SY{enmda;{l!akpa}a%s7%sBx*+r}^$q;Fx1u3##kzcl zEEys4g7;$74j~0oc0J0j?}7o7{E!Lqw@Ln4$p4}dPw!ml3ti|7k_(kWu6D`Qsky=~ z07j$>WK*a`DYYFax5JMAa{!rhlmqHfZYzYnFsoU5M@>ySP}L4G^`A%R^Je%o8qC#I zjMpDfpFeQ1T-V`m^k4&U8pOj+1g9%dmR2YW7S1~S$Gs;Rdy*R-9oX=Aow3(3&Leit zdxNnzyo-!o^gdwh18;o-N*1mR^ybn+LT+(@Ynkfhvd^RHWSGPDQEK&37fj6pQ{RFh z{BMz|Szro%tqlqVrZD&Ne!F-dl{l1>ThOMey~JMQK=@fToN z1wt#pS10&_1JMo#0!E_~M&kryCuD-F3*qfBV&J(`d2UypJHhjJ*&V)1o;$(wF~*LO z=T7kaYsP*}L3Tor;8eRssN6$QrTTIBnQ$X2!6m3m{~6|G@n;!i@SiDEFgQyYRIM~+ zvElnTgDh)`L8J`^I~&ZZn52auv~ZE+@E6^M$Xz^m8O=tfO7E8;1qc5`1|}z0aIkEb z0h5DTx*Y~o$(0fe2_{1!3!U)C5Nt;2%?qH|3+_bdPU%ngBXmD}6S{k?{#p+2t-Jhn z4_vMHzSHH$z0|HT3H(6zlr;9v(!PO|{>IoV0 zNaHx^RTVfh8x4UbXU2wD4RY4>-l&#Y`tC#q-zK{pk=>Yp7q>C72_47Zlz5Q+8dZ2O zfh;`mm{CbNCA*O*FoKe&9eH*uz~c70o6@Rb*>SQGry)6U#FkS1C_qN-qaoM_L!iK; zt}%*I46vk_nU*yG9!zY(YKp%_%Z+xTSgxMC-s>I@$MuZ4sK`PdwuqQC+{vm1tkG;( zqhmBm$3R47aok0gUa}a8&OB1MhAboxx;ijLI1%|UWXi$fre7sez--7L`2cG2z&2C& zZ8V1%5Xitx%K&OD45*iFs7OWjW;QBIGRe*0zxgmLbC{xN1BK0O=FMnd#2!p+HO;&= z0V0t?Dzk>jHK^bW zM_BDy8P&$X$Z>fyxdo!IKhu^8z}Cbzs=_wZLNH8ermR|Yh^J_~jZ^o3rz#YodPVPG zaLyLBoN{~FjEpaPCpcoB@ZM2?AR9U1C+6#BtX`j?*x7 z!CN}!Spsrj^0?hD6$&BU`yi+L z1QqJO7dWx8#ZVgyd0~ySd$>Pd5FsQ%)TJAPwA-bSc7s49q_7a{2UoyJsP4c|*E~$Y zt*8uz)m8$l*P_6+Uvzm=bEo^16;{0F|M%%fbuaxOBuhUCvigB=Tq6HJ(GNg8hgH8; z{}g8ou~m8&;5$>%ucn?b*64(Hn%3wvFhMA`MoHX|k9Ogs%kqIvCwz2)4`gqb>~cab z%p*$&D7_C$HW6lL@;dx%w{9U6N_oMaXD!+bn_~W$9bU$BayQ7!X1}?nT2SNc~Pi7E+L@kb;AxqyTuC-JowF zOCAVW^2|gY=?0lXep!S}B3VLaf-ltnbA*CEGm2Eca-KaBRoz^sIokh zMbqiO%w@~pNt!|m!V^;T>4g*kLaJ|RN*<~#i-*eU$;3=)zAVxtkt}I40V*pA|8Z${ z8EM*{&U>)z3T`W02Lo}PEDtU~Xu-pnAo&j`wkHtTp4iDb0tT&}i5>!a68r7^$>f$z zul+hRiW8S`SVB8W03nF0Yaw)T;ls>;n3RJ>ZY>9Zory;iKzJ182u4WKkgA0oYb7`2 zD!DO;D6*BS)@o-0@&vj4yvLbgf^QO3u7)%d(k4NcK{VG>A|zRED5Dqt5=X$-yf-sP zKvTq#VSPvx(=BXCBp}#Uu>6RT=p(2z06PKwnVoXiAp)`wj4tS4g2Ua^#1nr)7KsKuGBcCC~;yNL{+RhCi8N zqDw`dh)IwsX0$8wBwdaty_foMeQisdjMxls$7Xmm<$Rier(uG^B(uQCw`CWI3h`EVlYnr*XzQO>(2>NbZ?7Hvp1*=A~RVZW6Y3 z>QL7SZ$e#vL!NUj93<*J7srI6Z$Uk2e6uG#?B1h=tpjXjlW{kt$R6>RsP12K_fbP2 zgMA$L>2_>1GT7*CC&BHIjbca%?I_`Z0UVG;lD-Pylkd}}Q%ch%H-sX&XWHBVNbdgx zDcSN(-Q*D>9u9+1=;(wvJ30Iy(lr;6xw?*S^Vn9Mfr`$!#amJ5-(t^|Eef54kTCXj znF?WbEb3c3{?8U}7?X~K4N%bo08P3?xU^@+hfKHv~q=mbE@CmH=Ev=AF8|ifVE7zex)`3o^(rL4F&_3r$AZj2b z5fW$z0c{}Az%iWHP5%>i+ASHhpODEgynMY#K4{w+zM(0HnkHfFod%;3pU!8LEPE?h zSnR;UB8&s}ie2o&b@=NO8xn|ZNXSAn#2^dJtypNLzhmnk-c6ZTqxx5a+H6q6ae_8% z+Jo9`rG~ReN)5u;%nge+Y*>KWhw#=;YAO~X*e(PWARM+^nvjgp#MV4$3WhLe7!w(x zEGwf>1w=}4KCo@+Vr!BMIw#{xH6#*DtEWpN+JeO$JgdXSomRMs(n=6cs5ICoRNJ2R103bJmUGX1*D znO{eeb?Z={by6R3(e`mWL3U*$(MUNj)P;2hb)03kD_Lhuzc@qwT9rRjXU%izI$N5k zGiY`x&33Gg2~E`b4EKfGu`iriXU!*devPHWJPA89ku{^vig-rqd?vHb&gG$7`Z()+ zkUP;)osFL04L&|z%ZsDZO$araXX)ZC7vODkPzIT>(ja5;21n*v{ax-ej6Gu?&wh@2 ziw)dCSkcKm;jGk5fwHtX1Fbhhp26aYWqk!qhuKB2W&h6jYpx`pwP39_gQ^`dL;8VY zPJpUTuy2>?GL|aXCscSKub>p?wln^M%BTpi8xc0+@Vux9#groK;5!dR+=O{UC>(vZ zGDxJ~<0)mGQE;fzVA{`h#$PHSm65=mfxsEV>ib?34$#1&n(YDuZXvj3E^0h?9fILr zLYS|W2^Uo&Q$b*sZ2GC z%_fsP+)Z$7GAV_cpI{wW^PPpL>_R*Wz<06WVFy0!iOCh8V?4{)Sr_9+2dp#p(pzQ2 zTDk-Ftg-9b3R@k{i-j$vIT;Ny8Tn=*pV^fK+AKB?j&;Wnx4M+-Rvt-d#mzjCu+bxQ z19oz8M~?If5$G5Z=&4xvj0m@#C?l?7W3+rsg*!eY)`FM=)d5^hOnA?*FKu_M8JQePlyp8z)Y|P(8+rBA(bH2hi=RZimgZVp|yfgn%1AjDsKL9FR z3b?P!a;*(uG4L$r2x@@?vUu=!mftCE_=DW7KEl20R@~la>@6NhYQ^mc+x7Lt>#WM_ zi5@)m?>~)yh&}DU!PqOwSNL$;E6F#L7>73on*ziR1n&iieSo()A+|nsEQQ#H^ak$s zZ%99#Mtz=6Kc5Eh_4MlmzMejo17gQ=aKoeRIooo9@?7qbTssMSZZsJ$fV~=v$I-Li z{1sG;Vrmr?Ngk>7tL4O~+Jl!la2!s&z?vLQzL@0r;ig|fmcUajI~@z3MVLJs>XU9V zC>KoAgiYtKvnZh07z;NW6e^(wBRmgbOJzZX(uh`x)OkWiY%*eopUnsc-e^(N ztp*H(!Zx)vc`6n@7@@q6U{pXbG9D{Hj0J$wl8l7zjMzGZhFUy zEg{?pYq>#3Nt*<$&Au%b-eFKs=wSgXk4FV8JicnNfpQvQX-9<5*f4l}BNo1ZuxYqW zXljTb$3m%jTTR1*n|+#K4Ag;)*s})BchhGz!Q_9_Bp`o)UID@;e{n{v0x?tm3{5ck zJ4^!dFU!cWCL^}qpcxCJc1C{9kW<9&R#b%kTExfHhRgHM;u-NA+Ct9Iw(Bdqw)2sD zys0G|6%8k1rJw;zK+!rBSqB8v6-cL6IQkBn+ zcOog#6Uog1;+un`daTet8oWuso56)Z5H7$#im^8*OqBS4&abJ`9vO7^*uCOI5`4H z3le>S2D{aNF?n91=aX+R`bP4CL@y-YV)U)#MTuTae!%Dl$t?j%Z3(sph;9uIN%T-~ zn9;+*Nr|2eUS;&v;FLs91*aK39h_%0RE+yTwQ4>7@No8{iKiGj{hQx>ZkPX5;(#>nfyC1Q zI@7Krji(cT&0HrEzu@g$;tk&3NL+|$Tu7||NhT%7ozXmBI_qUS& zED>p$50V>1Wj4UsNp(B97hGiBMD6N;b{&zlBf$#+a_2fsdo_41idYT9NIL10&>5M1R9+_rzoDSdS&pq412Zf6$Lv5B2qsI~Xq6#Q={5!fHTlP={pY+o`1_7&kbaxhp2HZgil)M0TWV#aUZLH@&p zosuAPtqWHhKLNsfKNfbzhGShVg4UI2K-julBMi#A0nu2ak~UrN;}FQlF$?Oj?}}+f ztH_^0kR@cZ_ag^g4T4FQmxW|K+9}7H`(uRTpTXmsPy2^26J&yU(b;^v2&J&hyhY=w z3G&qD!f+)oP^i2kX&}17z=iZ}@n;f>umDiB(74b7=a27Hf(3k-3hO1)5SkV~$QMJY zz@)CC5zPjaHbLpN>VijMeSC(ilkbDYGjyP0&q@W=<3euFQ(4aIvzL)XEkc_=5D0uo z=>k_?%$yb#un6sfFv}u@vs;5ugjyGY!fcCR*U>cpdD+M(@#tyophcLQkCm+Xe3)y= z@$lTpR7t6TOe!!L;(N!^(*Zi{Cf4SM%Fsona->-8c7jd+UuG( zti_tS8g;F%)%hk~^4;oR&NoSfbqSUBqvF+rgn3Vn-;n)Saje{rikIaRw4u)TlK*FL#Q@^v6qZFCUx~9Q-D+^AEtD)PqAd31{b9YDAe$z>)g5oW z$fz(R!s?J*H!QO-dbge#Fo|nqB%aHLYn#_<1?J0!2Vzu@hh z`%k>R<$fu?Nn{A~4OA!jL?+)phSOa$&8x@ad9!cckj#gHO64Cc2$BKSe zoYHskN;PnJ5f7A+-5uU@TzPp8M{5yPaU+kZ9gb3=9xuD^a(uXmy=_J}@)&N$wmTN< zTd`O#+gIis3(J+Wn<(Ri_b!|DUGKpJ%iy1(&sC-LlW>y+82y-JSmrhu*mFASpdro9 z)?0eU$A2sF4!64ANnA95iwO|R+z2$J;11#8A*^a9x(_>8*Ax=i77-HdmIMGoLVbaV zpOE2|P>_{aBJG}NX<)-dXw0-U0JxagMi+RSzuhP1b{||tE~DY70Aep#>2>@5D~Xd_ z_Bx$-FM(*hRD=ySZS2X!s|nm*Pn_Y+%-_z_oyY6{;LhVFth71_s;DX}97aRpHEDmo z<&Uk1SMDXK0A~|#CKx9H#xEq^C875ckNa7TB^%{9-Im>0WY`pe(W?z}qBEw!&bV(A z@V5J&0lep86AC@jdyjifZM*#Uy!Q!s-;?LB0NBX$bD1q@1!BsWi-w#lC2&`ZFF$O@ z%MYal0N%6jBHZ95x{o+GtRh7*g+<{lg<2EuDY@r)yl2Hk*p5d?17Z=P zIH06N0T7~n$Z4y{Wh)->rJQ!4nv~Ncd||*WJnMUaQK^?HUd$*C#qd>)ef=407zkc^Q9C9fE3o-dT8mUf)8_)d6;h}SU1s@ z2cz*ERt=Ewl2mb`ts)Yn)S0$a0HoBJwp0M5)X2bu`oq^{6|D2t`FQ*XFZIV=_GuIh}>^>Z_|@>n+}#Z8^Z@?(0(5+nA#ThibDOCYId@V~Gv_TH}A>UqZ@bxVaQ%Vc!-O}!@ zny6)=hAUajL|Y61QVd_XA;kb7#kAXE0FYut2B?4`{IJO2VZH$kW)TN9jSM0!nR^W< zaWzP;c{&MIemePV67^`sw<)k31i-7w*Wfn$uO&|@oYFDb1Dm-`GI!a`sIz3osSxDS zs%K|umn?H^7Vs}w=4ckPPN4MV@QajgCx8lnHpxTO&!PyP4Uqvxnhv$!B(-{q(_z`( zosE}PU{u897$XyI7yS?L_HBPFR?M=WTKwIzngVe%Wy(7>$!TjEx8xBh@Pl&JgVW~0m%rjja!sQdF1D)2bT?duZfMa@t8EL$PY8N z1B=N>leJ{L125UbSP$0=JF#B4o3Y&#LMIjsQ9jnilKU9jmwcSD$CFTsPHI!+?DXcz z2^I=dr(F(Gr|HSg_TSYW2WJ8AS(%LiZl4Tc`}it~**G19^VmRsJaLTeah&_Av;8x4 zux7)-dJxUxZy|rPg+HPmNFGh{eiX}<0KbgwRz&e?{Lr;fF6`?0Zoy{lXb1KrpJIg$ zFjwY~Df1h=%`fh9neKB1`tcPwIo*Ym(=yxnQ+Hniv3&{P$9r^$-%fn=ALz5ZX|Nso zx6d4Ymt4`fW%87v?aNRGUrh+ZF%vx+#G^H)m__4UTuuwLg6av1F?@VagnFLdmpp_U zSwT2hsQo+Gyg;jN#%X&~d)pt`nx_As<-#gmRqg+8CO#nGgTw|*42hPV1-%|wx@?v< z`nSl^rCF?aOf_p@;%YuHk`S7vk1GSx$5BwM-qHa~?jEXp567$77-?`I5a-RkgVdFS zScFIH>BRG@NATXWBw#mYPEi796Yq-z+(<&mI0p)djJ@8kFN+op5JH2Tvl}6TA;aNc zuu_&IM}UP9I4IqLVcg6QF+B5wKISxuOs`t$s->Snj&3s{NBj&fFoQpJ6^`L8yk!!{ zEAMdU*ZW?^)x2dif}zrW4K&VopIHRAlv-W1&VDYyr5=O6j1#ey{iV?&)~iucl);t0nho~2%DcDA0nU6 z;l9Km`Iop?nn5X^UYGBrrvZN%?#zDzck*cel;7nOYMp2JZQ|^UvOG zeHrJ6UK%77eIV;jzWHbKS^jN2`)<=e>YcQkp{t(r%T3w!<9pp_7(He^`40L3alYz) z9y8)^q23(Jf4zx!nR_+v{Hg)83o!`PmZ6k$;RYFc`O7zV>gmR6d}>v}4vf3}HJZB- zUsx`|TLAQ&`@Uo8ZbklD!1v=m-sI~x_Z8+|h5I?A@5Y@k*5$$|--gRO-^92McfN6Q z4eoqtZ!7M6NAM%K^N)P+-1Bo1i|R}L!!+#ml~1JxLpWmzev_=H6)T>&?B| z+$WoRnJH&()_tjoSC~8d5C81l*QoqX!7p5^Us-+RQSW(x@l<)2!LxF)cPm$WCmLnz zIiudTbO?I~7f;7FnSy5!h(Fs8<&ML=>j2{sV(JP1^7R(l9b3*}1D|N_R-V-+&Ra7s z&-q7)G^!=>d4i(ZWY~>3|JKLeNOuBd!~PfAeB5L`1|04mQ=hrRzL1&lw?S{tHgmW7 zPV#h!tzMhr!g_E9!MXb>lkkM8?|wt4)Wk2Ec(aL*F!Td0o zP5*6i+8O>e=q*lKRzOh3~@*04J!iqv)h$7UHI45|WZBNJ=Ik zDVctxWb%=csYgmC9JvBCnd8F zHzkvgluSKRGVw^sw8M2Ch!YWsKqy{42;+}TFFNGfi03bSFpQM?Wt~n+CMPMGni%Ox zzF4@&i$(mD%tlf&7fI<%WIS?&)tHLO2fj??*N^ZQFLP2d7jaWE6-miNBqh_3luSZg zhs#$sZ%QT}Zc64IDVcSoWX_S28AnRy8!4G>q-3s|05yiy=_@*59V3q<9ScCL*xC(d+2(zhr=K}sBH0Ts({V=Q~6lLK2FwxamVDe;&E zsat+m$Zu6jJY_c}j&e%e5iyr05o3^iuSSaU*P- z^82R79#M32TO=6zdqNRj(%S{adk0pMj&LF+ez1}{qiN^#_J+xzHxoN(vMVq%c2d*! zDlrq=tua-M3BndEH2K#iQ$qUNA@De4gQ8YRg6h5|@74s3Ea{amPD9&mvx3g)?M1yk zrMLCU<8F;TuQwfT=L%{4T`J)U`3+*fzB3Zl36(({)|9xbf~2+5Ulqd$2dgMyhNM0t zg!g0dQ6PB`$dQa_BRZ@5)vU}AnCdfr>7}N`M^)w($j zBYIG~tdZ*alyfgUnh;N1PmCP&Jl&KyoDf&Na7RZX+Re{*B0mkM_Zj+$2eZ4rp-jQ-9S$UOO7 zE58%uSB+M!gte>dui`(Vtf=YG@M*nm*Gd|xsUqR)=`oE+iBFhPkMIj{h7-=+FgKq2 zZw39Z@go~7Xdm~6`&QmLYUav2oKZ{eyZ6pfi*8?i_o7jacigvp@!fZgy5YV>caEC1 z>duv;?pk)=!rPb4?7na1?RVWdYT><$8dr7Sd)1hci|<=Ga`mb^h}W`a#qD?8Gjh?L zt4DUA zzhl{_LGIq$?^ts8@;m=u$JeUQu5zZVynFSXD_4!W;ij24&Kx!6&eeC{0U>ta|4mno znR?ZlHKT6ST7;Nk%5BrGpK+V!Cz2!bXTZ6B%H*47-gf=MRoyFZzoYx^`<6G};h=?X zTXg5*+dsXm`?l`SuDEkm;}SUj&TXr@7u~(Q8xc(Qq#+hx)ih?!9ROg0XaH;0+_vQQ zWy}sRe9bKIy|?!TUbW(G1uHi*EUy4!BGQ{h0cTLw>`oG1tj8%wVu+jcMwQG-x*i<92v)UrYoZFM-)O1$FO`UKO1QK-&v6nsr%vQf%r zb%p^jwlR5SV{)+8FAJk~PVx$%jBiYiY)lRz%Fv8rIF(EM(iAhQG?)mvCXpeBsGpoW zCl=|eLH@;&7Lk^4E$h-$7cZIeduUO#VrCvr9TPY@h@!npN;BQFHQ?km@eT4>qqPoGq;8Le zHHflchLld=tbvgHm{#C_viC0VbzRk+@VVMLR}agwV@bB-B=(hLJI=#by7D8Tl`QLJ zTQ6IYuB& zV9HG2{W`RrAHP1x_y4c8_c`aDd*w$6GvOnK=$^BmYp=atd+oLNsgai!zX89Mgs#Qk zkH-o=Hu{!f2#PCwuM^!TWz6&5y43g_)A?bxSW;;TLRjIA~wpBDU`$CkcEf*I<$4i1O=RdL}G{d)U3ZbnMkGlgxO3& zFqhLz@OPyBa$@zgsIVJTe5=~$SDS~^ZDl?P|1@k|!nzUSqb4z-@`YAGFBz}(F+ zziO?R!3GQX9IfYetS(R?kse5=#5zcat1xbVn7_Bng+ak{SqG*<$Gv84+7A2Ml1!z5 z4B&z^7|}bMfCkP4tv^uE7X1)Y>`} z4p6kSSP?5Yd%kF>c`)-1$WKV5G2Ex;-dHJtV77?(vwn*kTv_Z741V{hA&5 zG1aVST{LV`M&8;omnkv$8|~n&S-n{YufukOuScTj-b12O%aT7NxHieXb<#s}z~7Vs z!EA@3HIKA|tr9!KL2)a}eBDAz!f6r0X~de|ct84rMtxpuRJe3{x=w$`t{iBxYxV3* zPf_oIIIhQq(`DgQHxFJ;&CgvL%3jVcs1Ch~f^GBsGH!#Ko5^|xj6$&Bb6(6dP% z&?TdR1fl%rZ?pV1`8V13UGm%Pm)D7Bz$EwiyCtd7R%!ILNTaRVsLfBHwPrCxA#mBS zHrQcHw}hqkxyQs_C{=S`+OJ0k)W}u%t!zg&946+*_U>-*S*!A3KL*FmUGv9qf|z=! zQc(y#Mp>1RZvB*>6fw|f*PekaRNZsX-%bet4o?~=XOTlaXqB7A=8GbK0X8%=ePISR zHZ^sU!`iFzfks7!5E1J2)bTR{09yk^0-{-y-kLekGG(MC^qF9;c1b%QpGN0)W3M zn~do%NY*^+*z)AfQWV;wLX{aYj$tD&L1#mvoquRJZReb{b5iL1fSy=S`Fm_;i{A+_ zV99Xmu%aiNK2{|a$z65HS3vXDC(>nAz|rSLNUpyiB%kj>GL$#p%|*wvT3l@4^`^)S zp}w*soG~2cRy9i+eR_tlK8CKZNzaMoA?uPuxqv1MCpwv%OC{6E7Tg=7RtrNw#En_r z1fSAi%V0;xF>z4sh4{gWJ9!AlU?3#wC?p<%Gn-72>?qsh8W1B2vcmdnLvN>Kh+Qg< z+*pR#rKK`paKd1%^Xaq1cu=fX!;Vz8rx{7V1but7p~{CutS8(3ovj#iv!6tr9j#z~liWenLUyEJ z#~JJpQ2v!CGxefApoO*_@i&`?QYc%VG;@i1Z3!NXJDIR8)gu1YGV_uF+o>#L&?y8j z*8nLIM-_OZpsv8A?Za=?EV^s06I}&A*mn5kZ!ix-Gu(`hFcr5XT2P8E%CaQaM;r}Z zlpIY(t1K0_Qu7RoE`h5)-dZxbqou6AU>0!|n|1a@mKQRO?<$qUkRbCO<}_Lpdr*c@ ztDZ2<5rntFz_={#N&77+e>~-%gx$^(ID`g&I<9+CLS$%>`6uX%@MF&?_T~*B)69( z(b9)Rman}a%b(A(d_23FznEQ`zVy5|c|%A8qnDQY#)AAH%q2$4!MG5jZK)TAq%-I{=G;5$S#f1Cq%&H7%{dt#EOoHwF6373LvftD3* zFmZ!S_`3W&=!%wMi3+O;atG26B@?%Rr;fuWl3F{&E{oLGM$h@>wo%GEliVG&c8INE zU(|2c*61$+k8WvqEpESBi#p)lzAS;k+L0DvgPY`ws8}uwe`8n6FJl~{`DN>p=(sY5 z5e3Qx`v5)EiG677j!0v>(HO%S&6g;4>NpWp2Z7t7(RXf(7zz`~Hg(MGL<xvYw8el*^JjKwFk9IWNCMXi z!>!VRt+m@IH9M$^CQ_2t(nJG5|I+rhayp4|i&~^_pFlV@<=dqW)(Yhh47wUYE+@Ao zm@wHp8}PR>H6`ttB<*W#7D$q&mnR!K1PZoBzYp|;FQu?Y$=^Z#=@6}NPP%nY`5_o5 zgDo{SqLg-#ARnQCi-J-x zyJ1jDc@S)3gHoWl0|$coCW6;Uj7l<6N|JNZU8&^B?0N}7J!$t8ifX9YUzDt#lA`4K zHjc6=Swmxrl2N)eG}=Z~%U}yE^t0HP=n4W!?HAYP7xD+^m-IM+cqz(XJfg8~pfL!lsMjJJ7*?Dx_W zKwnJ_tv1L_sn$UOHsL2))SYpJ;+9q3ZL4&!3blp0lWF0@#;u!R5}e3rgZnPrV%#Uu zF4bHO$TGqDwfCV#2A7);xJ_p(GLI+UFV2v&wOMV4g0c#KUrcA~CTwbjvf6-TW4;USq1TGh)ZhClxPU>y&~7`# zjwTrD5^J$OnwG$2=3Hg28|O;nLWbSj?o9GledOc@j|#*>>c|msqbMB`41ApB|1cOl zOknVZV}MbevXjsugcK!yoh0W1#I}$fwZooHLQ9a&#WJy?o-VcEh+Q{nZqnnE6a;nf zbc1;}C#l6!z&ZOnC+46@o{`7~HmXz6VSigBrVHu1Lx+_uCqk#K)mQ3p&e9g!hDJ${ zVFVyn*(=dVY@XYJ;jf+Pc3*v-^X;ZKeI#7s^E`(63M?FR^vIDG{L45^534|T$?Wb8 zmceSZRACv6N206_`~Jz}9j1C| z*#0PNT$OrJ<3YS@Vd?4RTwY8JRM7AN9#Jx#;F5h2-3uLaW4N2j^GoJ;oj2dA>N!zb z@JJ=h&FvKI540x|vjeGmQQkXbrNEs8N^9^}o$OtZ(a8V!#a3yCL5tntexSH{5RfTc z-WayuAnm^-^0M0P-`?vOq#12>ye(!({ioslXS(az8ZB}mY?J&J7tuWrA3Hxfn152Y4>j#g7M zA-`y3u`KYY@?e>Hlf+h)Kuf~x5@akyXKZI|oTX;WPaFxULIC}!?IQpbI~3A(E;R{x zkMeYI{Q#_J<88g72z)`XUB6&^4#M;!qG~?>U2$!dmRpdMfe7MhNAo#qYMQCsa4TW5 z@-U?N9al)SE;iCwwl=hDc~+912yJPDLOe=ozIl~GJZWhd0xmFZ&=L<~nkN&98$$?q zD$~59Ac;pb4es`il;U|!^HH|G7mRD&GPHjna6C3*(Uf`Z* z%RSB~bL}RW2e(8%y9l=c4hqfUP|P*54RmjIa(eMFNS}^`cq7rXETMZrl{Am>n*T(y zXpj|VEkx@*F~#{cX4f@{FH0g@Tm1@i+XNQ^+&^wH=MXDvpRvTaJt5XR0*AMAf!Zny zjl>{InzLcSW>Kl!%I4y)0t$&C2sq_{Vp|XdhL?rQQqN@LX|2$;psYT>_NJda?3>dCZ}&gjw_moN;!FUZxDJx$R(gyE9^}LwI3GR5ndOelC;95RqyXtZY+7$}bPMDh6g=Bju zjCu2n`I^LY!Lw2?gabzhVA)$@@Jzpes42kcCp$0jf$Fr`$N3K?-jwnY9#5(xvJhhh z$A1;bk>M6{dZbgF(N!Qv#uNEal^Xn(VTF)0L`6MWsk;5zph`Ul&>R|eLlbZcPiOvD zi6&QU$h69 zGMi>$JEN(c+LVZ45x>O6{t~zh5Fxnyj|h_vhyx*!5rMQjLLJ8hJxUz_K<(L1-@ku@ z$3p7i{ZZ!2(o?BfQ_a9xBJnL?+AvI=z^%uSv{&XxB%I^qcv75Hzg^H-WLz}}ffYIf zmTfmUJceUFwZ|N(fRUE4&?v;yJ2wfo8KsCj9M6LI?163g_5nU9sDc(4X>05IIZcX!MUF z;og-0Lvr~96IzillJaqo0@ElG8wvLS;{#GYqi};@ANtNNW*}1eoiPx+Q8N9SBZHo=6zd*thwzH zun6yaGoL7t!7Jd*7fNLCRygxVB{FzXocX&F8N55rJX0b=)i(|fip3j&iZ{%eca_NC zrE}&NN@VaJI`f$l8N8a#{Eo|rSk=6(&V0jVL^|gMcIKa4Mx+Msv@>tmtojFs5qazh zr(d~UMVjP}lm5ovUAn|_f+;$k>}|E$$ZS@!u1$7{wr%L7f>>punZudpq-iB#H<*`* z1cZxGnWA$jXkbA4-jp1+mXf)8A<#IE`O{G0!oapD{Zmhxu7WHShR;C@cRB$K$&Pe* zWuNm#qTMNM#VNEOsm%P+3O2oPA{US-`A1Y6rJ~K7%6!zYXX{|E< z@-oOkL`4XCHlbtKqcSlR;-((*aD&VWvumK&+%Nz&FF%{`ga0_ccMd@IACGjh3p4RU zzBw-FOqg0WJ;3`I%+6U?jPdl8Isofd_t5MfuoQsk53I1G(9E47uM4}qeVetPtZX_a zo@$kvPzq+d)8>nTn#C+vV?Dx1n$4-slzF5`$9{5~@G#YKqA}LtuQ9KL%}143WT!Cd z#aa^(y1+5+n@}~Im8jFP=fH#RyfV&z@Pc3cxw_&l8n;@~MOMlyqmdcvmWQCFy5e5>CGSX;NbzZM(eS)VvL6Xrk@H(n|Sa z(XPws*j7B_{|P;$8inZRSraD@97K#HIX(+m+Wa;=;&{?=_}H6dv2N?}8ddYFwT{)T zdcyGq)`ieF$#dMi@)spg67LXvjK1dq_wpn!O(-AmNBNW1v_>EZZ$ti~d1OF>&7u(g zx9jhzQF==FN2C+}8IaQxJVz&4jhY1@d8h)p0zjj`c(V$GX#YRHg}9Yz_{u{%Gv?>8 zG)Q4#g3F9C9 z6FW`UpyGgRwq7|sN{B68#%v+Z5-u^El-uL)ZN1jNTX0_pYMYvN@jyaC$S?S~5dVK8 z;0QL~!8NWNRuo+Px3zRgb%Kjm+nDR2dMM_^x!?{J$@~d%FbPHenl@CD4hE#{53j}X z{C~OXyUcrH)wvpMPWcxGd>EZrrffQ{ll9w0jr@XZWV?Af)<~2V6^36fs{UzLeV6%E ztolYU{8CXPUzA2fQUm{o#s011z87cX5!~E^(bToaX5lYQ(KhIxvK`1b%M`p>+IV}P zm7(#%M$hwMqelWv#h@rM5iqNvi4fWZ)~H~3iVJR$P}L3YS`8yuJrSY2DV$*{AUOI~ z>l*NXF5NC8N(3?Oydz0vC$B}i3#D#{ZB5%(&l-T`AitPLzbF?UG^F{izj_n^M+Q&A z*`)=!0>BEQK8=nT9WKcoV#?zpO6>2z-NNR1HsH3PGnU+Dus6(`fGx1}dE zHl^$?0SllYh4Eg|9k(UTTd)bkode*2%WnF=eDsdBuKI77ceD6(;huy42pcQx3;Pqe z7BkZjfJHlNAMhAr6_GxIbQdACFRaLhFujyNj2xm%tr@R$_G&b3BP=};uuNcobS23c zQ^`&Vqpg=yeK{^%4GnHgVfp1&mS746eupG@E#IUJeog z9=SavIz~>w6P#W6>B$OuR97CgH;1yU{6^x{=s(JBsLUI7$**4NVo8)m0B+i1Js2VUeJZ##e31Ci{`7lBAnCW zT9?;6Ch?uBLL0bwEt+wI`&ddJ)>)x*V@PIS-7@n5)U;7 z%*M}an9mLr~~%PUoHjVy-lPw3J}YNOlRlMOFt65(P729-ueurvn2bg#zj1h!8(ke zZ886pQHTfqHsqsB8-b?h9zajvalgzvV`{jP#U;h?6(3UYXsa+$f*theC$*N?0NN?l zN_CqO%R(w#ne$sQ=J#yZb3U#ZVAr?h(VrvMus=(Od~$oCx;6Y3PBv8a42FalBXuZ)GyLtarxX%j36h>s4)+Ks(F!V4WgRD zm;rtZ$9yw{07s|(_dpP=-1!|I^B*i}4*C!y#5S~eY@!(pfH-h?$}@^^ZpH?|ReGAW z0uxMU2iu^n+Jk;!qn=kY z4^-Jppxb?WRT~x-Rq4#n%l;P4O|l+;l{zy7UZ~S-<*bcGU>9kCZ_^i<8~k{Yu`yN@ zLy0>iPf{9YheOW+%4oWGDGy5Gox!$Hs)*`t2i(XV-sLO?-O~gG~eBpq*go@~7BQ=G;8T+nO z#&eRIuPZoFWUV5#u~d4CEN8Jq;QC;b+51lMn**Pl@P4zId{VG}GxIgFu^M-sBkGV> z9Y7f&S_E>6p*UDh%oJDKo4EwBGYQ}cvRY=a||5LBaxc`vu|pj zl=)P-4~?R$1HCORR3q5jLYS6$=VR?yJ>H7Dn_&)YQ#RTjxyF|t^fF(zflkl&Y1kK= zh8LHfhQs2VXa&6sKb4pU!M#p{%*ck*F#8-$!#fJ60ju6xEQdq&BfJI|D<&ED`9-3i2Cc@8FbzeCSsD&h48roJ-Ol zJ!5VB3G^#?+`Fh3IemZwrHvnsS3L2HnAkn^K zNn==h*k94 zVn?rj(#2rCfDQQP{>WkjHWAP!LHU{Qm>jOGOEw^mfG%#abRgw6A{Q8@wwRI=S56>% z{1HnN1R~jLcDDL8wlH0sFy(w$uc?@>enSw3@coX7&st1$!08nVjPn#2aL`c6j0ko^ zo8|c`F^-CQ2gnpATpEhvZkGKKC*g0SF4xl|SYUCfO5cj4Hv1EJglvb5*)}1ocNh&Y zMf95`db49e6t-w`2q3BQOIXUqg83an z|KE4>d-A(IzaepbrxQGpJiYM**A`6hpKn!#-zfa6QeERVmxLAkd2yY z#_0nE^R0Z;75eRb)b9pJYO{YY3hcn`MKBTJ4^;0v_PGQ5QSHc1(RHxwBF;20(}%z- z5knKX20O1V1;1g>@w$hlMXW((jQ~&CPTtfMNd!O$fQB#Fn)pBeSUPqS`)}UxeL81- zGG{y?!r+4Ml{xz?zIAS%w&Bog*a8j}rL6CD1r3t%lRcrbyk6H=EpPNQ`H%`_ISfo; z@21cd=3HYNxx}pV{1t%bfGS0Lx&jN^tUsA(*Ut~3LoAm?ZPvh!`W^bqwp@?D?5(<*hHl@+2#s1CTL}H-{8qjBT%EGs_trFWi;$K| zp_|h@6rD({J_{zY(A~EC&5?;bA5J8FDbGWX+go%Z;nBAfS>$f}qTI!9l5=$h40)bX z#WJLkw_sITxXifTrEq+ia<%uE{v)phJnB}#dhj8y6WtOUuAud5hq9uq$(mxEhoC;ob7fEW}H|A{F;g&A6si~ zI`nq~EACCjR$MU`R3v*NGmRq+*V44E$f)X|`kV!b6&X|1^uvfFR$i@n1NP>?R)wG3 z`42n3{|EtJ+5wVe9i9=d>@|^rT84#WaE)_?*v)WKH)P)m*k+;CgMFiGA%nxRFfSwn zF3dM3gEuJ|1mC|AdGNlSN(R^(!e#*Xh?{gduFJJcp^l1+0aUQwEa#qedpTTkCAv`4 z+?=PjpeI_Lr@L{$UN-2lAIl5o7?rZg?n8h*U{2n}x@6akxFt5*J#y@$;E`MZ+`v!Z z`*h@G^NGhKY``8vH{07~f@P2MaHn5!Ts*gMwxB5X`MKM1BaA-Z{2c1RUc>SyHk$_GcvQAgi#tpT%xcYJ)k;2jYw_8kMq0*s_4knDFCfk3Ql)By^B zQ&}M9*XQOeVopZw#*Dh;QIxx{s0(zpVbj$-`54ab`-tA%X3{BqypP}SE4;wtV>jxw zb`(naPPYRt4oT}}cheT1#?tT4iI*LIF5rs$h#Py^Vf}M+4cuDY!ompj@i_5q`03KGD7-@YUCVaMI>89u%GFi=SJ0!>-bTaoFKb z(DvQMUEqYaW*^6ou?Ws^toOQcmv*>ozh>MajD)z0XwL80bvf%?m!SHq`W_in@>+N< z!7IP+U7N2`MIzbintYXSF7jjf<{uty*Uwl6M=3vg(+iyREIH}*_QR`lh-r;_CSKsA zXSE3saT0$|a?*!yQBJa7<&*H(%VJlHJD6fz?k3@Cvr#aFJ!gpSPEpdKk9d2b02DVX zcDpxnL~)VrA|5)$wBn5}G_m;0Gnf!Z(Im|ZHl`~Ot&8YbeETZB^SoFrP(p+0VOa;e z`)!U%gA(nbQ5A>~+Jtb6JJ9?l*fLa2IQT-dMywEMe+sw*h@@sP)qi;`ex~EiyA@e2 z;2ds03$`8)vBfpokz$Rcx?Hy#kH_&;E#IGH_$IFEfN;MNL6FZm)}D=pt^RU?v`rRT zqS2xMuf+~F&pavx1FEs+fF9y<^P`cLGAa5|fIXa_<1#NeAGF~VRoECJ*G^=fBTZgq zoHtY+s*T=?G9mASB3W>J*v4TM&>HC-gMp0~^xU+!KPGrs<@bm5dl zxa9kZ@&3A)@xI!qv=oH6)bJK9vMIJ!^g~_@Ddz1zIFcZ1l~`!V|7>JXx^8nIM5czZ zj<}@r0n*&9!KY1H(ZC)Y&BR78wVDg@V>nXSezRK(#bUJH)PyeTL$dw5H3c^S@1TcD4W4WG2^tYr_od=@MSrPDQPw0U zf*`%aYpOItPQto*&M|&=@vY6p@%tkF-m_80%kQvq(MG}_cSykWz$L@=3el&(E%rBq zNQs^39(NJqvQS;sY)~q8hW{fQ!SO2_W&ENAP>$N9;VRFdBE3E5zpAC#i=H~r(m9V@Y(ugXsfeX7x@4d z;aN746wGNHk4vUgNw5c?P9%@TBZ&WbBbZ;i7m$@Y=KJ=IGTygQ#+O=j_<_8|yuprA z`o;kg0+!)qW<%i{X5#Xr;B24J^q*R6y07oGG+1=X5gHXuir;2nLTC{8x#Dso(06hV z`ZG?!(|HOatt5h z9oMjD#ro#q^Njt()iK*+uS^_b#)J%y$=tz7Ntq#*CF``w^y!vJqTOz%^YEL7rGXZ( z*UQ5w{yooOYq5Qa*B{hr)31-I%y;*mc9JKAO79?+h@L|Nv)qSAUTj6cixbY~k@nyX zsKzEV=LKi4gg`q#5K7Ic%+P~}f~6*jBEXR}sbIF^+X{|DRGVhxh}HFT3Qv!UY$nLc zT|h47xN@WhYURi!9_LWnvMuvLl?kn2;<0@-|*TS=sCCd@x4y2f|uis zL}(S};TT&?GODz*^SEDOY6b!+##666Dk;Rq(w%bk7?_|kd0MdA<-oD1A~+H#cExyq z%ymR;k_APmru{}X$2N}pmAaE-JE*h-6Z97ue)Dz4x?qZzFr~OhLI!uc4uR)Lz$9;c zY#<)C|BSUe2B8rZHDXd6aumqh!9NhF78QZV9HRs~82I43_)bt474*7qsvHsk((cre zlN*%ypwhnpw=aNw;xRQGmA2JzcPaV6z#B>;JtkFW|c=fCfPK`7V)UK@?D z4AGy)i9wbZYoHUZC;$LC8UvsaCBPdvpNIiFxd!b=tD(5#N?c*X297KJMY!NLrlgb^ z$SEp@ad#o^xDEoSX+a&~w`%1mE$wFISR?FDmAW{T&hTyov@9)wc13-eS3SmC zZGN=qM*H_3h>1ZE0Vlnb9JDj<#=sFS$za9dTpjy#Y)%~?P^9j30v ztPza{+#>sB#7t3*3alq7`GCJYoPO*%;Y~w_g_e0=0a^E;&K34>VY=)xCm0cj-AE~e z%j9Y?N0bN%M*!j>k;Pue_eObLe3#BWWG`+rfb8AOTjW7RBrIZ%^aQI1H^;8qbbyUE ztY{R$O=;2_mGBrGNczdgCgNi39k-TdGjdRz%`A3F<;rH3GjJ6@ERdm4^<+f$I?_}( zuMm{pVZm*0l_-!c$q6tg=_d%=&Q{oCB6v3LDGp8*BeOTayB$_pDaOL6DGJK6ByTV-!)-@b zKCxIbmo>pg(m)gco{z<4Ne^OISYy&2LPYqGZ!S?R?}|v}b&llU+iM^jalx;0B~6X% z8_G6;2qsw+K-l{>SpmkUkYexL3J&iVkO3)n6h+uvEhuos!CmCwQjx)lBj>l=9m3Z; zG+gCm`!01k0nL#s;NDKL?93vNOB<3Yc#u%;h(r0U?+GYBZa)**)F3xL@>b@-*joR0 zii?~R4`$moir=?BEAi`Ykkh;7+-3ML++6#7xVbhrZEx#~-F;tlk1emiU(L_VFXip! zeAo6><=}Q(y?QTrjY#oi{0>~gbjd49ws+vh)3vBdb`cq0;mzWW4fk8ed8dCnmqxe( zm+ppR@`#;)3WR3j{v`8R#HL~m(v^PbbWq_At$;9qScM^$-Dj^mvL49+I5L`$+!i#@ zait#dQNqsV=HX`CroG3!U+-Je&pr+Cvrp#Jk0g?pxtuEtj%R*}QvPYZRdpvoVo2>e z*HZ8+G^ocI?mzwLTLr%G(c)Lil_=F|Q6!ATDW^6me}!DI&wE%W{L@Gf@6|DZMM2bdB-cNb zhf)mg>jQ}O_*^#!FNZhrP|bb+YJPaWdR>BwWi8EDuH&$6LhnVhgW@luP$(+4n8zIy ze-VWulB-Z?OeSs(457gKWr=F0k`q)(NGjydD{znVjT1$^|3RtV-{gA#gHpXCm%Y~j z2lT69J&V9?;DFy+z)oB`q=aFakk3ZDP(*GrKj*smY_y9=ZZRcPC3~g4r^|7BpQ9Z& z!5;)rAeHolBi~^qqhmAiO@GHxLiNO7;p7D;%XT9H@49`X6{Q1kUv{$XrBj=4@&k=7muOJ{06drJWkp_ zSzL09`LcuVCyQ||xuuCJX&Up=y?lMR5b+h}Tj>6wI12yn*`x5=4#>YNg+k<(M4^EX zMLfjt&opdTr&v09Ow5uxK@L5V;wz&J#u?whBrd0E2}!mc3xD3U1YeDQ;!+YJ_(0S^ zWI${tX`V8W%!Q<|*?cMr^HbLfGiqHK=BKU^W;CQQ1KrpT!fqe6$F4eYl1ZqD{b<>M zD($2>tX%hXYC<;{m9bUkbuWvu)nOG4e^^{{i+SVAtj735?AXTIkzD^UHAY-kC(TFT zTjxb^W=o=Or%cc5qC<6%eEp>*AbFy=X1(Q}UQ{}&>ip#2+A5Sa4!+-i<UA8>Jd~jf43cr5Zu5Z3HNUUgFl5Ux>gX0mABh zvmSkUm1x7>v_Gg*jgNj5q2+@4WpvTm?ziCN5QQk>5lL5a!S)-(m;XPp%BeL!%adqZ z%>h2&l#U&pc|t$^%zLtv1sB8MYuETvlX#Ynru_~JM|T7aMb{aFnaCjOswLLIPlXNO zgi^b00OB;9Uv1&EIf}dYO0@7^wt!g5eHazL>dw*O+fT=2*9lmK&bt*!`}i#=TyV@> zexrkXQU+q_2l0E{cKhmRx5_Pd;(O{?9+Hxq6Vqk4?{q;)un?&!;6eFe*M})61~n+Ve9>aZT`^>8MUEET#==d1lpngT z2fL8;_e)r)>8;_Vt@6Uyn%y<#IK>MnCm}*Jxq+;?%-eemOTamu(m4Dri zBmJs_{QwenbpoHz^|^=$KnX8VY3GqGS<+_}aUJ~|zj6nytRa_rGc-(=(2B5>4%q^$ zLP94bh{c9HL%Z@r+0Z}Y2mu#SnpQYzy7w@&>R;P^hYkr@Wl$zKwsWUl>?DUaUIPt? znZ;-j*ve_$j>nhdXjIQ*ggpq~pz*U z%u`r>1Q=5l0awz)k_$9rh4&P8oUgLN+rpBpB~cVu;cW)dQ1v4WbPK-9kUS;me=3Up z(%uWK@T7Y*s4F}~6V;0kuiCr@D~Cj5I;1hNWj{rC!gf)K2;Y*s6ZTRyHpxeiZdEyd z8+w+)^(7*R|I2dbjiD%1({Y!tF&+unM`4`>I&-u4xa#*NOr8}}}tuP=Gg&R|Mh zsVlln07tYxQ>F2**U;muw8y{w-`C?`J}P5;EnpU;NiY$dy~ShH9H!fEs#tVh$MC+O zoxP`^vkzRkGmB7rbV4pwD40McFM5^$mkscWQUN39==XKRE7Z7ganK%O&8q4Z8xVE4 z9~lvO{++-NLZ`ts`>}+O_GD?v7(F>#K(gE~4ghFGey$w6rsDMXu-p&CsVblW^Am7f zED!iyXclpPXtvQctGp<~wqQ!oE16OQ;SsRLH7uN5Sj`yowwI;&F^iuoPsyFle|{TH z&X+tZlk+nCK{8@%N+Tl~>(i6;ZeOM9ltw^dq zgt6l8Z7i)FO6Zw~_lok2<`km-VCi-}53v+{8+z;Az|vdo;pFoGH-Uu$El3zyc=40@ z@bMKGXVaieEU@vCv_2*bqN(wo*Y|J&#N7J_I|1j!-l6ddB0$5~nU-GmyYvKI2V#U6 zd~R6`m6YF#E0&TxtMg**OY$>?xgat)DEOs{R$Qb6-$UX3MSo`x%XT!J_wPo@J#drL zFl)Zx`?{FI2_3GCXl2#lC|kwFLEqqn9IYLUo?(Tw@##4fguFA7q;a~5j>y+))M0DG zC-H%TYwvT1?UNi9^m(DU)5!P#I*0uVxo(RN#R^^C0S6s^6$XJ%kPB*_M2=jCfp+z? z9hL74l1T3)Wsbpji$NK~TWP4r4$$RDExOyUQJ{(2ff#ts?YFCx$9&l#VelFSiX4FI zk;4S|@KJ;C9v6x?3sT8cyg7q#NYo}t&tMfqpdgDb2qU4vO~>$hKmtg`-q6z;d!*E1 z(_Hz@WaT!VCD0AGP@3T@porlIeZC3KMv5mqZpS$g1PN^A$!A{Rl`ub(h=)zRr^N6D zFMqAuB|PSkxa#MoBA=I=5fd{za1OBr2XyHJbplNx ztBACJA4X*cps!3`Eq3Hm%#vngL3K>NEUaI(VhlSq6Hbq~>+g5Teau_207rTuXrwf0 zA|p*8{$aybpz5mN93@Y~zB>c~#U6?~qm^lH81R1p1&^eBT(!oJaB zjR;K^54D{`eLxke4Ap+fg>~$`FzkfKLIoCp?79GsT^HaZauYXYAj%5_OE_IkiB!9o zv=Gju9URx>4{Puj7c-kbc@%3tIR}?CZ$pYQ=P}+jNbYLD0fGUO!7|>w{IP*h0H1#m z#KqU`m%BjWb#=I<_1fti-w6f)jNw$e5AUjt@PR~7?o=i~Nr|3G`$q@;11Vp&_Cn6! z<~le-c#JNG9^i>Wp7LK$bMb6hX(os>je8H7L+iPBu9CUAhsJePgFblhqH5y07^n4G z7^e;gCPf7gr!dE`xxiPg=zBvlmM{7ovs>{ze??vf3)sUc;v3-7v&rv421xd{(qzsu zL$(<>u~=5NwxoeHHUi9x2ZYYx%(t>&ALoE(k%ly&Q&~v0yOsM0XIx~#ZS*7+@~XWz zjy%wMExcN1KJ5WBz(_BQMKp$^RT+G3JRFT2MA8pr2vYREL|G-aUX``#u)HR(-6R4* zrGaC@LO!qSl+#B@tb?|k&`MN*cc!>8SgH~tC7|3f1u$tSDxfEi5_eVPJNweLD~z9Zq~~!A@s7l}hc$e-Nv6=1;to`EB@FjQQxJMW;yr-a6SHfqh{) z3^t`GNQT2)L2qK8kOeTL=UQbtu8;p3C=)IOoRTE_+jrW*8>vt^qK9q$0cYtt`9$4{ zO6@d$%+d5BwdGA4X-iQdt5${Rq9o9kdd?NodIiolH&0wiIprfQ7bvGI%M1!$dr(UiVv=dVVcr3=gBk~y(S{mFEVQ@S&x19F7L~|+v8ZrB z)e?aiN~Fod+AS4@9{c8v7KLgcKC#U<-=#Zs;C=&Ji8IC-r>{Ghd6-Z4$0olaX+FtY zb>-AN3*tZ~);)tzwdVXRan{jJe&H%*i#bIUtpN7Juqi*|rDCT0@49bbS))?V1Dl6X zLBsqp&2z=Y>y08sw0oPLu$AkR2W zZiGK)$2;7_e*2M7yZU|Q~1~%du%=L)R2hncK;Mc0V1_NDsAopo5RWSJun!=?_r=| zUMf~vG$yN#;+sHFJ? zqC9E-G^Au>-i}Z76z*63f&Hu!?kH-AnB^iT?eg==!U0>(oH7i~35N~s?sgRp6tdT1 zcf0A?=r^3UnB9#fqqPb)nvSXgpmx|vV_p|v%z+7~1Au#Y{pdKs0>WKyfJf*5iBEsV z@3eD!&_@U+TrA;CK%Ur$Uw971LWi9sX0p7)2tF?w7Iqp|b>}381{O42sSB!lVf2L= ze8#*tp}V{AVJ6ud+M2crxN1cSfyu?N<7%|~Lz<0wPL4lHh))=`C z!+~a&XT#Bw?*1NX8>Qcsh)B>sdX#3J8g~W<)r=WVmlfU}|0(+cH{MZdXD=>1!7wo! zuY`<#oTYLOh>GVD5imsN4!<+q;W_WqsyK2OUo!G?^pNtTy#sRG>l zB%B6=H4S-@Yf`(kij=|zh1xay&RKkP5FhCR-}X;$Cnk`-BX+j`0~=+0YNL$b+$iI( z?S~T@cVZxk_%#N9vQf2vyJEHfccW_VTLYzgd&X7U6&vp-gWVA#i+IJp2-{};E3#3XIWTOnAQe@ssz~C6 zRaeRVLdSH%5miL*TIuT{K5d(9@^1%m;2heZ$?4b(aLu`?QFFIt(Pj}4< zRy9``^s53q9tIr8q(!k)iU)n|jeaz^vA8s8@LR3Hu$u%IBIdY^r`qL}Xut(jCj4(d z447I$-<-A$8bwpmuC9yGl_YI7O#*B%;!5+(Zy~if5O>+}#6aXBQ|shDp$*G+7ePd{`uzp)BW4Ns#7A@F zS1)!XegolC0Mpr&NzKN=dbQOpR|RVyw-KVKJ8!$yn_tNDK|1sj!4zL>-x4ScK=TjM9r6u?o|jXaK$mX5$@zftzeROC)Q$CcjEG z<;Df>PMQzP;$F}BV=>>dUj!MSKud6WQ))7dG667C7+M{VpZUkjf^ZG-Z+mC9ZIt(#_^6#Il05?@HSh0Wcj3b2X1DuFwpe?#r&}P?@(O{hKGKe2m4&ruP(MiisNAmPaupBtmM=;*)_$^B$ z{-t&^79fcP-tZqD_V5uod&;(yb@5UDcz)U4?btIvmdG^XU$gr^p76ic){MC?m1$|g zPJD~(d7%7jSpI)`3DH1nOEcNry~_)E9Odz*7FWlzOEdRP<(B4`=J?vPyfiyMcXFiv zj5j*bGukuiEl#iXW*4R&X6|TqYNjW+C zI6Jkvmdh??(MH%bTbw{^r=}KWdsY_mJyQz{7pJBl^!nSzdQO}i^)4ZR(mT~PG&!_9 z{owe+E7{)cthX}0-i?usRg)Jm{)xc+6vGq%qgk z$zGF8+4X~qhw+}jgt6jx7U{Dqmk%FY zT{$?DIm(oU<*EF^sf+U+m!@(vNSMk^U+S33EndDWdvNiN*_G76IsAX-p{d*~e&=S; z%o(K2&H%)NtJ&%N{PNN&-e=dA4)`VQOib%+CgjD0*^qf-C`sBUqgBE)XZ5FJ-46 z6bR2m$W0h*W_j%*7+#p?OwV9nuNMtW$K156E=*m{9?WM~^B1#A)0Ymm9ct+w9-AC@ z3Gz0!Jevn1vy=B`gd6Urv>3`R&E+o%eMKjiWSw7^@m>O%gg6AWQPv1>8x9+d3jNKj z0Ej1-wVB<)?D_kX{|^A^Ds=J)~?lm79Y| zSX;L!Ulk44brGU1P;a7NgcQ7<anwEdeST%}!_M zFK4}#?DVDixl6Xt{1T@l>vfNfLfvE^VxuUru>6px=EN%1#PnK@icESO8|muf9B`1$gkn=Q4fDffSQMay1 znFOoTa?&6nnP1AZN?{rOeI(qGc}YG@YpRPzP|w&91~wxsgyvZdgB7yy)>Z(TAk~f* zInthrAVuPMZfa?D5fc)&cq&9DFit)0sMuj#+9&Sviz_hGCYLYgSRZrZnsX&x%~I(- zU1(j{%32FkOJr*@kheO%K0GzQ(7n74@>rUjonL^R=COvu+4%foc04yfHeiQJL9UNkaBH7nvnTkD=$dQhffbo~@WVK(Qc z7S$n*XDfTn`#B3M+?g(T=GH7G@;7#qtZ$r2<7 zp1`b5Pvsnqj-F`6`^Cw;lR9>AV^CmO4@3)A2#8c|ZymkUHZaSxbGa$pf8oJ=y{~Ij zaEdE2)O4O%UdpO{VvXye#{re?QI%-hLKk)!2IT^QyfC%O^^kIaGx%tA$m#)W za;jk4x~(Yi+MxvCPO7dG=$)~c=d~bWDiatk#{-;9EzB)@+3ZSgd2w1+GgyPqaKe@^ zJJbYF5j`a0$T%G&s30SrrlF0O!ePKZ2Bwx*f?o5Nuspo9yf7m}=$(h16~lVZsjktJ z*L-Hyh1x!iRC=wN{2~|p+%!NkR(&|Ih!Oq?b zmRTrUOHdc}vuXhlm6I}Q zo~=u}I|@*&BG^ypL|CxDt*6kZGO0q$8(YbOfKD%u<#SocB+=eZ8VK?5g|+47%tK4o zSI{;L1-z=3AhS?^Z94D4E}!gKc#tVhwy;9qWf+$|%WE+E#?Fml{XDk3ma|JiRynge ztpdUu8tYSHbp6ucogD6h#8tB(9En;Jqyr2W7!4u2Y6>!K}?5YiIbBT z*I@C?FHJ6H!2@~kED9Zt73v!4ZtFX(-EnnRfCq)AZ`d22AYR%u7cXL!N>PqTT~-)r z6cv+#$wG4@sOIoBG}a%(0L~fHL+G8%E`cx>sHK8=3aXcyW~_7^8l_3sg`Gq2Q_zk8 z?&jH*vz7bSCv|pub%AN6cy}*WuczYBs*1D=Ek|Vz3PIl3P#07@5q~6xc#E{cd5iQwgv8^GtU)bf zTp4nraMaLHbXLaX0KW8YsS_Txp1|%oJJub83=}MU3 zuJZ(JfCl~u*xib;GhL$@4}aQ%p+R0^8oCCUp$}OB?$qVn!^3b^&dK(WrbfqZAs+7< z9-&c!zfzHZgwpAU4#2ZukeWR(H4!4E31Zvi_?U$lLv9NYjrDc}r)Pl}J8m>!u{Y{^ zRl!QY1q0)wCntN(3=6XE(w;b{r|<3WnS|jhXc)c68@rcUSo2SeoYe<*WXDG6+%Wrx zk52Y>6~JkyCW;i>S#;>O0rn397xE_gcVX*cF+>99G-HV)TG@^mgR-P4WNNV)3<=vD z!BU@zz($0bM(*v6p`dTcVSpoa-DWSY!IFT@2a8rFhdepf)2A=dQCe6i)1)B#vrwWlm`U!MU&z5lUf7%vCwe!KW3*S(t-eV z3OiB}T8e@Z>C>XkNuYpu9qL0aSK}||ogQ|ZcF@R#dTCmmFufL+f%ntWJdtFDfNKIY z7?g5&#L!%J3Ar|(r%1E1%ase5#U)sDxL5GAGIQ8jfD>0{Wnp2F`g(Zy#HfdtRW1S;?RAETW!i5eu!B|hXl@QGD>gPr} zoH}qeNvldiBWL@2J?yS>Z$*s+EYU=@#oy10N0@pi(m%$42D{inH=l@FxX7@jeQ!1= zE=s0wvfyfaiPOw{FXSZksfVBa|fW4ym-aPq`x-#y^?Q|F~pOJi%R*jAbe z8nZRSc?=M3a~xsV;f?m)3#zN{I4_Na~Zh<+T+q zR&3k7(zg4a(%AU$p|%sak_!H6x9uVuQU&%61c6#ZQ8+1NKu`^Vv%&dn}NVZ)4_v!LqR6L45zOJOy1v8sC}+GOCw zZtYoKTv^CsU()S5s;5??Q*vu7`LKC$e$xx8pyp;Xw*OgJoeSaz&&EOOUlq2n4x+rv z4*G}B#z8-teF=7S^HM%cRKM{FNW1{T+-z%X;IczFzHVFaxbLFyxVD4-+6p%l?IwjK z)4bh~vRgK?{WHH3gC$b{i|Zh^10&NK0PG6M(27zm-@8JO)!h?T(+`ug| zyD;S#AWR$=IEaE_wH6Kwu}k#SW9uaVDoAN7qT{00GDSuD8HPos#9q&d`7C^{D^O1G z35JH+q?)4X6sg#n=> z`Nf`({K8Q|V;fQ(<0?Q3_Rv=)lY4v1ODg$od|Cf$&lI+31s%5Ih$$b8onY%ekQ=!Q z-Uy7`+`Y^o59vzO*J+91^17y{L9cKFxP44F9Nm48_zT33jCDJVL}sr*o;wU$>15%J zqBH=QO@shnFU3n}7KpyTt9#S|Rfqz(D*>+n)VD;>doZj0J@CektzC2pf_*92n=L3v zSRK6uLdGJ$Zyo#ZXhdhsQCL6r3A9f^uOpO#p^_LJ$l;2_0VC)fhu)$lUFG};xfakq z92DyJvr?8(7T!u^L;>Y%0fn(7i5JWs$x|V6@ByV8PGwMaRJS`b9xN2{?-=%1lwO^+ zZs8Q)0;3*A$H%O5Ns@-(xM4Ck9>k@W@woD#34C9FA4>8qa3gV6q#E7ItOgkl{fU4_ z8KGoJg<#5p8sp1z2n%7I6M!IAJR(u%mu--RIQ&nX4EiSEUf(c4>gON!weCTI%u6KC zbrP|B{129lAVWqfPQd$MNS|36ojBch0=CH6rTqK?O@!q&HLqobsO~uDy<)hL42F5K z!9O{ceaU3WY*he-(XCj{u69j7xU~GxLUx88oq7Dm8nmuI=_&#Od}fm{oCql`D$D^h z5y~-zy+l6hXvW6RjBGd>5Sf_l%MUHV$J-{mWZ_6`4{%ye=Q1k3IG+(13dRaxP_%!X zy{+;wBVYhSGIIAKSh8bcOcP7C$&gW!W~ADOuBU0uX7-)f!@) z#!^AZl*{U0?S(URI!hXUIEL!@cw8N7MXjs9`Lf=mhDgUO1Lo*SQqT&czlN9D1Mh7Bk?6|s`CPDWT~K0oVd zpDQwY+&QK3i43vEKv^u4U=VY4;!J)Et}dq>h!~%4dJsHJ5vstk;c`{MhPN&VfR6r%FAd^oH$Xj5;VfWD)eqrV^tj_ z(N_D!>*l;jc`kK8z%vNkl!!?y8bToufTKOxF?*m9aX5*znqQ5hGY+%^Oc7MbUIlr9 z{I`JUOk$^eDvt@rs`$YGAjt~k0Mw}kh%z9ji%4&kfn$)*IU%x{>}5W~Y785JCI}sP z4iu%|kfvR_DSO4pn`%ViT;Uow4G98G}2Z~OY5D^vusT7PUyEtBYu0ob#d5&eAQ&c!5C=?%$5>Y{C ziUFJUW9?hHE8T>Hk^?Gs zP_7lk1;@|Bxva>PJDnkY^)1beu8*$^Q1q7}aF=}m1QnX`4(}!sU88EIvxqiBwHj$e z@h&xNo1^Qxrg84p{5qZx90}jk=(-3%S5TuDVq=apSO5Ywy`5N?!LvdHd9KODU~om@ zA}z)b=_N3o**QzG+dz^r5&XTH9bJc;LiGyMC@TV6jR`umXjS$MOlnSmwWuDQhldI4 zFZ4=-S_9Vtc&$S=THfUqsvP!CbBl(Sz*Mjjh37Cptx}CliR)U=@Y$F-G!*5QDIPwV z=9-ILSh|eUBa$6WUm;7TlGvuZp9^HR7$su9TRe{!Vj3NcOs(Nq*osc_-2p1cizk%L z$V}Mjn$4{vEI&w%HC;l{vuJEQ&XQynrad$#nBb-dG{{$CBSz(J(vSrYBzBJi_#;a^ zTUWf!d=^w#X!$PlizxEq`E|`Zpb4!mEF3_Bk26aOw=l&TrKEgOL_UOv_(~kF>>5k8 zr4PL*-HJ$iNV8xY7DtzB@ZU4|hYO@$T3fT(+sX6H`1kpQSGgU(UA5(}PjuC8Jy}~W zWhE1TSnp>0^2aFqdwA}ut$e&pN|#-#tqk)&T;^3iP>`QvcF@;u<5dnxzV>x7)>k?5 z*q{4X>fOQe0NQ#K1-oi%9yd=2G&?acuijSv3*>K={K{7%H%R|hEIrKcDm}_X=E&HqOX+Qv}NX`wD&o+G#Bt zudc1^+JrR16sJvo^Yd@e=D(9VTOTif!n}&}co^@@Tdz?3_SWuvW%6TyjownSYQSP;P20V`^pYUH*{%Z3YTY7WFQg!W4 zlrPF8^lXjS$vrt-H6zt2~8vFo-}7IQSNj7lqHI{|?gIrOw84@ilyTYU^gN@?WK# z%zbOwVs&jfh=zD%eod{DL5^ofg1KV;5b`NQUHSX*-lqMkOibM?cqblM{z>HjqvVHU ziO)$2`Rhr~dwh#m`BPff&2Lw2YuU+KbjbEtCbiY8yi>{u{5wZLyM%>#L&&>Z@+|B- zLs+DJ}rpB!dW!}e14V;UD9QY>p7jG00%#X{I_X6i}PZ6Nm##7;dzJayvkNBJ6?-l_QCWSq(}NV zFlhU5^-xUYqZ{L1TkmVA_YFLE)z*g+wyXB|>FU~g3hroqOQ#|mT)&^Lcl0Y`E7`Bk zZ)rN_ocwI1=N)M9DkVkd8awwPbA6)t3UVITCZyp@y-0)POtKQJV$k<%R{nvQS$=*63yd0bt@f> z)Ow%&B5~(n*pFwFn4MZof}QqJ1tc#gI?6nX#k8&#h~^Vw(o zowUoo{uSj1fQLbghbJr^VDx?Vb0zAzc23-+^zYtL)Qk4>0P-Ebv7d$5`%>(ECH9_+ zz2{@^>@V8>fAUV--kbl6>c;FZ;nS3Obrs)|=9U*rE+ z`D@MVXk$h3a3^4kzL&?|Q}#Vh+wCL*{9~W2&-X9fqI~b(T|Q}u`TvM~T@yhcAkC$- zTx6{jw8!*l`-gYyJi2-lcu%2BR35RPb)=JbTsb^?lqo0|tOXtXP~}0ogZs^>Prh*P zcoh1+()$m`%2TG0CtN>#j`C-;Ey5aokB%8xqQ|e4pNiEdt!*@RwiBI8)}<1A8e@hp z05BHl`c&ChYwHP*C_4PspiE!1OxYvkKCHNO46YoeLB_=Q$5UQqb>tn7-ZuP4oVfC7 zJY#;wswvp;OgLSh8;^S@zT8~K$HVuppwHK%&n7&x559j8?{{lG%Fy$apsp;Ey*&Pl zzOTgIcjKM?vaP>BTR(&6_!`so^_oVn@?Oag*8{HZAKSdxx=!evZ69v(Dqo7av3#r& zr?BYj-o&|(@u1v#$#Op|wn zM2IjE!O;eJV1T5AaRLd5g)&1vAa*8b5+y*$%Oo?9ugMHE6O*YRp(HGzw4@a(1z9T# zqbs#RgW{43VWmqbPywM8OI@Ydifvdd6lmJQDwh8K=bU}tzIWcBthN^>@BPo-XP@tn zd(M7)8=p_>)py9p!4l2d@8OfPNxMUxO&hzq=q>Ki!;Y9n3mX518QG-0@5KLD_X z=6N6fal$W%^HA3A__y(WfjbXg6UHW|7!N=4l=@OQCx*w%(sW^IOm?y~_m#09H%mjj z;`@!|yHQ-9=I_Nc^LICkr!~g%;`y~#weWJDe0}c>e8u)E^Lx2#qTG;=GT*z!UT#{; z^SzdpZ&GOQ_|EFFrI6E)MN@q?j%^ZbrxY@igtcJc0;+;x;ziIisguK(1W7>Ya@O9(x ze<+6M@AD>K`&r+1WjrC#{T@*KlMy)el=vQLcnf%0;ul@dQvQr?SmieQOukdT3$_1i z5Y9VhjPKJ|U${BRKN#ZI$JOjadz!qoQyAWx-Mm@(Wpivo4exYC@QKj2YEzTh6=ddp zWco_(iBtxoi+5anTHKGRT;jh9thLYOqj{g@AoEIrAx@jPC*&(D7NJwCgH zHQ#tSRj|odJYUzsZ~O-T@JNpOw(zvsoR=b~y#KGXG#w$?KHg4nl|PfSwW4@={kB)W z(?ku&I6iHS$q_1h*%`cR@O_;9-(^QsJ|Jn2!M9DPu9mD%WO6O$*8><7TM zcOD3{#aMog1B*YC?`iM6SnSgs4YShF#_TnwH@_bD8r8%r*UtYKc*orDg#E9j^)>o) zLwSD{<@s{$MYhT3Ylf>L=GF<@nwmEp77nGf+$x+ulm8aqtv~uQ&L(bo4{UK}lJD_o zx0d2nU0T}r=j~E$e!$-`nryA7zD&YCUkkuKZO^NAeYe=xh2Dd$F3NKLulcP1kz^L% zM{V6=8_lxi(^LPleEmA%9g#m@$ETb%cgG3;_&DL|Tq)m+Sbk1$ z{8heN_+SXn=d#u-(|*GDkH}MBqdYB^r%v;-TYcYbZT_6~O<&(S7qNCI_Yck0md}-O z4A`Q_`9SmM!z2ceZ}(e+yu3VBZrCP!`i_{M+EMe|{PH};l3VES+CTiStw}f5U_o-j zhnY3YDj5alxd9y%ec~inAK6=&*4Jl+|Mbi}$FOqBJzb8upo~vdAC*icszc^_2Qk$&N}j6vHNDuf6>NzSiFO$!js>wYQJsi(D5(+?;6)bUCbfaDl_8gI73w zCioJE=Ylsnd?8q_4*1|{&Xk_Vmw^WzeI?i)<##>c#Y9I>DaKFjEqR}Zeq+MTV9DF* z=<4g%o=vo;=+^%7^sv+6Cb06i$HjjXd{0UKgO2{U&>5>$KB(&`-};+02L6F?!%bkN zZ~4g*zr`2+F9}MI%CG!9=F$_E&Q)ZI^&uTAkEK)PvGk%mmL8PH(tq+;dQKiougPQS zF?lS#CBrJ;N{5wS=_eUocxwqukI2)dH)L4yW~TbJ`a0F&BjXeh*sZ>#BV_TFp7eq| zmcEb2%x?uO{T)x2-i~4Ar^{iFpR@xQafEVaYq&VbMDr7Ja|N$5Y;R zL}(^ce-pp-aQNVf{a^F|Q~#Rn@F@-IOZqvHKgM5*E{$Qymwt|63bZW zLwZ-a{OVnK8CVgN|ApX{V68t^9_jg*Jjs`Ck71?16dfJIi;3Sse66>Ne<}E5V3RL? zVLo```0OZQu*$dGVbP@{bXlDe+4u z%J>z3c?nAg%IK2E-F^XIh2E2=OMb+$zLh_ZzvAL6y{|faC;79-`kVBsVpwx_H}vgE z&&t-zR`i*SE_qdlmEQ{-7F~K)#xMF-hehA!u;}+WEc*Qpi+;di(WP(22Txqzq;F;T z8|42ra7UoV_MDC$mC+SndRT@ZfPYrfzq0afarBU1hgoa0?Ir#v99{g<+cNpj!vFW+ zE&@#cRP?iqE`I5Ac`W@c!z%wYbgB&hGx9oUZyTSY3rBkF59r($@a_^mSi&96b^ce7 zZ;$m4>4?R!Sf48$R{o_c=IPHlEV^{UJbf=ZUWP^A?{FwDxeR zx65Pcc6lt_E{~<#<*{_TJeF>k$I|WcSh`&vOQ*}Q^55lfON0DNx6AXdEMa>;(T-j6 zXzOa^pO}55fjsGOd3n1WR{cnq%hR8BSaj)hdHRbEi!L26Pe16e=+fQt^r`48dCWU$ zHR6e(JZoHkJH0`9r0-<$C11Ks9!q!0W9bihEFB?_r32)#bbCCOE|163+Z&Wm zdMKWM1YHZmk|$jf!*?`@|A&tLb?CQ%PauMoS9%~8e;@RF!R#4xx^z2?{xtNLz&jmX zx*bM80R2X=&elx6^gE1xC`S@6l<3m$F!~A5=Old(Yrj2?uJZ16_$>JE1#d~|h57X( zb$Q~KzK6-b5dIn9PbPlRrSoC*jnGHI?Ah}COV7jT;+L+5VWl?@T@1sbOE<%?==;$P zFf6)s1w586fMM~so>IquKz{78^+9)1F)a31-ANhV)qr33L`IkV``hYR`PuKV=(}eX z>GwG-`dbbwK1wYG`MnN{uKOXesYVsQg?p6%6P|pI;kX`5b@=`U<vXdLL~9EB@ge;cjPs)=8}B$AV{YzSNQMiC`~pb_st1Z0)J^7lY4q z`RxJU#(B<7N!~i}3`hSgc$D(%JVWW<2)6capxStwD*xez2^wGg7vgH^G}-|2vwF!~fM-e-lH; z8*Ys{4wBafah7Y(PVmndKUexr?=4`Ss{UyqKi8D_Zz2^`}Cg&pUZjdo)rH-z*oBR9>W#I8sf+LIW#*KeB%4! zenIlv!8(u8c$fS$z<ElH-qUBO?@IO<*zT7!UY`O#$@rHptoZ*0?9+Q2+|Pb#Z=$zw#dH?s z(R{4&@nNv%|0sBr{m-(Lem8h>p5KYtGVs0h_i2gV13sSit0ue|{5jX&UjTdgUj|>} z=-(^Re^kQ10G|)Pr8k+(?8@_VXm$+P%bx-M3)UOXutR;!DbW{|aIJ*5fPMXLE75N) z;V*-~!+5m%+5@Iq!=v@!ff7Gwr{O+JESi5`1Ru%zp!QY!y$;s=Z0((K<>$-yK`>7> z_P2@I$tC*P;8(cMxH-vN0KS^_f;lf>hHnCYiu}w=@&6S3rdtob z2Hxb_@2|nye_DQ@2M;*9t|)!}j{+}bzi<8ZH%s*225)!mhgMwnGV_(qcPqfJ(Eq5W z(0|vJ;`2*_tP{G`=dIx1PxYz#y%T(@o3HNy-^KiPdn)fY!M|jD>o-E;e-wNv`%me> z2)_V6-NkXMTP$rB?$V=f=lIFnv3pKj|xl z__u*|-r1Y-b0_#>*5hiD_f7D1)VF@yr1p3Od_3n%U8%kQ2Au88#LoC^%6<%cm*}4d_p`p+`gt?>TK10^QXU9`< zGZWqoeir_-6TTPR$NP%S$KM6B7Uccqdtjgc=fK0RKHezNryRw6Lwc6}abO>xv+x4W z8tJ7BWakYGj4bZ#&ZdoIa>zG#U~p9Cc!F(d1<2C*C4EB!tFX@(Fis>evx$|*%VnY` zISQPH2R`{`#RX;C049IuUx0sx&hGiO^XB6Yu~s9fcc6AfaGqN0#g5u=4NuY;j+BFe z``)%$jXCh}yK!x;XK1Krw1(@vp;7F|_w@JGdN=j=k7fg_)?pwKgD^ELX63=bnP4GK zBNx;$tbs#j#K{RF_Rq1WRdDOsOTDz6mOOg4oo-)d1<%YWTER&o=H+m|gbT^&%drn0 z?;SC^1|=~011mVs^B&#!jzKp3_-ScCbd=)!`827A`$JqT8sbFHXZhf^794wF4PVr#zZcLa9uy{qb7+P=xW#&`ylKPIWzBRfpif&Y+m(wx6hGeoz{tt>i zA+V*{TktLF{f|1gVU`a`31h&SxDTeaf@_7~JEM`uhPtOE6O=57n@3*EhGmlUdG@qC+Q(WA@Sw7yR@pXTi96=-@J9uKK24vgGN?VijGJS!iu|t){|EM)&a- zWx<=}iGFVPyfHqV(nKILjWVTNqXVz)-NJm{8_cl>=TIg@Sxfd8$C$d*m|Cb=PfX?s z%zO^BoS5I>tcK5&EhAZNSc_J4>pL`(JH!pqL-B*K=pPU+4ePmhF8<5_j*YLt`H3i} zDSq$j%&zuD zcQ<2vZd+`V{ps8bq~*j)y#|+3^mfY(R)|R^#k6etjuD(18o^`*ryGo^MFS&iFJHSlIB#|S$f-jda~9^Q zFpnpn*}gi1pFb0y`*^efpOHeL;%uNfqoz5kFxzXUccx!)PP2Nw27g%JaHusHmp7k_ zLLuk%T^@XfS|(_M&fZnb1xvaHHkbVAjq!PDk!+-B?jH^-QtnF9ST+R*c{VL6*I~|0 zJ5g12d7;l;n$Y_t*w5U>j-tLVvzo>AsW7jU9Ak}Rkh&OUj6)?YQON_O6)PVT(Wt$3 zS?^ocShe{{eL^J)W3@cbYR-`3IYvQYjvC)}W87BCyF|&gV(wu#%|-Z3OEZP?ti5V^ zoOv&hzApxsmsSe0K7c`QD?q)<(-w;@kQUndBvmwI>-%9rZYrVc%BtWh?-#kaJ1yD_IK5)9EG5;g38$){VkPb33E(gf37wtOc&0psud$Oyv#APZ45gV zOC!$M?G2o&xdb~m4sT{-5>~xJ$s|P+Mcu@C-tEFB#WpBc)CMo#_!*8dI1>qr1(9gd z+;F*@V+sR&taHG)ySzDxPU(;5@lJroGqoH6Zo?hA3xwyNnXJlk(?W#@eMzb~!&BEJ5 zTd#cN@;-g}020FYo>i+joioI4b_0Hch?1yS?ACitf}SU3Y2AQ{lxM4#4@;Ik55RUT*_Ge4e1fr$=e&S;rr;1_R(9$!j;j zr}62xqxx>N4*1S0@riz2;xp1Hd^fh6l)AiIN_@?;D%l=YetIm%U10kz($`m1vL&vA z810@C-=t?M*$uiZOOMsdgJ6pz(vIi3q~fmF9-}=$fPEM3_J8G9i~nX^b=q@@&+6sw zA5X}Jbts=6$EZgLz<1LC3PVPOW?%mY%e{Pn literal 0 HcmV?d00001 diff --git a/BMS_Testbench/BMS_Software_V1/build/ams-slave-23.hex b/BMS_Testbench/BMS_Software_V1/build/ams-slave-23.hex new file mode 100644 index 0000000..41f9d3d --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/ams-slave-23.hex @@ -0,0 +1,986 @@ +:020000040800F2 +:1000000000A00020393C0008291500082B15000825 +:100010002D1500082F1500083115000800000000FC +:100020000000000000000000000000003315000880 +:1000300035150008000000003715000839150008C4 +:10004000893C0008893C0008893C0008893C00087C +:10005000893C0008893C0008893C0008893C00086C +:10006000893C0008893C0008893C0008893C00085C +:10007000893C0008893C0008893C0008893C00084C +:10008000893C0008893C0008893C0008893C00083C +:1000900041150008893C0008893C0008893C00089B +:1000A000893C0008893C0008893C0008893C00081C +:1000B000893C0008893C0008893C0008893C00080C +:1000C000893C0008893C0008893C0008893C0008FC +:1000D000893C0008893C0008893C0008893C0008EC +:1000E000893C0008893C0008893C000800000000A9 +:1000F0000000000000000000000000000000000000 +:10010000000000000000000000000000893C000822 +:10011000893C0008893C0008893C00080000000078 +:10012000893C0008893C0008893C0008893C00089B +:10013000893C0008000000000000000000000000F2 +:10014000893C0008893C0008000000000000000015 +:10015000000000000000000000000000000000009F +:100160000000000000000000893C0008893C0008F5 +:10017000893C0008000000000000000000000000B2 +:0801800000000000893C0008AA +:1001880010B5054C237833B9044B13B10448AFF3C9 +:1001980000800123237010BD100000200000000023 +:1001A800E43C000808B5034B1BB103490348AFF30F +:1001B800008008BD0000000014000020E43C000896 +:1001C80000B583B006226946022000F0B5FB002086 +:1001D80003B05DF804FB10B582B0044600220DF1AF +:1001E80007014FF49C6000F051FB052000F0E6FB8E +:1001F800062269460C2000F09FFB9DF800309DF810 +:10020800012043EA0223A3849DF802309DF80320CD +:1002180043EA0223E3849DF804309DF8052043EA6D +:1002280002232385062269460E2000F085FB9DF8EF +:1002380000309DF8012043EA022363859DF80230CF +:100248009DF8032043EA0223A3859DF804309DF816 +:10025800052043EA0223A4F84030062269460D200F +:1002680000F06AFB9DF800309DF8012043EA022364 +:10027800E3859DF802309DF8032043EA0223238694 +:100288009DF804309DF8052043EA02236386062280 +:1002980069460F2000F050FB9DF800309DF80120C2 +:1002A80043EA0223A386002002B010BD10B582B035 +:1002B8000446062269464FF49D6000F0E7FA0520DF +:1002C80000F07CFB06226946102000F035FB9DF803 +:1002D80000309DF8012043EA0223E3879DF80230AD +:1002E8009DF8032043EA022323879DF804309DF8F4 +:1002F800052043EA0223638706226946122000F09C +:100308001BFB9DF800309DF8012043EA0223A387D8 +:10031800002002B010BD00B583B006226946022055 +:1003280000F00AFB9DF8003063F007038DF80030F9 +:1003380006226946012000F0A9FA0622694626200D +:1003480000F0FAFA9DF8003043F00F038DF8003002 +:1003580006226946242000F099FA002003B05DF8CF +:1003680004FB30B583B0044606226946022000F03B +:10037800E3FA8DF804409DF8053003F0F0038DF89A +:100388000530C4F30725C4F3032213438DF8053061 +:1003980006226946012000F079FA062269462620DD +:1003A80000F0CAFA9DF8003003F00F038DF8003012 +:1003B80005F0F0052B438DF800309DF8013003F06F +:1003C800FC038DF80130C4F3014423438DF8013058 +:1003D80006226946242000F059FA002003B030BDF7 +:1003E80008B500221146292000F050FA002008BD67 +:1003F80008B500221146282000F048FA002008BD60 +:1004080010B582B0044606226946022000F094FA2C +:100418008DF801409DF8023003F0F003C4F3032483 +:1004280023438DF8023006226946012000F02EFA97 +:10043800002002B010BD10B582B0044606226946FD +:10044800122000F079FA9DF802C09DF803304CEABA +:10045800032C9DF804304CEA034C0022A265E265A7 +:1004680013E05300591C2CFA01F101F001012CFA98 +:1004780003F303F00103A06D91400843A065E16D0B +:1004880093401943E1650132D2B20B2AE9D9062219 +:1004980069460F2000F050FA9DF804C09DF8053019 +:1004A8004CEA032C0021052918D84B005A1C2CFAB9 +:1004B80002F202F001022CFA03F303F00103A06D2B +:1004C80001F10C0E02FA0EF21043A065E26D03FA78 +:1004D8000EF31A43E2650131C9B2E4E7002002B025 +:1004E80010BD10B582B0044606226946022000F00D +:1004F80023FA9DF8023003F00F038DF80230E2B2C0 +:1005080043EA02138DF80230C4F307148DF8034050 +:1005180006226946012000F0B9F9002002B010BD9A +:1005280038B50D46144600F07FF90B4B1D700B4B88 +:100538001C70FFF745FEFFF75BFF40F64120FFF711 +:10054800D0FF40F21A60FFF75BFF4FF6FF70FFF72E +:10055800E2FE002038BD00BF2D0000202C00002046 +:1005680000B583B00022694640F2127000F08EF99F +:10057800002003B05DF804FB0020704710B582B07E +:10058800044606226946042000F0D6F99DF800309A +:100598009DF8012043EA022323809DF802309DF84C +:1005A800032043EA022363809DF804309DF8052068 +:1005B80043EA0223A38006226946104600F0BCF9EC +:1005C8009DF800309DF8012043EA0223E3809DF85E +:1005D80002309DF8032043EA022323819DF804306A +:1005E8009DF8052043EA0223638106226946082014 +:1005F80000F0A2F99DF800309DF8012043EA02239B +:10060800A3819DF802309DF8032043EA0223E38189 +:100618009DF804309DF8052043EA02232382062230 +:1006280069460A2000F088F99DF800309DF80120FD +:1006380043EA022363829DF802309DF8032043EACF +:100648000223A3829DF804309DF8052043EA022383 +:10065800E38206226946092000F06EF99DF8003011 +:100668009DF8012043EA022323839DF802309DF878 +:10067800032043EA022363839DF804309DF8052094 +:1006880043EA0223A383062269460B2000F054F9AB +:100698009DF800309DF8012043EA0223E3839DF88A +:1006A80002309DF8032043EA022323849DF8043096 +:1006B8009DF8052043EA02236384002002B010BDA0 +:1006C80010B582B00446002269464FF4587000F015 +:1006D800DDF8052000F072F92046FFF74FFF0020F3 +:1006E80002B010BD70B5C0F3803282EAD11319464A +:1006F800C0F380025A40C0F3C00C83EA0C0CC0F36C +:10070800801E83EA0E0EC0F3C0145C40C0F340257F +:100718005D40C0F340365E40400000F4005343EAB9 +:10072800863300F4805633431BB200F4006633432B +:1007380043EA852300F400752B431BB243EA0423E4 +:1007480043EACE1300F0400423431BB200F0200418 +:10075800234343EA0C1343EAC20300F004021343A1 +:100768001BB200F0020003439BB241EA030070BDD4 +:1007780002290FD801207047E95DA140C9B2FFF7EF +:10078800B1FF0134072CF7DD0137B31EBB4207DD8B +:100798000024F7E7F8B505460E4600271020F4E7D1 +:1007A800C209EA544300013EAB550020F8BD0329B5 +:1007B80025D9F8B505460E460027102008E0E95D62 +:1007C800A140C9B2FFF78EFF0134072CF7DD0137CE +:1007D800B31EBB4201DD0024F7E7C0F3C712430094 +:1007E800DBB2A91911F8021C914201D00120F8BD11 +:1007F800354415F8012C9A4203D00120F7E7FF2071 +:1008080070470020F3E708B5002210214FF0904010 +:1008180001F034FC08BD08B5012210214FF09040CA +:1008280001F02CFC08BD000010B50446FFF7EBFFF3 +:10083800012000F0DDFEFFF7EEFF024B1C600020F8 +:1008480010BD00BF3400002090B585B002AF0B4644 +:10085800CA1D02F4FC72ADEB020D6A460A4C4FF455 +:100868007A7142F8081B0146206803F072F80023E9 +:100878007B6023681B68DA687A609B687B607B68AA +:100888000C37BD4690BD00BF340000202DE9F04173 +:1008980082B000AF7AB30D461446E84602F10D0364 +:1008A80003F4FC73ADEB030D6E46030A8DF80030BC +:1008B8008DF8010004216846FFF75AFF002304E081 +:1008C8001A1DE95CB1540133DBB2A342F8D3A11C71 +:1008D800C9B2301DFFF74CFFFFF795FFA11DC9B244 +:1008E8003046FFF7B1FFFFF796FFC54600200837EF +:1008F800BD46BDE8F081030A3B7178710421781880 +:10090800FFF736FFFFF77FFF04217818FFF79CFFFA +:10091800FFF781FFEAE7000000B583B013464FF404 +:100928007A72009202460348006803F012F803B096 +:100938005DF804FB340000202DE9F84300AF0E46B3 +:10094800144602F1060902F10D0303F4FC73ADEB42 +:10095800030DE846ADEB030D6D46030A88F8003039 +:1009680088F8010004214046FFF702FFFFF74BFF1C +:100978005FFA89F241466846FFF7CEFFFFF74BFF63 +:10098800002304E01A1DAA5CF2540133DBB2A3422F +:10099800F8D3A11CC9B2281DFFF709FF30B1064AD8 +:1009A8001368591C1160642B03DC0120BD46BDE8A7 +:1009B800F88300F097FBF9E73000002008B500F055 +:1009C80017FE08BD10B58AB00C46204B186000F021 +:1009D8004CFF40BB01220892002305930493402159 +:1009E8000091019302930393069307920993694632 +:1009F800164B186800F0B6FEF8B9059B013305934D +:100A08004FF4007300930023019369460F4B186855 +:100A180000F0A8FEA0B902210C4B186801F08FF86D +:100A280088B90AB010BD094B1C60204600F01DFFB4 +:100A38000028CFD000F056FBCCE700F053FBDCE7F2 +:100A480000F050FBE7E700F04DFBEAE780000020EC +:100A5800054B01221A60002303E0C85C034AD05406 +:100A68000133072BF9DD70478C000020840000203B +:100A780010B504460B4B01221A600B4B0B4A0021A0 +:100A880000F0B8FF30B90A4B1B68A34205D000F04C +:100A980029FB10BD00F026FBF5E703490348FFF7E3 +:100AA800D7FFF6E77C0000205800002060000020F7 +:100AB8008000002070B506460D46144600F092FDF1 +:100AC800044400F08FFDA04206D2304600F079FFC2 +:100AD800A842F6D3002000E0032070BD10B582B014 +:100AE8001A4B00249C6008221A61DC601C751AE00D +:100AF80000225900164800F813200131120A425406 +:100B08000133032B07DC03EB8402102AF0DC1149C4 +:100B180031F81220EDE70A2201210F4B1868FFF780 +:100B2800C9FF40B10134042C0DDC44F4C063074A0A +:100B380013600023E5E701AB054A0449064800684D +:100B480000F0C1FEEEE702B010BD00BF400000207B +:100B580038000020B00000208000002008B50F4BAE +:100B68001B78012B11D00E4B1A780E4B1978FFF712 +:100B7800D7FC0D4B40F641221A800C4B40F21A620A +:100B88001A800B4B01221A7008BD074B1888FFF713 +:100B9800A8FC064B1888FFF733FCF2E79C000020FE +:100BA8009600002000000020980000209A000020F5 +:100BB8009500002010B5FFF703FB144B1888FFF7CA +:100BC80090FC134B1888FFF71BFC4FF6FF70FFF7DC +:100BD800A2FBFFF7C5FC0F4C2046FFF771FD20462E +:100BE800FFF764FB2046FFF7F6FA2046FFF723FCE1 +:100BF800A36DE26D134303D0FFF7FAFB002010BD8D +:100C0800054B01221A70FFF7B7FCF5E798000020A2 +:100C18009A000020B00000209500002038B50D4C47 +:100C28000D4D2B68236000F0DDFC2860226890429F +:100C38000ED20A498B8C098D5B1A801A00FB03F3CC +:100C480007490A684868D21840F100000A604860FD +:100C5800002038BDA4000020A0000020B000002023 +:100C6800A800002010B5FFF7ABFA134B1888FFF760 +:100C780038FC124B1888FFF7C3FB4FF6FF70FFF7DD +:100C88004AFBFFF76DFC0E4C2046FFF719FD204686 +:100C9800FFF70CFB2046FFF79EFA2046FFF7CBFB39 +:100CA800FFF7BCFF0748084B1860FFF75AFB6420A2 +:100CB800FFF796FB002010BD980000209A00002046 +:100CC800B0000020FFFF01009000002008B50C4B89 +:100CD8001B780C4A1278934201D00A4A1370032BEE +:100CE80007D0052B08D0012B00D008BDFFF7BAFFAD +:100CF800FBE7FFF7B7FFF8E7FFF75CFFF5E700BF93 +:100D0800950000209400002000B58BB03B4A0023DA +:100D1800936008211161D36013750EE030F813C099 +:100D28005A0002F1290169444FEA1C2E01F818EC17 +:100D380028326A4402F818CC01330B2BEEDD00236D +:100D480007E003F128026A4412F8181C02F8201C74 +:100D58000133072BF5DD0A220121294B1868FFF71B +:100D6800A9FE10B10823002213E001AB02AA23490F +:100D78002348006800F0A7FDF4E703F1280169445F +:100D880011F8180C02F12801694401F8200C01320D +:100D980001330F2BF1DD0A220121194B1868FFF7E7 +:100DA80089FE10B11023002213E001AB02AA1349F7 +:100DB8001348006800F087FDF4E703F1280169444F +:100DC80011F8180C02F12801694401F8200C0132CD +:100DD8000133172BF1DD0A220121094B1868FFF7AF +:100DE80069FE10B10BB05DF804FB01AB02AA034920 +:100DF8000348006800F067FDF4E700BF2801002001 +:100E08008000002010B582B004460C4B0021996088 +:100E180008221A61D96019750A220121084B18683D +:100E2800FFF748FE08B102B010BD01AB22460349E6 +:100E38000348006800F047FDF5E700BF10010020F7 +:100E480080000020002302E0002202700133072BFB +:100E5800FADD704710B586B0002400E001340B2C91 +:100E68000CDC0DEB4401204600F0ECF80028F5D02E +:100E7800204600F0D1F800F0B5FBEFE76846FFF731 +:100E880043FF06B010BD000038B505460378013BA6 +:100E9800042B0AD8DFE803F0030D161D4800642070 +:100EA80000F0A6FB2846FFF7ADFF2846FFF7CAFF6C +:100EB80038BD642000F09CFB2E48FFF75FFBFFF76E +:100EC8000DFEF2E74FF47A7000F092FBFFF7C2FFD5 +:100ED800EBE74FF47A7000F08BFB012406E0422127 +:100EE80004EB440000F0E4F80134A4B2082C07D85D +:100EF800042CF4D0692104EB440000F0D9F8F3E79E +:100F08004FF47A7000F074FB0124082C08D804EB25 +:100F1800440000F0B3F8631EE8540134A4B2F4E7C7 +:100F28002846FFF76FFFC0E74FF47A7000F060FBC8 +:100F380000240BE00120A040FFF713FA0A20FFF776 +:100F48004FFA4FF47A7000F053FB0134102CF1DDA6 +:100F58004FF47A7000F04CFB0748FFF702FA0A20BA +:100F6800FFF73EFA4FF47A7000F042FBFFF740FAC1 +:100F78009BE700BFB0000020FFFF010070B588B0FC +:100F8800002403940494059406940794204B5A690A +:100F980042F480025A615A6902F480020092009A6F +:100FA8005A6942F400325A615A6902F400320192D5 +:100FB800019A5A6942F480225A615B6903F48023DA +:100FC8000293029B22464FF488714FF0904001F043 +:100FD80055F8104D22464FF46041284601F04EF86E +:100FE8004FF488730393012604960594069403A985 +:100FF8004FF0904000F05EFF4FF460430393049677 +:101008000594069403A9284600F054FF08B070BD63 +:10101800001002400004004800B585B0410041F0CE +:10102800800109B289B200238DF80C306423009343 +:10103800012303AA024801F045FA05B05DF804FB54 +:10104800F401002010B584B00C46400000B240F016 +:10105800810064230093022303AA81B2064801F0A9 +:10106800EFFA30B99DF80C209DF80D3043EA0223C1 +:10107800238004B010BD00BFF401002000B587B084 +:10108800024600238DF817304FF47A730293012338 +:1010980001930DF1170300930223A021034801F0E7 +:1010A80061FC9DF8170007B05DF804FBA80100205B +:1010B80000B587B002468DF817104FF47A73029383 +:1010C800012301930DF1170300930223A021044883 +:1010D80001F074FB052000F08BFA07B05DF804FB03 +:1010E800A801002072B6FEE708B50D480D4B036055 +:1010F8000223436000238360C3604FF440220261EF +:101108004FF4801242610376012242768376C276DA +:101118000377437700F080FA00B908BDFFF7E2FFD4 +:10112800400200200064004008B51148114B0360DC +:10113800114B4360002383600122C2600361436155 +:101148008361C361036201F05FF950B90021084867 +:1011580001F0E0FC38B90021054801F009FD20B98B +:1011680008BDFFF7BFFFFFF7BDFFFFF7BBFF00BFDD +:10117800F4010020005400400E09002008B5114871 +:10118800114B0360114B4360002383600122C2604E +:10119800036143618361C361036201F035F950B9AA +:1011A8000021084801F0B6FC38B90021054801F0D3 +:1011B800DFFC20B908BDFFF795FFFFF793FFFFF7A6 +:1011C80091FF00BFA8010020005800400E09002030 +:1011D80008B51048104B03604FF482734360002336 +:1011E80083604FF4E062C260036143614FF40072B0 +:1011F80082612022C2610362436283620722C26263 +:1012080003630823436302F030FB00B908BDFFF70E +:1012180069FF00BF440100200030014000B59DB0C7 +:101228002822002112A802F02CFD00210D910E9118 +:101238000F91109111913422684602F022FD032388 +:1012480012934FF4803313930123169310231793AB +:1012580012A801F0B9FCB8B90F230D9301230E931E +:1012680000210F91109111910DA802F003F868B9AF +:1012780060230093002307930893684602F0CEF892 +:1012880030B91DB05DF804FBFFF72CFFFFF72AFF0C +:10129800FFF728FF10B586B000F086F9FFF7BEFF0C +:1012A800FFF76CFEFFF720FFFFF73EFFFFF766FF33 +:1012B800FFF78EFF002400E001340B2C09DC2046E8 +:1012C800FFF7AAFE0028F7D000F08CF9134B18603E +:1012D800F2E71348FFF742FC12480146FFF772FB9A +:1012E80045210120FFF7E4FEFFF7F0FC0E48FFF769 +:1012F800CBFD002400E001340B2CF7DC0DEB44019E +:101308002046FFF79FFE0028F5D02046FFF784FE11 +:1013180000F068F9014B1860EDE700BF40010020BC +:1013280044010020400200208400002082B00A4BC3 +:101338009A6942F001029A619A6902F001020092E8 +:10134800009ADA6942F08052DA61DB6903F080536F +:101358000193019B02B070470010024000B589B0AC +:101368000023039304930593069307930268184B8D +:101378009A4202D009B05DF804FB03F5D633DA6966 +:1013880042F00072DA61DA6902F000720192019AA1 +:101398005A6942F400325A615B6903F400330293DC +:1013A800029B4FF4C0530393022304930323069331 +:1013B8000923079303A94FF0904000F07BFD00221A +:1013C8001146142000F044FD142000F051FDD1E72F +:1013D80000640040F0B58BB0002305930693079393 +:1013E800089309930368304A934204D02F4A9342E2 +:1013F80037D00BB0F0BD2E4C636943F40033636102 +:10140800636903F400330093009B636943F480230A +:101418006361636903F480230193019B4FF40043E4 +:10142800059312270697032608960425099505A90A +:101438004FF0904000F03EFD80230593069700236F +:1014480007930896099505A91A4800F033FDE36942 +:1014580043F40013E361E36903F400130293029B6E +:10146800C7E7134C636943F400336361636903F4AA +:1014780000330393039B4FF4C06305931223069331 +:10148800032308930423099305A94FF0904000F023 +:1014980011FDE36943F48003E361E36903F4800326 +:1014A8000493049BA5E700BF005400400058004087 +:1014B800001002400004004800B589B000230393DF +:1014C80004930593069307930268144B9A4202D03B +:1014D80009B05DF804FB03F560439A6942F4805251 +:1014E8009A619A6902F480520192019A5A6942F407 +:1014F80000325A615B6903F400330293029BE023D4 +:10150800039302230493032306930523079303A954 +:101518004FF0904000F0CEFCDAE700BF0030014009 +:10152800FEE7FEE7FEE7FEE7FEE770477047704715 +:1015380008B500F04BF808BD08B5024800F01DFBDF +:1015480008BD00BF40020020034AD2F8883043F4A7 +:101558007003C2F88830704700ED00E010B504460B +:101568000E4B1A784FF47A73B3FBF2F30C4A1068F7 +:10157800B0FBF3F000F08AFC68B90F2C01D9012008 +:101588000AE0002221464FF0FF3000F061FC054BD5 +:101598001C60002000E0012010BD00BF08000020F2 +:1015A800040000200C00002008B5074A136843F027 +:1015B80010031360032000F039FC0F20FFF7CEFF63 +:1015C800FFF7B4FE002008BD00200240034A11685E +:1015D800034B1B780B441360704700BF6802002060 +:1015E80008000020014B1868704700BF68020020FF +:1015F80038B50446FFF7F6FF0546B4F1FF3F02D0C1 +:10160800044B1B781C44FFF7EDFF401BA042FAD3A4 +:1016180038BD00BF08000020002800F0A18038B5C0 +:10162800044690F82030D3B12268136843F00103D0 +:101638001360FFF7D7FF054623685A6812F0010FB9 +:1016480010D1FFF7CFFF401B0A28F5D9636A43F48E +:1016580000336362052384F82030012038BDFFF78A +:101668007DFEE1E71A6822F002021A60FFF7BAFF6E +:10167800054623685A6812F0020F0DD0FFF7B2FF33 +:10168800401B0A28F5D9636A43F4003363620523D3 +:1016980084F820300120E1E7227E012A3DD01A6833 +:1016A80022F080021A60637E012B3BD02268136807 +:1016B80023F040031360A37E012B39D022681368FE +:1016C80023F020031360E37E012B37D022681368D0 +:1016D80043F010031360237F012B35D02268136871 +:1016E80023F008031360637F012B33D0226813684B +:1016F80023F004031360A368E268134322691343C9 +:10170800626913436268013A21681343CB61002080 +:101718006062012384F82030A0E71A6842F0800252 +:101728001A60C0E72268136843F040031360C2E7F9 +:101738002268136843F020031360C4E72268136823 +:1017480023F010031360C6E72268136843F0080308 +:101758001360C8E72268136843F004031360CAE7FC +:1017680001207047026890F82030013BDBB2012B62 +:1017780005D9436A43F4802343620120704730B49B +:10178800D2F8003243F00103C2F800324B6903F08B +:101798001F03012000FA03F3D2F81C026FEA030CBE +:1017A80020EA0300C2F81C02C869B0B9D2F80C02DA +:1017B8000CEA0000C2F80C028C884869CD6844EA3B +:1017C8000544483042F830400C8848698D6844EA3E +:1017D8000544483002EBC0004460C86901281BD0AA +:1017E800886980BBD2F804020CEA0000C2F804023F +:1017F800086970BBD2F814020CEA0000C2F814029F +:10180800096A01292BD0D2F8003223F00103C2F86B +:101818000032002030BC7047D2F80C021843C2F8DE +:101828000C028C8848690D6844EA0544483042F83F +:1018380030408C8948698D6844EA0544483002EB99 +:10184800C0004460CCE7D2F804021843C2F804028E +:10185800CEE7D2F814021843C2F81402D0E7D2F83F +:101868001C120B43C2F81C32CDE770B5044690F841 +:101878002050EDB2012D06D0436A43F400234362A1 +:101888000125284670BD022380F8203002681368BD +:1018980023F001031360FFF7A5FE064623685B6883 +:1018A80013F0010F0CD0FFF79DFE831B0A2BF5D90F +:1018B800636A43F400336362052384F82030E0E769 +:1018C80000256562DDE730B590F820C00468A4689B +:1018D8000CF1FF3C5FFA8CFCBCF1010F6BD814F0E3 +:1018E800E05F62D0C4F3016CBCF1020F05D9436A12 +:1018F80043F400034362012062E0012404FA0CF47B +:101908001C608B68002B3DD10D68CB68046843EAE6 +:1019180045550CF118031B01E55003680C690CF1DF +:10192800180E03EB0E135C600B7D012B35D0D179BB +:1019380093791B0443EA0163517943EA012314793B +:101948000168234301EB0C11C1F88C31D1789378ED +:101958001B0443EA0163517843EA012311780268C2 +:101968000B4302EB0C12C2F8883102680CF1180C18 +:101978004FEA0C1C52F80C3043F0010342F80C30CB +:1019880000201DE04C6843EAC403CC6823430CF1F3 +:101998001804240105682B51BFE7036803EB0E13F5 +:1019A800596841F480715960C1E7436A43F40013F0 +:1019B8004362012004E0436A43F480234362012028 +:1019C80030BD90F82030013BDBB2012B01D900205B +:1019D80070470368986810F0806000D001209A680A +:1019E80012F0006F00D001309B6813F0805FEFD0D9 +:1019F8000130704790F820C00CF1FF3C5FFA8CFC76 +:101A0800BCF1010F00F2958030B451B90468E46864 +:101A180014F0030F10D1436A43F40013436201200A +:101A280077E00468246914F0030F05D1436A43F48E +:101A38000013436201206CE001F11B0424010568D6 +:101A48002C5904F004049460002C64D101F11B04A7 +:101A5800240105682C59640D1460046801F11B0CFD +:101A68004FEA0C1C54F80C4004F00204D4600468DB +:101A78006444646804F00F0414610468644464688E +:101A8800C4F307249461046864446468240C5461B2 +:101A9800026802EB0112D2F8B8211A70026802EB50 +:101AA8000112D2F8B821C2F307225A70026802EB79 +:101AB8000112D2F8B821C2F307429A70026802EB09 +:101AC8000112D2F8B821120EDA70026802EB011284 +:101AD800D2F8BC211A71026802EB0112D2F8BC21BB +:101AE800C2F307225A71026802EB0112D2F8BC2134 +:101AF800C2F307429A71026802EB0112D2F8BC21C4 +:101B0800120EDA7179B90268D36843F02003D36002 +:101B1800002030BC704701F11B04240105682C59D2 +:101B2800E408546099E70268136943F020031361DD +:101B3800EEE7436A43F4802343620120704790F83C +:101B48002030013BDBB2012B05D9436A43F48023E3 +:101B5800436201207047026853690B4353610020B8 +:101B680070477047704770477047704770477047B5 +:101B7800704770477047704770472DE9F84F054622 +:101B880003685C69D3F804809F68D3F80CB0D3F875 +:101B980010A0D3F8189014F001063BD017F00106F6 +:101BA80016D001229A6017F0020F08D117F0040F1F +:101BB8000CD117F0080606D04FF4805608E0FFF75E +:101BC800D0FF002604E0FFF7CFFF01E04FF40066E6 +:101BD80017F4807F0DD02B684FF480729A6017F449 +:101BE800007F40F0868017F4806F00F0868046F40E +:101BF800005617F4803F0DD02B684FF480329A605E +:101C080017F4003F40F0838017F4802F00F08380A2 +:101C180046F4004614F0080F07D01BF0100F04D04C +:101C280046F400762B681022DA6014F0040F02D014 +:101C38001BF0080F79D114F0020F04D02B68DB6871 +:101C480013F0030F78D114F0400F07D01AF0100FDB +:101C580004D046F480662B6810221A6114F0200F15 +:101C680002D01AF0080F6BD114F0100F04D02B68B3 +:101C78001B6913F0030F6AD114F4003F02D018F067 +:101C8800100F68D114F4803F02D018F0080F69D102 +:101C980014F4004F7AD018F0040F74D014F4807F35 +:101CA80004D019F0010F01D046F0010614F4007FAA +:101CB80004D019F0020F01D046F0020614F4806F28 +:101CC80004D019F0040F01D046F0040614F4006F94 +:101CD80059D019F0700956D0B9F1400F65D058D8CD +:101CE800B9F1200F5ED0B9F1300F42D146F020068D +:101CF80044E02846FFF736FF7BE717F4006F02D071 +:101D080046F4804675E72846FFF72FFF71E7284617 +:101D1800FFF729FF7EE717F4002F02D046F480363C +:101D280078E72846FFF722FF74E72B680822DA6075 +:101D38002846FFF71CFF7EE72846FEF799FE82E754 +:101D48002B6808221A612846FFF713FF8CE72846FC +:101D5800FFF70EFF90E72B6810225A602846FFF71E +:101D680009FF8FE72B6808225A602846FFF703FF10 +:101D78008EE7B9F1100F01D146F008062A68936979 +:101D880023F0700393612B6804225A609EB9BDE862 +:101D9800F88FB9F1500F0BD0B9F1600FEED146F4BE +:101DA8008076EBE746F01006E8E746F04006E5E700 +:101DB80046F08006E2E76B6A33436B622846FFF71A +:101DC800DBFEE4E7002808DB0901C9B200F1604046 +:101DD80000F5614080F80013704700F00F0009011A +:101DE800C9B2014B1954704714ED00E000B500F07A +:101DF8000700C0F1070CBCF1040F28BF4FF0040C1A +:101E0800031D062B0FD9C31E4FF0FF3E0EFA0CF030 +:101E180021EA000199400EFA03FE22EA0E0241EA85 +:101E280002005DF804FB0023EEE70000074AD368D0 +:101E380023F4E0631B041B0C000200F4E06003437E +:101E480043F0BF6343F40033D360704700ED00E014 +:101E580010B50446054BD868C0F30220FFF7C6FF4B +:101E680001462046FFF7AEFF10BD00BF00ED00E0C1 +:101E7800002807DB00F01F02400901239340024AB3 +:101E880042F82030704700BF00E100E00138B0F1AF +:101E9800807F0BD24FF0E0235861054AF02182F889 +:101EA80023100020986107221A61704701207047AB +:101EB80000ED00E0F0B583B0002362E085685E00C5 +:101EC8000324B44025EA0405CC68B4402C4384605C +:101ED800456825EA0C054C68C4F300149C402C4363 +:101EE80044605FE0DD08083550F8254003F0070C32 +:101EF8004FEA8C0C4FF00F0E0EFA0CFE24EA0E0E71 +:101F08000C6904FA0CF444EA0E0440F8254060E039 +:101F1800042400E0002404FA0EF42C430CF1020C13 +:101F2800524D45F82C40524C2568D44325EA020608 +:101F38004F6817F4803F01D042EA05064C4D2E60E9 +:101F48006D6804EA05064F6817F4003F01D042EABD +:101F58000506474D6E60AD6804EA05064F6817F43C +:101F6800801F01D042EA0506414DAE60ED682C4065 +:101F78004E6816F4001F01D042EA05043C4AD460BA +:101F880001330A6832FA03F46ED04FF0010C0CFAF0 +:101F980003FC1CEA0202F3D04C6804F00304013C81 +:101FA800012C8BD94C6804F00304032C0CD0C468B2 +:101FB8005D004FF0030C0CFA05FC24EA0C0C8C684D +:101FC800AC4044EA0C04C4604C6804F00304022CDE +:101FD80088D004684FEA430E4FF0030C0CFA0EFC4D +:101FE80024EA0C0C4C6804F0030404FA0EF444EAE6 +:101FF8000C0404604C6814F4403FC1D01D4CA56922 +:1020080045F00105A561A46904F001040194019C4F +:102018004FEA930C0CF10205144C54F8255003F0C8 +:10202800030E4FEA8E0E0F2404FA0EF425EA040577 +:10203800B0F1904F3FF46EAF0F4CA0420ED004F5B4 +:102048008064A0420CD004F58064A0420AD004F554 +:102058008064A0423FF45CAF05245CE701245AE7A2 +:10206800022458E7032456E703B0F0BD00000140FE +:102078000004014000100240000400480AB18161D8 +:1020880070478162704703689A6912F0020F01D0A5 +:1020980000229A6203689A6912F0010F03D19A69C3 +:1020A80042F001029A61704730B4029D046860688A +:1020B8004FEA555C0CF4806C4CF07F7C4CF4583C37 +:1020C8004CF47F7C4CF0030C20EA0C00C1F30901AE +:1020D80041EA0241194329430843606030BC704714 +:1020E800F8B50E460368996911F0100F46D00546F9 +:1020F80017465A6812F0007F03D15A6842F48042AA +:102108005A602B689C6914F0200F17D1B6F1FF3F75 +:10211800F7D0FFF767FAC01BB04201D8002EF0D104 +:102128006B6C43F020036B64202385F84130002357 +:1021380085F8423085F84030012020E01022DA612D +:102148002B682024DC612846FFF79DFF2A68536826 +:1021580023F0FF7323F48B3323F4FF7323F001037D +:1021680053606B6C43F004036B6485F841400023B3 +:1021780085F8423085F84030012000E00020F8BDA5 +:1021880070B504460D46164623689B6913F0020F86 +:102198001DD1324629462046FFF7A2FFC8B9B5F13E +:1021A800FF3FF1D0FFF71EFA801BA84201D8002D8F +:1021B800EAD1636C43F020036364202384F8413040 +:1021C800002384F8423084F84030012000E00020E9 +:1021D80070BD0120FCE72DE9F04106468846174608 +:1021E8001D463468A46938EA04040CBF012400249D +:1021F800BC4218D1B5F1FF3FF3D0FFF7F3F9069BC6 +:10220800C01AA84201D8002DEBD1736C43F020030B +:102218007364202386F84130002386F8423086F81C +:102228004030012000E00020BDE8F0812DE9F041B8 +:1022380082B0044690461D46089E099F194B00939C +:102248004FF08073EAB2FFF72FFF3A463146204637 +:10225800FFF796FFF8B9012D0ED123685FFA88F2CF +:102268009A6200973346002280212046FFF7B3FF89 +:10227800A8B902B0BDE8F08123684FEA18229A6233 +:102288003A4631462046FFF77BFF30B923685FFAAC +:1022980088F29A62E5E70120EBE70120E9E70120EF +:1022A800E7E700BF002000802DE9F04182B0044636 +:1022B80090461D46089E099F184B00930023EAB2DA +:1022C800FFF7F2FE3A4631462046FFF759FFF8B9C4 +:1022D800012D0ED123685FFA88F29A62009733467F +:1022E800002240212046FFF776FFA8B902B0BDE8DA +:1022F800F08123684FEA18229A623A46314620460E +:10230800FFF73EFF30B923685FFA88F29A62E5E783 +:102318000120EBE70120E9E70120E7E70020008042 +:1023280070B505460C4616462B689B6913F0200FBE +:102338001AD1324621462846FFF7D2FEB0B9FFF738 +:1023480051F9801BA04201D8002CEDD16B6C43F0F1 +:1023580020036B64202385F84130002385F8423040 +:1023680085F84030012070BD0020FCE70120FAE725 +:1023780070B504460D46164623689B6913F0040F92 +:102388003ED1324629462046FFF7AAFE01460028DC +:1023980038D123689A6912F0200F13D1FFF722F978 +:1023A800801BA84201D8002DE6D1636C43F02003BE +:1023B8006364202384F84130002384F840300121ED +:1023C800084670BD9A6912F0040F02D0228D002AC7 +:1023D800F6D12022DA6121684B6823F0FF7323F4D9 +:1023E8008B3323F4FF7323F001034B6000236364F2 +:1023F80084F8412084F8423084F840300121DFE736 +:102408000021DDE70121DBE7002859D010B504469B +:1024180090F84130002B43D0242384F841302268BF +:10242800136823F0010313606368226823F0706364 +:1024380013612268936823F400439360E368012BD7 +:1024480033D0A368226843F404439360E368022B03 +:1024580031D02268536843F0007343F4004353605B +:102468002268D36823F40043D36023696269134365 +:10247800A169226843EA0123D360E369216A2268DB +:102488000B4313602268136843F0010313600020B4 +:102498006064202384F84130206384F8420010BD32 +:1024A80080F84030FEF796FFB6E7A368226843F449 +:1024B80000439360CAE723684FF400625A60C8E794 +:1024C800012070472DE9F04782B00F460A9E90F828 +:1024D8004110C9B2202940F0A3800446904699468D +:1024E80090F84030012B00F09F804FF0010A80F8EF +:1024F80040A0FFF777F805460090192352464FF49D +:1025080000412046FFF767FE002840F08F80212316 +:1025180084F84130102384F8423000236364C4F8FF +:102528002480A4F82A906363638D9BB2FF2B0AD999 +:10253800FF222285414B00934FF080733946204695 +:10254800FFF7B2FD18E0628D92B222853B4B0093F3 +:102558004FF00073D2B239462046FFF7A5FD0BE0D5 +:10256800628D92B22285002300934FF00073D2B29D +:1025780039462046FFF798FD638D9BB2002B33D078 +:102588002A4631462046FFF7FBFD002850D1626AF3 +:10259800236812789A62636A01336362638D9BB21F +:1025A800013B9BB26385238D013B9BB22385628DE2 +:1025B80092B2002AE0D0002BDED1009533460022EB +:1025C80080212046FFF707FEA0BB638D9BB2FF2B3F +:1025D800C6D9FF222285002300934FF08073394625 +:1025E8002046FFF761FDC7E72A4631462046FFF738 +:1025F80097FE08BB23682022DA6121684B6823F024 +:10260800FF7323F48B3323F4FF7323F001034B6030 +:1026180084F84120002384F8423084F8403000E0F8 +:10262800022002B0BDE8F0870220FAE70120F8E7AF +:102638000120F6E70120F4E70120F2E700200080FE +:102648002DE9F04782B00F460A9E90F84110C9B2B2 +:10265800202940F0A28004469046994690F84030E0 +:10266800012B00F09E804FF0010A80F840A0FEF791 +:10267800B9FF05460090192352464FF40041204601 +:10268800FFF7A9FD002840F08E80222384F841300E +:10269800102384F8423000236364C4F82480A4F82B +:1026A8002A906363638D9BB2FF2B0AD9FF22228590 +:1026B800414B00934FF0807339462046FFF7F4FCF6 +:1026C80018E0628D92B222853B4B00934FF0007365 +:1026D800D2B239462046FFF7E7FC0BE0628D92B292 +:1026E8002285002300934FF00073D2B2394620466A +:1026F800FFF7DAFC638D9BB2002B32D02A463146B5 +:102708002046FFF735FE00284FD123685A6A636ACE +:102718001A70636A01336362228D013A92B222858C +:10272800638D9BB2013B9BB26385638D9BB2002B8B +:10273800E0D0002ADED10095334680212046FFF7FD +:102748004AFDA0BB638D9BB2FF2BC7D9FF22228510 +:10275800002300934FF0807339462046FFF7A4FC0E +:10276800C8E72A4631462046FFF7DAFD08BB23684A +:102778002022DA6121684B6823F0FF7323F48B333E +:1027880023F4FF7323F001034B6084F841200023F6 +:1027980084F8423084F8403000E0022002B0BDE8FE +:1027A800F0870220FAE70120F8E70120F6E7012088 +:1027B800F4E70120F2E700BF002400802DE9F04F84 +:1027C80083B00E46BDF834A00E9D90F84110C9B2F2 +:1027D800202940F0BB800446904699460C9BCBB11B +:1027E800BAF1000F16D090F84030012B00F0B280FB +:1027F8004FF0010B80F840B0FEF7F4FE074600905A +:1028080019235A464FF400412046FFF7E4FC30B143 +:1028180001209CE04FF400736364012097E02123BA +:1028280084F84130402384F84230002363640C9AD2 +:102838006262A4F82AA06363019700954B4642465A +:1028480031462046FFF7F2FC70B9638D9BB2FF2B2F +:102858000FD9FF222285002300934FF08073314661 +:102868002046FFF721FC21E0002384F84030584639 +:102878006DE0628D92B22285002300934FF00073C1 +:10288800D2B231462046FFF70FFC0FE0628D92B2BC +:102898002285002300934FF00073D2B231462046C0 +:1028A800FFF702FC638D9BB2002B33D03A462946D2 +:1028B8002046FFF765FC00284ED1626A236812782B +:1028C8009A62636A01336362638D9BB2013B9BB278 +:1028D8006385238D013B9BB22385628D92B2002ACA +:1028E800E0D0002BDED100972B4600228021204625 +:1028F800FFF771FC90BB638D9BB2FF2BC6D9FF22FB +:102908002285002300934FF0807331462046FFF75D +:10291800CBFBC7E73A4629462046FFF701FDF8B941 +:1029280023682022DA6121684B6823F0FF7323F4BF +:102938008B3323F4FF7323F001034B6084F84120A9 +:10294800002384F8423084F8403000E0022003B0CD +:10295800BDE8F08F0220FAE70120F8E70120F6E74A +:102968000120F4E72DE9F04F83B00E46BDF834A0FE +:102978000E9D90F84110C9B2202940F0BC80044651 +:10298800904699460C9BCBB1BAF1000F16D090F83F +:102998004030012B00F0B3804FF0010B80F840B0BD +:1029A800FEF720FE0746009019235A464FF40041CF +:1029B8002046FFF710FC30B101209DE04FF4007372 +:1029C8006364012098E0222384F84130402384F88E +:1029D8004230002363640C9A6262A4F82AA06363FD +:1029E800019700954B46424631462046FFF75CFC6E +:1029F80070B9638D9BB2FF2B0FD9FF222285444B00 +:102A080000934FF0807331462046FFF74DFB21E0DD +:102A1800002384F8403058466EE0628D92B22285D9 +:102A28003B4B00934FF00073D2B231462046FFF77C +:102A38003BFB0FE0628D92B22285002300934FF09A +:102A48000073D2B231462046FFF72EFB638D9BB24E +:102A5800002B34D000972B46002204212046FFF794 +:102A6800BAFB00284DD123685A6A636A1A70636AF0 +:102A780001336362228D013A92B22285638D9BB243 +:102A8800013B9BB26385638D9BB2002BDED0002A8D +:102A9800DCD100972B4680212046FFF79CFB90BB9A +:102AA800638D9BB2FF2BC5D9FF222285002300939B +:102AB8004FF0807331462046FFF7F6FAC6E73A46EC +:102AC80029462046FFF72CFCF8B923682022DA6152 +:102AD80021684B6823F0FF7323F48B3323F4FF73CF +:102AE80023F001034B6084F84120002384F842302E +:102AF80084F8403000E0022003B0BDE8F08F0220E7 +:102B0800FAE70120F8E70120F6E70120F4E700BF23 +:102B180000240080034690F84120D2B2202A23D115 +:102B280090F84020012A21D0012280F84020242258 +:102B380080F841200068026822F0010202601868EB +:102B4800026822F48052026018680268114301602A +:102B580019680A6842F001020A60202283F84120BD +:102B6800002083F840007047022070470220704719 +:102B7800034690F84120D2B2202A21D190F8402073 +:102B8800012A1FD0012280F84020242280F8412009 +:102B98000068026822F0010202601868026822F4E4 +:102BA800706242EA0122026019680A6842F0010272 +:102BB8000A60202283F84120002083F840007047F3 +:102BC8000220704702207047002800F0FF8270B58D +:102BD80082B00446036813F0010F3BD0B44B5B6826 +:102BE80003F00C03042B1ED0B14B5B6803F00C03FD +:102BF800082B13D06368B3F5803F68D0002B40F0F2 +:102C0800928003F1804303F504331A6822F480327A +:102C18001A601A6822F480221A605DE0A44B5B688F +:102C280013F4803FE6D04FF4003393FAA3F3A04B9C +:102C380019684FF4003393FAA3F3B3FA83F303F05C +:102C48001F03012202FA03F30B4203D06368002B2F +:102C580000F0BE82236813F0020F00F0C480944B8A +:102C68005B6813F00C0F00F09C80914B5B6803F0DD +:102C78000C03082B00F08F802369002B00F0F080F4 +:102C8800012292FAA2F3B3FA83F303F1845303F512 +:102C980084139B001A60FEF7A5FC0546022393FAED +:102CA800A3F3834B1968022393FAA3F3B3FA83F3CC +:102CB80003F01F03012202FA03F30B4240F0C28023 +:102CC800FEF790FC401B0228E8D9032089E2784AE5 +:102CD800136843F480331360754AD36A23F00F03F3 +:102CE800A1680B43D3626368002B36D0FEF77AFCE9 +:102CF80005464FF4003393FAA3F36D4B19684FF46C +:102D0800003393FAA3F3B3FA83F303F01F0301220A +:102D180002FA03F30B429DD1FEF764FC401B6428C2 +:102D2800E7D903205DE2B3F5A02F09D0604B1A68FC +:102D380022F480321A601A6822F480221A60CBE7E3 +:102D480003F18043A3F53C331A6842F480221A60E9 +:102D58001A6842F480321A60BEE7FEF743FC054663 +:102D68004FF4003393FAA3F3514B19684FF400332F +:102D780093FAA3F3B3FA83F303F01F03012202FAD1 +:102D880003F30B423FF466AFFEF72CFC401B6428AC +:102D9800E6D9032025E2464B5B6813F4803F7FF4B5 +:102DA8006BAF022393FAA3F3414B1968022393FAFA +:102DB800A3F3B3FA83F303F01F03012202FA03F328 +:102DC8000B4203D02369934240F0048238480368D9 +:102DD80023F0F8036169F82292FAA2F2B2FA82F2B9 +:102DE80091400B430360236813F0080F00F08C80B8 +:102DF800A369002B60D0012191FAA1F2B2FA82F204 +:102E08002C4B13449B001960FEF7ECFB054602238C +:102E180093FAA3F293FAA3F293FAA3F2244A516A1B +:102E280093FAA3F3B3FA83F303F01F03012202FA20 +:102E380003F30B4268D1FEF7D5FB401B0228E6D905 +:102E48000320CEE11A48036823F0F8036169F822E9 +:102E580092FAA2F2B2FA82F291400B430360C2E7FF +:102E6800012393FAA3F3B3FA83F303F1845303F52D +:102E780084139B0000221A60FEF7B4FB0546022368 +:102E880093FAA3F30A4B1968022393FAA3F3B3FA4C +:102E980083F303F01F03012202FA03F30B42A2D0CB +:102EA800FEF7A0FB401B0228E9D9032099E100BFE7 +:102EB8000010024020819010012292FAA2F2B2FA88 +:102EC80082F2B74B13449B0000221A60FEF78AFB7C +:102ED8000546022393FAA3F293FAA3F293FAA3F214 +:102EE800B04A516A93FAA3F3B3FA83F303F01F03CA +:102EF800012202FA03F30B4206D0FEF773FB401BD4 +:102F08000228E6D903206CE1236813F0040F00F0CF +:102F1800A980A44BDB6913F0805F20D1A14BDA694B +:102F280042F08052DA61DB6903F080530193019B20 +:102F380001259D4B1B6813F4807F12D0E368012B99 +:102F480023D073BB03F1804303F504331A6A22F0DC +:102F580001021A621A6A22F004021A621AE00025B3 +:102F6800E7E7914A136843F480731360FEF73AFB6E +:102F780006468D4B1B6813F4807FDFD1FEF732FBCA +:102F8800801B6428F5D903202BE1864A136A43F095 +:102F980001031362E368002B3CD0FEF723FB0646CF +:102FA8002EE0052B09D07F4B1A6A22F001021A6223 +:102FB8001A6A22F004021A62ECE77A4B1A6A42F0A3 +:102FC80004021A621A6A42F001021A62E2E7022354 +:102FD80093FAA3F3734B596A022393FAA3F3B3FA50 +:102FE80083F303F01F03012202FA03F3194238D1D5 +:102FF800FEF7F8FA801B41F28833984200F2EC8021 +:10300800022393FAA3F293FAA3F3002BDFD0654BC4 +:10301800196AE1E7FEF7E6FA064618E0022393FA92 +:10302800A3F3604B596A022393FAA3F3B3FA83F329 +:1030380003F01F03012202FA03F3194211D0FEF72D +:10304800D1FA801B41F28833984200F2C7800223EC +:1030580093FAA3F293FAA3F3002BDFD0514B196A2A +:10306800E1E7B5BBE369002B00F0BA804D4A52682E +:1030780002F00C02082A00F09980022B2FD04FF0A2 +:10308800807393FAA3F3B3FA83F303F1845303F53C +:1030980084139B0000221A60FEF7A4FA04464FF03E +:1030A800007393FAA3F33F4B19684FF0007393FA38 +:1030B800A3F3B3FA83F303F01F03012202FA03F325 +:1030C80019426BD0FEF78EFA001B0228E7D90320BD +:1030D80087E0344AD36923F08053D361C2E74FF0C5 +:1030E800807393FAA3F3B3FA83F303F1845303F5DC +:1030F80084139B0000221A60FEF774FA05464FF00D +:10310800007393FAA3F3274B19684FF0007393FAEF +:10311800A3F3B3FA83F303F01F03012202FA03F3C4 +:10312800194206D0FEF75EFA401B0228E7D90320B1 +:1031380057E01C494B6823F47413626A206A0243FF +:1031480013434B604FF0807393FAA3F3B3FA83F3FE +:1031580003F1845303F584139B0001221A60FEF7E0 +:1031680041FA04464FF0007393FAA3F30D4B196824 +:103178004FF0007393FAA3F3B3FA83F303F01F033A +:10318800012202FA03F3194206D1FEF72BFA001BBB +:103198000228E7D9032024E0002022E0002020E0D4 +:1031A800208190100010024000700040012B1AD0BE +:1031B800104B5B6803F48031226A914215D103F405 +:1031C8007013626A934212D100200AE0012070470E +:1031D800012006E0012004E0032002E0032000E0D3 +:1031E800002002B070BD0120FBE70120F9E70120B3 +:1031F800F7E700BF00100240184B5A6802F00C03B2 +:10320800042B26D0082B26D102F470114FF470132A +:1032180093FAA3F3B3FA83F321FA03F31049C85CD2 +:103228000E4BDB6A03F00F030F2191FAA1F1B1FAFB +:1032380081F1CB400B49C95C12F4803F05D00A4BA1 +:10324800B3FBF1F303FB00F07047084B03FB00F0FE +:103258007047054870470648704700BF0010024095 +:103268001C3D00080C3D00080024F40000093D0046 +:1032780000127A00002800F0BE8070B50D460446A2 +:10328800614B1B6803F007038B420BD25E4A13683D +:1032980023F007030B431360136803F007038B4203 +:1032A80040F0AB80236813F0020F06D0574A5368EA +:1032B80023F0F003A1680B435360236813F0010F58 +:1032C8005AD06368012B2DD0022B40D0022292FAEB +:1032D800A2F24E4A1068022292FAA2F2B2FA82F2DE +:1032E80002F01F02012101FA02F2104200F0878069 +:1032F80046494A6822F0030213434B60FEF772F90D +:103308000646424B5B6803F00C036268B3EB820F1E +:1033180032D0FEF767F9801B41F288339842F0D922 +:10332800032067E04FF4003292FAA2F2374A10689D +:103338004FF4003292FAA2F2B2FA82F202F01F02BD +:10334800012101FA02F20242D2D1012052E04FF0EB +:10335800007292FAA2F22D4A10684FF0007292FAA7 +:10336800A2F2B2FA82F202F01F02012101FA02F27D +:103378001042BDD101203DE0234B1B6803F0070339 +:10338800AB420AD9204A136823F007032B43136082 +:10339800136803F00703AB4233D1236813F0040F1B +:1033A80006D01A4A536823F4E063E1680B4353607C +:1033B800236813F0080F07D0144A536823F46053A6 +:1033C800216943EAC1035360FFF716FF0F4B5B689F +:1033D80003F0F003F02292FAA2F2B2FA82F2D3409A +:1033E8000B4AD35CD8400B4B18600B4B1868FEF7A0 +:1033F800B5F8002070BD012070470120FAE70120D0 +:10340800F8E70120F6E700BF002002400010024064 +:10341800FC3C0008040000200C000020F0B583B03C +:103428000446036813F4803F48D0864BDB6913F0E9 +:10343800805F40F0BE80834BDA6942F08052DA61E7 +:10344800DB6903F080530193019B01257E4B1B68C8 +:1034580013F4807F00F0AF807A4B1B6A13F440733B +:1034680022D0626802F440729A421DD07548016AFF +:1034780021F440764FF4803393FAA3F2B2FA82F241 +:10348800724F3A4492004FF0010CC2F800C093FA10 +:10349800A3F3B3FA83F33B449B0000221A6006624D +:1034A80011F0010F40F09C80664A136A23F44073C0 +:1034B80061680B431362002D40F0B980236813F054 +:1034C800010F06D05F4A136B23F00303A1680B4377 +:1034D8001363236813F0020F06D05A4A136B23F4C0 +:1034E8004033E1680B431363236813F0040F06D0DD +:1034F800544A136B23F4402321690B431363236855 +:1035080013F0200F06D04F4A136B23F01003E16924 +:103518000B431363236813F4003F06D0494A5368EA +:1035280023F48003216B0B435360236813F0400F8F +:1035380006D0444A136B23F02003216A0B4313631C +:10354800236813F0080F06D03E4A136B23F4401388 +:1035580061690B431363236813F0100F06D0394ACF +:10356800136B23F44003A1690B431363236813F41B +:10357800007F06D0334A536823F40003A16A0B4343 +:103588005360236813F0800F06D02E4AD36A23F4C1 +:10359800F873616A0B43D362236813F4805F4DD0DC +:1035A800284A136B23F48073E16A0B4313630020EA +:1035B80045E000254AE7244A136843F48073136002 +:1035C800FEF710F80646204B1B6813F4807F7FF443 +:1035D80043AFFEF707F8801B6428F4D903202EE0D8 +:1035E800FEF700F8064618E0022393FAA3F3154BFA +:1035F800596A022393FAA3F3B3FA83F303F01F0380 +:10360800012202FA03F30B427FF44EAFFDF7EAFF03 +:10361800801B41F2883398420ED8022393FAA3F212 +:1036280093FAA3F3002BDFD0064B196AE1E7D369BD +:1036380023F08053D36141E7032000E0002003B06A +:10364800F0BD00BF001002400070004000819010E3 +:103658002DE9F04782B00546884617461E46FDF715 +:10366800C1FF0A9B1B1A03EB0609FDF7BBFF824645 +:10367800284B1B68C3F3CB3309FB03F301932B6877 +:103688009C6838EA04040CBF01230023BB423DD0E8 +:10369800B6F1FF3FF3D0FDF7A5FFA0EB0A004845C0 +:1036A80007D2019A02B14A46019B013B0193914618 +:1036B800E5E72A68536823F0E00353606B68B3F5C5 +:1036C800827F0BD0AB6AB3F5005F14D0012385F875 +:1036D8005D30002385F85C30032018E0AB68B3F553 +:1036E800004F02D0B3F5806FECD12A68136823F03D +:1036F80040031360E6E72A68136823F40053136055 +:103708002A68136843F400531360DFE7002002B00F +:10371800BDE8F087040000202DE9F04782B0064696 +:103728000C4615461F4600238DF80330FDF75AFF57 +:103738000A9B1B1A03EB0708FDF754FF8146D6F8CE +:1037480000A0304B1B6803EB8303C3EBC3031B0DC3 +:1037580008FB03F3019302E0B7F1FF3F12D133688E +:103768009B6803EA040CAC4547D0B4F5C06FF3D1AD +:10377800002DF1D19AF80C30DBB28DF803309DF8AA +:103788000330E9E7FDF72EFFA0EB0900404507D21B +:10379800019A02B14246019B013B01939046DEE744 +:1037A8003268536823F0E00353607368B3F5827F8F +:1037B8000BD0B36AB3F5005F14D0012386F85D30EF +:1037C800002386F85C30032018E0B368B3F5004F97 +:1037D80002D0B3F5806FECD13268136823F0400350 +:1037E8001360E6E73268136823F400531360326805 +:1037F800136843F400531360DFE7002002B0BDE80C +:10380800F08700BF0400002070B582B004460D4662 +:10381800164600920B4600224FF4C051FFF77CFF7A +:10382800B0B900962B46002280212046FFF710FFF2 +:10383800A8B900962B4600224FF4C0612046FFF736 +:103848006BFF50B1236E43F020032366032004E08E +:10385800236E43F020032366032002B070BD236E5D +:1038680043F0200323660320F7E700286FD010B544 +:103878000446436A33B94368B3F5827F05D0002311 +:10388800C36102E00023036143610023A36294F84B +:103898005D30002B52D0022384F85D302268136813 +:1038A80023F040031360E368B3F5E06F4CD90022BE +:1038B800B3F5706F04D0B3F5E06F01D00023A362B5 +:1038C800636803F48273A16801F404410B4321691E +:1038D80001F002010B43616901F001010B43A16989 +:1038E80001F400710B43E16901F038010B43216ACF +:1038F80001F080010B43A16A01F4005120680B43D9 +:103908000360638B03F00403616A01F010010B4349 +:10391800616B01F008010B43E16801F470610B432E +:1039280021681A434A602268D36923F40063D3618B +:1039380000202066012384F85D3010BD84F85C30D7 +:103948002046FDF7B9FDA6E74FF48052B0E7012005 +:1039580070472DE9F8431F46089D90F85C30012B0D +:1039680000F06481044688469146012380F85C3063 +:10397800FDF738FE064694F85D30DBB26268012B2D +:103988000AD0B2F5827F40F03881A268002A40F060 +:103998003D81042B40F03C81B8F1000F00F03A81E2 +:1039A800B9F1000F00F03881002F00F0378194F84A +:1039B8005D30DBB2042B02D0052384F85D30002390 +:1039C8002366C4F84090A4F84670A4F84470C4F87C +:1039D8003880E787A787E3642365E368B3F5E06F7A +:1039E80001D8012F23D92268536823F480535360E8 +:1039F80023681A6812F0400F03D11A6842F0400297 +:103A08001A60E368B3F5E06F58D963680BB1012F0A +:103A18000BD1A26B23681288DA60A36B0233A3630D +:103A2800E38F9BB2013B9BB2E387012731E0226819 +:103A3800536843F480535360DAE7A26B1288DA6064 +:103A4800A36B0233A363E38F9BB2013B9BB2E38773 +:103A5800002723689A6812F0010F11D0B4F84620A5 +:103A680092B26AB1DA68236C1A80236C0233236439 +:103A7800B4F846309BB2013B9BB2A4F8463001270C +:103A8800FDF7B0FD831BAB4203D3B5F1FF3F40F018 +:103A9800C780E38F9BB22BB9B4F846309BB2002B9A +:103AA80000F0A18023689A6812F0020FD1D0E28F4B +:103AB80092B2002ACDD0002FCBD0BEE763680BB1FD +:103AC800012F0FD1E38F9BB2012B0DD9A26B236875 +:103AD8001288DA60A36B0233A363E38F9BB2023BC5 +:103AE8009BB2E387012749E0A26B236812781A7317 +:103AF800A36B0133A363E38F9BB2013B9BB2E387C4 +:103B0800F0E7E28F92B2012A0CD9A26B1288DA6030 +:103B1800A36B0233A363E38F9BB2023B9BB2E387A1 +:103B280000273DE0A26B12781A73A36B0133A363DD +:103B3800E38F9BB2013B9BB2E387002730E022680A +:103B4800536843F48053536001270DE0226C1B7BBC +:103B58001370236C01332364B4F846309BB2013BE5 +:103B68009BB2A4F846300127FDF73CFD801BA84214 +:103B780002D3B5F1FF3F55D1002D55D0E38F9BB24D +:103B880023B9B4F846309BB2002B2CD023689A682E +:103B980012F0020F04D0E28F92B20AB1002FB0D116 +:103BA80023689A6812F0010FDED0B4F8462092B26A +:103BB800002AD9D0B4F8462092B2012AC6D9DA68C8 +:103BC800236C1A80236C02332364B4F846309BB20A +:103BD800023B9BB2A4F84630B4F846309BB2012BA6 +:103BE800ADD90127C0E7324629462046FFF70CFE2B +:103BF80020B120232366012000E00220012384F85D +:103C08005D30002384F85C30BDE8F8830220F5E7D6 +:103C18000220F3E70120F1E70120EFE70120EDE7BB +:103C28000320EBE70320E9E70320E7E70220EBE7BF +:103C3800DFF834D00D480E490E4A002302E0D4586C +:103C4800C4500433C4188C42F9D30B4A0B4C0023DC +:103C580001E013600432A242FBD3FDF775FC00F0CB +:103C680019F8FDF717FBFEE700A000200000002070 +:103C780010000020343D0008100000206C020020D5 +:103C8800FEE702440346934200D1704703F8011B44 +:103C9800F9E7000070B50D4D0D4C641BA41000260B +:103CA800A64209D10B4D0C4C00F018F8641BA41067 +:103CB8000026A64205D170BD55F8043B9847013649 +:103CC800EEE755F8043B98470136F2E72C3D00082B +:103CD8002C3D00082C3D0008303D0008F8B500BF19 +:103CE800F8BC08BC9E467047F8B500BFF8BC08BCD5 +:043CF8009E4670472D +:103CFC000000000000000000010203040607080990 +:103D0C000102030405060708090A0B0C0D0E0F101F +:103D1C0002030405060708090A0B0C0D0E0F101000 +:043D2C00AD010008DD +:043D300089010008FD +:103D34001100000000127A000100000010000000D1 +:0400000508003C397A +:00000001FF diff --git a/BMS_Testbench/BMS_Software_V1/build/ams-slave-23.map b/BMS_Testbench/BMS_Software_V1/build/ams-slave-23.map new file mode 100644 index 0000000..f4edbcd --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/ams-slave-23.map @@ -0,0 +1,2940 @@ +Archive member included to satisfy reference by file (symbol) + +/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-atexit.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o (atexit) +/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-exit.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o (exit) +/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-exit.o) (__stdio_exit_handler) +/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-fwalk.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) (_fwalk_sglue) +/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-stdio.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) (__sread) +/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-memset.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o (memset) +/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-closer.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-stdio.o) (_close_r) +/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-reent.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-closer.o) (errno) +/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-impure.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-reent.o) (_impure_ptr) +/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lseekr.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-stdio.o) (_lseek_r) +/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-readr.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-stdio.o) (_read_r) +/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-writer.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-stdio.o) (_write_r) +/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-errno.o) + build/syscalls.o (__errno) +/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-init.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o (__libc_init_array) +/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-fini.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o (__libc_fini_array) +/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lock.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) (__retarget_lock_init_recursive) +/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-__atexit.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-atexit.o) (__register_exitproc) +/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-__call_atexit.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-__atexit.o) (__call_exitprocs) +/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-freer.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-reent.o) (_free_r) +/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-mallocr.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) (_malloc_r) +/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-mlock.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-freer.o) (__malloc_lock) +/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-fflush.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) (_fflush_r) +/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-sbrkr.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-mallocr.o) (_sbrk_r) + +Discarded input sections + + .text 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crti.o + .data 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crti.o + .bss 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crti.o + .text 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crtbegin.o + .data 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crtbegin.o + .bss 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crtbegin.o + .rodata.all_implied_fbits + 0x0000000000000000 0x24 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crtbegin.o + .data.__dso_handle + 0x0000000000000000 0x4 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crtbegin.o + .text 0x0000000000000000 0x70 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o + .data 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o + .bss 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o + .ARM.extab 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o + .ARM.exidx 0x0000000000000000 0x10 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o + .ARM.attributes + 0x0000000000000000 0x20 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o + .text 0x0000000000000000 0x0 build/ADBMS_Abstraction.o + .data 0x0000000000000000 0x0 build/ADBMS_Abstraction.o + .bss 0x0000000000000000 0x0 build/ADBMS_Abstraction.o + .text.amsConfigCellMeasurement + 0x0000000000000000 0xc build/ADBMS_Abstraction.o + .text.amsConfigGPIO + 0x0000000000000000 0x4 build/ADBMS_Abstraction.o + .text.amsSetGPIO + 0x0000000000000000 0x4 build/ADBMS_Abstraction.o + .text.readGPIO + 0x0000000000000000 0x4 build/ADBMS_Abstraction.o + .text.amsSelfTest + 0x0000000000000000 0x4 build/ADBMS_Abstraction.o + .text.amsClearStatus + 0x0000000000000000 0x18 build/ADBMS_Abstraction.o + .text.amsClearCells + 0x0000000000000000 0x18 build/ADBMS_Abstraction.o + .text.amsSendWarning + 0x0000000000000000 0x4 build/ADBMS_Abstraction.o + .text.amsSendError + 0x0000000000000000 0x4 build/ADBMS_Abstraction.o + .text.amsClearError + 0x0000000000000000 0x4 build/ADBMS_Abstraction.o + .text.amscheckOpenCellWire + 0x0000000000000000 0xd8 build/ADBMS_Abstraction.o + .text 0x0000000000000000 0x0 build/ADBMS_LL_Driver.o + .data 0x0000000000000000 0x0 build/ADBMS_LL_Driver.o + .bss 0x0000000000000000 0x0 build/ADBMS_LL_Driver.o + .text.mcuSPIReceive + 0x0000000000000000 0x18 build/ADBMS_LL_Driver.o + .text 0x0000000000000000 0x0 build/AMS_CAN.o + .data 0x0000000000000000 0x0 build/AMS_CAN.o + .bss 0x0000000000000000 0x0 build/AMS_CAN.o + .text 0x0000000000000000 0x0 build/AMS_HighLevel.o + .data 0x0000000000000000 0x0 build/AMS_HighLevel.o + .bss 0x0000000000000000 0x0 build/AMS_HighLevel.o + .text.AMS_Error_Loop + 0x0000000000000000 0x4 build/AMS_HighLevel.o + .text.AMS_Charging_Loop + 0x0000000000000000 0x4 build/AMS_HighLevel.o + .text.AMS_Discharging_Loop + 0x0000000000000000 0x4 build/AMS_HighLevel.o + .text.AMS_Balancing_Loop + 0x0000000000000000 0x11c build/AMS_HighLevel.o + .text.writeWarningLog + 0x0000000000000000 0x4 build/AMS_HighLevel.o + .text.writeErrorLog + 0x0000000000000000 0x4 build/AMS_HighLevel.o + .bss.amswarningcode + 0x0000000000000000 0x1 build/AMS_HighLevel.o + .bss.amserrorcode + 0x0000000000000000 0x1 build/AMS_HighLevel.o + .data.balancingvoltagedelta + 0x0000000000000000 0x2 build/AMS_HighLevel.o + .data.stopbalancingthreshold + 0x0000000000000000 0x2 build/AMS_HighLevel.o + .data.startbalancingthreshold + 0x0000000000000000 0x2 build/AMS_HighLevel.o + .data.internalbalancingalgo + 0x0000000000000000 0x1 build/AMS_HighLevel.o + .data.stateofcharge + 0x0000000000000000 0x1 build/AMS_HighLevel.o + .bss.BalancingActive + 0x0000000000000000 0x1 build/AMS_HighLevel.o + .bss.balancedCells + 0x0000000000000000 0x4 build/AMS_HighLevel.o + .text 0x0000000000000000 0x0 build/Testbench.o + .data 0x0000000000000000 0x0 build/Testbench.o + .bss 0x0000000000000000 0x0 build/Testbench.o + .text 0x0000000000000000 0x0 build/main.o + .data 0x0000000000000000 0x0 build/main.o + .bss 0x0000000000000000 0x0 build/main.o + .text 0x0000000000000000 0x0 build/stm32f3xx_hal_msp.o + .data 0x0000000000000000 0x0 build/stm32f3xx_hal_msp.o + .bss 0x0000000000000000 0x0 build/stm32f3xx_hal_msp.o + .text.HAL_CAN_MspDeInit + 0x0000000000000000 0x34 build/stm32f3xx_hal_msp.o + .text.HAL_I2C_MspDeInit + 0x0000000000000000 0x68 build/stm32f3xx_hal_msp.o + .text.HAL_SPI_MspDeInit + 0x0000000000000000 0x2c build/stm32f3xx_hal_msp.o + .text 0x0000000000000000 0x0 build/stm32f3xx_it.o + .data 0x0000000000000000 0x0 build/stm32f3xx_it.o + .bss 0x0000000000000000 0x0 build/stm32f3xx_it.o + .text 0x0000000000000000 0x0 build/syscalls.o + .data 0x0000000000000000 0x0 build/syscalls.o + .bss 0x0000000000000000 0x0 build/syscalls.o + .text.initialise_monitor_handles + 0x0000000000000000 0x2 build/syscalls.o + .text._getpid 0x0000000000000000 0x4 build/syscalls.o + .text._kill 0x0000000000000000 0x10 build/syscalls.o + .text._exit 0x0000000000000000 0xc build/syscalls.o + .text._read 0x0000000000000000 0x20 build/syscalls.o + .text._write 0x0000000000000000 0x1c build/syscalls.o + .text._close 0x0000000000000000 0x6 build/syscalls.o + .text._fstat 0x0000000000000000 0xa build/syscalls.o + .text._isatty 0x0000000000000000 0x4 build/syscalls.o + .text._lseek 0x0000000000000000 0x4 build/syscalls.o + .text._open 0x0000000000000000 0xa build/syscalls.o + .text._wait 0x0000000000000000 0x10 build/syscalls.o + .text._unlink 0x0000000000000000 0x10 build/syscalls.o + .text._times 0x0000000000000000 0x6 build/syscalls.o + .text._stat 0x0000000000000000 0xa build/syscalls.o + .text._link 0x0000000000000000 0x10 build/syscalls.o + .text._fork 0x0000000000000000 0x10 build/syscalls.o + .text._execve 0x0000000000000000 0x10 build/syscalls.o + .data.environ 0x0000000000000000 0x4 build/syscalls.o + .bss.__env 0x0000000000000000 0x4 build/syscalls.o + .debug_info 0x0000000000000000 0x783 build/syscalls.o + .debug_abbrev 0x0000000000000000 0x1c1 build/syscalls.o + .debug_loclists + 0x0000000000000000 0x25b build/syscalls.o + .debug_aranges + 0x0000000000000000 0xa8 build/syscalls.o + .debug_rnglists + 0x0000000000000000 0x79 build/syscalls.o + .debug_line 0x0000000000000000 0x472 build/syscalls.o + .debug_str 0x0000000000000000 0x3ee build/syscalls.o + .comment 0x0000000000000000 0x3a build/syscalls.o + .debug_frame 0x0000000000000000 0x190 build/syscalls.o + .ARM.attributes + 0x0000000000000000 0x34 build/syscalls.o + .text 0x0000000000000000 0x0 build/sysmem.o + .data 0x0000000000000000 0x0 build/sysmem.o + .bss 0x0000000000000000 0x0 build/sysmem.o + .text._sbrk 0x0000000000000000 0x48 build/sysmem.o + .bss.__sbrk_heap_end + 0x0000000000000000 0x4 build/sysmem.o + .debug_info 0x0000000000000000 0x171 build/sysmem.o + .debug_abbrev 0x0000000000000000 0xea build/sysmem.o + .debug_loclists + 0x0000000000000000 0x46 build/sysmem.o + .debug_aranges + 0x0000000000000000 0x20 build/sysmem.o + .debug_rnglists + 0x0000000000000000 0x13 build/sysmem.o + .debug_line 0x0000000000000000 0x297 build/sysmem.o + .debug_str 0x0000000000000000 0x21a build/sysmem.o + .comment 0x0000000000000000 0x3a build/sysmem.o + .debug_frame 0x0000000000000000 0x28 build/sysmem.o + .ARM.attributes + 0x0000000000000000 0x34 build/sysmem.o + .text 0x0000000000000000 0x0 build/system_stm32f3xx.o + .data 0x0000000000000000 0x0 build/system_stm32f3xx.o + .bss 0x0000000000000000 0x0 build/system_stm32f3xx.o + .text.SystemCoreClockUpdate + 0x0000000000000000 0x90 build/system_stm32f3xx.o + .rodata.APBPrescTable + 0x0000000000000000 0x8 build/system_stm32f3xx.o + .text 0x0000000000000000 0x0 build/stm32f3xx_hal.o + .data 0x0000000000000000 0x0 build/stm32f3xx_hal.o + .bss 0x0000000000000000 0x0 build/stm32f3xx_hal.o + .text.HAL_MspInit + 0x0000000000000000 0x2 build/stm32f3xx_hal.o + .text.HAL_MspDeInit + 0x0000000000000000 0x2 build/stm32f3xx_hal.o + .text.HAL_DeInit + 0x0000000000000000 0x24 build/stm32f3xx_hal.o + .text.HAL_GetTickPrio + 0x0000000000000000 0xc build/stm32f3xx_hal.o + .text.HAL_SetTickFreq + 0x0000000000000000 0x2c build/stm32f3xx_hal.o + .text.HAL_GetTickFreq + 0x0000000000000000 0xc build/stm32f3xx_hal.o + .text.HAL_SuspendTick + 0x0000000000000000 0xe build/stm32f3xx_hal.o + .text.HAL_ResumeTick + 0x0000000000000000 0xe build/stm32f3xx_hal.o + .text.HAL_GetHalVersion + 0x0000000000000000 0x8 build/stm32f3xx_hal.o + .text.HAL_GetREVID + 0x0000000000000000 0xc build/stm32f3xx_hal.o + .text.HAL_GetDEVID + 0x0000000000000000 0x10 build/stm32f3xx_hal.o + .text.HAL_GetUIDw0 + 0x0000000000000000 0xc build/stm32f3xx_hal.o + .text.HAL_GetUIDw1 + 0x0000000000000000 0xc build/stm32f3xx_hal.o + .text.HAL_GetUIDw2 + 0x0000000000000000 0xc build/stm32f3xx_hal.o + .text.HAL_DBGMCU_EnableDBGSleepMode + 0x0000000000000000 0x10 build/stm32f3xx_hal.o + .text.HAL_DBGMCU_DisableDBGSleepMode + 0x0000000000000000 0x10 build/stm32f3xx_hal.o + .text.HAL_DBGMCU_EnableDBGStopMode + 0x0000000000000000 0x10 build/stm32f3xx_hal.o + .text.HAL_DBGMCU_DisableDBGStopMode + 0x0000000000000000 0x10 build/stm32f3xx_hal.o + .text.HAL_DBGMCU_EnableDBGStandbyMode + 0x0000000000000000 0x10 build/stm32f3xx_hal.o + .text.HAL_DBGMCU_DisableDBGStandbyMode + 0x0000000000000000 0x10 build/stm32f3xx_hal.o + .text 0x0000000000000000 0x0 build/stm32f3xx_hal_can.o + .data 0x0000000000000000 0x0 build/stm32f3xx_hal_can.o + .bss 0x0000000000000000 0x0 build/stm32f3xx_hal_can.o + .text.HAL_CAN_MspInit + 0x0000000000000000 0x2 build/stm32f3xx_hal_can.o + .text.HAL_CAN_MspDeInit + 0x0000000000000000 0x2 build/stm32f3xx_hal_can.o + .text.HAL_CAN_Stop + 0x0000000000000000 0x62 build/stm32f3xx_hal_can.o + .text.HAL_CAN_DeInit + 0x0000000000000000 0x28 build/stm32f3xx_hal_can.o + .text.HAL_CAN_RequestSleep + 0x0000000000000000 0x26 build/stm32f3xx_hal_can.o + .text.HAL_CAN_WakeUp + 0x0000000000000000 0x58 build/stm32f3xx_hal_can.o + .text.HAL_CAN_IsSleepActive + 0x0000000000000000 0x20 build/stm32f3xx_hal_can.o + .text.HAL_CAN_AbortTxRequest + 0x0000000000000000 0x4c build/stm32f3xx_hal_can.o + .text.HAL_CAN_IsTxMessagePending + 0x0000000000000000 0x26 build/stm32f3xx_hal_can.o + .text.HAL_CAN_GetTxTimestamp + 0x0000000000000000 0x26 build/stm32f3xx_hal_can.o + .text.HAL_CAN_GetRxFifoFillLevel + 0x0000000000000000 0x26 build/stm32f3xx_hal_can.o + .text.HAL_CAN_DeactivateNotification + 0x0000000000000000 0x26 build/stm32f3xx_hal_can.o + .text.HAL_CAN_RxFifo0MsgPendingCallback + 0x0000000000000000 0x2 build/stm32f3xx_hal_can.o + .text.HAL_CAN_GetState + 0x0000000000000000 0x2c build/stm32f3xx_hal_can.o + .text.HAL_CAN_GetError + 0x0000000000000000 0x4 build/stm32f3xx_hal_can.o + .text.HAL_CAN_ResetError + 0x0000000000000000 0x20 build/stm32f3xx_hal_can.o + .text 0x0000000000000000 0x0 build/stm32f3xx_hal_cortex.o + .data 0x0000000000000000 0x0 build/stm32f3xx_hal_cortex.o + .bss 0x0000000000000000 0x0 build/stm32f3xx_hal_cortex.o + .text.__NVIC_DisableIRQ + 0x0000000000000000 0x24 build/stm32f3xx_hal_cortex.o + .text.__NVIC_GetPriority + 0x0000000000000000 0x24 build/stm32f3xx_hal_cortex.o + .text.NVIC_DecodePriority + 0x0000000000000000 0x3e build/stm32f3xx_hal_cortex.o + .text.__NVIC_SystemReset + 0x0000000000000000 0x24 build/stm32f3xx_hal_cortex.o + .text.HAL_NVIC_DisableIRQ + 0x0000000000000000 0x8 build/stm32f3xx_hal_cortex.o + .text.HAL_NVIC_SystemReset + 0x0000000000000000 0x6 build/stm32f3xx_hal_cortex.o + .text.HAL_MPU_Disable + 0x0000000000000000 0x18 build/stm32f3xx_hal_cortex.o + .text.HAL_MPU_Enable + 0x0000000000000000 0x18 build/stm32f3xx_hal_cortex.o + .text.HAL_MPU_ConfigRegion + 0x0000000000000000 0x60 build/stm32f3xx_hal_cortex.o + .text.HAL_NVIC_GetPriorityGrouping + 0x0000000000000000 0x10 build/stm32f3xx_hal_cortex.o + .text.HAL_NVIC_GetPriority + 0x0000000000000000 0x18 build/stm32f3xx_hal_cortex.o + .text.HAL_NVIC_SetPendingIRQ + 0x0000000000000000 0x1c build/stm32f3xx_hal_cortex.o + .text.HAL_NVIC_GetPendingIRQ + 0x0000000000000000 0x24 build/stm32f3xx_hal_cortex.o + .text.HAL_NVIC_ClearPendingIRQ + 0x0000000000000000 0x1c build/stm32f3xx_hal_cortex.o + .text.HAL_NVIC_GetActive + 0x0000000000000000 0x24 build/stm32f3xx_hal_cortex.o + .text.HAL_SYSTICK_CLKSourceConfig + 0x0000000000000000 0x20 build/stm32f3xx_hal_cortex.o + .text.HAL_SYSTICK_Callback + 0x0000000000000000 0x2 build/stm32f3xx_hal_cortex.o + .text.HAL_SYSTICK_IRQHandler + 0x0000000000000000 0x8 build/stm32f3xx_hal_cortex.o + .text 0x0000000000000000 0x0 build/stm32f3xx_hal_dma.o + .data 0x0000000000000000 0x0 build/stm32f3xx_hal_dma.o + .bss 0x0000000000000000 0x0 build/stm32f3xx_hal_dma.o + .text.DMA_SetConfig + 0x0000000000000000 0x2c build/stm32f3xx_hal_dma.o + .text.DMA_CalcBaseAndBitshift + 0x0000000000000000 0x4c build/stm32f3xx_hal_dma.o + .text.HAL_DMA_Init + 0x0000000000000000 0x50 build/stm32f3xx_hal_dma.o + .text.HAL_DMA_DeInit + 0x0000000000000000 0x4a build/stm32f3xx_hal_dma.o + .text.HAL_DMA_Start + 0x0000000000000000 0x50 build/stm32f3xx_hal_dma.o + .text.HAL_DMA_Start_IT + 0x0000000000000000 0x74 build/stm32f3xx_hal_dma.o + .text.HAL_DMA_Abort + 0x0000000000000000 0x44 build/stm32f3xx_hal_dma.o + .text.HAL_DMA_Abort_IT + 0x0000000000000000 0x4a build/stm32f3xx_hal_dma.o + .text.HAL_DMA_PollForTransfer + 0x0000000000000000 0xc2 build/stm32f3xx_hal_dma.o + .text.HAL_DMA_IRQHandler + 0x0000000000000000 0xb2 build/stm32f3xx_hal_dma.o + .text.HAL_DMA_RegisterCallback + 0x0000000000000000 0x4a build/stm32f3xx_hal_dma.o + .text.HAL_DMA_UnRegisterCallback + 0x0000000000000000 0x5a build/stm32f3xx_hal_dma.o + .text.HAL_DMA_GetState + 0x0000000000000000 0x6 build/stm32f3xx_hal_dma.o + .text.HAL_DMA_GetError + 0x0000000000000000 0x4 build/stm32f3xx_hal_dma.o + .debug_info 0x0000000000000000 0x809 build/stm32f3xx_hal_dma.o + .debug_abbrev 0x0000000000000000 0x235 build/stm32f3xx_hal_dma.o + .debug_loclists + 0x0000000000000000 0x4c8 build/stm32f3xx_hal_dma.o + .debug_aranges + 0x0000000000000000 0x88 build/stm32f3xx_hal_dma.o + .debug_rnglists + 0x0000000000000000 0x63 build/stm32f3xx_hal_dma.o + .debug_line 0x0000000000000000 0xaa3 build/stm32f3xx_hal_dma.o + .debug_str 0x0000000000000000 0x617 build/stm32f3xx_hal_dma.o + .comment 0x0000000000000000 0x3a build/stm32f3xx_hal_dma.o + .debug_frame 0x0000000000000000 0x160 build/stm32f3xx_hal_dma.o + .ARM.attributes + 0x0000000000000000 0x34 build/stm32f3xx_hal_dma.o + .text 0x0000000000000000 0x0 build/stm32f3xx_hal_exti.o + .data 0x0000000000000000 0x0 build/stm32f3xx_hal_exti.o + .bss 0x0000000000000000 0x0 build/stm32f3xx_hal_exti.o + .text.HAL_EXTI_SetConfigLine + 0x0000000000000000 0xdc build/stm32f3xx_hal_exti.o + .text.HAL_EXTI_GetConfigLine + 0x0000000000000000 0xbc build/stm32f3xx_hal_exti.o + .text.HAL_EXTI_ClearConfigLine + 0x0000000000000000 0xa0 build/stm32f3xx_hal_exti.o + .text.HAL_EXTI_RegisterCallback + 0x0000000000000000 0xe build/stm32f3xx_hal_exti.o + .text.HAL_EXTI_GetHandle + 0x0000000000000000 0xc build/stm32f3xx_hal_exti.o + .text.HAL_EXTI_IRQHandler + 0x0000000000000000 0x30 build/stm32f3xx_hal_exti.o + .text.HAL_EXTI_GetPending + 0x0000000000000000 0x20 build/stm32f3xx_hal_exti.o + .text.HAL_EXTI_ClearPending + 0x0000000000000000 0x1c build/stm32f3xx_hal_exti.o + .text.HAL_EXTI_GenerateSWI + 0x0000000000000000 0x1c build/stm32f3xx_hal_exti.o + .debug_info 0x0000000000000000 0x6dd build/stm32f3xx_hal_exti.o + .debug_abbrev 0x0000000000000000 0x1c3 build/stm32f3xx_hal_exti.o + .debug_loclists + 0x0000000000000000 0x704 build/stm32f3xx_hal_exti.o + .debug_aranges + 0x0000000000000000 0x60 build/stm32f3xx_hal_exti.o + .debug_rnglists + 0x0000000000000000 0x46 build/stm32f3xx_hal_exti.o + .debug_line 0x0000000000000000 0x7b5 build/stm32f3xx_hal_exti.o + .debug_str 0x0000000000000000 0x415 build/stm32f3xx_hal_exti.o + .comment 0x0000000000000000 0x3a build/stm32f3xx_hal_exti.o + .debug_frame 0x0000000000000000 0xf4 build/stm32f3xx_hal_exti.o + .ARM.attributes + 0x0000000000000000 0x34 build/stm32f3xx_hal_exti.o + .text 0x0000000000000000 0x0 build/stm32f3xx_hal_flash.o + .data 0x0000000000000000 0x0 build/stm32f3xx_hal_flash.o + .bss 0x0000000000000000 0x0 build/stm32f3xx_hal_flash.o + .text.FLASH_Program_HalfWord + 0x0000000000000000 0x1c build/stm32f3xx_hal_flash.o + .text.FLASH_SetErrorCode + 0x0000000000000000 0x3c build/stm32f3xx_hal_flash.o + .text.HAL_FLASH_Program_IT + 0x0000000000000000 0x6c build/stm32f3xx_hal_flash.o + .text.HAL_FLASH_EndOfOperationCallback + 0x0000000000000000 0x2 build/stm32f3xx_hal_flash.o + .text.HAL_FLASH_OperationErrorCallback + 0x0000000000000000 0x2 build/stm32f3xx_hal_flash.o + .text.HAL_FLASH_IRQHandler + 0x0000000000000000 0x154 build/stm32f3xx_hal_flash.o + .text.HAL_FLASH_Unlock + 0x0000000000000000 0x34 build/stm32f3xx_hal_flash.o + .text.HAL_FLASH_Lock + 0x0000000000000000 0x14 build/stm32f3xx_hal_flash.o + .text.HAL_FLASH_OB_Unlock + 0x0000000000000000 0x28 build/stm32f3xx_hal_flash.o + .text.HAL_FLASH_OB_Lock + 0x0000000000000000 0x14 build/stm32f3xx_hal_flash.o + .text.HAL_FLASH_GetError + 0x0000000000000000 0xc build/stm32f3xx_hal_flash.o + .text.FLASH_WaitForLastOperation + 0x0000000000000000 0x60 build/stm32f3xx_hal_flash.o + .text.HAL_FLASH_Program + 0x0000000000000000 0xa0 build/stm32f3xx_hal_flash.o + .text.HAL_FLASH_OB_Launch + 0x0000000000000000 0x1c build/stm32f3xx_hal_flash.o + .bss.pFlash 0x0000000000000000 0x20 build/stm32f3xx_hal_flash.o + .debug_info 0x0000000000000000 0x649 build/stm32f3xx_hal_flash.o + .debug_abbrev 0x0000000000000000 0x258 build/stm32f3xx_hal_flash.o + .debug_loclists + 0x0000000000000000 0x24a build/stm32f3xx_hal_flash.o + .debug_aranges + 0x0000000000000000 0x88 build/stm32f3xx_hal_flash.o + .debug_rnglists + 0x0000000000000000 0x63 build/stm32f3xx_hal_flash.o + .debug_line 0x0000000000000000 0x748 build/stm32f3xx_hal_flash.o + .debug_str 0x0000000000000000 0x51c build/stm32f3xx_hal_flash.o + .comment 0x0000000000000000 0x3a build/stm32f3xx_hal_flash.o + .debug_frame 0x0000000000000000 0x134 build/stm32f3xx_hal_flash.o + .ARM.attributes + 0x0000000000000000 0x34 build/stm32f3xx_hal_flash.o + .text 0x0000000000000000 0x0 build/stm32f3xx_hal_flash_ex.o + .data 0x0000000000000000 0x0 build/stm32f3xx_hal_flash_ex.o + .bss 0x0000000000000000 0x0 build/stm32f3xx_hal_flash_ex.o + .text.FLASH_MassErase + 0x0000000000000000 0x24 build/stm32f3xx_hal_flash_ex.o + .text.FLASH_OB_GetWRP + 0x0000000000000000 0xc build/stm32f3xx_hal_flash_ex.o + .text.FLASH_OB_GetRDP + 0x0000000000000000 0x20 build/stm32f3xx_hal_flash_ex.o + .text.FLASH_OB_RDP_LevelConfig + 0x0000000000000000 0x68 build/stm32f3xx_hal_flash_ex.o + .text.FLASH_OB_UserConfig + 0x0000000000000000 0x48 build/stm32f3xx_hal_flash_ex.o + .text.FLASH_OB_ProgramData + 0x0000000000000000 0x40 build/stm32f3xx_hal_flash_ex.o + .text.FLASH_OB_GetUser + 0x0000000000000000 0x20 build/stm32f3xx_hal_flash_ex.o + .text.HAL_FLASHEx_OBErase + 0x0000000000000000 0x50 build/stm32f3xx_hal_flash_ex.o + .text.FLASH_OB_EnableWRP + 0x0000000000000000 0xc4 build/stm32f3xx_hal_flash_ex.o + .text.FLASH_OB_DisableWRP + 0x0000000000000000 0xc8 build/stm32f3xx_hal_flash_ex.o + .text.HAL_FLASHEx_OBProgram + 0x0000000000000000 0x9c build/stm32f3xx_hal_flash_ex.o + .text.HAL_FLASHEx_OBGetConfig + 0x0000000000000000 0x1c build/stm32f3xx_hal_flash_ex.o + .text.HAL_FLASHEx_OBGetUserData + 0x0000000000000000 0x40 build/stm32f3xx_hal_flash_ex.o + .text.FLASH_PageErase + 0x0000000000000000 0x24 build/stm32f3xx_hal_flash_ex.o + .text.HAL_FLASHEx_Erase + 0x0000000000000000 0xa4 build/stm32f3xx_hal_flash_ex.o + .text.HAL_FLASHEx_Erase_IT + 0x0000000000000000 0x5c build/stm32f3xx_hal_flash_ex.o + .debug_info 0x0000000000000000 0xb14 build/stm32f3xx_hal_flash_ex.o + .debug_abbrev 0x0000000000000000 0x2bd build/stm32f3xx_hal_flash_ex.o + .debug_loclists + 0x0000000000000000 0x54c build/stm32f3xx_hal_flash_ex.o + .debug_aranges + 0x0000000000000000 0x98 build/stm32f3xx_hal_flash_ex.o + .debug_rnglists + 0x0000000000000000 0x71 build/stm32f3xx_hal_flash_ex.o + .debug_line 0x0000000000000000 0x9fe build/stm32f3xx_hal_flash_ex.o + .debug_str 0x0000000000000000 0x644 build/stm32f3xx_hal_flash_ex.o + .comment 0x0000000000000000 0x3a build/stm32f3xx_hal_flash_ex.o + .debug_frame 0x0000000000000000 0x194 build/stm32f3xx_hal_flash_ex.o + .ARM.attributes + 0x0000000000000000 0x34 build/stm32f3xx_hal_flash_ex.o + .text 0x0000000000000000 0x0 build/stm32f3xx_hal_gpio.o + .data 0x0000000000000000 0x0 build/stm32f3xx_hal_gpio.o + .bss 0x0000000000000000 0x0 build/stm32f3xx_hal_gpio.o + .text.HAL_GPIO_DeInit + 0x0000000000000000 0x10c build/stm32f3xx_hal_gpio.o + .text.HAL_GPIO_ReadPin + 0x0000000000000000 0xe build/stm32f3xx_hal_gpio.o + .text.HAL_GPIO_TogglePin + 0x0000000000000000 0x12 build/stm32f3xx_hal_gpio.o + .text.HAL_GPIO_LockPin + 0x0000000000000000 0x2e build/stm32f3xx_hal_gpio.o + .text.HAL_GPIO_EXTI_Callback + 0x0000000000000000 0x2 build/stm32f3xx_hal_gpio.o + .text.HAL_GPIO_EXTI_IRQHandler + 0x0000000000000000 0x1c build/stm32f3xx_hal_gpio.o + .text 0x0000000000000000 0x0 build/stm32f3xx_hal_i2c.o + .data 0x0000000000000000 0x0 build/stm32f3xx_hal_i2c.o + .bss 0x0000000000000000 0x0 build/stm32f3xx_hal_i2c.o + .text.I2C_Enable_IRQ + 0x0000000000000000 0x74 build/stm32f3xx_hal_i2c.o + .text.I2C_Disable_IRQ + 0x0000000000000000 0x70 build/stm32f3xx_hal_i2c.o + .text.I2C_ConvertOtherXferOptions + 0x0000000000000000 0x1e build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_MspInit + 0x0000000000000000 0x2 build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_MspDeInit + 0x0000000000000000 0x2 build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_DeInit + 0x0000000000000000 0x32 build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Slave_Transmit + 0x0000000000000000 0x190 build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Slave_Receive + 0x0000000000000000 0x16e build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Master_Transmit_IT + 0x0000000000000000 0x98 build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Master_Receive_IT + 0x0000000000000000 0x98 build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Slave_Transmit_IT + 0x0000000000000000 0x64 build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Slave_Receive_IT + 0x0000000000000000 0x64 build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Master_Transmit_DMA + 0x0000000000000000 0x154 build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Master_Receive_DMA + 0x0000000000000000 0x150 build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Slave_Transmit_DMA + 0x0000000000000000 0xf0 build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Slave_Receive_DMA + 0x0000000000000000 0xf4 build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Mem_Write_IT + 0x0000000000000000 0xe4 build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Mem_Read_IT + 0x0000000000000000 0xe8 build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Mem_Write_DMA + 0x0000000000000000 0x16c build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Mem_Read_DMA + 0x0000000000000000 0x170 build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_IsDeviceReady + 0x0000000000000000 0x16c build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Master_Seq_Transmit_IT + 0x0000000000000000 0xb4 build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Master_Seq_Transmit_DMA + 0x0000000000000000 0x174 build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Master_Seq_Receive_IT + 0x0000000000000000 0xb4 build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Master_Seq_Receive_DMA + 0x0000000000000000 0x174 build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Slave_Seq_Transmit_IT + 0x0000000000000000 0xd8 build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Slave_Seq_Transmit_DMA + 0x0000000000000000 0x1a4 build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Slave_Seq_Receive_IT + 0x0000000000000000 0xd8 build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Slave_Seq_Receive_DMA + 0x0000000000000000 0x1a0 build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_EnableListen_IT + 0x0000000000000000 0x2c build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_DisableListen_IT + 0x0000000000000000 0x3a build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Master_Abort_IT + 0x0000000000000000 0x84 build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_EV_IRQHandler + 0x0000000000000000 0x10 build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_MasterTxCpltCallback + 0x0000000000000000 0x2 build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_MasterRxCpltCallback + 0x0000000000000000 0x2 build/stm32f3xx_hal_i2c.o + .text.I2C_ITMasterSeqCplt + 0x0000000000000000 0x54 build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_SlaveTxCpltCallback + 0x0000000000000000 0x2 build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_SlaveRxCpltCallback + 0x0000000000000000 0x2 build/stm32f3xx_hal_i2c.o + .text.I2C_ITSlaveSeqCplt + 0x0000000000000000 0x82 build/stm32f3xx_hal_i2c.o + .text.I2C_DMASlaveTransmitCplt + 0x0000000000000000 0x1e build/stm32f3xx_hal_i2c.o + .text.I2C_DMASlaveReceiveCplt + 0x0000000000000000 0x26 build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_AddrCallback + 0x0000000000000000 0x2 build/stm32f3xx_hal_i2c.o + .text.I2C_ITAddrCplt + 0x0000000000000000 0xa0 build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_ListenCpltCallback + 0x0000000000000000 0x2 build/stm32f3xx_hal_i2c.o + .text.I2C_ITListenCplt + 0x0000000000000000 0x68 build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_MemTxCpltCallback + 0x0000000000000000 0x2 build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_MemRxCpltCallback + 0x0000000000000000 0x2 build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_ErrorCallback + 0x0000000000000000 0x2 build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_AbortCpltCallback + 0x0000000000000000 0x2 build/stm32f3xx_hal_i2c.o + .text.I2C_TreatErrorCallback + 0x0000000000000000 0x2e build/stm32f3xx_hal_i2c.o + .text.I2C_ITError + 0x0000000000000000 0x108 build/stm32f3xx_hal_i2c.o + .text.I2C_ITSlaveCplt + 0x0000000000000000 0x168 build/stm32f3xx_hal_i2c.o + .text.I2C_Slave_ISR_IT + 0x0000000000000000 0x14e build/stm32f3xx_hal_i2c.o + .text.I2C_ITMasterCplt + 0x0000000000000000 0x12e build/stm32f3xx_hal_i2c.o + .text.I2C_Master_ISR_IT + 0x0000000000000000 0x180 build/stm32f3xx_hal_i2c.o + .text.I2C_Slave_ISR_DMA + 0x0000000000000000 0x120 build/stm32f3xx_hal_i2c.o + .text.I2C_Master_ISR_DMA + 0x0000000000000000 0x142 build/stm32f3xx_hal_i2c.o + .text.I2C_DMAError + 0x0000000000000000 0x16 build/stm32f3xx_hal_i2c.o + .text.I2C_DMAMasterTransmitCplt + 0x0000000000000000 0x5a build/stm32f3xx_hal_i2c.o + .text.I2C_DMAMasterReceiveCplt + 0x0000000000000000 0x5a build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_ER_IRQHandler + 0x0000000000000000 0x6a build/stm32f3xx_hal_i2c.o + .text.I2C_DMAAbort + 0x0000000000000000 0x1a build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_GetState + 0x0000000000000000 0x6 build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_GetMode + 0x0000000000000000 0x6 build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_GetError + 0x0000000000000000 0x4 build/stm32f3xx_hal_i2c.o + .text 0x0000000000000000 0x0 build/stm32f3xx_hal_i2c_ex.o + .data 0x0000000000000000 0x0 build/stm32f3xx_hal_i2c_ex.o + .bss 0x0000000000000000 0x0 build/stm32f3xx_hal_i2c_ex.o + .text.HAL_I2CEx_EnableWakeUp + 0x0000000000000000 0x54 build/stm32f3xx_hal_i2c_ex.o + .text.HAL_I2CEx_DisableWakeUp + 0x0000000000000000 0x54 build/stm32f3xx_hal_i2c_ex.o + .text.HAL_I2CEx_EnableFastModePlus + 0x0000000000000000 0x2c build/stm32f3xx_hal_i2c_ex.o + .text.HAL_I2CEx_DisableFastModePlus + 0x0000000000000000 0x2c build/stm32f3xx_hal_i2c_ex.o + .text 0x0000000000000000 0x0 build/stm32f3xx_hal_pwr.o + .data 0x0000000000000000 0x0 build/stm32f3xx_hal_pwr.o + .bss 0x0000000000000000 0x0 build/stm32f3xx_hal_pwr.o + .text.HAL_PWR_DeInit + 0x0000000000000000 0x18 build/stm32f3xx_hal_pwr.o + .text.HAL_PWR_EnableBkUpAccess + 0x0000000000000000 0x10 build/stm32f3xx_hal_pwr.o + .text.HAL_PWR_DisableBkUpAccess + 0x0000000000000000 0x10 build/stm32f3xx_hal_pwr.o + .text.HAL_PWR_EnableWakeUpPin + 0x0000000000000000 0x10 build/stm32f3xx_hal_pwr.o + .text.HAL_PWR_DisableWakeUpPin + 0x0000000000000000 0x10 build/stm32f3xx_hal_pwr.o + .text.HAL_PWR_EnterSLEEPMode + 0x0000000000000000 0x20 build/stm32f3xx_hal_pwr.o + .text.HAL_PWR_EnterSTOPMode + 0x0000000000000000 0x38 build/stm32f3xx_hal_pwr.o + .text.HAL_PWR_EnterSTANDBYMode + 0x0000000000000000 0x20 build/stm32f3xx_hal_pwr.o + .text.HAL_PWR_EnableSleepOnExit + 0x0000000000000000 0x10 build/stm32f3xx_hal_pwr.o + .text.HAL_PWR_DisableSleepOnExit + 0x0000000000000000 0x10 build/stm32f3xx_hal_pwr.o + .text.HAL_PWR_EnableSEVOnPend + 0x0000000000000000 0x10 build/stm32f3xx_hal_pwr.o + .text.HAL_PWR_DisableSEVOnPend + 0x0000000000000000 0x10 build/stm32f3xx_hal_pwr.o + .debug_info 0x0000000000000000 0x4a5 build/stm32f3xx_hal_pwr.o + .debug_abbrev 0x0000000000000000 0x140 build/stm32f3xx_hal_pwr.o + .debug_loclists + 0x0000000000000000 0x2c build/stm32f3xx_hal_pwr.o + .debug_aranges + 0x0000000000000000 0x78 build/stm32f3xx_hal_pwr.o + .debug_rnglists + 0x0000000000000000 0x55 build/stm32f3xx_hal_pwr.o + .debug_line 0x0000000000000000 0x3a5 build/stm32f3xx_hal_pwr.o + .debug_str 0x0000000000000000 0x3d8 build/stm32f3xx_hal_pwr.o + .comment 0x0000000000000000 0x3a build/stm32f3xx_hal_pwr.o + .debug_frame 0x0000000000000000 0xd0 build/stm32f3xx_hal_pwr.o + .ARM.attributes + 0x0000000000000000 0x34 build/stm32f3xx_hal_pwr.o + .text 0x0000000000000000 0x0 build/stm32f3xx_hal_pwr_ex.o + .data 0x0000000000000000 0x0 build/stm32f3xx_hal_pwr_ex.o + .bss 0x0000000000000000 0x0 build/stm32f3xx_hal_pwr_ex.o + .text.HAL_PWR_ConfigPVD + 0x0000000000000000 0x84 build/stm32f3xx_hal_pwr_ex.o + .text.HAL_PWR_EnablePVD + 0x0000000000000000 0x10 build/stm32f3xx_hal_pwr_ex.o + .text.HAL_PWR_DisablePVD + 0x0000000000000000 0x10 build/stm32f3xx_hal_pwr_ex.o + .text.HAL_PWR_PVDCallback + 0x0000000000000000 0x2 build/stm32f3xx_hal_pwr_ex.o + .text.HAL_PWR_PVD_IRQHandler + 0x0000000000000000 0x20 build/stm32f3xx_hal_pwr_ex.o + .debug_info 0x0000000000000000 0x23a build/stm32f3xx_hal_pwr_ex.o + .debug_abbrev 0x0000000000000000 0x128 build/stm32f3xx_hal_pwr_ex.o + .debug_aranges + 0x0000000000000000 0x40 build/stm32f3xx_hal_pwr_ex.o + .debug_rnglists + 0x0000000000000000 0x2c build/stm32f3xx_hal_pwr_ex.o + .debug_line 0x0000000000000000 0x2e8 build/stm32f3xx_hal_pwr_ex.o + .debug_str 0x0000000000000000 0x2a6 build/stm32f3xx_hal_pwr_ex.o + .comment 0x0000000000000000 0x3a build/stm32f3xx_hal_pwr_ex.o + .debug_frame 0x0000000000000000 0x68 build/stm32f3xx_hal_pwr_ex.o + .ARM.attributes + 0x0000000000000000 0x34 build/stm32f3xx_hal_pwr_ex.o + .text 0x0000000000000000 0x0 build/stm32f3xx_hal_rcc.o + .data 0x0000000000000000 0x0 build/stm32f3xx_hal_rcc.o + .bss 0x0000000000000000 0x0 build/stm32f3xx_hal_rcc.o + .text.HAL_RCC_DeInit + 0x0000000000000000 0xf4 build/stm32f3xx_hal_rcc.o + .text.HAL_RCC_MCOConfig + 0x0000000000000000 0x4c build/stm32f3xx_hal_rcc.o + .text.HAL_RCC_EnableCSS + 0x0000000000000000 0x1c build/stm32f3xx_hal_rcc.o + .text.HAL_RCC_DisableCSS + 0x0000000000000000 0x1c build/stm32f3xx_hal_rcc.o + .text.HAL_RCC_GetHCLKFreq + 0x0000000000000000 0xc build/stm32f3xx_hal_rcc.o + .text.HAL_RCC_GetPCLK1Freq + 0x0000000000000000 0x2c build/stm32f3xx_hal_rcc.o + .text.HAL_RCC_GetPCLK2Freq + 0x0000000000000000 0x2c build/stm32f3xx_hal_rcc.o + .text.HAL_RCC_GetOscConfig + 0x0000000000000000 0xc0 build/stm32f3xx_hal_rcc.o + .text.HAL_RCC_GetClockConfig + 0x0000000000000000 0x3c build/stm32f3xx_hal_rcc.o + .text.HAL_RCC_CSSCallback + 0x0000000000000000 0x2 build/stm32f3xx_hal_rcc.o + .text.HAL_RCC_NMI_IRQHandler + 0x0000000000000000 0x20 build/stm32f3xx_hal_rcc.o + .text 0x0000000000000000 0x0 build/stm32f3xx_hal_rcc_ex.o + .data 0x0000000000000000 0x0 build/stm32f3xx_hal_rcc_ex.o + .bss 0x0000000000000000 0x0 build/stm32f3xx_hal_rcc_ex.o + .text.RCC_GetPLLCLKFreq + 0x0000000000000000 0x3c build/stm32f3xx_hal_rcc_ex.o + .text.HAL_RCCEx_GetPeriphCLKConfig + 0x0000000000000000 0xa0 build/stm32f3xx_hal_rcc_ex.o + .text.HAL_RCCEx_GetPeriphCLKFreq + 0x0000000000000000 0x380 build/stm32f3xx_hal_rcc_ex.o + .rodata 0x0000000000000000 0x20 build/stm32f3xx_hal_rcc_ex.o + .text 0x0000000000000000 0x0 build/stm32f3xx_hal_spi.o + .data 0x0000000000000000 0x0 build/stm32f3xx_hal_spi.o + .bss 0x0000000000000000 0x0 build/stm32f3xx_hal_spi.o + .text.SPI_EndRxTransaction + 0x0000000000000000 0x82 build/stm32f3xx_hal_spi.o + .text.SPI_AbortRx_ISR + 0x0000000000000000 0x90 build/stm32f3xx_hal_spi.o + .text.SPI_AbortTx_ISR + 0x0000000000000000 0xf0 build/stm32f3xx_hal_spi.o + .text.HAL_SPI_MspInit + 0x0000000000000000 0x2 build/stm32f3xx_hal_spi.o + .text.HAL_SPI_MspDeInit + 0x0000000000000000 0x2 build/stm32f3xx_hal_spi.o + .text.HAL_SPI_DeInit + 0x0000000000000000 0x2c build/stm32f3xx_hal_spi.o + .text.HAL_SPI_Transmit + 0x0000000000000000 0x202 build/stm32f3xx_hal_spi.o + .text.HAL_SPI_Receive + 0x0000000000000000 0x1aa build/stm32f3xx_hal_spi.o + .text.HAL_SPI_Transmit_IT + 0x0000000000000000 0xb0 build/stm32f3xx_hal_spi.o + .text.HAL_SPI_TransmitReceive_IT + 0x0000000000000000 0x114 build/stm32f3xx_hal_spi.o + .text.HAL_SPI_Receive_IT + 0x0000000000000000 0xfc build/stm32f3xx_hal_spi.o + .text.HAL_SPI_Transmit_DMA + 0x0000000000000000 0x134 build/stm32f3xx_hal_spi.o + .text.HAL_SPI_TransmitReceive_DMA + 0x0000000000000000 0x22c build/stm32f3xx_hal_spi.o + .text.HAL_SPI_Receive_DMA + 0x0000000000000000 0x194 build/stm32f3xx_hal_spi.o + .text.HAL_SPI_Abort + 0x0000000000000000 0x190 build/stm32f3xx_hal_spi.o + .text.HAL_SPI_DMAPause + 0x0000000000000000 0x26 build/stm32f3xx_hal_spi.o + .text.HAL_SPI_DMAResume + 0x0000000000000000 0x26 build/stm32f3xx_hal_spi.o + .text.HAL_SPI_DMAStop + 0x0000000000000000 0x46 build/stm32f3xx_hal_spi.o + .text.HAL_SPI_TxCpltCallback + 0x0000000000000000 0x2 build/stm32f3xx_hal_spi.o + .text.HAL_SPI_RxCpltCallback + 0x0000000000000000 0x2 build/stm32f3xx_hal_spi.o + .text.HAL_SPI_TxRxCpltCallback + 0x0000000000000000 0x2 build/stm32f3xx_hal_spi.o + .text.HAL_SPI_TxHalfCpltCallback + 0x0000000000000000 0x2 build/stm32f3xx_hal_spi.o + .text.SPI_DMAHalfTransmitCplt + 0x0000000000000000 0xa build/stm32f3xx_hal_spi.o + .text.HAL_SPI_RxHalfCpltCallback + 0x0000000000000000 0x2 build/stm32f3xx_hal_spi.o + .text.SPI_DMAHalfReceiveCplt + 0x0000000000000000 0xa build/stm32f3xx_hal_spi.o + .text.HAL_SPI_TxRxHalfCpltCallback + 0x0000000000000000 0x2 build/stm32f3xx_hal_spi.o + .text.SPI_DMAHalfTransmitReceiveCplt + 0x0000000000000000 0xa build/stm32f3xx_hal_spi.o + .text.HAL_SPI_ErrorCallback + 0x0000000000000000 0x2 build/stm32f3xx_hal_spi.o + .text.SPI_CloseTx_ISR + 0x0000000000000000 0x56 build/stm32f3xx_hal_spi.o + .text.SPI_TxISR_8BIT + 0x0000000000000000 0x28 build/stm32f3xx_hal_spi.o + .text.SPI_TxISR_16BIT + 0x0000000000000000 0x28 build/stm32f3xx_hal_spi.o + .text.SPI_CloseRx_ISR + 0x0000000000000000 0x40 build/stm32f3xx_hal_spi.o + .text.SPI_RxISR_8BIT + 0x0000000000000000 0x2e build/stm32f3xx_hal_spi.o + .text.SPI_RxISR_16BIT + 0x0000000000000000 0x2e build/stm32f3xx_hal_spi.o + .text.SPI_CloseRxTx_ISR + 0x0000000000000000 0x5e build/stm32f3xx_hal_spi.o + .text.SPI_2linesTxISR_8BIT + 0x0000000000000000 0x5c build/stm32f3xx_hal_spi.o + .text.SPI_2linesRxISR_8BIT + 0x0000000000000000 0x7a build/stm32f3xx_hal_spi.o + .text.SPI_2linesTxISR_16BIT + 0x0000000000000000 0x3a build/stm32f3xx_hal_spi.o + .text.SPI_2linesRxISR_16BIT + 0x0000000000000000 0x3e build/stm32f3xx_hal_spi.o + .text.SPI_DMAError + 0x0000000000000000 0x22 build/stm32f3xx_hal_spi.o + .text.SPI_DMATransmitCplt + 0x0000000000000000 0x70 build/stm32f3xx_hal_spi.o + .text.SPI_DMAReceiveCplt + 0x0000000000000000 0x70 build/stm32f3xx_hal_spi.o + .text.SPI_DMATransmitReceiveCplt + 0x0000000000000000 0x5e build/stm32f3xx_hal_spi.o + .text.HAL_SPI_IRQHandler + 0x0000000000000000 0x118 build/stm32f3xx_hal_spi.o + .text.SPI_DMAAbortOnError + 0x0000000000000000 0x12 build/stm32f3xx_hal_spi.o + .text.HAL_SPI_AbortCpltCallback + 0x0000000000000000 0x2 build/stm32f3xx_hal_spi.o + .text.HAL_SPI_Abort_IT + 0x0000000000000000 0x160 build/stm32f3xx_hal_spi.o + .text.SPI_DMARxAbortCallback + 0x0000000000000000 0x94 build/stm32f3xx_hal_spi.o + .text.SPI_DMATxAbortCallback + 0x0000000000000000 0x90 build/stm32f3xx_hal_spi.o + .text.HAL_SPI_GetState + 0x0000000000000000 0x6 build/stm32f3xx_hal_spi.o + .text.HAL_SPI_GetError + 0x0000000000000000 0x4 build/stm32f3xx_hal_spi.o + .text 0x0000000000000000 0x0 build/stm32f3xx_hal_spi_ex.o + .data 0x0000000000000000 0x0 build/stm32f3xx_hal_spi_ex.o + .bss 0x0000000000000000 0x0 build/stm32f3xx_hal_spi_ex.o + .text.HAL_SPIEx_FlushRxFifo + 0x0000000000000000 0x36 build/stm32f3xx_hal_spi_ex.o + .debug_info 0x0000000000000000 0x5ed build/stm32f3xx_hal_spi_ex.o + .debug_abbrev 0x0000000000000000 0x162 build/stm32f3xx_hal_spi_ex.o + .debug_loclists + 0x0000000000000000 0x61 build/stm32f3xx_hal_spi_ex.o + .debug_aranges + 0x0000000000000000 0x20 build/stm32f3xx_hal_spi_ex.o + .debug_rnglists + 0x0000000000000000 0x13 build/stm32f3xx_hal_spi_ex.o + .debug_line 0x0000000000000000 0x2ab build/stm32f3xx_hal_spi_ex.o + .debug_str 0x0000000000000000 0x610 build/stm32f3xx_hal_spi_ex.o + .comment 0x0000000000000000 0x3a build/stm32f3xx_hal_spi_ex.o + .debug_frame 0x0000000000000000 0x2c build/stm32f3xx_hal_spi_ex.o + .ARM.attributes + 0x0000000000000000 0x34 build/stm32f3xx_hal_spi_ex.o + .text 0x0000000000000000 0x0 build/stm32f3xx_hal_tim.o + .data 0x0000000000000000 0x0 build/stm32f3xx_hal_tim.o + .bss 0x0000000000000000 0x0 build/stm32f3xx_hal_tim.o + .debug_info 0x0000000000000000 0x6c build/stm32f3xx_hal_tim.o + .debug_abbrev 0x0000000000000000 0x26 build/stm32f3xx_hal_tim.o + .debug_aranges + 0x0000000000000000 0x18 build/stm32f3xx_hal_tim.o + .debug_line 0x0000000000000000 0x55 build/stm32f3xx_hal_tim.o + .debug_str 0x0000000000000000 0x1a5 build/stm32f3xx_hal_tim.o + .comment 0x0000000000000000 0x3a build/stm32f3xx_hal_tim.o + .ARM.attributes + 0x0000000000000000 0x34 build/stm32f3xx_hal_tim.o + .text 0x0000000000000000 0x0 build/stm32f3xx_hal_tim_ex.o + .data 0x0000000000000000 0x0 build/stm32f3xx_hal_tim_ex.o + .bss 0x0000000000000000 0x0 build/stm32f3xx_hal_tim_ex.o + .debug_info 0x0000000000000000 0x6c build/stm32f3xx_hal_tim_ex.o + .debug_abbrev 0x0000000000000000 0x26 build/stm32f3xx_hal_tim_ex.o + .debug_aranges + 0x0000000000000000 0x18 build/stm32f3xx_hal_tim_ex.o + .debug_line 0x0000000000000000 0x58 build/stm32f3xx_hal_tim_ex.o + .debug_str 0x0000000000000000 0x1a8 build/stm32f3xx_hal_tim_ex.o + .comment 0x0000000000000000 0x3a build/stm32f3xx_hal_tim_ex.o + .ARM.attributes + 0x0000000000000000 0x34 build/stm32f3xx_hal_tim_ex.o + .text 0x0000000000000000 0x14 build/startup_stm32f302xc.o + .data 0x0000000000000000 0x0 build/startup_stm32f302xc.o + .bss 0x0000000000000000 0x0 build/startup_stm32f302xc.o + .text 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-atexit.o) + .data 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-atexit.o) + .bss 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-atexit.o) + .text.atexit 0x0000000000000000 0xc /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-atexit.o) + .comment 0x0000000000000000 0x3a /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-atexit.o) + .ARM.attributes + 0x0000000000000000 0x34 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-atexit.o) + .text 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-exit.o) + .data 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-exit.o) + .bss 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-exit.o) + .text.exit 0x0000000000000000 0x24 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-exit.o) + .comment 0x0000000000000000 0x3a /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-exit.o) + .ARM.attributes + 0x0000000000000000 0x34 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-exit.o) + .text 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) + .data 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) + .bss 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) + .text.std 0x0000000000000000 0x6c /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) + .text.stdio_exit_handler + 0x0000000000000000 0x18 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) + .text.cleanup_stdio + 0x0000000000000000 0x40 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) + .text.__fp_lock + 0x0000000000000000 0x18 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) + .text.__fp_unlock + 0x0000000000000000 0x18 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) + .text.global_stdio_init.part.0 + 0x0000000000000000 0x3c /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) + .text.__sfp_lock_acquire + 0x0000000000000000 0xc /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) + .text.__sfp_lock_release + 0x0000000000000000 0xc /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) + .text.__sfp 0x0000000000000000 0xa4 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) + .text.__sinit 0x0000000000000000 0x30 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) + .text.__fp_lock_all + 0x0000000000000000 0x1c /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) + .text.__fp_unlock_all + 0x0000000000000000 0x1c /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) + .data.__sglue 0x0000000000000000 0xc /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) + .bss.__sf 0x0000000000000000 0x138 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) + .bss.__stdio_exit_handler + 0x0000000000000000 0x4 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) + .comment 0x0000000000000000 0x3a /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) + .ARM.attributes + 0x0000000000000000 0x34 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) + .text 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-fwalk.o) + .data 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-fwalk.o) + .bss 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-fwalk.o) + .text._fwalk_sglue + 0x0000000000000000 0x3c /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-fwalk.o) + .comment 0x0000000000000000 0x3a /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-fwalk.o) + .ARM.attributes + 0x0000000000000000 0x34 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-fwalk.o) + .text 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-stdio.o) + .data 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-stdio.o) + .bss 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-stdio.o) + .text.__sread 0x0000000000000000 0x22 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-stdio.o) + .text.__seofread + 0x0000000000000000 0x4 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-stdio.o) + .text.__swrite + 0x0000000000000000 0x38 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-stdio.o) + .text.__sseek 0x0000000000000000 0x24 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-stdio.o) + .text.__sclose + 0x0000000000000000 0x8 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-stdio.o) + .comment 0x0000000000000000 0x3a /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-stdio.o) + .ARM.attributes + 0x0000000000000000 0x34 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-stdio.o) + .text 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-memset.o) + .data 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-memset.o) + .bss 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-memset.o) + .text 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-closer.o) + .data 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-closer.o) + .bss 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-closer.o) + .text._close_r + 0x0000000000000000 0x20 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-closer.o) + .comment 0x0000000000000000 0x3a /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-closer.o) + .ARM.attributes + 0x0000000000000000 0x34 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-closer.o) + .text 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-reent.o) + .data 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-reent.o) + .bss 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-reent.o) + .text._reclaim_reent + 0x0000000000000000 0xac /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-reent.o) + .bss.errno 0x0000000000000000 0x4 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-reent.o) + .comment 0x0000000000000000 0x3a /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-reent.o) + .ARM.attributes + 0x0000000000000000 0x34 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-reent.o) + .text 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-impure.o) + .data 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-impure.o) + .bss 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-impure.o) + .data._impure_ptr + 0x0000000000000000 0x4 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-impure.o) + .data._impure_data + 0x0000000000000000 0x4c /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-impure.o) + .comment 0x0000000000000000 0x3a /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-impure.o) + .ARM.attributes + 0x0000000000000000 0x34 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-impure.o) + .text 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lseekr.o) + .data 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lseekr.o) + .bss 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lseekr.o) + .text._lseek_r + 0x0000000000000000 0x24 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lseekr.o) + .comment 0x0000000000000000 0x3a /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lseekr.o) + .ARM.attributes + 0x0000000000000000 0x34 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lseekr.o) + .text 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-readr.o) + .data 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-readr.o) + .bss 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-readr.o) + .text._read_r 0x0000000000000000 0x24 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-readr.o) + .comment 0x0000000000000000 0x3a /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-readr.o) + .ARM.attributes + 0x0000000000000000 0x34 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-readr.o) + .text 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-writer.o) + .data 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-writer.o) + .bss 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-writer.o) + .text._write_r + 0x0000000000000000 0x24 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-writer.o) + .comment 0x0000000000000000 0x3a /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-writer.o) + .ARM.attributes + 0x0000000000000000 0x34 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-writer.o) + .text 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-errno.o) + .data 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-errno.o) + .bss 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-errno.o) + .text.__errno 0x0000000000000000 0xc /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-errno.o) + .comment 0x0000000000000000 0x3a /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-errno.o) + .ARM.attributes + 0x0000000000000000 0x34 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-errno.o) + .text 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-init.o) + .data 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-init.o) + .bss 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-init.o) + .text 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-fini.o) + .data 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-fini.o) + .bss 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-fini.o) + .text.__libc_fini_array + 0x0000000000000000 0x28 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-fini.o) + .comment 0x0000000000000000 0x3a /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-fini.o) + .ARM.attributes + 0x0000000000000000 0x34 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-fini.o) + .text 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lock.o) + .data 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lock.o) + .bss 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lock.o) + .text.__retarget_lock_init + 0x0000000000000000 0x2 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lock.o) + .text.__retarget_lock_init_recursive + 0x0000000000000000 0x2 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lock.o) + .text.__retarget_lock_close + 0x0000000000000000 0x2 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lock.o) + .text.__retarget_lock_close_recursive + 0x0000000000000000 0x2 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lock.o) + .text.__retarget_lock_acquire + 0x0000000000000000 0x2 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lock.o) + .text.__retarget_lock_acquire_recursive + 0x0000000000000000 0x2 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lock.o) + .text.__retarget_lock_try_acquire + 0x0000000000000000 0x4 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lock.o) + .text.__retarget_lock_try_acquire_recursive + 0x0000000000000000 0x4 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lock.o) + .text.__retarget_lock_release + 0x0000000000000000 0x2 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lock.o) + .text.__retarget_lock_release_recursive + 0x0000000000000000 0x2 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lock.o) + .bss.__lock___arc4random_mutex + 0x0000000000000000 0x1 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lock.o) + .bss.__lock___dd_hash_mutex + 0x0000000000000000 0x1 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lock.o) + .bss.__lock___tz_mutex + 0x0000000000000000 0x1 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lock.o) + .bss.__lock___env_recursive_mutex + 0x0000000000000000 0x1 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lock.o) + .bss.__lock___malloc_recursive_mutex + 0x0000000000000000 0x1 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lock.o) + .bss.__lock___at_quick_exit_mutex + 0x0000000000000000 0x1 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lock.o) + .bss.__lock___atexit_recursive_mutex + 0x0000000000000000 0x1 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lock.o) + .bss.__lock___sfp_recursive_mutex + 0x0000000000000000 0x1 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lock.o) + .comment 0x0000000000000000 0x3a /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lock.o) + .ARM.attributes + 0x0000000000000000 0x34 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lock.o) + .text 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-__atexit.o) + .data 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-__atexit.o) + .bss 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-__atexit.o) + .text.__register_exitproc + 0x0000000000000000 0xb8 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-__atexit.o) + .bss.__atexit0 + 0x0000000000000000 0x8c /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-__atexit.o) + .data.__atexit_dummy + 0x0000000000000000 0x4 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-__atexit.o) + .comment 0x0000000000000000 0x3a /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-__atexit.o) + .ARM.attributes + 0x0000000000000000 0x34 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-__atexit.o) + .text 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-__call_atexit.o) + .data 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-__call_atexit.o) + .bss 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-__call_atexit.o) + .text.__call_exitprocs + 0x0000000000000000 0xc8 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-__call_atexit.o) + .bss.__atexit 0x0000000000000000 0x4 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-__call_atexit.o) + .data.__atexit_recursive_mutex + 0x0000000000000000 0x4 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-__call_atexit.o) + .comment 0x0000000000000000 0x3a /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-__call_atexit.o) + .ARM.attributes + 0x0000000000000000 0x34 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-__call_atexit.o) + .text 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-freer.o) + .data 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-freer.o) + .bss 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-freer.o) + .text._free_r 0x0000000000000000 0x94 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-freer.o) + .comment 0x0000000000000000 0x3a /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-freer.o) + .ARM.attributes + 0x0000000000000000 0x34 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-freer.o) + .text 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-mallocr.o) + .data 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-mallocr.o) + .bss 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-mallocr.o) + .text.sbrk_aligned + 0x0000000000000000 0x44 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-mallocr.o) + .text._malloc_r + 0x0000000000000000 0xf0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-mallocr.o) + .bss.__malloc_sbrk_start + 0x0000000000000000 0x4 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-mallocr.o) + .bss.__malloc_free_list + 0x0000000000000000 0x4 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-mallocr.o) + .comment 0x0000000000000000 0x3a /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-mallocr.o) + .ARM.attributes + 0x0000000000000000 0x34 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-mallocr.o) + .text 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-mlock.o) + .data 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-mlock.o) + .bss 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-mlock.o) + .text.__malloc_lock + 0x0000000000000000 0xc /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-mlock.o) + .text.__malloc_unlock + 0x0000000000000000 0xc /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-mlock.o) + .comment 0x0000000000000000 0x3a /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-mlock.o) + .ARM.attributes + 0x0000000000000000 0x34 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-mlock.o) + .text 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-fflush.o) + .data 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-fflush.o) + .bss 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-fflush.o) + .text.__sflush_r + 0x0000000000000000 0x108 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-fflush.o) + .text._fflush_r + 0x0000000000000000 0x50 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-fflush.o) + .text.fflush 0x0000000000000000 0x28 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-fflush.o) + .comment 0x0000000000000000 0x3a /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-fflush.o) + .ARM.attributes + 0x0000000000000000 0x34 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-fflush.o) + .text 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-sbrkr.o) + .data 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-sbrkr.o) + .bss 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-sbrkr.o) + .text._sbrk_r 0x0000000000000000 0x20 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-sbrkr.o) + .comment 0x0000000000000000 0x3a /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-sbrkr.o) + .ARM.attributes + 0x0000000000000000 0x34 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-sbrkr.o) + .text 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crtend.o + .data 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crtend.o + .bss 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crtend.o + .rodata.all_implied_fbits + 0x0000000000000000 0x24 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crtend.o + .eh_frame 0x0000000000000000 0x4 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crtend.o + .comment 0x0000000000000000 0x3a /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crtend.o + .ARM.attributes + 0x0000000000000000 0x34 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crtend.o + .text 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crtn.o + .data 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crtn.o + .bss 0x0000000000000000 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crtn.o + +Memory Configuration + +Name Origin Length Attributes +RAM 0x0000000020000000 0x000000000000a000 xrw +FLASH 0x0000000008000000 0x0000000000040000 xr +*default* 0x0000000000000000 0xffffffffffffffff + +Linker script and memory map + +LOAD /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crti.o +LOAD /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crtbegin.o +LOAD /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o +LOAD build/ADBMS_Abstraction.o +LOAD build/ADBMS_LL_Driver.o +LOAD build/AMS_CAN.o +LOAD build/AMS_HighLevel.o +LOAD build/Testbench.o +LOAD build/main.o +LOAD build/stm32f3xx_hal_msp.o +LOAD build/stm32f3xx_it.o +LOAD build/syscalls.o +LOAD build/sysmem.o +LOAD build/system_stm32f3xx.o +LOAD build/stm32f3xx_hal.o +LOAD build/stm32f3xx_hal_can.o +LOAD build/stm32f3xx_hal_cortex.o +LOAD build/stm32f3xx_hal_dma.o +LOAD build/stm32f3xx_hal_exti.o +LOAD build/stm32f3xx_hal_flash.o +LOAD build/stm32f3xx_hal_flash_ex.o +LOAD build/stm32f3xx_hal_gpio.o +LOAD build/stm32f3xx_hal_i2c.o +LOAD build/stm32f3xx_hal_i2c_ex.o +LOAD build/stm32f3xx_hal_pwr.o +LOAD build/stm32f3xx_hal_pwr_ex.o +LOAD build/stm32f3xx_hal_rcc.o +LOAD build/stm32f3xx_hal_rcc_ex.o +LOAD build/stm32f3xx_hal_spi.o +LOAD build/stm32f3xx_hal_spi_ex.o +LOAD build/stm32f3xx_hal_tim.o +LOAD build/stm32f3xx_hal_tim_ex.o +LOAD build/startup_stm32f302xc.o +LOAD /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a +LOAD /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libm.a +LOAD /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libnosys.a +START GROUP +LOAD /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/libgcc.a +LOAD /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a +END GROUP +START GROUP +LOAD /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/libgcc.a +LOAD /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a +END GROUP +LOAD /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crtend.o +LOAD /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crtn.o + 0x000000002000a000 _estack = (ORIGIN (RAM) + LENGTH (RAM)) + 0x0000000000000200 _Min_Heap_Size = 0x200 + 0x0000000000000400 _Min_Stack_Size = 0x400 + +.isr_vector 0x0000000008000000 0x188 + 0x0000000008000000 . = ALIGN (0x4) + *(.isr_vector) + .isr_vector 0x0000000008000000 0x188 build/startup_stm32f302xc.o + 0x0000000008000000 g_pfnVectors + 0x0000000008000188 . = ALIGN (0x4) + +.text 0x0000000008000188 0x3b74 + 0x0000000008000188 . = ALIGN (0x4) + *(.text) + *(.text*) + .text.__do_global_dtors_aux + 0x0000000008000188 0x24 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crtbegin.o + .text.frame_dummy + 0x00000000080001ac 0x1c /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crtbegin.o + .text.amsWakeUp + 0x00000000080001c8 0x16 build/ADBMS_Abstraction.o + 0x00000000080001c8 amsWakeUp + .text.amsAuxMeasurement + 0x00000000080001de 0xd6 build/ADBMS_Abstraction.o + 0x00000000080001de amsAuxMeasurement + .text.amsInternalStatusMeasurement + 0x00000000080002b4 0x6a build/ADBMS_Abstraction.o + 0x00000000080002b4 amsInternalStatusMeasurement + .text.amsConfigAuxMeasurement + 0x000000000800031e 0x4c build/ADBMS_Abstraction.o + 0x000000000800031e amsConfigAuxMeasurement + .text.amsConfigBalancing + 0x000000000800036a 0x7e build/ADBMS_Abstraction.o + 0x000000000800036a amsConfigBalancing + .text.amsStartBalancing + 0x00000000080003e8 0x10 build/ADBMS_Abstraction.o + 0x00000000080003e8 amsStartBalancing + .text.amsStopBalancing + 0x00000000080003f8 0x10 build/ADBMS_Abstraction.o + 0x00000000080003f8 amsStopBalancing + .text.amsConfigUnderVoltage + 0x0000000008000408 0x36 build/ADBMS_Abstraction.o + 0x0000000008000408 amsConfigUnderVoltage + .text.amsCheckUnderOverVoltage + 0x000000000800043e 0xac build/ADBMS_Abstraction.o + 0x000000000800043e amsCheckUnderOverVoltage + .text.amsConfigOverVoltage + 0x00000000080004ea 0x3e build/ADBMS_Abstraction.o + 0x00000000080004ea amsConfigOverVoltage + .text.initAMS 0x0000000008000528 0x40 build/ADBMS_Abstraction.o + 0x0000000008000528 initAMS + .text.amsClearAux + 0x0000000008000568 0x18 build/ADBMS_Abstraction.o + 0x0000000008000568 amsClearAux + .text.amsClearWarning + 0x0000000008000580 0x4 build/ADBMS_Abstraction.o + 0x0000000008000580 amsClearWarning + .text.amsReadCellVoltages + 0x0000000008000584 0x144 build/ADBMS_Abstraction.o + 0x0000000008000584 amsReadCellVoltages + .text.amsCellMeasurement + 0x00000000080006c8 0x24 build/ADBMS_Abstraction.o + 0x00000000080006c8 amsCellMeasurement + .text.updatePEC + 0x00000000080006ec 0x8c build/ADBMS_LL_Driver.o + 0x00000000080006ec updatePEC + .text.calculatePEC + 0x0000000008000778 0x3e build/ADBMS_LL_Driver.o + 0x0000000008000778 calculatePEC + .text.checkPEC + 0x00000000080007b6 0x58 build/ADBMS_LL_Driver.o + 0x00000000080007b6 checkPEC + .text.mcuAdbmsCSLow + 0x000000000800080e 0x10 build/ADBMS_LL_Driver.o + 0x000000000800080e mcuAdbmsCSLow + .text.mcuAdbmsCSHigh + 0x000000000800081e 0x10 build/ADBMS_LL_Driver.o + 0x000000000800081e mcuAdbmsCSHigh + *fill* 0x000000000800082e 0x2 + .text.adbmsDriverInit + 0x0000000008000830 0x20 build/ADBMS_LL_Driver.o + 0x0000000008000830 adbmsDriverInit + .text.mcuSPITransmit + 0x0000000008000850 0x44 build/ADBMS_LL_Driver.o + 0x0000000008000850 mcuSPITransmit + .text.writeCMD + 0x0000000008000894 0x8a build/ADBMS_LL_Driver.o + 0x0000000008000894 writeCMD + *fill* 0x000000000800091e 0x2 + .text.mcuSPITransmitReceive + 0x0000000008000920 0x20 build/ADBMS_LL_Driver.o + 0x0000000008000920 mcuSPITransmitReceive + .text.readCMD 0x0000000008000940 0x84 build/ADBMS_LL_Driver.o + 0x0000000008000940 readCMD + .text.mcuDelay + 0x00000000080009c4 0x8 build/ADBMS_LL_Driver.o + 0x00000000080009c4 mcuDelay + .text.ams_can_init + 0x00000000080009cc 0x8c build/AMS_CAN.o + 0x00000000080009cc ams_can_init + .text.ams_can_handle_ams_msg + 0x0000000008000a58 0x20 build/AMS_CAN.o + 0x0000000008000a58 ams_can_handle_ams_msg + .text.HAL_CAN_RxFifo0MsgPendingCallback + 0x0000000008000a78 0x44 build/AMS_CAN.o + 0x0000000008000a78 HAL_CAN_RxFifo0MsgPendingCallback + .text.ams_can_wait_for_free_mailboxes + 0x0000000008000abc 0x28 build/AMS_CAN.o + 0x0000000008000abc ams_can_wait_for_free_mailboxes + .text.ams_can_send_heartbeat + 0x0000000008000ae4 0x80 build/AMS_CAN.o + 0x0000000008000ae4 ams_can_send_heartbeat + .text.AMS_Init + 0x0000000008000b64 0x58 build/AMS_HighLevel.o + 0x0000000008000b64 AMS_Init + .text.AMS_Warning_Loop + 0x0000000008000bbc 0x68 build/AMS_HighLevel.o + 0x0000000008000bbc AMS_Warning_Loop + .text.integrateCurrent + 0x0000000008000c24 0x48 build/AMS_HighLevel.o + 0x0000000008000c24 integrateCurrent + .text.AMS_Idle_Loop + 0x0000000008000c6c 0x68 build/AMS_HighLevel.o + 0x0000000008000c6c AMS_Idle_Loop + .text.AMS_Loop + 0x0000000008000cd4 0x3c build/AMS_HighLevel.o + 0x0000000008000cd4 AMS_Loop + .text.canTestSendTemperatures + 0x0000000008000d10 0xfc build/Testbench.o + 0x0000000008000d10 canTestSendTemperatures + .text.canTestSendAnswer + 0x0000000008000e0c 0x40 build/Testbench.o + 0x0000000008000e0c canTestSendAnswer + .text.resetData + 0x0000000008000e4c 0x10 build/Testbench.o + 0x0000000008000e4c resetData + .text.readTemperatures + 0x0000000008000e5c 0x32 build/Testbench.o + 0x0000000008000e5c readTemperatures + *fill* 0x0000000008000e8e 0x2 + .text.testLoop + 0x0000000008000e90 0xf4 build/Testbench.o + 0x0000000008000e90 testLoop + .text.MX_GPIO_Init + 0x0000000008000f84 0x9c build/main.o + .text.sensor_init + 0x0000000008001020 0x2c build/main.o + 0x0000000008001020 sensor_init + .text.sensor_read + 0x000000000800104c 0x38 build/main.o + 0x000000000800104c sensor_read + .text.readeeprom + 0x0000000008001084 0x34 build/main.o + 0x0000000008001084 readeeprom + .text.writeeeprom + 0x00000000080010b8 0x34 build/main.o + 0x00000000080010b8 writeeeprom + .text.Error_Handler + 0x00000000080010ec 0x4 build/main.o + 0x00000000080010ec Error_Handler + .text.MX_CAN_Init + 0x00000000080010f0 0x40 build/main.o + .text.MX_I2C1_Init + 0x0000000008001130 0x54 build/main.o + .text.MX_I2C2_Init + 0x0000000008001184 0x54 build/main.o + .text.MX_SPI1_Init + 0x00000000080011d8 0x4c build/main.o + .text.SystemClock_Config + 0x0000000008001224 0x78 build/main.o + 0x0000000008001224 SystemClock_Config + .text.main 0x000000000800129c 0x98 build/main.o + 0x000000000800129c main + .text.HAL_MspInit + 0x0000000008001334 0x30 build/stm32f3xx_hal_msp.o + 0x0000000008001334 HAL_MspInit + .text.HAL_CAN_MspInit + 0x0000000008001364 0x78 build/stm32f3xx_hal_msp.o + 0x0000000008001364 HAL_CAN_MspInit + .text.HAL_I2C_MspInit + 0x00000000080013dc 0xe4 build/stm32f3xx_hal_msp.o + 0x00000000080013dc HAL_I2C_MspInit + .text.HAL_SPI_MspInit + 0x00000000080014c0 0x68 build/stm32f3xx_hal_msp.o + 0x00000000080014c0 HAL_SPI_MspInit + .text.NMI_Handler + 0x0000000008001528 0x2 build/stm32f3xx_it.o + 0x0000000008001528 NMI_Handler + .text.HardFault_Handler + 0x000000000800152a 0x2 build/stm32f3xx_it.o + 0x000000000800152a HardFault_Handler + .text.MemManage_Handler + 0x000000000800152c 0x2 build/stm32f3xx_it.o + 0x000000000800152c MemManage_Handler + .text.BusFault_Handler + 0x000000000800152e 0x2 build/stm32f3xx_it.o + 0x000000000800152e BusFault_Handler + .text.UsageFault_Handler + 0x0000000008001530 0x2 build/stm32f3xx_it.o + 0x0000000008001530 UsageFault_Handler + .text.SVC_Handler + 0x0000000008001532 0x2 build/stm32f3xx_it.o + 0x0000000008001532 SVC_Handler + .text.DebugMon_Handler + 0x0000000008001534 0x2 build/stm32f3xx_it.o + 0x0000000008001534 DebugMon_Handler + .text.PendSV_Handler + 0x0000000008001536 0x2 build/stm32f3xx_it.o + 0x0000000008001536 PendSV_Handler + .text.SysTick_Handler + 0x0000000008001538 0x8 build/stm32f3xx_it.o + 0x0000000008001538 SysTick_Handler + .text.USB_LP_CAN_RX0_IRQHandler + 0x0000000008001540 0x10 build/stm32f3xx_it.o + 0x0000000008001540 USB_LP_CAN_RX0_IRQHandler + .text.SystemInit + 0x0000000008001550 0x14 build/system_stm32f3xx.o + 0x0000000008001550 SystemInit + .text.HAL_InitTick + 0x0000000008001564 0x4c build/stm32f3xx_hal.o + 0x0000000008001564 HAL_InitTick + .text.HAL_Init + 0x00000000080015b0 0x24 build/stm32f3xx_hal.o + 0x00000000080015b0 HAL_Init + .text.HAL_IncTick + 0x00000000080015d4 0x18 build/stm32f3xx_hal.o + 0x00000000080015d4 HAL_IncTick + .text.HAL_GetTick + 0x00000000080015ec 0xc build/stm32f3xx_hal.o + 0x00000000080015ec HAL_GetTick + .text.HAL_Delay + 0x00000000080015f8 0x28 build/stm32f3xx_hal.o + 0x00000000080015f8 HAL_Delay + .text.HAL_CAN_Init + 0x0000000008001620 0x14c build/stm32f3xx_hal_can.o + 0x0000000008001620 HAL_CAN_Init + .text.HAL_CAN_ConfigFilter + 0x000000000800176c 0x106 build/stm32f3xx_hal_can.o + 0x000000000800176c HAL_CAN_ConfigFilter + .text.HAL_CAN_Start + 0x0000000008001872 0x5c build/stm32f3xx_hal_can.o + 0x0000000008001872 HAL_CAN_Start + .text.HAL_CAN_AddTxMessage + 0x00000000080018ce 0xfc build/stm32f3xx_hal_can.o + 0x00000000080018ce HAL_CAN_AddTxMessage + .text.HAL_CAN_GetTxMailboxesFreeLevel + 0x00000000080019ca 0x32 build/stm32f3xx_hal_can.o + 0x00000000080019ca HAL_CAN_GetTxMailboxesFreeLevel + .text.HAL_CAN_GetRxMessage + 0x00000000080019fc 0x14a build/stm32f3xx_hal_can.o + 0x00000000080019fc HAL_CAN_GetRxMessage + .text.HAL_CAN_ActivateNotification + 0x0000000008001b46 0x24 build/stm32f3xx_hal_can.o + 0x0000000008001b46 HAL_CAN_ActivateNotification + .text.HAL_CAN_TxMailbox0CompleteCallback + 0x0000000008001b6a 0x2 build/stm32f3xx_hal_can.o + 0x0000000008001b6a HAL_CAN_TxMailbox0CompleteCallback + .text.HAL_CAN_TxMailbox1CompleteCallback + 0x0000000008001b6c 0x2 build/stm32f3xx_hal_can.o + 0x0000000008001b6c HAL_CAN_TxMailbox1CompleteCallback + .text.HAL_CAN_TxMailbox2CompleteCallback + 0x0000000008001b6e 0x2 build/stm32f3xx_hal_can.o + 0x0000000008001b6e HAL_CAN_TxMailbox2CompleteCallback + .text.HAL_CAN_TxMailbox0AbortCallback + 0x0000000008001b70 0x2 build/stm32f3xx_hal_can.o + 0x0000000008001b70 HAL_CAN_TxMailbox0AbortCallback + .text.HAL_CAN_TxMailbox1AbortCallback + 0x0000000008001b72 0x2 build/stm32f3xx_hal_can.o + 0x0000000008001b72 HAL_CAN_TxMailbox1AbortCallback + .text.HAL_CAN_TxMailbox2AbortCallback + 0x0000000008001b74 0x2 build/stm32f3xx_hal_can.o + 0x0000000008001b74 HAL_CAN_TxMailbox2AbortCallback + .text.HAL_CAN_RxFifo0FullCallback + 0x0000000008001b76 0x2 build/stm32f3xx_hal_can.o + 0x0000000008001b76 HAL_CAN_RxFifo0FullCallback + .text.HAL_CAN_RxFifo1MsgPendingCallback + 0x0000000008001b78 0x2 build/stm32f3xx_hal_can.o + 0x0000000008001b78 HAL_CAN_RxFifo1MsgPendingCallback + .text.HAL_CAN_RxFifo1FullCallback + 0x0000000008001b7a 0x2 build/stm32f3xx_hal_can.o + 0x0000000008001b7a HAL_CAN_RxFifo1FullCallback + .text.HAL_CAN_SleepCallback + 0x0000000008001b7c 0x2 build/stm32f3xx_hal_can.o + 0x0000000008001b7c HAL_CAN_SleepCallback + .text.HAL_CAN_WakeUpFromRxMsgCallback + 0x0000000008001b7e 0x2 build/stm32f3xx_hal_can.o + 0x0000000008001b7e HAL_CAN_WakeUpFromRxMsgCallback + .text.HAL_CAN_ErrorCallback + 0x0000000008001b80 0x2 build/stm32f3xx_hal_can.o + 0x0000000008001b80 HAL_CAN_ErrorCallback + .text.HAL_CAN_IRQHandler + 0x0000000008001b82 0x24a build/stm32f3xx_hal_can.o + 0x0000000008001b82 HAL_CAN_IRQHandler + .text.__NVIC_SetPriority + 0x0000000008001dcc 0x28 build/stm32f3xx_hal_cortex.o + .text.NVIC_EncodePriority + 0x0000000008001df4 0x3e build/stm32f3xx_hal_cortex.o + *fill* 0x0000000008001e32 0x2 + .text.HAL_NVIC_SetPriorityGrouping + 0x0000000008001e34 0x24 build/stm32f3xx_hal_cortex.o + 0x0000000008001e34 HAL_NVIC_SetPriorityGrouping + .text.HAL_NVIC_SetPriority + 0x0000000008001e58 0x20 build/stm32f3xx_hal_cortex.o + 0x0000000008001e58 HAL_NVIC_SetPriority + .text.HAL_NVIC_EnableIRQ + 0x0000000008001e78 0x1c build/stm32f3xx_hal_cortex.o + 0x0000000008001e78 HAL_NVIC_EnableIRQ + .text.HAL_SYSTICK_Config + 0x0000000008001e94 0x28 build/stm32f3xx_hal_cortex.o + 0x0000000008001e94 HAL_SYSTICK_Config + .text.HAL_GPIO_Init + 0x0000000008001ebc 0x1c8 build/stm32f3xx_hal_gpio.o + 0x0000000008001ebc HAL_GPIO_Init + .text.HAL_GPIO_WritePin + 0x0000000008002084 0xa build/stm32f3xx_hal_gpio.o + 0x0000000008002084 HAL_GPIO_WritePin + .text.I2C_Flush_TXDR + 0x000000000800208e 0x22 build/stm32f3xx_hal_i2c.o + .text.I2C_TransferConfig + 0x00000000080020b0 0x38 build/stm32f3xx_hal_i2c.o + .text.I2C_IsAcknowledgeFailed + 0x00000000080020e8 0xa0 build/stm32f3xx_hal_i2c.o + .text.I2C_WaitOnTXISFlagUntilTimeout + 0x0000000008002188 0x56 build/stm32f3xx_hal_i2c.o + .text.I2C_WaitOnFlagUntilTimeout + 0x00000000080021de 0x56 build/stm32f3xx_hal_i2c.o + .text.I2C_RequestMemoryWrite + 0x0000000008002234 0x7c build/stm32f3xx_hal_i2c.o + .text.I2C_RequestMemoryRead + 0x00000000080022b0 0x78 build/stm32f3xx_hal_i2c.o + .text.I2C_WaitOnSTOPFlagUntilTimeout + 0x0000000008002328 0x50 build/stm32f3xx_hal_i2c.o + .text.I2C_WaitOnRXNEFlagUntilTimeout + 0x0000000008002378 0x98 build/stm32f3xx_hal_i2c.o + .text.HAL_I2C_Init + 0x0000000008002410 0xbc build/stm32f3xx_hal_i2c.o + 0x0000000008002410 HAL_I2C_Init + .text.HAL_I2C_Master_Transmit + 0x00000000080024cc 0x17c build/stm32f3xx_hal_i2c.o + 0x00000000080024cc HAL_I2C_Master_Transmit + .text.HAL_I2C_Master_Receive + 0x0000000008002648 0x17c build/stm32f3xx_hal_i2c.o + 0x0000000008002648 HAL_I2C_Master_Receive + .text.HAL_I2C_Mem_Write + 0x00000000080027c4 0x1a8 build/stm32f3xx_hal_i2c.o + 0x00000000080027c4 HAL_I2C_Mem_Write + .text.HAL_I2C_Mem_Read + 0x000000000800296c 0x1b0 build/stm32f3xx_hal_i2c.o + 0x000000000800296c HAL_I2C_Mem_Read + .text.HAL_I2CEx_ConfigAnalogFilter + 0x0000000008002b1c 0x5c build/stm32f3xx_hal_i2c_ex.o + 0x0000000008002b1c HAL_I2CEx_ConfigAnalogFilter + .text.HAL_I2CEx_ConfigDigitalFilter + 0x0000000008002b78 0x58 build/stm32f3xx_hal_i2c_ex.o + 0x0000000008002b78 HAL_I2CEx_ConfigDigitalFilter + .text.HAL_RCC_OscConfig + 0x0000000008002bd0 0x630 build/stm32f3xx_hal_rcc.o + 0x0000000008002bd0 HAL_RCC_OscConfig + .text.HAL_RCC_GetSysClockFreq + 0x0000000008003200 0x7c build/stm32f3xx_hal_rcc.o + 0x0000000008003200 HAL_RCC_GetSysClockFreq + .text.HAL_RCC_ClockConfig + 0x000000000800327c 0x1a8 build/stm32f3xx_hal_rcc.o + 0x000000000800327c HAL_RCC_ClockConfig + .text.HAL_RCCEx_PeriphCLKConfig + 0x0000000008003424 0x234 build/stm32f3xx_hal_rcc_ex.o + 0x0000000008003424 HAL_RCCEx_PeriphCLKConfig + .text.SPI_WaitFlagStateUntilTimeout + 0x0000000008003658 0xc8 build/stm32f3xx_hal_spi.o + .text.SPI_WaitFifoStateUntilTimeout + 0x0000000008003720 0xf0 build/stm32f3xx_hal_spi.o + .text.SPI_EndRxTxTransaction + 0x0000000008003810 0x62 build/stm32f3xx_hal_spi.o + .text.HAL_SPI_Init + 0x0000000008003872 0xe8 build/stm32f3xx_hal_spi.o + 0x0000000008003872 HAL_SPI_Init + .text.HAL_SPI_TransmitReceive + 0x000000000800395a 0x2de build/stm32f3xx_hal_spi.o + 0x000000000800395a HAL_SPI_TransmitReceive + .text.Reset_Handler + 0x0000000008003c38 0x50 build/startup_stm32f302xc.o + 0x0000000008003c38 Reset_Handler + .text.Default_Handler + 0x0000000008003c88 0x2 build/startup_stm32f302xc.o + 0x0000000008003c88 RTC_Alarm_IRQHandler + 0x0000000008003c88 TIM1_CC_IRQHandler + 0x0000000008003c88 USB_HP_IRQHandler + 0x0000000008003c88 PVD_IRQHandler + 0x0000000008003c88 TAMP_STAMP_IRQHandler + 0x0000000008003c88 EXTI3_IRQHandler + 0x0000000008003c88 USB_HP_CAN_TX_IRQHandler + 0x0000000008003c88 EXTI0_IRQHandler + 0x0000000008003c88 I2C2_EV_IRQHandler + 0x0000000008003c88 FPU_IRQHandler + 0x0000000008003c88 TIM1_UP_TIM16_IRQHandler + 0x0000000008003c88 ADC1_2_IRQHandler + 0x0000000008003c88 SPI1_IRQHandler + 0x0000000008003c88 CAN_SCE_IRQHandler + 0x0000000008003c88 TIM6_DAC_IRQHandler + 0x0000000008003c88 DMA2_Channel2_IRQHandler + 0x0000000008003c88 DMA1_Channel4_IRQHandler + 0x0000000008003c88 USART3_IRQHandler + 0x0000000008003c88 DMA1_Channel7_IRQHandler + 0x0000000008003c88 UART5_IRQHandler + 0x0000000008003c88 TIM4_IRQHandler + 0x0000000008003c88 CAN_RX1_IRQHandler + 0x0000000008003c88 DMA2_Channel1_IRQHandler + 0x0000000008003c88 I2C1_EV_IRQHandler + 0x0000000008003c88 DMA1_Channel6_IRQHandler + 0x0000000008003c88 UART4_IRQHandler + 0x0000000008003c88 DMA2_Channel4_IRQHandler + 0x0000000008003c88 TIM3_IRQHandler + 0x0000000008003c88 RCC_IRQHandler + 0x0000000008003c88 DMA1_Channel1_IRQHandler + 0x0000000008003c88 Default_Handler + 0x0000000008003c88 USBWakeUp_RMP_IRQHandler + 0x0000000008003c88 EXTI15_10_IRQHandler + 0x0000000008003c88 EXTI9_5_IRQHandler + 0x0000000008003c88 RTC_WKUP_IRQHandler + 0x0000000008003c88 SPI2_IRQHandler + 0x0000000008003c88 DMA2_Channel5_IRQHandler + 0x0000000008003c88 DMA1_Channel5_IRQHandler + 0x0000000008003c88 USB_LP_IRQHandler + 0x0000000008003c88 EXTI4_IRQHandler + 0x0000000008003c88 COMP1_2_IRQHandler + 0x0000000008003c88 TIM1_TRG_COM_TIM17_IRQHandler + 0x0000000008003c88 DMA1_Channel3_IRQHandler + 0x0000000008003c88 WWDG_IRQHandler + 0x0000000008003c88 TIM2_IRQHandler + 0x0000000008003c88 EXTI1_IRQHandler + 0x0000000008003c88 COMP4_6_IRQHandler + 0x0000000008003c88 USART2_IRQHandler + 0x0000000008003c88 I2C2_ER_IRQHandler + 0x0000000008003c88 DMA1_Channel2_IRQHandler + 0x0000000008003c88 FLASH_IRQHandler + 0x0000000008003c88 USART1_IRQHandler + 0x0000000008003c88 SPI3_IRQHandler + 0x0000000008003c88 I2C1_ER_IRQHandler + 0x0000000008003c88 USBWakeUp_IRQHandler + 0x0000000008003c88 DMA2_Channel3_IRQHandler + 0x0000000008003c88 EXTI2_TSC_IRQHandler + 0x0000000008003c88 TIM1_BRK_TIM15_IRQHandler + .text.memset 0x0000000008003c8a 0x10 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-memset.o) + 0x0000000008003c8a memset + *fill* 0x0000000008003c9a 0x2 + .text.__libc_init_array + 0x0000000008003c9c 0x48 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-init.o) + 0x0000000008003c9c __libc_init_array + *(.glue_7) + .glue_7 0x0000000008003ce4 0x0 linker stubs + *(.glue_7t) + .glue_7t 0x0000000008003ce4 0x0 linker stubs + *(.eh_frame) + .eh_frame 0x0000000008003ce4 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crtbegin.o + *(.init) + .init 0x0000000008003ce4 0x4 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crti.o + 0x0000000008003ce4 _init + .init 0x0000000008003ce8 0x8 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crtn.o + *(.fini) + .fini 0x0000000008003cf0 0x4 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crti.o + 0x0000000008003cf0 _fini + .fini 0x0000000008003cf4 0x8 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crtn.o + 0x0000000008003cfc . = ALIGN (0x4) + 0x0000000008003cfc _etext = . + +.vfp11_veneer 0x0000000008003cfc 0x0 + .vfp11_veneer 0x0000000008003cfc 0x0 linker stubs + +.v4_bx 0x0000000008003cfc 0x0 + .v4_bx 0x0000000008003cfc 0x0 linker stubs + +.iplt 0x0000000008003cfc 0x0 + .iplt 0x0000000008003cfc 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crtbegin.o + +.rodata 0x0000000008003cfc 0x30 + 0x0000000008003cfc . = ALIGN (0x4) + *(.rodata) + *(.rodata*) + .rodata.AHBPrescTable + 0x0000000008003cfc 0x10 build/system_stm32f3xx.o + 0x0000000008003cfc AHBPrescTable + .rodata.aPredivFactorTable + 0x0000000008003d0c 0x10 build/stm32f3xx_hal_rcc.o + 0x0000000008003d0c aPredivFactorTable + .rodata.aPLLMULFactorTable + 0x0000000008003d1c 0x10 build/stm32f3xx_hal_rcc.o + 0x0000000008003d1c aPLLMULFactorTable + 0x0000000008003d2c . = ALIGN (0x4) + +.rel.dyn 0x0000000008003d2c 0x0 + .rel.iplt 0x0000000008003d2c 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crtbegin.o + +.ARM.extab + *(.ARM.extab* .gnu.linkonce.armextab.*) + +.ARM 0x0000000008003d2c 0x0 + 0x0000000008003d2c __exidx_start = . + *(.ARM.exidx*) + 0x0000000008003d2c __exidx_end = . + +.preinit_array 0x0000000008003d2c 0x0 + 0x0000000008003d2c PROVIDE (__preinit_array_start = .) + *(.preinit_array*) + 0x0000000008003d2c PROVIDE (__preinit_array_end = .) + +.init_array 0x0000000008003d2c 0x4 + 0x0000000008003d2c PROVIDE (__init_array_start = .) + *(SORT_BY_NAME(.init_array.*)) + *(.init_array*) + .init_array 0x0000000008003d2c 0x4 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crtbegin.o + 0x0000000008003d30 PROVIDE (__init_array_end = .) + +.fini_array 0x0000000008003d30 0x4 + 0x0000000008003d30 PROVIDE (__fini_array_start = .) + *(SORT_BY_NAME(.fini_array.*)) + *(.fini_array*) + .fini_array 0x0000000008003d30 0x4 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crtbegin.o + 0x0000000008003d34 PROVIDE (__fini_array_end = .) + 0x0000000008003d34 _sidata = LOADADDR (.data) + +.data 0x0000000020000000 0x10 load address 0x0000000008003d34 + 0x0000000020000000 . = ALIGN (0x4) + 0x0000000020000000 _sdata = . + *(.data) + *(.data*) + .data.numberofCells + 0x0000000020000000 0x1 build/AMS_HighLevel.o + 0x0000000020000000 numberofCells + *fill* 0x0000000020000001 0x3 + .data.SystemCoreClock + 0x0000000020000004 0x4 build/system_stm32f3xx.o + 0x0000000020000004 SystemCoreClock + .data.uwTickFreq + 0x0000000020000008 0x1 build/stm32f3xx_hal.o + 0x0000000020000008 uwTickFreq + *fill* 0x0000000020000009 0x3 + .data.uwTickPrio + 0x000000002000000c 0x4 build/stm32f3xx_hal.o + 0x000000002000000c uwTickPrio + 0x0000000020000010 . = ALIGN (0x4) + 0x0000000020000010 _edata = . + +.igot.plt 0x0000000020000010 0x0 load address 0x0000000008003d44 + .igot.plt 0x0000000020000010 0x0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crtbegin.o + 0x0000000020000010 . = ALIGN (0x4) + +.bss 0x0000000020000010 0x25c load address 0x0000000008003d44 + 0x0000000020000010 _sbss = . + 0x0000000020000010 __bss_start__ = _sbss + *(.bss) + *(.bss*) + .bss.completed.1 + 0x0000000020000010 0x1 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crtbegin.o + *fill* 0x0000000020000011 0x3 + .bss.object.0 0x0000000020000014 0x18 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crtbegin.o + .bss.numberofauxchannels + 0x000000002000002c 0x1 build/ADBMS_Abstraction.o + 0x000000002000002c numberofauxchannels + .bss.numberofcells + 0x000000002000002d 0x1 build/ADBMS_Abstraction.o + 0x000000002000002d numberofcells + *fill* 0x000000002000002e 0x2 + .bss.err_cnt.0 + 0x0000000020000030 0x4 build/ADBMS_LL_Driver.o + .bss.adbmsspi 0x0000000020000034 0x4 build/ADBMS_LL_Driver.o + 0x0000000020000034 adbmsspi + .bss.data.0 0x0000000020000038 0x8 build/AMS_CAN.o + .bss.header.1 0x0000000020000040 0x18 build/AMS_CAN.o + .bss.data.2 0x0000000020000058 0x8 build/AMS_CAN.o + .bss.header.3 0x0000000020000060 0x1c build/AMS_CAN.o + .bss.cb_triggered + 0x000000002000007c 0x4 build/AMS_CAN.o + .bss.ams_can_handle + 0x0000000020000080 0x4 build/AMS_CAN.o + 0x0000000020000080 ams_can_handle + .bss.canTestData + 0x0000000020000084 0x8 build/AMS_CAN.o + 0x0000000020000084 canTestData + .bss.PENDING_MESSAGE_HANDLE + 0x000000002000008c 0x4 build/AMS_CAN.o + 0x000000002000008c PENDING_MESSAGE_HANDLE + .bss.channelstobalance.0 + 0x0000000020000090 0x4 build/AMS_HighLevel.o + .bss.lastAMSState + 0x0000000020000094 0x1 build/AMS_HighLevel.o + 0x0000000020000094 lastAMSState + .bss.currentAMSState + 0x0000000020000095 0x1 build/AMS_HighLevel.o + 0x0000000020000095 currentAMSState + .bss.numberofAux + 0x0000000020000096 0x1 build/AMS_HighLevel.o + 0x0000000020000096 numberofAux + *fill* 0x0000000020000097 0x1 + .bss.amsov 0x0000000020000098 0x2 build/AMS_HighLevel.o + 0x0000000020000098 amsov + .bss.amsuv 0x000000002000009a 0x2 build/AMS_HighLevel.o + 0x000000002000009a amsuv + .bss.eepromconfigured + 0x000000002000009c 0x1 build/AMS_HighLevel.o + 0x000000002000009c eepromconfigured + *fill* 0x000000002000009d 0x3 + .bss.currenttick + 0x00000000200000a0 0x4 build/AMS_HighLevel.o + 0x00000000200000a0 currenttick + .bss.lastticks + 0x00000000200000a4 0x4 build/AMS_HighLevel.o + 0x00000000200000a4 lastticks + .bss.currentintegrator + 0x00000000200000a8 0x8 build/AMS_HighLevel.o + 0x00000000200000a8 currentintegrator + .bss.module 0x00000000200000b0 0x60 build/AMS_HighLevel.o + 0x00000000200000b0 module + .bss.header.0 0x0000000020000110 0x18 build/Testbench.o + .bss.header.1 0x0000000020000128 0x18 build/Testbench.o + .bss.last_error + 0x0000000020000140 0x4 build/main.o + .bss.hspi1 0x0000000020000144 0x64 build/main.o + 0x0000000020000144 hspi1 + .bss.hi2c2 0x00000000200001a8 0x4c build/main.o + 0x00000000200001a8 hi2c2 + .bss.hi2c1 0x00000000200001f4 0x4c build/main.o + 0x00000000200001f4 hi2c1 + .bss.hcan 0x0000000020000240 0x28 build/main.o + 0x0000000020000240 hcan + .bss.uwTick 0x0000000020000268 0x4 build/stm32f3xx_hal.o + 0x0000000020000268 uwTick + *(COMMON) + 0x000000002000026c . = ALIGN (0x4) + 0x000000002000026c _ebss = . + 0x000000002000026c __bss_end__ = _ebss + +._user_heap_stack + 0x000000002000026c 0x604 load address 0x0000000008003d44 + 0x0000000020000270 . = ALIGN (0x8) + *fill* 0x000000002000026c 0x4 + [!provide] PROVIDE (end = .) + 0x0000000020000270 PROVIDE (_end = .) + 0x0000000020000470 . = (. + _Min_Heap_Size) + *fill* 0x0000000020000270 0x200 + 0x0000000020000870 . = (. + _Min_Stack_Size) + *fill* 0x0000000020000470 0x400 + 0x0000000020000870 . = ALIGN (0x8) + +/DISCARD/ + libc.a(*) + libm.a(*) + libgcc.a(*) + +.ARM.attributes + 0x0000000000000000 0x30 + *(.ARM.attributes) + .ARM.attributes + 0x0000000000000000 0x22 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crti.o + .ARM.attributes + 0x0000000000000022 0x34 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crtbegin.o + .ARM.attributes + 0x0000000000000056 0x34 build/ADBMS_Abstraction.o + .ARM.attributes + 0x000000000000008a 0x34 build/ADBMS_LL_Driver.o + .ARM.attributes + 0x00000000000000be 0x34 build/AMS_CAN.o + .ARM.attributes + 0x00000000000000f2 0x34 build/AMS_HighLevel.o + .ARM.attributes + 0x0000000000000126 0x34 build/Testbench.o + .ARM.attributes + 0x000000000000015a 0x34 build/main.o + .ARM.attributes + 0x000000000000018e 0x34 build/stm32f3xx_hal_msp.o + .ARM.attributes + 0x00000000000001c2 0x34 build/stm32f3xx_it.o + .ARM.attributes + 0x00000000000001f6 0x34 build/system_stm32f3xx.o + .ARM.attributes + 0x000000000000022a 0x34 build/stm32f3xx_hal.o + .ARM.attributes + 0x000000000000025e 0x34 build/stm32f3xx_hal_can.o + .ARM.attributes + 0x0000000000000292 0x34 build/stm32f3xx_hal_cortex.o + .ARM.attributes + 0x00000000000002c6 0x34 build/stm32f3xx_hal_gpio.o + .ARM.attributes + 0x00000000000002fa 0x34 build/stm32f3xx_hal_i2c.o + .ARM.attributes + 0x000000000000032e 0x34 build/stm32f3xx_hal_i2c_ex.o + .ARM.attributes + 0x0000000000000362 0x34 build/stm32f3xx_hal_rcc.o + .ARM.attributes + 0x0000000000000396 0x34 build/stm32f3xx_hal_rcc_ex.o + .ARM.attributes + 0x00000000000003ca 0x34 build/stm32f3xx_hal_spi.o + .ARM.attributes + 0x00000000000003fe 0x21 build/startup_stm32f302xc.o + .ARM.attributes + 0x000000000000041f 0x34 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-memset.o) + .ARM.attributes + 0x0000000000000453 0x34 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-init.o) + .ARM.attributes + 0x0000000000000487 0x22 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crtn.o +OUTPUT(build/ams-slave-23.elf elf32-littlearm) +LOAD linker stubs +LOAD /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc.a +LOAD /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libm.a +LOAD /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/libgcc.a + +.comment 0x0000000000000000 0x39 + .comment 0x0000000000000000 0x39 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crtbegin.o + 0x3a (size before relaxing) + .comment 0x0000000000000039 0x3a build/ADBMS_Abstraction.o + .comment 0x0000000000000039 0x3a build/ADBMS_LL_Driver.o + .comment 0x0000000000000039 0x3a build/AMS_CAN.o + .comment 0x0000000000000039 0x3a build/AMS_HighLevel.o + .comment 0x0000000000000039 0x3a build/Testbench.o + .comment 0x0000000000000039 0x3a build/main.o + .comment 0x0000000000000039 0x3a build/stm32f3xx_hal_msp.o + .comment 0x0000000000000039 0x3a build/stm32f3xx_it.o + .comment 0x0000000000000039 0x3a build/system_stm32f3xx.o + .comment 0x0000000000000039 0x3a build/stm32f3xx_hal.o + .comment 0x0000000000000039 0x3a build/stm32f3xx_hal_can.o + .comment 0x0000000000000039 0x3a build/stm32f3xx_hal_cortex.o + .comment 0x0000000000000039 0x3a build/stm32f3xx_hal_gpio.o + .comment 0x0000000000000039 0x3a build/stm32f3xx_hal_i2c.o + .comment 0x0000000000000039 0x3a build/stm32f3xx_hal_i2c_ex.o + .comment 0x0000000000000039 0x3a build/stm32f3xx_hal_rcc.o + .comment 0x0000000000000039 0x3a build/stm32f3xx_hal_rcc_ex.o + .comment 0x0000000000000039 0x3a build/stm32f3xx_hal_spi.o + .comment 0x0000000000000039 0x3a /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-memset.o) + .comment 0x0000000000000039 0x3a /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-init.o) + +.debug_info 0x0000000000000000 0x13089 + .debug_info 0x0000000000000000 0x1266 build/ADBMS_Abstraction.o + .debug_info 0x0000000000001266 0xef0 build/ADBMS_LL_Driver.o + .debug_info 0x0000000000002156 0xb5b build/AMS_CAN.o + .debug_info 0x0000000000002cb1 0xdbd build/AMS_HighLevel.o + .debug_info 0x0000000000003a6e 0xd81 build/Testbench.o + .debug_info 0x00000000000047ef 0x19e5 build/main.o + .debug_info 0x00000000000061d4 0x139c build/stm32f3xx_hal_msp.o + .debug_info 0x0000000000007570 0x520 build/stm32f3xx_it.o + .debug_info 0x0000000000007a90 0x417 build/system_stm32f3xx.o + .debug_info 0x0000000000007ea7 0x842 build/stm32f3xx_hal.o + .debug_info 0x00000000000086e9 0x11ab build/stm32f3xx_hal_can.o + .debug_info 0x0000000000009894 0xeab build/stm32f3xx_hal_cortex.o + .debug_info 0x000000000000a73f 0x630 build/stm32f3xx_hal_gpio.o + .debug_info 0x000000000000ad6f 0x3d99 build/stm32f3xx_hal_i2c.o + .debug_info 0x000000000000eb08 0x827 build/stm32f3xx_hal_i2c_ex.o + .debug_info 0x000000000000f32f 0x15b8 build/stm32f3xx_hal_rcc.o + .debug_info 0x00000000000108e7 0x702 build/stm32f3xx_hal_rcc_ex.o + .debug_info 0x0000000000010fe9 0x2072 build/stm32f3xx_hal_spi.o + .debug_info 0x000000000001305b 0x2e build/startup_stm32f302xc.o + +.debug_abbrev 0x0000000000000000 0x2dac + .debug_abbrev 0x0000000000000000 0x317 build/ADBMS_Abstraction.o + .debug_abbrev 0x0000000000000317 0x2a6 build/ADBMS_LL_Driver.o + .debug_abbrev 0x00000000000005bd 0x2a8 build/AMS_CAN.o + .debug_abbrev 0x0000000000000865 0x306 build/AMS_HighLevel.o + .debug_abbrev 0x0000000000000b6b 0x2bf build/Testbench.o + .debug_abbrev 0x0000000000000e2a 0x3b9 build/main.o + .debug_abbrev 0x00000000000011e3 0x25d build/stm32f3xx_hal_msp.o + .debug_abbrev 0x0000000000001440 0x197 build/stm32f3xx_it.o + .debug_abbrev 0x00000000000015d7 0x11e build/system_stm32f3xx.o + .debug_abbrev 0x00000000000016f5 0x241 build/stm32f3xx_hal.o + .debug_abbrev 0x0000000000001936 0x259 build/stm32f3xx_hal_can.o + .debug_abbrev 0x0000000000001b8f 0x39d build/stm32f3xx_hal_cortex.o + .debug_abbrev 0x0000000000001f2c 0x1f8 build/stm32f3xx_hal_gpio.o + .debug_abbrev 0x0000000000002124 0x291 build/stm32f3xx_hal_i2c.o + .debug_abbrev 0x00000000000023b5 0x1c6 build/stm32f3xx_hal_i2c_ex.o + .debug_abbrev 0x000000000000257b 0x320 build/stm32f3xx_hal_rcc.o + .debug_abbrev 0x000000000000289b 0x278 build/stm32f3xx_hal_rcc_ex.o + .debug_abbrev 0x0000000000002b13 0x27c build/stm32f3xx_hal_spi.o + .debug_abbrev 0x0000000000002d8f 0x1d build/startup_stm32f302xc.o + +.debug_loclists + 0x0000000000000000 0x7253 + .debug_loclists + 0x0000000000000000 0x33d build/ADBMS_Abstraction.o + .debug_loclists + 0x000000000000033d 0x57a build/ADBMS_LL_Driver.o + .debug_loclists + 0x00000000000008b7 0x12f build/AMS_CAN.o + .debug_loclists + 0x00000000000009e6 0x1c6 build/AMS_HighLevel.o + .debug_loclists + 0x0000000000000bac 0x1c6 build/Testbench.o + .debug_loclists + 0x0000000000000d72 0x115 build/main.o + .debug_loclists + 0x0000000000000e87 0x123 build/stm32f3xx_hal_msp.o + .debug_loclists + 0x0000000000000faa 0xbc build/system_stm32f3xx.o + .debug_loclists + 0x0000000000001066 0xc9 build/stm32f3xx_hal.o + .debug_loclists + 0x000000000000112f 0x848 build/stm32f3xx_hal_can.o + .debug_loclists + 0x0000000000001977 0x439 build/stm32f3xx_hal_cortex.o + .debug_loclists + 0x0000000000001db0 0x267 build/stm32f3xx_hal_gpio.o + .debug_loclists + 0x0000000000002017 0x2ce2 build/stm32f3xx_hal_i2c.o + .debug_loclists + 0x0000000000004cf9 0x11d build/stm32f3xx_hal_i2c_ex.o + .debug_loclists + 0x0000000000004e16 0x851 build/stm32f3xx_hal_rcc.o + .debug_loclists + 0x0000000000005667 0x66c build/stm32f3xx_hal_rcc_ex.o + .debug_loclists + 0x0000000000005cd3 0x1580 build/stm32f3xx_hal_spi.o + +.debug_aranges 0x0000000000000000 0xc88 + .debug_aranges + 0x0000000000000000 0xe8 build/ADBMS_Abstraction.o + .debug_aranges + 0x00000000000000e8 0x78 build/ADBMS_LL_Driver.o + .debug_aranges + 0x0000000000000160 0x40 build/AMS_CAN.o + .debug_aranges + 0x00000000000001a0 0x70 build/AMS_HighLevel.o + .debug_aranges + 0x0000000000000210 0x40 build/Testbench.o + .debug_aranges + 0x0000000000000250 0x78 build/main.o + .debug_aranges + 0x00000000000002c8 0x50 build/stm32f3xx_hal_msp.o + .debug_aranges + 0x0000000000000318 0x68 build/stm32f3xx_it.o + .debug_aranges + 0x0000000000000380 0x28 build/system_stm32f3xx.o + .debug_aranges + 0x00000000000003a8 0xe0 build/stm32f3xx_hal.o + .debug_aranges + 0x0000000000000488 0x138 build/stm32f3xx_hal_can.o + .debug_aranges + 0x00000000000005c0 0xd8 build/stm32f3xx_hal_cortex.o + .debug_aranges + 0x0000000000000698 0x58 build/stm32f3xx_hal_gpio.o + .debug_aranges + 0x00000000000006f0 0x290 build/stm32f3xx_hal_i2c.o + .debug_aranges + 0x0000000000000980 0x48 build/stm32f3xx_hal_i2c_ex.o + .debug_aranges + 0x00000000000009c8 0x88 build/stm32f3xx_hal_rcc.o + .debug_aranges + 0x0000000000000a50 0x38 build/stm32f3xx_hal_rcc_ex.o + .debug_aranges + 0x0000000000000a88 0x1d8 build/stm32f3xx_hal_spi.o + .debug_aranges + 0x0000000000000c60 0x28 build/startup_stm32f302xc.o + +.debug_rnglists + 0x0000000000000000 0xa08 + .debug_rnglists + 0x0000000000000000 0xad build/ADBMS_Abstraction.o + .debug_rnglists + 0x00000000000000ad 0x94 build/ADBMS_LL_Driver.o + .debug_rnglists + 0x0000000000000141 0x45 build/AMS_CAN.o + .debug_rnglists + 0x0000000000000186 0x82 build/AMS_HighLevel.o + .debug_rnglists + 0x0000000000000208 0x3c build/Testbench.o + .debug_rnglists + 0x0000000000000244 0x57 build/main.o + .debug_rnglists + 0x000000000000029b 0x38 build/stm32f3xx_hal_msp.o + .debug_rnglists + 0x00000000000002d3 0x49 build/stm32f3xx_it.o + .debug_rnglists + 0x000000000000031c 0x1a build/system_stm32f3xx.o + .debug_rnglists + 0x0000000000000336 0xa3 build/stm32f3xx_hal.o + .debug_rnglists + 0x00000000000003d9 0xea build/stm32f3xx_hal_can.o + .debug_rnglists + 0x00000000000004c3 0x9d build/stm32f3xx_hal_cortex.o + .debug_rnglists + 0x0000000000000560 0x3f build/stm32f3xx_hal_gpio.o + .debug_rnglists + 0x000000000000059f 0x20d build/stm32f3xx_hal_i2c.o + .debug_rnglists + 0x00000000000007ac 0x31 build/stm32f3xx_hal_i2c_ex.o + .debug_rnglists + 0x00000000000007dd 0x79 build/stm32f3xx_hal_rcc.o + .debug_rnglists + 0x0000000000000856 0x28 build/stm32f3xx_hal_rcc_ex.o + .debug_rnglists + 0x000000000000087e 0x171 build/stm32f3xx_hal_spi.o + .debug_rnglists + 0x00000000000009ef 0x19 build/startup_stm32f302xc.o + +.debug_line 0x0000000000000000 0xf30a + .debug_line 0x0000000000000000 0xa83 build/ADBMS_Abstraction.o + .debug_line 0x0000000000000a83 0x752 build/ADBMS_LL_Driver.o + .debug_line 0x00000000000011d5 0x525 build/AMS_CAN.o + .debug_line 0x00000000000016fa 0x5cc build/AMS_HighLevel.o + .debug_line 0x0000000000001cc6 0x5b7 build/Testbench.o + .debug_line 0x000000000000227d 0x827 build/main.o + .debug_line 0x0000000000002aa4 0x503 build/stm32f3xx_hal_msp.o + .debug_line 0x0000000000002fa7 0x33e build/stm32f3xx_it.o + .debug_line 0x00000000000032e5 0x2cc build/system_stm32f3xx.o + .debug_line 0x00000000000035b1 0x5ac build/stm32f3xx_hal.o + .debug_line 0x0000000000003b5d 0x1196 build/stm32f3xx_hal_can.o + .debug_line 0x0000000000004cf3 0x869 build/stm32f3xx_hal_cortex.o + .debug_line 0x000000000000555c 0x70c build/stm32f3xx_hal_gpio.o + .debug_line 0x0000000000005c68 0x4a19 build/stm32f3xx_hal_i2c.o + .debug_line 0x000000000000a681 0x57f build/stm32f3xx_hal_i2c_ex.o + .debug_line 0x000000000000ac00 0x1236 build/stm32f3xx_hal_rcc.o + .debug_line 0x000000000000be36 0xa73 build/stm32f3xx_hal_rcc_ex.o + .debug_line 0x000000000000c8a9 0x29eb build/stm32f3xx_hal_spi.o + .debug_line 0x000000000000f294 0x76 build/startup_stm32f302xc.o + +.debug_str 0x0000000000000000 0x3c73 + .debug_str 0x0000000000000000 0x840 build/ADBMS_Abstraction.o + 0x8fd (size before relaxing) + .debug_str 0x0000000000000840 0x1ff build/ADBMS_LL_Driver.o + 0x7df (size before relaxing) + .debug_str 0x0000000000000a3f 0x4ee build/AMS_CAN.o + 0x811 (size before relaxing) + .debug_str 0x0000000000000f2d 0x2ba build/AMS_HighLevel.o + 0xa0c (size before relaxing) + .debug_str 0x00000000000011e7 0xb4 build/Testbench.o + 0x6ff (size before relaxing) + .debug_str 0x000000000000129b 0x6cd build/main.o + 0x1057 (size before relaxing) + .debug_str 0x0000000000001968 0x4b5 build/stm32f3xx_hal_msp.o + 0x1043 (size before relaxing) + .debug_str 0x0000000000001e1d 0xe1 build/stm32f3xx_it.o + 0x504 (size before relaxing) + .debug_str 0x0000000000001efe 0xdc build/system_stm32f3xx.o + 0x2cf (size before relaxing) + .debug_str 0x0000000000001fda 0x2e7 build/stm32f3xx_hal.o + 0x948 (size before relaxing) + .debug_str 0x00000000000022c1 0x388 build/stm32f3xx_hal_can.o + 0xa40 (size before relaxing) + .debug_str 0x0000000000002649 0x41e build/stm32f3xx_hal_cortex.o + 0xaf8 (size before relaxing) + .debug_str 0x0000000000002a67 0x122 build/stm32f3xx_hal_gpio.o + 0x433 (size before relaxing) + .debug_str 0x0000000000002b89 0x855 build/stm32f3xx_hal_i2c.o + 0xf7d (size before relaxing) + .debug_str 0x00000000000033de 0xb5 build/stm32f3xx_hal_i2c_ex.o + 0x7e3 (size before relaxing) + .debug_str 0x0000000000003493 0x1d1 build/stm32f3xx_hal_rcc.o + 0x677 (size before relaxing) + .debug_str 0x0000000000003664 0xbb build/stm32f3xx_hal_rcc_ex.o + 0x50c (size before relaxing) + .debug_str 0x000000000000371f 0x522 build/stm32f3xx_hal_spi.o + 0xbdc (size before relaxing) + .debug_str 0x0000000000003c41 0x32 build/startup_stm32f302xc.o + 0x73 (size before relaxing) + +.debug_frame 0x0000000000000000 0x224c + .debug_frame 0x0000000000000000 0x29c build/ADBMS_Abstraction.o + .debug_frame 0x000000000000029c 0x1b4 build/ADBMS_LL_Driver.o + .debug_frame 0x0000000000000450 0x94 build/AMS_CAN.o + .debug_frame 0x00000000000004e4 0xf8 build/AMS_HighLevel.o + .debug_frame 0x00000000000005dc 0x9c build/Testbench.o + .debug_frame 0x0000000000000678 0x154 build/main.o + .debug_frame 0x00000000000007cc 0xd8 build/stm32f3xx_hal_msp.o + .debug_frame 0x00000000000008a4 0xc0 build/stm32f3xx_it.o + .debug_frame 0x0000000000000964 0x30 build/system_stm32f3xx.o + .debug_frame 0x0000000000000994 0x1cc build/stm32f3xx_hal.o + .debug_frame 0x0000000000000b60 0x2dc build/stm32f3xx_hal_can.o + .debug_frame 0x0000000000000e3c 0x1cc build/stm32f3xx_hal_cortex.o + .debug_frame 0x0000000000001008 0xd0 build/stm32f3xx_hal_gpio.o + .debug_frame 0x00000000000010d8 0x934 build/stm32f3xx_hal_i2c.o + .debug_frame 0x0000000000001a0c 0x80 build/stm32f3xx_hal_i2c_ex.o + .debug_frame 0x0000000000001a8c 0x16c build/stm32f3xx_hal_rcc.o + .debug_frame 0x0000000000001bf8 0x7c build/stm32f3xx_hal_rcc_ex.o + .debug_frame 0x0000000000001c74 0x5d8 build/stm32f3xx_hal_spi.o + +.debug_line_str + 0x0000000000000000 0x57 + .debug_line_str + 0x0000000000000000 0x57 build/startup_stm32f302xc.o + +Cross Reference Table + +Symbol File +ADC1_2_IRQHandler build/startup_stm32f302xc.o +AHBPrescTable build/system_stm32f3xx.o + build/stm32f3xx_hal_rcc.o +AMS_Balancing_Loop build/AMS_HighLevel.o +AMS_Charging_Loop build/AMS_HighLevel.o +AMS_Discharging_Loop build/AMS_HighLevel.o +AMS_Error_Loop build/AMS_HighLevel.o +AMS_Idle_Loop build/AMS_HighLevel.o +AMS_Init build/AMS_HighLevel.o + build/main.o +AMS_Loop build/AMS_HighLevel.o + build/main.o +AMS_Warning_Loop build/AMS_HighLevel.o +APBPrescTable build/system_stm32f3xx.o + build/stm32f3xx_hal_rcc.o +BalancingActive build/AMS_HighLevel.o +BusFault_Handler build/stm32f3xx_it.o +CAN_RX1_IRQHandler build/startup_stm32f302xc.o +CAN_SCE_IRQHandler build/startup_stm32f302xc.o +COMP1_2_IRQHandler build/startup_stm32f302xc.o +COMP4_6_IRQHandler build/startup_stm32f302xc.o +DMA1_Channel1_IRQHandler build/startup_stm32f302xc.o +DMA1_Channel2_IRQHandler build/startup_stm32f302xc.o +DMA1_Channel3_IRQHandler build/startup_stm32f302xc.o +DMA1_Channel4_IRQHandler build/startup_stm32f302xc.o +DMA1_Channel5_IRQHandler build/startup_stm32f302xc.o +DMA1_Channel6_IRQHandler build/startup_stm32f302xc.o +DMA1_Channel7_IRQHandler build/startup_stm32f302xc.o +DMA2_Channel1_IRQHandler build/startup_stm32f302xc.o +DMA2_Channel2_IRQHandler build/startup_stm32f302xc.o +DMA2_Channel3_IRQHandler build/startup_stm32f302xc.o +DMA2_Channel4_IRQHandler build/startup_stm32f302xc.o +DMA2_Channel5_IRQHandler build/startup_stm32f302xc.o +DebugMon_Handler build/stm32f3xx_it.o +Default_Handler build/startup_stm32f302xc.o +EXTI0_IRQHandler build/startup_stm32f302xc.o +EXTI15_10_IRQHandler build/startup_stm32f302xc.o +EXTI1_IRQHandler build/startup_stm32f302xc.o +EXTI2_TSC_IRQHandler build/startup_stm32f302xc.o +EXTI3_IRQHandler build/startup_stm32f302xc.o +EXTI4_IRQHandler build/startup_stm32f302xc.o +EXTI9_5_IRQHandler build/startup_stm32f302xc.o +Error_Handler build/main.o + build/AMS_CAN.o + build/ADBMS_LL_Driver.o +FLASH_IRQHandler build/startup_stm32f302xc.o +FLASH_PageErase build/stm32f3xx_hal_flash_ex.o + build/stm32f3xx_hal_flash.o +FLASH_WaitForLastOperation build/stm32f3xx_hal_flash.o + build/stm32f3xx_hal_flash_ex.o +FPU_IRQHandler build/startup_stm32f302xc.o +HAL_CAN_AbortTxRequest build/stm32f3xx_hal_can.o +HAL_CAN_ActivateNotification build/stm32f3xx_hal_can.o + build/AMS_CAN.o +HAL_CAN_AddTxMessage build/stm32f3xx_hal_can.o + build/Testbench.o + build/AMS_CAN.o +HAL_CAN_ConfigFilter build/stm32f3xx_hal_can.o + build/AMS_CAN.o +HAL_CAN_DeInit build/stm32f3xx_hal_can.o +HAL_CAN_DeactivateNotification build/stm32f3xx_hal_can.o +HAL_CAN_ErrorCallback build/stm32f3xx_hal_can.o +HAL_CAN_GetError build/stm32f3xx_hal_can.o +HAL_CAN_GetRxFifoFillLevel build/stm32f3xx_hal_can.o +HAL_CAN_GetRxMessage build/stm32f3xx_hal_can.o + build/AMS_CAN.o +HAL_CAN_GetState build/stm32f3xx_hal_can.o +HAL_CAN_GetTxMailboxesFreeLevel build/stm32f3xx_hal_can.o + build/AMS_CAN.o +HAL_CAN_GetTxTimestamp build/stm32f3xx_hal_can.o +HAL_CAN_IRQHandler build/stm32f3xx_hal_can.o + build/stm32f3xx_it.o +HAL_CAN_Init build/stm32f3xx_hal_can.o + build/main.o +HAL_CAN_IsSleepActive build/stm32f3xx_hal_can.o +HAL_CAN_IsTxMessagePending build/stm32f3xx_hal_can.o +HAL_CAN_MspDeInit build/stm32f3xx_hal_msp.o +HAL_CAN_MspInit build/stm32f3xx_hal_msp.o +HAL_CAN_RequestSleep build/stm32f3xx_hal_can.o +HAL_CAN_ResetError build/stm32f3xx_hal_can.o +HAL_CAN_RxFifo0FullCallback build/stm32f3xx_hal_can.o +HAL_CAN_RxFifo0MsgPendingCallback build/AMS_CAN.o +HAL_CAN_RxFifo1FullCallback build/stm32f3xx_hal_can.o +HAL_CAN_RxFifo1MsgPendingCallback build/stm32f3xx_hal_can.o +HAL_CAN_SleepCallback build/stm32f3xx_hal_can.o +HAL_CAN_Start build/stm32f3xx_hal_can.o + build/AMS_CAN.o +HAL_CAN_Stop build/stm32f3xx_hal_can.o +HAL_CAN_TxMailbox0AbortCallback build/stm32f3xx_hal_can.o +HAL_CAN_TxMailbox0CompleteCallback build/stm32f3xx_hal_can.o +HAL_CAN_TxMailbox1AbortCallback build/stm32f3xx_hal_can.o +HAL_CAN_TxMailbox1CompleteCallback build/stm32f3xx_hal_can.o +HAL_CAN_TxMailbox2AbortCallback build/stm32f3xx_hal_can.o +HAL_CAN_TxMailbox2CompleteCallback build/stm32f3xx_hal_can.o +HAL_CAN_WakeUp build/stm32f3xx_hal_can.o +HAL_CAN_WakeUpFromRxMsgCallback build/stm32f3xx_hal_can.o +HAL_DBGMCU_DisableDBGSleepMode build/stm32f3xx_hal.o +HAL_DBGMCU_DisableDBGStandbyMode build/stm32f3xx_hal.o +HAL_DBGMCU_DisableDBGStopMode build/stm32f3xx_hal.o +HAL_DBGMCU_EnableDBGSleepMode build/stm32f3xx_hal.o +HAL_DBGMCU_EnableDBGStandbyMode build/stm32f3xx_hal.o +HAL_DBGMCU_EnableDBGStopMode build/stm32f3xx_hal.o +HAL_DMA_Abort build/stm32f3xx_hal_dma.o + build/stm32f3xx_hal_spi.o +HAL_DMA_Abort_IT build/stm32f3xx_hal_dma.o + build/stm32f3xx_hal_spi.o + build/stm32f3xx_hal_i2c.o +HAL_DMA_DeInit build/stm32f3xx_hal_dma.o +HAL_DMA_GetError build/stm32f3xx_hal_dma.o +HAL_DMA_GetState build/stm32f3xx_hal_dma.o + build/stm32f3xx_hal_i2c.o +HAL_DMA_IRQHandler build/stm32f3xx_hal_dma.o +HAL_DMA_Init build/stm32f3xx_hal_dma.o +HAL_DMA_PollForTransfer build/stm32f3xx_hal_dma.o +HAL_DMA_RegisterCallback build/stm32f3xx_hal_dma.o +HAL_DMA_Start build/stm32f3xx_hal_dma.o +HAL_DMA_Start_IT build/stm32f3xx_hal_dma.o + build/stm32f3xx_hal_spi.o + build/stm32f3xx_hal_i2c.o +HAL_DMA_UnRegisterCallback build/stm32f3xx_hal_dma.o +HAL_DeInit build/stm32f3xx_hal.o +HAL_Delay build/stm32f3xx_hal.o + build/main.o + build/Testbench.o + build/ADBMS_LL_Driver.o + build/ADBMS_Abstraction.o +HAL_EXTI_ClearConfigLine build/stm32f3xx_hal_exti.o +HAL_EXTI_ClearPending build/stm32f3xx_hal_exti.o +HAL_EXTI_GenerateSWI build/stm32f3xx_hal_exti.o +HAL_EXTI_GetConfigLine build/stm32f3xx_hal_exti.o +HAL_EXTI_GetHandle build/stm32f3xx_hal_exti.o +HAL_EXTI_GetPending build/stm32f3xx_hal_exti.o +HAL_EXTI_IRQHandler build/stm32f3xx_hal_exti.o +HAL_EXTI_RegisterCallback build/stm32f3xx_hal_exti.o +HAL_EXTI_SetConfigLine build/stm32f3xx_hal_exti.o +HAL_FLASHEx_Erase build/stm32f3xx_hal_flash_ex.o +HAL_FLASHEx_Erase_IT build/stm32f3xx_hal_flash_ex.o +HAL_FLASHEx_OBErase build/stm32f3xx_hal_flash_ex.o +HAL_FLASHEx_OBGetConfig build/stm32f3xx_hal_flash_ex.o +HAL_FLASHEx_OBGetUserData build/stm32f3xx_hal_flash_ex.o +HAL_FLASHEx_OBProgram build/stm32f3xx_hal_flash_ex.o +HAL_FLASH_EndOfOperationCallback build/stm32f3xx_hal_flash.o +HAL_FLASH_GetError build/stm32f3xx_hal_flash.o +HAL_FLASH_IRQHandler build/stm32f3xx_hal_flash.o +HAL_FLASH_Lock build/stm32f3xx_hal_flash.o +HAL_FLASH_OB_Launch build/stm32f3xx_hal_flash.o +HAL_FLASH_OB_Lock build/stm32f3xx_hal_flash.o +HAL_FLASH_OB_Unlock build/stm32f3xx_hal_flash.o +HAL_FLASH_OperationErrorCallback build/stm32f3xx_hal_flash.o +HAL_FLASH_Program build/stm32f3xx_hal_flash.o +HAL_FLASH_Program_IT build/stm32f3xx_hal_flash.o +HAL_FLASH_Unlock build/stm32f3xx_hal_flash.o +HAL_GPIO_DeInit build/stm32f3xx_hal_gpio.o + build/stm32f3xx_hal_msp.o +HAL_GPIO_EXTI_Callback build/stm32f3xx_hal_gpio.o +HAL_GPIO_EXTI_IRQHandler build/stm32f3xx_hal_gpio.o +HAL_GPIO_Init build/stm32f3xx_hal_gpio.o + build/stm32f3xx_hal_rcc.o + build/stm32f3xx_hal_msp.o + build/main.o +HAL_GPIO_LockPin build/stm32f3xx_hal_gpio.o +HAL_GPIO_ReadPin build/stm32f3xx_hal_gpio.o +HAL_GPIO_TogglePin build/stm32f3xx_hal_gpio.o +HAL_GPIO_WritePin build/stm32f3xx_hal_gpio.o + build/main.o + build/ADBMS_LL_Driver.o +HAL_GetDEVID build/stm32f3xx_hal.o +HAL_GetHalVersion build/stm32f3xx_hal.o +HAL_GetREVID build/stm32f3xx_hal.o +HAL_GetTick build/stm32f3xx_hal.o + build/stm32f3xx_hal_spi.o + build/stm32f3xx_hal_rcc_ex.o + build/stm32f3xx_hal_rcc.o + build/stm32f3xx_hal_i2c.o + build/stm32f3xx_hal_flash.o + build/stm32f3xx_hal_dma.o + build/stm32f3xx_hal_can.o + build/main.o + build/Testbench.o + build/AMS_HighLevel.o + build/AMS_CAN.o +HAL_GetTickFreq build/stm32f3xx_hal.o +HAL_GetTickPrio build/stm32f3xx_hal.o +HAL_GetUIDw0 build/stm32f3xx_hal.o +HAL_GetUIDw1 build/stm32f3xx_hal.o +HAL_GetUIDw2 build/stm32f3xx_hal.o +HAL_I2CEx_ConfigAnalogFilter build/stm32f3xx_hal_i2c_ex.o + build/main.o +HAL_I2CEx_ConfigDigitalFilter build/stm32f3xx_hal_i2c_ex.o + build/main.o +HAL_I2CEx_DisableFastModePlus build/stm32f3xx_hal_i2c_ex.o +HAL_I2CEx_DisableWakeUp build/stm32f3xx_hal_i2c_ex.o +HAL_I2CEx_EnableFastModePlus build/stm32f3xx_hal_i2c_ex.o +HAL_I2CEx_EnableWakeUp build/stm32f3xx_hal_i2c_ex.o +HAL_I2C_AbortCpltCallback build/stm32f3xx_hal_i2c.o +HAL_I2C_AddrCallback build/stm32f3xx_hal_i2c.o +HAL_I2C_DeInit build/stm32f3xx_hal_i2c.o +HAL_I2C_DisableListen_IT build/stm32f3xx_hal_i2c.o +HAL_I2C_ER_IRQHandler build/stm32f3xx_hal_i2c.o +HAL_I2C_EV_IRQHandler build/stm32f3xx_hal_i2c.o +HAL_I2C_EnableListen_IT build/stm32f3xx_hal_i2c.o +HAL_I2C_ErrorCallback build/stm32f3xx_hal_i2c.o +HAL_I2C_GetError build/stm32f3xx_hal_i2c.o +HAL_I2C_GetMode build/stm32f3xx_hal_i2c.o +HAL_I2C_GetState build/stm32f3xx_hal_i2c.o +HAL_I2C_Init build/stm32f3xx_hal_i2c.o + build/main.o +HAL_I2C_IsDeviceReady build/stm32f3xx_hal_i2c.o +HAL_I2C_ListenCpltCallback build/stm32f3xx_hal_i2c.o +HAL_I2C_MasterRxCpltCallback build/stm32f3xx_hal_i2c.o +HAL_I2C_MasterTxCpltCallback build/stm32f3xx_hal_i2c.o +HAL_I2C_Master_Abort_IT build/stm32f3xx_hal_i2c.o +HAL_I2C_Master_Receive build/stm32f3xx_hal_i2c.o + build/main.o +HAL_I2C_Master_Receive_DMA build/stm32f3xx_hal_i2c.o +HAL_I2C_Master_Receive_IT build/stm32f3xx_hal_i2c.o +HAL_I2C_Master_Seq_Receive_DMA build/stm32f3xx_hal_i2c.o +HAL_I2C_Master_Seq_Receive_IT build/stm32f3xx_hal_i2c.o +HAL_I2C_Master_Seq_Transmit_DMA build/stm32f3xx_hal_i2c.o +HAL_I2C_Master_Seq_Transmit_IT build/stm32f3xx_hal_i2c.o +HAL_I2C_Master_Transmit build/stm32f3xx_hal_i2c.o + build/main.o +HAL_I2C_Master_Transmit_DMA build/stm32f3xx_hal_i2c.o +HAL_I2C_Master_Transmit_IT build/stm32f3xx_hal_i2c.o +HAL_I2C_MemRxCpltCallback build/stm32f3xx_hal_i2c.o +HAL_I2C_MemTxCpltCallback build/stm32f3xx_hal_i2c.o +HAL_I2C_Mem_Read build/stm32f3xx_hal_i2c.o + build/main.o +HAL_I2C_Mem_Read_DMA build/stm32f3xx_hal_i2c.o +HAL_I2C_Mem_Read_IT build/stm32f3xx_hal_i2c.o +HAL_I2C_Mem_Write build/stm32f3xx_hal_i2c.o + build/main.o +HAL_I2C_Mem_Write_DMA build/stm32f3xx_hal_i2c.o +HAL_I2C_Mem_Write_IT build/stm32f3xx_hal_i2c.o +HAL_I2C_MspDeInit build/stm32f3xx_hal_msp.o +HAL_I2C_MspInit build/stm32f3xx_hal_msp.o +HAL_I2C_SlaveRxCpltCallback build/stm32f3xx_hal_i2c.o +HAL_I2C_SlaveTxCpltCallback build/stm32f3xx_hal_i2c.o +HAL_I2C_Slave_Receive build/stm32f3xx_hal_i2c.o +HAL_I2C_Slave_Receive_DMA build/stm32f3xx_hal_i2c.o +HAL_I2C_Slave_Receive_IT build/stm32f3xx_hal_i2c.o +HAL_I2C_Slave_Seq_Receive_DMA build/stm32f3xx_hal_i2c.o +HAL_I2C_Slave_Seq_Receive_IT build/stm32f3xx_hal_i2c.o +HAL_I2C_Slave_Seq_Transmit_DMA build/stm32f3xx_hal_i2c.o +HAL_I2C_Slave_Seq_Transmit_IT build/stm32f3xx_hal_i2c.o +HAL_I2C_Slave_Transmit build/stm32f3xx_hal_i2c.o +HAL_I2C_Slave_Transmit_DMA build/stm32f3xx_hal_i2c.o +HAL_I2C_Slave_Transmit_IT build/stm32f3xx_hal_i2c.o +HAL_IncTick build/stm32f3xx_hal.o + build/stm32f3xx_it.o +HAL_Init build/stm32f3xx_hal.o + build/main.o +HAL_InitTick build/stm32f3xx_hal.o + build/stm32f3xx_hal_rcc.o +HAL_MPU_ConfigRegion build/stm32f3xx_hal_cortex.o +HAL_MPU_Disable build/stm32f3xx_hal_cortex.o +HAL_MPU_Enable build/stm32f3xx_hal_cortex.o +HAL_MspDeInit build/stm32f3xx_hal.o +HAL_MspInit build/stm32f3xx_hal_msp.o +HAL_NVIC_ClearPendingIRQ build/stm32f3xx_hal_cortex.o +HAL_NVIC_DisableIRQ build/stm32f3xx_hal_cortex.o + build/stm32f3xx_hal_msp.o +HAL_NVIC_EnableIRQ build/stm32f3xx_hal_cortex.o + build/stm32f3xx_hal_msp.o +HAL_NVIC_GetActive build/stm32f3xx_hal_cortex.o +HAL_NVIC_GetPendingIRQ build/stm32f3xx_hal_cortex.o +HAL_NVIC_GetPriority build/stm32f3xx_hal_cortex.o +HAL_NVIC_GetPriorityGrouping build/stm32f3xx_hal_cortex.o +HAL_NVIC_SetPendingIRQ build/stm32f3xx_hal_cortex.o +HAL_NVIC_SetPriority build/stm32f3xx_hal_cortex.o + build/stm32f3xx_hal.o + build/stm32f3xx_hal_msp.o +HAL_NVIC_SetPriorityGrouping build/stm32f3xx_hal_cortex.o + build/stm32f3xx_hal.o +HAL_NVIC_SystemReset build/stm32f3xx_hal_cortex.o +HAL_PWR_ConfigPVD build/stm32f3xx_hal_pwr_ex.o +HAL_PWR_DeInit build/stm32f3xx_hal_pwr.o +HAL_PWR_DisableBkUpAccess build/stm32f3xx_hal_pwr.o +HAL_PWR_DisablePVD build/stm32f3xx_hal_pwr_ex.o +HAL_PWR_DisableSEVOnPend build/stm32f3xx_hal_pwr.o +HAL_PWR_DisableSleepOnExit build/stm32f3xx_hal_pwr.o +HAL_PWR_DisableWakeUpPin build/stm32f3xx_hal_pwr.o +HAL_PWR_EnableBkUpAccess build/stm32f3xx_hal_pwr.o +HAL_PWR_EnablePVD build/stm32f3xx_hal_pwr_ex.o +HAL_PWR_EnableSEVOnPend build/stm32f3xx_hal_pwr.o +HAL_PWR_EnableSleepOnExit build/stm32f3xx_hal_pwr.o +HAL_PWR_EnableWakeUpPin build/stm32f3xx_hal_pwr.o +HAL_PWR_EnterSLEEPMode build/stm32f3xx_hal_pwr.o +HAL_PWR_EnterSTANDBYMode build/stm32f3xx_hal_pwr.o +HAL_PWR_EnterSTOPMode build/stm32f3xx_hal_pwr.o +HAL_PWR_PVDCallback build/stm32f3xx_hal_pwr_ex.o +HAL_PWR_PVD_IRQHandler build/stm32f3xx_hal_pwr_ex.o +HAL_RCCEx_GetPeriphCLKConfig build/stm32f3xx_hal_rcc_ex.o +HAL_RCCEx_GetPeriphCLKFreq build/stm32f3xx_hal_rcc_ex.o +HAL_RCCEx_PeriphCLKConfig build/stm32f3xx_hal_rcc_ex.o + build/main.o +HAL_RCC_CSSCallback build/stm32f3xx_hal_rcc.o +HAL_RCC_ClockConfig build/stm32f3xx_hal_rcc.o + build/main.o +HAL_RCC_DeInit build/stm32f3xx_hal_rcc.o +HAL_RCC_DisableCSS build/stm32f3xx_hal_rcc.o +HAL_RCC_EnableCSS build/stm32f3xx_hal_rcc.o +HAL_RCC_GetClockConfig build/stm32f3xx_hal_rcc.o +HAL_RCC_GetHCLKFreq build/stm32f3xx_hal_rcc.o +HAL_RCC_GetOscConfig build/stm32f3xx_hal_rcc.o +HAL_RCC_GetPCLK1Freq build/stm32f3xx_hal_rcc.o + build/stm32f3xx_hal_rcc_ex.o +HAL_RCC_GetPCLK2Freq build/stm32f3xx_hal_rcc.o + build/stm32f3xx_hal_rcc_ex.o +HAL_RCC_GetSysClockFreq build/stm32f3xx_hal_rcc.o + build/stm32f3xx_hal_rcc_ex.o +HAL_RCC_MCOConfig build/stm32f3xx_hal_rcc.o +HAL_RCC_NMI_IRQHandler build/stm32f3xx_hal_rcc.o +HAL_RCC_OscConfig build/stm32f3xx_hal_rcc.o + build/main.o +HAL_ResumeTick build/stm32f3xx_hal.o +HAL_SPIEx_FlushRxFifo build/stm32f3xx_hal_spi_ex.o +HAL_SPI_Abort build/stm32f3xx_hal_spi.o +HAL_SPI_AbortCpltCallback build/stm32f3xx_hal_spi.o +HAL_SPI_Abort_IT build/stm32f3xx_hal_spi.o +HAL_SPI_DMAPause build/stm32f3xx_hal_spi.o +HAL_SPI_DMAResume build/stm32f3xx_hal_spi.o +HAL_SPI_DMAStop build/stm32f3xx_hal_spi.o +HAL_SPI_DeInit build/stm32f3xx_hal_spi.o +HAL_SPI_ErrorCallback build/stm32f3xx_hal_spi.o +HAL_SPI_GetError build/stm32f3xx_hal_spi.o +HAL_SPI_GetState build/stm32f3xx_hal_spi.o +HAL_SPI_IRQHandler build/stm32f3xx_hal_spi.o +HAL_SPI_Init build/stm32f3xx_hal_spi.o + build/main.o +HAL_SPI_MspDeInit build/stm32f3xx_hal_msp.o +HAL_SPI_MspInit build/stm32f3xx_hal_msp.o +HAL_SPI_Receive build/stm32f3xx_hal_spi.o + build/ADBMS_LL_Driver.o +HAL_SPI_Receive_DMA build/stm32f3xx_hal_spi.o +HAL_SPI_Receive_IT build/stm32f3xx_hal_spi.o +HAL_SPI_RxCpltCallback build/stm32f3xx_hal_spi.o +HAL_SPI_RxHalfCpltCallback build/stm32f3xx_hal_spi.o +HAL_SPI_Transmit build/stm32f3xx_hal_spi.o +HAL_SPI_TransmitReceive build/stm32f3xx_hal_spi.o + build/ADBMS_LL_Driver.o +HAL_SPI_TransmitReceive_DMA build/stm32f3xx_hal_spi.o +HAL_SPI_TransmitReceive_IT build/stm32f3xx_hal_spi.o +HAL_SPI_Transmit_DMA build/stm32f3xx_hal_spi.o +HAL_SPI_Transmit_IT build/stm32f3xx_hal_spi.o +HAL_SPI_TxCpltCallback build/stm32f3xx_hal_spi.o +HAL_SPI_TxHalfCpltCallback build/stm32f3xx_hal_spi.o +HAL_SPI_TxRxCpltCallback build/stm32f3xx_hal_spi.o +HAL_SPI_TxRxHalfCpltCallback build/stm32f3xx_hal_spi.o +HAL_SYSTICK_CLKSourceConfig build/stm32f3xx_hal_cortex.o +HAL_SYSTICK_Callback build/stm32f3xx_hal_cortex.o +HAL_SYSTICK_Config build/stm32f3xx_hal_cortex.o + build/stm32f3xx_hal.o +HAL_SYSTICK_IRQHandler build/stm32f3xx_hal_cortex.o +HAL_SetTickFreq build/stm32f3xx_hal.o +HAL_SuspendTick build/stm32f3xx_hal.o +HardFault_Handler build/stm32f3xx_it.o +I2C1_ER_IRQHandler build/startup_stm32f302xc.o +I2C1_EV_IRQHandler build/startup_stm32f302xc.o +I2C2_ER_IRQHandler build/startup_stm32f302xc.o +I2C2_EV_IRQHandler build/startup_stm32f302xc.o +MemManage_Handler build/stm32f3xx_it.o +NMI_Handler build/stm32f3xx_it.o +PENDING_MESSAGE_HANDLE build/AMS_CAN.o +PVD_IRQHandler build/startup_stm32f302xc.o +PendSV_Handler build/stm32f3xx_it.o +RCC_IRQHandler build/startup_stm32f302xc.o +RTC_Alarm_IRQHandler build/startup_stm32f302xc.o +RTC_WKUP_IRQHandler build/startup_stm32f302xc.o +Reset_Handler build/startup_stm32f302xc.o +SPI1_IRQHandler build/startup_stm32f302xc.o +SPI2_IRQHandler build/startup_stm32f302xc.o +SPI3_IRQHandler build/startup_stm32f302xc.o +SVC_Handler build/stm32f3xx_it.o +SysTick_Handler build/stm32f3xx_it.o +SystemClock_Config build/main.o +SystemCoreClock build/system_stm32f3xx.o + build/stm32f3xx_hal_spi.o + build/stm32f3xx_hal_rcc_ex.o + build/stm32f3xx_hal_rcc.o + build/stm32f3xx_hal.o +SystemCoreClockUpdate build/system_stm32f3xx.o +SystemInit build/system_stm32f3xx.o + build/startup_stm32f302xc.o +TAMP_STAMP_IRQHandler build/startup_stm32f302xc.o +TIM1_BRK_TIM15_IRQHandler build/startup_stm32f302xc.o +TIM1_CC_IRQHandler build/startup_stm32f302xc.o +TIM1_TRG_COM_TIM17_IRQHandler build/startup_stm32f302xc.o +TIM1_UP_TIM16_IRQHandler build/startup_stm32f302xc.o +TIM2_IRQHandler build/startup_stm32f302xc.o +TIM3_IRQHandler build/startup_stm32f302xc.o +TIM4_IRQHandler build/startup_stm32f302xc.o +TIM6_DAC_IRQHandler build/startup_stm32f302xc.o +UART4_IRQHandler build/startup_stm32f302xc.o +UART5_IRQHandler build/startup_stm32f302xc.o +USART1_IRQHandler build/startup_stm32f302xc.o +USART2_IRQHandler build/startup_stm32f302xc.o +USART3_IRQHandler build/startup_stm32f302xc.o +USBWakeUp_IRQHandler build/startup_stm32f302xc.o +USBWakeUp_RMP_IRQHandler build/startup_stm32f302xc.o +USB_HP_CAN_TX_IRQHandler build/startup_stm32f302xc.o +USB_HP_IRQHandler build/startup_stm32f302xc.o +USB_LP_CAN_RX0_IRQHandler build/stm32f3xx_it.o +USB_LP_IRQHandler build/startup_stm32f302xc.o +UsageFault_Handler build/stm32f3xx_it.o +WWDG_IRQHandler build/startup_stm32f302xc.o +_Min_Stack_Size build/sysmem.o +__atexit /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-__call_atexit.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-__atexit.o) +__atexit0 /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-__atexit.o) +__atexit_dummy /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-__atexit.o) +__atexit_recursive_mutex /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-__call_atexit.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-__atexit.o) +__bss_end__ /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o +__bss_start__ /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o +__call_exitprocs /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-__call_atexit.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-__atexit.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-exit.o) +__deregister_frame_info /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crtbegin.o +__dso_handle /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crtbegin.o +__env build/syscalls.o +__errno /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-errno.o) + build/sysmem.o + build/syscalls.o +__fini_array_end /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-fini.o) +__fini_array_start /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-fini.o) +__fp_lock_all /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) +__fp_unlock_all /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) +__init_array_end /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-init.o) +__init_array_start /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-init.o) +__io_getchar build/syscalls.o +__io_putchar build/syscalls.o +__libc_fini_array /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-fini.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o +__libc_init_array /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-init.o) + build/startup_stm32f302xc.o + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o +__lock___arc4random_mutex /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lock.o) +__lock___at_quick_exit_mutex /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lock.o) +__lock___atexit_recursive_mutex /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lock.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-__call_atexit.o) +__lock___dd_hash_mutex /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lock.o) +__lock___env_recursive_mutex /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lock.o) +__lock___malloc_recursive_mutex /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lock.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-mlock.o) +__lock___sfp_recursive_mutex /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lock.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) +__lock___tz_mutex /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lock.o) +__malloc_free_list /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-mallocr.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-freer.o) +__malloc_lock /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-mlock.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-mallocr.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-freer.o) +__malloc_sbrk_start /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-mallocr.o) +__malloc_unlock /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-mlock.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-mallocr.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-freer.o) +__on_exit_args /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-__atexit.o) +__preinit_array_end /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-init.o) +__preinit_array_start /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-init.o) +__register_exitproc /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-__atexit.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-atexit.o) +__register_frame_info /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crtbegin.o +__retarget_lock_acquire /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lock.o) +__retarget_lock_acquire_recursive /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lock.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-fflush.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-mlock.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-__call_atexit.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-__atexit.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) +__retarget_lock_close /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lock.o) +__retarget_lock_close_recursive /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lock.o) +__retarget_lock_init /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lock.o) +__retarget_lock_init_recursive /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lock.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) +__retarget_lock_release /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lock.o) +__retarget_lock_release_recursive /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lock.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-fflush.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-mlock.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-__call_atexit.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-__atexit.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) +__retarget_lock_try_acquire /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lock.o) +__retarget_lock_try_acquire_recursive /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lock.o) +__sclose /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-stdio.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) +__seofread /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-stdio.o) +__sf /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-impure.o) +__sflush_r /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-fflush.o) +__sfp /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) +__sfp_lock_acquire /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) +__sfp_lock_release /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) +__sglue /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-fflush.o) +__sinit /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-fflush.o) +__sread /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-stdio.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) +__sseek /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-stdio.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) +__stack /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o +__stdio_exit_handler /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-exit.o) +__swrite /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-stdio.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) +_close build/syscalls.o + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-closer.o) +_close_r /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-closer.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-stdio.o) +_ebss build/startup_stm32f302xc.o +_edata build/startup_stm32f302xc.o +_end build/sysmem.o +_estack build/startup_stm32f302xc.o + build/sysmem.o +_execve build/syscalls.o +_exit build/syscalls.o + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-exit.o) +_fflush_r /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-fflush.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) +_fini /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crti.o + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-fini.o) +_fork build/syscalls.o +_free_r /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-freer.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-fflush.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-reent.o) +_fstat build/syscalls.o +_fwalk_sglue /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-fwalk.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-fflush.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) +_getpid build/syscalls.o +_impure_data /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-impure.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-fflush.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) +_impure_ptr /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-impure.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-fflush.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-errno.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-reent.o) +_init /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/thumb/v7e-m+fp/hard/crti.o + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-init.o) +_isatty build/syscalls.o +_kill build/syscalls.o +_link build/syscalls.o +_lseek build/syscalls.o + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lseekr.o) +_lseek_r /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lseekr.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-stdio.o) +_mainCRTStartup /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o +_malloc_r /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-mallocr.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) +_open build/syscalls.o +_read build/syscalls.o + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-readr.o) +_read_r /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-readr.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-stdio.o) +_reclaim_reent /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-reent.o) +_sbrk build/sysmem.o + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-sbrkr.o) +_sbrk_r /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-sbrkr.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-mallocr.o) +_sbss build/startup_stm32f302xc.o +_sdata build/startup_stm32f302xc.o +_sidata build/startup_stm32f302xc.o +_stack_init /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o +_start /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o +_stat build/syscalls.o +_times build/syscalls.o +_unlink build/syscalls.o +_wait build/syscalls.o +_write build/syscalls.o + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-writer.o) +_write_r /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-writer.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-stdio.o) +aPLLMULFactorTable build/stm32f3xx_hal_rcc.o +aPredivFactorTable build/stm32f3xx_hal_rcc.o +adbmsDriverInit build/ADBMS_LL_Driver.o + build/ADBMS_Abstraction.o +adbmsspi build/ADBMS_LL_Driver.o +amsAuxMeasurement build/ADBMS_Abstraction.o + build/AMS_HighLevel.o +amsCellMeasurement build/ADBMS_Abstraction.o + build/AMS_HighLevel.o +amsCheckUnderOverVoltage build/ADBMS_Abstraction.o + build/AMS_HighLevel.o +amsClearAux build/ADBMS_Abstraction.o + build/AMS_HighLevel.o +amsClearCells build/ADBMS_Abstraction.o +amsClearError build/ADBMS_Abstraction.o +amsClearStatus build/ADBMS_Abstraction.o +amsClearWarning build/ADBMS_Abstraction.o + build/AMS_HighLevel.o +amsConfigAuxMeasurement build/ADBMS_Abstraction.o + build/AMS_HighLevel.o +amsConfigBalancing build/ADBMS_Abstraction.o + build/Testbench.o + build/AMS_HighLevel.o +amsConfigCellMeasurement build/ADBMS_Abstraction.o +amsConfigGPIO build/ADBMS_Abstraction.o +amsConfigOverVoltage build/ADBMS_Abstraction.o + build/AMS_HighLevel.o +amsConfigUnderVoltage build/ADBMS_Abstraction.o + build/AMS_HighLevel.o +amsInternalStatusMeasurement build/ADBMS_Abstraction.o + build/AMS_HighLevel.o +amsReadCellVoltages build/ADBMS_Abstraction.o + build/Testbench.o +amsSelfTest build/ADBMS_Abstraction.o +amsSendError build/ADBMS_Abstraction.o +amsSendWarning build/ADBMS_Abstraction.o +amsSetGPIO build/ADBMS_Abstraction.o +amsStartBalancing build/ADBMS_Abstraction.o + build/Testbench.o + build/AMS_HighLevel.o +amsStopBalancing build/ADBMS_Abstraction.o + build/Testbench.o + build/AMS_HighLevel.o +amsWakeUp build/ADBMS_Abstraction.o + build/AMS_HighLevel.o +ams_can_handle build/AMS_CAN.o + build/Testbench.o +ams_can_handle_ams_msg build/AMS_CAN.o +ams_can_init build/AMS_CAN.o + build/main.o +ams_can_send_heartbeat build/AMS_CAN.o + build/Testbench.o +ams_can_wait_for_free_mailboxes build/AMS_CAN.o + build/Testbench.o +amscheckOpenCellWire build/ADBMS_Abstraction.o +amserrorcode build/AMS_HighLevel.o +amsov build/AMS_HighLevel.o +amsuv build/AMS_HighLevel.o +amswarningcode build/AMS_HighLevel.o +atexit /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-atexit.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o +balancedCells build/AMS_HighLevel.o +balancingvoltagedelta build/AMS_HighLevel.o +calculatePEC build/ADBMS_LL_Driver.o +canTestData build/AMS_CAN.o + build/main.o +canTestSendAnswer build/Testbench.o +canTestSendTemperatures build/Testbench.o +checkPEC build/ADBMS_LL_Driver.o +currentAMSState build/AMS_HighLevel.o +currentintegrator build/AMS_HighLevel.o +currenttick build/AMS_HighLevel.o +eepromconfigured build/AMS_HighLevel.o +environ build/syscalls.o +errno /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-reent.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-sbrkr.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-writer.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-readr.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-lseekr.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-closer.o) +exit /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-exit.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o +fflush /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-fflush.o) +g_pfnVectors build/startup_stm32f302xc.o +hardware_init_hook /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o +hcan build/main.o + build/stm32f3xx_it.o +hi2c1 build/main.o +hi2c2 build/main.o +hspi1 build/main.o +initAMS build/ADBMS_Abstraction.o + build/AMS_HighLevel.o +initialise_monitor_handles build/syscalls.o +integrateCurrent build/AMS_HighLevel.o +internalbalancingalgo build/AMS_HighLevel.o +lastAMSState build/AMS_HighLevel.o +lastticks build/AMS_HighLevel.o +main build/main.o + build/startup_stm32f302xc.o + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o +malloc /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-__atexit.o) +mcuAdbmsCSHigh build/ADBMS_LL_Driver.o +mcuAdbmsCSLow build/ADBMS_LL_Driver.o +mcuDelay build/ADBMS_LL_Driver.o + build/ADBMS_Abstraction.o +mcuSPIReceive build/ADBMS_LL_Driver.o +mcuSPITransmit build/ADBMS_LL_Driver.o +mcuSPITransmitReceive build/ADBMS_LL_Driver.o +memset /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-memset.o) + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libc_nano.a(libc_a-findfp.o) + build/main.o + /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o +module build/AMS_HighLevel.o + build/Testbench.o + build/AMS_CAN.o +numberofAux build/AMS_HighLevel.o +numberofCells build/AMS_HighLevel.o +numberofauxchannels build/ADBMS_Abstraction.o +numberofcells build/ADBMS_Abstraction.o +pFlash build/stm32f3xx_hal_flash.o + build/stm32f3xx_hal_flash_ex.o +readCMD build/ADBMS_LL_Driver.o + build/ADBMS_Abstraction.o +readGPIO build/ADBMS_Abstraction.o +readTemperatures build/Testbench.o +readeeprom build/main.o + build/Testbench.o +resetData build/Testbench.o +sensor_init build/main.o + build/Testbench.o +sensor_read build/main.o + build/Testbench.o +software_init_hook /home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-none-eabi-gcc/12.2.1-1.2.1/.content/bin/../lib/gcc/arm-none-eabi/12.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/crt0.o +startbalancingthreshold build/AMS_HighLevel.o +stateofcharge build/AMS_HighLevel.o +stopbalancingthreshold build/AMS_HighLevel.o +testLoop build/Testbench.o + build/main.o +updatePEC build/ADBMS_LL_Driver.o +uwTick build/stm32f3xx_hal.o +uwTickFreq build/stm32f3xx_hal.o +uwTickPrio build/stm32f3xx_hal.o + build/stm32f3xx_hal_rcc.o +writeCMD build/ADBMS_LL_Driver.o + build/ADBMS_Abstraction.o +writeErrorLog build/AMS_HighLevel.o +writeWarningLog build/AMS_HighLevel.o +writeeeprom build/main.o + build/Testbench.o diff --git a/BMS_Testbench/BMS_Software_V1/build/main.d b/BMS_Testbench/BMS_Software_V1/build/main.d new file mode 100644 index 0000000..1e10e3c --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/main.d @@ -0,0 +1,73 @@ +build/main.o: Core/Src/main.c Core/Inc/main.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h \ + Core/Inc/stm32f3xx_hal_conf.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h \ + Drivers/CMSIS/Include/core_cm4.h Drivers/CMSIS/Include/cmsis_version.h \ + Drivers/CMSIS/Include/cmsis_compiler.h Drivers/CMSIS/Include/cmsis_gcc.h \ + Drivers/CMSIS/Include/mpu_armv7.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h \ + Core/Inc/ADBMS_Abstraction.h Core/Inc/ADBMS_LL_Driver.h Core/Inc/main.h \ + Core/Inc/ADBMS_CMD_MAKROS.h Core/Inc/ADBMS_CMD_MAKROS.h \ + Core/Inc/AMS_HighLevel.h Core/Inc/ADBMS_Abstraction.h Core/Inc/AMS_CAN.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h \ + Core/Inc/Testbench.h +Core/Inc/main.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h: +Core/Inc/stm32f3xx_hal_conf.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h: +Drivers/CMSIS/Include/core_cm4.h: +Drivers/CMSIS/Include/cmsis_version.h: +Drivers/CMSIS/Include/cmsis_compiler.h: +Drivers/CMSIS/Include/cmsis_gcc.h: +Drivers/CMSIS/Include/mpu_armv7.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h: +Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h: +Core/Inc/ADBMS_Abstraction.h: +Core/Inc/ADBMS_LL_Driver.h: +Core/Inc/main.h: +Core/Inc/ADBMS_CMD_MAKROS.h: +Core/Inc/ADBMS_CMD_MAKROS.h: +Core/Inc/AMS_HighLevel.h: +Core/Inc/ADBMS_Abstraction.h: +Core/Inc/AMS_CAN.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h: +Core/Inc/Testbench.h: diff --git a/BMS_Testbench/BMS_Software_V1/build/main.lst b/BMS_Testbench/BMS_Software_V1/build/main.lst new file mode 100644 index 0000000..ba586e2 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/main.lst @@ -0,0 +1,2091 @@ +ARM GAS /tmp/cctSQMH6.s page 1 + + + 1 .cpu cortex-m4 + 2 .arch armv7e-m + 3 .fpu fpv4-sp-d16 + 4 .eabi_attribute 27, 1 + 5 .eabi_attribute 28, 1 + 6 .eabi_attribute 20, 1 + 7 .eabi_attribute 21, 1 + 8 .eabi_attribute 23, 3 + 9 .eabi_attribute 24, 1 + 10 .eabi_attribute 25, 1 + 11 .eabi_attribute 26, 1 + 12 .eabi_attribute 30, 1 + 13 .eabi_attribute 34, 1 + 14 .eabi_attribute 18, 4 + 15 .file "main.c" + 16 .text + 17 .Ltext0: + 18 .cfi_sections .debug_frame + 19 .file 1 "Core/Src/main.c" + 20 .section .text.MX_GPIO_Init,"ax",%progbits + 21 .align 1 + 22 .syntax unified + 23 .thumb + 24 .thumb_func + 26 MX_GPIO_Init: + 27 .LFB136: + 1:Core/Src/main.c **** /* USER CODE BEGIN Header */ + 2:Core/Src/main.c **** /** + 3:Core/Src/main.c **** ****************************************************************************** + 4:Core/Src/main.c **** * @file : main.c + 5:Core/Src/main.c **** * @brief : Main program body + 6:Core/Src/main.c **** ****************************************************************************** + 7:Core/Src/main.c **** * @attention + 8:Core/Src/main.c **** * + 9:Core/Src/main.c **** * Copyright (c) 2023 STMicroelectronics. + 10:Core/Src/main.c **** * All rights reserved. + 11:Core/Src/main.c **** * + 12:Core/Src/main.c **** * This software is licensed under terms that can be found in the LICENSE file + 13:Core/Src/main.c **** * in the root directory of this software component. + 14:Core/Src/main.c **** * If no LICENSE file comes with this software, it is provided AS-IS. + 15:Core/Src/main.c **** * + 16:Core/Src/main.c **** ****************************************************************************** + 17:Core/Src/main.c **** */ + 18:Core/Src/main.c **** /* USER CODE END Header */ + 19:Core/Src/main.c **** /* Includes ------------------------------------------------------------------*/ + 20:Core/Src/main.c **** #include "main.h" + 21:Core/Src/main.c **** + 22:Core/Src/main.c **** /* Private includes ----------------------------------------------------------*/ + 23:Core/Src/main.c **** /* USER CODE BEGIN Includes */ + 24:Core/Src/main.c **** #include "ADBMS_Abstraction.h" + 25:Core/Src/main.c **** #include "ADBMS_CMD_MAKROS.h" + 26:Core/Src/main.c **** #include "AMS_HighLevel.h" + 27:Core/Src/main.c **** #include "AMS_CAN.h" + 28:Core/Src/main.c **** #include "Testbench.h" + 29:Core/Src/main.c **** /* USER CODE END Includes */ + 30:Core/Src/main.c **** + 31:Core/Src/main.c **** /* Private typedef -----------------------------------------------------------*/ + ARM GAS /tmp/cctSQMH6.s page 2 + + + 32:Core/Src/main.c **** /* USER CODE BEGIN PTD */ + 33:Core/Src/main.c **** + 34:Core/Src/main.c **** /* USER CODE END PTD */ + 35:Core/Src/main.c **** + 36:Core/Src/main.c **** /* Private define ------------------------------------------------------------*/ + 37:Core/Src/main.c **** /* USER CODE BEGIN PD */ + 38:Core/Src/main.c **** #define N_SENSORS 12 + 39:Core/Src/main.c **** #define eAdress 0xAE + 40:Core/Src/main.c **** /* USER CODE END PD */ + 41:Core/Src/main.c **** + 42:Core/Src/main.c **** /* Private macro -------------------------------------------------------------*/ + 43:Core/Src/main.c **** /* USER CODE BEGIN PM */ + 44:Core/Src/main.c **** + 45:Core/Src/main.c **** /* USER CODE END PM */ + 46:Core/Src/main.c **** + 47:Core/Src/main.c **** /* Private variables ---------------------------------------------------------*/ + 48:Core/Src/main.c **** CAN_HandleTypeDef hcan; + 49:Core/Src/main.c **** + 50:Core/Src/main.c **** I2C_HandleTypeDef hi2c1; + 51:Core/Src/main.c **** I2C_HandleTypeDef hi2c2; + 52:Core/Src/main.c **** + 53:Core/Src/main.c **** SPI_HandleTypeDef hspi1; + 54:Core/Src/main.c **** + 55:Core/Src/main.c **** /* USER CODE BEGIN PV */ + 56:Core/Src/main.c **** static uint32_t last_error = 0; + 57:Core/Src/main.c **** extern uint8_t canTestData; + 58:Core/Src/main.c **** extern int PENDING_MESSAGE_HANDLE; + 59:Core/Src/main.c **** extern + 60:Core/Src/main.c **** /* USER CODE END PV */ + 61:Core/Src/main.c **** + 62:Core/Src/main.c **** /* Private function prototypes -----------------------------------------------*/ + 63:Core/Src/main.c **** void SystemClock_Config(void); + 64:Core/Src/main.c **** static void MX_GPIO_Init(void); + 65:Core/Src/main.c **** static void MX_CAN_Init(void); + 66:Core/Src/main.c **** static void MX_I2C1_Init(void); + 67:Core/Src/main.c **** static void MX_I2C2_Init(void); + 68:Core/Src/main.c **** static void MX_SPI1_Init(void); + 69:Core/Src/main.c **** /* USER CODE BEGIN PFP */ + 70:Core/Src/main.c **** void lowPowerLoop(void); + 71:Core/Src/main.c **** HAL_StatusTypeDef sensor_init(int); + 72:Core/Src/main.c **** HAL_StatusTypeDef sensor_read(int, uint16_t*); + 73:Core/Src/main.c **** uint8_t readeeprom(uint16_t address); + 74:Core/Src/main.c **** void writeeeprom(uint16_t address, uint8_t data); + 75:Core/Src/main.c **** + 76:Core/Src/main.c **** + 77:Core/Src/main.c **** /* USER CODE END PFP */ + 78:Core/Src/main.c **** + 79:Core/Src/main.c **** /* Private user code ---------------------------------------------------------*/ + 80:Core/Src/main.c **** /* USER CODE BEGIN 0 */ + 81:Core/Src/main.c **** + 82:Core/Src/main.c **** /* USER CODE END 0 */ + 83:Core/Src/main.c **** + 84:Core/Src/main.c **** /** + 85:Core/Src/main.c **** * @brief The application entry point. + 86:Core/Src/main.c **** * @retval int + 87:Core/Src/main.c **** */ + 88:Core/Src/main.c **** int main(void) + ARM GAS /tmp/cctSQMH6.s page 3 + + + 89:Core/Src/main.c **** { + 90:Core/Src/main.c **** /* USER CODE BEGIN 1 */ + 91:Core/Src/main.c **** + 92:Core/Src/main.c **** /* USER CODE END 1 */ + 93:Core/Src/main.c **** + 94:Core/Src/main.c **** /* MCU Configuration--------------------------------------------------------*/ + 95:Core/Src/main.c **** + 96:Core/Src/main.c **** /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + 97:Core/Src/main.c **** HAL_Init(); + 98:Core/Src/main.c **** + 99:Core/Src/main.c **** /* USER CODE BEGIN Init */ + 100:Core/Src/main.c **** + 101:Core/Src/main.c **** /* USER CODE END Init */ + 102:Core/Src/main.c **** + 103:Core/Src/main.c **** /* Configure the system clock */ + 104:Core/Src/main.c **** SystemClock_Config(); + 105:Core/Src/main.c **** + 106:Core/Src/main.c **** /* USER CODE BEGIN SysInit */ + 107:Core/Src/main.c **** + 108:Core/Src/main.c **** /* USER CODE END SysInit */ + 109:Core/Src/main.c **** + 110:Core/Src/main.c **** /* Initialize all configured peripherals */ + 111:Core/Src/main.c **** MX_GPIO_Init(); + 112:Core/Src/main.c **** MX_CAN_Init(); + 113:Core/Src/main.c **** MX_I2C1_Init(); + 114:Core/Src/main.c **** MX_I2C2_Init(); + 115:Core/Src/main.c **** MX_SPI1_Init(); + 116:Core/Src/main.c **** /* USER CODE BEGIN 2 */ + 117:Core/Src/main.c **** // eepromInitParameters(); + 118:Core/Src/main.c **** for (int i = 0; i < N_SENSORS; i++) { + 119:Core/Src/main.c **** if (sensor_init(i) != HAL_OK) { + 120:Core/Src/main.c **** last_error = HAL_GetTick(); + 121:Core/Src/main.c **** } + 122:Core/Src/main.c **** } + 123:Core/Src/main.c **** + 124:Core/Src/main.c **** AMS_Init(&hspi1); + 125:Core/Src/main.c **** ams_can_init(&hcan, &hcan); + 126:Core/Src/main.c **** //amsConfigAuxMeasurement(9); + 127:Core/Src/main.c **** + 128:Core/Src/main.c **** // startUARTConsole(&huart2, &module); + 129:Core/Src/main.c **** // htim2.Instance->CCR1 = 0x01FF; + 130:Core/Src/main.c **** // HAL_TIM_Base_Start(&htim2); + 131:Core/Src/main.c **** /* USER CODE END 2 */ + 132:Core/Src/main.c **** + 133:Core/Src/main.c **** /* Infinite loop */ + 134:Core/Src/main.c **** /* USER CODE BEGIN WHILE */ + 135:Core/Src/main.c **** writeeeprom(1, 69); + 136:Core/Src/main.c **** uint16_t temperatures[N_SENSORS]; + 137:Core/Src/main.c **** AMS_Loop(); + 138:Core/Src/main.c **** while (1){ + 139:Core/Src/main.c **** if(BMS_IN_TEST_MODE == 1 ){ ////&& PENDING_MESSAGE_HANDLE == 1 + 140:Core/Src/main.c **** testLoop(&canTestData); + 141:Core/Src/main.c **** /* USER CODE END WHILE */ + 142:Core/Src/main.c **** /* USER CODE BEGIN 3 */ + 143:Core/Src/main.c **** + 144:Core/Src/main.c **** for (int i = 0; i < N_SENSORS; i++) { + 145:Core/Src/main.c **** if (sensor_read(i, &temperatures[i]) != HAL_OK) { + ARM GAS /tmp/cctSQMH6.s page 4 + + + 146:Core/Src/main.c **** sensor_init(i); + 147:Core/Src/main.c **** last_error = HAL_GetTick(); + 148:Core/Src/main.c **** } + 149:Core/Src/main.c **** } + 150:Core/Src/main.c **** if(BMS_IN_TEST_MODE != 1){ + 151:Core/Src/main.c **** ams_can_send_heartbeat(); //for testing + 152:Core/Src/main.c **** } + 153:Core/Src/main.c **** } + 154:Core/Src/main.c **** } + 155:Core/Src/main.c **** + 156:Core/Src/main.c **** /* USER CODE END 3 */ + 157:Core/Src/main.c **** } + 158:Core/Src/main.c **** + 159:Core/Src/main.c **** /** + 160:Core/Src/main.c **** * @brief System Clock Configuration + 161:Core/Src/main.c **** * @retval None + 162:Core/Src/main.c **** */ + 163:Core/Src/main.c **** void SystemClock_Config(void) + 164:Core/Src/main.c **** { + 165:Core/Src/main.c **** RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + 166:Core/Src/main.c **** RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + 167:Core/Src/main.c **** RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; + 168:Core/Src/main.c **** + 169:Core/Src/main.c **** /** Initializes the RCC Oscillators according to the specified parameters + 170:Core/Src/main.c **** * in the RCC_OscInitTypeDef structure. + 171:Core/Src/main.c **** */ + 172:Core/Src/main.c **** RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE; + 173:Core/Src/main.c **** RCC_OscInitStruct.HSEState = RCC_HSE_ON; + 174:Core/Src/main.c **** RCC_OscInitStruct.HSIState = RCC_HSI_ON; + 175:Core/Src/main.c **** RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + 176:Core/Src/main.c **** RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; + 177:Core/Src/main.c **** if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + 178:Core/Src/main.c **** { + 179:Core/Src/main.c **** Error_Handler(); + 180:Core/Src/main.c **** } + 181:Core/Src/main.c **** + 182:Core/Src/main.c **** /** Initializes the CPU, AHB and APB buses clocks + 183:Core/Src/main.c **** */ + 184:Core/Src/main.c **** RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + 185:Core/Src/main.c **** |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + 186:Core/Src/main.c **** RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE; + 187:Core/Src/main.c **** RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + 188:Core/Src/main.c **** RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; + 189:Core/Src/main.c **** RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + 190:Core/Src/main.c **** + 191:Core/Src/main.c **** if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) + 192:Core/Src/main.c **** { + 193:Core/Src/main.c **** Error_Handler(); + 194:Core/Src/main.c **** } + 195:Core/Src/main.c **** PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_I2C1|RCC_PERIPHCLK_I2C2; + 196:Core/Src/main.c **** PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_HSI; + 197:Core/Src/main.c **** PeriphClkInit.I2c2ClockSelection = RCC_I2C2CLKSOURCE_HSI; + 198:Core/Src/main.c **** if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) + 199:Core/Src/main.c **** { + 200:Core/Src/main.c **** Error_Handler(); + 201:Core/Src/main.c **** } + 202:Core/Src/main.c **** } + ARM GAS /tmp/cctSQMH6.s page 5 + + + 203:Core/Src/main.c **** + 204:Core/Src/main.c **** /** + 205:Core/Src/main.c **** * @brief CAN Initialization Function + 206:Core/Src/main.c **** * @param None + 207:Core/Src/main.c **** * @retval None + 208:Core/Src/main.c **** */ + 209:Core/Src/main.c **** static void MX_CAN_Init(void) + 210:Core/Src/main.c **** { + 211:Core/Src/main.c **** + 212:Core/Src/main.c **** /* USER CODE BEGIN CAN_Init 0 */ + 213:Core/Src/main.c **** + 214:Core/Src/main.c **** /* USER CODE END CAN_Init 0 */ + 215:Core/Src/main.c **** + 216:Core/Src/main.c **** /* USER CODE BEGIN CAN_Init 1 */ + 217:Core/Src/main.c **** + 218:Core/Src/main.c **** /* USER CODE END CAN_Init 1 */ + 219:Core/Src/main.c **** hcan.Instance = CAN; + 220:Core/Src/main.c **** hcan.Init.Prescaler = 2; + 221:Core/Src/main.c **** hcan.Init.Mode = CAN_MODE_NORMAL; + 222:Core/Src/main.c **** hcan.Init.SyncJumpWidth = CAN_SJW_1TQ; + 223:Core/Src/main.c **** hcan.Init.TimeSeg1 = CAN_BS1_13TQ; + 224:Core/Src/main.c **** hcan.Init.TimeSeg2 = CAN_BS2_2TQ; + 225:Core/Src/main.c **** hcan.Init.TimeTriggeredMode = DISABLE; + 226:Core/Src/main.c **** hcan.Init.AutoBusOff = ENABLE; + 227:Core/Src/main.c **** hcan.Init.AutoWakeUp = DISABLE; + 228:Core/Src/main.c **** hcan.Init.AutoRetransmission = ENABLE; + 229:Core/Src/main.c **** hcan.Init.ReceiveFifoLocked = DISABLE; + 230:Core/Src/main.c **** hcan.Init.TransmitFifoPriority = DISABLE; + 231:Core/Src/main.c **** if (HAL_CAN_Init(&hcan) != HAL_OK) + 232:Core/Src/main.c **** { + 233:Core/Src/main.c **** Error_Handler(); + 234:Core/Src/main.c **** } + 235:Core/Src/main.c **** /* USER CODE BEGIN CAN_Init 2 */ + 236:Core/Src/main.c **** + 237:Core/Src/main.c **** /* USER CODE END CAN_Init 2 */ + 238:Core/Src/main.c **** + 239:Core/Src/main.c **** } + 240:Core/Src/main.c **** + 241:Core/Src/main.c **** /** + 242:Core/Src/main.c **** * @brief I2C1 Initialization Function + 243:Core/Src/main.c **** * @param None + 244:Core/Src/main.c **** * @retval None + 245:Core/Src/main.c **** */ + 246:Core/Src/main.c **** static void MX_I2C1_Init(void) + 247:Core/Src/main.c **** { + 248:Core/Src/main.c **** + 249:Core/Src/main.c **** /* USER CODE BEGIN I2C1_Init 0 */ + 250:Core/Src/main.c **** + 251:Core/Src/main.c **** /* USER CODE END I2C1_Init 0 */ + 252:Core/Src/main.c **** + 253:Core/Src/main.c **** /* USER CODE BEGIN I2C1_Init 1 */ + 254:Core/Src/main.c **** + 255:Core/Src/main.c **** /* USER CODE END I2C1_Init 1 */ + 256:Core/Src/main.c **** hi2c1.Instance = I2C1; + 257:Core/Src/main.c **** hi2c1.Init.Timing = 0x2000090E; + 258:Core/Src/main.c **** hi2c1.Init.OwnAddress1 = 0; + 259:Core/Src/main.c **** hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; + ARM GAS /tmp/cctSQMH6.s page 6 + + + 260:Core/Src/main.c **** hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; + 261:Core/Src/main.c **** hi2c1.Init.OwnAddress2 = 0; + 262:Core/Src/main.c **** hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK; + 263:Core/Src/main.c **** hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; + 264:Core/Src/main.c **** hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; + 265:Core/Src/main.c **** if (HAL_I2C_Init(&hi2c1) != HAL_OK) + 266:Core/Src/main.c **** { + 267:Core/Src/main.c **** Error_Handler(); + 268:Core/Src/main.c **** } + 269:Core/Src/main.c **** + 270:Core/Src/main.c **** /** Configure Analogue filter + 271:Core/Src/main.c **** */ + 272:Core/Src/main.c **** if (HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK) + 273:Core/Src/main.c **** { + 274:Core/Src/main.c **** Error_Handler(); + 275:Core/Src/main.c **** } + 276:Core/Src/main.c **** + 277:Core/Src/main.c **** /** Configure Digital filter + 278:Core/Src/main.c **** */ + 279:Core/Src/main.c **** if (HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0) != HAL_OK) + 280:Core/Src/main.c **** { + 281:Core/Src/main.c **** Error_Handler(); + 282:Core/Src/main.c **** } + 283:Core/Src/main.c **** /* USER CODE BEGIN I2C1_Init 2 */ + 284:Core/Src/main.c **** + 285:Core/Src/main.c **** /* USER CODE END I2C1_Init 2 */ + 286:Core/Src/main.c **** + 287:Core/Src/main.c **** } + 288:Core/Src/main.c **** + 289:Core/Src/main.c **** /** + 290:Core/Src/main.c **** * @brief I2C2 Initialization Function + 291:Core/Src/main.c **** * @param None + 292:Core/Src/main.c **** * @retval None + 293:Core/Src/main.c **** */ + 294:Core/Src/main.c **** static void MX_I2C2_Init(void) + 295:Core/Src/main.c **** { + 296:Core/Src/main.c **** + 297:Core/Src/main.c **** /* USER CODE BEGIN I2C2_Init 0 */ + 298:Core/Src/main.c **** + 299:Core/Src/main.c **** /* USER CODE END I2C2_Init 0 */ + 300:Core/Src/main.c **** + 301:Core/Src/main.c **** /* USER CODE BEGIN I2C2_Init 1 */ + 302:Core/Src/main.c **** + 303:Core/Src/main.c **** /* USER CODE END I2C2_Init 1 */ + 304:Core/Src/main.c **** hi2c2.Instance = I2C2; + 305:Core/Src/main.c **** hi2c2.Init.Timing = 0x2000090E; + 306:Core/Src/main.c **** hi2c2.Init.OwnAddress1 = 0; + 307:Core/Src/main.c **** hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; + 308:Core/Src/main.c **** hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; + 309:Core/Src/main.c **** hi2c2.Init.OwnAddress2 = 0; + 310:Core/Src/main.c **** hi2c2.Init.OwnAddress2Masks = I2C_OA2_NOMASK; + 311:Core/Src/main.c **** hi2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; + 312:Core/Src/main.c **** hi2c2.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; + 313:Core/Src/main.c **** if (HAL_I2C_Init(&hi2c2) != HAL_OK) + 314:Core/Src/main.c **** { + 315:Core/Src/main.c **** Error_Handler(); + 316:Core/Src/main.c **** } + ARM GAS /tmp/cctSQMH6.s page 7 + + + 317:Core/Src/main.c **** + 318:Core/Src/main.c **** /** Configure Analogue filter + 319:Core/Src/main.c **** */ + 320:Core/Src/main.c **** if (HAL_I2CEx_ConfigAnalogFilter(&hi2c2, I2C_ANALOGFILTER_ENABLE) != HAL_OK) + 321:Core/Src/main.c **** { + 322:Core/Src/main.c **** Error_Handler(); + 323:Core/Src/main.c **** } + 324:Core/Src/main.c **** + 325:Core/Src/main.c **** /** Configure Digital filter + 326:Core/Src/main.c **** */ + 327:Core/Src/main.c **** if (HAL_I2CEx_ConfigDigitalFilter(&hi2c2, 0) != HAL_OK) + 328:Core/Src/main.c **** { + 329:Core/Src/main.c **** Error_Handler(); + 330:Core/Src/main.c **** } + 331:Core/Src/main.c **** /* USER CODE BEGIN I2C2_Init 2 */ + 332:Core/Src/main.c **** + 333:Core/Src/main.c **** /* USER CODE END I2C2_Init 2 */ + 334:Core/Src/main.c **** + 335:Core/Src/main.c **** } + 336:Core/Src/main.c **** + 337:Core/Src/main.c **** /** + 338:Core/Src/main.c **** * @brief SPI1 Initialization Function + 339:Core/Src/main.c **** * @param None + 340:Core/Src/main.c **** * @retval None + 341:Core/Src/main.c **** */ + 342:Core/Src/main.c **** static void MX_SPI1_Init(void) + 343:Core/Src/main.c **** { + 344:Core/Src/main.c **** + 345:Core/Src/main.c **** /* USER CODE BEGIN SPI1_Init 0 */ + 346:Core/Src/main.c **** + 347:Core/Src/main.c **** /* USER CODE END SPI1_Init 0 */ + 348:Core/Src/main.c **** + 349:Core/Src/main.c **** /* USER CODE BEGIN SPI1_Init 1 */ + 350:Core/Src/main.c **** + 351:Core/Src/main.c **** /* USER CODE END SPI1_Init 1 */ + 352:Core/Src/main.c **** /* SPI1 parameter configuration*/ + 353:Core/Src/main.c **** hspi1.Instance = SPI1; + 354:Core/Src/main.c **** hspi1.Init.Mode = SPI_MODE_MASTER; + 355:Core/Src/main.c **** hspi1.Init.Direction = SPI_DIRECTION_2LINES; + 356:Core/Src/main.c **** hspi1.Init.DataSize = SPI_DATASIZE_8BIT; + 357:Core/Src/main.c **** hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; + 358:Core/Src/main.c **** hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; + 359:Core/Src/main.c **** hspi1.Init.NSS = SPI_NSS_SOFT; + 360:Core/Src/main.c **** hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32; + 361:Core/Src/main.c **** hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; + 362:Core/Src/main.c **** hspi1.Init.TIMode = SPI_TIMODE_DISABLE; + 363:Core/Src/main.c **** hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + 364:Core/Src/main.c **** hspi1.Init.CRCPolynomial = 7; + 365:Core/Src/main.c **** hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; + 366:Core/Src/main.c **** hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; + 367:Core/Src/main.c **** if (HAL_SPI_Init(&hspi1) != HAL_OK) + 368:Core/Src/main.c **** { + 369:Core/Src/main.c **** Error_Handler(); + 370:Core/Src/main.c **** } + 371:Core/Src/main.c **** /* USER CODE BEGIN SPI1_Init 2 */ + 372:Core/Src/main.c **** + 373:Core/Src/main.c **** /* USER CODE END SPI1_Init 2 */ + ARM GAS /tmp/cctSQMH6.s page 8 + + + 374:Core/Src/main.c **** + 375:Core/Src/main.c **** } + 376:Core/Src/main.c **** + 377:Core/Src/main.c **** /** + 378:Core/Src/main.c **** * @brief GPIO Initialization Function + 379:Core/Src/main.c **** * @param None + 380:Core/Src/main.c **** * @retval None + 381:Core/Src/main.c **** */ + 382:Core/Src/main.c **** static void MX_GPIO_Init(void) + 383:Core/Src/main.c **** { + 28 .loc 1 383 1 view -0 + 29 .cfi_startproc + 30 @ args = 0, pretend = 0, frame = 32 + 31 @ frame_needed = 0, uses_anonymous_args = 0 + 32 0000 70B5 push {r4, r5, r6, lr} + 33 .cfi_def_cfa_offset 16 + 34 .cfi_offset 4, -16 + 35 .cfi_offset 5, -12 + 36 .cfi_offset 6, -8 + 37 .cfi_offset 14, -4 + 38 0002 88B0 sub sp, sp, #32 + 39 .cfi_def_cfa_offset 48 + 384:Core/Src/main.c **** GPIO_InitTypeDef GPIO_InitStruct = {0}; + 40 .loc 1 384 3 view .LVU1 + 41 .loc 1 384 20 is_stmt 0 view .LVU2 + 42 0004 0024 movs r4, #0 + 43 0006 0394 str r4, [sp, #12] + 44 0008 0494 str r4, [sp, #16] + 45 000a 0594 str r4, [sp, #20] + 46 000c 0694 str r4, [sp, #24] + 47 000e 0794 str r4, [sp, #28] + 385:Core/Src/main.c **** + 386:Core/Src/main.c **** /* GPIO Ports Clock Enable */ + 387:Core/Src/main.c **** __HAL_RCC_GPIOF_CLK_ENABLE(); + 48 .loc 1 387 3 is_stmt 1 view .LVU3 + 49 .LBB4: + 50 .loc 1 387 3 view .LVU4 + 51 .loc 1 387 3 view .LVU5 + 52 0010 204B ldr r3, .L3 + 53 0012 5A69 ldr r2, [r3, #20] + 54 0014 42F48002 orr r2, r2, #4194304 + 55 0018 5A61 str r2, [r3, #20] + 56 .loc 1 387 3 view .LVU6 + 57 001a 5A69 ldr r2, [r3, #20] + 58 001c 02F48002 and r2, r2, #4194304 + 59 0020 0092 str r2, [sp] + 60 .loc 1 387 3 view .LVU7 + 61 0022 009A ldr r2, [sp] + 62 .LBE4: + 63 .loc 1 387 3 view .LVU8 + 388:Core/Src/main.c **** __HAL_RCC_GPIOA_CLK_ENABLE(); + 64 .loc 1 388 3 view .LVU9 + 65 .LBB5: + 66 .loc 1 388 3 view .LVU10 + 67 .loc 1 388 3 view .LVU11 + 68 0024 5A69 ldr r2, [r3, #20] + 69 0026 42F40032 orr r2, r2, #131072 + ARM GAS /tmp/cctSQMH6.s page 9 + + + 70 002a 5A61 str r2, [r3, #20] + 71 .loc 1 388 3 view .LVU12 + 72 002c 5A69 ldr r2, [r3, #20] + 73 002e 02F40032 and r2, r2, #131072 + 74 0032 0192 str r2, [sp, #4] + 75 .loc 1 388 3 view .LVU13 + 76 0034 019A ldr r2, [sp, #4] + 77 .LBE5: + 78 .loc 1 388 3 view .LVU14 + 389:Core/Src/main.c **** __HAL_RCC_GPIOB_CLK_ENABLE(); + 79 .loc 1 389 3 view .LVU15 + 80 .LBB6: + 81 .loc 1 389 3 view .LVU16 + 82 .loc 1 389 3 view .LVU17 + 83 0036 5A69 ldr r2, [r3, #20] + 84 0038 42F48022 orr r2, r2, #262144 + 85 003c 5A61 str r2, [r3, #20] + 86 .loc 1 389 3 view .LVU18 + 87 003e 5B69 ldr r3, [r3, #20] + 88 0040 03F48023 and r3, r3, #262144 + 89 0044 0293 str r3, [sp, #8] + 90 .loc 1 389 3 view .LVU19 + 91 0046 029B ldr r3, [sp, #8] + 92 .LBE6: + 93 .loc 1 389 3 view .LVU20 + 390:Core/Src/main.c **** + 391:Core/Src/main.c **** /*Configure GPIO pin Output Level */ + 392:Core/Src/main.c **** HAL_GPIO_WritePin(GPIOA, CSB_Pin|Status_3_Pin, GPIO_PIN_RESET); + 94 .loc 1 392 3 view .LVU21 + 95 0048 2246 mov r2, r4 + 96 004a 4FF48871 mov r1, #272 + 97 004e 4FF09040 mov r0, #1207959552 + 98 0052 FFF7FEFF bl HAL_GPIO_WritePin + 99 .LVL0: + 393:Core/Src/main.c **** + 394:Core/Src/main.c **** /*Configure GPIO pin Output Level */ + 395:Core/Src/main.c **** HAL_GPIO_WritePin(GPIOB, Status_0_Pin|Status_1_Pin|Status_2_Pin, GPIO_PIN_RESET); + 100 .loc 1 395 3 view .LVU22 + 101 0056 104D ldr r5, .L3+4 + 102 0058 2246 mov r2, r4 + 103 005a 4FF46041 mov r1, #57344 + 104 005e 2846 mov r0, r5 + 105 0060 FFF7FEFF bl HAL_GPIO_WritePin + 106 .LVL1: + 396:Core/Src/main.c **** + 397:Core/Src/main.c **** /*Configure GPIO pins : CSB_Pin Status_3_Pin */ + 398:Core/Src/main.c **** GPIO_InitStruct.Pin = CSB_Pin|Status_3_Pin; + 107 .loc 1 398 3 view .LVU23 + 108 .loc 1 398 23 is_stmt 0 view .LVU24 + 109 0064 4FF48873 mov r3, #272 + 110 0068 0393 str r3, [sp, #12] + 399:Core/Src/main.c **** GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + 111 .loc 1 399 3 is_stmt 1 view .LVU25 + 112 .loc 1 399 24 is_stmt 0 view .LVU26 + 113 006a 0126 movs r6, #1 + 114 006c 0496 str r6, [sp, #16] + 400:Core/Src/main.c **** GPIO_InitStruct.Pull = GPIO_NOPULL; + ARM GAS /tmp/cctSQMH6.s page 10 + + + 115 .loc 1 400 3 is_stmt 1 view .LVU27 + 116 .loc 1 400 24 is_stmt 0 view .LVU28 + 117 006e 0594 str r4, [sp, #20] + 401:Core/Src/main.c **** GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + 118 .loc 1 401 3 is_stmt 1 view .LVU29 + 119 .loc 1 401 25 is_stmt 0 view .LVU30 + 120 0070 0694 str r4, [sp, #24] + 402:Core/Src/main.c **** HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + 121 .loc 1 402 3 is_stmt 1 view .LVU31 + 122 0072 03A9 add r1, sp, #12 + 123 0074 4FF09040 mov r0, #1207959552 + 124 0078 FFF7FEFF bl HAL_GPIO_Init + 125 .LVL2: + 403:Core/Src/main.c **** + 404:Core/Src/main.c **** /*Configure GPIO pins : Status_0_Pin Status_1_Pin Status_2_Pin */ + 405:Core/Src/main.c **** GPIO_InitStruct.Pin = Status_0_Pin|Status_1_Pin|Status_2_Pin; + 126 .loc 1 405 3 view .LVU32 + 127 .loc 1 405 23 is_stmt 0 view .LVU33 + 128 007c 4FF46043 mov r3, #57344 + 129 0080 0393 str r3, [sp, #12] + 406:Core/Src/main.c **** GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + 130 .loc 1 406 3 is_stmt 1 view .LVU34 + 131 .loc 1 406 24 is_stmt 0 view .LVU35 + 132 0082 0496 str r6, [sp, #16] + 407:Core/Src/main.c **** GPIO_InitStruct.Pull = GPIO_NOPULL; + 133 .loc 1 407 3 is_stmt 1 view .LVU36 + 134 .loc 1 407 24 is_stmt 0 view .LVU37 + 135 0084 0594 str r4, [sp, #20] + 408:Core/Src/main.c **** GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + 136 .loc 1 408 3 is_stmt 1 view .LVU38 + 137 .loc 1 408 25 is_stmt 0 view .LVU39 + 138 0086 0694 str r4, [sp, #24] + 409:Core/Src/main.c **** HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + 139 .loc 1 409 3 is_stmt 1 view .LVU40 + 140 0088 03A9 add r1, sp, #12 + 141 008a 2846 mov r0, r5 + 142 008c FFF7FEFF bl HAL_GPIO_Init + 143 .LVL3: + 410:Core/Src/main.c **** + 411:Core/Src/main.c **** } + 144 .loc 1 411 1 is_stmt 0 view .LVU41 + 145 0090 08B0 add sp, sp, #32 + 146 .cfi_def_cfa_offset 16 + 147 @ sp needed + 148 0092 70BD pop {r4, r5, r6, pc} + 149 .L4: + 150 .align 2 + 151 .L3: + 152 0094 00100240 .word 1073876992 + 153 0098 00040048 .word 1207960576 + 154 .cfi_endproc + 155 .LFE136: + 157 .section .text.sensor_init,"ax",%progbits + 158 .align 1 + 159 .global sensor_init + 160 .syntax unified + 161 .thumb + ARM GAS /tmp/cctSQMH6.s page 11 + + + 162 .thumb_func + 164 sensor_init: + 165 .LVL4: + 166 .LFB137: + 412:Core/Src/main.c **** + 413:Core/Src/main.c **** /* USER CODE BEGIN 4 */ + 414:Core/Src/main.c **** HAL_StatusTypeDef sensor_init(int n) { + 167 .loc 1 414 38 is_stmt 1 view -0 + 168 .cfi_startproc + 169 @ args = 0, pretend = 0, frame = 8 + 170 @ frame_needed = 0, uses_anonymous_args = 0 + 171 .loc 1 414 38 is_stmt 0 view .LVU43 + 172 0000 00B5 push {lr} + 173 .cfi_def_cfa_offset 4 + 174 .cfi_offset 14, -4 + 175 0002 85B0 sub sp, sp, #20 + 176 .cfi_def_cfa_offset 24 + 415:Core/Src/main.c **** uint16_t addr = (0b1000000 | n) << 1; + 177 .loc 1 415 3 is_stmt 1 view .LVU44 + 178 .loc 1 415 35 is_stmt 0 view .LVU45 + 179 0004 4100 lsls r1, r0, #1 + 180 0006 41F08001 orr r1, r1, #128 + 181 000a 09B2 sxth r1, r1 + 182 .loc 1 415 12 view .LVU46 + 183 000c 89B2 uxth r1, r1 + 184 .LVL5: + 416:Core/Src/main.c **** uint8_t data[] = {0}; + 185 .loc 1 416 3 is_stmt 1 view .LVU47 + 186 .loc 1 416 11 is_stmt 0 view .LVU48 + 187 000e 0023 movs r3, #0 + 188 0010 8DF80C30 strb r3, [sp, #12] + 417:Core/Src/main.c **** return HAL_I2C_Master_Transmit(&hi2c1, addr, data, sizeof(data), 100); + 189 .loc 1 417 3 is_stmt 1 view .LVU49 + 190 .loc 1 417 10 is_stmt 0 view .LVU50 + 191 0014 6423 movs r3, #100 + 192 0016 0093 str r3, [sp] + 193 0018 0123 movs r3, #1 + 194 001a 03AA add r2, sp, #12 + 195 001c 0248 ldr r0, .L7 + 196 .LVL6: + 197 .loc 1 417 10 view .LVU51 + 198 001e FFF7FEFF bl HAL_I2C_Master_Transmit + 199 .LVL7: + 418:Core/Src/main.c **** } + 200 .loc 1 418 1 view .LVU52 + 201 0022 05B0 add sp, sp, #20 + 202 .cfi_def_cfa_offset 4 + 203 @ sp needed + 204 0024 5DF804FB ldr pc, [sp], #4 + 205 .L8: + 206 .align 2 + 207 .L7: + 208 0028 00000000 .word hi2c1 + 209 .cfi_endproc + 210 .LFE137: + 212 .section .text.sensor_read,"ax",%progbits + 213 .align 1 + ARM GAS /tmp/cctSQMH6.s page 12 + + + 214 .global sensor_read + 215 .syntax unified + 216 .thumb + 217 .thumb_func + 219 sensor_read: + 220 .LVL8: + 221 .LFB138: + 419:Core/Src/main.c **** + 420:Core/Src/main.c **** HAL_StatusTypeDef sensor_read(int n, uint16_t *res) { + 222 .loc 1 420 53 is_stmt 1 view -0 + 223 .cfi_startproc + 224 @ args = 0, pretend = 0, frame = 8 + 225 @ frame_needed = 0, uses_anonymous_args = 0 + 226 .loc 1 420 53 is_stmt 0 view .LVU54 + 227 0000 10B5 push {r4, lr} + 228 .cfi_def_cfa_offset 8 + 229 .cfi_offset 4, -8 + 230 .cfi_offset 14, -4 + 231 0002 84B0 sub sp, sp, #16 + 232 .cfi_def_cfa_offset 24 + 233 0004 0C46 mov r4, r1 + 421:Core/Src/main.c **** uint16_t addr = (0b1000000 | n) << 1; + 234 .loc 1 421 3 is_stmt 1 view .LVU55 + 235 .loc 1 421 35 is_stmt 0 view .LVU56 + 236 0006 4000 lsls r0, r0, #1 + 237 .LVL9: + 238 .loc 1 421 35 view .LVU57 + 239 0008 00B2 sxth r0, r0 + 240 .LVL10: + 422:Core/Src/main.c **** addr |= 1; // Read + 241 .loc 1 422 3 is_stmt 1 view .LVU58 + 242 .loc 1 422 8 is_stmt 0 view .LVU59 + 243 000a 40F08100 orr r0, r0, #129 + 244 .LVL11: + 423:Core/Src/main.c **** uint8_t result[2]; + 245 .loc 1 423 3 is_stmt 1 view .LVU60 + 424:Core/Src/main.c **** HAL_StatusTypeDef status = + 246 .loc 1 424 3 view .LVU61 + 425:Core/Src/main.c **** HAL_I2C_Master_Receive(&hi2c1, addr, result, sizeof(result), 100); + 247 .loc 1 425 7 is_stmt 0 view .LVU62 + 248 000e 6423 movs r3, #100 + 249 0010 0093 str r3, [sp] + 250 0012 0223 movs r3, #2 + 251 0014 03AA add r2, sp, #12 + 252 0016 81B2 uxth r1, r0 + 253 .LVL12: + 254 .loc 1 425 7 view .LVU63 + 255 0018 0648 ldr r0, .L12 + 256 .LVL13: + 257 .loc 1 425 7 view .LVU64 + 258 001a FFF7FEFF bl HAL_I2C_Master_Receive + 259 .LVL14: + 426:Core/Src/main.c **** if (status == HAL_OK) { + 260 .loc 1 426 3 is_stmt 1 view .LVU65 + 261 .loc 1 426 6 is_stmt 0 view .LVU66 + 262 001e 30B9 cbnz r0, .L10 + 427:Core/Src/main.c **** *res = (result[0] << 8) | result[1]; + ARM GAS /tmp/cctSQMH6.s page 13 + + + 263 .loc 1 427 5 is_stmt 1 view .LVU67 + 264 .loc 1 427 19 is_stmt 0 view .LVU68 + 265 0020 9DF80C20 ldrb r2, [sp, #12] @ zero_extendqisi2 + 266 .loc 1 427 37 view .LVU69 + 267 0024 9DF80D30 ldrb r3, [sp, #13] @ zero_extendqisi2 + 268 .loc 1 427 29 view .LVU70 + 269 0028 43EA0223 orr r3, r3, r2, lsl #8 + 270 .loc 1 427 10 view .LVU71 + 271 002c 2380 strh r3, [r4] @ movhi + 272 .L10: + 428:Core/Src/main.c **** } + 429:Core/Src/main.c **** return status; + 273 .loc 1 429 3 is_stmt 1 view .LVU72 + 430:Core/Src/main.c **** } + 274 .loc 1 430 1 is_stmt 0 view .LVU73 + 275 002e 04B0 add sp, sp, #16 + 276 .cfi_def_cfa_offset 8 + 277 @ sp needed + 278 0030 10BD pop {r4, pc} + 279 .LVL15: + 280 .L13: + 281 .loc 1 430 1 view .LVU74 + 282 0032 00BF .align 2 + 283 .L12: + 284 0034 00000000 .word hi2c1 + 285 .cfi_endproc + 286 .LFE138: + 288 .section .text.readeeprom,"ax",%progbits + 289 .align 1 + 290 .global readeeprom + 291 .syntax unified + 292 .thumb + 293 .thumb_func + 295 readeeprom: + 296 .LVL16: + 297 .LFB139: + 431:Core/Src/main.c **** + 432:Core/Src/main.c **** uint8_t readeeprom(uint16_t address){ + 298 .loc 1 432 37 is_stmt 1 view -0 + 299 .cfi_startproc + 300 @ args = 0, pretend = 0, frame = 8 + 301 @ frame_needed = 0, uses_anonymous_args = 0 + 302 .loc 1 432 37 is_stmt 0 view .LVU76 + 303 0000 00B5 push {lr} + 304 .cfi_def_cfa_offset 4 + 305 .cfi_offset 14, -4 + 306 0002 87B0 sub sp, sp, #28 + 307 .cfi_def_cfa_offset 32 + 308 0004 0246 mov r2, r0 + 433:Core/Src/main.c **** uint8_t data = 0; + 309 .loc 1 433 2 is_stmt 1 view .LVU77 + 310 .loc 1 433 10 is_stmt 0 view .LVU78 + 311 0006 0023 movs r3, #0 + 312 0008 8DF81730 strb r3, [sp, #23] + 434:Core/Src/main.c **** //uint8_t* address2 = (uint8_t*) &address; + 435:Core/Src/main.c **** //HAL_I2C_Master_Transmit(&hi2c2, 0xA0, address2, 2, 1000); + 436:Core/Src/main.c **** //HAL_I2C_Master_Receive(&hi2c2, 0xA0, &data, 1, 1000); + ARM GAS /tmp/cctSQMH6.s page 14 + + + 437:Core/Src/main.c **** HAL_I2C_Mem_Read(&hi2c2, 0xA0, address, 2, &data, 1 , 1000); + 313 .loc 1 437 2 is_stmt 1 view .LVU79 + 314 000c 4FF47A73 mov r3, #1000 + 315 0010 0293 str r3, [sp, #8] + 316 0012 0123 movs r3, #1 + 317 0014 0193 str r3, [sp, #4] + 318 0016 0DF11703 add r3, sp, #23 + 319 001a 0093 str r3, [sp] + 320 001c 0223 movs r3, #2 + 321 001e A021 movs r1, #160 + 322 0020 0348 ldr r0, .L16 + 323 .LVL17: + 324 .loc 1 437 2 is_stmt 0 view .LVU80 + 325 0022 FFF7FEFF bl HAL_I2C_Mem_Read + 326 .LVL18: + 438:Core/Src/main.c **** //HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, + 439:Core/Src/main.c **** // uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t + 440:Core/Src/main.c **** return data; + 327 .loc 1 440 2 is_stmt 1 view .LVU81 + 441:Core/Src/main.c **** } + 328 .loc 1 441 1 is_stmt 0 view .LVU82 + 329 0026 9DF81700 ldrb r0, [sp, #23] @ zero_extendqisi2 + 330 002a 07B0 add sp, sp, #28 + 331 .cfi_def_cfa_offset 4 + 332 @ sp needed + 333 002c 5DF804FB ldr pc, [sp], #4 + 334 .L17: + 335 .align 2 + 336 .L16: + 337 0030 00000000 .word hi2c2 + 338 .cfi_endproc + 339 .LFE139: + 341 .section .text.writeeeprom,"ax",%progbits + 342 .align 1 + 343 .global writeeeprom + 344 .syntax unified + 345 .thumb + 346 .thumb_func + 348 writeeeprom: + 349 .LVL19: + 350 .LFB140: + 442:Core/Src/main.c **** + 443:Core/Src/main.c **** void writeeeprom(uint16_t address, uint8_t data){ + 351 .loc 1 443 49 is_stmt 1 view -0 + 352 .cfi_startproc + 353 @ args = 0, pretend = 0, frame = 8 + 354 @ frame_needed = 0, uses_anonymous_args = 0 + 355 .loc 1 443 49 is_stmt 0 view .LVU84 + 356 0000 00B5 push {lr} + 357 .cfi_def_cfa_offset 4 + 358 .cfi_offset 14, -4 + 359 0002 87B0 sub sp, sp, #28 + 360 .cfi_def_cfa_offset 32 + 361 0004 0246 mov r2, r0 + 362 0006 8DF81710 strb r1, [sp, #23] + 444:Core/Src/main.c **** HAL_I2C_Mem_Write(&hi2c2, 0xA0, address, 2, &data, 1, 1000); + 363 .loc 1 444 2 is_stmt 1 view .LVU85 + ARM GAS /tmp/cctSQMH6.s page 15 + + + 364 000a 4FF47A73 mov r3, #1000 + 365 000e 0293 str r3, [sp, #8] + 366 0010 0123 movs r3, #1 + 367 0012 0193 str r3, [sp, #4] + 368 0014 0DF11703 add r3, sp, #23 + 369 0018 0093 str r3, [sp] + 370 001a 0223 movs r3, #2 + 371 001c A021 movs r1, #160 + 372 .LVL20: + 373 .loc 1 444 2 is_stmt 0 view .LVU86 + 374 001e 0448 ldr r0, .L20 + 375 .LVL21: + 376 .loc 1 444 2 view .LVU87 + 377 0020 FFF7FEFF bl HAL_I2C_Mem_Write + 378 .LVL22: + 445:Core/Src/main.c **** HAL_Delay(5); + 379 .loc 1 445 2 is_stmt 1 view .LVU88 + 380 0024 0520 movs r0, #5 + 381 0026 FFF7FEFF bl HAL_Delay + 382 .LVL23: + 446:Core/Src/main.c **** } + 383 .loc 1 446 1 is_stmt 0 view .LVU89 + 384 002a 07B0 add sp, sp, #28 + 385 .cfi_def_cfa_offset 4 + 386 @ sp needed + 387 002c 5DF804FB ldr pc, [sp], #4 + 388 .L21: + 389 .align 2 + 390 .L20: + 391 0030 00000000 .word hi2c2 + 392 .cfi_endproc + 393 .LFE140: + 395 .section .text.Error_Handler,"ax",%progbits + 396 .align 1 + 397 .global Error_Handler + 398 .syntax unified + 399 .thumb + 400 .thumb_func + 402 Error_Handler: + 403 .LFB141: + 447:Core/Src/main.c **** /* USER CODE END 4 */ + 448:Core/Src/main.c **** + 449:Core/Src/main.c **** /** + 450:Core/Src/main.c **** * @brief This function is executed in case of error occurrence. + 451:Core/Src/main.c **** * @retval None + 452:Core/Src/main.c **** */ + 453:Core/Src/main.c **** void Error_Handler(void) + 454:Core/Src/main.c **** { + 404 .loc 1 454 1 is_stmt 1 view -0 + 405 .cfi_startproc + 406 @ Volatile: function does not return. + 407 @ args = 0, pretend = 0, frame = 0 + 408 @ frame_needed = 0, uses_anonymous_args = 0 + 409 @ link register save eliminated. + 455:Core/Src/main.c **** /* USER CODE BEGIN Error_Handler_Debug */ + 456:Core/Src/main.c **** /* User can add his own implementation to report the HAL error return state */ + 457:Core/Src/main.c **** __disable_irq(); + ARM GAS /tmp/cctSQMH6.s page 16 + + + 410 .loc 1 457 3 view .LVU91 + 411 .LBB7: + 412 .LBI7: + 413 .file 2 "Drivers/CMSIS/Include/cmsis_gcc.h" + 1:Drivers/CMSIS/Include/cmsis_gcc.h **** /**************************************************************************//** + 2:Drivers/CMSIS/Include/cmsis_gcc.h **** * @file cmsis_gcc.h + 3:Drivers/CMSIS/Include/cmsis_gcc.h **** * @brief CMSIS compiler GCC header file + 4:Drivers/CMSIS/Include/cmsis_gcc.h **** * @version V5.0.4 + 5:Drivers/CMSIS/Include/cmsis_gcc.h **** * @date 09. April 2018 + 6:Drivers/CMSIS/Include/cmsis_gcc.h **** ******************************************************************************/ + 7:Drivers/CMSIS/Include/cmsis_gcc.h **** /* + 8:Drivers/CMSIS/Include/cmsis_gcc.h **** * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + 9:Drivers/CMSIS/Include/cmsis_gcc.h **** * + 10:Drivers/CMSIS/Include/cmsis_gcc.h **** * SPDX-License-Identifier: Apache-2.0 + 11:Drivers/CMSIS/Include/cmsis_gcc.h **** * + 12:Drivers/CMSIS/Include/cmsis_gcc.h **** * Licensed under the Apache License, Version 2.0 (the License); you may + 13:Drivers/CMSIS/Include/cmsis_gcc.h **** * not use this file except in compliance with the License. + 14:Drivers/CMSIS/Include/cmsis_gcc.h **** * You may obtain a copy of the License at + 15:Drivers/CMSIS/Include/cmsis_gcc.h **** * + 16:Drivers/CMSIS/Include/cmsis_gcc.h **** * www.apache.org/licenses/LICENSE-2.0 + 17:Drivers/CMSIS/Include/cmsis_gcc.h **** * + 18:Drivers/CMSIS/Include/cmsis_gcc.h **** * Unless required by applicable law or agreed to in writing, software + 19:Drivers/CMSIS/Include/cmsis_gcc.h **** * distributed under the License is distributed on an AS IS BASIS, WITHOUT + 20:Drivers/CMSIS/Include/cmsis_gcc.h **** * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + 21:Drivers/CMSIS/Include/cmsis_gcc.h **** * See the License for the specific language governing permissions and + 22:Drivers/CMSIS/Include/cmsis_gcc.h **** * limitations under the License. + 23:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 24:Drivers/CMSIS/Include/cmsis_gcc.h **** + 25:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __CMSIS_GCC_H + 26:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __CMSIS_GCC_H + 27:Drivers/CMSIS/Include/cmsis_gcc.h **** + 28:Drivers/CMSIS/Include/cmsis_gcc.h **** /* ignore some GCC warnings */ + 29:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic push + 30:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wsign-conversion" + 31:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wconversion" + 32:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wunused-parameter" + 33:Drivers/CMSIS/Include/cmsis_gcc.h **** + 34:Drivers/CMSIS/Include/cmsis_gcc.h **** /* Fallback for __has_builtin */ + 35:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __has_builtin + 36:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __has_builtin(x) (0) + 37:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 38:Drivers/CMSIS/Include/cmsis_gcc.h **** + 39:Drivers/CMSIS/Include/cmsis_gcc.h **** /* CMSIS compiler specific defines */ + 40:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __ASM + 41:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __ASM __asm + 42:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 43:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __INLINE + 44:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __INLINE inline + 45:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 46:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __STATIC_INLINE + 47:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __STATIC_INLINE static inline + 48:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 49:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __STATIC_FORCEINLINE + 50:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __STATIC_FORCEINLINE __attribute__((always_inline)) static inline + 51:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 52:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __NO_RETURN + 53:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __NO_RETURN __attribute__((__noreturn__)) + ARM GAS /tmp/cctSQMH6.s page 17 + + + 54:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 55:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __USED + 56:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __USED __attribute__((used)) + 57:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 58:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __WEAK + 59:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __WEAK __attribute__((weak)) + 60:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 61:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __PACKED + 62:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __PACKED __attribute__((packed, aligned(1))) + 63:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 64:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __PACKED_STRUCT + 65:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) + 66:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 67:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __PACKED_UNION + 68:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __PACKED_UNION union __attribute__((packed, aligned(1))) + 69:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 70:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __UNALIGNED_UINT32 /* deprecated */ + 71:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic push + 72:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wpacked" + 73:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wattributes" + 74:Drivers/CMSIS/Include/cmsis_gcc.h **** struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + 75:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic pop + 76:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + 77:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 78:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __UNALIGNED_UINT16_WRITE + 79:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic push + 80:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wpacked" + 81:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wattributes" + 82:Drivers/CMSIS/Include/cmsis_gcc.h **** __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + 83:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic pop + 84:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))- + 85:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 86:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __UNALIGNED_UINT16_READ + 87:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic push + 88:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wpacked" + 89:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wattributes" + 90:Drivers/CMSIS/Include/cmsis_gcc.h **** __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + 91:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic pop + 92:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(add + 93:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 94:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __UNALIGNED_UINT32_WRITE + 95:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic push + 96:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wpacked" + 97:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wattributes" + 98:Drivers/CMSIS/Include/cmsis_gcc.h **** __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + 99:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic pop + 100:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))- + 101:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 102:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __UNALIGNED_UINT32_READ + 103:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic push + 104:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wpacked" + 105:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wattributes" + 106:Drivers/CMSIS/Include/cmsis_gcc.h **** __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + 107:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic pop + 108:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(add + 109:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 110:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __ALIGNED + ARM GAS /tmp/cctSQMH6.s page 18 + + + 111:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __ALIGNED(x) __attribute__((aligned(x))) + 112:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 113:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __RESTRICT + 114:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __RESTRICT __restrict + 115:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 116:Drivers/CMSIS/Include/cmsis_gcc.h **** + 117:Drivers/CMSIS/Include/cmsis_gcc.h **** + 118:Drivers/CMSIS/Include/cmsis_gcc.h **** /* ########################### Core Function Access ########################### */ + 119:Drivers/CMSIS/Include/cmsis_gcc.h **** /** \ingroup CMSIS_Core_FunctionInterface + 120:Drivers/CMSIS/Include/cmsis_gcc.h **** \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + 121:Drivers/CMSIS/Include/cmsis_gcc.h **** @{ + 122:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 123:Drivers/CMSIS/Include/cmsis_gcc.h **** + 124:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 125:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Enable IRQ Interrupts + 126:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + 127:Drivers/CMSIS/Include/cmsis_gcc.h **** Can only be executed in Privileged modes. + 128:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 129:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __enable_irq(void) + 130:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 131:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("cpsie i" : : : "memory"); + 132:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 133:Drivers/CMSIS/Include/cmsis_gcc.h **** + 134:Drivers/CMSIS/Include/cmsis_gcc.h **** + 135:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 136:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Disable IRQ Interrupts + 137:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Disables IRQ interrupts by setting the I-bit in the CPSR. + 138:Drivers/CMSIS/Include/cmsis_gcc.h **** Can only be executed in Privileged modes. + 139:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 140:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __disable_irq(void) + 414 .loc 2 140 27 view .LVU92 + 415 .LBB8: + 141:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 142:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("cpsid i" : : : "memory"); + 416 .loc 2 142 3 view .LVU93 + 417 .syntax unified + 418 @ 142 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 419 0000 72B6 cpsid i + 420 @ 0 "" 2 + 421 .thumb + 422 .syntax unified + 423 .L23: + 424 .LBE8: + 425 .LBE7: + 458:Core/Src/main.c **** while (1) + 426 .loc 1 458 3 discriminator 1 view .LVU94 + 459:Core/Src/main.c **** { + 460:Core/Src/main.c **** } + 427 .loc 1 460 3 discriminator 1 view .LVU95 + 458:Core/Src/main.c **** while (1) + 428 .loc 1 458 9 discriminator 1 view .LVU96 + 429 0002 FEE7 b .L23 + 430 .cfi_endproc + 431 .LFE141: + 433 .section .text.MX_CAN_Init,"ax",%progbits + 434 .align 1 + 435 .syntax unified + ARM GAS /tmp/cctSQMH6.s page 19 + + + 436 .thumb + 437 .thumb_func + 439 MX_CAN_Init: + 440 .LFB132: + 210:Core/Src/main.c **** + 441 .loc 1 210 1 view -0 + 442 .cfi_startproc + 443 @ args = 0, pretend = 0, frame = 0 + 444 @ frame_needed = 0, uses_anonymous_args = 0 + 445 0000 08B5 push {r3, lr} + 446 .cfi_def_cfa_offset 8 + 447 .cfi_offset 3, -8 + 448 .cfi_offset 14, -4 + 219:Core/Src/main.c **** hcan.Init.Prescaler = 2; + 449 .loc 1 219 3 view .LVU98 + 219:Core/Src/main.c **** hcan.Init.Prescaler = 2; + 450 .loc 1 219 17 is_stmt 0 view .LVU99 + 451 0002 0D48 ldr r0, .L28 + 452 0004 0D4B ldr r3, .L28+4 + 453 0006 0360 str r3, [r0] + 220:Core/Src/main.c **** hcan.Init.Mode = CAN_MODE_NORMAL; + 454 .loc 1 220 3 is_stmt 1 view .LVU100 + 220:Core/Src/main.c **** hcan.Init.Mode = CAN_MODE_NORMAL; + 455 .loc 1 220 23 is_stmt 0 view .LVU101 + 456 0008 0223 movs r3, #2 + 457 000a 4360 str r3, [r0, #4] + 221:Core/Src/main.c **** hcan.Init.SyncJumpWidth = CAN_SJW_1TQ; + 458 .loc 1 221 3 is_stmt 1 view .LVU102 + 221:Core/Src/main.c **** hcan.Init.SyncJumpWidth = CAN_SJW_1TQ; + 459 .loc 1 221 18 is_stmt 0 view .LVU103 + 460 000c 0023 movs r3, #0 + 461 000e 8360 str r3, [r0, #8] + 222:Core/Src/main.c **** hcan.Init.TimeSeg1 = CAN_BS1_13TQ; + 462 .loc 1 222 3 is_stmt 1 view .LVU104 + 222:Core/Src/main.c **** hcan.Init.TimeSeg1 = CAN_BS1_13TQ; + 463 .loc 1 222 27 is_stmt 0 view .LVU105 + 464 0010 C360 str r3, [r0, #12] + 223:Core/Src/main.c **** hcan.Init.TimeSeg2 = CAN_BS2_2TQ; + 465 .loc 1 223 3 is_stmt 1 view .LVU106 + 223:Core/Src/main.c **** hcan.Init.TimeSeg2 = CAN_BS2_2TQ; + 466 .loc 1 223 22 is_stmt 0 view .LVU107 + 467 0012 4FF44022 mov r2, #786432 + 468 0016 0261 str r2, [r0, #16] + 224:Core/Src/main.c **** hcan.Init.TimeTriggeredMode = DISABLE; + 469 .loc 1 224 3 is_stmt 1 view .LVU108 + 224:Core/Src/main.c **** hcan.Init.TimeTriggeredMode = DISABLE; + 470 .loc 1 224 22 is_stmt 0 view .LVU109 + 471 0018 4FF48012 mov r2, #1048576 + 472 001c 4261 str r2, [r0, #20] + 225:Core/Src/main.c **** hcan.Init.AutoBusOff = ENABLE; + 473 .loc 1 225 3 is_stmt 1 view .LVU110 + 225:Core/Src/main.c **** hcan.Init.AutoBusOff = ENABLE; + 474 .loc 1 225 31 is_stmt 0 view .LVU111 + 475 001e 0376 strb r3, [r0, #24] + 226:Core/Src/main.c **** hcan.Init.AutoWakeUp = DISABLE; + 476 .loc 1 226 3 is_stmt 1 view .LVU112 + 226:Core/Src/main.c **** hcan.Init.AutoWakeUp = DISABLE; + ARM GAS /tmp/cctSQMH6.s page 20 + + + 477 .loc 1 226 24 is_stmt 0 view .LVU113 + 478 0020 0122 movs r2, #1 + 479 0022 4276 strb r2, [r0, #25] + 227:Core/Src/main.c **** hcan.Init.AutoRetransmission = ENABLE; + 480 .loc 1 227 3 is_stmt 1 view .LVU114 + 227:Core/Src/main.c **** hcan.Init.AutoRetransmission = ENABLE; + 481 .loc 1 227 24 is_stmt 0 view .LVU115 + 482 0024 8376 strb r3, [r0, #26] + 228:Core/Src/main.c **** hcan.Init.ReceiveFifoLocked = DISABLE; + 483 .loc 1 228 3 is_stmt 1 view .LVU116 + 228:Core/Src/main.c **** hcan.Init.ReceiveFifoLocked = DISABLE; + 484 .loc 1 228 32 is_stmt 0 view .LVU117 + 485 0026 C276 strb r2, [r0, #27] + 229:Core/Src/main.c **** hcan.Init.TransmitFifoPriority = DISABLE; + 486 .loc 1 229 3 is_stmt 1 view .LVU118 + 229:Core/Src/main.c **** hcan.Init.TransmitFifoPriority = DISABLE; + 487 .loc 1 229 31 is_stmt 0 view .LVU119 + 488 0028 0377 strb r3, [r0, #28] + 230:Core/Src/main.c **** if (HAL_CAN_Init(&hcan) != HAL_OK) + 489 .loc 1 230 3 is_stmt 1 view .LVU120 + 230:Core/Src/main.c **** if (HAL_CAN_Init(&hcan) != HAL_OK) + 490 .loc 1 230 34 is_stmt 0 view .LVU121 + 491 002a 4377 strb r3, [r0, #29] + 231:Core/Src/main.c **** { + 492 .loc 1 231 3 is_stmt 1 view .LVU122 + 231:Core/Src/main.c **** { + 493 .loc 1 231 7 is_stmt 0 view .LVU123 + 494 002c FFF7FEFF bl HAL_CAN_Init + 495 .LVL24: + 231:Core/Src/main.c **** { + 496 .loc 1 231 6 view .LVU124 + 497 0030 00B9 cbnz r0, .L27 + 239:Core/Src/main.c **** + 498 .loc 1 239 1 view .LVU125 + 499 0032 08BD pop {r3, pc} + 500 .L27: + 233:Core/Src/main.c **** } + 501 .loc 1 233 5 is_stmt 1 view .LVU126 + 502 0034 FFF7FEFF bl Error_Handler + 503 .LVL25: + 504 .L29: + 505 .align 2 + 506 .L28: + 507 0038 00000000 .word hcan + 508 003c 00640040 .word 1073767424 + 509 .cfi_endproc + 510 .LFE132: + 512 .section .text.MX_I2C1_Init,"ax",%progbits + 513 .align 1 + 514 .syntax unified + 515 .thumb + 516 .thumb_func + 518 MX_I2C1_Init: + 519 .LFB133: + 247:Core/Src/main.c **** + 520 .loc 1 247 1 view -0 + 521 .cfi_startproc + ARM GAS /tmp/cctSQMH6.s page 21 + + + 522 @ args = 0, pretend = 0, frame = 0 + 523 @ frame_needed = 0, uses_anonymous_args = 0 + 524 0000 08B5 push {r3, lr} + 525 .cfi_def_cfa_offset 8 + 526 .cfi_offset 3, -8 + 527 .cfi_offset 14, -4 + 256:Core/Src/main.c **** hi2c1.Init.Timing = 0x2000090E; + 528 .loc 1 256 3 view .LVU128 + 256:Core/Src/main.c **** hi2c1.Init.Timing = 0x2000090E; + 529 .loc 1 256 18 is_stmt 0 view .LVU129 + 530 0002 1148 ldr r0, .L38 + 531 0004 114B ldr r3, .L38+4 + 532 0006 0360 str r3, [r0] + 257:Core/Src/main.c **** hi2c1.Init.OwnAddress1 = 0; + 533 .loc 1 257 3 is_stmt 1 view .LVU130 + 257:Core/Src/main.c **** hi2c1.Init.OwnAddress1 = 0; + 534 .loc 1 257 21 is_stmt 0 view .LVU131 + 535 0008 114B ldr r3, .L38+8 + 536 000a 4360 str r3, [r0, #4] + 258:Core/Src/main.c **** hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; + 537 .loc 1 258 3 is_stmt 1 view .LVU132 + 258:Core/Src/main.c **** hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; + 538 .loc 1 258 26 is_stmt 0 view .LVU133 + 539 000c 0023 movs r3, #0 + 540 000e 8360 str r3, [r0, #8] + 259:Core/Src/main.c **** hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; + 541 .loc 1 259 3 is_stmt 1 view .LVU134 + 259:Core/Src/main.c **** hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; + 542 .loc 1 259 29 is_stmt 0 view .LVU135 + 543 0010 0122 movs r2, #1 + 544 0012 C260 str r2, [r0, #12] + 260:Core/Src/main.c **** hi2c1.Init.OwnAddress2 = 0; + 545 .loc 1 260 3 is_stmt 1 view .LVU136 + 260:Core/Src/main.c **** hi2c1.Init.OwnAddress2 = 0; + 546 .loc 1 260 30 is_stmt 0 view .LVU137 + 547 0014 0361 str r3, [r0, #16] + 261:Core/Src/main.c **** hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK; + 548 .loc 1 261 3 is_stmt 1 view .LVU138 + 261:Core/Src/main.c **** hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK; + 549 .loc 1 261 26 is_stmt 0 view .LVU139 + 550 0016 4361 str r3, [r0, #20] + 262:Core/Src/main.c **** hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; + 551 .loc 1 262 3 is_stmt 1 view .LVU140 + 262:Core/Src/main.c **** hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; + 552 .loc 1 262 31 is_stmt 0 view .LVU141 + 553 0018 8361 str r3, [r0, #24] + 263:Core/Src/main.c **** hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; + 554 .loc 1 263 3 is_stmt 1 view .LVU142 + 263:Core/Src/main.c **** hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; + 555 .loc 1 263 30 is_stmt 0 view .LVU143 + 556 001a C361 str r3, [r0, #28] + 264:Core/Src/main.c **** if (HAL_I2C_Init(&hi2c1) != HAL_OK) + 557 .loc 1 264 3 is_stmt 1 view .LVU144 + 264:Core/Src/main.c **** if (HAL_I2C_Init(&hi2c1) != HAL_OK) + 558 .loc 1 264 28 is_stmt 0 view .LVU145 + 559 001c 0362 str r3, [r0, #32] + 265:Core/Src/main.c **** { + ARM GAS /tmp/cctSQMH6.s page 22 + + + 560 .loc 1 265 3 is_stmt 1 view .LVU146 + 265:Core/Src/main.c **** { + 561 .loc 1 265 7 is_stmt 0 view .LVU147 + 562 001e FFF7FEFF bl HAL_I2C_Init + 563 .LVL26: + 265:Core/Src/main.c **** { + 564 .loc 1 265 6 view .LVU148 + 565 0022 50B9 cbnz r0, .L35 + 272:Core/Src/main.c **** { + 566 .loc 1 272 3 is_stmt 1 view .LVU149 + 272:Core/Src/main.c **** { + 567 .loc 1 272 7 is_stmt 0 view .LVU150 + 568 0024 0021 movs r1, #0 + 569 0026 0848 ldr r0, .L38 + 570 0028 FFF7FEFF bl HAL_I2CEx_ConfigAnalogFilter + 571 .LVL27: + 272:Core/Src/main.c **** { + 572 .loc 1 272 6 view .LVU151 + 573 002c 38B9 cbnz r0, .L36 + 279:Core/Src/main.c **** { + 574 .loc 1 279 3 is_stmt 1 view .LVU152 + 279:Core/Src/main.c **** { + 575 .loc 1 279 7 is_stmt 0 view .LVU153 + 576 002e 0021 movs r1, #0 + 577 0030 0548 ldr r0, .L38 + 578 0032 FFF7FEFF bl HAL_I2CEx_ConfigDigitalFilter + 579 .LVL28: + 279:Core/Src/main.c **** { + 580 .loc 1 279 6 view .LVU154 + 581 0036 20B9 cbnz r0, .L37 + 287:Core/Src/main.c **** + 582 .loc 1 287 1 view .LVU155 + 583 0038 08BD pop {r3, pc} + 584 .L35: + 267:Core/Src/main.c **** } + 585 .loc 1 267 5 is_stmt 1 view .LVU156 + 586 003a FFF7FEFF bl Error_Handler + 587 .LVL29: + 588 .L36: + 274:Core/Src/main.c **** } + 589 .loc 1 274 5 view .LVU157 + 590 003e FFF7FEFF bl Error_Handler + 591 .LVL30: + 592 .L37: + 281:Core/Src/main.c **** } + 593 .loc 1 281 5 view .LVU158 + 594 0042 FFF7FEFF bl Error_Handler + 595 .LVL31: + 596 .L39: + 597 0046 00BF .align 2 + 598 .L38: + 599 0048 00000000 .word hi2c1 + 600 004c 00540040 .word 1073763328 + 601 0050 0E090020 .word 536873230 + 602 .cfi_endproc + 603 .LFE133: + 605 .section .text.MX_I2C2_Init,"ax",%progbits + ARM GAS /tmp/cctSQMH6.s page 23 + + + 606 .align 1 + 607 .syntax unified + 608 .thumb + 609 .thumb_func + 611 MX_I2C2_Init: + 612 .LFB134: + 295:Core/Src/main.c **** + 613 .loc 1 295 1 view -0 + 614 .cfi_startproc + 615 @ args = 0, pretend = 0, frame = 0 + 616 @ frame_needed = 0, uses_anonymous_args = 0 + 617 0000 08B5 push {r3, lr} + 618 .cfi_def_cfa_offset 8 + 619 .cfi_offset 3, -8 + 620 .cfi_offset 14, -4 + 304:Core/Src/main.c **** hi2c2.Init.Timing = 0x2000090E; + 621 .loc 1 304 3 view .LVU160 + 304:Core/Src/main.c **** hi2c2.Init.Timing = 0x2000090E; + 622 .loc 1 304 18 is_stmt 0 view .LVU161 + 623 0002 1148 ldr r0, .L48 + 624 0004 114B ldr r3, .L48+4 + 625 0006 0360 str r3, [r0] + 305:Core/Src/main.c **** hi2c2.Init.OwnAddress1 = 0; + 626 .loc 1 305 3 is_stmt 1 view .LVU162 + 305:Core/Src/main.c **** hi2c2.Init.OwnAddress1 = 0; + 627 .loc 1 305 21 is_stmt 0 view .LVU163 + 628 0008 114B ldr r3, .L48+8 + 629 000a 4360 str r3, [r0, #4] + 306:Core/Src/main.c **** hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; + 630 .loc 1 306 3 is_stmt 1 view .LVU164 + 306:Core/Src/main.c **** hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; + 631 .loc 1 306 26 is_stmt 0 view .LVU165 + 632 000c 0023 movs r3, #0 + 633 000e 8360 str r3, [r0, #8] + 307:Core/Src/main.c **** hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; + 634 .loc 1 307 3 is_stmt 1 view .LVU166 + 307:Core/Src/main.c **** hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; + 635 .loc 1 307 29 is_stmt 0 view .LVU167 + 636 0010 0122 movs r2, #1 + 637 0012 C260 str r2, [r0, #12] + 308:Core/Src/main.c **** hi2c2.Init.OwnAddress2 = 0; + 638 .loc 1 308 3 is_stmt 1 view .LVU168 + 308:Core/Src/main.c **** hi2c2.Init.OwnAddress2 = 0; + 639 .loc 1 308 30 is_stmt 0 view .LVU169 + 640 0014 0361 str r3, [r0, #16] + 309:Core/Src/main.c **** hi2c2.Init.OwnAddress2Masks = I2C_OA2_NOMASK; + 641 .loc 1 309 3 is_stmt 1 view .LVU170 + 309:Core/Src/main.c **** hi2c2.Init.OwnAddress2Masks = I2C_OA2_NOMASK; + 642 .loc 1 309 26 is_stmt 0 view .LVU171 + 643 0016 4361 str r3, [r0, #20] + 310:Core/Src/main.c **** hi2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; + 644 .loc 1 310 3 is_stmt 1 view .LVU172 + 310:Core/Src/main.c **** hi2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; + 645 .loc 1 310 31 is_stmt 0 view .LVU173 + 646 0018 8361 str r3, [r0, #24] + 311:Core/Src/main.c **** hi2c2.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; + 647 .loc 1 311 3 is_stmt 1 view .LVU174 + ARM GAS /tmp/cctSQMH6.s page 24 + + + 311:Core/Src/main.c **** hi2c2.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; + 648 .loc 1 311 30 is_stmt 0 view .LVU175 + 649 001a C361 str r3, [r0, #28] + 312:Core/Src/main.c **** if (HAL_I2C_Init(&hi2c2) != HAL_OK) + 650 .loc 1 312 3 is_stmt 1 view .LVU176 + 312:Core/Src/main.c **** if (HAL_I2C_Init(&hi2c2) != HAL_OK) + 651 .loc 1 312 28 is_stmt 0 view .LVU177 + 652 001c 0362 str r3, [r0, #32] + 313:Core/Src/main.c **** { + 653 .loc 1 313 3 is_stmt 1 view .LVU178 + 313:Core/Src/main.c **** { + 654 .loc 1 313 7 is_stmt 0 view .LVU179 + 655 001e FFF7FEFF bl HAL_I2C_Init + 656 .LVL32: + 313:Core/Src/main.c **** { + 657 .loc 1 313 6 view .LVU180 + 658 0022 50B9 cbnz r0, .L45 + 320:Core/Src/main.c **** { + 659 .loc 1 320 3 is_stmt 1 view .LVU181 + 320:Core/Src/main.c **** { + 660 .loc 1 320 7 is_stmt 0 view .LVU182 + 661 0024 0021 movs r1, #0 + 662 0026 0848 ldr r0, .L48 + 663 0028 FFF7FEFF bl HAL_I2CEx_ConfigAnalogFilter + 664 .LVL33: + 320:Core/Src/main.c **** { + 665 .loc 1 320 6 view .LVU183 + 666 002c 38B9 cbnz r0, .L46 + 327:Core/Src/main.c **** { + 667 .loc 1 327 3 is_stmt 1 view .LVU184 + 327:Core/Src/main.c **** { + 668 .loc 1 327 7 is_stmt 0 view .LVU185 + 669 002e 0021 movs r1, #0 + 670 0030 0548 ldr r0, .L48 + 671 0032 FFF7FEFF bl HAL_I2CEx_ConfigDigitalFilter + 672 .LVL34: + 327:Core/Src/main.c **** { + 673 .loc 1 327 6 view .LVU186 + 674 0036 20B9 cbnz r0, .L47 + 335:Core/Src/main.c **** + 675 .loc 1 335 1 view .LVU187 + 676 0038 08BD pop {r3, pc} + 677 .L45: + 315:Core/Src/main.c **** } + 678 .loc 1 315 5 is_stmt 1 view .LVU188 + 679 003a FFF7FEFF bl Error_Handler + 680 .LVL35: + 681 .L46: + 322:Core/Src/main.c **** } + 682 .loc 1 322 5 view .LVU189 + 683 003e FFF7FEFF bl Error_Handler + 684 .LVL36: + 685 .L47: + 329:Core/Src/main.c **** } + 686 .loc 1 329 5 view .LVU190 + 687 0042 FFF7FEFF bl Error_Handler + 688 .LVL37: + ARM GAS /tmp/cctSQMH6.s page 25 + + + 689 .L49: + 690 0046 00BF .align 2 + 691 .L48: + 692 0048 00000000 .word hi2c2 + 693 004c 00580040 .word 1073764352 + 694 0050 0E090020 .word 536873230 + 695 .cfi_endproc + 696 .LFE134: + 698 .section .text.MX_SPI1_Init,"ax",%progbits + 699 .align 1 + 700 .syntax unified + 701 .thumb + 702 .thumb_func + 704 MX_SPI1_Init: + 705 .LFB135: + 343:Core/Src/main.c **** + 706 .loc 1 343 1 view -0 + 707 .cfi_startproc + 708 @ args = 0, pretend = 0, frame = 0 + 709 @ frame_needed = 0, uses_anonymous_args = 0 + 710 0000 08B5 push {r3, lr} + 711 .cfi_def_cfa_offset 8 + 712 .cfi_offset 3, -8 + 713 .cfi_offset 14, -4 + 353:Core/Src/main.c **** hspi1.Init.Mode = SPI_MODE_MASTER; + 714 .loc 1 353 3 view .LVU192 + 353:Core/Src/main.c **** hspi1.Init.Mode = SPI_MODE_MASTER; + 715 .loc 1 353 18 is_stmt 0 view .LVU193 + 716 0002 1048 ldr r0, .L54 + 717 0004 104B ldr r3, .L54+4 + 718 0006 0360 str r3, [r0] + 354:Core/Src/main.c **** hspi1.Init.Direction = SPI_DIRECTION_2LINES; + 719 .loc 1 354 3 is_stmt 1 view .LVU194 + 354:Core/Src/main.c **** hspi1.Init.Direction = SPI_DIRECTION_2LINES; + 720 .loc 1 354 19 is_stmt 0 view .LVU195 + 721 0008 4FF48273 mov r3, #260 + 722 000c 4360 str r3, [r0, #4] + 355:Core/Src/main.c **** hspi1.Init.DataSize = SPI_DATASIZE_8BIT; + 723 .loc 1 355 3 is_stmt 1 view .LVU196 + 355:Core/Src/main.c **** hspi1.Init.DataSize = SPI_DATASIZE_8BIT; + 724 .loc 1 355 24 is_stmt 0 view .LVU197 + 725 000e 0023 movs r3, #0 + 726 0010 8360 str r3, [r0, #8] + 356:Core/Src/main.c **** hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; + 727 .loc 1 356 3 is_stmt 1 view .LVU198 + 356:Core/Src/main.c **** hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; + 728 .loc 1 356 23 is_stmt 0 view .LVU199 + 729 0012 4FF4E062 mov r2, #1792 + 730 0016 C260 str r2, [r0, #12] + 357:Core/Src/main.c **** hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; + 731 .loc 1 357 3 is_stmt 1 view .LVU200 + 357:Core/Src/main.c **** hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; + 732 .loc 1 357 26 is_stmt 0 view .LVU201 + 733 0018 0361 str r3, [r0, #16] + 358:Core/Src/main.c **** hspi1.Init.NSS = SPI_NSS_SOFT; + 734 .loc 1 358 3 is_stmt 1 view .LVU202 + 358:Core/Src/main.c **** hspi1.Init.NSS = SPI_NSS_SOFT; + ARM GAS /tmp/cctSQMH6.s page 26 + + + 735 .loc 1 358 23 is_stmt 0 view .LVU203 + 736 001a 4361 str r3, [r0, #20] + 359:Core/Src/main.c **** hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32; + 737 .loc 1 359 3 is_stmt 1 view .LVU204 + 359:Core/Src/main.c **** hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32; + 738 .loc 1 359 18 is_stmt 0 view .LVU205 + 739 001c 4FF40072 mov r2, #512 + 740 0020 8261 str r2, [r0, #24] + 360:Core/Src/main.c **** hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; + 741 .loc 1 360 3 is_stmt 1 view .LVU206 + 360:Core/Src/main.c **** hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; + 742 .loc 1 360 32 is_stmt 0 view .LVU207 + 743 0022 2022 movs r2, #32 + 744 0024 C261 str r2, [r0, #28] + 361:Core/Src/main.c **** hspi1.Init.TIMode = SPI_TIMODE_DISABLE; + 745 .loc 1 361 3 is_stmt 1 view .LVU208 + 361:Core/Src/main.c **** hspi1.Init.TIMode = SPI_TIMODE_DISABLE; + 746 .loc 1 361 23 is_stmt 0 view .LVU209 + 747 0026 0362 str r3, [r0, #32] + 362:Core/Src/main.c **** hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + 748 .loc 1 362 3 is_stmt 1 view .LVU210 + 362:Core/Src/main.c **** hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + 749 .loc 1 362 21 is_stmt 0 view .LVU211 + 750 0028 4362 str r3, [r0, #36] + 363:Core/Src/main.c **** hspi1.Init.CRCPolynomial = 7; + 751 .loc 1 363 3 is_stmt 1 view .LVU212 + 363:Core/Src/main.c **** hspi1.Init.CRCPolynomial = 7; + 752 .loc 1 363 29 is_stmt 0 view .LVU213 + 753 002a 8362 str r3, [r0, #40] + 364:Core/Src/main.c **** hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; + 754 .loc 1 364 3 is_stmt 1 view .LVU214 + 364:Core/Src/main.c **** hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; + 755 .loc 1 364 28 is_stmt 0 view .LVU215 + 756 002c 0722 movs r2, #7 + 757 002e C262 str r2, [r0, #44] + 365:Core/Src/main.c **** hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; + 758 .loc 1 365 3 is_stmt 1 view .LVU216 + 365:Core/Src/main.c **** hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; + 759 .loc 1 365 24 is_stmt 0 view .LVU217 + 760 0030 0363 str r3, [r0, #48] + 366:Core/Src/main.c **** if (HAL_SPI_Init(&hspi1) != HAL_OK) + 761 .loc 1 366 3 is_stmt 1 view .LVU218 + 366:Core/Src/main.c **** if (HAL_SPI_Init(&hspi1) != HAL_OK) + 762 .loc 1 366 23 is_stmt 0 view .LVU219 + 763 0032 0823 movs r3, #8 + 764 0034 4363 str r3, [r0, #52] + 367:Core/Src/main.c **** { + 765 .loc 1 367 3 is_stmt 1 view .LVU220 + 367:Core/Src/main.c **** { + 766 .loc 1 367 7 is_stmt 0 view .LVU221 + 767 0036 FFF7FEFF bl HAL_SPI_Init + 768 .LVL38: + 367:Core/Src/main.c **** { + 769 .loc 1 367 6 view .LVU222 + 770 003a 00B9 cbnz r0, .L53 + 375:Core/Src/main.c **** + 771 .loc 1 375 1 view .LVU223 + ARM GAS /tmp/cctSQMH6.s page 27 + + + 772 003c 08BD pop {r3, pc} + 773 .L53: + 369:Core/Src/main.c **** } + 774 .loc 1 369 5 is_stmt 1 view .LVU224 + 775 003e FFF7FEFF bl Error_Handler + 776 .LVL39: + 777 .L55: + 778 0042 00BF .align 2 + 779 .L54: + 780 0044 00000000 .word hspi1 + 781 0048 00300140 .word 1073819648 + 782 .cfi_endproc + 783 .LFE135: + 785 .section .text.SystemClock_Config,"ax",%progbits + 786 .align 1 + 787 .global SystemClock_Config + 788 .syntax unified + 789 .thumb + 790 .thumb_func + 792 SystemClock_Config: + 793 .LFB131: + 164:Core/Src/main.c **** RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + 794 .loc 1 164 1 view -0 + 795 .cfi_startproc + 796 @ args = 0, pretend = 0, frame = 112 + 797 @ frame_needed = 0, uses_anonymous_args = 0 + 798 0000 00B5 push {lr} + 799 .cfi_def_cfa_offset 4 + 800 .cfi_offset 14, -4 + 801 0002 9DB0 sub sp, sp, #116 + 802 .cfi_def_cfa_offset 120 + 165:Core/Src/main.c **** RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + 803 .loc 1 165 3 view .LVU226 + 165:Core/Src/main.c **** RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + 804 .loc 1 165 22 is_stmt 0 view .LVU227 + 805 0004 2822 movs r2, #40 + 806 0006 0021 movs r1, #0 + 807 0008 12A8 add r0, sp, #72 + 808 000a FFF7FEFF bl memset + 809 .LVL40: + 166:Core/Src/main.c **** RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; + 810 .loc 1 166 3 is_stmt 1 view .LVU228 + 166:Core/Src/main.c **** RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; + 811 .loc 1 166 22 is_stmt 0 view .LVU229 + 812 000e 0021 movs r1, #0 + 813 0010 0D91 str r1, [sp, #52] + 814 0012 0E91 str r1, [sp, #56] + 815 0014 0F91 str r1, [sp, #60] + 816 0016 1091 str r1, [sp, #64] + 817 0018 1191 str r1, [sp, #68] + 167:Core/Src/main.c **** + 818 .loc 1 167 3 is_stmt 1 view .LVU230 + 167:Core/Src/main.c **** + 819 .loc 1 167 28 is_stmt 0 view .LVU231 + 820 001a 3422 movs r2, #52 + 821 001c 6846 mov r0, sp + 822 001e FFF7FEFF bl memset + ARM GAS /tmp/cctSQMH6.s page 28 + + + 823 .LVL41: + 172:Core/Src/main.c **** RCC_OscInitStruct.HSEState = RCC_HSE_ON; + 824 .loc 1 172 3 is_stmt 1 view .LVU232 + 172:Core/Src/main.c **** RCC_OscInitStruct.HSEState = RCC_HSE_ON; + 825 .loc 1 172 36 is_stmt 0 view .LVU233 + 826 0022 0323 movs r3, #3 + 827 0024 1293 str r3, [sp, #72] + 173:Core/Src/main.c **** RCC_OscInitStruct.HSIState = RCC_HSI_ON; + 828 .loc 1 173 3 is_stmt 1 view .LVU234 + 173:Core/Src/main.c **** RCC_OscInitStruct.HSIState = RCC_HSI_ON; + 829 .loc 1 173 30 is_stmt 0 view .LVU235 + 830 0026 4FF48033 mov r3, #65536 + 831 002a 1393 str r3, [sp, #76] + 174:Core/Src/main.c **** RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + 832 .loc 1 174 3 is_stmt 1 view .LVU236 + 174:Core/Src/main.c **** RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + 833 .loc 1 174 30 is_stmt 0 view .LVU237 + 834 002c 0123 movs r3, #1 + 835 002e 1693 str r3, [sp, #88] + 175:Core/Src/main.c **** RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; + 836 .loc 1 175 3 is_stmt 1 view .LVU238 + 175:Core/Src/main.c **** RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; + 837 .loc 1 175 41 is_stmt 0 view .LVU239 + 838 0030 1023 movs r3, #16 + 839 0032 1793 str r3, [sp, #92] + 176:Core/Src/main.c **** if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + 840 .loc 1 176 3 is_stmt 1 view .LVU240 + 177:Core/Src/main.c **** { + 841 .loc 1 177 3 view .LVU241 + 177:Core/Src/main.c **** { + 842 .loc 1 177 7 is_stmt 0 view .LVU242 + 843 0034 12A8 add r0, sp, #72 + 844 0036 FFF7FEFF bl HAL_RCC_OscConfig + 845 .LVL42: + 177:Core/Src/main.c **** { + 846 .loc 1 177 6 view .LVU243 + 847 003a B8B9 cbnz r0, .L61 + 184:Core/Src/main.c **** |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + 848 .loc 1 184 3 is_stmt 1 view .LVU244 + 184:Core/Src/main.c **** |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + 849 .loc 1 184 31 is_stmt 0 view .LVU245 + 850 003c 0F23 movs r3, #15 + 851 003e 0D93 str r3, [sp, #52] + 186:Core/Src/main.c **** RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + 852 .loc 1 186 3 is_stmt 1 view .LVU246 + 186:Core/Src/main.c **** RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + 853 .loc 1 186 34 is_stmt 0 view .LVU247 + 854 0040 0123 movs r3, #1 + 855 0042 0E93 str r3, [sp, #56] + 187:Core/Src/main.c **** RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; + 856 .loc 1 187 3 is_stmt 1 view .LVU248 + 187:Core/Src/main.c **** RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; + 857 .loc 1 187 35 is_stmt 0 view .LVU249 + 858 0044 0021 movs r1, #0 + 859 0046 0F91 str r1, [sp, #60] + 188:Core/Src/main.c **** RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + 860 .loc 1 188 3 is_stmt 1 view .LVU250 + ARM GAS /tmp/cctSQMH6.s page 29 + + + 188:Core/Src/main.c **** RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + 861 .loc 1 188 36 is_stmt 0 view .LVU251 + 862 0048 1091 str r1, [sp, #64] + 189:Core/Src/main.c **** + 863 .loc 1 189 3 is_stmt 1 view .LVU252 + 189:Core/Src/main.c **** + 864 .loc 1 189 36 is_stmt 0 view .LVU253 + 865 004a 1191 str r1, [sp, #68] + 191:Core/Src/main.c **** { + 866 .loc 1 191 3 is_stmt 1 view .LVU254 + 191:Core/Src/main.c **** { + 867 .loc 1 191 7 is_stmt 0 view .LVU255 + 868 004c 0DA8 add r0, sp, #52 + 869 004e FFF7FEFF bl HAL_RCC_ClockConfig + 870 .LVL43: + 191:Core/Src/main.c **** { + 871 .loc 1 191 6 view .LVU256 + 872 0052 68B9 cbnz r0, .L62 + 195:Core/Src/main.c **** PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_HSI; + 873 .loc 1 195 3 is_stmt 1 view .LVU257 + 195:Core/Src/main.c **** PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_HSI; + 874 .loc 1 195 38 is_stmt 0 view .LVU258 + 875 0054 6023 movs r3, #96 + 876 0056 0093 str r3, [sp] + 196:Core/Src/main.c **** PeriphClkInit.I2c2ClockSelection = RCC_I2C2CLKSOURCE_HSI; + 877 .loc 1 196 3 is_stmt 1 view .LVU259 + 196:Core/Src/main.c **** PeriphClkInit.I2c2ClockSelection = RCC_I2C2CLKSOURCE_HSI; + 878 .loc 1 196 36 is_stmt 0 view .LVU260 + 879 0058 0023 movs r3, #0 + 880 005a 0793 str r3, [sp, #28] + 197:Core/Src/main.c **** if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) + 881 .loc 1 197 3 is_stmt 1 view .LVU261 + 197:Core/Src/main.c **** if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) + 882 .loc 1 197 36 is_stmt 0 view .LVU262 + 883 005c 0893 str r3, [sp, #32] + 198:Core/Src/main.c **** { + 884 .loc 1 198 3 is_stmt 1 view .LVU263 + 198:Core/Src/main.c **** { + 885 .loc 1 198 7 is_stmt 0 view .LVU264 + 886 005e 6846 mov r0, sp + 887 0060 FFF7FEFF bl HAL_RCCEx_PeriphCLKConfig + 888 .LVL44: + 198:Core/Src/main.c **** { + 889 .loc 1 198 6 view .LVU265 + 890 0064 30B9 cbnz r0, .L63 + 202:Core/Src/main.c **** + 891 .loc 1 202 1 view .LVU266 + 892 0066 1DB0 add sp, sp, #116 + 893 .cfi_remember_state + 894 .cfi_def_cfa_offset 4 + 895 @ sp needed + 896 0068 5DF804FB ldr pc, [sp], #4 + 897 .L61: + 898 .cfi_restore_state + 179:Core/Src/main.c **** } + 899 .loc 1 179 5 is_stmt 1 view .LVU267 + 900 006c FFF7FEFF bl Error_Handler + ARM GAS /tmp/cctSQMH6.s page 30 + + + 901 .LVL45: + 902 .L62: + 193:Core/Src/main.c **** } + 903 .loc 1 193 5 view .LVU268 + 904 0070 FFF7FEFF bl Error_Handler + 905 .LVL46: + 906 .L63: + 200:Core/Src/main.c **** } + 907 .loc 1 200 5 view .LVU269 + 908 0074 FFF7FEFF bl Error_Handler + 909 .LVL47: + 910 .cfi_endproc + 911 .LFE131: + 913 .section .text.main,"ax",%progbits + 914 .align 1 + 915 .global main + 916 .syntax unified + 917 .thumb + 918 .thumb_func + 920 main: + 921 .LFB130: + 89:Core/Src/main.c **** /* USER CODE BEGIN 1 */ + 922 .loc 1 89 1 view -0 + 923 .cfi_startproc + 924 @ args = 0, pretend = 0, frame = 24 + 925 @ frame_needed = 0, uses_anonymous_args = 0 + 926 0000 10B5 push {r4, lr} + 927 .cfi_def_cfa_offset 8 + 928 .cfi_offset 4, -8 + 929 .cfi_offset 14, -4 + 930 0002 86B0 sub sp, sp, #24 + 931 .cfi_def_cfa_offset 32 + 97:Core/Src/main.c **** + 932 .loc 1 97 3 view .LVU271 + 933 0004 FFF7FEFF bl HAL_Init + 934 .LVL48: + 104:Core/Src/main.c **** + 935 .loc 1 104 3 view .LVU272 + 936 0008 FFF7FEFF bl SystemClock_Config + 937 .LVL49: + 111:Core/Src/main.c **** MX_CAN_Init(); + 938 .loc 1 111 3 view .LVU273 + 939 000c FFF7FEFF bl MX_GPIO_Init + 940 .LVL50: + 112:Core/Src/main.c **** MX_I2C1_Init(); + 941 .loc 1 112 3 view .LVU274 + 942 0010 FFF7FEFF bl MX_CAN_Init + 943 .LVL51: + 113:Core/Src/main.c **** MX_I2C2_Init(); + 944 .loc 1 113 3 view .LVU275 + 945 0014 FFF7FEFF bl MX_I2C1_Init + 946 .LVL52: + 114:Core/Src/main.c **** MX_SPI1_Init(); + 947 .loc 1 114 3 view .LVU276 + 948 0018 FFF7FEFF bl MX_I2C2_Init + 949 .LVL53: + 115:Core/Src/main.c **** /* USER CODE BEGIN 2 */ + ARM GAS /tmp/cctSQMH6.s page 31 + + + 950 .loc 1 115 3 view .LVU277 + 951 001c FFF7FEFF bl MX_SPI1_Init + 952 .LVL54: + 118:Core/Src/main.c **** if (sensor_init(i) != HAL_OK) { + 953 .loc 1 118 3 view .LVU278 + 954 .LBB9: + 118:Core/Src/main.c **** if (sensor_init(i) != HAL_OK) { + 955 .loc 1 118 8 view .LVU279 + 118:Core/Src/main.c **** if (sensor_init(i) != HAL_OK) { + 956 .loc 1 118 12 is_stmt 0 view .LVU280 + 957 0020 0024 movs r4, #0 + 118:Core/Src/main.c **** if (sensor_init(i) != HAL_OK) { + 958 .loc 1 118 3 view .LVU281 + 959 0022 00E0 b .L65 + 960 .LVL55: + 961 .L66: + 118:Core/Src/main.c **** if (sensor_init(i) != HAL_OK) { + 962 .loc 1 118 35 is_stmt 1 discriminator 2 view .LVU282 + 963 0024 0134 adds r4, r4, #1 + 964 .LVL56: + 965 .L65: + 118:Core/Src/main.c **** if (sensor_init(i) != HAL_OK) { + 966 .loc 1 118 21 discriminator 1 view .LVU283 + 967 0026 0B2C cmp r4, #11 + 968 0028 09DC bgt .L73 + 119:Core/Src/main.c **** last_error = HAL_GetTick(); + 969 .loc 1 119 6 view .LVU284 + 119:Core/Src/main.c **** last_error = HAL_GetTick(); + 970 .loc 1 119 10 is_stmt 0 view .LVU285 + 971 002a 2046 mov r0, r4 + 972 002c FFF7FEFF bl sensor_init + 973 .LVL57: + 119:Core/Src/main.c **** last_error = HAL_GetTick(); + 974 .loc 1 119 9 view .LVU286 + 975 0030 0028 cmp r0, #0 + 976 0032 F7D0 beq .L66 + 120:Core/Src/main.c **** } + 977 .loc 1 120 8 is_stmt 1 view .LVU287 + 120:Core/Src/main.c **** } + 978 .loc 1 120 21 is_stmt 0 view .LVU288 + 979 0034 FFF7FEFF bl HAL_GetTick + 980 .LVL58: + 120:Core/Src/main.c **** } + 981 .loc 1 120 19 view .LVU289 + 982 0038 134B ldr r3, .L74 + 983 003a 1860 str r0, [r3] + 984 003c F2E7 b .L66 + 985 .L73: + 986 .LBE9: + 124:Core/Src/main.c **** ams_can_init(&hcan, &hcan); + 987 .loc 1 124 4 is_stmt 1 view .LVU290 + 988 003e 1348 ldr r0, .L74+4 + 989 0040 FFF7FEFF bl AMS_Init + 990 .LVL59: + 125:Core/Src/main.c **** //amsConfigAuxMeasurement(9); + 991 .loc 1 125 4 view .LVU291 + 992 0044 1248 ldr r0, .L74+8 + ARM GAS /tmp/cctSQMH6.s page 32 + + + 993 0046 0146 mov r1, r0 + 994 0048 FFF7FEFF bl ams_can_init + 995 .LVL60: + 135:Core/Src/main.c **** uint16_t temperatures[N_SENSORS]; + 996 .loc 1 135 4 view .LVU292 + 997 004c 4521 movs r1, #69 + 998 004e 0120 movs r0, #1 + 999 0050 FFF7FEFF bl writeeeprom + 1000 .LVL61: + 136:Core/Src/main.c **** AMS_Loop(); + 1001 .loc 1 136 4 view .LVU293 + 137:Core/Src/main.c **** while (1){ + 1002 .loc 1 137 4 view .LVU294 + 1003 0054 FFF7FEFF bl AMS_Loop + 1004 .LVL62: + 1005 .L71: + 138:Core/Src/main.c **** if(BMS_IN_TEST_MODE == 1 ){ ////&& PENDING_MESSAGE_HANDLE == 1 + 1006 .loc 1 138 4 view .LVU295 + 139:Core/Src/main.c **** testLoop(&canTestData); + 1007 .loc 1 139 5 view .LVU296 + 140:Core/Src/main.c **** /* USER CODE END WHILE */ + 1008 .loc 1 140 7 view .LVU297 + 1009 0058 0E48 ldr r0, .L74+12 + 1010 005a FFF7FEFF bl testLoop + 1011 .LVL63: + 144:Core/Src/main.c **** if (sensor_read(i, &temperatures[i]) != HAL_OK) { + 1012 .loc 1 144 4 view .LVU298 + 1013 .LBB10: + 144:Core/Src/main.c **** if (sensor_read(i, &temperatures[i]) != HAL_OK) { + 1014 .loc 1 144 9 view .LVU299 + 144:Core/Src/main.c **** if (sensor_read(i, &temperatures[i]) != HAL_OK) { + 1015 .loc 1 144 13 is_stmt 0 view .LVU300 + 1016 005e 0024 movs r4, #0 + 144:Core/Src/main.c **** if (sensor_read(i, &temperatures[i]) != HAL_OK) { + 1017 .loc 1 144 4 view .LVU301 + 1018 0060 00E0 b .L68 + 1019 .LVL64: + 1020 .L69: + 144:Core/Src/main.c **** if (sensor_read(i, &temperatures[i]) != HAL_OK) { + 1021 .loc 1 144 36 is_stmt 1 discriminator 2 view .LVU302 + 1022 0062 0134 adds r4, r4, #1 + 1023 .LVL65: + 1024 .L68: + 144:Core/Src/main.c **** if (sensor_read(i, &temperatures[i]) != HAL_OK) { + 1025 .loc 1 144 22 discriminator 1 view .LVU303 + 1026 0064 0B2C cmp r4, #11 + 1027 0066 F7DC bgt .L71 + 145:Core/Src/main.c **** sensor_init(i); + 1028 .loc 1 145 10 view .LVU304 + 145:Core/Src/main.c **** sensor_init(i); + 1029 .loc 1 145 14 is_stmt 0 view .LVU305 + 1030 0068 0DEB4401 add r1, sp, r4, lsl #1 + 1031 006c 2046 mov r0, r4 + 1032 006e FFF7FEFF bl sensor_read + 1033 .LVL66: + 145:Core/Src/main.c **** sensor_init(i); + 1034 .loc 1 145 13 view .LVU306 + ARM GAS /tmp/cctSQMH6.s page 33 + + + 1035 0072 0028 cmp r0, #0 + 1036 0074 F5D0 beq .L69 + 146:Core/Src/main.c **** last_error = HAL_GetTick(); + 1037 .loc 1 146 12 is_stmt 1 view .LVU307 + 1038 0076 2046 mov r0, r4 + 1039 0078 FFF7FEFF bl sensor_init + 1040 .LVL67: + 147:Core/Src/main.c **** } + 1041 .loc 1 147 12 view .LVU308 + 147:Core/Src/main.c **** } + 1042 .loc 1 147 25 is_stmt 0 view .LVU309 + 1043 007c FFF7FEFF bl HAL_GetTick + 1044 .LVL68: + 147:Core/Src/main.c **** } + 1045 .loc 1 147 23 view .LVU310 + 1046 0080 014B ldr r3, .L74 + 1047 0082 1860 str r0, [r3] + 1048 0084 EDE7 b .L69 + 1049 .L75: + 1050 0086 00BF .align 2 + 1051 .L74: + 1052 0088 00000000 .word last_error + 1053 008c 00000000 .word hspi1 + 1054 0090 00000000 .word hcan + 1055 0094 00000000 .word canTestData + 1056 .LBE10: + 1057 .cfi_endproc + 1058 .LFE130: + 1060 .section .bss.last_error,"aw",%nobits + 1061 .align 2 + 1064 last_error: + 1065 0000 00000000 .space 4 + 1066 .global hspi1 + 1067 .section .bss.hspi1,"aw",%nobits + 1068 .align 2 + 1071 hspi1: + 1072 0000 00000000 .space 100 + 1072 00000000 + 1072 00000000 + 1072 00000000 + 1072 00000000 + 1073 .global hi2c2 + 1074 .section .bss.hi2c2,"aw",%nobits + 1075 .align 2 + 1078 hi2c2: + 1079 0000 00000000 .space 76 + 1079 00000000 + 1079 00000000 + 1079 00000000 + 1079 00000000 + 1080 .global hi2c1 + 1081 .section .bss.hi2c1,"aw",%nobits + 1082 .align 2 + 1085 hi2c1: + 1086 0000 00000000 .space 76 + 1086 00000000 + 1086 00000000 + ARM GAS /tmp/cctSQMH6.s page 34 + + + 1086 00000000 + 1086 00000000 + 1087 .global hcan + 1088 .section .bss.hcan,"aw",%nobits + 1089 .align 2 + 1092 hcan: + 1093 0000 00000000 .space 40 + 1093 00000000 + 1093 00000000 + 1093 00000000 + 1093 00000000 + 1094 .text + 1095 .Letext0: + 1096 .file 3 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 1097 .file 4 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 1098 .file 5 "Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h" + 1099 .file 6 "Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h" + 1100 .file 7 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h" + 1101 .file 8 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h" + 1102 .file 9 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h" + 1103 .file 10 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h" + 1104 .file 11 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h" + 1105 .file 12 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h" + 1106 .file 13 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h" + 1107 .file 14 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h" + 1108 .file 15 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h" + 1109 .file 16 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h" + 1110 .file 17 "Core/Inc/Testbench.h" + 1111 .file 18 "Core/Inc/AMS_CAN.h" + 1112 .file 19 "Core/Inc/AMS_HighLevel.h" + 1113 .file 20 "" + ARM GAS /tmp/cctSQMH6.s page 35 + + +DEFINED SYMBOLS + *ABS*:0000000000000000 main.c + /tmp/cctSQMH6.s:21 .text.MX_GPIO_Init:0000000000000000 $t + /tmp/cctSQMH6.s:26 .text.MX_GPIO_Init:0000000000000000 MX_GPIO_Init + /tmp/cctSQMH6.s:152 .text.MX_GPIO_Init:0000000000000094 $d + /tmp/cctSQMH6.s:158 .text.sensor_init:0000000000000000 $t + /tmp/cctSQMH6.s:164 .text.sensor_init:0000000000000000 sensor_init + /tmp/cctSQMH6.s:208 .text.sensor_init:0000000000000028 $d + /tmp/cctSQMH6.s:1085 .bss.hi2c1:0000000000000000 hi2c1 + /tmp/cctSQMH6.s:213 .text.sensor_read:0000000000000000 $t + /tmp/cctSQMH6.s:219 .text.sensor_read:0000000000000000 sensor_read + /tmp/cctSQMH6.s:284 .text.sensor_read:0000000000000034 $d + /tmp/cctSQMH6.s:289 .text.readeeprom:0000000000000000 $t + /tmp/cctSQMH6.s:295 .text.readeeprom:0000000000000000 readeeprom + /tmp/cctSQMH6.s:337 .text.readeeprom:0000000000000030 $d + /tmp/cctSQMH6.s:1078 .bss.hi2c2:0000000000000000 hi2c2 + /tmp/cctSQMH6.s:342 .text.writeeeprom:0000000000000000 $t + /tmp/cctSQMH6.s:348 .text.writeeeprom:0000000000000000 writeeeprom + /tmp/cctSQMH6.s:391 .text.writeeeprom:0000000000000030 $d + /tmp/cctSQMH6.s:396 .text.Error_Handler:0000000000000000 $t + /tmp/cctSQMH6.s:402 .text.Error_Handler:0000000000000000 Error_Handler + /tmp/cctSQMH6.s:434 .text.MX_CAN_Init:0000000000000000 $t + /tmp/cctSQMH6.s:439 .text.MX_CAN_Init:0000000000000000 MX_CAN_Init + /tmp/cctSQMH6.s:507 .text.MX_CAN_Init:0000000000000038 $d + /tmp/cctSQMH6.s:1092 .bss.hcan:0000000000000000 hcan + /tmp/cctSQMH6.s:513 .text.MX_I2C1_Init:0000000000000000 $t + /tmp/cctSQMH6.s:518 .text.MX_I2C1_Init:0000000000000000 MX_I2C1_Init + /tmp/cctSQMH6.s:599 .text.MX_I2C1_Init:0000000000000048 $d + /tmp/cctSQMH6.s:606 .text.MX_I2C2_Init:0000000000000000 $t + /tmp/cctSQMH6.s:611 .text.MX_I2C2_Init:0000000000000000 MX_I2C2_Init + /tmp/cctSQMH6.s:692 .text.MX_I2C2_Init:0000000000000048 $d + /tmp/cctSQMH6.s:699 .text.MX_SPI1_Init:0000000000000000 $t + /tmp/cctSQMH6.s:704 .text.MX_SPI1_Init:0000000000000000 MX_SPI1_Init + /tmp/cctSQMH6.s:780 .text.MX_SPI1_Init:0000000000000044 $d + /tmp/cctSQMH6.s:1071 .bss.hspi1:0000000000000000 hspi1 + /tmp/cctSQMH6.s:786 .text.SystemClock_Config:0000000000000000 $t + /tmp/cctSQMH6.s:792 .text.SystemClock_Config:0000000000000000 SystemClock_Config + /tmp/cctSQMH6.s:914 .text.main:0000000000000000 $t + /tmp/cctSQMH6.s:920 .text.main:0000000000000000 main + /tmp/cctSQMH6.s:1052 .text.main:0000000000000088 $d + /tmp/cctSQMH6.s:1064 .bss.last_error:0000000000000000 last_error + /tmp/cctSQMH6.s:1061 .bss.last_error:0000000000000000 $d + /tmp/cctSQMH6.s:1068 .bss.hspi1:0000000000000000 $d + /tmp/cctSQMH6.s:1075 .bss.hi2c2:0000000000000000 $d + /tmp/cctSQMH6.s:1082 .bss.hi2c1:0000000000000000 $d + /tmp/cctSQMH6.s:1089 .bss.hcan:0000000000000000 $d + +UNDEFINED SYMBOLS +HAL_GPIO_WritePin +HAL_GPIO_Init +HAL_I2C_Master_Transmit +HAL_I2C_Master_Receive +HAL_I2C_Mem_Read +HAL_I2C_Mem_Write +HAL_Delay +HAL_CAN_Init +HAL_I2C_Init + ARM GAS /tmp/cctSQMH6.s page 36 + + +HAL_I2CEx_ConfigAnalogFilter +HAL_I2CEx_ConfigDigitalFilter +HAL_SPI_Init +memset +HAL_RCC_OscConfig +HAL_RCC_ClockConfig +HAL_RCCEx_PeriphCLKConfig +HAL_Init +HAL_GetTick +AMS_Init +ams_can_init +AMS_Loop +testLoop +canTestData diff --git a/BMS_Testbench/BMS_Software_V1/build/main.o b/BMS_Testbench/BMS_Software_V1/build/main.o new file mode 100644 index 0000000000000000000000000000000000000000..ec5e118e253e562510788ff31ff1c656c288b311 GIT binary patch literal 25076 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 F{{rRO1g`)9 literal 0 HcmV?d00001 diff --git a/BMS_Testbench/BMS_Software_V1/build/startup_stm32f302xc.d b/BMS_Testbench/BMS_Software_V1/build/startup_stm32f302xc.d new file mode 100644 index 0000000..3a580d3 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/startup_stm32f302xc.d @@ -0,0 +1 @@ +build/startup_stm32f302xc.o: startup_stm32f302xc.s diff --git a/BMS_Testbench/BMS_Software_V1/build/startup_stm32f302xc.o b/BMS_Testbench/BMS_Software_V1/build/startup_stm32f302xc.o new file mode 100644 index 0000000000000000000000000000000000000000..b1279c7a3db1274b6878607aa41e81fdfd66d36b GIT binary patch literal 6292 zcmeHLZERat8Gd~ouOC~}cJ0=(F`A?)1ZbSt$-0$~5yws%w{hqCBMD{f_By^vtU7jN zJ6S97F^Op!+Jp+KL^Yu?q5T-pAN?^Tgen13kq}>+v10t|AvQS;n|+p&`@}1bjY&MjOYJX30WcVp{4q=J5+YoD&?U>CO_1yI&1D= z%WbwwZf$;PFg`Lgp2^zxBsX7sn zP#1GkdEdhlsXa{f;E-jh1_EFf%H5?bwpprsoaw1_=jt2uw2m=@Ldz4zB&~jazN~tvf+` zM7HS)q{(?`Z#6VTWEbAuEGmh}L%e<*{e-Qa5m|GdG!WbiM8vlkqbK8*j@4f{6@{vCr~HTaLg*&g%l zL%zQ>_&WyYLel-QNd)+P2Jba^+~5g=pE9^(@D+nUYw#Bh{#}Frz~DbO_}d1*WpHeg zf&T6>_+f)j82m|tKV|R>2LHCfUpM%5ga6UsTd*ad3;z5*VDLeMj~V>5!J7vEs=;3| z_-h8gX7K9ozQN2Gs1|K%~n89-fFB^Q#;LjWUWrKgu;6E|=uMK|F;I|FF z7h9a(zd?gf8r(McIfFlM@RtmJ#o(_S{4Imac)i}rB{I_AlIePVC0SoNpK@AGx>ji` zCM(tIX}3`?HJi#|vfgml@K-QhTd2UtwOLF0%d%*%EYxP)`BuHrl$5*RtX9|mX4=h4 z8Lf)lY=hfjY}I!84*rd`asF`T&r1G$v*j+UWNf=yDb3pqYCDaFb6%F6N=;5?(*9rO zDW_4M48+a2%NeKUEV{nW_-ZrgQf$H;ROM%qzJJOstuAKjHD8f+YvufmPmy7vGJn?R zv$LsVb~<;;J1t~qQaUXpGFdyX-kMXckhEt{6tlYL3k2Sx=v zkV`S2$Q1$}O0&@?kTC}mqZJFx0Y8F7)oCp2Sz^j&owIInMOPw;KyyXp5Eua}%*i-n zrxJlL0gE%f**f8xaJr|2x0MEDJJ)$mi+YgFF!MFE|#EFO6XH=_C5BOmI-g_DXK>%>K}S=vWL3Pk+CGDmz^{MOs7zJxBbc$mfWUi9AjGl*lv0F_Gtp36U3w<02P`Ns)`hl*lFGgvd9DlOit@ zaS?ijh~!@-rtzB)5f_jv#1kT~5vN7IPt1s1C7u-d5%F=6YeaPRr^HhtzaZvB-XP{h zt`iF)zabVy-X_k7+#up&^E=|4$nS}t#=PL5Vx7jk5I=)?AwGe5A%0e*hxjD!=0sa$ zfOrP;MRYJ<#1iI*IFI=umNC9W7voD@!1xkzk$Q%>)V^<8xK$r!9zaZ`Lf$Q{h)9Ka zPiOt$3ddWbg{$3e;{Bp798<)IN!>vYfr*BDAonWFox>2w^3WHR+=rC6S+*(X|)=a(kg!U zL3jUC!KW>lGBu8@Gm2*~3mvgK_#ki_p0N(UhymvuV5(I8F5p%?hdMkAq)fHJe=`;Z zTY>WbcYe%A&yVfl^YDdnDZ_a5{H`KD`Z7N(1GQfL0j3JL0v+eNgwiilqMJIRQPte*#^DTp9oX literal 0 HcmV?d00001 diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal.d b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal.d new file mode 100644 index 0000000..42d2e3e --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal.d @@ -0,0 +1,57 @@ +build/stm32f3xx_hal.o: Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h \ + Core/Inc/stm32f3xx_hal_conf.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h \ + Drivers/CMSIS/Include/core_cm4.h Drivers/CMSIS/Include/cmsis_version.h \ + Drivers/CMSIS/Include/cmsis_compiler.h Drivers/CMSIS/Include/cmsis_gcc.h \ + Drivers/CMSIS/Include/mpu_armv7.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h: +Core/Inc/stm32f3xx_hal_conf.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h: +Drivers/CMSIS/Include/core_cm4.h: +Drivers/CMSIS/Include/cmsis_version.h: +Drivers/CMSIS/Include/cmsis_compiler.h: +Drivers/CMSIS/Include/cmsis_gcc.h: +Drivers/CMSIS/Include/mpu_armv7.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h: +Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h: diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal.lst b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal.lst new file mode 100644 index 0000000..34e8c53 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal.lst @@ -0,0 +1,1527 @@ +ARM GAS /tmp/ccjtZjrH.s page 1 + + + 1 .cpu cortex-m4 + 2 .arch armv7e-m + 3 .fpu fpv4-sp-d16 + 4 .eabi_attribute 27, 1 + 5 .eabi_attribute 28, 1 + 6 .eabi_attribute 20, 1 + 7 .eabi_attribute 21, 1 + 8 .eabi_attribute 23, 3 + 9 .eabi_attribute 24, 1 + 10 .eabi_attribute 25, 1 + 11 .eabi_attribute 26, 1 + 12 .eabi_attribute 30, 1 + 13 .eabi_attribute 34, 1 + 14 .eabi_attribute 18, 4 + 15 .file "stm32f3xx_hal.c" + 16 .text + 17 .Ltext0: + 18 .cfi_sections .debug_frame + 19 .file 1 "Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c" + 20 .section .text.HAL_MspInit,"ax",%progbits + 21 .align 1 + 22 .weak HAL_MspInit + 23 .syntax unified + 24 .thumb + 25 .thumb_func + 27 HAL_MspInit: + 28 .LFB132: + 1:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /** + 2:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** ****************************************************************************** + 3:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @file stm32f3xx_hal.c + 4:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @author MCD Application Team + 5:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @brief HAL module driver. + 6:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * This is the common part of the HAL initialization + 7:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * + 8:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** @verbatim + 9:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** ============================================================================== + 10:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** ##### How to use this driver ##### + 11:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** ============================================================================== + 12:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** [..] + 13:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** The common HAL driver contains a set of generic and common APIs that can be + 14:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** used by the PPP peripheral drivers and the user to start using the HAL. + 15:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** [..] + 16:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** The HAL contains two APIs categories: + 17:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** (+) HAL Initialization and de-initialization functions + 18:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** (+) HAL Control functions + 19:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 20:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** @endverbatim + 21:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** ****************************************************************************** + 22:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @attention + 23:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * + 24:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** *

    © Copyright (c) 2016 STMicroelectronics. + 25:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * All rights reserved.

    + 26:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * + 27:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * This software component is licensed by ST under BSD 3-Clause license, + 28:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * the "License"; You may not use this file except in compliance with the + 29:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * License. You may obtain a copy of the License at: + 30:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * opensource.org/licenses/BSD-3-Clause + ARM GAS /tmp/ccjtZjrH.s page 2 + + + 31:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * + 32:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** ****************************************************************************** + 33:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** */ + 34:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 35:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /* Includes ------------------------------------------------------------------*/ + 36:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** #include "stm32f3xx_hal.h" + 37:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 38:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /** @addtogroup STM32F3xx_HAL_Driver + 39:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @{ + 40:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** */ + 41:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 42:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /** @defgroup HAL HAL + 43:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @brief HAL module driver. + 44:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @{ + 45:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** */ + 46:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 47:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** #ifdef HAL_MODULE_ENABLED + 48:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 49:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /* Private typedef -----------------------------------------------------------*/ + 50:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /* Private define ------------------------------------------------------------*/ + 51:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /** @defgroup HAL_Private Constants + 52:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @{ + 53:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** */ + 54:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /** + 55:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @brief STM32F3xx HAL Driver version number V1.5.6 + 56:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** */ + 57:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** #define __STM32F3xx_HAL_VERSION_MAIN (0x01U) /*!< [31:24] main version */ + 58:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** #define __STM32F3xx_HAL_VERSION_SUB1 (0x05U) /*!< [23:16] sub1 version */ + 59:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** #define __STM32F3xx_HAL_VERSION_SUB2 (0x06U) /*!< [15:8] sub2 version */ + 60:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** #define __STM32F3xx_HAL_VERSION_RC (0x00U) /*!< [7:0] release candidate */ + 61:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** #define __STM32F3xx_HAL_VERSION ((__STM32F3xx_HAL_VERSION_MAIN << 24U)\ + 62:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** |(__STM32F3xx_HAL_VERSION_SUB1 << 16U)\ + 63:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** |(__STM32F3xx_HAL_VERSION_SUB2 << 8U )\ + 64:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** |(__STM32F3xx_HAL_VERSION_RC)) + 65:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 66:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** #define IDCODE_DEVID_MASK (0x00000FFFU) + 67:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /** + 68:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @} + 69:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** */ + 70:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 71:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /* Private macro -------------------------------------------------------------*/ + 72:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /* Exported variables --------------------------------------------------------*/ + 73:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /** @defgroup HAL_Exported_Variables HAL Exported Variables + 74:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @{ + 75:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** */ + 76:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** __IO uint32_t uwTick; + 77:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** uint32_t uwTickPrio = (1UL << __NVIC_PRIO_BITS); /* Invalid PRIO */ + 78:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** HAL_TickFreqTypeDef uwTickFreq = HAL_TICK_FREQ_DEFAULT; /* 1KHz */ + 79:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /** + 80:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @} + 81:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** */ + 82:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /* Private function prototypes -----------------------------------------------*/ + 83:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /* Exported functions ---------------------------------------------------------*/ + 84:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 85:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /** @defgroup HAL_Exported_Functions HAL Exported Functions + 86:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @{ + 87:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** */ + ARM GAS /tmp/ccjtZjrH.s page 3 + + + 88:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 89:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /** @defgroup HAL_Exported_Functions_Group1 Initialization and de-initialization Functions + 90:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @brief Initialization and de-initialization functions + 91:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * + 92:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** @verbatim + 93:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** =============================================================================== + 94:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** ##### Initialization and de-initialization functions ##### + 95:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** =============================================================================== + 96:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** [..] This section provides functions allowing to: + 97:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** (+) Initializes the Flash interface, the NVIC allocation and initial clock + 98:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** configuration. It initializes the systick also when timeout is needed + 99:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** and the backup domain when enabled. + 100:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** (+) de-Initializes common part of the HAL. + 101:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** (+) Configure The time base source to have 1ms time base with a dedicated + 102:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** Tick interrupt priority. + 103:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** (++) SysTick timer is used by default as source of time base, but user + 104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** can eventually implement his proper time base source (a general purpose + 105:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** timer for example or other time source), keeping in mind that Time base + 106:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and + 107:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** handled in milliseconds basis. + 108:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** (++) Time base configuration function (HAL_InitTick ()) is called automatically + 109:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** at the beginning of the program after reset by HAL_Init() or at any time + 110:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** when clock is configured, by HAL_RCC_ClockConfig(). + 111:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** (++) Source of time base is configured to generate interrupts at regular + 112:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** time intervals. Care must be taken if HAL_Delay() is called from a + 113:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** peripheral ISR process, the Tick interrupt line must have higher priority + 114:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** (numerically lower) than the peripheral interrupt. Otherwise the caller + 115:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** ISR process will be blocked. + 116:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** (++) functions affecting time base configurations are declared as __Weak + 117:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** to make override possible in case of other implementations in user file. + 118:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 119:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** @endverbatim + 120:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @{ + 121:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** */ + 122:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /** + 124:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @brief This function configures the Flash prefetch, + 125:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * Configures time base source, NVIC and Low level hardware + 126:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @note This function is called at the beginning of program after reset and before + 127:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * the clock configuration + 128:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * + 129:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @note The Systick configuration is based on HSI clock, as HSI is the clock + 130:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * used after a system Reset and the NVIC configuration is set to Priority group 4 + 131:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * + 132:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @note The time base configuration is based on MSI clock when exting from Reset. + 133:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * Once done, time base tick start incrementing. + 134:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * In the default implementation,Systick is used as source of time base. + 135:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * The tick variable is incremented each 1ms in its ISR. + 136:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @retval HAL status + 137:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** */ + 138:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** HAL_StatusTypeDef HAL_Init(void) + 139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** { + 140:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /* Configure Flash prefetch */ + 141:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** #if (PREFETCH_ENABLE != 0U) + 142:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** __HAL_FLASH_PREFETCH_BUFFER_ENABLE(); + 143:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** #endif /* PREFETCH_ENABLE */ + 144:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + ARM GAS /tmp/ccjtZjrH.s page 4 + + + 145:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /* Set Interrupt Group Priority */ + 146:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4); + 147:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 148:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /* Enable systick and configure 1ms tick (default clock after Reset is HSI) */ + 149:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** HAL_InitTick(TICK_INT_PRIORITY); + 150:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 151:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /* Init the low level hardware */ + 152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** HAL_MspInit(); + 153:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 154:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /* Return function status */ + 155:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** return HAL_OK; + 156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** } + 157:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 158:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /** + 159:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @brief This function de-Initializes common part of the HAL and stops the systick. + 160:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @note This function is optional. + 161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @retval HAL status + 162:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** */ + 163:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** HAL_StatusTypeDef HAL_DeInit(void) + 164:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** { + 165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /* Reset of all peripherals */ + 166:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** __HAL_RCC_APB1_FORCE_RESET(); + 167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** __HAL_RCC_APB1_RELEASE_RESET(); + 168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 169:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** __HAL_RCC_APB2_FORCE_RESET(); + 170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** __HAL_RCC_APB2_RELEASE_RESET(); + 171:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** __HAL_RCC_AHB_FORCE_RESET(); + 173:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** __HAL_RCC_AHB_RELEASE_RESET(); + 174:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 175:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /* De-Init the low level hardware */ + 176:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** HAL_MspDeInit(); + 177:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 178:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /* Return function status */ + 179:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** return HAL_OK; + 180:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** } + 181:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /** + 183:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @brief Initialize the MSP. + 184:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @retval None + 185:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** */ + 186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** __weak void HAL_MspInit(void) + 187:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** { + 29 .loc 1 187 1 view -0 + 30 .cfi_startproc + 31 @ args = 0, pretend = 0, frame = 0 + 32 @ frame_needed = 0, uses_anonymous_args = 0 + 33 @ link register save eliminated. + 188:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /* NOTE : This function should not be modified, when the callback is needed, + 189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** the HAL_MspInit could be implemented in the user file + 190:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** */ + 191:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** } + 34 .loc 1 191 1 view .LVU1 + 35 0000 7047 bx lr + 36 .cfi_endproc + 37 .LFE132: + 39 .section .text.HAL_MspDeInit,"ax",%progbits + ARM GAS /tmp/ccjtZjrH.s page 5 + + + 40 .align 1 + 41 .weak HAL_MspDeInit + 42 .syntax unified + 43 .thumb + 44 .thumb_func + 46 HAL_MspDeInit: + 47 .LFB133: + 192:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 193:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /** + 194:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @brief DeInitialize the MSP. + 195:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @retval None + 196:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** */ + 197:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** __weak void HAL_MspDeInit(void) + 198:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** { + 48 .loc 1 198 1 view -0 + 49 .cfi_startproc + 50 @ args = 0, pretend = 0, frame = 0 + 51 @ frame_needed = 0, uses_anonymous_args = 0 + 52 @ link register save eliminated. + 199:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /* NOTE : This function should not be modified, when the callback is needed, + 200:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** the HAL_MspDeInit could be implemented in the user file + 201:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** */ + 202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** } + 53 .loc 1 202 1 view .LVU3 + 54 0000 7047 bx lr + 55 .cfi_endproc + 56 .LFE133: + 58 .section .text.HAL_DeInit,"ax",%progbits + 59 .align 1 + 60 .global HAL_DeInit + 61 .syntax unified + 62 .thumb + 63 .thumb_func + 65 HAL_DeInit: + 66 .LFB131: + 164:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /* Reset of all peripherals */ + 67 .loc 1 164 1 view -0 + 68 .cfi_startproc + 69 @ args = 0, pretend = 0, frame = 0 + 70 @ frame_needed = 0, uses_anonymous_args = 0 + 71 0000 10B5 push {r4, lr} + 72 .cfi_def_cfa_offset 8 + 73 .cfi_offset 4, -8 + 74 .cfi_offset 14, -4 + 166:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** __HAL_RCC_APB1_RELEASE_RESET(); + 75 .loc 1 166 3 view .LVU5 + 76 0002 074B ldr r3, .L5 + 77 0004 4FF0FF32 mov r2, #-1 + 78 0008 1A61 str r2, [r3, #16] + 167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 79 .loc 1 167 3 view .LVU6 + 80 000a 0024 movs r4, #0 + 81 000c 1C61 str r4, [r3, #16] + 169:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** __HAL_RCC_APB2_RELEASE_RESET(); + 82 .loc 1 169 3 view .LVU7 + 83 000e DA60 str r2, [r3, #12] + 170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + ARM GAS /tmp/ccjtZjrH.s page 6 + + + 84 .loc 1 170 3 view .LVU8 + 85 0010 DC60 str r4, [r3, #12] + 172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** __HAL_RCC_AHB_RELEASE_RESET(); + 86 .loc 1 172 3 view .LVU9 + 87 0012 9A62 str r2, [r3, #40] + 173:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 88 .loc 1 173 3 view .LVU10 + 89 0014 9C62 str r4, [r3, #40] + 176:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 90 .loc 1 176 3 view .LVU11 + 91 0016 FFF7FEFF bl HAL_MspDeInit + 92 .LVL0: + 179:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** } + 93 .loc 1 179 3 view .LVU12 + 180:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 94 .loc 1 180 1 is_stmt 0 view .LVU13 + 95 001a 2046 mov r0, r4 + 96 001c 10BD pop {r4, pc} + 97 .L6: + 98 001e 00BF .align 2 + 99 .L5: + 100 0020 00100240 .word 1073876992 + 101 .cfi_endproc + 102 .LFE131: + 104 .section .text.HAL_InitTick,"ax",%progbits + 105 .align 1 + 106 .weak HAL_InitTick + 107 .syntax unified + 108 .thumb + 109 .thumb_func + 111 HAL_InitTick: + 112 .LVL1: + 113 .LFB134: + 203:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 204:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /** + 205:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @brief This function configures the source of the time base. + 206:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * The time source is configured to have 1ms time base with a dedicated + 207:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * Tick interrupt priority. + 208:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @note This function is called automatically at the beginning of program after + 209:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * reset by HAL_Init() or at any time when clock is reconfigured by HAL_RCC_ClockConfig() + 210:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @note In the default implementation , SysTick timer is the source of time base. + 211:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * It is used to generate interrupts at regular time intervals. + 212:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * Care must be taken if HAL_Delay() is called from a peripheral ISR process, + 213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * The SysTick interrupt must have higher priority (numerically lower) + 214:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * than the peripheral interrupt. Otherwise the caller ISR process will be blocked. + 215:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * The function is declared as __Weak to be overwritten in case of other + 216:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * implementation in user file. + 217:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @param TickPriority Tick interrupt priority. + 218:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @retval HAL status + 219:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** */ + 220:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** __weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) + 221:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** { + 114 .loc 1 221 1 is_stmt 1 view -0 + 115 .cfi_startproc + 116 @ args = 0, pretend = 0, frame = 0 + 117 @ frame_needed = 0, uses_anonymous_args = 0 + 118 .loc 1 221 1 is_stmt 0 view .LVU15 + ARM GAS /tmp/ccjtZjrH.s page 7 + + + 119 0000 10B5 push {r4, lr} + 120 .cfi_def_cfa_offset 8 + 121 .cfi_offset 4, -8 + 122 .cfi_offset 14, -4 + 123 0002 0446 mov r4, r0 + 222:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /* Configure the SysTick to have interrupt in 1ms time basis*/ + 223:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** if (HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq)) > 0U) + 124 .loc 1 223 3 is_stmt 1 view .LVU16 + 125 .loc 1 223 51 is_stmt 0 view .LVU17 + 126 0004 0E4B ldr r3, .L13 + 127 0006 1A78 ldrb r2, [r3] @ zero_extendqisi2 + 128 0008 4FF47A73 mov r3, #1000 + 129 000c B3FBF2F3 udiv r3, r3, r2 + 130 .loc 1 223 7 view .LVU18 + 131 0010 0C4A ldr r2, .L13+4 + 132 0012 1068 ldr r0, [r2] + 133 .LVL2: + 134 .loc 1 223 7 view .LVU19 + 135 0014 B0FBF3F0 udiv r0, r0, r3 + 136 0018 FFF7FEFF bl HAL_SYSTICK_Config + 137 .LVL3: + 138 .loc 1 223 6 view .LVU20 + 139 001c 68B9 cbnz r0, .L9 + 224:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** { + 225:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** return HAL_ERROR; + 226:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** } + 227:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 228:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /* Configure the SysTick IRQ priority */ + 229:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** if (TickPriority < (1UL << __NVIC_PRIO_BITS)) + 140 .loc 1 229 3 is_stmt 1 view .LVU21 + 141 .loc 1 229 6 is_stmt 0 view .LVU22 + 142 001e 0F2C cmp r4, #15 + 143 0020 01D9 bls .L12 + 230:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** { + 231:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0U); + 232:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** uwTickPrio = TickPriority; + 233:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** } + 234:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** else + 235:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** { + 236:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** return HAL_ERROR; + 144 .loc 1 236 12 view .LVU23 + 145 0022 0120 movs r0, #1 + 146 0024 0AE0 b .L8 + 147 .L12: + 231:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** uwTickPrio = TickPriority; + 148 .loc 1 231 5 is_stmt 1 view .LVU24 + 149 0026 0022 movs r2, #0 + 150 0028 2146 mov r1, r4 + 151 002a 4FF0FF30 mov r0, #-1 + 152 002e FFF7FEFF bl HAL_NVIC_SetPriority + 153 .LVL4: + 232:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** } + 154 .loc 1 232 5 view .LVU25 + 232:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** } + 155 .loc 1 232 16 is_stmt 0 view .LVU26 + 156 0032 054B ldr r3, .L13+8 + 157 0034 1C60 str r4, [r3] + ARM GAS /tmp/ccjtZjrH.s page 8 + + + 237:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** } + 238:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /* Return function status */ + 239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** return HAL_OK; + 158 .loc 1 239 3 is_stmt 1 view .LVU27 + 159 .loc 1 239 10 is_stmt 0 view .LVU28 + 160 0036 0020 movs r0, #0 + 161 0038 00E0 b .L8 + 162 .L9: + 225:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** } + 163 .loc 1 225 12 view .LVU29 + 164 003a 0120 movs r0, #1 + 165 .L8: + 240:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** } + 166 .loc 1 240 1 view .LVU30 + 167 003c 10BD pop {r4, pc} + 168 .LVL5: + 169 .L14: + 170 .loc 1 240 1 view .LVU31 + 171 003e 00BF .align 2 + 172 .L13: + 173 0040 00000000 .word uwTickFreq + 174 0044 00000000 .word SystemCoreClock + 175 0048 00000000 .word uwTickPrio + 176 .cfi_endproc + 177 .LFE134: + 179 .section .text.HAL_Init,"ax",%progbits + 180 .align 1 + 181 .global HAL_Init + 182 .syntax unified + 183 .thumb + 184 .thumb_func + 186 HAL_Init: + 187 .LFB130: + 139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /* Configure Flash prefetch */ + 188 .loc 1 139 1 is_stmt 1 view -0 + 189 .cfi_startproc + 190 @ args = 0, pretend = 0, frame = 0 + 191 @ frame_needed = 0, uses_anonymous_args = 0 + 192 0000 08B5 push {r3, lr} + 193 .cfi_def_cfa_offset 8 + 194 .cfi_offset 3, -8 + 195 .cfi_offset 14, -4 + 142:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** #endif /* PREFETCH_ENABLE */ + 196 .loc 1 142 3 view .LVU33 + 197 0002 074A ldr r2, .L17 + 198 0004 1368 ldr r3, [r2] + 199 0006 43F01003 orr r3, r3, #16 + 200 000a 1360 str r3, [r2] + 146:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 201 .loc 1 146 3 view .LVU34 + 202 000c 0320 movs r0, #3 + 203 000e FFF7FEFF bl HAL_NVIC_SetPriorityGrouping + 204 .LVL6: + 149:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 205 .loc 1 149 3 view .LVU35 + 206 0012 0F20 movs r0, #15 + 207 0014 FFF7FEFF bl HAL_InitTick + ARM GAS /tmp/ccjtZjrH.s page 9 + + + 208 .LVL7: + 152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 209 .loc 1 152 3 view .LVU36 + 210 0018 FFF7FEFF bl HAL_MspInit + 211 .LVL8: + 155:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** } + 212 .loc 1 155 3 view .LVU37 + 156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 213 .loc 1 156 1 is_stmt 0 view .LVU38 + 214 001c 0020 movs r0, #0 + 215 001e 08BD pop {r3, pc} + 216 .L18: + 217 .align 2 + 218 .L17: + 219 0020 00200240 .word 1073881088 + 220 .cfi_endproc + 221 .LFE130: + 223 .section .text.HAL_IncTick,"ax",%progbits + 224 .align 1 + 225 .weak HAL_IncTick + 226 .syntax unified + 227 .thumb + 228 .thumb_func + 230 HAL_IncTick: + 231 .LFB135: + 241:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 242:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /** + 243:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @} + 244:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** */ + 245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 246:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /** @defgroup HAL_Exported_Functions_Group2 HAL Control functions + 247:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @brief HAL Control functions + 248:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * + 249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** @verbatim + 250:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** =============================================================================== + 251:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** ##### HAL Control functions ##### + 252:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** =============================================================================== + 253:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** [..] This section provides functions allowing to: + 254:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** (+) Provide a tick value in millisecond + 255:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** (+) Provide a blocking delay in millisecond + 256:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** (+) Suspend the time base source interrupt + 257:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** (+) Resume the time base source interrupt + 258:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** (+) Get the HAL API driver version + 259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** (+) Get the device identifier + 260:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** (+) Get the device revision identifier + 261:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** (+) Enable/Disable Debug module during Sleep mode + 262:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** (+) Enable/Disable Debug module during STOP mode + 263:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** (+) Enable/Disable Debug module during STANDBY mode + 264:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 265:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** @endverbatim + 266:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @{ + 267:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** */ + 268:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 269:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /** + 270:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @brief This function is called to increment a global variable "uwTick" + 271:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * used as application time base. + 272:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @note In the default implementation, this variable is incremented each 1ms + ARM GAS /tmp/ccjtZjrH.s page 10 + + + 273:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * in SysTick ISR. + 274:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @note This function is declared as __weak to be overwritten in case of other + 275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * implementations in user file. + 276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @retval None + 277:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** */ + 278:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** __weak void HAL_IncTick(void) + 279:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** { + 232 .loc 1 279 1 is_stmt 1 view -0 + 233 .cfi_startproc + 234 @ args = 0, pretend = 0, frame = 0 + 235 @ frame_needed = 0, uses_anonymous_args = 0 + 236 @ link register save eliminated. + 280:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** uwTick += uwTickFreq; + 237 .loc 1 280 3 view .LVU40 + 238 .loc 1 280 10 is_stmt 0 view .LVU41 + 239 0000 034A ldr r2, .L20 + 240 0002 1168 ldr r1, [r2] + 241 0004 034B ldr r3, .L20+4 + 242 0006 1B78 ldrb r3, [r3] @ zero_extendqisi2 + 243 0008 0B44 add r3, r3, r1 + 244 000a 1360 str r3, [r2] + 281:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** } + 245 .loc 1 281 1 view .LVU42 + 246 000c 7047 bx lr + 247 .L21: + 248 000e 00BF .align 2 + 249 .L20: + 250 0010 00000000 .word uwTick + 251 0014 00000000 .word uwTickFreq + 252 .cfi_endproc + 253 .LFE135: + 255 .section .text.HAL_GetTick,"ax",%progbits + 256 .align 1 + 257 .weak HAL_GetTick + 258 .syntax unified + 259 .thumb + 260 .thumb_func + 262 HAL_GetTick: + 263 .LFB136: + 282:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 283:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /** + 284:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @brief Povides a tick value in millisecond. + 285:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @note The function is declared as __Weak to be overwritten in case of other + 286:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * implementations in user file. + 287:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @retval tick value + 288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** */ + 289:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** __weak uint32_t HAL_GetTick(void) + 290:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** { + 264 .loc 1 290 1 is_stmt 1 view -0 + 265 .cfi_startproc + 266 @ args = 0, pretend = 0, frame = 0 + 267 @ frame_needed = 0, uses_anonymous_args = 0 + 268 @ link register save eliminated. + 291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** return uwTick; + 269 .loc 1 291 3 view .LVU44 + 270 .loc 1 291 10 is_stmt 0 view .LVU45 + 271 0000 014B ldr r3, .L23 + ARM GAS /tmp/ccjtZjrH.s page 11 + + + 272 0002 1868 ldr r0, [r3] + 292:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** } + 273 .loc 1 292 1 view .LVU46 + 274 0004 7047 bx lr + 275 .L24: + 276 0006 00BF .align 2 + 277 .L23: + 278 0008 00000000 .word uwTick + 279 .cfi_endproc + 280 .LFE136: + 282 .section .text.HAL_GetTickPrio,"ax",%progbits + 283 .align 1 + 284 .global HAL_GetTickPrio + 285 .syntax unified + 286 .thumb + 287 .thumb_func + 289 HAL_GetTickPrio: + 290 .LFB137: + 293:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /** + 295:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @brief This function returns a tick priority. + 296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @retval tick priority + 297:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** */ + 298:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** uint32_t HAL_GetTickPrio(void) + 299:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** { + 291 .loc 1 299 1 is_stmt 1 view -0 + 292 .cfi_startproc + 293 @ args = 0, pretend = 0, frame = 0 + 294 @ frame_needed = 0, uses_anonymous_args = 0 + 295 @ link register save eliminated. + 300:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** return uwTickPrio; + 296 .loc 1 300 3 view .LVU48 + 301:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** } + 297 .loc 1 301 1 is_stmt 0 view .LVU49 + 298 0000 014B ldr r3, .L26 + 299 0002 1868 ldr r0, [r3] + 300 0004 7047 bx lr + 301 .L27: + 302 0006 00BF .align 2 + 303 .L26: + 304 0008 00000000 .word uwTickPrio + 305 .cfi_endproc + 306 .LFE137: + 308 .section .text.HAL_SetTickFreq,"ax",%progbits + 309 .align 1 + 310 .global HAL_SetTickFreq + 311 .syntax unified + 312 .thumb + 313 .thumb_func + 315 HAL_SetTickFreq: + 316 .LVL9: + 317 .LFB138: + 302:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 303:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /** + 304:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @brief Set new tick Freq. + 305:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @retval status + 306:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** */ + ARM GAS /tmp/ccjtZjrH.s page 12 + + + 307:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** HAL_StatusTypeDef HAL_SetTickFreq(HAL_TickFreqTypeDef Freq) + 308:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** { + 318 .loc 1 308 1 is_stmt 1 view -0 + 319 .cfi_startproc + 320 @ args = 0, pretend = 0, frame = 0 + 321 @ frame_needed = 0, uses_anonymous_args = 0 + 322 .loc 1 308 1 is_stmt 0 view .LVU51 + 323 0000 10B5 push {r4, lr} + 324 .cfi_def_cfa_offset 8 + 325 .cfi_offset 4, -8 + 326 .cfi_offset 14, -4 + 309:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** HAL_StatusTypeDef status = HAL_OK; + 327 .loc 1 309 3 is_stmt 1 view .LVU52 + 328 .LVL10: + 310:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** HAL_TickFreqTypeDef prevTickFreq; + 329 .loc 1 310 3 view .LVU53 + 311:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 312:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** assert_param(IS_TICKFREQ(Freq)); + 330 .loc 1 312 3 view .LVU54 + 313:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 314:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** if (uwTickFreq != Freq) + 331 .loc 1 314 3 view .LVU55 + 332 .loc 1 314 18 is_stmt 0 view .LVU56 + 333 0002 084B ldr r3, .L33 + 334 0004 1C78 ldrb r4, [r3] @ zero_extendqisi2 + 335 .loc 1 314 6 view .LVU57 + 336 0006 8442 cmp r4, r0 + 337 0008 01D1 bne .L32 + 309:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** HAL_TickFreqTypeDef prevTickFreq; + 338 .loc 1 309 21 view .LVU58 + 339 000a 0020 movs r0, #0 + 340 .LVL11: + 341 .L29: + 315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** { + 316:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /* Back up uwTickFreq frequency */ + 317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** prevTickFreq = uwTickFreq; + 318:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 319:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /* Update uwTickFreq global variable used by HAL_InitTick() */ + 320:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** uwTickFreq = Freq; + 321:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 322:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /* Apply the new tick Freq */ + 323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** status = HAL_InitTick(uwTickPrio); + 324:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 325:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** if (status != HAL_OK) + 326:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** { + 327:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /* Restore previous tick frequency */ + 328:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** uwTickFreq = prevTickFreq; + 329:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** } + 330:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** } + 331:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 332:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** return status; + 342 .loc 1 332 3 is_stmt 1 view .LVU59 + 333:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** } + 343 .loc 1 333 1 is_stmt 0 view .LVU60 + 344 000c 10BD pop {r4, pc} + 345 .LVL12: + 346 .L32: + ARM GAS /tmp/ccjtZjrH.s page 13 + + + 317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 347 .loc 1 317 5 is_stmt 1 view .LVU61 + 320:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 348 .loc 1 320 5 view .LVU62 + 320:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 349 .loc 1 320 16 is_stmt 0 view .LVU63 + 350 000e 1870 strb r0, [r3] + 323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 351 .loc 1 323 5 is_stmt 1 view .LVU64 + 323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 352 .loc 1 323 14 is_stmt 0 view .LVU65 + 353 0010 054B ldr r3, .L33+4 + 354 0012 1868 ldr r0, [r3] + 355 .LVL13: + 323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 356 .loc 1 323 14 view .LVU66 + 357 0014 FFF7FEFF bl HAL_InitTick + 358 .LVL14: + 325:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** { + 359 .loc 1 325 5 is_stmt 1 view .LVU67 + 325:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** { + 360 .loc 1 325 8 is_stmt 0 view .LVU68 + 361 0018 0028 cmp r0, #0 + 362 001a F7D0 beq .L29 + 328:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** } + 363 .loc 1 328 7 is_stmt 1 view .LVU69 + 328:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** } + 364 .loc 1 328 18 is_stmt 0 view .LVU70 + 365 001c 014B ldr r3, .L33 + 366 001e 1C70 strb r4, [r3] + 367 0020 F4E7 b .L29 + 368 .L34: + 369 0022 00BF .align 2 + 370 .L33: + 371 0024 00000000 .word uwTickFreq + 372 0028 00000000 .word uwTickPrio + 373 .cfi_endproc + 374 .LFE138: + 376 .section .text.HAL_GetTickFreq,"ax",%progbits + 377 .align 1 + 378 .global HAL_GetTickFreq + 379 .syntax unified + 380 .thumb + 381 .thumb_func + 383 HAL_GetTickFreq: + 384 .LFB139: + 334:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 335:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /** + 336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @brief Return tick frequency. + 337:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @retval tick period in Hz + 338:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** */ + 339:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** HAL_TickFreqTypeDef HAL_GetTickFreq(void) + 340:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** { + 385 .loc 1 340 1 is_stmt 1 view -0 + 386 .cfi_startproc + 387 @ args = 0, pretend = 0, frame = 0 + 388 @ frame_needed = 0, uses_anonymous_args = 0 + ARM GAS /tmp/ccjtZjrH.s page 14 + + + 389 @ link register save eliminated. + 341:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** return uwTickFreq; + 390 .loc 1 341 3 view .LVU72 + 342:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** } + 391 .loc 1 342 1 is_stmt 0 view .LVU73 + 392 0000 014B ldr r3, .L36 + 393 0002 1878 ldrb r0, [r3] @ zero_extendqisi2 + 394 0004 7047 bx lr + 395 .L37: + 396 0006 00BF .align 2 + 397 .L36: + 398 0008 00000000 .word uwTickFreq + 399 .cfi_endproc + 400 .LFE139: + 402 .section .text.HAL_Delay,"ax",%progbits + 403 .align 1 + 404 .weak HAL_Delay + 405 .syntax unified + 406 .thumb + 407 .thumb_func + 409 HAL_Delay: + 410 .LVL15: + 411 .LFB140: + 343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 344:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /** + 345:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @brief This function provides accurate delay (in milliseconds) based + 346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * on variable incremented. + 347:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @note In the default implementation , SysTick timer is the source of time base. + 348:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * It is used to generate interrupts at regular time intervals where uwTick + 349:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * is incremented. + 350:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * The function is declared as __Weak to be overwritten in case of other + 351:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * implementations in user file. + 352:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @param Delay specifies the delay time length, in milliseconds. + 353:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @retval None + 354:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** */ + 355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** __weak void HAL_Delay(uint32_t Delay) + 356:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** { + 412 .loc 1 356 1 is_stmt 1 view -0 + 413 .cfi_startproc + 414 @ args = 0, pretend = 0, frame = 0 + 415 @ frame_needed = 0, uses_anonymous_args = 0 + 416 .loc 1 356 1 is_stmt 0 view .LVU75 + 417 0000 38B5 push {r3, r4, r5, lr} + 418 .cfi_def_cfa_offset 16 + 419 .cfi_offset 3, -16 + 420 .cfi_offset 4, -12 + 421 .cfi_offset 5, -8 + 422 .cfi_offset 14, -4 + 423 0002 0446 mov r4, r0 + 357:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** uint32_t tickstart = HAL_GetTick(); + 424 .loc 1 357 3 is_stmt 1 view .LVU76 + 425 .loc 1 357 24 is_stmt 0 view .LVU77 + 426 0004 FFF7FEFF bl HAL_GetTick + 427 .LVL16: + 428 .loc 1 357 24 view .LVU78 + 429 0008 0546 mov r5, r0 + 430 .LVL17: + ARM GAS /tmp/ccjtZjrH.s page 15 + + + 358:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** uint32_t wait = Delay; + 431 .loc 1 358 3 is_stmt 1 view .LVU79 + 359:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 360:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /* Add freq to guarantee minimum wait */ + 361:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** if (wait < HAL_MAX_DELAY) + 432 .loc 1 361 3 view .LVU80 + 433 .loc 1 361 6 is_stmt 0 view .LVU81 + 434 000a B4F1FF3F cmp r4, #-1 + 435 000e 02D0 beq .L40 + 362:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** { + 363:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** wait += (uint32_t)(uwTickFreq); + 436 .loc 1 363 5 is_stmt 1 view .LVU82 + 437 .loc 1 363 13 is_stmt 0 view .LVU83 + 438 0010 044B ldr r3, .L42 + 439 0012 1B78 ldrb r3, [r3] @ zero_extendqisi2 + 440 .loc 1 363 10 view .LVU84 + 441 0014 1C44 add r4, r4, r3 + 442 .LVL18: + 443 .L40: + 364:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** } + 365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 366:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** while((HAL_GetTick() - tickstart) < wait) + 367:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** { + 368:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** } + 444 .loc 1 368 3 is_stmt 1 discriminator 1 view .LVU85 + 366:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** { + 445 .loc 1 366 37 discriminator 1 view .LVU86 + 366:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** { + 446 .loc 1 366 10 is_stmt 0 discriminator 1 view .LVU87 + 447 0016 FFF7FEFF bl HAL_GetTick + 448 .LVL19: + 366:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** { + 449 .loc 1 366 24 discriminator 1 view .LVU88 + 450 001a 401B subs r0, r0, r5 + 366:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** { + 451 .loc 1 366 37 discriminator 1 view .LVU89 + 452 001c A042 cmp r0, r4 + 453 001e FAD3 bcc .L40 + 369:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** } + 454 .loc 1 369 1 view .LVU90 + 455 0020 38BD pop {r3, r4, r5, pc} + 456 .LVL20: + 457 .L43: + 458 .loc 1 369 1 view .LVU91 + 459 0022 00BF .align 2 + 460 .L42: + 461 0024 00000000 .word uwTickFreq + 462 .cfi_endproc + 463 .LFE140: + 465 .section .text.HAL_SuspendTick,"ax",%progbits + 466 .align 1 + 467 .weak HAL_SuspendTick + 468 .syntax unified + 469 .thumb + 470 .thumb_func + 472 HAL_SuspendTick: + 473 .LFB141: + ARM GAS /tmp/ccjtZjrH.s page 16 + + + 370:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 371:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /** + 372:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @brief Suspend Tick increment. + 373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @note In the default implementation , SysTick timer is the source of time base. It is + 374:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * used to generate interrupts at regular time intervals. Once HAL_SuspendTick() + 375:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * is called, the the SysTick interrupt will be disabled and so Tick increment + 376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * is suspended. + 377:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @note This function is declared as __weak to be overwritten in case of other + 378:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * implementations in user file. + 379:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @retval None + 380:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** */ + 381:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** __weak void HAL_SuspendTick(void) + 382:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** { + 474 .loc 1 383 1 is_stmt 1 view -0 + 475 .cfi_startproc + 476 @ args = 0, pretend = 0, frame = 0 + 477 @ frame_needed = 0, uses_anonymous_args = 0 + 478 @ link register save eliminated. + 384:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /* Disable SysTick Interrupt */ + 385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk; + 479 .loc 1 385 3 view .LVU93 + 480 .loc 1 385 10 is_stmt 0 view .LVU94 + 481 0000 4FF0E022 mov r2, #-536813568 + 482 0004 1369 ldr r3, [r2, #16] + 483 .loc 1 385 17 view .LVU95 + 484 0006 23F00203 bic r3, r3, #2 + 485 000a 1361 str r3, [r2, #16] + 386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 387:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** } + 486 .loc 1 387 1 view .LVU96 + 487 000c 7047 bx lr + 488 .cfi_endproc + 489 .LFE141: + 491 .section .text.HAL_ResumeTick,"ax",%progbits + 492 .align 1 + 493 .weak HAL_ResumeTick + 494 .syntax unified + 495 .thumb + 496 .thumb_func + 498 HAL_ResumeTick: + 499 .LFB142: + 388:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 389:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /** + 390:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @brief Resume Tick increment. + 391:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @note In the default implementation , SysTick timer is the source of time base. It is + 392:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * used to generate interrupts at regular time intervals. Once HAL_ResumeTick() + 393:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * is called, the the SysTick interrupt will be enabled and so Tick increment + 394:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * is resumed. + 395:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * The function is declared as __Weak to be overwritten in case of other + 396:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * implementations in user file. + 397:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @retval None + 398:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** */ + 399:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** __weak void HAL_ResumeTick(void) + 400:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** { + 500 .loc 1 400 1 is_stmt 1 view -0 + 501 .cfi_startproc + ARM GAS /tmp/ccjtZjrH.s page 17 + + + 502 @ args = 0, pretend = 0, frame = 0 + 503 @ frame_needed = 0, uses_anonymous_args = 0 + 504 @ link register save eliminated. + 401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /* Enable SysTick Interrupt */ + 402:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk; + 505 .loc 1 402 3 view .LVU98 + 506 .loc 1 402 10 is_stmt 0 view .LVU99 + 507 0000 4FF0E022 mov r2, #-536813568 + 508 0004 1369 ldr r3, [r2, #16] + 509 .loc 1 402 18 view .LVU100 + 510 0006 43F00203 orr r3, r3, #2 + 511 000a 1361 str r3, [r2, #16] + 403:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 404:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** } + 512 .loc 1 404 1 view .LVU101 + 513 000c 7047 bx lr + 514 .cfi_endproc + 515 .LFE142: + 517 .section .text.HAL_GetHalVersion,"ax",%progbits + 518 .align 1 + 519 .global HAL_GetHalVersion + 520 .syntax unified + 521 .thumb + 522 .thumb_func + 524 HAL_GetHalVersion: + 525 .LFB143: + 405:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 406:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /** + 407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @brief This function returns the HAL revision + 408:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @retval version 0xXYZR (8bits for each decimal, R for RC) + 409:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** */ + 410:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** uint32_t HAL_GetHalVersion(void) + 411:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** { + 526 .loc 1 411 1 is_stmt 1 view -0 + 527 .cfi_startproc + 528 @ args = 0, pretend = 0, frame = 0 + 529 @ frame_needed = 0, uses_anonymous_args = 0 + 530 @ link register save eliminated. + 412:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** return __STM32F3xx_HAL_VERSION; + 531 .loc 1 412 2 view .LVU103 + 413:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** } + 532 .loc 1 413 1 is_stmt 0 view .LVU104 + 533 0000 0048 ldr r0, .L47 + 534 0002 7047 bx lr + 535 .L48: + 536 .align 2 + 537 .L47: + 538 0004 00060501 .word 17106432 + 539 .cfi_endproc + 540 .LFE143: + 542 .section .text.HAL_GetREVID,"ax",%progbits + 543 .align 1 + 544 .global HAL_GetREVID + 545 .syntax unified + 546 .thumb + 547 .thumb_func + 549 HAL_GetREVID: + ARM GAS /tmp/ccjtZjrH.s page 18 + + + 550 .LFB144: + 414:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 415:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /** + 416:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @brief Returns the device revision identifier. + 417:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @retval Device revision identifier + 418:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** */ + 419:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** uint32_t HAL_GetREVID(void) + 420:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** { + 551 .loc 1 420 1 is_stmt 1 view -0 + 552 .cfi_startproc + 553 @ args = 0, pretend = 0, frame = 0 + 554 @ frame_needed = 0, uses_anonymous_args = 0 + 555 @ link register save eliminated. + 421:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** return((DBGMCU->IDCODE) >> 16U); + 556 .loc 1 421 3 view .LVU106 + 557 .loc 1 421 17 is_stmt 0 view .LVU107 + 558 0000 014B ldr r3, .L50 + 559 0002 1868 ldr r0, [r3] + 422:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** } + 560 .loc 1 422 1 view .LVU108 + 561 0004 000C lsrs r0, r0, #16 + 562 0006 7047 bx lr + 563 .L51: + 564 .align 2 + 565 .L50: + 566 0008 002004E0 .word -536600576 + 567 .cfi_endproc + 568 .LFE144: + 570 .section .text.HAL_GetDEVID,"ax",%progbits + 571 .align 1 + 572 .global HAL_GetDEVID + 573 .syntax unified + 574 .thumb + 575 .thumb_func + 577 HAL_GetDEVID: + 578 .LFB145: + 423:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 424:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /** + 425:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @brief Returns the device identifier. + 426:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @retval Device identifier + 427:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** */ + 428:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** uint32_t HAL_GetDEVID(void) + 429:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** { + 579 .loc 1 429 1 is_stmt 1 view -0 + 580 .cfi_startproc + 581 @ args = 0, pretend = 0, frame = 0 + 582 @ frame_needed = 0, uses_anonymous_args = 0 + 583 @ link register save eliminated. + 430:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** return((DBGMCU->IDCODE) & IDCODE_DEVID_MASK); + 584 .loc 1 430 3 view .LVU110 + 585 .loc 1 430 17 is_stmt 0 view .LVU111 + 586 0000 024B ldr r3, .L53 + 587 0002 1868 ldr r0, [r3] + 431:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** } + 588 .loc 1 431 1 view .LVU112 + 589 0004 C0F30B00 ubfx r0, r0, #0, #12 + 590 0008 7047 bx lr + ARM GAS /tmp/ccjtZjrH.s page 19 + + + 591 .L54: + 592 000a 00BF .align 2 + 593 .L53: + 594 000c 002004E0 .word -536600576 + 595 .cfi_endproc + 596 .LFE145: + 598 .section .text.HAL_GetUIDw0,"ax",%progbits + 599 .align 1 + 600 .global HAL_GetUIDw0 + 601 .syntax unified + 602 .thumb + 603 .thumb_func + 605 HAL_GetUIDw0: + 606 .LFB146: + 432:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 433:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /** + 434:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @brief Returns first word of the unique device identifier (UID based on 96 bits) + 435:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @retval Device identifier + 436:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** */ + 437:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** uint32_t HAL_GetUIDw0(void) + 438:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** { + 607 .loc 1 438 1 is_stmt 1 view -0 + 608 .cfi_startproc + 609 @ args = 0, pretend = 0, frame = 0 + 610 @ frame_needed = 0, uses_anonymous_args = 0 + 611 @ link register save eliminated. + 439:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** return(READ_REG(*((uint32_t *)UID_BASE))); + 612 .loc 1 439 4 view .LVU114 + 440:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** } + 613 .loc 1 440 1 is_stmt 0 view .LVU115 + 614 0000 014B ldr r3, .L56 + 615 0002 D3F8AC07 ldr r0, [r3, #1964] + 616 0006 7047 bx lr + 617 .L57: + 618 .align 2 + 619 .L56: + 620 0008 00F0FF1F .word 536866816 + 621 .cfi_endproc + 622 .LFE146: + 624 .section .text.HAL_GetUIDw1,"ax",%progbits + 625 .align 1 + 626 .global HAL_GetUIDw1 + 627 .syntax unified + 628 .thumb + 629 .thumb_func + 631 HAL_GetUIDw1: + 632 .LFB147: + 441:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 442:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /** + 443:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @brief Returns second word of the unique device identifier (UID based on 96 bits) + 444:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @retval Device identifier + 445:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** */ + 446:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** uint32_t HAL_GetUIDw1(void) + 447:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** { + 633 .loc 1 447 1 is_stmt 1 view -0 + 634 .cfi_startproc + 635 @ args = 0, pretend = 0, frame = 0 + ARM GAS /tmp/ccjtZjrH.s page 20 + + + 636 @ frame_needed = 0, uses_anonymous_args = 0 + 637 @ link register save eliminated. + 448:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** return(READ_REG(*((uint32_t *)(UID_BASE + 4U)))); + 638 .loc 1 448 4 view .LVU117 + 449:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** } + 639 .loc 1 449 1 is_stmt 0 view .LVU118 + 640 0000 014B ldr r3, .L59 + 641 0002 D3F8B007 ldr r0, [r3, #1968] + 642 0006 7047 bx lr + 643 .L60: + 644 .align 2 + 645 .L59: + 646 0008 00F0FF1F .word 536866816 + 647 .cfi_endproc + 648 .LFE147: + 650 .section .text.HAL_GetUIDw2,"ax",%progbits + 651 .align 1 + 652 .global HAL_GetUIDw2 + 653 .syntax unified + 654 .thumb + 655 .thumb_func + 657 HAL_GetUIDw2: + 658 .LFB148: + 450:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 451:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /** + 452:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @brief Returns third word of the unique device identifier (UID based on 96 bits) + 453:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @retval Device identifier + 454:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** */ + 455:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** uint32_t HAL_GetUIDw2(void) + 456:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** { + 659 .loc 1 456 1 is_stmt 1 view -0 + 660 .cfi_startproc + 661 @ args = 0, pretend = 0, frame = 0 + 662 @ frame_needed = 0, uses_anonymous_args = 0 + 663 @ link register save eliminated. + 457:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** return(READ_REG(*((uint32_t *)(UID_BASE + 8U)))); + 664 .loc 1 457 4 view .LVU120 + 458:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** } + 665 .loc 1 458 1 is_stmt 0 view .LVU121 + 666 0000 014B ldr r3, .L62 + 667 0002 D3F8B407 ldr r0, [r3, #1972] + 668 0006 7047 bx lr + 669 .L63: + 670 .align 2 + 671 .L62: + 672 0008 00F0FF1F .word 536866816 + 673 .cfi_endproc + 674 .LFE148: + 676 .section .text.HAL_DBGMCU_EnableDBGSleepMode,"ax",%progbits + 677 .align 1 + 678 .global HAL_DBGMCU_EnableDBGSleepMode + 679 .syntax unified + 680 .thumb + 681 .thumb_func + 683 HAL_DBGMCU_EnableDBGSleepMode: + 684 .LFB149: + 459:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + ARM GAS /tmp/ccjtZjrH.s page 21 + + + 460:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /** + 461:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @brief Enable the Debug Module during SLEEP mode + 462:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @retval None + 463:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** */ + 464:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** void HAL_DBGMCU_EnableDBGSleepMode(void) + 465:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** { + 685 .loc 1 465 1 is_stmt 1 view -0 + 686 .cfi_startproc + 687 @ args = 0, pretend = 0, frame = 0 + 688 @ frame_needed = 0, uses_anonymous_args = 0 + 689 @ link register save eliminated. + 466:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_SLEEP); + 690 .loc 1 466 3 view .LVU123 + 691 0000 024A ldr r2, .L65 + 692 0002 5368 ldr r3, [r2, #4] + 693 0004 43F00103 orr r3, r3, #1 + 694 0008 5360 str r3, [r2, #4] + 467:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** } + 695 .loc 1 467 1 is_stmt 0 view .LVU124 + 696 000a 7047 bx lr + 697 .L66: + 698 .align 2 + 699 .L65: + 700 000c 002004E0 .word -536600576 + 701 .cfi_endproc + 702 .LFE149: + 704 .section .text.HAL_DBGMCU_DisableDBGSleepMode,"ax",%progbits + 705 .align 1 + 706 .global HAL_DBGMCU_DisableDBGSleepMode + 707 .syntax unified + 708 .thumb + 709 .thumb_func + 711 HAL_DBGMCU_DisableDBGSleepMode: + 712 .LFB150: + 468:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 469:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /** + 470:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @brief Disable the Debug Module during SLEEP mode + 471:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @retval None + 472:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** */ + 473:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** void HAL_DBGMCU_DisableDBGSleepMode(void) + 474:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** { + 713 .loc 1 474 1 is_stmt 1 view -0 + 714 .cfi_startproc + 715 @ args = 0, pretend = 0, frame = 0 + 716 @ frame_needed = 0, uses_anonymous_args = 0 + 717 @ link register save eliminated. + 475:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_SLEEP); + 718 .loc 1 475 3 view .LVU126 + 719 0000 024A ldr r2, .L68 + 720 0002 5368 ldr r3, [r2, #4] + 721 0004 23F00103 bic r3, r3, #1 + 722 0008 5360 str r3, [r2, #4] + 476:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** } + 723 .loc 1 476 1 is_stmt 0 view .LVU127 + 724 000a 7047 bx lr + 725 .L69: + 726 .align 2 + ARM GAS /tmp/ccjtZjrH.s page 22 + + + 727 .L68: + 728 000c 002004E0 .word -536600576 + 729 .cfi_endproc + 730 .LFE150: + 732 .section .text.HAL_DBGMCU_EnableDBGStopMode,"ax",%progbits + 733 .align 1 + 734 .global HAL_DBGMCU_EnableDBGStopMode + 735 .syntax unified + 736 .thumb + 737 .thumb_func + 739 HAL_DBGMCU_EnableDBGStopMode: + 740 .LFB151: + 477:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 478:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /** + 479:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @brief Enable the Debug Module during STOP mode + 480:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @retval None + 481:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** */ + 482:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** void HAL_DBGMCU_EnableDBGStopMode(void) + 483:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** { + 741 .loc 1 483 1 is_stmt 1 view -0 + 742 .cfi_startproc + 743 @ args = 0, pretend = 0, frame = 0 + 744 @ frame_needed = 0, uses_anonymous_args = 0 + 745 @ link register save eliminated. + 484:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STOP); + 746 .loc 1 484 3 view .LVU129 + 747 0000 024A ldr r2, .L71 + 748 0002 5368 ldr r3, [r2, #4] + 749 0004 43F00203 orr r3, r3, #2 + 750 0008 5360 str r3, [r2, #4] + 485:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** } + 751 .loc 1 485 1 is_stmt 0 view .LVU130 + 752 000a 7047 bx lr + 753 .L72: + 754 .align 2 + 755 .L71: + 756 000c 002004E0 .word -536600576 + 757 .cfi_endproc + 758 .LFE151: + 760 .section .text.HAL_DBGMCU_DisableDBGStopMode,"ax",%progbits + 761 .align 1 + 762 .global HAL_DBGMCU_DisableDBGStopMode + 763 .syntax unified + 764 .thumb + 765 .thumb_func + 767 HAL_DBGMCU_DisableDBGStopMode: + 768 .LFB152: + 486:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 487:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /** + 488:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @brief Disable the Debug Module during STOP mode + 489:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @retval None + 490:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** */ + 491:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** void HAL_DBGMCU_DisableDBGStopMode(void) + 492:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** { + 769 .loc 1 492 1 is_stmt 1 view -0 + 770 .cfi_startproc + 771 @ args = 0, pretend = 0, frame = 0 + ARM GAS /tmp/ccjtZjrH.s page 23 + + + 772 @ frame_needed = 0, uses_anonymous_args = 0 + 773 @ link register save eliminated. + 493:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STOP); + 774 .loc 1 493 3 view .LVU132 + 775 0000 024A ldr r2, .L74 + 776 0002 5368 ldr r3, [r2, #4] + 777 0004 23F00203 bic r3, r3, #2 + 778 0008 5360 str r3, [r2, #4] + 494:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** } + 779 .loc 1 494 1 is_stmt 0 view .LVU133 + 780 000a 7047 bx lr + 781 .L75: + 782 .align 2 + 783 .L74: + 784 000c 002004E0 .word -536600576 + 785 .cfi_endproc + 786 .LFE152: + 788 .section .text.HAL_DBGMCU_EnableDBGStandbyMode,"ax",%progbits + 789 .align 1 + 790 .global HAL_DBGMCU_EnableDBGStandbyMode + 791 .syntax unified + 792 .thumb + 793 .thumb_func + 795 HAL_DBGMCU_EnableDBGStandbyMode: + 796 .LFB153: + 495:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 496:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /** + 497:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @brief Enable the Debug Module during STANDBY mode + 498:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @retval None + 499:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** */ + 500:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** void HAL_DBGMCU_EnableDBGStandbyMode(void) + 501:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** { + 797 .loc 1 501 1 is_stmt 1 view -0 + 798 .cfi_startproc + 799 @ args = 0, pretend = 0, frame = 0 + 800 @ frame_needed = 0, uses_anonymous_args = 0 + 801 @ link register save eliminated. + 502:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** SET_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STANDBY); + 802 .loc 1 502 3 view .LVU135 + 803 0000 024A ldr r2, .L77 + 804 0002 5368 ldr r3, [r2, #4] + 805 0004 43F00403 orr r3, r3, #4 + 806 0008 5360 str r3, [r2, #4] + 503:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** } + 807 .loc 1 503 1 is_stmt 0 view .LVU136 + 808 000a 7047 bx lr + 809 .L78: + 810 .align 2 + 811 .L77: + 812 000c 002004E0 .word -536600576 + 813 .cfi_endproc + 814 .LFE153: + 816 .section .text.HAL_DBGMCU_DisableDBGStandbyMode,"ax",%progbits + 817 .align 1 + 818 .global HAL_DBGMCU_DisableDBGStandbyMode + 819 .syntax unified + 820 .thumb + ARM GAS /tmp/ccjtZjrH.s page 24 + + + 821 .thumb_func + 823 HAL_DBGMCU_DisableDBGStandbyMode: + 824 .LFB154: + 504:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** + 505:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** /** + 506:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @brief Disable the Debug Module during STANDBY mode + 507:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** * @retval None + 508:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** */ + 509:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** void HAL_DBGMCU_DisableDBGStandbyMode(void) + 510:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** { + 825 .loc 1 510 1 is_stmt 1 view -0 + 826 .cfi_startproc + 827 @ args = 0, pretend = 0, frame = 0 + 828 @ frame_needed = 0, uses_anonymous_args = 0 + 829 @ link register save eliminated. + 511:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** CLEAR_BIT(DBGMCU->CR, DBGMCU_CR_DBG_STANDBY); + 830 .loc 1 511 3 view .LVU138 + 831 0000 024A ldr r2, .L80 + 832 0002 5368 ldr r3, [r2, #4] + 833 0004 23F00403 bic r3, r3, #4 + 834 0008 5360 str r3, [r2, #4] + 512:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c **** } + 835 .loc 1 512 1 is_stmt 0 view .LVU139 + 836 000a 7047 bx lr + 837 .L81: + 838 .align 2 + 839 .L80: + 840 000c 002004E0 .word -536600576 + 841 .cfi_endproc + 842 .LFE154: + 844 .global uwTickFreq + 845 .section .data.uwTickFreq,"aw" + 848 uwTickFreq: + 849 0000 01 .byte 1 + 850 .global uwTickPrio + 851 .section .data.uwTickPrio,"aw" + 852 .align 2 + 855 uwTickPrio: + 856 0000 10000000 .word 16 + 857 .global uwTick + 858 .section .bss.uwTick,"aw",%nobits + 859 .align 2 + 862 uwTick: + 863 0000 00000000 .space 4 + 864 .text + 865 .Letext0: + 866 .file 2 "Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h" + 867 .file 3 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 868 .file 4 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 869 .file 5 "Drivers/CMSIS/Include/core_cm4.h" + 870 .file 6 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h" + 871 .file 7 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h" + 872 .file 8 "Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h" + 873 .file 9 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h" + ARM GAS /tmp/ccjtZjrH.s page 25 + + +DEFINED SYMBOLS + *ABS*:0000000000000000 stm32f3xx_hal.c + /tmp/ccjtZjrH.s:21 .text.HAL_MspInit:0000000000000000 $t + /tmp/ccjtZjrH.s:27 .text.HAL_MspInit:0000000000000000 HAL_MspInit + /tmp/ccjtZjrH.s:40 .text.HAL_MspDeInit:0000000000000000 $t + /tmp/ccjtZjrH.s:46 .text.HAL_MspDeInit:0000000000000000 HAL_MspDeInit + /tmp/ccjtZjrH.s:59 .text.HAL_DeInit:0000000000000000 $t + /tmp/ccjtZjrH.s:65 .text.HAL_DeInit:0000000000000000 HAL_DeInit + /tmp/ccjtZjrH.s:100 .text.HAL_DeInit:0000000000000020 $d + /tmp/ccjtZjrH.s:105 .text.HAL_InitTick:0000000000000000 $t + /tmp/ccjtZjrH.s:111 .text.HAL_InitTick:0000000000000000 HAL_InitTick + /tmp/ccjtZjrH.s:173 .text.HAL_InitTick:0000000000000040 $d + /tmp/ccjtZjrH.s:848 .data.uwTickFreq:0000000000000000 uwTickFreq + /tmp/ccjtZjrH.s:855 .data.uwTickPrio:0000000000000000 uwTickPrio + /tmp/ccjtZjrH.s:180 .text.HAL_Init:0000000000000000 $t + /tmp/ccjtZjrH.s:186 .text.HAL_Init:0000000000000000 HAL_Init + /tmp/ccjtZjrH.s:219 .text.HAL_Init:0000000000000020 $d + /tmp/ccjtZjrH.s:224 .text.HAL_IncTick:0000000000000000 $t + /tmp/ccjtZjrH.s:230 .text.HAL_IncTick:0000000000000000 HAL_IncTick + /tmp/ccjtZjrH.s:250 .text.HAL_IncTick:0000000000000010 $d + /tmp/ccjtZjrH.s:862 .bss.uwTick:0000000000000000 uwTick + /tmp/ccjtZjrH.s:256 .text.HAL_GetTick:0000000000000000 $t + /tmp/ccjtZjrH.s:262 .text.HAL_GetTick:0000000000000000 HAL_GetTick + /tmp/ccjtZjrH.s:278 .text.HAL_GetTick:0000000000000008 $d + /tmp/ccjtZjrH.s:283 .text.HAL_GetTickPrio:0000000000000000 $t + /tmp/ccjtZjrH.s:289 .text.HAL_GetTickPrio:0000000000000000 HAL_GetTickPrio + /tmp/ccjtZjrH.s:304 .text.HAL_GetTickPrio:0000000000000008 $d + /tmp/ccjtZjrH.s:309 .text.HAL_SetTickFreq:0000000000000000 $t + /tmp/ccjtZjrH.s:315 .text.HAL_SetTickFreq:0000000000000000 HAL_SetTickFreq + /tmp/ccjtZjrH.s:371 .text.HAL_SetTickFreq:0000000000000024 $d + /tmp/ccjtZjrH.s:377 .text.HAL_GetTickFreq:0000000000000000 $t + /tmp/ccjtZjrH.s:383 .text.HAL_GetTickFreq:0000000000000000 HAL_GetTickFreq + /tmp/ccjtZjrH.s:398 .text.HAL_GetTickFreq:0000000000000008 $d + /tmp/ccjtZjrH.s:403 .text.HAL_Delay:0000000000000000 $t + /tmp/ccjtZjrH.s:409 .text.HAL_Delay:0000000000000000 HAL_Delay + /tmp/ccjtZjrH.s:461 .text.HAL_Delay:0000000000000024 $d + /tmp/ccjtZjrH.s:466 .text.HAL_SuspendTick:0000000000000000 $t + /tmp/ccjtZjrH.s:472 .text.HAL_SuspendTick:0000000000000000 HAL_SuspendTick + /tmp/ccjtZjrH.s:492 .text.HAL_ResumeTick:0000000000000000 $t + /tmp/ccjtZjrH.s:498 .text.HAL_ResumeTick:0000000000000000 HAL_ResumeTick + /tmp/ccjtZjrH.s:518 .text.HAL_GetHalVersion:0000000000000000 $t + /tmp/ccjtZjrH.s:524 .text.HAL_GetHalVersion:0000000000000000 HAL_GetHalVersion + /tmp/ccjtZjrH.s:538 .text.HAL_GetHalVersion:0000000000000004 $d + /tmp/ccjtZjrH.s:543 .text.HAL_GetREVID:0000000000000000 $t + /tmp/ccjtZjrH.s:549 .text.HAL_GetREVID:0000000000000000 HAL_GetREVID + /tmp/ccjtZjrH.s:566 .text.HAL_GetREVID:0000000000000008 $d + /tmp/ccjtZjrH.s:571 .text.HAL_GetDEVID:0000000000000000 $t + /tmp/ccjtZjrH.s:577 .text.HAL_GetDEVID:0000000000000000 HAL_GetDEVID + /tmp/ccjtZjrH.s:594 .text.HAL_GetDEVID:000000000000000c $d + /tmp/ccjtZjrH.s:599 .text.HAL_GetUIDw0:0000000000000000 $t + /tmp/ccjtZjrH.s:605 .text.HAL_GetUIDw0:0000000000000000 HAL_GetUIDw0 + /tmp/ccjtZjrH.s:620 .text.HAL_GetUIDw0:0000000000000008 $d + /tmp/ccjtZjrH.s:625 .text.HAL_GetUIDw1:0000000000000000 $t + /tmp/ccjtZjrH.s:631 .text.HAL_GetUIDw1:0000000000000000 HAL_GetUIDw1 + /tmp/ccjtZjrH.s:646 .text.HAL_GetUIDw1:0000000000000008 $d + /tmp/ccjtZjrH.s:651 .text.HAL_GetUIDw2:0000000000000000 $t + /tmp/ccjtZjrH.s:657 .text.HAL_GetUIDw2:0000000000000000 HAL_GetUIDw2 + ARM GAS /tmp/ccjtZjrH.s page 26 + + + /tmp/ccjtZjrH.s:672 .text.HAL_GetUIDw2:0000000000000008 $d + /tmp/ccjtZjrH.s:677 .text.HAL_DBGMCU_EnableDBGSleepMode:0000000000000000 $t + /tmp/ccjtZjrH.s:683 .text.HAL_DBGMCU_EnableDBGSleepMode:0000000000000000 HAL_DBGMCU_EnableDBGSleepMode + /tmp/ccjtZjrH.s:700 .text.HAL_DBGMCU_EnableDBGSleepMode:000000000000000c $d + /tmp/ccjtZjrH.s:705 .text.HAL_DBGMCU_DisableDBGSleepMode:0000000000000000 $t + /tmp/ccjtZjrH.s:711 .text.HAL_DBGMCU_DisableDBGSleepMode:0000000000000000 HAL_DBGMCU_DisableDBGSleepMode + /tmp/ccjtZjrH.s:728 .text.HAL_DBGMCU_DisableDBGSleepMode:000000000000000c $d + /tmp/ccjtZjrH.s:733 .text.HAL_DBGMCU_EnableDBGStopMode:0000000000000000 $t + /tmp/ccjtZjrH.s:739 .text.HAL_DBGMCU_EnableDBGStopMode:0000000000000000 HAL_DBGMCU_EnableDBGStopMode + /tmp/ccjtZjrH.s:756 .text.HAL_DBGMCU_EnableDBGStopMode:000000000000000c $d + /tmp/ccjtZjrH.s:761 .text.HAL_DBGMCU_DisableDBGStopMode:0000000000000000 $t + /tmp/ccjtZjrH.s:767 .text.HAL_DBGMCU_DisableDBGStopMode:0000000000000000 HAL_DBGMCU_DisableDBGStopMode + /tmp/ccjtZjrH.s:784 .text.HAL_DBGMCU_DisableDBGStopMode:000000000000000c $d + /tmp/ccjtZjrH.s:789 .text.HAL_DBGMCU_EnableDBGStandbyMode:0000000000000000 $t + /tmp/ccjtZjrH.s:795 .text.HAL_DBGMCU_EnableDBGStandbyMode:0000000000000000 HAL_DBGMCU_EnableDBGStandbyMode + /tmp/ccjtZjrH.s:812 .text.HAL_DBGMCU_EnableDBGStandbyMode:000000000000000c $d + /tmp/ccjtZjrH.s:817 .text.HAL_DBGMCU_DisableDBGStandbyMode:0000000000000000 $t + /tmp/ccjtZjrH.s:823 .text.HAL_DBGMCU_DisableDBGStandbyMode:0000000000000000 HAL_DBGMCU_DisableDBGStandbyMode + /tmp/ccjtZjrH.s:840 .text.HAL_DBGMCU_DisableDBGStandbyMode:000000000000000c $d + /tmp/ccjtZjrH.s:852 .data.uwTickPrio:0000000000000000 $d + /tmp/ccjtZjrH.s:859 .bss.uwTick:0000000000000000 $d + +UNDEFINED SYMBOLS +HAL_SYSTICK_Config +HAL_NVIC_SetPriority +SystemCoreClock +HAL_NVIC_SetPriorityGrouping diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal.o b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal.o new file mode 100644 index 0000000000000000000000000000000000000000..c785bfa57d747bbb2480a923d2dcaea7a0d7b9aa GIT binary patch literal 16968 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 literal 0 HcmV?d00001 diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_can.d b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_can.d new file mode 100644 index 0000000..23951ad --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_can.d @@ -0,0 +1,58 @@ +build/stm32f3xx_hal_can.o: \ + Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h \ + Core/Inc/stm32f3xx_hal_conf.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h \ + Drivers/CMSIS/Include/core_cm4.h Drivers/CMSIS/Include/cmsis_version.h \ + Drivers/CMSIS/Include/cmsis_compiler.h Drivers/CMSIS/Include/cmsis_gcc.h \ + Drivers/CMSIS/Include/mpu_armv7.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h: +Core/Inc/stm32f3xx_hal_conf.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h: +Drivers/CMSIS/Include/core_cm4.h: +Drivers/CMSIS/Include/cmsis_version.h: +Drivers/CMSIS/Include/cmsis_compiler.h: +Drivers/CMSIS/Include/cmsis_gcc.h: +Drivers/CMSIS/Include/mpu_armv7.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h: +Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h: diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_can.lst b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_can.lst new file mode 100644 index 0000000..4498c80 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_can.lst @@ -0,0 +1,7264 @@ +ARM GAS /tmp/ccqPwHQi.s page 1 + + + 1 .cpu cortex-m4 + 2 .arch armv7e-m + 3 .fpu fpv4-sp-d16 + 4 .eabi_attribute 27, 1 + 5 .eabi_attribute 28, 1 + 6 .eabi_attribute 20, 1 + 7 .eabi_attribute 21, 1 + 8 .eabi_attribute 23, 3 + 9 .eabi_attribute 24, 1 + 10 .eabi_attribute 25, 1 + 11 .eabi_attribute 26, 1 + 12 .eabi_attribute 30, 1 + 13 .eabi_attribute 34, 1 + 14 .eabi_attribute 18, 4 + 15 .file "stm32f3xx_hal_can.c" + 16 .text + 17 .Ltext0: + 18 .cfi_sections .debug_frame + 19 .file 1 "Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c" + 20 .section .text.HAL_CAN_MspInit,"ax",%progbits + 21 .align 1 + 22 .weak HAL_CAN_MspInit + 23 .syntax unified + 24 .thumb + 25 .thumb_func + 27 HAL_CAN_MspInit: + 28 .LVL0: + 29 .LFB132: + 1:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** + 2:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ****************************************************************************** + 3:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @file stm32f3xx_hal_can.c + 4:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @author MCD Application Team + 5:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief CAN HAL module driver. + 6:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * This file provides firmware functions to manage the following + 7:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * functionalities of the Controller Area Network (CAN) peripheral: + 8:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * + Initialization and de-initialization functions + 9:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * + Configuration functions + 10:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * + Control functions + 11:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * + Interrupts management + 12:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * + Callbacks functions + 13:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * + Peripheral State and Error functions + 14:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * + 15:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** @verbatim + 16:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ============================================================================== + 17:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ##### How to use this driver ##### + 18:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ============================================================================== + 19:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** [..] + 20:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (#) Initialize the CAN low level resources by implementing the + 21:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_MspInit(): + 22:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (++) Enable the CAN interface clock using __HAL_RCC_CANx_CLK_ENABLE() + 23:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (++) Configure CAN pins + 24:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+++) Enable the clock for the CAN GPIOs + 25:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+++) Configure CAN pins as alternate function open-drain + 26:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (++) In case of using interrupts (e.g. HAL_CAN_ActivateNotification()) + 27:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+++) Configure the CAN interrupt priority using + 28:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_NVIC_SetPriority() + 29:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+++) Enable the CAN IRQ handler using HAL_NVIC_EnableIRQ() + ARM GAS /tmp/ccqPwHQi.s page 2 + + + 30:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+++) In CAN IRQ handler, call HAL_CAN_IRQHandler() + 31:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 32:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (#) Initialize the CAN peripheral using HAL_CAN_Init() function. This + 33:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** function resorts to HAL_CAN_MspInit() for low-level initialization. + 34:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 35:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (#) Configure the reception filters using the following configuration + 36:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** functions: + 37:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (++) HAL_CAN_ConfigFilter() + 38:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 39:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (#) Start the CAN module using HAL_CAN_Start() function. At this level + 40:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** the node is active on the bus: it receive messages, and can send + 41:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** messages. + 42:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 43:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (#) To manage messages transmission, the following Tx control functions + 44:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** can be used: + 45:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (++) HAL_CAN_AddTxMessage() to request transmission of a new + 46:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** message. + 47:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (++) HAL_CAN_AbortTxRequest() to abort transmission of a pending + 48:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** message. + 49:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (++) HAL_CAN_GetTxMailboxesFreeLevel() to get the number of free Tx + 50:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** mailboxes. + 51:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (++) HAL_CAN_IsTxMessagePending() to check if a message is pending + 52:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** in a Tx mailbox. + 53:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (++) HAL_CAN_GetTxTimestamp() to get the timestamp of Tx message + 54:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** sent, if time triggered communication mode is enabled. + 55:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 56:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (#) When a message is received into the CAN Rx FIFOs, it can be retrieved + 57:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** using the HAL_CAN_GetRxMessage() function. The function + 58:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_GetRxFifoFillLevel() allows to know how many Rx message are + 59:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** stored in the Rx Fifo. + 60:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 61:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (#) Calling the HAL_CAN_Stop() function stops the CAN module. + 62:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 63:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (#) The deinitialization is achieved with HAL_CAN_DeInit() function. + 64:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 65:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 66:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** *** Polling mode operation *** + 67:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ============================== + 68:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** [..] + 69:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (#) Reception: + 70:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (++) Monitor reception of message using HAL_CAN_GetRxFifoFillLevel() + 71:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** until at least one message is received. + 72:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (++) Then get the message using HAL_CAN_GetRxMessage(). + 73:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 74:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (#) Transmission: + 75:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (++) Monitor the Tx mailboxes availability until at least one Tx + 76:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** mailbox is free, using HAL_CAN_GetTxMailboxesFreeLevel(). + 77:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (++) Then request transmission of a message using + 78:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_AddTxMessage(). + 79:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 80:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 81:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** *** Interrupt mode operation *** + 82:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ================================ + 83:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** [..] + 84:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (#) Notifications are activated using HAL_CAN_ActivateNotification() + 85:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** function. Then, the process can be controlled through the + 86:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** available user callbacks: HAL_CAN_xxxCallback(), using same APIs + ARM GAS /tmp/ccqPwHQi.s page 3 + + + 87:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_GetRxMessage() and HAL_CAN_AddTxMessage(). + 88:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 89:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (#) Notifications can be deactivated using + 90:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_DeactivateNotification() function. + 91:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 92:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (#) Special care should be taken for CAN_IT_RX_FIFO0_MSG_PENDING and + 93:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** CAN_IT_RX_FIFO1_MSG_PENDING notifications. These notifications trig + 94:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** the callbacks HAL_CAN_RxFIFO0MsgPendingCallback() and + 95:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_RxFIFO1MsgPendingCallback(). User has two possible options + 96:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** here. + 97:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (++) Directly get the Rx message in the callback, using + 98:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_GetRxMessage(). + 99:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (++) Or deactivate the notification in the callback without + 100:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** getting the Rx message. The Rx message can then be got later + 101:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** using HAL_CAN_GetRxMessage(). Once the Rx message have been + 102:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** read, the notification can be activated again. + 103:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 105:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** *** Sleep mode *** + 106:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ================== + 107:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** [..] + 108:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (#) The CAN peripheral can be put in sleep mode (low power), using + 109:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_RequestSleep(). The sleep mode will be entered as soon as the + 110:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** current CAN activity (transmission or reception of a CAN frame) will + 111:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** be completed. + 112:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 113:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (#) A notification can be activated to be informed when the sleep mode + 114:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** will be entered. + 115:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 116:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (#) It can be checked if the sleep mode is entered using + 117:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_IsSleepActive(). + 118:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** Note that the CAN state (accessible from the API HAL_CAN_GetState()) + 119:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** is HAL_CAN_STATE_SLEEP_PENDING as soon as the sleep mode request is + 120:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** submitted (the sleep mode is not yet entered), and become + 121:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_STATE_SLEEP_ACTIVE when the sleep mode is effective. + 122:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (#) The wake-up from sleep mode can be triggered by two ways: + 124:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (++) Using HAL_CAN_WakeUp(). When returning from this function, + 125:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** the sleep mode is exited (if return status is HAL_OK). + 126:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (++) When a start of Rx CAN frame is detected by the CAN peripheral, + 127:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if automatic wake up mode is enabled. + 128:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 129:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** *** Callback registration *** + 130:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ============================================= + 131:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 132:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** The compilation define USE_HAL_CAN_REGISTER_CALLBACKS when set to 1 + 133:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** allows the user to configure dynamically the driver callbacks. + 134:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** Use Function HAL_CAN_RegisterCallback() to register an interrupt callback. + 135:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 136:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** Function HAL_CAN_RegisterCallback() allows to register following callbacks: + 137:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) TxMailbox0CompleteCallback : Tx Mailbox 0 Complete Callback. + 138:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) TxMailbox1CompleteCallback : Tx Mailbox 1 Complete Callback. + 139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) TxMailbox2CompleteCallback : Tx Mailbox 2 Complete Callback. + 140:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) TxMailbox0AbortCallback : Tx Mailbox 0 Abort Callback. + 141:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) TxMailbox1AbortCallback : Tx Mailbox 1 Abort Callback. + 142:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) TxMailbox2AbortCallback : Tx Mailbox 2 Abort Callback. + 143:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) RxFifo0MsgPendingCallback : Rx Fifo 0 Message Pending Callback. + ARM GAS /tmp/ccqPwHQi.s page 4 + + + 144:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) RxFifo0FullCallback : Rx Fifo 0 Full Callback. + 145:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) RxFifo1MsgPendingCallback : Rx Fifo 1 Message Pending Callback. + 146:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) RxFifo1FullCallback : Rx Fifo 1 Full Callback. + 147:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) SleepCallback : Sleep Callback. + 148:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) WakeUpFromRxMsgCallback : Wake Up From Rx Message Callback. + 149:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) ErrorCallback : Error Callback. + 150:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) MspInitCallback : CAN MspInit. + 151:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) MspDeInitCallback : CAN MspDeInit. + 152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** This function takes as parameters the HAL peripheral handle, the Callback ID + 153:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** and a pointer to the user callback function. + 154:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 155:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** Use function HAL_CAN_UnRegisterCallback() to reset a callback to the default + 156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** weak function. + 157:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_UnRegisterCallback takes as parameters the HAL peripheral handle, + 158:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** and the Callback ID. + 159:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** This function allows to reset following callbacks: + 160:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) TxMailbox0CompleteCallback : Tx Mailbox 0 Complete Callback. + 161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) TxMailbox1CompleteCallback : Tx Mailbox 1 Complete Callback. + 162:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) TxMailbox2CompleteCallback : Tx Mailbox 2 Complete Callback. + 163:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) TxMailbox0AbortCallback : Tx Mailbox 0 Abort Callback. + 164:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) TxMailbox1AbortCallback : Tx Mailbox 1 Abort Callback. + 165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) TxMailbox2AbortCallback : Tx Mailbox 2 Abort Callback. + 166:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) RxFifo0MsgPendingCallback : Rx Fifo 0 Message Pending Callback. + 167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) RxFifo0FullCallback : Rx Fifo 0 Full Callback. + 168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) RxFifo1MsgPendingCallback : Rx Fifo 1 Message Pending Callback. + 169:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) RxFifo1FullCallback : Rx Fifo 1 Full Callback. + 170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) SleepCallback : Sleep Callback. + 171:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) WakeUpFromRxMsgCallback : Wake Up From Rx Message Callback. + 172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) ErrorCallback : Error Callback. + 173:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) MspInitCallback : CAN MspInit. + 174:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) MspDeInitCallback : CAN MspDeInit. + 175:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 176:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** By default, after the HAL_CAN_Init() and when the state is HAL_CAN_STATE_RESET, + 177:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** all callbacks are set to the corresponding weak functions: + 178:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** example HAL_CAN_ErrorCallback(). + 179:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** Exception done for MspInit and MspDeInit functions that are + 180:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** reset to the legacy weak function in the HAL_CAN_Init()/ HAL_CAN_DeInit() only when + 181:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** these callbacks are null (not registered beforehand). + 182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if not, MspInit or MspDeInit are not null, the HAL_CAN_Init()/ HAL_CAN_DeInit() + 183:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** keep and use the user MspInit/MspDeInit callbacks (registered beforehand) + 184:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 185:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** Callbacks can be registered/unregistered in HAL_CAN_STATE_READY state only. + 186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** Exception done MspInit/MspDeInit that can be registered/unregistered + 187:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** in HAL_CAN_STATE_READY or HAL_CAN_STATE_RESET state, + 188:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** thus registered (user) MspInit/DeInit callbacks can be used during the Init/DeInit. + 189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** In that case first register the MspInit/MspDeInit user callbacks + 190:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** using HAL_CAN_RegisterCallback() before calling HAL_CAN_DeInit() + 191:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** or HAL_CAN_Init() function. + 192:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 193:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** When The compilation define USE_HAL_CAN_REGISTER_CALLBACKS is set to 0 or + 194:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** not defined, the callback registration feature is not available and all callbacks + 195:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** are set to the corresponding weak functions. + 196:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 197:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** @endverbatim + 198:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ****************************************************************************** + 199:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @attention + 200:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * + ARM GAS /tmp/ccqPwHQi.s page 5 + + + 201:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** *

    © Copyright (c) 2016 STMicroelectronics. + 202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * All rights reserved.

    + 203:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * + 204:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * This software component is licensed by ST under BSD 3-Clause license, + 205:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * the "License"; You may not use this file except in compliance with the + 206:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * License. You may obtain a copy of the License at: + 207:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * opensource.org/licenses/BSD-3-Clause + 208:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * + 209:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ****************************************************************************** + 210:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ + 211:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 212:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Includes ------------------------------------------------------------------*/ + 213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #include "stm32f3xx_hal.h" + 214:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 215:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** @addtogroup STM32F3xx_HAL_Driver + 216:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @{ + 217:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ + 218:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 219:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #if defined(CAN) + 220:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 221:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** @defgroup CAN CAN + 222:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief CAN driver modules + 223:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @{ + 224:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ + 225:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 226:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #ifdef HAL_CAN_MODULE_ENABLED + 227:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 228:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #ifdef HAL_CAN_LEGACY_MODULE_ENABLED + 229:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #error "The CAN driver cannot be used with its legacy, Please enable only one CAN module at once" + 230:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #endif + 231:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 232:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Private typedef -----------------------------------------------------------*/ + 233:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Private define ------------------------------------------------------------*/ + 234:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** @defgroup CAN_Private_Constants CAN Private Constants + 235:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @{ + 236:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ + 237:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #define CAN_TIMEOUT_VALUE 10U + 238:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** + 239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @} + 240:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ + 241:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Private macro -------------------------------------------------------------*/ + 242:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Private variables ---------------------------------------------------------*/ + 243:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Private function prototypes -----------------------------------------------*/ + 244:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Exported functions --------------------------------------------------------*/ + 245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 246:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** @defgroup CAN_Exported_Functions CAN Exported Functions + 247:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @{ + 248:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ + 249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 250:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** @defgroup CAN_Exported_Functions_Group1 Initialization and de-initialization functions + 251:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief Initialization and Configuration functions + 252:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * + 253:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** @verbatim + 254:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ============================================================================== + 255:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ##### Initialization and de-initialization functions ##### + 256:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ============================================================================== + 257:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** [..] This section provides functions allowing to: + ARM GAS /tmp/ccqPwHQi.s page 6 + + + 258:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) HAL_CAN_Init : Initialize and configure the CAN. + 259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) HAL_CAN_DeInit : De-initialize the CAN. + 260:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) HAL_CAN_MspInit : Initialize the CAN MSP. + 261:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) HAL_CAN_MspDeInit : DeInitialize the CAN MSP. + 262:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 263:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** @endverbatim + 264:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @{ + 265:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ + 266:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 267:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** + 268:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief Initializes the CAN peripheral according to the specified + 269:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * parameters in the CAN_InitStruct. + 270:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param hcan pointer to a CAN_HandleTypeDef structure that contains + 271:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * the configuration information for the specified CAN. + 272:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @retval HAL status + 273:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ + 274:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_StatusTypeDef HAL_CAN_Init(CAN_HandleTypeDef *hcan) + 275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t tickstart; + 277:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 278:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Check CAN handle */ + 279:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if (hcan == NULL) + 280:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 281:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** return HAL_ERROR; + 282:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 283:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 284:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Check the parameters */ + 285:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_CAN_ALL_INSTANCE(hcan->Instance)); + 286:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_FUNCTIONAL_STATE(hcan->Init.TimeTriggeredMode)); + 287:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_FUNCTIONAL_STATE(hcan->Init.AutoBusOff)); + 288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_FUNCTIONAL_STATE(hcan->Init.AutoWakeUp)); + 289:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_FUNCTIONAL_STATE(hcan->Init.AutoRetransmission)); + 290:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_FUNCTIONAL_STATE(hcan->Init.ReceiveFifoLocked)); + 291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_FUNCTIONAL_STATE(hcan->Init.TransmitFifoPriority)); + 292:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_CAN_MODE(hcan->Init.Mode)); + 293:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_CAN_SJW(hcan->Init.SyncJumpWidth)); + 294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_CAN_BS1(hcan->Init.TimeSeg1)); + 295:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_CAN_BS2(hcan->Init.TimeSeg2)); + 296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_CAN_PRESCALER(hcan->Init.Prescaler)); + 297:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 298:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + 299:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if (hcan->State == HAL_CAN_STATE_RESET) + 300:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 301:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Reset callbacks to legacy functions */ + 302:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->RxFifo0MsgPendingCallback = HAL_CAN_RxFifo0MsgPendingCallback; /* Legacy weak RxFifo0M + 303:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->RxFifo0FullCallback = HAL_CAN_RxFifo0FullCallback; /* Legacy weak RxFifo0F + 304:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->RxFifo1MsgPendingCallback = HAL_CAN_RxFifo1MsgPendingCallback; /* Legacy weak RxFifo1M + 305:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->RxFifo1FullCallback = HAL_CAN_RxFifo1FullCallback; /* Legacy weak RxFifo1F + 306:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->TxMailbox0CompleteCallback = HAL_CAN_TxMailbox0CompleteCallback; /* Legacy weak TxMailbo + 307:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->TxMailbox1CompleteCallback = HAL_CAN_TxMailbox1CompleteCallback; /* Legacy weak TxMailbo + 308:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->TxMailbox2CompleteCallback = HAL_CAN_TxMailbox2CompleteCallback; /* Legacy weak TxMailbo + 309:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->TxMailbox0AbortCallback = HAL_CAN_TxMailbox0AbortCallback; /* Legacy weak TxMailbo + 310:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->TxMailbox1AbortCallback = HAL_CAN_TxMailbox1AbortCallback; /* Legacy weak TxMailbo + 311:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->TxMailbox2AbortCallback = HAL_CAN_TxMailbox2AbortCallback; /* Legacy weak TxMailbo + 312:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->SleepCallback = HAL_CAN_SleepCallback; /* Legacy weak SleepCal + 313:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->WakeUpFromRxMsgCallback = HAL_CAN_WakeUpFromRxMsgCallback; /* Legacy weak WakeUpFr + 314:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->ErrorCallback = HAL_CAN_ErrorCallback; /* Legacy weak ErrorCal + ARM GAS /tmp/ccqPwHQi.s page 7 + + + 315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 316:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if (hcan->MspInitCallback == NULL) + 317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 318:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->MspInitCallback = HAL_CAN_MspInit; /* Legacy weak MspInit */ + 319:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 320:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 321:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Init the low level hardware: CLOCK, NVIC */ + 322:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->MspInitCallback(hcan); + 323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 324:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 325:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #else + 326:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if (hcan->State == HAL_CAN_STATE_RESET) + 327:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 328:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Init the low level hardware: CLOCK, NVIC */ + 329:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_MspInit(hcan); + 330:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 331:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #endif /* (USE_HAL_CAN_REGISTER_CALLBACKS) */ + 332:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 333:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Request initialisation */ + 334:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** SET_BIT(hcan->Instance->MCR, CAN_MCR_INRQ); + 335:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Get tick */ + 337:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** tickstart = HAL_GetTick(); + 338:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 339:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Wait initialisation acknowledge */ + 340:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** while ((hcan->Instance->MSR & CAN_MSR_INAK) == 0U) + 341:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 342:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE) + 343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 344:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Update error code */ + 345:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->ErrorCode |= HAL_CAN_ERROR_TIMEOUT; + 346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 347:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Change CAN state */ + 348:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->State = HAL_CAN_STATE_ERROR; + 349:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 350:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** return HAL_ERROR; + 351:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 352:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 353:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 354:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Exit from sleep mode */ + 355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_SLEEP); + 356:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 357:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Get tick */ + 358:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** tickstart = HAL_GetTick(); + 359:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 360:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Check Sleep mode leave acknowledge */ + 361:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** while ((hcan->Instance->MSR & CAN_MSR_SLAK) != 0U) + 362:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 363:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE) + 364:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Update error code */ + 366:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->ErrorCode |= HAL_CAN_ERROR_TIMEOUT; + 367:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 368:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Change CAN state */ + 369:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->State = HAL_CAN_STATE_ERROR; + 370:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 371:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** return HAL_ERROR; + ARM GAS /tmp/ccqPwHQi.s page 8 + + + 372:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 374:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 375:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Set the time triggered communication mode */ + 376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if (hcan->Init.TimeTriggeredMode == ENABLE) + 377:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 378:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** SET_BIT(hcan->Instance->MCR, CAN_MCR_TTCM); + 379:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 380:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** else + 381:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 382:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_TTCM); + 383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 384:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Set the automatic bus-off management */ + 386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if (hcan->Init.AutoBusOff == ENABLE) + 387:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 388:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** SET_BIT(hcan->Instance->MCR, CAN_MCR_ABOM); + 389:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 390:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** else + 391:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 392:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_ABOM); + 393:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 394:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 395:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Set the automatic wake-up mode */ + 396:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if (hcan->Init.AutoWakeUp == ENABLE) + 397:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 398:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** SET_BIT(hcan->Instance->MCR, CAN_MCR_AWUM); + 399:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 400:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** else + 401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 402:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_AWUM); + 403:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 404:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 405:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Set the automatic retransmission */ + 406:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if (hcan->Init.AutoRetransmission == ENABLE) + 407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 408:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_NART); + 409:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 410:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** else + 411:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 412:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** SET_BIT(hcan->Instance->MCR, CAN_MCR_NART); + 413:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 414:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 415:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Set the receive FIFO locked mode */ + 416:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if (hcan->Init.ReceiveFifoLocked == ENABLE) + 417:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 418:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** SET_BIT(hcan->Instance->MCR, CAN_MCR_RFLM); + 419:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 420:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** else + 421:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 422:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_RFLM); + 423:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 424:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 425:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Set the transmit FIFO priority */ + 426:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if (hcan->Init.TransmitFifoPriority == ENABLE) + 427:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 428:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** SET_BIT(hcan->Instance->MCR, CAN_MCR_TXFP); + ARM GAS /tmp/ccqPwHQi.s page 9 + + + 429:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 430:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** else + 431:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 432:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_TXFP); + 433:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 434:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 435:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Set the bit timing register */ + 436:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** WRITE_REG(hcan->Instance->BTR, (uint32_t)(hcan->Init.Mode | + 437:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->Init.SyncJumpWidth | + 438:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->Init.TimeSeg1 | + 439:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->Init.TimeSeg2 | + 440:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (hcan->Init.Prescaler - 1U))); + 441:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 442:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Initialize the error code */ + 443:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->ErrorCode = HAL_CAN_ERROR_NONE; + 444:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 445:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Initialize the CAN state */ + 446:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->State = HAL_CAN_STATE_READY; + 447:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 448:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Return function status */ + 449:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** return HAL_OK; + 450:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 451:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 452:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** + 453:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief Deinitializes the CAN peripheral registers to their default + 454:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * reset values. + 455:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param hcan pointer to a CAN_HandleTypeDef structure that contains + 456:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * the configuration information for the specified CAN. + 457:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @retval HAL status + 458:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ + 459:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_StatusTypeDef HAL_CAN_DeInit(CAN_HandleTypeDef *hcan) + 460:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 461:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Check CAN handle */ + 462:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if (hcan == NULL) + 463:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 464:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** return HAL_ERROR; + 465:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 466:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 467:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Check the parameters */ + 468:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_CAN_ALL_INSTANCE(hcan->Instance)); + 469:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 470:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Stop the CAN module */ + 471:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (void)HAL_CAN_Stop(hcan); + 472:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 473:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + 474:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if (hcan->MspDeInitCallback == NULL) + 475:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 476:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->MspDeInitCallback = HAL_CAN_MspDeInit; /* Legacy weak MspDeInit */ + 477:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 478:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 479:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* DeInit the low level hardware: CLOCK, NVIC */ + 480:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->MspDeInitCallback(hcan); + 481:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 482:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #else + 483:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* DeInit the low level hardware: CLOCK, NVIC */ + 484:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_MspDeInit(hcan); + 485:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #endif /* (USE_HAL_CAN_REGISTER_CALLBACKS) */ + ARM GAS /tmp/ccqPwHQi.s page 10 + + + 486:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 487:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Reset the CAN peripheral */ + 488:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** SET_BIT(hcan->Instance->MCR, CAN_MCR_RESET); + 489:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 490:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Reset the CAN ErrorCode */ + 491:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->ErrorCode = HAL_CAN_ERROR_NONE; + 492:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 493:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Change CAN state */ + 494:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->State = HAL_CAN_STATE_RESET; + 495:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 496:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Return function status */ + 497:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** return HAL_OK; + 498:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 499:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 500:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** + 501:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief Initializes the CAN MSP. + 502:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param hcan pointer to a CAN_HandleTypeDef structure that contains + 503:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * the configuration information for the specified CAN. + 504:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @retval None + 505:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ + 506:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** __weak void HAL_CAN_MspInit(CAN_HandleTypeDef *hcan) + 507:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 30 .loc 1 507 1 view -0 + 31 .cfi_startproc + 32 @ args = 0, pretend = 0, frame = 0 + 33 @ frame_needed = 0, uses_anonymous_args = 0 + 34 @ link register save eliminated. + 508:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Prevent unused argument(s) compilation warning */ + 509:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** UNUSED(hcan); + 35 .loc 1 509 3 view .LVU1 + 510:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 511:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* NOTE : This function Should not be modified, when the callback is needed, + 512:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** the HAL_CAN_MspInit could be implemented in the user file + 513:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ + 514:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 36 .loc 1 514 1 is_stmt 0 view .LVU2 + 37 0000 7047 bx lr + 38 .cfi_endproc + 39 .LFE132: + 41 .section .text.HAL_CAN_Init,"ax",%progbits + 42 .align 1 + 43 .global HAL_CAN_Init + 44 .syntax unified + 45 .thumb + 46 .thumb_func + 48 HAL_CAN_Init: + 49 .LVL1: + 50 .LFB130: + 275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t tickstart; + 51 .loc 1 275 1 is_stmt 1 view -0 + 52 .cfi_startproc + 53 @ args = 0, pretend = 0, frame = 0 + 54 @ frame_needed = 0, uses_anonymous_args = 0 + 276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 55 .loc 1 276 3 view .LVU4 + 279:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 56 .loc 1 279 3 view .LVU5 + ARM GAS /tmp/ccqPwHQi.s page 11 + + + 279:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 57 .loc 1 279 6 is_stmt 0 view .LVU6 + 58 0000 0028 cmp r0, #0 + 59 0002 00F0A180 beq .L21 + 275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t tickstart; + 60 .loc 1 275 1 view .LVU7 + 61 0006 38B5 push {r3, r4, r5, lr} + 62 .cfi_def_cfa_offset 16 + 63 .cfi_offset 3, -16 + 64 .cfi_offset 4, -12 + 65 .cfi_offset 5, -8 + 66 .cfi_offset 14, -4 + 67 0008 0446 mov r4, r0 + 285:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_FUNCTIONAL_STATE(hcan->Init.TimeTriggeredMode)); + 68 .loc 1 285 3 is_stmt 1 view .LVU8 + 286:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_FUNCTIONAL_STATE(hcan->Init.AutoBusOff)); + 69 .loc 1 286 3 view .LVU9 + 287:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_FUNCTIONAL_STATE(hcan->Init.AutoWakeUp)); + 70 .loc 1 287 3 view .LVU10 + 288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_FUNCTIONAL_STATE(hcan->Init.AutoRetransmission)); + 71 .loc 1 288 3 view .LVU11 + 289:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_FUNCTIONAL_STATE(hcan->Init.ReceiveFifoLocked)); + 72 .loc 1 289 3 view .LVU12 + 290:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_FUNCTIONAL_STATE(hcan->Init.TransmitFifoPriority)); + 73 .loc 1 290 3 view .LVU13 + 291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_CAN_MODE(hcan->Init.Mode)); + 74 .loc 1 291 3 view .LVU14 + 292:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_CAN_SJW(hcan->Init.SyncJumpWidth)); + 75 .loc 1 292 3 view .LVU15 + 293:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_CAN_BS1(hcan->Init.TimeSeg1)); + 76 .loc 1 293 3 view .LVU16 + 294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_CAN_BS2(hcan->Init.TimeSeg2)); + 77 .loc 1 294 3 view .LVU17 + 295:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_CAN_PRESCALER(hcan->Init.Prescaler)); + 78 .loc 1 295 3 view .LVU18 + 296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 79 .loc 1 296 3 view .LVU19 + 326:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 80 .loc 1 326 3 view .LVU20 + 326:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 81 .loc 1 326 11 is_stmt 0 view .LVU21 + 82 000a 90F82030 ldrb r3, [r0, #32] @ zero_extendqisi2 + 326:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 83 .loc 1 326 6 view .LVU22 + 84 000e D3B1 cbz r3, .L26 + 85 .LVL2: + 86 .L4: + 334:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 87 .loc 1 334 3 is_stmt 1 view .LVU23 + 88 0010 2268 ldr r2, [r4] + 89 0012 1368 ldr r3, [r2] + 90 0014 43F00103 orr r3, r3, #1 + 91 0018 1360 str r3, [r2] + 337:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 92 .loc 1 337 3 view .LVU24 + 337:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 93 .loc 1 337 15 is_stmt 0 view .LVU25 + ARM GAS /tmp/ccqPwHQi.s page 12 + + + 94 001a FFF7FEFF bl HAL_GetTick + 95 .LVL3: + 96 001e 0546 mov r5, r0 + 97 .LVL4: + 340:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 98 .loc 1 340 3 is_stmt 1 view .LVU26 + 99 .L5: + 340:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 100 .loc 1 340 47 view .LVU27 + 340:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 101 .loc 1 340 15 is_stmt 0 view .LVU28 + 102 0020 2368 ldr r3, [r4] + 340:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 103 .loc 1 340 25 view .LVU29 + 104 0022 5A68 ldr r2, [r3, #4] + 340:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 105 .loc 1 340 47 view .LVU30 + 106 0024 12F0010F tst r2, #1 + 107 0028 10D1 bne .L27 + 342:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 108 .loc 1 342 5 is_stmt 1 view .LVU31 + 342:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 109 .loc 1 342 10 is_stmt 0 view .LVU32 + 110 002a FFF7FEFF bl HAL_GetTick + 111 .LVL5: + 342:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 112 .loc 1 342 24 view .LVU33 + 113 002e 401B subs r0, r0, r5 + 342:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 114 .loc 1 342 8 view .LVU34 + 115 0030 0A28 cmp r0, #10 + 116 0032 F5D9 bls .L5 + 345:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 117 .loc 1 345 7 is_stmt 1 view .LVU35 + 345:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 118 .loc 1 345 11 is_stmt 0 view .LVU36 + 119 0034 636A ldr r3, [r4, #36] + 345:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 120 .loc 1 345 23 view .LVU37 + 121 0036 43F40033 orr r3, r3, #131072 + 122 003a 6362 str r3, [r4, #36] + 348:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 123 .loc 1 348 7 is_stmt 1 view .LVU38 + 348:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 124 .loc 1 348 19 is_stmt 0 view .LVU39 + 125 003c 0523 movs r3, #5 + 126 003e 84F82030 strb r3, [r4, #32] + 350:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 127 .loc 1 350 7 is_stmt 1 view .LVU40 + 350:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 128 .loc 1 350 14 is_stmt 0 view .LVU41 + 129 0042 0120 movs r0, #1 + 130 .L3: + 450:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 131 .loc 1 450 1 view .LVU42 + 132 0044 38BD pop {r3, r4, r5, pc} + 133 .LVL6: + ARM GAS /tmp/ccqPwHQi.s page 13 + + + 134 .L26: + 329:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 135 .loc 1 329 5 is_stmt 1 view .LVU43 + 136 0046 FFF7FEFF bl HAL_CAN_MspInit + 137 .LVL7: + 329:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 138 .loc 1 329 5 is_stmt 0 view .LVU44 + 139 004a E1E7 b .L4 + 140 .LVL8: + 141 .L27: + 355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 142 .loc 1 355 3 is_stmt 1 view .LVU45 + 143 004c 1A68 ldr r2, [r3] + 144 004e 22F00202 bic r2, r2, #2 + 145 0052 1A60 str r2, [r3] + 358:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 146 .loc 1 358 3 view .LVU46 + 358:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 147 .loc 1 358 15 is_stmt 0 view .LVU47 + 148 0054 FFF7FEFF bl HAL_GetTick + 149 .LVL9: + 150 0058 0546 mov r5, r0 + 151 .LVL10: + 361:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 152 .loc 1 361 3 is_stmt 1 view .LVU48 + 153 .L7: + 361:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 154 .loc 1 361 47 view .LVU49 + 361:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 155 .loc 1 361 15 is_stmt 0 view .LVU50 + 156 005a 2368 ldr r3, [r4] + 361:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 157 .loc 1 361 25 view .LVU51 + 158 005c 5A68 ldr r2, [r3, #4] + 361:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 159 .loc 1 361 47 view .LVU52 + 160 005e 12F0020F tst r2, #2 + 161 0062 0DD0 beq .L28 + 363:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 162 .loc 1 363 5 is_stmt 1 view .LVU53 + 363:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 163 .loc 1 363 10 is_stmt 0 view .LVU54 + 164 0064 FFF7FEFF bl HAL_GetTick + 165 .LVL11: + 363:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 166 .loc 1 363 24 view .LVU55 + 167 0068 401B subs r0, r0, r5 + 363:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 168 .loc 1 363 8 view .LVU56 + 169 006a 0A28 cmp r0, #10 + 170 006c F5D9 bls .L7 + 366:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 171 .loc 1 366 7 is_stmt 1 view .LVU57 + 366:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 172 .loc 1 366 11 is_stmt 0 view .LVU58 + 173 006e 636A ldr r3, [r4, #36] + 366:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + ARM GAS /tmp/ccqPwHQi.s page 14 + + + 174 .loc 1 366 23 view .LVU59 + 175 0070 43F40033 orr r3, r3, #131072 + 176 0074 6362 str r3, [r4, #36] + 369:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 177 .loc 1 369 7 is_stmt 1 view .LVU60 + 369:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 178 .loc 1 369 19 is_stmt 0 view .LVU61 + 179 0076 0523 movs r3, #5 + 180 0078 84F82030 strb r3, [r4, #32] + 371:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 181 .loc 1 371 7 is_stmt 1 view .LVU62 + 371:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 182 .loc 1 371 14 is_stmt 0 view .LVU63 + 183 007c 0120 movs r0, #1 + 184 007e E1E7 b .L3 + 185 .L28: + 376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 186 .loc 1 376 3 is_stmt 1 view .LVU64 + 376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 187 .loc 1 376 17 is_stmt 0 view .LVU65 + 188 0080 227E ldrb r2, [r4, #24] @ zero_extendqisi2 + 376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 189 .loc 1 376 6 view .LVU66 + 190 0082 012A cmp r2, #1 + 191 0084 3DD0 beq .L29 + 382:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 192 .loc 1 382 5 is_stmt 1 view .LVU67 + 193 0086 1A68 ldr r2, [r3] + 194 0088 22F08002 bic r2, r2, #128 + 195 008c 1A60 str r2, [r3] + 196 .L10: + 386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 197 .loc 1 386 3 view .LVU68 + 386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 198 .loc 1 386 17 is_stmt 0 view .LVU69 + 199 008e 637E ldrb r3, [r4, #25] @ zero_extendqisi2 + 386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 200 .loc 1 386 6 view .LVU70 + 201 0090 012B cmp r3, #1 + 202 0092 3BD0 beq .L30 + 392:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 203 .loc 1 392 5 is_stmt 1 view .LVU71 + 204 0094 2268 ldr r2, [r4] + 205 0096 1368 ldr r3, [r2] + 206 0098 23F04003 bic r3, r3, #64 + 207 009c 1360 str r3, [r2] + 208 .L12: + 396:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 209 .loc 1 396 3 view .LVU72 + 396:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 210 .loc 1 396 17 is_stmt 0 view .LVU73 + 211 009e A37E ldrb r3, [r4, #26] @ zero_extendqisi2 + 396:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 212 .loc 1 396 6 view .LVU74 + 213 00a0 012B cmp r3, #1 + 214 00a2 39D0 beq .L31 + 402:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + ARM GAS /tmp/ccqPwHQi.s page 15 + + + 215 .loc 1 402 5 is_stmt 1 view .LVU75 + 216 00a4 2268 ldr r2, [r4] + 217 00a6 1368 ldr r3, [r2] + 218 00a8 23F02003 bic r3, r3, #32 + 219 00ac 1360 str r3, [r2] + 220 .L14: + 406:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 221 .loc 1 406 3 view .LVU76 + 406:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 222 .loc 1 406 17 is_stmt 0 view .LVU77 + 223 00ae E37E ldrb r3, [r4, #27] @ zero_extendqisi2 + 406:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 224 .loc 1 406 6 view .LVU78 + 225 00b0 012B cmp r3, #1 + 226 00b2 37D0 beq .L32 + 412:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 227 .loc 1 412 5 is_stmt 1 view .LVU79 + 228 00b4 2268 ldr r2, [r4] + 229 00b6 1368 ldr r3, [r2] + 230 00b8 43F01003 orr r3, r3, #16 + 231 00bc 1360 str r3, [r2] + 232 .L16: + 416:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 233 .loc 1 416 3 view .LVU80 + 416:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 234 .loc 1 416 17 is_stmt 0 view .LVU81 + 235 00be 237F ldrb r3, [r4, #28] @ zero_extendqisi2 + 416:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 236 .loc 1 416 6 view .LVU82 + 237 00c0 012B cmp r3, #1 + 238 00c2 35D0 beq .L33 + 422:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 239 .loc 1 422 5 is_stmt 1 view .LVU83 + 240 00c4 2268 ldr r2, [r4] + 241 00c6 1368 ldr r3, [r2] + 242 00c8 23F00803 bic r3, r3, #8 + 243 00cc 1360 str r3, [r2] + 244 .L18: + 426:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 245 .loc 1 426 3 view .LVU84 + 426:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 246 .loc 1 426 17 is_stmt 0 view .LVU85 + 247 00ce 637F ldrb r3, [r4, #29] @ zero_extendqisi2 + 426:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 248 .loc 1 426 6 view .LVU86 + 249 00d0 012B cmp r3, #1 + 250 00d2 33D0 beq .L34 + 432:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 251 .loc 1 432 5 is_stmt 1 view .LVU87 + 252 00d4 2268 ldr r2, [r4] + 253 00d6 1368 ldr r3, [r2] + 254 00d8 23F00403 bic r3, r3, #4 + 255 00dc 1360 str r3, [r2] + 256 .L20: + 436:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->Init.SyncJumpWidth | + 257 .loc 1 436 3 view .LVU88 + 258 00de A368 ldr r3, [r4, #8] + ARM GAS /tmp/ccqPwHQi.s page 16 + + + 259 00e0 E268 ldr r2, [r4, #12] + 260 00e2 1343 orrs r3, r3, r2 + 261 00e4 2269 ldr r2, [r4, #16] + 262 00e6 1343 orrs r3, r3, r2 + 263 00e8 6269 ldr r2, [r4, #20] + 264 00ea 1343 orrs r3, r3, r2 + 265 00ec 6268 ldr r2, [r4, #4] + 266 00ee 013A subs r2, r2, #1 + 267 00f0 2168 ldr r1, [r4] + 268 00f2 1343 orrs r3, r3, r2 + 269 00f4 CB61 str r3, [r1, #28] + 443:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 270 .loc 1 443 3 view .LVU89 + 443:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 271 .loc 1 443 19 is_stmt 0 view .LVU90 + 272 00f6 0020 movs r0, #0 + 273 00f8 6062 str r0, [r4, #36] + 446:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 274 .loc 1 446 3 is_stmt 1 view .LVU91 + 446:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 275 .loc 1 446 15 is_stmt 0 view .LVU92 + 276 00fa 0123 movs r3, #1 + 277 00fc 84F82030 strb r3, [r4, #32] + 449:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 278 .loc 1 449 3 is_stmt 1 view .LVU93 + 449:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 279 .loc 1 449 10 is_stmt 0 view .LVU94 + 280 0100 A0E7 b .L3 + 281 .L29: + 378:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 282 .loc 1 378 5 is_stmt 1 view .LVU95 + 283 0102 1A68 ldr r2, [r3] + 284 0104 42F08002 orr r2, r2, #128 + 285 0108 1A60 str r2, [r3] + 286 010a C0E7 b .L10 + 287 .L30: + 388:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 288 .loc 1 388 5 view .LVU96 + 289 010c 2268 ldr r2, [r4] + 290 010e 1368 ldr r3, [r2] + 291 0110 43F04003 orr r3, r3, #64 + 292 0114 1360 str r3, [r2] + 293 0116 C2E7 b .L12 + 294 .L31: + 398:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 295 .loc 1 398 5 view .LVU97 + 296 0118 2268 ldr r2, [r4] + 297 011a 1368 ldr r3, [r2] + 298 011c 43F02003 orr r3, r3, #32 + 299 0120 1360 str r3, [r2] + 300 0122 C4E7 b .L14 + 301 .L32: + 408:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 302 .loc 1 408 5 view .LVU98 + 303 0124 2268 ldr r2, [r4] + 304 0126 1368 ldr r3, [r2] + 305 0128 23F01003 bic r3, r3, #16 + ARM GAS /tmp/ccqPwHQi.s page 17 + + + 306 012c 1360 str r3, [r2] + 307 012e C6E7 b .L16 + 308 .L33: + 418:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 309 .loc 1 418 5 view .LVU99 + 310 0130 2268 ldr r2, [r4] + 311 0132 1368 ldr r3, [r2] + 312 0134 43F00803 orr r3, r3, #8 + 313 0138 1360 str r3, [r2] + 314 013a C8E7 b .L18 + 315 .L34: + 428:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 316 .loc 1 428 5 view .LVU100 + 317 013c 2268 ldr r2, [r4] + 318 013e 1368 ldr r3, [r2] + 319 0140 43F00403 orr r3, r3, #4 + 320 0144 1360 str r3, [r2] + 321 0146 CAE7 b .L20 + 322 .LVL12: + 323 .L21: + 324 .cfi_def_cfa_offset 0 + 325 .cfi_restore 3 + 326 .cfi_restore 4 + 327 .cfi_restore 5 + 328 .cfi_restore 14 + 281:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 329 .loc 1 281 12 is_stmt 0 view .LVU101 + 330 0148 0120 movs r0, #1 + 331 .LVL13: + 450:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 332 .loc 1 450 1 view .LVU102 + 333 014a 7047 bx lr + 334 .cfi_endproc + 335 .LFE130: + 337 .section .text.HAL_CAN_MspDeInit,"ax",%progbits + 338 .align 1 + 339 .weak HAL_CAN_MspDeInit + 340 .syntax unified + 341 .thumb + 342 .thumb_func + 344 HAL_CAN_MspDeInit: + 345 .LVL14: + 346 .LFB133: + 515:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 516:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** + 517:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief DeInitializes the CAN MSP. + 518:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param hcan pointer to a CAN_HandleTypeDef structure that contains + 519:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * the configuration information for the specified CAN. + 520:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @retval None + 521:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ + 522:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** __weak void HAL_CAN_MspDeInit(CAN_HandleTypeDef *hcan) + 523:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 347 .loc 1 523 1 is_stmt 1 view -0 + 348 .cfi_startproc + 349 @ args = 0, pretend = 0, frame = 0 + 350 @ frame_needed = 0, uses_anonymous_args = 0 + 351 @ link register save eliminated. + ARM GAS /tmp/ccqPwHQi.s page 18 + + + 524:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Prevent unused argument(s) compilation warning */ + 525:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** UNUSED(hcan); + 352 .loc 1 525 3 view .LVU104 + 526:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 527:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* NOTE : This function Should not be modified, when the callback is needed, + 528:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** the HAL_CAN_MspDeInit could be implemented in the user file + 529:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ + 530:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 353 .loc 1 530 1 is_stmt 0 view .LVU105 + 354 0000 7047 bx lr + 355 .cfi_endproc + 356 .LFE133: + 358 .section .text.HAL_CAN_ConfigFilter,"ax",%progbits + 359 .align 1 + 360 .global HAL_CAN_ConfigFilter + 361 .syntax unified + 362 .thumb + 363 .thumb_func + 365 HAL_CAN_ConfigFilter: + 366 .LVL15: + 367 .LFB134: + 531:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 532:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #if USE_HAL_CAN_REGISTER_CALLBACKS == 1 + 533:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** + 534:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief Register a CAN CallBack. + 535:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * To be used instead of the weak predefined callback + 536:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param hcan pointer to a CAN_HandleTypeDef structure that contains + 537:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * the configuration information for CAN module + 538:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param CallbackID ID of the callback to be registered + 539:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * This parameter can be one of the following values: + 540:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @arg @ref HAL_CAN_TX_MAILBOX0_COMPLETE_CB_ID Tx Mailbox 0 Complete callback ID + 541:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @arg @ref HAL_CAN_TX_MAILBOX1_COMPLETE_CB_ID Tx Mailbox 1 Complete callback ID + 542:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @arg @ref HAL_CAN_TX_MAILBOX2_COMPLETE_CB_ID Tx Mailbox 2 Complete callback ID + 543:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @arg @ref HAL_CAN_TX_MAILBOX0_ABORT_CB_ID Tx Mailbox 0 Abort callback ID + 544:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @arg @ref HAL_CAN_TX_MAILBOX1_ABORT_CB_ID Tx Mailbox 1 Abort callback ID + 545:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @arg @ref HAL_CAN_TX_MAILBOX2_ABORT_CB_ID Tx Mailbox 2 Abort callback ID + 546:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @arg @ref HAL_CAN_RX_FIFO0_MSG_PENDING_CB_ID Rx Fifo 0 message pending callback ID + 547:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @arg @ref HAL_CAN_RX_FIFO0_FULL_CB_ID Rx Fifo 0 full callback ID + 548:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @arg @ref HAL_CAN_RX_FIFO1_MSG_PENDING_CB_ID Rx Fifo 1 message pending callback ID + 549:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @arg @ref HAL_CAN_RX_FIFO1_FULL_CB_ID Rx Fifo 1 full callback ID + 550:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @arg @ref HAL_CAN_SLEEP_CB_ID Sleep callback ID + 551:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @arg @ref HAL_CAN_WAKEUP_FROM_RX_MSG_CB_ID Wake Up from Rx message callback ID + 552:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @arg @ref HAL_CAN_ERROR_CB_ID Error callback ID + 553:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @arg @ref HAL_CAN_MSPINIT_CB_ID MspInit callback ID + 554:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @arg @ref HAL_CAN_MSPDEINIT_CB_ID MspDeInit callback ID + 555:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param pCallback pointer to the Callback function + 556:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @retval HAL status + 557:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ + 558:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_StatusTypeDef HAL_CAN_RegisterCallback(CAN_HandleTypeDef *hcan, HAL_CAN_CallbackIDTypeDef Callb + 559:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 560:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_StatusTypeDef status = HAL_OK; + 561:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 562:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if (pCallback == NULL) + 563:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 564:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Update the error code */ + 565:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->ErrorCode |= HAL_CAN_ERROR_INVALID_CALLBACK; + 566:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + ARM GAS /tmp/ccqPwHQi.s page 19 + + + 567:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** return HAL_ERROR; + 568:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 569:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 570:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if (hcan->State == HAL_CAN_STATE_READY) + 571:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 572:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** switch (CallbackID) + 573:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 574:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case HAL_CAN_TX_MAILBOX0_COMPLETE_CB_ID : + 575:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->TxMailbox0CompleteCallback = pCallback; + 576:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 577:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 578:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case HAL_CAN_TX_MAILBOX1_COMPLETE_CB_ID : + 579:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->TxMailbox1CompleteCallback = pCallback; + 580:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 581:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 582:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case HAL_CAN_TX_MAILBOX2_COMPLETE_CB_ID : + 583:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->TxMailbox2CompleteCallback = pCallback; + 584:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 585:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 586:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case HAL_CAN_TX_MAILBOX0_ABORT_CB_ID : + 587:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->TxMailbox0AbortCallback = pCallback; + 588:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 589:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 590:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case HAL_CAN_TX_MAILBOX1_ABORT_CB_ID : + 591:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->TxMailbox1AbortCallback = pCallback; + 592:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 593:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 594:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case HAL_CAN_TX_MAILBOX2_ABORT_CB_ID : + 595:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->TxMailbox2AbortCallback = pCallback; + 596:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 597:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 598:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case HAL_CAN_RX_FIFO0_MSG_PENDING_CB_ID : + 599:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->RxFifo0MsgPendingCallback = pCallback; + 600:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 601:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 602:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case HAL_CAN_RX_FIFO0_FULL_CB_ID : + 603:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->RxFifo0FullCallback = pCallback; + 604:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 605:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 606:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case HAL_CAN_RX_FIFO1_MSG_PENDING_CB_ID : + 607:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->RxFifo1MsgPendingCallback = pCallback; + 608:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 609:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 610:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case HAL_CAN_RX_FIFO1_FULL_CB_ID : + 611:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->RxFifo1FullCallback = pCallback; + 612:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 613:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 614:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case HAL_CAN_SLEEP_CB_ID : + 615:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->SleepCallback = pCallback; + 616:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 617:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 618:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case HAL_CAN_WAKEUP_FROM_RX_MSG_CB_ID : + 619:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->WakeUpFromRxMsgCallback = pCallback; + 620:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 621:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 622:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case HAL_CAN_ERROR_CB_ID : + 623:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->ErrorCallback = pCallback; + ARM GAS /tmp/ccqPwHQi.s page 20 + + + 624:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 625:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 626:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case HAL_CAN_MSPINIT_CB_ID : + 627:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->MspInitCallback = pCallback; + 628:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 629:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 630:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case HAL_CAN_MSPDEINIT_CB_ID : + 631:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->MspDeInitCallback = pCallback; + 632:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 633:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 634:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** default : + 635:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Update the error code */ + 636:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->ErrorCode |= HAL_CAN_ERROR_INVALID_CALLBACK; + 637:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 638:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Return error status */ + 639:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** status = HAL_ERROR; + 640:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 641:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 642:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 643:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** else if (hcan->State == HAL_CAN_STATE_RESET) + 644:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 645:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** switch (CallbackID) + 646:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 647:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case HAL_CAN_MSPINIT_CB_ID : + 648:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->MspInitCallback = pCallback; + 649:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 650:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 651:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case HAL_CAN_MSPDEINIT_CB_ID : + 652:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->MspDeInitCallback = pCallback; + 653:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 654:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 655:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** default : + 656:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Update the error code */ + 657:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->ErrorCode |= HAL_CAN_ERROR_INVALID_CALLBACK; + 658:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 659:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Return error status */ + 660:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** status = HAL_ERROR; + 661:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 662:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 663:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 664:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** else + 665:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 666:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Update the error code */ + 667:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->ErrorCode |= HAL_CAN_ERROR_INVALID_CALLBACK; + 668:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 669:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Return error status */ + 670:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** status = HAL_ERROR; + 671:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 672:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 673:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** return status; + 674:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 675:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 676:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** + 677:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief Unregister a CAN CallBack. + 678:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * CAN callabck is redirected to the weak predefined callback + 679:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param hcan pointer to a CAN_HandleTypeDef structure that contains + 680:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * the configuration information for CAN module + ARM GAS /tmp/ccqPwHQi.s page 21 + + + 681:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param CallbackID ID of the callback to be unregistered + 682:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * This parameter can be one of the following values: + 683:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @arg @ref HAL_CAN_TX_MAILBOX0_COMPLETE_CB_ID Tx Mailbox 0 Complete callback ID + 684:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @arg @ref HAL_CAN_TX_MAILBOX1_COMPLETE_CB_ID Tx Mailbox 1 Complete callback ID + 685:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @arg @ref HAL_CAN_TX_MAILBOX2_COMPLETE_CB_ID Tx Mailbox 2 Complete callback ID + 686:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @arg @ref HAL_CAN_TX_MAILBOX0_ABORT_CB_ID Tx Mailbox 0 Abort callback ID + 687:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @arg @ref HAL_CAN_TX_MAILBOX1_ABORT_CB_ID Tx Mailbox 1 Abort callback ID + 688:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @arg @ref HAL_CAN_TX_MAILBOX2_ABORT_CB_ID Tx Mailbox 2 Abort callback ID + 689:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @arg @ref HAL_CAN_RX_FIFO0_MSG_PENDING_CB_ID Rx Fifo 0 message pending callback ID + 690:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @arg @ref HAL_CAN_RX_FIFO0_FULL_CB_ID Rx Fifo 0 full callback ID + 691:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @arg @ref HAL_CAN_RX_FIFO1_MSG_PENDING_CB_ID Rx Fifo 1 message pending callback ID + 692:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @arg @ref HAL_CAN_RX_FIFO1_FULL_CB_ID Rx Fifo 1 full callback ID + 693:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @arg @ref HAL_CAN_SLEEP_CB_ID Sleep callback ID + 694:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @arg @ref HAL_CAN_WAKEUP_FROM_RX_MSG_CB_ID Wake Up from Rx message callback ID + 695:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @arg @ref HAL_CAN_ERROR_CB_ID Error callback ID + 696:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @arg @ref HAL_CAN_MSPINIT_CB_ID MspInit callback ID + 697:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @arg @ref HAL_CAN_MSPDEINIT_CB_ID MspDeInit callback ID + 698:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @retval HAL status + 699:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ + 700:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_StatusTypeDef HAL_CAN_UnRegisterCallback(CAN_HandleTypeDef *hcan, HAL_CAN_CallbackIDTypeDef Cal + 701:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 702:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_StatusTypeDef status = HAL_OK; + 703:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 704:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if (hcan->State == HAL_CAN_STATE_READY) + 705:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 706:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** switch (CallbackID) + 707:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 708:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case HAL_CAN_TX_MAILBOX0_COMPLETE_CB_ID : + 709:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->TxMailbox0CompleteCallback = HAL_CAN_TxMailbox0CompleteCallback; + 710:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 711:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 712:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case HAL_CAN_TX_MAILBOX1_COMPLETE_CB_ID : + 713:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->TxMailbox1CompleteCallback = HAL_CAN_TxMailbox1CompleteCallback; + 714:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 715:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 716:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case HAL_CAN_TX_MAILBOX2_COMPLETE_CB_ID : + 717:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->TxMailbox2CompleteCallback = HAL_CAN_TxMailbox2CompleteCallback; + 718:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 719:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 720:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case HAL_CAN_TX_MAILBOX0_ABORT_CB_ID : + 721:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->TxMailbox0AbortCallback = HAL_CAN_TxMailbox0AbortCallback; + 722:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 723:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 724:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case HAL_CAN_TX_MAILBOX1_ABORT_CB_ID : + 725:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->TxMailbox1AbortCallback = HAL_CAN_TxMailbox1AbortCallback; + 726:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 727:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 728:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case HAL_CAN_TX_MAILBOX2_ABORT_CB_ID : + 729:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->TxMailbox2AbortCallback = HAL_CAN_TxMailbox2AbortCallback; + 730:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 731:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 732:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case HAL_CAN_RX_FIFO0_MSG_PENDING_CB_ID : + 733:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->RxFifo0MsgPendingCallback = HAL_CAN_RxFifo0MsgPendingCallback; + 734:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 735:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 736:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case HAL_CAN_RX_FIFO0_FULL_CB_ID : + 737:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->RxFifo0FullCallback = HAL_CAN_RxFifo0FullCallback; + ARM GAS /tmp/ccqPwHQi.s page 22 + + + 738:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 739:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 740:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case HAL_CAN_RX_FIFO1_MSG_PENDING_CB_ID : + 741:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->RxFifo1MsgPendingCallback = HAL_CAN_RxFifo1MsgPendingCallback; + 742:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 743:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 744:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case HAL_CAN_RX_FIFO1_FULL_CB_ID : + 745:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->RxFifo1FullCallback = HAL_CAN_RxFifo1FullCallback; + 746:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 747:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 748:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case HAL_CAN_SLEEP_CB_ID : + 749:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->SleepCallback = HAL_CAN_SleepCallback; + 750:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 751:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 752:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case HAL_CAN_WAKEUP_FROM_RX_MSG_CB_ID : + 753:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->WakeUpFromRxMsgCallback = HAL_CAN_WakeUpFromRxMsgCallback; + 754:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 755:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 756:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case HAL_CAN_ERROR_CB_ID : + 757:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->ErrorCallback = HAL_CAN_ErrorCallback; + 758:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 759:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 760:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case HAL_CAN_MSPINIT_CB_ID : + 761:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->MspInitCallback = HAL_CAN_MspInit; + 762:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 763:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 764:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case HAL_CAN_MSPDEINIT_CB_ID : + 765:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->MspDeInitCallback = HAL_CAN_MspDeInit; + 766:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 767:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 768:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** default : + 769:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Update the error code */ + 770:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->ErrorCode |= HAL_CAN_ERROR_INVALID_CALLBACK; + 771:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 772:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Return error status */ + 773:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** status = HAL_ERROR; + 774:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 775:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 776:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 777:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** else if (hcan->State == HAL_CAN_STATE_RESET) + 778:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 779:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** switch (CallbackID) + 780:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 781:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case HAL_CAN_MSPINIT_CB_ID : + 782:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->MspInitCallback = HAL_CAN_MspInit; + 783:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 784:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 785:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case HAL_CAN_MSPDEINIT_CB_ID : + 786:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->MspDeInitCallback = HAL_CAN_MspDeInit; + 787:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 788:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 789:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** default : + 790:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Update the error code */ + 791:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->ErrorCode |= HAL_CAN_ERROR_INVALID_CALLBACK; + 792:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 793:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Return error status */ + 794:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** status = HAL_ERROR; + ARM GAS /tmp/ccqPwHQi.s page 23 + + + 795:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 796:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 797:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 798:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** else + 799:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 800:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Update the error code */ + 801:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->ErrorCode |= HAL_CAN_ERROR_INVALID_CALLBACK; + 802:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 803:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Return error status */ + 804:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** status = HAL_ERROR; + 805:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 806:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 807:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** return status; + 808:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 809:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + 810:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 811:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** + 812:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @} + 813:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ + 814:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 815:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** @defgroup CAN_Exported_Functions_Group2 Configuration functions + 816:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief Configuration functions. + 817:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * + 818:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** @verbatim + 819:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ============================================================================== + 820:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ##### Configuration functions ##### + 821:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ============================================================================== + 822:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** [..] This section provides functions allowing to: + 823:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) HAL_CAN_ConfigFilter : Configure the CAN reception filters + 824:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 825:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** @endverbatim + 826:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @{ + 827:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ + 828:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 829:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** + 830:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief Configures the CAN reception filter according to the specified + 831:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * parameters in the CAN_FilterInitStruct. + 832:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param hcan pointer to a CAN_HandleTypeDef structure that contains + 833:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * the configuration information for the specified CAN. + 834:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param sFilterConfig pointer to a CAN_FilterTypeDef structure that + 835:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * contains the filter configuration information. + 836:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @retval None + 837:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ + 838:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_StatusTypeDef HAL_CAN_ConfigFilter(CAN_HandleTypeDef *hcan, CAN_FilterTypeDef *sFilterConfig) + 839:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 368 .loc 1 839 1 is_stmt 1 view -0 + 369 .cfi_startproc + 370 @ args = 0, pretend = 0, frame = 0 + 371 @ frame_needed = 0, uses_anonymous_args = 0 + 372 @ link register save eliminated. + 840:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t filternbrbitpos; + 373 .loc 1 840 3 view .LVU107 + 841:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** CAN_TypeDef *can_ip = hcan->Instance; + 374 .loc 1 841 3 view .LVU108 + 375 .loc 1 841 16 is_stmt 0 view .LVU109 + 376 0000 0268 ldr r2, [r0] + 377 .LVL16: + ARM GAS /tmp/ccqPwHQi.s page 24 + + + 842:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_StateTypeDef state = hcan->State; + 378 .loc 1 842 3 is_stmt 1 view .LVU110 + 379 .loc 1 842 24 is_stmt 0 view .LVU111 + 380 0002 90F82030 ldrb r3, [r0, #32] @ zero_extendqisi2 + 381 .LVL17: + 843:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 844:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((state == HAL_CAN_STATE_READY) || + 382 .loc 1 844 3 is_stmt 1 view .LVU112 + 383 .loc 1 844 38 is_stmt 0 view .LVU113 + 384 0006 013B subs r3, r3, #1 + 385 .LVL18: + 386 .loc 1 844 38 view .LVU114 + 387 0008 DBB2 uxtb r3, r3 + 388 .loc 1 844 6 view .LVU115 + 389 000a 012B cmp r3, #1 + 390 000c 05D9 bls .L50 + 845:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (state == HAL_CAN_STATE_LISTENING)) + 846:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 847:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Check the parameters */ + 848:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_CAN_FILTER_ID_HALFWORD(sFilterConfig->FilterIdHigh)); + 849:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_CAN_FILTER_ID_HALFWORD(sFilterConfig->FilterIdLow)); + 850:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_CAN_FILTER_ID_HALFWORD(sFilterConfig->FilterMaskIdHigh)); + 851:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_CAN_FILTER_ID_HALFWORD(sFilterConfig->FilterMaskIdLow)); + 852:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_CAN_FILTER_MODE(sFilterConfig->FilterMode)); + 853:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_CAN_FILTER_SCALE(sFilterConfig->FilterScale)); + 854:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_CAN_FILTER_FIFO(sFilterConfig->FilterFIFOAssignment)); + 855:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_CAN_FILTER_ACTIVATION(sFilterConfig->FilterActivation)); + 856:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 857:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* CAN is single instance with 14 dedicated filters banks */ + 858:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 859:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Check the parameters */ + 860:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_CAN_FILTER_BANK_SINGLE(sFilterConfig->FilterBank)); + 861:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 862:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Initialisation mode for the filter */ + 863:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** SET_BIT(can_ip->FMR, CAN_FMR_FINIT); + 864:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 865:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Convert filter number into bit position */ + 866:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** filternbrbitpos = (uint32_t)1 << (sFilterConfig->FilterBank & 0x1FU); + 867:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 868:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Filter Deactivation */ + 869:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** CLEAR_BIT(can_ip->FA1R, filternbrbitpos); + 870:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 871:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Filter Scale */ + 872:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if (sFilterConfig->FilterScale == CAN_FILTERSCALE_16BIT) + 873:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 874:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* 16-bit scale for the filter */ + 875:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** CLEAR_BIT(can_ip->FS1R, filternbrbitpos); + 876:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 877:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* First 16-bit identifier and First 16-bit mask */ + 878:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Or First 16-bit identifier and Second 16-bit identifier */ + 879:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** can_ip->sFilterRegister[sFilterConfig->FilterBank].FR1 = + 880:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdLow) << 16U) | + 881:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (0x0000FFFFU & (uint32_t)sFilterConfig->FilterIdLow); + 882:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 883:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Second 16-bit identifier and Second 16-bit mask */ + 884:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Or Third 16-bit identifier and Fourth 16-bit identifier */ + 885:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** can_ip->sFilterRegister[sFilterConfig->FilterBank].FR2 = + ARM GAS /tmp/ccqPwHQi.s page 25 + + + 886:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdHigh) << 16U) | + 887:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (0x0000FFFFU & (uint32_t)sFilterConfig->FilterIdHigh); + 888:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 889:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 890:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if (sFilterConfig->FilterScale == CAN_FILTERSCALE_32BIT) + 891:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 892:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* 32-bit scale for the filter */ + 893:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** SET_BIT(can_ip->FS1R, filternbrbitpos); + 894:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 895:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* 32-bit identifier or First 32-bit identifier */ + 896:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** can_ip->sFilterRegister[sFilterConfig->FilterBank].FR1 = + 897:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterIdHigh) << 16U) | + 898:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (0x0000FFFFU & (uint32_t)sFilterConfig->FilterIdLow); + 899:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 900:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* 32-bit mask or Second 32-bit identifier */ + 901:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** can_ip->sFilterRegister[sFilterConfig->FilterBank].FR2 = + 902:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdHigh) << 16U) | + 903:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdLow); + 904:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 905:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 906:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Filter Mode */ + 907:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if (sFilterConfig->FilterMode == CAN_FILTERMODE_IDMASK) + 908:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 909:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Id/Mask mode for the filter*/ + 910:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** CLEAR_BIT(can_ip->FM1R, filternbrbitpos); + 911:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 912:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** else /* CAN_FilterInitStruct->CAN_FilterMode == CAN_FilterMode_IdList */ + 913:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 914:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Identifier list mode for the filter*/ + 915:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** SET_BIT(can_ip->FM1R, filternbrbitpos); + 916:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 917:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 918:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Filter FIFO assignment */ + 919:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if (sFilterConfig->FilterFIFOAssignment == CAN_FILTER_FIFO0) + 920:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 921:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* FIFO 0 assignation for the filter */ + 922:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** CLEAR_BIT(can_ip->FFA1R, filternbrbitpos); + 923:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 924:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** else + 925:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 926:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* FIFO 1 assignation for the filter */ + 927:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** SET_BIT(can_ip->FFA1R, filternbrbitpos); + 928:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 929:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 930:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Filter activation */ + 931:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if (sFilterConfig->FilterActivation == CAN_FILTER_ENABLE) + 932:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 933:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** SET_BIT(can_ip->FA1R, filternbrbitpos); + 934:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 935:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 936:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Leave the initialisation mode for the filter */ + 937:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** CLEAR_BIT(can_ip->FMR, CAN_FMR_FINIT); + 938:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 939:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Return function status */ + 940:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** return HAL_OK; + 941:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 942:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** else + ARM GAS /tmp/ccqPwHQi.s page 26 + + + 943:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 944:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Update error code */ + 945:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED; + 391 .loc 1 945 5 is_stmt 1 view .LVU116 + 392 .loc 1 945 9 is_stmt 0 view .LVU117 + 393 000e 436A ldr r3, [r0, #36] + 394 .loc 1 945 21 view .LVU118 + 395 0010 43F48023 orr r3, r3, #262144 + 396 0014 4362 str r3, [r0, #36] + 946:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 947:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** return HAL_ERROR; + 397 .loc 1 947 5 is_stmt 1 view .LVU119 + 398 .loc 1 947 12 is_stmt 0 view .LVU120 + 399 0016 0120 movs r0, #1 + 400 .LVL19: + 948:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 949:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 401 .loc 1 949 1 view .LVU121 + 402 0018 7047 bx lr + 403 .LVL20: + 404 .L50: + 839:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t filternbrbitpos; + 405 .loc 1 839 1 view .LVU122 + 406 001a 30B4 push {r4, r5} + 407 .cfi_def_cfa_offset 8 + 408 .cfi_offset 4, -8 + 409 .cfi_offset 5, -4 + 848:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_CAN_FILTER_ID_HALFWORD(sFilterConfig->FilterIdLow)); + 410 .loc 1 848 5 is_stmt 1 view .LVU123 + 849:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_CAN_FILTER_ID_HALFWORD(sFilterConfig->FilterMaskIdHigh)); + 411 .loc 1 849 5 view .LVU124 + 850:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_CAN_FILTER_ID_HALFWORD(sFilterConfig->FilterMaskIdLow)); + 412 .loc 1 850 5 view .LVU125 + 851:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_CAN_FILTER_MODE(sFilterConfig->FilterMode)); + 413 .loc 1 851 5 view .LVU126 + 852:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_CAN_FILTER_SCALE(sFilterConfig->FilterScale)); + 414 .loc 1 852 5 view .LVU127 + 853:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_CAN_FILTER_FIFO(sFilterConfig->FilterFIFOAssignment)); + 415 .loc 1 853 5 view .LVU128 + 854:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_CAN_FILTER_ACTIVATION(sFilterConfig->FilterActivation)); + 416 .loc 1 854 5 view .LVU129 + 855:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 417 .loc 1 855 5 view .LVU130 + 860:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 418 .loc 1 860 5 view .LVU131 + 863:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 419 .loc 1 863 5 view .LVU132 + 420 001c D2F80032 ldr r3, [r2, #512] + 421 0020 43F00103 orr r3, r3, #1 + 422 0024 C2F80032 str r3, [r2, #512] + 866:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 423 .loc 1 866 5 view .LVU133 + 866:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 424 .loc 1 866 52 is_stmt 0 view .LVU134 + 425 0028 4B69 ldr r3, [r1, #20] + 866:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 426 .loc 1 866 65 view .LVU135 + ARM GAS /tmp/ccqPwHQi.s page 27 + + + 427 002a 03F01F03 and r3, r3, #31 + 866:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 428 .loc 1 866 21 view .LVU136 + 429 002e 0120 movs r0, #1 + 430 .LVL21: + 866:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 431 .loc 1 866 21 view .LVU137 + 432 0030 00FA03F3 lsl r3, r0, r3 + 433 .LVL22: + 869:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 434 .loc 1 869 5 is_stmt 1 view .LVU138 + 435 0034 D2F81C02 ldr r0, [r2, #540] + 436 0038 6FEA030C mvn ip, r3 + 437 003c 20EA0300 bic r0, r0, r3 + 438 0040 C2F81C02 str r0, [r2, #540] + 872:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 439 .loc 1 872 5 view .LVU139 + 872:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 440 .loc 1 872 22 is_stmt 0 view .LVU140 + 441 0044 C869 ldr r0, [r1, #28] + 872:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 442 .loc 1 872 8 view .LVU141 + 443 0046 B0B9 cbnz r0, .L38 + 875:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 444 .loc 1 875 7 is_stmt 1 view .LVU142 + 445 0048 D2F80C02 ldr r0, [r2, #524] + 446 004c 0CEA0000 and r0, ip, r0 + 447 0050 C2F80C02 str r0, [r2, #524] + 879:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdLow) << 16U) | + 448 .loc 1 879 7 view .LVU143 + 881:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 449 .loc 1 881 22 is_stmt 0 view .LVU144 + 450 0054 8C88 ldrh r4, [r1, #4] + 879:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdLow) << 16U) | + 451 .loc 1 879 44 view .LVU145 + 452 0056 4869 ldr r0, [r1, #20] + 880:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (0x0000FFFFU & (uint32_t)sFilterConfig->FilterIdLow); + 453 .loc 1 880 75 view .LVU146 + 454 0058 CD68 ldr r5, [r1, #12] + 455 005a 44EA0544 orr r4, r4, r5, lsl #16 + 879:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdLow) << 16U) | + 456 .loc 1 879 62 view .LVU147 + 457 005e 4830 adds r0, r0, #72 + 458 0060 42F83040 str r4, [r2, r0, lsl #3] + 885:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdHigh) << 16U) | + 459 .loc 1 885 7 is_stmt 1 view .LVU148 + 887:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 460 .loc 1 887 22 is_stmt 0 view .LVU149 + 461 0064 0C88 ldrh r4, [r1] + 885:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdHigh) << 16U) | + 462 .loc 1 885 44 view .LVU150 + 463 0066 4869 ldr r0, [r1, #20] + 886:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (0x0000FFFFU & (uint32_t)sFilterConfig->FilterIdHigh); + 464 .loc 1 886 76 view .LVU151 + 465 0068 8D68 ldr r5, [r1, #8] + 466 006a 44EA0544 orr r4, r4, r5, lsl #16 + 885:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdHigh) << 16U) | + ARM GAS /tmp/ccqPwHQi.s page 28 + + + 467 .loc 1 885 62 view .LVU152 + 468 006e 4830 adds r0, r0, #72 + 469 0070 02EBC000 add r0, r2, r0, lsl #3 + 470 0074 4460 str r4, [r0, #4] + 471 .L38: + 890:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 472 .loc 1 890 5 is_stmt 1 view .LVU153 + 890:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 473 .loc 1 890 22 is_stmt 0 view .LVU154 + 474 0076 C869 ldr r0, [r1, #28] + 890:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 475 .loc 1 890 8 view .LVU155 + 476 0078 0128 cmp r0, #1 + 477 007a 1BD0 beq .L51 + 478 .L39: + 907:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 479 .loc 1 907 5 is_stmt 1 view .LVU156 + 907:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 480 .loc 1 907 22 is_stmt 0 view .LVU157 + 481 007c 8869 ldr r0, [r1, #24] + 907:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 482 .loc 1 907 8 view .LVU158 + 483 007e 80BB cbnz r0, .L40 + 910:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 484 .loc 1 910 7 is_stmt 1 view .LVU159 + 485 0080 D2F80402 ldr r0, [r2, #516] + 486 0084 0CEA0000 and r0, ip, r0 + 487 0088 C2F80402 str r0, [r2, #516] + 488 .L41: + 919:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 489 .loc 1 919 5 view .LVU160 + 919:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 490 .loc 1 919 22 is_stmt 0 view .LVU161 + 491 008c 0869 ldr r0, [r1, #16] + 919:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 492 .loc 1 919 8 view .LVU162 + 493 008e 70BB cbnz r0, .L42 + 922:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 494 .loc 1 922 7 is_stmt 1 view .LVU163 + 495 0090 D2F81402 ldr r0, [r2, #532] + 496 0094 0CEA0000 and r0, ip, r0 + 497 0098 C2F81402 str r0, [r2, #532] + 498 .L43: + 931:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 499 .loc 1 931 5 view .LVU164 + 931:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 500 .loc 1 931 22 is_stmt 0 view .LVU165 + 501 009c 096A ldr r1, [r1, #32] + 502 .LVL23: + 931:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 503 .loc 1 931 8 view .LVU166 + 504 009e 0129 cmp r1, #1 + 505 00a0 2BD0 beq .L52 + 506 .LVL24: + 507 .L44: + 937:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 508 .loc 1 937 5 is_stmt 1 view .LVU167 + ARM GAS /tmp/ccqPwHQi.s page 29 + + + 509 00a2 D2F80032 ldr r3, [r2, #512] + 510 00a6 23F00103 bic r3, r3, #1 + 511 00aa C2F80032 str r3, [r2, #512] + 940:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 512 .loc 1 940 5 view .LVU168 + 940:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 513 .loc 1 940 12 is_stmt 0 view .LVU169 + 514 00ae 0020 movs r0, #0 + 515 .loc 1 949 1 view .LVU170 + 516 00b0 30BC pop {r4, r5} + 517 .cfi_remember_state + 518 .cfi_restore 5 + 519 .cfi_restore 4 + 520 .cfi_def_cfa_offset 0 + 521 00b2 7047 bx lr + 522 .LVL25: + 523 .L51: + 524 .cfi_restore_state + 893:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 525 .loc 1 893 7 is_stmt 1 view .LVU171 + 526 00b4 D2F80C02 ldr r0, [r2, #524] + 527 00b8 1843 orrs r0, r0, r3 + 528 00ba C2F80C02 str r0, [r2, #524] + 896:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterIdHigh) << 16U) | + 529 .loc 1 896 7 view .LVU172 + 898:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 530 .loc 1 898 22 is_stmt 0 view .LVU173 + 531 00be 8C88 ldrh r4, [r1, #4] + 896:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterIdHigh) << 16U) | + 532 .loc 1 896 44 view .LVU174 + 533 00c0 4869 ldr r0, [r1, #20] + 897:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (0x0000FFFFU & (uint32_t)sFilterConfig->FilterIdLow); + 534 .loc 1 897 72 view .LVU175 + 535 00c2 0D68 ldr r5, [r1] + 536 00c4 44EA0544 orr r4, r4, r5, lsl #16 + 896:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterIdHigh) << 16U) | + 537 .loc 1 896 62 view .LVU176 + 538 00c8 4830 adds r0, r0, #72 + 539 00ca 42F83040 str r4, [r2, r0, lsl #3] + 901:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdHigh) << 16U) | + 540 .loc 1 901 7 is_stmt 1 view .LVU177 + 903:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 541 .loc 1 903 22 is_stmt 0 view .LVU178 + 542 00ce 8C89 ldrh r4, [r1, #12] + 901:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdHigh) << 16U) | + 543 .loc 1 901 44 view .LVU179 + 544 00d0 4869 ldr r0, [r1, #20] + 902:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdLow); + 545 .loc 1 902 76 view .LVU180 + 546 00d2 8D68 ldr r5, [r1, #8] + 547 00d4 44EA0544 orr r4, r4, r5, lsl #16 + 901:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ((0x0000FFFFU & (uint32_t)sFilterConfig->FilterMaskIdHigh) << 16U) | + 548 .loc 1 901 62 view .LVU181 + 549 00d8 4830 adds r0, r0, #72 + 550 00da 02EBC000 add r0, r2, r0, lsl #3 + 551 00de 4460 str r4, [r0, #4] + 552 00e0 CCE7 b .L39 + ARM GAS /tmp/ccqPwHQi.s page 30 + + + 553 .L40: + 915:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 554 .loc 1 915 7 is_stmt 1 view .LVU182 + 555 00e2 D2F80402 ldr r0, [r2, #516] + 556 00e6 1843 orrs r0, r0, r3 + 557 00e8 C2F80402 str r0, [r2, #516] + 558 00ec CEE7 b .L41 + 559 .L42: + 927:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 560 .loc 1 927 7 view .LVU183 + 561 00ee D2F81402 ldr r0, [r2, #532] + 562 00f2 1843 orrs r0, r0, r3 + 563 00f4 C2F81402 str r0, [r2, #532] + 564 00f8 D0E7 b .L43 + 565 .LVL26: + 566 .L52: + 933:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 567 .loc 1 933 7 view .LVU184 + 568 00fa D2F81C12 ldr r1, [r2, #540] + 569 00fe 0B43 orrs r3, r3, r1 + 570 .LVL27: + 933:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 571 .loc 1 933 7 is_stmt 0 view .LVU185 + 572 0100 C2F81C32 str r3, [r2, #540] + 573 0104 CDE7 b .L44 + 574 .cfi_endproc + 575 .LFE134: + 577 .section .text.HAL_CAN_Start,"ax",%progbits + 578 .align 1 + 579 .global HAL_CAN_Start + 580 .syntax unified + 581 .thumb + 582 .thumb_func + 584 HAL_CAN_Start: + 585 .LVL28: + 586 .LFB135: + 950:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 951:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** + 952:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @} + 953:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ + 954:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 955:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** @defgroup CAN_Exported_Functions_Group3 Control functions + 956:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief Control functions + 957:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * + 958:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** @verbatim + 959:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ============================================================================== + 960:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ##### Control functions ##### + 961:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ============================================================================== + 962:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** [..] This section provides functions allowing to: + 963:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) HAL_CAN_Start : Start the CAN module + 964:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) HAL_CAN_Stop : Stop the CAN module + 965:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) HAL_CAN_RequestSleep : Request sleep mode entry. + 966:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) HAL_CAN_WakeUp : Wake up from sleep mode. + 967:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) HAL_CAN_IsSleepActive : Check is sleep mode is active. + 968:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) HAL_CAN_AddTxMessage : Add a message to the Tx mailboxes + 969:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** and activate the corresponding + 970:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** transmission request + ARM GAS /tmp/ccqPwHQi.s page 31 + + + 971:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) HAL_CAN_AbortTxRequest : Abort transmission request + 972:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) HAL_CAN_GetTxMailboxesFreeLevel : Return Tx mailboxes free level + 973:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) HAL_CAN_IsTxMessagePending : Check if a transmission request is + 974:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** pending on the selected Tx mailbox + 975:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) HAL_CAN_GetRxMessage : Get a CAN frame from the Rx FIFO + 976:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) HAL_CAN_GetRxFifoFillLevel : Return Rx FIFO fill level + 977:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 978:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** @endverbatim + 979:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @{ + 980:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ + 981:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 982:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** + 983:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief Start the CAN module. + 984:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param hcan pointer to an CAN_HandleTypeDef structure that contains + 985:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * the configuration information for the specified CAN. + 986:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @retval HAL status + 987:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ + 988:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_StatusTypeDef HAL_CAN_Start(CAN_HandleTypeDef *hcan) + 989:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 587 .loc 1 989 1 is_stmt 1 view -0 + 588 .cfi_startproc + 589 @ args = 0, pretend = 0, frame = 0 + 590 @ frame_needed = 0, uses_anonymous_args = 0 + 591 .loc 1 989 1 is_stmt 0 view .LVU187 + 592 0000 70B5 push {r4, r5, r6, lr} + 593 .cfi_def_cfa_offset 16 + 594 .cfi_offset 4, -16 + 595 .cfi_offset 5, -12 + 596 .cfi_offset 6, -8 + 597 .cfi_offset 14, -4 + 598 0002 0446 mov r4, r0 + 990:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t tickstart; + 599 .loc 1 990 3 is_stmt 1 view .LVU188 + 991:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 992:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if (hcan->State == HAL_CAN_STATE_READY) + 600 .loc 1 992 3 view .LVU189 + 601 .loc 1 992 11 is_stmt 0 view .LVU190 + 602 0004 90F82050 ldrb r5, [r0, #32] @ zero_extendqisi2 + 603 0008 EDB2 uxtb r5, r5 + 604 .loc 1 992 6 view .LVU191 + 605 000a 012D cmp r5, #1 + 606 000c 06D0 beq .L59 + 993:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 994:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Change CAN peripheral state */ + 995:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->State = HAL_CAN_STATE_LISTENING; + 996:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 997:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Request leave initialisation */ + 998:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_INRQ); + 999:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1000:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Get tick */ +1001:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** tickstart = HAL_GetTick(); +1002:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1003:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Wait the acknowledge */ +1004:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** while ((hcan->Instance->MSR & CAN_MSR_INAK) != 0U) +1005:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1006:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Check for the Timeout */ +1007:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE) + ARM GAS /tmp/ccqPwHQi.s page 32 + + +1008:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1009:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Update error code */ +1010:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->ErrorCode |= HAL_CAN_ERROR_TIMEOUT; +1011:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1012:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Change CAN state */ +1013:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->State = HAL_CAN_STATE_ERROR; +1014:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1015:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** return HAL_ERROR; +1016:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1017:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1018:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1019:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Reset the CAN ErrorCode */ +1020:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->ErrorCode = HAL_CAN_ERROR_NONE; +1021:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1022:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Return function status */ +1023:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** return HAL_OK; +1024:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1025:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** else +1026:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1027:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Update error code */ +1028:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->ErrorCode |= HAL_CAN_ERROR_NOT_READY; + 607 .loc 1 1028 5 is_stmt 1 view .LVU192 + 608 .loc 1 1028 9 is_stmt 0 view .LVU193 + 609 000e 436A ldr r3, [r0, #36] + 610 .loc 1 1028 21 view .LVU194 + 611 0010 43F40023 orr r3, r3, #524288 + 612 0014 4362 str r3, [r0, #36] +1029:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1030:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** return HAL_ERROR; + 613 .loc 1 1030 5 is_stmt 1 view .LVU195 + 614 .loc 1 1030 12 is_stmt 0 view .LVU196 + 615 0016 0125 movs r5, #1 + 616 .LVL29: + 617 .L56: +1031:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1032:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 618 .loc 1 1032 1 view .LVU197 + 619 0018 2846 mov r0, r5 + 620 001a 70BD pop {r4, r5, r6, pc} + 621 .LVL30: + 622 .L59: + 995:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 623 .loc 1 995 5 is_stmt 1 view .LVU198 + 995:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 624 .loc 1 995 17 is_stmt 0 view .LVU199 + 625 001c 0223 movs r3, #2 + 626 001e 80F82030 strb r3, [r0, #32] + 998:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 627 .loc 1 998 5 is_stmt 1 view .LVU200 + 628 0022 0268 ldr r2, [r0] + 629 0024 1368 ldr r3, [r2] + 630 0026 23F00103 bic r3, r3, #1 + 631 002a 1360 str r3, [r2] +1001:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 632 .loc 1 1001 5 view .LVU201 +1001:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 633 .loc 1 1001 17 is_stmt 0 view .LVU202 + ARM GAS /tmp/ccqPwHQi.s page 33 + + + 634 002c FFF7FEFF bl HAL_GetTick + 635 .LVL31: +1001:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 636 .loc 1 1001 17 view .LVU203 + 637 0030 0646 mov r6, r0 + 638 .LVL32: +1004:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 639 .loc 1 1004 5 is_stmt 1 view .LVU204 + 640 .L55: +1004:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 641 .loc 1 1004 49 view .LVU205 +1004:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 642 .loc 1 1004 17 is_stmt 0 view .LVU206 + 643 0032 2368 ldr r3, [r4] +1004:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 644 .loc 1 1004 27 view .LVU207 + 645 0034 5B68 ldr r3, [r3, #4] +1004:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 646 .loc 1 1004 49 view .LVU208 + 647 0036 13F0010F tst r3, #1 + 648 003a 0CD0 beq .L60 +1007:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 649 .loc 1 1007 7 is_stmt 1 view .LVU209 +1007:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 650 .loc 1 1007 12 is_stmt 0 view .LVU210 + 651 003c FFF7FEFF bl HAL_GetTick + 652 .LVL33: +1007:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 653 .loc 1 1007 26 view .LVU211 + 654 0040 831B subs r3, r0, r6 +1007:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 655 .loc 1 1007 10 view .LVU212 + 656 0042 0A2B cmp r3, #10 + 657 0044 F5D9 bls .L55 +1010:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 658 .loc 1 1010 9 is_stmt 1 view .LVU213 +1010:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 659 .loc 1 1010 13 is_stmt 0 view .LVU214 + 660 0046 636A ldr r3, [r4, #36] +1010:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 661 .loc 1 1010 25 view .LVU215 + 662 0048 43F40033 orr r3, r3, #131072 + 663 004c 6362 str r3, [r4, #36] +1013:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 664 .loc 1 1013 9 is_stmt 1 view .LVU216 +1013:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 665 .loc 1 1013 21 is_stmt 0 view .LVU217 + 666 004e 0523 movs r3, #5 + 667 0050 84F82030 strb r3, [r4, #32] +1015:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 668 .loc 1 1015 9 is_stmt 1 view .LVU218 +1015:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 669 .loc 1 1015 16 is_stmt 0 view .LVU219 + 670 0054 E0E7 b .L56 + 671 .L60: +1020:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 672 .loc 1 1020 5 is_stmt 1 view .LVU220 + ARM GAS /tmp/ccqPwHQi.s page 34 + + +1020:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 673 .loc 1 1020 21 is_stmt 0 view .LVU221 + 674 0056 0025 movs r5, #0 + 675 0058 6562 str r5, [r4, #36] +1023:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 676 .loc 1 1023 5 is_stmt 1 view .LVU222 +1023:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 677 .loc 1 1023 12 is_stmt 0 view .LVU223 + 678 005a DDE7 b .L56 + 679 .cfi_endproc + 680 .LFE135: + 682 .section .text.HAL_CAN_Stop,"ax",%progbits + 683 .align 1 + 684 .global HAL_CAN_Stop + 685 .syntax unified + 686 .thumb + 687 .thumb_func + 689 HAL_CAN_Stop: + 690 .LVL34: + 691 .LFB136: +1033:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1034:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** +1035:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief Stop the CAN module and enable access to configuration registers. +1036:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param hcan pointer to an CAN_HandleTypeDef structure that contains +1037:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * the configuration information for the specified CAN. +1038:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @retval HAL status +1039:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +1040:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_StatusTypeDef HAL_CAN_Stop(CAN_HandleTypeDef *hcan) +1041:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 692 .loc 1 1041 1 is_stmt 1 view -0 + 693 .cfi_startproc + 694 @ args = 0, pretend = 0, frame = 0 + 695 @ frame_needed = 0, uses_anonymous_args = 0 + 696 .loc 1 1041 1 is_stmt 0 view .LVU225 + 697 0000 38B5 push {r3, r4, r5, lr} + 698 .cfi_def_cfa_offset 16 + 699 .cfi_offset 3, -16 + 700 .cfi_offset 4, -12 + 701 .cfi_offset 5, -8 + 702 .cfi_offset 14, -4 + 703 0002 0446 mov r4, r0 +1042:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t tickstart; + 704 .loc 1 1042 3 is_stmt 1 view .LVU226 +1043:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1044:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if (hcan->State == HAL_CAN_STATE_LISTENING) + 705 .loc 1 1044 3 view .LVU227 + 706 .loc 1 1044 11 is_stmt 0 view .LVU228 + 707 0004 90F82030 ldrb r3, [r0, #32] @ zero_extendqisi2 + 708 0008 DBB2 uxtb r3, r3 + 709 .loc 1 1044 6 view .LVU229 + 710 000a 022B cmp r3, #2 + 711 000c 05D0 beq .L67 +1045:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1046:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Request initialisation */ +1047:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** SET_BIT(hcan->Instance->MCR, CAN_MCR_INRQ); +1048:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1049:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Get tick */ + ARM GAS /tmp/ccqPwHQi.s page 35 + + +1050:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** tickstart = HAL_GetTick(); +1051:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1052:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Wait the acknowledge */ +1053:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** while ((hcan->Instance->MSR & CAN_MSR_INAK) == 0U) +1054:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1055:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Check for the Timeout */ +1056:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((HAL_GetTick() - tickstart) > CAN_TIMEOUT_VALUE) +1057:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1058:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Update error code */ +1059:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->ErrorCode |= HAL_CAN_ERROR_TIMEOUT; +1060:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1061:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Change CAN state */ +1062:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->State = HAL_CAN_STATE_ERROR; +1063:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1064:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** return HAL_ERROR; +1065:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1066:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1067:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1068:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Exit from sleep mode */ +1069:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_SLEEP); +1070:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1071:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Change CAN peripheral state */ +1072:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->State = HAL_CAN_STATE_READY; +1073:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1074:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Return function status */ +1075:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** return HAL_OK; +1076:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1077:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** else +1078:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1079:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Update error code */ +1080:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->ErrorCode |= HAL_CAN_ERROR_NOT_STARTED; + 712 .loc 1 1080 5 is_stmt 1 view .LVU230 + 713 .loc 1 1080 9 is_stmt 0 view .LVU231 + 714 000e 436A ldr r3, [r0, #36] + 715 .loc 1 1080 21 view .LVU232 + 716 0010 43F48013 orr r3, r3, #1048576 + 717 0014 4362 str r3, [r0, #36] +1081:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1082:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** return HAL_ERROR; + 718 .loc 1 1082 5 is_stmt 1 view .LVU233 + 719 .loc 1 1082 12 is_stmt 0 view .LVU234 + 720 0016 0120 movs r0, #1 + 721 .LVL35: + 722 .L64: +1083:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1084:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 723 .loc 1 1084 1 view .LVU235 + 724 0018 38BD pop {r3, r4, r5, pc} + 725 .LVL36: + 726 .L67: +1047:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 727 .loc 1 1047 5 is_stmt 1 view .LVU236 + 728 001a 0268 ldr r2, [r0] + 729 001c 1368 ldr r3, [r2] + 730 001e 43F00103 orr r3, r3, #1 + 731 0022 1360 str r3, [r2] +1050:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + ARM GAS /tmp/ccqPwHQi.s page 36 + + + 732 .loc 1 1050 5 view .LVU237 +1050:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 733 .loc 1 1050 17 is_stmt 0 view .LVU238 + 734 0024 FFF7FEFF bl HAL_GetTick + 735 .LVL37: +1050:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 736 .loc 1 1050 17 view .LVU239 + 737 0028 0546 mov r5, r0 + 738 .LVL38: +1053:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 739 .loc 1 1053 5 is_stmt 1 view .LVU240 + 740 .L63: +1053:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 741 .loc 1 1053 49 view .LVU241 +1053:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 742 .loc 1 1053 17 is_stmt 0 view .LVU242 + 743 002a 2368 ldr r3, [r4] +1053:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 744 .loc 1 1053 27 view .LVU243 + 745 002c 5A68 ldr r2, [r3, #4] +1053:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 746 .loc 1 1053 49 view .LVU244 + 747 002e 12F0010F tst r2, #1 + 748 0032 0DD1 bne .L68 +1056:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 749 .loc 1 1056 7 is_stmt 1 view .LVU245 +1056:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 750 .loc 1 1056 12 is_stmt 0 view .LVU246 + 751 0034 FFF7FEFF bl HAL_GetTick + 752 .LVL39: +1056:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 753 .loc 1 1056 26 view .LVU247 + 754 0038 431B subs r3, r0, r5 +1056:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 755 .loc 1 1056 10 view .LVU248 + 756 003a 0A2B cmp r3, #10 + 757 003c F5D9 bls .L63 +1059:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 758 .loc 1 1059 9 is_stmt 1 view .LVU249 +1059:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 759 .loc 1 1059 13 is_stmt 0 view .LVU250 + 760 003e 636A ldr r3, [r4, #36] +1059:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 761 .loc 1 1059 25 view .LVU251 + 762 0040 43F40033 orr r3, r3, #131072 + 763 0044 6362 str r3, [r4, #36] +1062:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 764 .loc 1 1062 9 is_stmt 1 view .LVU252 +1062:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 765 .loc 1 1062 21 is_stmt 0 view .LVU253 + 766 0046 0523 movs r3, #5 + 767 0048 84F82030 strb r3, [r4, #32] +1064:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 768 .loc 1 1064 9 is_stmt 1 view .LVU254 +1064:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 769 .loc 1 1064 16 is_stmt 0 view .LVU255 + 770 004c 0120 movs r0, #1 + ARM GAS /tmp/ccqPwHQi.s page 37 + + + 771 004e E3E7 b .L64 + 772 .L68: +1069:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 773 .loc 1 1069 5 is_stmt 1 view .LVU256 + 774 0050 1A68 ldr r2, [r3] + 775 0052 22F00202 bic r2, r2, #2 + 776 0056 1A60 str r2, [r3] +1072:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 777 .loc 1 1072 5 view .LVU257 +1072:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 778 .loc 1 1072 17 is_stmt 0 view .LVU258 + 779 0058 0123 movs r3, #1 + 780 005a 84F82030 strb r3, [r4, #32] +1075:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 781 .loc 1 1075 5 is_stmt 1 view .LVU259 +1075:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 782 .loc 1 1075 12 is_stmt 0 view .LVU260 + 783 005e 0020 movs r0, #0 + 784 0060 DAE7 b .L64 + 785 .cfi_endproc + 786 .LFE136: + 788 .section .text.HAL_CAN_DeInit,"ax",%progbits + 789 .align 1 + 790 .global HAL_CAN_DeInit + 791 .syntax unified + 792 .thumb + 793 .thumb_func + 795 HAL_CAN_DeInit: + 796 .LVL40: + 797 .LFB131: + 460:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Check CAN handle */ + 798 .loc 1 460 1 is_stmt 1 view -0 + 799 .cfi_startproc + 800 @ args = 0, pretend = 0, frame = 0 + 801 @ frame_needed = 0, uses_anonymous_args = 0 + 462:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 802 .loc 1 462 3 view .LVU262 + 462:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 803 .loc 1 462 6 is_stmt 0 view .LVU263 + 804 0000 80B1 cbz r0, .L71 + 460:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Check CAN handle */ + 805 .loc 1 460 1 view .LVU264 + 806 0002 10B5 push {r4, lr} + 807 .cfi_def_cfa_offset 8 + 808 .cfi_offset 4, -8 + 809 .cfi_offset 14, -4 + 810 0004 0446 mov r4, r0 + 468:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 811 .loc 1 468 3 is_stmt 1 view .LVU265 + 471:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 812 .loc 1 471 3 view .LVU266 + 471:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 813 .loc 1 471 9 is_stmt 0 view .LVU267 + 814 0006 FFF7FEFF bl HAL_CAN_Stop + 815 .LVL41: + 484:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #endif /* (USE_HAL_CAN_REGISTER_CALLBACKS) */ + 816 .loc 1 484 3 is_stmt 1 view .LVU268 + ARM GAS /tmp/ccqPwHQi.s page 38 + + + 817 000a 2046 mov r0, r4 + 818 000c FFF7FEFF bl HAL_CAN_MspDeInit + 819 .LVL42: + 488:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 820 .loc 1 488 3 view .LVU269 + 821 0010 2268 ldr r2, [r4] + 822 0012 1368 ldr r3, [r2] + 823 0014 43F40043 orr r3, r3, #32768 + 824 0018 1360 str r3, [r2] + 491:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 825 .loc 1 491 3 view .LVU270 + 491:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 826 .loc 1 491 19 is_stmt 0 view .LVU271 + 827 001a 0020 movs r0, #0 + 828 001c 6062 str r0, [r4, #36] + 494:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 829 .loc 1 494 3 is_stmt 1 view .LVU272 + 494:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 830 .loc 1 494 15 is_stmt 0 view .LVU273 + 831 001e 84F82000 strb r0, [r4, #32] + 497:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 832 .loc 1 497 3 is_stmt 1 view .LVU274 + 498:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 833 .loc 1 498 1 is_stmt 0 view .LVU275 + 834 0022 10BD pop {r4, pc} + 835 .LVL43: + 836 .L71: + 837 .cfi_def_cfa_offset 0 + 838 .cfi_restore 4 + 839 .cfi_restore 14 + 464:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 840 .loc 1 464 12 view .LVU276 + 841 0024 0120 movs r0, #1 + 842 .LVL44: + 498:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 843 .loc 1 498 1 view .LVU277 + 844 0026 7047 bx lr + 845 .cfi_endproc + 846 .LFE131: + 848 .section .text.HAL_CAN_RequestSleep,"ax",%progbits + 849 .align 1 + 850 .global HAL_CAN_RequestSleep + 851 .syntax unified + 852 .thumb + 853 .thumb_func + 855 HAL_CAN_RequestSleep: + 856 .LVL45: + 857 .LFB137: +1085:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1086:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** +1087:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief Request the sleep mode (low power) entry. +1088:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * When returning from this function, Sleep mode will be entered +1089:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * as soon as the current CAN activity (transmission or reception +1090:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * of a CAN frame) has been completed. +1091:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param hcan pointer to a CAN_HandleTypeDef structure that contains +1092:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * the configuration information for the specified CAN. +1093:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @retval HAL status. + ARM GAS /tmp/ccqPwHQi.s page 39 + + +1094:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +1095:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_StatusTypeDef HAL_CAN_RequestSleep(CAN_HandleTypeDef *hcan) +1096:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 858 .loc 1 1096 1 is_stmt 1 view -0 + 859 .cfi_startproc + 860 @ args = 0, pretend = 0, frame = 0 + 861 @ frame_needed = 0, uses_anonymous_args = 0 + 862 @ link register save eliminated. +1097:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_StateTypeDef state = hcan->State; + 863 .loc 1 1097 3 view .LVU279 + 864 .loc 1 1097 24 is_stmt 0 view .LVU280 + 865 0000 90F82030 ldrb r3, [r0, #32] @ zero_extendqisi2 + 866 .LVL46: +1098:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1099:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((state == HAL_CAN_STATE_READY) || + 867 .loc 1 1099 3 is_stmt 1 view .LVU281 + 868 .loc 1 1099 38 is_stmt 0 view .LVU282 + 869 0004 013B subs r3, r3, #1 + 870 .LVL47: + 871 .loc 1 1099 38 view .LVU283 + 872 0006 DBB2 uxtb r3, r3 + 873 .loc 1 1099 6 view .LVU284 + 874 0008 012B cmp r3, #1 + 875 000a 05D9 bls .L79 +1100:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (state == HAL_CAN_STATE_LISTENING)) +1101:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1102:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Request Sleep mode */ +1103:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** SET_BIT(hcan->Instance->MCR, CAN_MCR_SLEEP); +1104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1105:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Return function status */ +1106:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** return HAL_OK; +1107:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1108:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** else +1109:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1110:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Update error code */ +1111:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED; + 876 .loc 1 1111 5 is_stmt 1 view .LVU285 + 877 .loc 1 1111 9 is_stmt 0 view .LVU286 + 878 000c 436A ldr r3, [r0, #36] + 879 .loc 1 1111 21 view .LVU287 + 880 000e 43F48023 orr r3, r3, #262144 + 881 0012 4362 str r3, [r0, #36] +1112:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1113:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Return function status */ +1114:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** return HAL_ERROR; + 882 .loc 1 1114 5 is_stmt 1 view .LVU288 + 883 .loc 1 1114 12 is_stmt 0 view .LVU289 + 884 0014 0120 movs r0, #1 + 885 .LVL48: +1115:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1116:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 886 .loc 1 1116 1 view .LVU290 + 887 0016 7047 bx lr + 888 .LVL49: + 889 .L79: +1103:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 890 .loc 1 1103 5 is_stmt 1 view .LVU291 + ARM GAS /tmp/ccqPwHQi.s page 40 + + + 891 0018 0268 ldr r2, [r0] + 892 001a 1368 ldr r3, [r2] + 893 001c 43F00203 orr r3, r3, #2 + 894 0020 1360 str r3, [r2] +1106:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 895 .loc 1 1106 5 view .LVU292 +1106:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 896 .loc 1 1106 12 is_stmt 0 view .LVU293 + 897 0022 0020 movs r0, #0 + 898 .LVL50: +1106:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 899 .loc 1 1106 12 view .LVU294 + 900 0024 7047 bx lr + 901 .cfi_endproc + 902 .LFE137: + 904 .section .text.HAL_CAN_WakeUp,"ax",%progbits + 905 .align 1 + 906 .global HAL_CAN_WakeUp + 907 .syntax unified + 908 .thumb + 909 .thumb_func + 911 HAL_CAN_WakeUp: + 912 .LVL51: + 913 .LFB138: +1117:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1118:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** +1119:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief Wake up from sleep mode. +1120:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * When returning with HAL_OK status from this function, Sleep mode +1121:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * is exited. +1122:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param hcan pointer to a CAN_HandleTypeDef structure that contains +1123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * the configuration information for the specified CAN. +1124:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @retval HAL status. +1125:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +1126:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_StatusTypeDef HAL_CAN_WakeUp(CAN_HandleTypeDef *hcan) +1127:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 914 .loc 1 1127 1 is_stmt 1 view -0 + 915 .cfi_startproc + 916 @ args = 0, pretend = 0, frame = 8 + 917 @ frame_needed = 0, uses_anonymous_args = 0 + 918 @ link register save eliminated. + 919 .loc 1 1127 1 is_stmt 0 view .LVU296 + 920 0000 82B0 sub sp, sp, #8 + 921 .cfi_def_cfa_offset 8 +1128:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** __IO uint32_t count = 0; + 922 .loc 1 1128 3 is_stmt 1 view .LVU297 + 923 .loc 1 1128 17 is_stmt 0 view .LVU298 + 924 0002 0023 movs r3, #0 + 925 0004 0193 str r3, [sp, #4] +1129:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t timeout = 1000000U; + 926 .loc 1 1129 3 is_stmt 1 view .LVU299 + 927 .LVL52: +1130:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_StateTypeDef state = hcan->State; + 928 .loc 1 1130 3 view .LVU300 + 929 .loc 1 1130 24 is_stmt 0 view .LVU301 + 930 0006 90F82030 ldrb r3, [r0, #32] @ zero_extendqisi2 + 931 .LVL53: +1131:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + ARM GAS /tmp/ccqPwHQi.s page 41 + + +1132:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((state == HAL_CAN_STATE_READY) || + 932 .loc 1 1132 3 is_stmt 1 view .LVU302 + 933 .loc 1 1132 38 is_stmt 0 view .LVU303 + 934 000a 013B subs r3, r3, #1 + 935 .LVL54: + 936 .loc 1 1132 38 view .LVU304 + 937 000c DBB2 uxtb r3, r3 + 938 .loc 1 1132 6 view .LVU305 + 939 000e 012B cmp r3, #1 + 940 0010 18D8 bhi .L81 +1133:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (state == HAL_CAN_STATE_LISTENING)) +1134:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1135:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Wake up request */ +1136:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** CLEAR_BIT(hcan->Instance->MCR, CAN_MCR_SLEEP); + 941 .loc 1 1136 5 is_stmt 1 view .LVU306 + 942 0012 0268 ldr r2, [r0] + 943 0014 1368 ldr r3, [r2] + 944 0016 23F00203 bic r3, r3, #2 + 945 001a 1360 str r3, [r2] + 946 .L84: +1137:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1138:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Wait sleep mode is exited */ +1139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** do + 947 .loc 1 1139 5 view .LVU307 +1140:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1141:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Increment counter */ +1142:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** count++; + 948 .loc 1 1142 7 view .LVU308 + 949 .loc 1 1142 12 is_stmt 0 view .LVU309 + 950 001c 019B ldr r3, [sp, #4] + 951 001e 0133 adds r3, r3, #1 + 952 0020 0193 str r3, [sp, #4] +1143:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1144:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Check if timeout is reached */ +1145:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if (count > timeout) + 953 .loc 1 1145 7 is_stmt 1 view .LVU310 + 954 .loc 1 1145 17 is_stmt 0 view .LVU311 + 955 0022 019A ldr r2, [sp, #4] + 956 .loc 1 1145 10 view .LVU312 + 957 0024 0B4B ldr r3, .L87 + 958 0026 9A42 cmp r2, r3 + 959 0028 06D8 bhi .L86 +1146:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1147:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Update error code */ +1148:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->ErrorCode |= HAL_CAN_ERROR_TIMEOUT; +1149:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1150:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** return HAL_ERROR; +1151:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1153:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** while ((hcan->Instance->MSR & CAN_MSR_SLAK) != 0U); + 960 .loc 1 1153 49 is_stmt 1 view .LVU313 + 961 .loc 1 1153 17 is_stmt 0 view .LVU314 + 962 002a 0368 ldr r3, [r0] + 963 .loc 1 1153 27 view .LVU315 + 964 002c 5B68 ldr r3, [r3, #4] + 965 .loc 1 1153 49 view .LVU316 + 966 002e 13F0020F tst r3, #2 + ARM GAS /tmp/ccqPwHQi.s page 42 + + + 967 0032 F3D1 bne .L84 +1154:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1155:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Return function status */ +1156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** return HAL_OK; + 968 .loc 1 1156 12 view .LVU317 + 969 0034 0020 movs r0, #0 + 970 .LVL55: + 971 .loc 1 1156 12 view .LVU318 + 972 0036 0AE0 b .L83 + 973 .LVL56: + 974 .L86: +1148:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 975 .loc 1 1148 9 is_stmt 1 view .LVU319 +1148:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 976 .loc 1 1148 13 is_stmt 0 view .LVU320 + 977 0038 436A ldr r3, [r0, #36] +1148:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 978 .loc 1 1148 25 view .LVU321 + 979 003a 43F40033 orr r3, r3, #131072 + 980 003e 4362 str r3, [r0, #36] +1150:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 981 .loc 1 1150 9 is_stmt 1 view .LVU322 +1150:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 982 .loc 1 1150 16 is_stmt 0 view .LVU323 + 983 0040 0120 movs r0, #1 + 984 .LVL57: +1150:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 985 .loc 1 1150 16 view .LVU324 + 986 0042 04E0 b .L83 + 987 .LVL58: + 988 .L81: +1157:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1158:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** else +1159:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1160:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Update error code */ +1161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED; + 989 .loc 1 1161 5 is_stmt 1 view .LVU325 + 990 .loc 1 1161 9 is_stmt 0 view .LVU326 + 991 0044 436A ldr r3, [r0, #36] + 992 .loc 1 1161 21 view .LVU327 + 993 0046 43F48023 orr r3, r3, #262144 + 994 004a 4362 str r3, [r0, #36] +1162:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1163:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** return HAL_ERROR; + 995 .loc 1 1163 5 is_stmt 1 view .LVU328 + 996 .loc 1 1163 12 is_stmt 0 view .LVU329 + 997 004c 0120 movs r0, #1 + 998 .LVL59: + 999 .L83: +1164:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1000 .loc 1 1165 1 view .LVU330 + 1001 004e 02B0 add sp, sp, #8 + 1002 .cfi_def_cfa_offset 0 + 1003 @ sp needed + 1004 0050 7047 bx lr + 1005 .L88: + ARM GAS /tmp/ccqPwHQi.s page 43 + + + 1006 0052 00BF .align 2 + 1007 .L87: + 1008 0054 40420F00 .word 1000000 + 1009 .cfi_endproc + 1010 .LFE138: + 1012 .section .text.HAL_CAN_IsSleepActive,"ax",%progbits + 1013 .align 1 + 1014 .global HAL_CAN_IsSleepActive + 1015 .syntax unified + 1016 .thumb + 1017 .thumb_func + 1019 HAL_CAN_IsSleepActive: + 1020 .LVL60: + 1021 .LFB139: +1166:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** +1168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief Check is sleep mode is active. +1169:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param hcan pointer to a CAN_HandleTypeDef structure that contains +1170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * the configuration information for the specified CAN. +1171:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @retval Status +1172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * - 0 : Sleep mode is not active. +1173:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * - 1 : Sleep mode is active. +1174:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +1175:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t HAL_CAN_IsSleepActive(CAN_HandleTypeDef *hcan) +1176:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 1022 .loc 1 1176 1 is_stmt 1 view -0 + 1023 .cfi_startproc + 1024 @ args = 0, pretend = 0, frame = 0 + 1025 @ frame_needed = 0, uses_anonymous_args = 0 + 1026 @ link register save eliminated. +1177:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t status = 0U; + 1027 .loc 1 1177 3 view .LVU332 +1178:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_StateTypeDef state = hcan->State; + 1028 .loc 1 1178 3 view .LVU333 + 1029 .loc 1 1178 24 is_stmt 0 view .LVU334 + 1030 0000 90F82030 ldrb r3, [r0, #32] @ zero_extendqisi2 + 1031 .LVL61: +1179:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1180:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((state == HAL_CAN_STATE_READY) || + 1032 .loc 1 1180 3 is_stmt 1 view .LVU335 + 1033 .loc 1 1180 38 is_stmt 0 view .LVU336 + 1034 0004 013B subs r3, r3, #1 + 1035 .LVL62: + 1036 .loc 1 1180 38 view .LVU337 + 1037 0006 DBB2 uxtb r3, r3 + 1038 .loc 1 1180 6 view .LVU338 + 1039 0008 012B cmp r3, #1 + 1040 000a 01D9 bls .L93 +1177:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_StateTypeDef state = hcan->State; + 1041 .loc 1 1177 12 view .LVU339 + 1042 000c 0020 movs r0, #0 + 1043 .LVL63: +1177:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_StateTypeDef state = hcan->State; + 1044 .loc 1 1177 12 view .LVU340 + 1045 000e 7047 bx lr + 1046 .LVL64: + 1047 .L93: + ARM GAS /tmp/ccqPwHQi.s page 44 + + +1181:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (state == HAL_CAN_STATE_LISTENING)) +1182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1183:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Check Sleep mode */ +1184:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((hcan->Instance->MSR & CAN_MSR_SLAK) != 0U) + 1048 .loc 1 1184 5 is_stmt 1 view .LVU341 + 1049 .loc 1 1184 14 is_stmt 0 view .LVU342 + 1050 0010 0368 ldr r3, [r0] + 1051 .loc 1 1184 24 view .LVU343 + 1052 0012 5868 ldr r0, [r3, #4] + 1053 .LVL65: + 1054 .loc 1 1184 8 view .LVU344 + 1055 0014 10F00200 ands r0, r0, #2 + 1056 0018 00D1 bne .L92 + 1057 001a 7047 bx lr + 1058 .L92: +1185:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** status = 1U; + 1059 .loc 1 1186 14 view .LVU345 + 1060 001c 0120 movs r0, #1 + 1061 .LVL66: +1187:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1188:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1190:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Return function status */ +1191:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** return status; + 1062 .loc 1 1191 3 is_stmt 1 view .LVU346 +1192:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1063 .loc 1 1192 1 is_stmt 0 view .LVU347 + 1064 001e 7047 bx lr + 1065 .cfi_endproc + 1066 .LFE139: + 1068 .section .text.HAL_CAN_AddTxMessage,"ax",%progbits + 1069 .align 1 + 1070 .global HAL_CAN_AddTxMessage + 1071 .syntax unified + 1072 .thumb + 1073 .thumb_func + 1075 HAL_CAN_AddTxMessage: + 1076 .LVL67: + 1077 .LFB140: +1193:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1194:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** +1195:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief Add a message to the first free Tx mailbox and activate the +1196:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * corresponding transmission request. +1197:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param hcan pointer to a CAN_HandleTypeDef structure that contains +1198:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * the configuration information for the specified CAN. +1199:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param pHeader pointer to a CAN_TxHeaderTypeDef structure. +1200:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param aData array containing the payload of the Tx frame. +1201:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param pTxMailbox pointer to a variable where the function will return +1202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * the TxMailbox used to store the Tx message. +1203:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * This parameter can be a value of @arg CAN_Tx_Mailboxes. +1204:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @retval HAL status +1205:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +1206:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_StatusTypeDef HAL_CAN_AddTxMessage(CAN_HandleTypeDef *hcan, CAN_TxHeaderTypeDef *pHeader, uint8 +1207:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 1078 .loc 1 1207 1 is_stmt 1 view -0 + 1079 .cfi_startproc + ARM GAS /tmp/ccqPwHQi.s page 45 + + + 1080 @ args = 0, pretend = 0, frame = 0 + 1081 @ frame_needed = 0, uses_anonymous_args = 0 + 1082 .loc 1 1207 1 is_stmt 0 view .LVU349 + 1083 0000 30B5 push {r4, r5, lr} + 1084 .cfi_def_cfa_offset 12 + 1085 .cfi_offset 4, -12 + 1086 .cfi_offset 5, -8 + 1087 .cfi_offset 14, -4 +1208:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t transmitmailbox; + 1088 .loc 1 1208 3 is_stmt 1 view .LVU350 +1209:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_StateTypeDef state = hcan->State; + 1089 .loc 1 1209 3 view .LVU351 + 1090 .loc 1 1209 24 is_stmt 0 view .LVU352 + 1091 0002 90F820C0 ldrb ip, [r0, #32] @ zero_extendqisi2 + 1092 .LVL68: +1210:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t tsr = READ_REG(hcan->Instance->TSR); + 1093 .loc 1 1210 3 is_stmt 1 view .LVU353 + 1094 .loc 1 1210 12 is_stmt 0 view .LVU354 + 1095 0006 0468 ldr r4, [r0] + 1096 0008 A468 ldr r4, [r4, #8] + 1097 .LVL69: +1211:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1212:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Check the parameters */ +1213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_CAN_IDTYPE(pHeader->IDE)); + 1098 .loc 1 1213 3 is_stmt 1 view .LVU355 +1214:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_CAN_RTR(pHeader->RTR)); + 1099 .loc 1 1214 3 view .LVU356 +1215:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_CAN_DLC(pHeader->DLC)); + 1100 .loc 1 1215 3 view .LVU357 +1216:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if (pHeader->IDE == CAN_ID_STD) + 1101 .loc 1 1216 3 view .LVU358 +1217:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1218:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_CAN_STDID(pHeader->StdId)); +1219:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1220:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** else +1221:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1222:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_CAN_EXTID(pHeader->ExtId)); + 1102 .loc 1 1222 5 view .LVU359 +1223:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1224:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_FUNCTIONAL_STATE(pHeader->TransmitGlobalTime)); + 1103 .loc 1 1224 3 view .LVU360 +1225:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1226:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((state == HAL_CAN_STATE_READY) || + 1104 .loc 1 1226 3 view .LVU361 + 1105 .loc 1 1226 38 is_stmt 0 view .LVU362 + 1106 000a 0CF1FF3C add ip, ip, #-1 + 1107 .LVL70: + 1108 .loc 1 1226 38 view .LVU363 + 1109 000e 5FFA8CFC uxtb ip, ip + 1110 .loc 1 1226 6 view .LVU364 + 1111 0012 BCF1010F cmp ip, #1 + 1112 0016 6BD8 bhi .L95 +1227:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (state == HAL_CAN_STATE_LISTENING)) +1228:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1229:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Check that all the Tx mailboxes are not full */ +1230:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if (((tsr & CAN_TSR_TME0) != 0U) || + 1113 .loc 1 1230 5 is_stmt 1 view .LVU365 + ARM GAS /tmp/ccqPwHQi.s page 46 + + + 1114 .loc 1 1230 8 is_stmt 0 view .LVU366 + 1115 0018 14F0E05F tst r4, #469762048 + 1116 001c 62D0 beq .L96 +1231:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ((tsr & CAN_TSR_TME1) != 0U) || +1232:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ((tsr & CAN_TSR_TME2) != 0U)) +1233:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1234:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Select an empty transmit mailbox */ +1235:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** transmitmailbox = (tsr & CAN_TSR_CODE) >> CAN_TSR_CODE_Pos; + 1117 .loc 1 1235 7 is_stmt 1 view .LVU367 + 1118 .loc 1 1235 23 is_stmt 0 view .LVU368 + 1119 001e C4F3016C ubfx ip, r4, #24, #2 + 1120 .LVL71: +1236:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1237:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Check transmit mailbox value */ +1238:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if (transmitmailbox > 2U) + 1121 .loc 1 1238 7 is_stmt 1 view .LVU369 + 1122 .loc 1 1238 10 is_stmt 0 view .LVU370 + 1123 0022 BCF1020F cmp ip, #2 + 1124 0026 05D9 bls .L97 +1239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1240:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Update error code */ +1241:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->ErrorCode |= HAL_CAN_ERROR_INTERNAL; + 1125 .loc 1 1241 9 is_stmt 1 view .LVU371 + 1126 .loc 1 1241 13 is_stmt 0 view .LVU372 + 1127 0028 436A ldr r3, [r0, #36] + 1128 .LVL72: + 1129 .loc 1 1241 25 view .LVU373 + 1130 002a 43F40003 orr r3, r3, #8388608 + 1131 002e 4362 str r3, [r0, #36] +1242:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1243:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** return HAL_ERROR; + 1132 .loc 1 1243 9 is_stmt 1 view .LVU374 + 1133 .loc 1 1243 16 is_stmt 0 view .LVU375 + 1134 0030 0120 movs r0, #1 + 1135 .LVL73: + 1136 .loc 1 1243 16 view .LVU376 + 1137 0032 62E0 b .L98 + 1138 .LVL74: + 1139 .L97: +1244:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1246:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Store the Tx mailbox */ +1247:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** *pTxMailbox = (uint32_t)1 << transmitmailbox; + 1140 .loc 1 1247 7 is_stmt 1 view .LVU377 + 1141 .loc 1 1247 33 is_stmt 0 view .LVU378 + 1142 0034 0124 movs r4, #1 + 1143 .LVL75: + 1144 .loc 1 1247 33 view .LVU379 + 1145 0036 04FA0CF4 lsl r4, r4, ip + 1146 .loc 1 1247 19 view .LVU380 + 1147 003a 1C60 str r4, [r3] +1248:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Set up the Id */ +1250:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if (pHeader->IDE == CAN_ID_STD) + 1148 .loc 1 1250 7 is_stmt 1 view .LVU381 + 1149 .loc 1 1250 18 is_stmt 0 view .LVU382 + 1150 003c 8B68 ldr r3, [r1, #8] + ARM GAS /tmp/ccqPwHQi.s page 47 + + + 1151 .LVL76: + 1152 .loc 1 1250 10 view .LVU383 + 1153 003e 002B cmp r3, #0 + 1154 0040 3DD1 bne .L99 +1251:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1252:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->Instance->sTxMailBox[transmitmailbox].TIR = ((pHeader->StdId << CAN_TI0R_STID_Pos) | + 1155 .loc 1 1252 9 is_stmt 1 view .LVU384 + 1156 .loc 1 1252 68 is_stmt 0 view .LVU385 + 1157 0042 0D68 ldr r5, [r1] +1253:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** pHeader->RTR); + 1158 .loc 1 1253 67 view .LVU386 + 1159 0044 CB68 ldr r3, [r1, #12] +1252:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** pHeader->RTR); + 1160 .loc 1 1252 13 view .LVU387 + 1161 0046 0468 ldr r4, [r0] +1252:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** pHeader->RTR); + 1162 .loc 1 1252 98 view .LVU388 + 1163 0048 43EA4555 orr r5, r3, r5, lsl #21 +1252:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** pHeader->RTR); + 1164 .loc 1 1252 57 view .LVU389 + 1165 004c 0CF11803 add r3, ip, #24 + 1166 0050 1B01 lsls r3, r3, #4 + 1167 0052 E550 str r5, [r4, r3] + 1168 .L100: +1254:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1255:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** else +1256:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1257:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->Instance->sTxMailBox[transmitmailbox].TIR = ((pHeader->ExtId << CAN_TI0R_EXID_Pos) | +1258:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** pHeader->IDE | +1259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** pHeader->RTR); +1260:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1261:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1262:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Set up the DLC */ +1263:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->Instance->sTxMailBox[transmitmailbox].TDTR = (pHeader->DLC); + 1169 .loc 1 1263 7 is_stmt 1 view .LVU390 + 1170 .loc 1 1263 11 is_stmt 0 view .LVU391 + 1171 0054 0368 ldr r3, [r0] + 1172 .loc 1 1263 66 view .LVU392 + 1173 0056 0C69 ldr r4, [r1, #16] + 1174 .loc 1 1263 56 view .LVU393 + 1175 0058 0CF1180E add lr, ip, #24 + 1176 005c 03EB0E13 add r3, r3, lr, lsl #4 + 1177 0060 5C60 str r4, [r3, #4] +1264:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1265:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Set up the Transmit Global Time mode */ +1266:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if (pHeader->TransmitGlobalTime == ENABLE) + 1178 .loc 1 1266 7 is_stmt 1 view .LVU394 + 1179 .loc 1 1266 18 is_stmt 0 view .LVU395 + 1180 0062 0B7D ldrb r3, [r1, #20] @ zero_extendqisi2 + 1181 .loc 1 1266 10 view .LVU396 + 1182 0064 012B cmp r3, #1 + 1183 0066 35D0 beq .L103 + 1184 .LVL77: + 1185 .L101: +1267:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1268:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** SET_BIT(hcan->Instance->sTxMailBox[transmitmailbox].TDTR, CAN_TDT0R_TGT); +1269:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + ARM GAS /tmp/ccqPwHQi.s page 48 + + +1270:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1271:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Set up the data field */ +1272:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** WRITE_REG(hcan->Instance->sTxMailBox[transmitmailbox].TDHR, + 1186 .loc 1 1272 7 is_stmt 1 view .LVU397 + 1187 0068 D179 ldrb r1, [r2, #7] @ zero_extendqisi2 + 1188 006a 9379 ldrb r3, [r2, #6] @ zero_extendqisi2 + 1189 006c 1B04 lsls r3, r3, #16 + 1190 006e 43EA0163 orr r3, r3, r1, lsl #24 + 1191 0072 5179 ldrb r1, [r2, #5] @ zero_extendqisi2 + 1192 0074 43EA0123 orr r3, r3, r1, lsl #8 + 1193 0078 1479 ldrb r4, [r2, #4] @ zero_extendqisi2 + 1194 007a 0168 ldr r1, [r0] + 1195 007c 2343 orrs r3, r3, r4 + 1196 007e 01EB0C11 add r1, r1, ip, lsl #4 + 1197 0082 C1F88C31 str r3, [r1, #396] +1273:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ((uint32_t)aData[7] << CAN_TDH0R_DATA7_Pos) | +1274:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ((uint32_t)aData[6] << CAN_TDH0R_DATA6_Pos) | +1275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ((uint32_t)aData[5] << CAN_TDH0R_DATA5_Pos) | +1276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ((uint32_t)aData[4] << CAN_TDH0R_DATA4_Pos)); +1277:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** WRITE_REG(hcan->Instance->sTxMailBox[transmitmailbox].TDLR, + 1198 .loc 1 1277 7 view .LVU398 + 1199 0086 D178 ldrb r1, [r2, #3] @ zero_extendqisi2 + 1200 0088 9378 ldrb r3, [r2, #2] @ zero_extendqisi2 + 1201 008a 1B04 lsls r3, r3, #16 + 1202 008c 43EA0163 orr r3, r3, r1, lsl #24 + 1203 0090 5178 ldrb r1, [r2, #1] @ zero_extendqisi2 + 1204 0092 43EA0123 orr r3, r3, r1, lsl #8 + 1205 0096 1178 ldrb r1, [r2] @ zero_extendqisi2 + 1206 0098 0268 ldr r2, [r0] + 1207 .LVL78: + 1208 .loc 1 1277 7 is_stmt 0 view .LVU399 + 1209 009a 0B43 orrs r3, r3, r1 + 1210 009c 02EB0C12 add r2, r2, ip, lsl #4 + 1211 00a0 C2F88831 str r3, [r2, #392] +1278:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ((uint32_t)aData[3] << CAN_TDL0R_DATA3_Pos) | +1279:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ((uint32_t)aData[2] << CAN_TDL0R_DATA2_Pos) | +1280:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ((uint32_t)aData[1] << CAN_TDL0R_DATA1_Pos) | +1281:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ((uint32_t)aData[0] << CAN_TDL0R_DATA0_Pos)); +1282:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1283:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Request transmission */ +1284:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** SET_BIT(hcan->Instance->sTxMailBox[transmitmailbox].TIR, CAN_TI0R_TXRQ); + 1212 .loc 1 1284 7 is_stmt 1 view .LVU400 + 1213 00a4 0268 ldr r2, [r0] + 1214 00a6 0CF1180C add ip, ip, #24 + 1215 .LVL79: + 1216 .loc 1 1284 7 is_stmt 0 view .LVU401 + 1217 00aa 4FEA0C1C lsl ip, ip, #4 + 1218 00ae 52F80C30 ldr r3, [r2, ip] + 1219 00b2 43F00103 orr r3, r3, #1 + 1220 00b6 42F80C30 str r3, [r2, ip] +1285:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1286:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Return function status */ +1287:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** return HAL_OK; + 1221 .loc 1 1287 7 is_stmt 1 view .LVU402 + 1222 .loc 1 1287 14 is_stmt 0 view .LVU403 + 1223 00ba 0020 movs r0, #0 + 1224 .LVL80: + ARM GAS /tmp/ccqPwHQi.s page 49 + + + 1225 .loc 1 1287 14 view .LVU404 + 1226 00bc 1DE0 b .L98 + 1227 .LVL81: + 1228 .L99: +1257:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** pHeader->IDE | + 1229 .loc 1 1257 9 is_stmt 1 view .LVU405 +1257:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** pHeader->IDE | + 1230 .loc 1 1257 68 is_stmt 0 view .LVU406 + 1231 00be 4C68 ldr r4, [r1, #4] +1257:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** pHeader->IDE | + 1232 .loc 1 1257 98 view .LVU407 + 1233 00c0 43EAC403 orr r3, r3, r4, lsl #3 +1259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1234 .loc 1 1259 67 view .LVU408 + 1235 00c4 CC68 ldr r4, [r1, #12] +1258:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** pHeader->RTR); + 1236 .loc 1 1258 73 view .LVU409 + 1237 00c6 2343 orrs r3, r3, r4 +1257:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** pHeader->IDE | + 1238 .loc 1 1257 57 view .LVU410 + 1239 00c8 0CF11804 add r4, ip, #24 + 1240 00cc 2401 lsls r4, r4, #4 + 1241 00ce 0568 ldr r5, [r0] + 1242 00d0 2B51 str r3, [r5, r4] + 1243 00d2 BFE7 b .L100 + 1244 .L103: +1268:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1245 .loc 1 1268 9 is_stmt 1 view .LVU411 + 1246 00d4 0368 ldr r3, [r0] + 1247 00d6 03EB0E13 add r3, r3, lr, lsl #4 + 1248 00da 5968 ldr r1, [r3, #4] + 1249 .LVL82: +1268:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1250 .loc 1 1268 9 is_stmt 0 view .LVU412 + 1251 00dc 41F48071 orr r1, r1, #256 + 1252 00e0 5960 str r1, [r3, #4] + 1253 00e2 C1E7 b .L101 + 1254 .LVL83: + 1255 .L96: +1288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1289:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** else +1290:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Update error code */ +1292:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->ErrorCode |= HAL_CAN_ERROR_PARAM; + 1256 .loc 1 1292 7 is_stmt 1 view .LVU413 + 1257 .loc 1 1292 11 is_stmt 0 view .LVU414 + 1258 00e4 436A ldr r3, [r0, #36] + 1259 .LVL84: + 1260 .loc 1 1292 23 view .LVU415 + 1261 00e6 43F40013 orr r3, r3, #2097152 + 1262 00ea 4362 str r3, [r0, #36] +1293:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** return HAL_ERROR; + 1263 .loc 1 1294 7 is_stmt 1 view .LVU416 + 1264 .loc 1 1294 14 is_stmt 0 view .LVU417 + 1265 00ec 0120 movs r0, #1 + 1266 .LVL85: + ARM GAS /tmp/ccqPwHQi.s page 50 + + + 1267 .loc 1 1294 14 view .LVU418 + 1268 00ee 04E0 b .L98 + 1269 .LVL86: + 1270 .L95: +1295:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1297:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** else +1298:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1299:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Update error code */ +1300:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED; + 1271 .loc 1 1300 5 is_stmt 1 view .LVU419 + 1272 .loc 1 1300 9 is_stmt 0 view .LVU420 + 1273 00f0 436A ldr r3, [r0, #36] + 1274 .LVL87: + 1275 .loc 1 1300 21 view .LVU421 + 1276 00f2 43F48023 orr r3, r3, #262144 + 1277 00f6 4362 str r3, [r0, #36] +1301:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1302:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** return HAL_ERROR; + 1278 .loc 1 1302 5 is_stmt 1 view .LVU422 + 1279 .loc 1 1302 12 is_stmt 0 view .LVU423 + 1280 00f8 0120 movs r0, #1 + 1281 .LVL88: + 1282 .L98: +1303:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1304:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1283 .loc 1 1304 1 view .LVU424 + 1284 00fa 30BD pop {r4, r5, pc} + 1285 .cfi_endproc + 1286 .LFE140: + 1288 .section .text.HAL_CAN_AbortTxRequest,"ax",%progbits + 1289 .align 1 + 1290 .global HAL_CAN_AbortTxRequest + 1291 .syntax unified + 1292 .thumb + 1293 .thumb_func + 1295 HAL_CAN_AbortTxRequest: + 1296 .LVL89: + 1297 .LFB141: +1305:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1306:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** +1307:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief Abort transmission requests +1308:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param hcan pointer to an CAN_HandleTypeDef structure that contains +1309:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * the configuration information for the specified CAN. +1310:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param TxMailboxes List of the Tx Mailboxes to abort. +1311:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * This parameter can be any combination of @arg CAN_Tx_Mailboxes. +1312:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @retval HAL status +1313:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +1314:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_StatusTypeDef HAL_CAN_AbortTxRequest(CAN_HandleTypeDef *hcan, uint32_t TxMailboxes) +1315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 1298 .loc 1 1315 1 is_stmt 1 view -0 + 1299 .cfi_startproc + 1300 @ args = 0, pretend = 0, frame = 0 + 1301 @ frame_needed = 0, uses_anonymous_args = 0 + 1302 @ link register save eliminated. +1316:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_StateTypeDef state = hcan->State; + 1303 .loc 1 1316 3 view .LVU426 + ARM GAS /tmp/ccqPwHQi.s page 51 + + + 1304 .loc 1 1316 24 is_stmt 0 view .LVU427 + 1305 0000 90F82030 ldrb r3, [r0, #32] @ zero_extendqisi2 + 1306 .LVL90: +1317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1318:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Check function parameters */ +1319:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_CAN_TX_MAILBOX_LIST(TxMailboxes)); + 1307 .loc 1 1319 3 is_stmt 1 view .LVU428 +1320:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1321:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((state == HAL_CAN_STATE_READY) || + 1308 .loc 1 1321 3 view .LVU429 + 1309 .loc 1 1321 38 is_stmt 0 view .LVU430 + 1310 0004 013B subs r3, r3, #1 + 1311 .LVL91: + 1312 .loc 1 1321 38 view .LVU431 + 1313 0006 DBB2 uxtb r3, r3 + 1314 .loc 1 1321 6 view .LVU432 + 1315 0008 012B cmp r3, #1 + 1316 000a 05D9 bls .L110 +1322:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (state == HAL_CAN_STATE_LISTENING)) +1323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1324:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Check Tx Mailbox 0 */ +1325:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((TxMailboxes & CAN_TX_MAILBOX0) != 0U) +1326:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1327:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Add cancellation request for Tx Mailbox 0 */ +1328:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ0); +1329:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1330:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1331:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Check Tx Mailbox 1 */ +1332:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((TxMailboxes & CAN_TX_MAILBOX1) != 0U) +1333:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1334:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Add cancellation request for Tx Mailbox 1 */ +1335:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ1); +1336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1337:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1338:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Check Tx Mailbox 2 */ +1339:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((TxMailboxes & CAN_TX_MAILBOX2) != 0U) +1340:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1341:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Add cancellation request for Tx Mailbox 2 */ +1342:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** SET_BIT(hcan->Instance->TSR, CAN_TSR_ABRQ2); +1343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1344:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1345:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Return function status */ +1346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** return HAL_OK; +1347:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1348:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** else +1349:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1350:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Update error code */ +1351:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED; + 1317 .loc 1 1351 5 is_stmt 1 view .LVU433 + 1318 .loc 1 1351 9 is_stmt 0 view .LVU434 + 1319 000c 436A ldr r3, [r0, #36] + 1320 .loc 1 1351 21 view .LVU435 + 1321 000e 43F48023 orr r3, r3, #262144 + 1322 0012 4362 str r3, [r0, #36] +1352:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1353:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** return HAL_ERROR; + 1323 .loc 1 1353 5 is_stmt 1 view .LVU436 + ARM GAS /tmp/ccqPwHQi.s page 52 + + + 1324 .loc 1 1353 12 is_stmt 0 view .LVU437 + 1325 0014 0120 movs r0, #1 + 1326 .LVL92: +1354:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1327 .loc 1 1355 1 view .LVU438 + 1328 0016 7047 bx lr + 1329 .LVL93: + 1330 .L110: +1325:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 1331 .loc 1 1325 5 is_stmt 1 view .LVU439 +1325:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 1332 .loc 1 1325 8 is_stmt 0 view .LVU440 + 1333 0018 11F0010F tst r1, #1 + 1334 001c 04D0 beq .L106 +1328:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1335 .loc 1 1328 7 is_stmt 1 view .LVU441 + 1336 001e 0268 ldr r2, [r0] + 1337 0020 9368 ldr r3, [r2, #8] + 1338 0022 43F08003 orr r3, r3, #128 + 1339 0026 9360 str r3, [r2, #8] + 1340 .L106: +1332:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 1341 .loc 1 1332 5 view .LVU442 +1332:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 1342 .loc 1 1332 8 is_stmt 0 view .LVU443 + 1343 0028 11F0020F tst r1, #2 + 1344 002c 04D0 beq .L107 +1335:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1345 .loc 1 1335 7 is_stmt 1 view .LVU444 + 1346 002e 0268 ldr r2, [r0] + 1347 0030 9368 ldr r3, [r2, #8] + 1348 0032 43F40043 orr r3, r3, #32768 + 1349 0036 9360 str r3, [r2, #8] + 1350 .L107: +1339:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 1351 .loc 1 1339 5 view .LVU445 +1339:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 1352 .loc 1 1339 8 is_stmt 0 view .LVU446 + 1353 0038 11F0040F tst r1, #4 + 1354 003c 04D0 beq .L108 +1342:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1355 .loc 1 1342 7 is_stmt 1 view .LVU447 + 1356 003e 0268 ldr r2, [r0] + 1357 0040 9368 ldr r3, [r2, #8] + 1358 0042 43F40003 orr r3, r3, #8388608 + 1359 0046 9360 str r3, [r2, #8] + 1360 .L108: +1346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1361 .loc 1 1346 5 view .LVU448 +1346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1362 .loc 1 1346 12 is_stmt 0 view .LVU449 + 1363 0048 0020 movs r0, #0 + 1364 .LVL94: +1346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1365 .loc 1 1346 12 view .LVU450 + 1366 004a 7047 bx lr + ARM GAS /tmp/ccqPwHQi.s page 53 + + + 1367 .cfi_endproc + 1368 .LFE141: + 1370 .section .text.HAL_CAN_GetTxMailboxesFreeLevel,"ax",%progbits + 1371 .align 1 + 1372 .global HAL_CAN_GetTxMailboxesFreeLevel + 1373 .syntax unified + 1374 .thumb + 1375 .thumb_func + 1377 HAL_CAN_GetTxMailboxesFreeLevel: + 1378 .LVL95: + 1379 .LFB142: +1356:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1357:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** +1358:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief Return Tx Mailboxes free level: number of free Tx Mailboxes. +1359:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param hcan pointer to a CAN_HandleTypeDef structure that contains +1360:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * the configuration information for the specified CAN. +1361:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @retval Number of free Tx Mailboxes. +1362:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +1363:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t HAL_CAN_GetTxMailboxesFreeLevel(CAN_HandleTypeDef *hcan) +1364:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 1380 .loc 1 1364 1 is_stmt 1 view -0 + 1381 .cfi_startproc + 1382 @ args = 0, pretend = 0, frame = 0 + 1383 @ frame_needed = 0, uses_anonymous_args = 0 + 1384 @ link register save eliminated. +1365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t freelevel = 0U; + 1385 .loc 1 1365 3 view .LVU452 +1366:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_StateTypeDef state = hcan->State; + 1386 .loc 1 1366 3 view .LVU453 + 1387 .loc 1 1366 24 is_stmt 0 view .LVU454 + 1388 0000 90F82030 ldrb r3, [r0, #32] @ zero_extendqisi2 + 1389 .LVL96: +1367:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1368:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((state == HAL_CAN_STATE_READY) || + 1390 .loc 1 1368 3 is_stmt 1 view .LVU455 + 1391 .loc 1 1368 38 is_stmt 0 view .LVU456 + 1392 0004 013B subs r3, r3, #1 + 1393 .LVL97: + 1394 .loc 1 1368 38 view .LVU457 + 1395 0006 DBB2 uxtb r3, r3 + 1396 .loc 1 1368 6 view .LVU458 + 1397 0008 012B cmp r3, #1 + 1398 000a 01D9 bls .L117 +1365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_StateTypeDef state = hcan->State; + 1399 .loc 1 1365 12 view .LVU459 + 1400 000c 0020 movs r0, #0 + 1401 .LVL98: +1369:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (state == HAL_CAN_STATE_LISTENING)) +1370:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1371:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Check Tx Mailbox 0 status */ +1372:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((hcan->Instance->TSR & CAN_TSR_TME0) != 0U) +1373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1374:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** freelevel++; +1375:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1377:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Check Tx Mailbox 1 status */ +1378:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((hcan->Instance->TSR & CAN_TSR_TME1) != 0U) + ARM GAS /tmp/ccqPwHQi.s page 54 + + +1379:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1380:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** freelevel++; +1381:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1382:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Check Tx Mailbox 2 status */ +1384:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((hcan->Instance->TSR & CAN_TSR_TME2) != 0U) +1385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** freelevel++; +1387:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1388:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1389:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1390:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Return Tx Mailboxes free level */ +1391:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** return freelevel; + 1402 .loc 1 1391 3 is_stmt 1 view .LVU460 + 1403 .L111: +1392:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1404 .loc 1 1392 1 is_stmt 0 view .LVU461 + 1405 000e 7047 bx lr + 1406 .LVL99: + 1407 .L117: +1372:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 1408 .loc 1 1372 5 is_stmt 1 view .LVU462 +1372:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 1409 .loc 1 1372 14 is_stmt 0 view .LVU463 + 1410 0010 0368 ldr r3, [r0] +1372:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 1411 .loc 1 1372 24 view .LVU464 + 1412 0012 9868 ldr r0, [r3, #8] + 1413 .LVL100: +1372:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 1414 .loc 1 1372 8 view .LVU465 + 1415 0014 10F08060 ands r0, r0, #67108864 + 1416 0018 00D0 beq .L113 +1374:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1417 .loc 1 1374 16 view .LVU466 + 1418 001a 0120 movs r0, #1 + 1419 .L113: + 1420 .LVL101: +1378:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 1421 .loc 1 1378 5 is_stmt 1 view .LVU467 +1378:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 1422 .loc 1 1378 24 is_stmt 0 view .LVU468 + 1423 001c 9A68 ldr r2, [r3, #8] +1378:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 1424 .loc 1 1378 8 view .LVU469 + 1425 001e 12F0006F tst r2, #134217728 + 1426 0022 00D0 beq .L114 +1380:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1427 .loc 1 1380 7 is_stmt 1 view .LVU470 +1380:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1428 .loc 1 1380 16 is_stmt 0 view .LVU471 + 1429 0024 0130 adds r0, r0, #1 + 1430 .LVL102: + 1431 .L114: +1384:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 1432 .loc 1 1384 5 is_stmt 1 view .LVU472 +1384:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + ARM GAS /tmp/ccqPwHQi.s page 55 + + + 1433 .loc 1 1384 24 is_stmt 0 view .LVU473 + 1434 0026 9B68 ldr r3, [r3, #8] +1384:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 1435 .loc 1 1384 8 view .LVU474 + 1436 0028 13F0805F tst r3, #268435456 + 1437 002c EFD0 beq .L111 +1386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1438 .loc 1 1386 7 is_stmt 1 view .LVU475 +1386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1439 .loc 1 1386 16 is_stmt 0 view .LVU476 + 1440 002e 0130 adds r0, r0, #1 + 1441 .LVL103: +1386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1442 .loc 1 1386 16 view .LVU477 + 1443 0030 7047 bx lr + 1444 .cfi_endproc + 1445 .LFE142: + 1447 .section .text.HAL_CAN_IsTxMessagePending,"ax",%progbits + 1448 .align 1 + 1449 .global HAL_CAN_IsTxMessagePending + 1450 .syntax unified + 1451 .thumb + 1452 .thumb_func + 1454 HAL_CAN_IsTxMessagePending: + 1455 .LVL104: + 1456 .LFB143: +1393:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1394:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** +1395:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief Check if a transmission request is pending on the selected Tx +1396:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * Mailboxes. +1397:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param hcan pointer to an CAN_HandleTypeDef structure that contains +1398:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * the configuration information for the specified CAN. +1399:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param TxMailboxes List of Tx Mailboxes to check. +1400:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * This parameter can be any combination of @arg CAN_Tx_Mailboxes. +1401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @retval Status +1402:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * - 0 : No pending transmission request on any selected Tx Mailboxes. +1403:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * - 1 : Pending transmission request on at least one of the selected +1404:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * Tx Mailbox. +1405:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +1406:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t HAL_CAN_IsTxMessagePending(CAN_HandleTypeDef *hcan, uint32_t TxMailboxes) +1407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 1457 .loc 1 1407 1 is_stmt 1 view -0 + 1458 .cfi_startproc + 1459 @ args = 0, pretend = 0, frame = 0 + 1460 @ frame_needed = 0, uses_anonymous_args = 0 + 1461 @ link register save eliminated. +1408:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t status = 0U; + 1462 .loc 1 1408 3 view .LVU479 +1409:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_StateTypeDef state = hcan->State; + 1463 .loc 1 1409 3 view .LVU480 + 1464 .loc 1 1409 24 is_stmt 0 view .LVU481 + 1465 0000 90F82030 ldrb r3, [r0, #32] @ zero_extendqisi2 + 1466 .LVL105: +1410:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1411:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Check function parameters */ +1412:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_CAN_TX_MAILBOX_LIST(TxMailboxes)); + 1467 .loc 1 1412 3 is_stmt 1 view .LVU482 + ARM GAS /tmp/ccqPwHQi.s page 56 + + +1413:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1414:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((state == HAL_CAN_STATE_READY) || + 1468 .loc 1 1414 3 view .LVU483 + 1469 .loc 1 1414 38 is_stmt 0 view .LVU484 + 1470 0004 013B subs r3, r3, #1 + 1471 .LVL106: + 1472 .loc 1 1414 38 view .LVU485 + 1473 0006 DBB2 uxtb r3, r3 + 1474 .loc 1 1414 6 view .LVU486 + 1475 0008 012B cmp r3, #1 + 1476 000a 01D9 bls .L122 +1408:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_StateTypeDef state = hcan->State; + 1477 .loc 1 1408 12 view .LVU487 + 1478 000c 0020 movs r0, #0 + 1479 .LVL107: +1408:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_StateTypeDef state = hcan->State; + 1480 .loc 1 1408 12 view .LVU488 + 1481 000e 7047 bx lr + 1482 .LVL108: + 1483 .L122: +1415:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (state == HAL_CAN_STATE_LISTENING)) +1416:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1417:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Check pending transmission request on the selected Tx Mailboxes */ +1418:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((hcan->Instance->TSR & (TxMailboxes << CAN_TSR_TME0_Pos)) != (TxMailboxes << CAN_TSR_TME0_P + 1484 .loc 1 1418 5 is_stmt 1 view .LVU489 + 1485 .loc 1 1418 14 is_stmt 0 view .LVU490 + 1486 0010 0368 ldr r3, [r0] + 1487 .loc 1 1418 24 view .LVU491 + 1488 0012 9B68 ldr r3, [r3, #8] + 1489 .loc 1 1418 30 view .LVU492 + 1490 0014 03EA8163 and r3, r3, r1, lsl #26 + 1491 .loc 1 1418 8 view .LVU493 + 1492 0018 B3EB816F cmp r3, r1, lsl #26 + 1493 001c 01D0 beq .L123 +1419:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1420:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** status = 1U; + 1494 .loc 1 1420 14 view .LVU494 + 1495 001e 0120 movs r0, #1 + 1496 .LVL109: +1421:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1422:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1423:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1424:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Return status */ +1425:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** return status; + 1497 .loc 1 1425 3 is_stmt 1 view .LVU495 +1426:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1498 .loc 1 1426 1 is_stmt 0 view .LVU496 + 1499 0020 7047 bx lr + 1500 .LVL110: + 1501 .L123: +1408:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_StateTypeDef state = hcan->State; + 1502 .loc 1 1408 12 view .LVU497 + 1503 0022 0020 movs r0, #0 + 1504 .LVL111: +1408:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_StateTypeDef state = hcan->State; + 1505 .loc 1 1408 12 view .LVU498 + 1506 0024 7047 bx lr + ARM GAS /tmp/ccqPwHQi.s page 57 + + + 1507 .cfi_endproc + 1508 .LFE143: + 1510 .section .text.HAL_CAN_GetTxTimestamp,"ax",%progbits + 1511 .align 1 + 1512 .global HAL_CAN_GetTxTimestamp + 1513 .syntax unified + 1514 .thumb + 1515 .thumb_func + 1517 HAL_CAN_GetTxTimestamp: + 1518 .LVL112: + 1519 .LFB144: +1427:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1428:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** +1429:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief Return timestamp of Tx message sent, if time triggered communication +1430:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** mode is enabled. +1431:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param hcan pointer to a CAN_HandleTypeDef structure that contains +1432:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * the configuration information for the specified CAN. +1433:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param TxMailbox Tx Mailbox where the timestamp of message sent will be +1434:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * read. +1435:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * This parameter can be one value of @arg CAN_Tx_Mailboxes. +1436:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @retval Timestamp of message sent from Tx Mailbox. +1437:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +1438:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t HAL_CAN_GetTxTimestamp(CAN_HandleTypeDef *hcan, uint32_t TxMailbox) +1439:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 1520 .loc 1 1439 1 is_stmt 1 view -0 + 1521 .cfi_startproc + 1522 @ args = 0, pretend = 0, frame = 0 + 1523 @ frame_needed = 0, uses_anonymous_args = 0 + 1524 @ link register save eliminated. +1440:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t timestamp = 0U; + 1525 .loc 1 1440 3 view .LVU500 +1441:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t transmitmailbox; + 1526 .loc 1 1441 3 view .LVU501 +1442:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_StateTypeDef state = hcan->State; + 1527 .loc 1 1442 3 view .LVU502 + 1528 .loc 1 1442 24 is_stmt 0 view .LVU503 + 1529 0000 90F82030 ldrb r3, [r0, #32] @ zero_extendqisi2 + 1530 .LVL113: +1443:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1444:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Check function parameters */ +1445:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_CAN_TX_MAILBOX(TxMailbox)); + 1531 .loc 1 1445 3 is_stmt 1 view .LVU504 +1446:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1447:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((state == HAL_CAN_STATE_READY) || + 1532 .loc 1 1447 3 view .LVU505 + 1533 .loc 1 1447 38 is_stmt 0 view .LVU506 + 1534 0004 013B subs r3, r3, #1 + 1535 .LVL114: + 1536 .loc 1 1447 38 view .LVU507 + 1537 0006 DBB2 uxtb r3, r3 + 1538 .loc 1 1447 6 view .LVU508 + 1539 0008 012B cmp r3, #1 + 1540 000a 01D9 bls .L127 +1440:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t transmitmailbox; + 1541 .loc 1 1440 12 view .LVU509 + 1542 000c 0020 movs r0, #0 + 1543 .LVL115: + ARM GAS /tmp/ccqPwHQi.s page 58 + + +1448:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (state == HAL_CAN_STATE_LISTENING)) +1449:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1450:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Select the Tx mailbox */ +1451:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** transmitmailbox = POSITION_VAL(TxMailbox); +1452:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1453:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Get timestamp */ +1454:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** timestamp = (hcan->Instance->sTxMailBox[transmitmailbox].TDTR & CAN_TDT0R_TIME) >> CAN_TDT0R_TI +1455:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1456:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1457:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Return the timestamp */ +1458:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** return timestamp; + 1544 .loc 1 1458 3 is_stmt 1 view .LVU510 +1459:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1545 .loc 1 1459 1 is_stmt 0 view .LVU511 + 1546 000e 7047 bx lr + 1547 .LVL116: + 1548 .L127: +1451:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 1549 .loc 1 1451 5 is_stmt 1 view .LVU512 + 1550 .LBB4: + 1551 .LBI4: + 1552 .file 2 "Drivers/CMSIS/Include/cmsis_gcc.h" + 1:Drivers/CMSIS/Include/cmsis_gcc.h **** /**************************************************************************//** + 2:Drivers/CMSIS/Include/cmsis_gcc.h **** * @file cmsis_gcc.h + 3:Drivers/CMSIS/Include/cmsis_gcc.h **** * @brief CMSIS compiler GCC header file + 4:Drivers/CMSIS/Include/cmsis_gcc.h **** * @version V5.0.4 + 5:Drivers/CMSIS/Include/cmsis_gcc.h **** * @date 09. April 2018 + 6:Drivers/CMSIS/Include/cmsis_gcc.h **** ******************************************************************************/ + 7:Drivers/CMSIS/Include/cmsis_gcc.h **** /* + 8:Drivers/CMSIS/Include/cmsis_gcc.h **** * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + 9:Drivers/CMSIS/Include/cmsis_gcc.h **** * + 10:Drivers/CMSIS/Include/cmsis_gcc.h **** * SPDX-License-Identifier: Apache-2.0 + 11:Drivers/CMSIS/Include/cmsis_gcc.h **** * + 12:Drivers/CMSIS/Include/cmsis_gcc.h **** * Licensed under the Apache License, Version 2.0 (the License); you may + 13:Drivers/CMSIS/Include/cmsis_gcc.h **** * not use this file except in compliance with the License. + 14:Drivers/CMSIS/Include/cmsis_gcc.h **** * You may obtain a copy of the License at + 15:Drivers/CMSIS/Include/cmsis_gcc.h **** * + 16:Drivers/CMSIS/Include/cmsis_gcc.h **** * www.apache.org/licenses/LICENSE-2.0 + 17:Drivers/CMSIS/Include/cmsis_gcc.h **** * + 18:Drivers/CMSIS/Include/cmsis_gcc.h **** * Unless required by applicable law or agreed to in writing, software + 19:Drivers/CMSIS/Include/cmsis_gcc.h **** * distributed under the License is distributed on an AS IS BASIS, WITHOUT + 20:Drivers/CMSIS/Include/cmsis_gcc.h **** * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + 21:Drivers/CMSIS/Include/cmsis_gcc.h **** * See the License for the specific language governing permissions and + 22:Drivers/CMSIS/Include/cmsis_gcc.h **** * limitations under the License. + 23:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 24:Drivers/CMSIS/Include/cmsis_gcc.h **** + 25:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __CMSIS_GCC_H + 26:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __CMSIS_GCC_H + 27:Drivers/CMSIS/Include/cmsis_gcc.h **** + 28:Drivers/CMSIS/Include/cmsis_gcc.h **** /* ignore some GCC warnings */ + 29:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic push + 30:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wsign-conversion" + 31:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wconversion" + 32:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wunused-parameter" + 33:Drivers/CMSIS/Include/cmsis_gcc.h **** + 34:Drivers/CMSIS/Include/cmsis_gcc.h **** /* Fallback for __has_builtin */ + 35:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __has_builtin + ARM GAS /tmp/ccqPwHQi.s page 59 + + + 36:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __has_builtin(x) (0) + 37:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 38:Drivers/CMSIS/Include/cmsis_gcc.h **** + 39:Drivers/CMSIS/Include/cmsis_gcc.h **** /* CMSIS compiler specific defines */ + 40:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __ASM + 41:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __ASM __asm + 42:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 43:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __INLINE + 44:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __INLINE inline + 45:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 46:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __STATIC_INLINE + 47:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __STATIC_INLINE static inline + 48:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 49:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __STATIC_FORCEINLINE + 50:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __STATIC_FORCEINLINE __attribute__((always_inline)) static inline + 51:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 52:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __NO_RETURN + 53:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __NO_RETURN __attribute__((__noreturn__)) + 54:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 55:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __USED + 56:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __USED __attribute__((used)) + 57:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 58:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __WEAK + 59:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __WEAK __attribute__((weak)) + 60:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 61:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __PACKED + 62:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __PACKED __attribute__((packed, aligned(1))) + 63:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 64:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __PACKED_STRUCT + 65:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) + 66:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 67:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __PACKED_UNION + 68:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __PACKED_UNION union __attribute__((packed, aligned(1))) + 69:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 70:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __UNALIGNED_UINT32 /* deprecated */ + 71:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic push + 72:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wpacked" + 73:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wattributes" + 74:Drivers/CMSIS/Include/cmsis_gcc.h **** struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + 75:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic pop + 76:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + 77:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 78:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __UNALIGNED_UINT16_WRITE + 79:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic push + 80:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wpacked" + 81:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wattributes" + 82:Drivers/CMSIS/Include/cmsis_gcc.h **** __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + 83:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic pop + 84:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))- + 85:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 86:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __UNALIGNED_UINT16_READ + 87:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic push + 88:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wpacked" + 89:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wattributes" + 90:Drivers/CMSIS/Include/cmsis_gcc.h **** __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + 91:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic pop + 92:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(add + ARM GAS /tmp/ccqPwHQi.s page 60 + + + 93:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 94:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __UNALIGNED_UINT32_WRITE + 95:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic push + 96:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wpacked" + 97:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wattributes" + 98:Drivers/CMSIS/Include/cmsis_gcc.h **** __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + 99:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic pop + 100:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))- + 101:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 102:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __UNALIGNED_UINT32_READ + 103:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic push + 104:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wpacked" + 105:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wattributes" + 106:Drivers/CMSIS/Include/cmsis_gcc.h **** __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + 107:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic pop + 108:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(add + 109:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 110:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __ALIGNED + 111:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __ALIGNED(x) __attribute__((aligned(x))) + 112:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 113:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __RESTRICT + 114:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __RESTRICT __restrict + 115:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 116:Drivers/CMSIS/Include/cmsis_gcc.h **** + 117:Drivers/CMSIS/Include/cmsis_gcc.h **** + 118:Drivers/CMSIS/Include/cmsis_gcc.h **** /* ########################### Core Function Access ########################### */ + 119:Drivers/CMSIS/Include/cmsis_gcc.h **** /** \ingroup CMSIS_Core_FunctionInterface + 120:Drivers/CMSIS/Include/cmsis_gcc.h **** \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + 121:Drivers/CMSIS/Include/cmsis_gcc.h **** @{ + 122:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 123:Drivers/CMSIS/Include/cmsis_gcc.h **** + 124:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 125:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Enable IRQ Interrupts + 126:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + 127:Drivers/CMSIS/Include/cmsis_gcc.h **** Can only be executed in Privileged modes. + 128:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 129:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __enable_irq(void) + 130:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 131:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("cpsie i" : : : "memory"); + 132:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 133:Drivers/CMSIS/Include/cmsis_gcc.h **** + 134:Drivers/CMSIS/Include/cmsis_gcc.h **** + 135:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 136:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Disable IRQ Interrupts + 137:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Disables IRQ interrupts by setting the I-bit in the CPSR. + 138:Drivers/CMSIS/Include/cmsis_gcc.h **** Can only be executed in Privileged modes. + 139:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 140:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __disable_irq(void) + 141:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 142:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("cpsid i" : : : "memory"); + 143:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 144:Drivers/CMSIS/Include/cmsis_gcc.h **** + 145:Drivers/CMSIS/Include/cmsis_gcc.h **** + 146:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 147:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Control Register + 148:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the content of the Control Register. + 149:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Control Register value + ARM GAS /tmp/ccqPwHQi.s page 61 + + + 150:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 151:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_CONTROL(void) + 152:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 153:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 154:Drivers/CMSIS/Include/cmsis_gcc.h **** + 155:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, control" : "=r" (result) ); + 156:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 157:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 158:Drivers/CMSIS/Include/cmsis_gcc.h **** + 159:Drivers/CMSIS/Include/cmsis_gcc.h **** + 160:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 161:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 162:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Control Register (non-secure) + 163:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the content of the non-secure Control Register when in secure mode. + 164:Drivers/CMSIS/Include/cmsis_gcc.h **** \return non-secure Control Register value + 165:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 166:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) + 167:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 168:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 169:Drivers/CMSIS/Include/cmsis_gcc.h **** + 170:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); + 171:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 172:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 173:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 174:Drivers/CMSIS/Include/cmsis_gcc.h **** + 175:Drivers/CMSIS/Include/cmsis_gcc.h **** + 176:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 177:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Control Register + 178:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Writes the given value to the Control Register. + 179:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] control Control Register value to set + 180:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 181:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) + 182:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 183:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); + 184:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 185:Drivers/CMSIS/Include/cmsis_gcc.h **** + 186:Drivers/CMSIS/Include/cmsis_gcc.h **** + 187:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 188:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 189:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Control Register (non-secure) + 190:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Writes the given value to the non-secure Control Register when in secure state. + 191:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] control Control Register value to set + 192:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 193:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) + 194:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 195:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); + 196:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 197:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 198:Drivers/CMSIS/Include/cmsis_gcc.h **** + 199:Drivers/CMSIS/Include/cmsis_gcc.h **** + 200:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 201:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get IPSR Register + 202:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the content of the IPSR Register. + 203:Drivers/CMSIS/Include/cmsis_gcc.h **** \return IPSR Register value + 204:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 205:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_IPSR(void) + 206:Drivers/CMSIS/Include/cmsis_gcc.h **** { + ARM GAS /tmp/ccqPwHQi.s page 62 + + + 207:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 208:Drivers/CMSIS/Include/cmsis_gcc.h **** + 209:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); + 210:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 211:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 212:Drivers/CMSIS/Include/cmsis_gcc.h **** + 213:Drivers/CMSIS/Include/cmsis_gcc.h **** + 214:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 215:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get APSR Register + 216:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the content of the APSR Register. + 217:Drivers/CMSIS/Include/cmsis_gcc.h **** \return APSR Register value + 218:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 219:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_APSR(void) + 220:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 221:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 222:Drivers/CMSIS/Include/cmsis_gcc.h **** + 223:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, apsr" : "=r" (result) ); + 224:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 225:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 226:Drivers/CMSIS/Include/cmsis_gcc.h **** + 227:Drivers/CMSIS/Include/cmsis_gcc.h **** + 228:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 229:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get xPSR Register + 230:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the content of the xPSR Register. + 231:Drivers/CMSIS/Include/cmsis_gcc.h **** \return xPSR Register value + 232:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 233:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_xPSR(void) + 234:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 235:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 236:Drivers/CMSIS/Include/cmsis_gcc.h **** + 237:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); + 238:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 239:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 240:Drivers/CMSIS/Include/cmsis_gcc.h **** + 241:Drivers/CMSIS/Include/cmsis_gcc.h **** + 242:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 243:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Process Stack Pointer + 244:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the Process Stack Pointer (PSP). + 245:Drivers/CMSIS/Include/cmsis_gcc.h **** \return PSP Register value + 246:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 247:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_PSP(void) + 248:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 249:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 250:Drivers/CMSIS/Include/cmsis_gcc.h **** + 251:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, psp" : "=r" (result) ); + 252:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 253:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 254:Drivers/CMSIS/Include/cmsis_gcc.h **** + 255:Drivers/CMSIS/Include/cmsis_gcc.h **** + 256:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 257:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 258:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Process Stack Pointer (non-secure) + 259:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure s + 260:Drivers/CMSIS/Include/cmsis_gcc.h **** \return PSP Register value + 261:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 262:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) + 263:Drivers/CMSIS/Include/cmsis_gcc.h **** { + ARM GAS /tmp/ccqPwHQi.s page 63 + + + 264:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 265:Drivers/CMSIS/Include/cmsis_gcc.h **** + 266:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); + 267:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 268:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 269:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 270:Drivers/CMSIS/Include/cmsis_gcc.h **** + 271:Drivers/CMSIS/Include/cmsis_gcc.h **** + 272:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 273:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Process Stack Pointer + 274:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Process Stack Pointer (PSP). + 275:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] topOfProcStack Process Stack Pointer value to set + 276:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 277:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) + 278:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 279:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); + 280:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 281:Drivers/CMSIS/Include/cmsis_gcc.h **** + 282:Drivers/CMSIS/Include/cmsis_gcc.h **** + 283:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 284:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 285:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Process Stack Pointer (non-secure) + 286:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure sta + 287:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] topOfProcStack Process Stack Pointer value to set + 288:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 289:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) + 290:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 291:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); + 292:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 293:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 294:Drivers/CMSIS/Include/cmsis_gcc.h **** + 295:Drivers/CMSIS/Include/cmsis_gcc.h **** + 296:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 297:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Main Stack Pointer + 298:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the Main Stack Pointer (MSP). + 299:Drivers/CMSIS/Include/cmsis_gcc.h **** \return MSP Register value + 300:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 301:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_MSP(void) + 302:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 303:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 304:Drivers/CMSIS/Include/cmsis_gcc.h **** + 305:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, msp" : "=r" (result) ); + 306:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 307:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 308:Drivers/CMSIS/Include/cmsis_gcc.h **** + 309:Drivers/CMSIS/Include/cmsis_gcc.h **** + 310:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 311:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 312:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Main Stack Pointer (non-secure) + 313:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure stat + 314:Drivers/CMSIS/Include/cmsis_gcc.h **** \return MSP Register value + 315:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 316:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) + 317:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 318:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 319:Drivers/CMSIS/Include/cmsis_gcc.h **** + 320:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); + ARM GAS /tmp/ccqPwHQi.s page 64 + + + 321:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 322:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 323:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 324:Drivers/CMSIS/Include/cmsis_gcc.h **** + 325:Drivers/CMSIS/Include/cmsis_gcc.h **** + 326:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 327:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Main Stack Pointer + 328:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Main Stack Pointer (MSP). + 329:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] topOfMainStack Main Stack Pointer value to set + 330:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 331:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) + 332:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 333:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); + 334:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 335:Drivers/CMSIS/Include/cmsis_gcc.h **** + 336:Drivers/CMSIS/Include/cmsis_gcc.h **** + 337:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 338:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 339:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Main Stack Pointer (non-secure) + 340:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. + 341:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] topOfMainStack Main Stack Pointer value to set + 342:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 343:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) + 344:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 345:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); + 346:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 347:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 348:Drivers/CMSIS/Include/cmsis_gcc.h **** + 349:Drivers/CMSIS/Include/cmsis_gcc.h **** + 350:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 351:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 352:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Stack Pointer (non-secure) + 353:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. + 354:Drivers/CMSIS/Include/cmsis_gcc.h **** \return SP Register value + 355:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 356:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) + 357:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 358:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 359:Drivers/CMSIS/Include/cmsis_gcc.h **** + 360:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); + 361:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 362:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 363:Drivers/CMSIS/Include/cmsis_gcc.h **** + 364:Drivers/CMSIS/Include/cmsis_gcc.h **** + 365:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 366:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Stack Pointer (non-secure) + 367:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. + 368:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] topOfStack Stack Pointer value to set + 369:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 370:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) + 371:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 372:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); + 373:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 374:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 375:Drivers/CMSIS/Include/cmsis_gcc.h **** + 376:Drivers/CMSIS/Include/cmsis_gcc.h **** + 377:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + ARM GAS /tmp/ccqPwHQi.s page 65 + + + 378:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Priority Mask + 379:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current state of the priority mask bit from the Priority Mask Register. + 380:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Priority Mask value + 381:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 382:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) + 383:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 384:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 385:Drivers/CMSIS/Include/cmsis_gcc.h **** + 386:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, primask" : "=r" (result) :: "memory"); + 387:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 388:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 389:Drivers/CMSIS/Include/cmsis_gcc.h **** + 390:Drivers/CMSIS/Include/cmsis_gcc.h **** + 391:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 392:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 393:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Priority Mask (non-secure) + 394:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current state of the non-secure priority mask bit from the Priority Mask Reg + 395:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Priority Mask value + 396:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 397:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) + 398:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 399:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 400:Drivers/CMSIS/Include/cmsis_gcc.h **** + 401:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, primask_ns" : "=r" (result) :: "memory"); + 402:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 403:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 404:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 405:Drivers/CMSIS/Include/cmsis_gcc.h **** + 406:Drivers/CMSIS/Include/cmsis_gcc.h **** + 407:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 408:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Priority Mask + 409:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Priority Mask Register. + 410:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] priMask Priority Mask + 411:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 412:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) + 413:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 414:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); + 415:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 416:Drivers/CMSIS/Include/cmsis_gcc.h **** + 417:Drivers/CMSIS/Include/cmsis_gcc.h **** + 418:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 419:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 420:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Priority Mask (non-secure) + 421:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the non-secure Priority Mask Register when in secure state. + 422:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] priMask Priority Mask + 423:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 424:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) + 425:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 426:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); + 427:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 428:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 429:Drivers/CMSIS/Include/cmsis_gcc.h **** + 430:Drivers/CMSIS/Include/cmsis_gcc.h **** + 431:Drivers/CMSIS/Include/cmsis_gcc.h **** #if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + 432:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + 433:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + 434:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + ARM GAS /tmp/ccqPwHQi.s page 66 + + + 435:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Enable FIQ + 436:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Enables FIQ interrupts by clearing the F-bit in the CPSR. + 437:Drivers/CMSIS/Include/cmsis_gcc.h **** Can only be executed in Privileged modes. + 438:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 439:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __enable_fault_irq(void) + 440:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 441:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("cpsie f" : : : "memory"); + 442:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 443:Drivers/CMSIS/Include/cmsis_gcc.h **** + 444:Drivers/CMSIS/Include/cmsis_gcc.h **** + 445:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 446:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Disable FIQ + 447:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Disables FIQ interrupts by setting the F-bit in the CPSR. + 448:Drivers/CMSIS/Include/cmsis_gcc.h **** Can only be executed in Privileged modes. + 449:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 450:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __disable_fault_irq(void) + 451:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 452:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("cpsid f" : : : "memory"); + 453:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 454:Drivers/CMSIS/Include/cmsis_gcc.h **** + 455:Drivers/CMSIS/Include/cmsis_gcc.h **** + 456:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 457:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Base Priority + 458:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the Base Priority register. + 459:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Base Priority register value + 460:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 461:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) + 462:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 463:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 464:Drivers/CMSIS/Include/cmsis_gcc.h **** + 465:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, basepri" : "=r" (result) ); + 466:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 467:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 468:Drivers/CMSIS/Include/cmsis_gcc.h **** + 469:Drivers/CMSIS/Include/cmsis_gcc.h **** + 470:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 471:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 472:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Base Priority (non-secure) + 473:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the non-secure Base Priority register when in secure state. + 474:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Base Priority register value + 475:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 476:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) + 477:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 478:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 479:Drivers/CMSIS/Include/cmsis_gcc.h **** + 480:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); + 481:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 482:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 483:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 484:Drivers/CMSIS/Include/cmsis_gcc.h **** + 485:Drivers/CMSIS/Include/cmsis_gcc.h **** + 486:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 487:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Base Priority + 488:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Base Priority register. + 489:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] basePri Base Priority value to set + 490:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 491:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) + ARM GAS /tmp/ccqPwHQi.s page 67 + + + 492:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 493:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); + 494:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 495:Drivers/CMSIS/Include/cmsis_gcc.h **** + 496:Drivers/CMSIS/Include/cmsis_gcc.h **** + 497:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 498:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 499:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Base Priority (non-secure) + 500:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the non-secure Base Priority register when in secure state. + 501:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] basePri Base Priority value to set + 502:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 503:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) + 504:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 505:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); + 506:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 507:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 508:Drivers/CMSIS/Include/cmsis_gcc.h **** + 509:Drivers/CMSIS/Include/cmsis_gcc.h **** + 510:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 511:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Base Priority with condition + 512:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Base Priority register only if BASEPRI masking is disable + 513:Drivers/CMSIS/Include/cmsis_gcc.h **** or the new value increases the BASEPRI priority level. + 514:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] basePri Base Priority value to set + 515:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 516:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) + 517:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 518:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); + 519:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 520:Drivers/CMSIS/Include/cmsis_gcc.h **** + 521:Drivers/CMSIS/Include/cmsis_gcc.h **** + 522:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 523:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Fault Mask + 524:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the Fault Mask register. + 525:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Fault Mask register value + 526:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 527:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) + 528:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 529:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 530:Drivers/CMSIS/Include/cmsis_gcc.h **** + 531:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + 532:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 533:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 534:Drivers/CMSIS/Include/cmsis_gcc.h **** + 535:Drivers/CMSIS/Include/cmsis_gcc.h **** + 536:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 537:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 538:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Fault Mask (non-secure) + 539:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the non-secure Fault Mask register when in secure state. + 540:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Fault Mask register value + 541:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 542:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) + 543:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 544:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 545:Drivers/CMSIS/Include/cmsis_gcc.h **** + 546:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); + 547:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 548:Drivers/CMSIS/Include/cmsis_gcc.h **** } + ARM GAS /tmp/ccqPwHQi.s page 68 + + + 549:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 550:Drivers/CMSIS/Include/cmsis_gcc.h **** + 551:Drivers/CMSIS/Include/cmsis_gcc.h **** + 552:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 553:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Fault Mask + 554:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Fault Mask register. + 555:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] faultMask Fault Mask value to set + 556:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 557:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) + 558:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 559:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); + 560:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 561:Drivers/CMSIS/Include/cmsis_gcc.h **** + 562:Drivers/CMSIS/Include/cmsis_gcc.h **** + 563:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 564:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 565:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Fault Mask (non-secure) + 566:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the non-secure Fault Mask register when in secure state. + 567:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] faultMask Fault Mask value to set + 568:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 569:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) + 570:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 571:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); + 572:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 573:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 574:Drivers/CMSIS/Include/cmsis_gcc.h **** + 575:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + 576:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + 577:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + 578:Drivers/CMSIS/Include/cmsis_gcc.h **** + 579:Drivers/CMSIS/Include/cmsis_gcc.h **** + 580:Drivers/CMSIS/Include/cmsis_gcc.h **** #if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + 581:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + 582:Drivers/CMSIS/Include/cmsis_gcc.h **** + 583:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 584:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Process Stack Pointer Limit + 585:Drivers/CMSIS/Include/cmsis_gcc.h **** Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + 586:Drivers/CMSIS/Include/cmsis_gcc.h **** Stack Pointer Limit register hence zero is returned always in non-secure + 587:Drivers/CMSIS/Include/cmsis_gcc.h **** mode. + 588:Drivers/CMSIS/Include/cmsis_gcc.h **** + 589:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). + 590:Drivers/CMSIS/Include/cmsis_gcc.h **** \return PSPLIM Register value + 591:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 592:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) + 593:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 594:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + 595:Drivers/CMSIS/Include/cmsis_gcc.h **** (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + 596:Drivers/CMSIS/Include/cmsis_gcc.h **** // without main extensions, the non-secure PSPLIM is RAZ/WI + 597:Drivers/CMSIS/Include/cmsis_gcc.h **** return 0U; + 598:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 599:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 600:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, psplim" : "=r" (result) ); + 601:Drivers/CMSIS/Include/cmsis_gcc.h **** return result; + 602:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 603:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 604:Drivers/CMSIS/Include/cmsis_gcc.h **** + 605:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)) + ARM GAS /tmp/ccqPwHQi.s page 69 + + + 606:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 607:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Process Stack Pointer Limit (non-secure) + 608:Drivers/CMSIS/Include/cmsis_gcc.h **** Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + 609:Drivers/CMSIS/Include/cmsis_gcc.h **** Stack Pointer Limit register hence zero is returned always. + 610:Drivers/CMSIS/Include/cmsis_gcc.h **** + 611:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in + 612:Drivers/CMSIS/Include/cmsis_gcc.h **** \return PSPLIM Register value + 613:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 614:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) + 615:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 616:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + 617:Drivers/CMSIS/Include/cmsis_gcc.h **** // without main extensions, the non-secure PSPLIM is RAZ/WI + 618:Drivers/CMSIS/Include/cmsis_gcc.h **** return 0U; + 619:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 620:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 621:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); + 622:Drivers/CMSIS/Include/cmsis_gcc.h **** return result; + 623:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 624:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 625:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 626:Drivers/CMSIS/Include/cmsis_gcc.h **** + 627:Drivers/CMSIS/Include/cmsis_gcc.h **** + 628:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 629:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Process Stack Pointer Limit + 630:Drivers/CMSIS/Include/cmsis_gcc.h **** Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + 631:Drivers/CMSIS/Include/cmsis_gcc.h **** Stack Pointer Limit register hence the write is silently ignored in non-secure + 632:Drivers/CMSIS/Include/cmsis_gcc.h **** mode. + 633:Drivers/CMSIS/Include/cmsis_gcc.h **** + 634:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). + 635:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + 636:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 637:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) + 638:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 639:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + 640:Drivers/CMSIS/Include/cmsis_gcc.h **** (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + 641:Drivers/CMSIS/Include/cmsis_gcc.h **** // without main extensions, the non-secure PSPLIM is RAZ/WI + 642:Drivers/CMSIS/Include/cmsis_gcc.h **** (void)ProcStackPtrLimit; + 643:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 644:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); + 645:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 646:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 647:Drivers/CMSIS/Include/cmsis_gcc.h **** + 648:Drivers/CMSIS/Include/cmsis_gcc.h **** + 649:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 650:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 651:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Process Stack Pointer (non-secure) + 652:Drivers/CMSIS/Include/cmsis_gcc.h **** Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + 653:Drivers/CMSIS/Include/cmsis_gcc.h **** Stack Pointer Limit register hence the write is silently ignored. + 654:Drivers/CMSIS/Include/cmsis_gcc.h **** + 655:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in s + 656:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + 657:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 658:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) + 659:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 660:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + 661:Drivers/CMSIS/Include/cmsis_gcc.h **** // without main extensions, the non-secure PSPLIM is RAZ/WI + 662:Drivers/CMSIS/Include/cmsis_gcc.h **** (void)ProcStackPtrLimit; + ARM GAS /tmp/ccqPwHQi.s page 70 + + + 663:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 664:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); + 665:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 666:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 667:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 668:Drivers/CMSIS/Include/cmsis_gcc.h **** + 669:Drivers/CMSIS/Include/cmsis_gcc.h **** + 670:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 671:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Main Stack Pointer Limit + 672:Drivers/CMSIS/Include/cmsis_gcc.h **** Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + 673:Drivers/CMSIS/Include/cmsis_gcc.h **** Stack Pointer Limit register hence zero is returned always in non-secure + 674:Drivers/CMSIS/Include/cmsis_gcc.h **** mode. + 675:Drivers/CMSIS/Include/cmsis_gcc.h **** + 676:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). + 677:Drivers/CMSIS/Include/cmsis_gcc.h **** \return MSPLIM Register value + 678:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 679:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) + 680:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 681:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + 682:Drivers/CMSIS/Include/cmsis_gcc.h **** (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + 683:Drivers/CMSIS/Include/cmsis_gcc.h **** // without main extensions, the non-secure MSPLIM is RAZ/WI + 684:Drivers/CMSIS/Include/cmsis_gcc.h **** return 0U; + 685:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 686:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 687:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, msplim" : "=r" (result) ); + 688:Drivers/CMSIS/Include/cmsis_gcc.h **** return result; + 689:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 690:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 691:Drivers/CMSIS/Include/cmsis_gcc.h **** + 692:Drivers/CMSIS/Include/cmsis_gcc.h **** + 693:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 694:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 695:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Main Stack Pointer Limit (non-secure) + 696:Drivers/CMSIS/Include/cmsis_gcc.h **** Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + 697:Drivers/CMSIS/Include/cmsis_gcc.h **** Stack Pointer Limit register hence zero is returned always. + 698:Drivers/CMSIS/Include/cmsis_gcc.h **** + 699:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in sec + 700:Drivers/CMSIS/Include/cmsis_gcc.h **** \return MSPLIM Register value + 701:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 702:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) + 703:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 704:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + 705:Drivers/CMSIS/Include/cmsis_gcc.h **** // without main extensions, the non-secure MSPLIM is RAZ/WI + 706:Drivers/CMSIS/Include/cmsis_gcc.h **** return 0U; + 707:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 708:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 709:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); + 710:Drivers/CMSIS/Include/cmsis_gcc.h **** return result; + 711:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 712:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 713:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 714:Drivers/CMSIS/Include/cmsis_gcc.h **** + 715:Drivers/CMSIS/Include/cmsis_gcc.h **** + 716:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 717:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Main Stack Pointer Limit + 718:Drivers/CMSIS/Include/cmsis_gcc.h **** Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + 719:Drivers/CMSIS/Include/cmsis_gcc.h **** Stack Pointer Limit register hence the write is silently ignored in non-secure + ARM GAS /tmp/ccqPwHQi.s page 71 + + + 720:Drivers/CMSIS/Include/cmsis_gcc.h **** mode. + 721:Drivers/CMSIS/Include/cmsis_gcc.h **** + 722:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). + 723:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set + 724:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 725:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) + 726:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 727:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + 728:Drivers/CMSIS/Include/cmsis_gcc.h **** (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + 729:Drivers/CMSIS/Include/cmsis_gcc.h **** // without main extensions, the non-secure MSPLIM is RAZ/WI + 730:Drivers/CMSIS/Include/cmsis_gcc.h **** (void)MainStackPtrLimit; + 731:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 732:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); + 733:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 734:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 735:Drivers/CMSIS/Include/cmsis_gcc.h **** + 736:Drivers/CMSIS/Include/cmsis_gcc.h **** + 737:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 738:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 739:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Main Stack Pointer Limit (non-secure) + 740:Drivers/CMSIS/Include/cmsis_gcc.h **** Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + 741:Drivers/CMSIS/Include/cmsis_gcc.h **** Stack Pointer Limit register hence the write is silently ignored. + 742:Drivers/CMSIS/Include/cmsis_gcc.h **** + 743:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secu + 744:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] MainStackPtrLimit Main Stack Pointer value to set + 745:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 746:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) + 747:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 748:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + 749:Drivers/CMSIS/Include/cmsis_gcc.h **** // without main extensions, the non-secure MSPLIM is RAZ/WI + 750:Drivers/CMSIS/Include/cmsis_gcc.h **** (void)MainStackPtrLimit; + 751:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 752:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); + 753:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 754:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 755:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 756:Drivers/CMSIS/Include/cmsis_gcc.h **** + 757:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + 758:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + 759:Drivers/CMSIS/Include/cmsis_gcc.h **** + 760:Drivers/CMSIS/Include/cmsis_gcc.h **** + 761:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 762:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get FPSCR + 763:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the Floating Point Status/Control register. + 764:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Floating Point Status/Control register value + 765:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 766:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_FPSCR(void) + 767:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 768:Drivers/CMSIS/Include/cmsis_gcc.h **** #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + 769:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + 770:Drivers/CMSIS/Include/cmsis_gcc.h **** #if __has_builtin(__builtin_arm_get_fpscr) + 771:Drivers/CMSIS/Include/cmsis_gcc.h **** // Re-enable using built-in when GCC has been fixed + 772:Drivers/CMSIS/Include/cmsis_gcc.h **** // || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) + 773:Drivers/CMSIS/Include/cmsis_gcc.h **** /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ + 774:Drivers/CMSIS/Include/cmsis_gcc.h **** return __builtin_arm_get_fpscr(); + 775:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 776:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + ARM GAS /tmp/ccqPwHQi.s page 72 + + + 777:Drivers/CMSIS/Include/cmsis_gcc.h **** + 778:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); + 779:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 780:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 781:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 782:Drivers/CMSIS/Include/cmsis_gcc.h **** return(0U); + 783:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 784:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 785:Drivers/CMSIS/Include/cmsis_gcc.h **** + 786:Drivers/CMSIS/Include/cmsis_gcc.h **** + 787:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 788:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set FPSCR + 789:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Floating Point Status/Control register. + 790:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] fpscr Floating Point Status/Control value to set + 791:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 792:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_FPSCR(uint32_t fpscr) + 793:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 794:Drivers/CMSIS/Include/cmsis_gcc.h **** #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + 795:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + 796:Drivers/CMSIS/Include/cmsis_gcc.h **** #if __has_builtin(__builtin_arm_set_fpscr) + 797:Drivers/CMSIS/Include/cmsis_gcc.h **** // Re-enable using built-in when GCC has been fixed + 798:Drivers/CMSIS/Include/cmsis_gcc.h **** // || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) + 799:Drivers/CMSIS/Include/cmsis_gcc.h **** /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ + 800:Drivers/CMSIS/Include/cmsis_gcc.h **** __builtin_arm_set_fpscr(fpscr); + 801:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 802:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc", "memory"); + 803:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 804:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 805:Drivers/CMSIS/Include/cmsis_gcc.h **** (void)fpscr; + 806:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 807:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 808:Drivers/CMSIS/Include/cmsis_gcc.h **** + 809:Drivers/CMSIS/Include/cmsis_gcc.h **** + 810:Drivers/CMSIS/Include/cmsis_gcc.h **** /*@} end of CMSIS_Core_RegAccFunctions */ + 811:Drivers/CMSIS/Include/cmsis_gcc.h **** + 812:Drivers/CMSIS/Include/cmsis_gcc.h **** + 813:Drivers/CMSIS/Include/cmsis_gcc.h **** /* ########################## Core Instruction Access ######################### */ + 814:Drivers/CMSIS/Include/cmsis_gcc.h **** /** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + 815:Drivers/CMSIS/Include/cmsis_gcc.h **** Access to dedicated instructions + 816:Drivers/CMSIS/Include/cmsis_gcc.h **** @{ + 817:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 818:Drivers/CMSIS/Include/cmsis_gcc.h **** + 819:Drivers/CMSIS/Include/cmsis_gcc.h **** /* Define macros for porting to both thumb1 and thumb2. + 820:Drivers/CMSIS/Include/cmsis_gcc.h **** * For thumb1, use low register (r0-r7), specified by constraint "l" + 821:Drivers/CMSIS/Include/cmsis_gcc.h **** * Otherwise, use general registers, specified by constraint "r" */ + 822:Drivers/CMSIS/Include/cmsis_gcc.h **** #if defined (__thumb__) && !defined (__thumb2__) + 823:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __CMSIS_GCC_OUT_REG(r) "=l" (r) + 824:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __CMSIS_GCC_RW_REG(r) "+l" (r) + 825:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __CMSIS_GCC_USE_REG(r) "l" (r) + 826:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 827:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __CMSIS_GCC_OUT_REG(r) "=r" (r) + 828:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __CMSIS_GCC_RW_REG(r) "+r" (r) + 829:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __CMSIS_GCC_USE_REG(r) "r" (r) + 830:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 831:Drivers/CMSIS/Include/cmsis_gcc.h **** + 832:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 833:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief No Operation + ARM GAS /tmp/ccqPwHQi.s page 73 + + + 834:Drivers/CMSIS/Include/cmsis_gcc.h **** \details No Operation does nothing. This instruction can be used for code alignment purposes. + 835:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 836:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __NOP() __ASM volatile ("nop") + 837:Drivers/CMSIS/Include/cmsis_gcc.h **** + 838:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 839:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Wait For Interrupt + 840:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Wait For Interrupt is a hint instruction that suspends execution until one of a number o + 841:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 842:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __WFI() __ASM volatile ("wfi") + 843:Drivers/CMSIS/Include/cmsis_gcc.h **** + 844:Drivers/CMSIS/Include/cmsis_gcc.h **** + 845:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 846:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Wait For Event + 847:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Wait For Event is a hint instruction that permits the processor to enter + 848:Drivers/CMSIS/Include/cmsis_gcc.h **** a low-power state until one of a number of events occurs. + 849:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 850:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __WFE() __ASM volatile ("wfe") + 851:Drivers/CMSIS/Include/cmsis_gcc.h **** + 852:Drivers/CMSIS/Include/cmsis_gcc.h **** + 853:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 854:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Send Event + 855:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + 856:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 857:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __SEV() __ASM volatile ("sev") + 858:Drivers/CMSIS/Include/cmsis_gcc.h **** + 859:Drivers/CMSIS/Include/cmsis_gcc.h **** + 860:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 861:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Instruction Synchronization Barrier + 862:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Instruction Synchronization Barrier flushes the pipeline in the processor, + 863:Drivers/CMSIS/Include/cmsis_gcc.h **** so that all instructions following the ISB are fetched from cache or memory, + 864:Drivers/CMSIS/Include/cmsis_gcc.h **** after the instruction has been completed. + 865:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 866:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __ISB(void) + 867:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 868:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("isb 0xF":::"memory"); + 869:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 870:Drivers/CMSIS/Include/cmsis_gcc.h **** + 871:Drivers/CMSIS/Include/cmsis_gcc.h **** + 872:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 873:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Data Synchronization Barrier + 874:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Acts as a special kind of Data Memory Barrier. + 875:Drivers/CMSIS/Include/cmsis_gcc.h **** It completes when all explicit memory accesses before this instruction complete. + 876:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 877:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __DSB(void) + 878:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 879:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("dsb 0xF":::"memory"); + 880:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 881:Drivers/CMSIS/Include/cmsis_gcc.h **** + 882:Drivers/CMSIS/Include/cmsis_gcc.h **** + 883:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 884:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Data Memory Barrier + 885:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Ensures the apparent order of the explicit memory operations before + 886:Drivers/CMSIS/Include/cmsis_gcc.h **** and after the instruction, without ensuring their completion. + 887:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 888:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __DMB(void) + 889:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 890:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("dmb 0xF":::"memory"); + ARM GAS /tmp/ccqPwHQi.s page 74 + + + 891:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 892:Drivers/CMSIS/Include/cmsis_gcc.h **** + 893:Drivers/CMSIS/Include/cmsis_gcc.h **** + 894:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 895:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Reverse byte order (32 bit) + 896:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x785 + 897:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] value Value to reverse + 898:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Reversed value + 899:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 900:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __REV(uint32_t value) + 901:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 902:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) + 903:Drivers/CMSIS/Include/cmsis_gcc.h **** return __builtin_bswap32(value); + 904:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 905:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 906:Drivers/CMSIS/Include/cmsis_gcc.h **** + 907:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + 908:Drivers/CMSIS/Include/cmsis_gcc.h **** return result; + 909:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 910:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 911:Drivers/CMSIS/Include/cmsis_gcc.h **** + 912:Drivers/CMSIS/Include/cmsis_gcc.h **** + 913:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 914:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Reverse byte order (16 bit) + 915:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes + 916:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] value Value to reverse + 917:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Reversed value + 918:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 919:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __REV16(uint32_t value) + 920:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 921:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 922:Drivers/CMSIS/Include/cmsis_gcc.h **** + 923:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + 924:Drivers/CMSIS/Include/cmsis_gcc.h **** return result; + 925:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 926:Drivers/CMSIS/Include/cmsis_gcc.h **** + 927:Drivers/CMSIS/Include/cmsis_gcc.h **** + 928:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 929:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Reverse byte order (16 bit) + 930:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For exam + 931:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] value Value to reverse + 932:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Reversed value + 933:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 934:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE int16_t __REVSH(int16_t value) + 935:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 936:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + 937:Drivers/CMSIS/Include/cmsis_gcc.h **** return (int16_t)__builtin_bswap16(value); + 938:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 939:Drivers/CMSIS/Include/cmsis_gcc.h **** int16_t result; + 940:Drivers/CMSIS/Include/cmsis_gcc.h **** + 941:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + 942:Drivers/CMSIS/Include/cmsis_gcc.h **** return result; + 943:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 944:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 945:Drivers/CMSIS/Include/cmsis_gcc.h **** + 946:Drivers/CMSIS/Include/cmsis_gcc.h **** + 947:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + ARM GAS /tmp/ccqPwHQi.s page 75 + + + 948:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Rotate Right in unsigned value (32 bit) + 949:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Rotate Right (immediate) provides the value of the contents of a register rotated by a v + 950:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] op1 Value to rotate + 951:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] op2 Number of Bits to rotate + 952:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Rotated value + 953:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 954:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) + 955:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 956:Drivers/CMSIS/Include/cmsis_gcc.h **** op2 %= 32U; + 957:Drivers/CMSIS/Include/cmsis_gcc.h **** if (op2 == 0U) + 958:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 959:Drivers/CMSIS/Include/cmsis_gcc.h **** return op1; + 960:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 961:Drivers/CMSIS/Include/cmsis_gcc.h **** return (op1 >> op2) | (op1 << (32U - op2)); + 962:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 963:Drivers/CMSIS/Include/cmsis_gcc.h **** + 964:Drivers/CMSIS/Include/cmsis_gcc.h **** + 965:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 966:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Breakpoint + 967:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Causes the processor to enter Debug state. + 968:Drivers/CMSIS/Include/cmsis_gcc.h **** Debug tools can use this to investigate system state when the instruction at a particula + 969:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] value is ignored by the processor. + 970:Drivers/CMSIS/Include/cmsis_gcc.h **** If required, a debugger can use it to store additional information about the break + 971:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 972:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __BKPT(value) __ASM volatile ("bkpt "#value) + 973:Drivers/CMSIS/Include/cmsis_gcc.h **** + 974:Drivers/CMSIS/Include/cmsis_gcc.h **** + 975:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 976:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Reverse bit order of value + 977:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Reverses the bit order of the given value. + 978:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] value Value to reverse + 979:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Reversed value + 980:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __RBIT(uint32_t value) + 1553 .loc 2 981 31 view .LVU513 + 1554 .LBB5: + 982:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 1555 .loc 2 983 3 view .LVU514 + 984:Drivers/CMSIS/Include/cmsis_gcc.h **** + 985:Drivers/CMSIS/Include/cmsis_gcc.h **** #if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + 986:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + 987:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 1556 .loc 2 988 4 view .LVU515 + 1557 .syntax unified + 1558 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 1559 0010 91FAA1F1 rbit r1, r1 + 1560 @ 0 "" 2 + 1561 .LVL117: + 989:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 990:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */ + 991:Drivers/CMSIS/Include/cmsis_gcc.h **** + 992:Drivers/CMSIS/Include/cmsis_gcc.h **** result = value; /* r will be reversed bits of v; first get LSB of v */ + 993:Drivers/CMSIS/Include/cmsis_gcc.h **** for (value >>= 1U; value != 0U; value >>= 1U) + 994:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 995:Drivers/CMSIS/Include/cmsis_gcc.h **** result <<= 1U; + ARM GAS /tmp/ccqPwHQi.s page 76 + + + 996:Drivers/CMSIS/Include/cmsis_gcc.h **** result |= value & 1U; + 997:Drivers/CMSIS/Include/cmsis_gcc.h **** s--; + 998:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 999:Drivers/CMSIS/Include/cmsis_gcc.h **** result <<= s; /* shift when v's highest bits are zero */ +1000:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif +1001:Drivers/CMSIS/Include/cmsis_gcc.h **** return result; + 1562 .loc 2 1001 3 view .LVU516 + 1563 .loc 2 1001 3 is_stmt 0 view .LVU517 + 1564 .thumb + 1565 .syntax unified + 1566 .LBE5: + 1567 .LBE4: +1451:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 1568 .loc 1 1451 21 view .LVU518 + 1569 0014 B1FA81F1 clz r1, r1 + 1570 .LVL118: +1454:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1571 .loc 1 1454 5 is_stmt 1 view .LVU519 +1454:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1572 .loc 1 1454 22 is_stmt 0 view .LVU520 + 1573 0018 0368 ldr r3, [r0] +1454:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1574 .loc 1 1454 61 view .LVU521 + 1575 001a 1831 adds r1, r1, #24 + 1576 .LVL119: +1454:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1577 .loc 1 1454 61 view .LVU522 + 1578 001c 03EB0113 add r3, r3, r1, lsl #4 + 1579 0020 5868 ldr r0, [r3, #4] + 1580 .LVL120: +1454:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1581 .loc 1 1454 85 view .LVU523 + 1582 0022 000C lsrs r0, r0, #16 + 1583 .LVL121: +1454:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1584 .loc 1 1454 85 view .LVU524 + 1585 0024 7047 bx lr + 1586 .cfi_endproc + 1587 .LFE144: + 1589 .section .text.HAL_CAN_GetRxMessage,"ax",%progbits + 1590 .align 1 + 1591 .global HAL_CAN_GetRxMessage + 1592 .syntax unified + 1593 .thumb + 1594 .thumb_func + 1596 HAL_CAN_GetRxMessage: + 1597 .LVL122: + 1598 .LFB145: +1460:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1461:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** +1462:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief Get an CAN frame from the Rx FIFO zone into the message RAM. +1463:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param hcan pointer to an CAN_HandleTypeDef structure that contains +1464:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * the configuration information for the specified CAN. +1465:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param RxFifo Fifo number of the received message to be read. +1466:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * This parameter can be a value of @arg CAN_receive_FIFO_number. +1467:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param pHeader pointer to a CAN_RxHeaderTypeDef structure where the header +1468:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * of the Rx frame will be stored. + ARM GAS /tmp/ccqPwHQi.s page 77 + + +1469:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param aData array where the payload of the Rx frame will be stored. +1470:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @retval HAL status +1471:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +1472:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_StatusTypeDef HAL_CAN_GetRxMessage(CAN_HandleTypeDef *hcan, uint32_t RxFifo, CAN_RxHeaderTypeDe +1473:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 1599 .loc 1 1473 1 is_stmt 1 view -0 + 1600 .cfi_startproc + 1601 @ args = 0, pretend = 0, frame = 0 + 1602 @ frame_needed = 0, uses_anonymous_args = 0 + 1603 @ link register save eliminated. +1474:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_StateTypeDef state = hcan->State; + 1604 .loc 1 1474 3 view .LVU526 + 1605 .loc 1 1474 24 is_stmt 0 view .LVU527 + 1606 0000 90F820C0 ldrb ip, [r0, #32] @ zero_extendqisi2 + 1607 .LVL123: +1475:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1476:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_CAN_RX_FIFO(RxFifo)); + 1608 .loc 1 1476 3 is_stmt 1 view .LVU528 +1477:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1478:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((state == HAL_CAN_STATE_READY) || + 1609 .loc 1 1478 3 view .LVU529 + 1610 .loc 1 1478 38 is_stmt 0 view .LVU530 + 1611 0004 0CF1FF3C add ip, ip, #-1 + 1612 .LVL124: + 1613 .loc 1 1478 38 view .LVU531 + 1614 0008 5FFA8CFC uxtb ip, ip + 1615 .loc 1 1478 6 view .LVU532 + 1616 000c BCF1010F cmp ip, #1 + 1617 0010 00F29580 bhi .L129 +1473:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_StateTypeDef state = hcan->State; + 1618 .loc 1 1473 1 view .LVU533 + 1619 0014 30B4 push {r4, r5} + 1620 .cfi_def_cfa_offset 8 + 1621 .cfi_offset 4, -8 + 1622 .cfi_offset 5, -4 +1479:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (state == HAL_CAN_STATE_LISTENING)) +1480:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1481:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Check the Rx FIFO */ +1482:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if (RxFifo == CAN_RX_FIFO0) /* Rx element is assigned to Rx FIFO 0 */ + 1623 .loc 1 1482 5 is_stmt 1 view .LVU534 + 1624 .loc 1 1482 8 is_stmt 0 view .LVU535 + 1625 0016 51B9 cbnz r1, .L130 +1483:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1484:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Check that the Rx FIFO 0 is not empty */ +1485:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((hcan->Instance->RF0R & CAN_RF0R_FMP0) == 0U) + 1626 .loc 1 1485 7 is_stmt 1 view .LVU536 + 1627 .loc 1 1485 16 is_stmt 0 view .LVU537 + 1628 0018 0468 ldr r4, [r0] + 1629 .loc 1 1485 26 view .LVU538 + 1630 001a E468 ldr r4, [r4, #12] + 1631 .loc 1 1485 10 view .LVU539 + 1632 001c 14F0030F tst r4, #3 + 1633 0020 10D1 bne .L131 +1486:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1487:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Update error code */ +1488:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->ErrorCode |= HAL_CAN_ERROR_PARAM; + 1634 .loc 1 1488 9 is_stmt 1 view .LVU540 + ARM GAS /tmp/ccqPwHQi.s page 78 + + + 1635 .loc 1 1488 13 is_stmt 0 view .LVU541 + 1636 0022 436A ldr r3, [r0, #36] + 1637 .LVL125: + 1638 .loc 1 1488 25 view .LVU542 + 1639 0024 43F40013 orr r3, r3, #2097152 + 1640 0028 4362 str r3, [r0, #36] +1489:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1490:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** return HAL_ERROR; + 1641 .loc 1 1490 9 is_stmt 1 view .LVU543 + 1642 .loc 1 1490 16 is_stmt 0 view .LVU544 + 1643 002a 0120 movs r0, #1 + 1644 .LVL126: + 1645 .loc 1 1490 16 view .LVU545 + 1646 002c 77E0 b .L132 + 1647 .LVL127: + 1648 .L130: +1491:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1492:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1493:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** else /* Rx element is assigned to Rx FIFO 1 */ +1494:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1495:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Check that the Rx FIFO 1 is not empty */ +1496:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((hcan->Instance->RF1R & CAN_RF1R_FMP1) == 0U) + 1649 .loc 1 1496 7 is_stmt 1 view .LVU546 + 1650 .loc 1 1496 16 is_stmt 0 view .LVU547 + 1651 002e 0468 ldr r4, [r0] + 1652 .loc 1 1496 26 view .LVU548 + 1653 0030 2469 ldr r4, [r4, #16] + 1654 .loc 1 1496 10 view .LVU549 + 1655 0032 14F0030F tst r4, #3 + 1656 0036 05D1 bne .L131 +1497:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1498:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Update error code */ +1499:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->ErrorCode |= HAL_CAN_ERROR_PARAM; + 1657 .loc 1 1499 9 is_stmt 1 view .LVU550 + 1658 .loc 1 1499 13 is_stmt 0 view .LVU551 + 1659 0038 436A ldr r3, [r0, #36] + 1660 .LVL128: + 1661 .loc 1 1499 25 view .LVU552 + 1662 003a 43F40013 orr r3, r3, #2097152 + 1663 003e 4362 str r3, [r0, #36] +1500:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1501:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** return HAL_ERROR; + 1664 .loc 1 1501 9 is_stmt 1 view .LVU553 + 1665 .loc 1 1501 16 is_stmt 0 view .LVU554 + 1666 0040 0120 movs r0, #1 + 1667 .LVL129: + 1668 .loc 1 1501 16 view .LVU555 + 1669 0042 6CE0 b .L132 + 1670 .LVL130: + 1671 .L131: +1502:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1503:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1504:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1505:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Get the header */ +1506:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** pHeader->IDE = CAN_RI0R_IDE & hcan->Instance->sFIFOMailBox[RxFifo].RIR; + 1672 .loc 1 1506 5 is_stmt 1 view .LVU556 + 1673 .loc 1 1506 71 is_stmt 0 view .LVU557 + ARM GAS /tmp/ccqPwHQi.s page 79 + + + 1674 0044 01F11B04 add r4, r1, #27 + 1675 0048 2401 lsls r4, r4, #4 + 1676 004a 0568 ldr r5, [r0] + 1677 004c 2C59 ldr r4, [r5, r4] + 1678 .loc 1 1506 33 view .LVU558 + 1679 004e 04F00404 and r4, r4, #4 + 1680 .loc 1 1506 18 view .LVU559 + 1681 0052 9460 str r4, [r2, #8] +1507:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if (pHeader->IDE == CAN_ID_STD) + 1682 .loc 1 1507 5 is_stmt 1 view .LVU560 + 1683 .loc 1 1507 8 is_stmt 0 view .LVU561 + 1684 0054 002C cmp r4, #0 + 1685 0056 64D1 bne .L133 +1508:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1509:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** pHeader->StdId = (CAN_RI0R_STID & hcan->Instance->sFIFOMailBox[RxFifo].RIR) >> CAN_TI0R_STID_ + 1686 .loc 1 1509 7 is_stmt 1 view .LVU562 + 1687 .loc 1 1509 77 is_stmt 0 view .LVU563 + 1688 0058 01F11B04 add r4, r1, #27 + 1689 005c 2401 lsls r4, r4, #4 + 1690 005e 0568 ldr r5, [r0] + 1691 0060 2C59 ldr r4, [r5, r4] + 1692 .loc 1 1509 83 view .LVU564 + 1693 0062 640D lsrs r4, r4, #21 + 1694 .loc 1 1509 22 view .LVU565 + 1695 0064 1460 str r4, [r2] + 1696 .L134: +1510:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1511:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** else +1512:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1513:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** pHeader->ExtId = ((CAN_RI0R_EXID | CAN_RI0R_STID) & hcan->Instance->sFIFOMailBox[RxFifo].RIR) +1514:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1515:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** pHeader->RTR = (CAN_RI0R_RTR & hcan->Instance->sFIFOMailBox[RxFifo].RIR); + 1697 .loc 1 1515 5 is_stmt 1 view .LVU566 + 1698 .loc 1 1515 40 is_stmt 0 view .LVU567 + 1699 0066 0468 ldr r4, [r0] + 1700 .loc 1 1515 72 view .LVU568 + 1701 0068 01F11B0C add ip, r1, #27 + 1702 006c 4FEA0C1C lsl ip, ip, #4 + 1703 0070 54F80C40 ldr r4, [r4, ip] + 1704 .loc 1 1515 34 view .LVU569 + 1705 0074 04F00204 and r4, r4, #2 + 1706 .loc 1 1515 18 view .LVU570 + 1707 0078 D460 str r4, [r2, #12] +1516:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** pHeader->DLC = (CAN_RDT0R_DLC & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_DLC_Pos + 1708 .loc 1 1516 5 is_stmt 1 view .LVU571 + 1709 .loc 1 1516 41 is_stmt 0 view .LVU572 + 1710 007a 0468 ldr r4, [r0] + 1711 .loc 1 1516 73 view .LVU573 + 1712 007c 6444 add r4, r4, ip + 1713 007e 6468 ldr r4, [r4, #4] + 1714 .loc 1 1516 80 view .LVU574 + 1715 0080 04F00F04 and r4, r4, #15 + 1716 .loc 1 1516 18 view .LVU575 + 1717 0084 1461 str r4, [r2, #16] +1517:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** pHeader->FilterMatchIndex = (CAN_RDT0R_FMI & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_ + 1718 .loc 1 1517 5 is_stmt 1 view .LVU576 + 1719 .loc 1 1517 54 is_stmt 0 view .LVU577 + ARM GAS /tmp/ccqPwHQi.s page 80 + + + 1720 0086 0468 ldr r4, [r0] + 1721 .loc 1 1517 86 view .LVU578 + 1722 0088 6444 add r4, r4, ip + 1723 008a 6468 ldr r4, [r4, #4] + 1724 .loc 1 1517 93 view .LVU579 + 1725 008c C4F30724 ubfx r4, r4, #8, #8 + 1726 .loc 1 1517 31 view .LVU580 + 1727 0090 9461 str r4, [r2, #24] +1518:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** pHeader->Timestamp = (CAN_RDT0R_TIME & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_ + 1728 .loc 1 1518 5 is_stmt 1 view .LVU581 + 1729 .loc 1 1518 48 is_stmt 0 view .LVU582 + 1730 0092 0468 ldr r4, [r0] + 1731 .loc 1 1518 80 view .LVU583 + 1732 0094 6444 add r4, r4, ip + 1733 0096 6468 ldr r4, [r4, #4] + 1734 .loc 1 1518 87 view .LVU584 + 1735 0098 240C lsrs r4, r4, #16 + 1736 .loc 1 1518 24 view .LVU585 + 1737 009a 5461 str r4, [r2, #20] +1519:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1520:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Get the data */ +1521:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** aData[0] = (uint8_t)((CAN_RDL0R_DATA0 & hcan->Instance->sFIFOMailBox[RxFifo].RDLR) >> CAN_RDL0R + 1738 .loc 1 1521 5 is_stmt 1 view .LVU586 + 1739 .loc 1 1521 49 is_stmt 0 view .LVU587 + 1740 009c 0268 ldr r2, [r0] + 1741 .LVL131: + 1742 .loc 1 1521 81 view .LVU588 + 1743 009e 02EB0112 add r2, r2, r1, lsl #4 + 1744 00a2 D2F8B821 ldr r2, [r2, #440] + 1745 .loc 1 1521 14 view .LVU589 + 1746 00a6 1A70 strb r2, [r3] +1522:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** aData[1] = (uint8_t)((CAN_RDL0R_DATA1 & hcan->Instance->sFIFOMailBox[RxFifo].RDLR) >> CAN_RDL0R + 1747 .loc 1 1522 5 is_stmt 1 view .LVU590 + 1748 .loc 1 1522 49 is_stmt 0 view .LVU591 + 1749 00a8 0268 ldr r2, [r0] + 1750 .loc 1 1522 81 view .LVU592 + 1751 00aa 02EB0112 add r2, r2, r1, lsl #4 + 1752 00ae D2F8B821 ldr r2, [r2, #440] + 1753 .loc 1 1522 16 view .LVU593 + 1754 00b2 C2F30722 ubfx r2, r2, #8, #8 + 1755 .loc 1 1522 14 view .LVU594 + 1756 00b6 5A70 strb r2, [r3, #1] +1523:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** aData[2] = (uint8_t)((CAN_RDL0R_DATA2 & hcan->Instance->sFIFOMailBox[RxFifo].RDLR) >> CAN_RDL0R + 1757 .loc 1 1523 5 is_stmt 1 view .LVU595 + 1758 .loc 1 1523 49 is_stmt 0 view .LVU596 + 1759 00b8 0268 ldr r2, [r0] + 1760 .loc 1 1523 81 view .LVU597 + 1761 00ba 02EB0112 add r2, r2, r1, lsl #4 + 1762 00be D2F8B821 ldr r2, [r2, #440] + 1763 .loc 1 1523 16 view .LVU598 + 1764 00c2 C2F30742 ubfx r2, r2, #16, #8 + 1765 .loc 1 1523 14 view .LVU599 + 1766 00c6 9A70 strb r2, [r3, #2] +1524:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** aData[3] = (uint8_t)((CAN_RDL0R_DATA3 & hcan->Instance->sFIFOMailBox[RxFifo].RDLR) >> CAN_RDL0R + 1767 .loc 1 1524 5 is_stmt 1 view .LVU600 + 1768 .loc 1 1524 49 is_stmt 0 view .LVU601 + 1769 00c8 0268 ldr r2, [r0] + ARM GAS /tmp/ccqPwHQi.s page 81 + + + 1770 .loc 1 1524 81 view .LVU602 + 1771 00ca 02EB0112 add r2, r2, r1, lsl #4 + 1772 00ce D2F8B821 ldr r2, [r2, #440] + 1773 .loc 1 1524 16 view .LVU603 + 1774 00d2 120E lsrs r2, r2, #24 + 1775 .loc 1 1524 14 view .LVU604 + 1776 00d4 DA70 strb r2, [r3, #3] +1525:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** aData[4] = (uint8_t)((CAN_RDH0R_DATA4 & hcan->Instance->sFIFOMailBox[RxFifo].RDHR) >> CAN_RDH0R + 1777 .loc 1 1525 5 is_stmt 1 view .LVU605 + 1778 .loc 1 1525 49 is_stmt 0 view .LVU606 + 1779 00d6 0268 ldr r2, [r0] + 1780 .loc 1 1525 81 view .LVU607 + 1781 00d8 02EB0112 add r2, r2, r1, lsl #4 + 1782 00dc D2F8BC21 ldr r2, [r2, #444] + 1783 .loc 1 1525 14 view .LVU608 + 1784 00e0 1A71 strb r2, [r3, #4] +1526:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** aData[5] = (uint8_t)((CAN_RDH0R_DATA5 & hcan->Instance->sFIFOMailBox[RxFifo].RDHR) >> CAN_RDH0R + 1785 .loc 1 1526 5 is_stmt 1 view .LVU609 + 1786 .loc 1 1526 49 is_stmt 0 view .LVU610 + 1787 00e2 0268 ldr r2, [r0] + 1788 .loc 1 1526 81 view .LVU611 + 1789 00e4 02EB0112 add r2, r2, r1, lsl #4 + 1790 00e8 D2F8BC21 ldr r2, [r2, #444] + 1791 .loc 1 1526 16 view .LVU612 + 1792 00ec C2F30722 ubfx r2, r2, #8, #8 + 1793 .loc 1 1526 14 view .LVU613 + 1794 00f0 5A71 strb r2, [r3, #5] +1527:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** aData[6] = (uint8_t)((CAN_RDH0R_DATA6 & hcan->Instance->sFIFOMailBox[RxFifo].RDHR) >> CAN_RDH0R + 1795 .loc 1 1527 5 is_stmt 1 view .LVU614 + 1796 .loc 1 1527 49 is_stmt 0 view .LVU615 + 1797 00f2 0268 ldr r2, [r0] + 1798 .loc 1 1527 81 view .LVU616 + 1799 00f4 02EB0112 add r2, r2, r1, lsl #4 + 1800 00f8 D2F8BC21 ldr r2, [r2, #444] + 1801 .loc 1 1527 16 view .LVU617 + 1802 00fc C2F30742 ubfx r2, r2, #16, #8 + 1803 .loc 1 1527 14 view .LVU618 + 1804 0100 9A71 strb r2, [r3, #6] +1528:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** aData[7] = (uint8_t)((CAN_RDH0R_DATA7 & hcan->Instance->sFIFOMailBox[RxFifo].RDHR) >> CAN_RDH0R + 1805 .loc 1 1528 5 is_stmt 1 view .LVU619 + 1806 .loc 1 1528 49 is_stmt 0 view .LVU620 + 1807 0102 0268 ldr r2, [r0] + 1808 .loc 1 1528 81 view .LVU621 + 1809 0104 02EB0112 add r2, r2, r1, lsl #4 + 1810 0108 D2F8BC21 ldr r2, [r2, #444] + 1811 .loc 1 1528 16 view .LVU622 + 1812 010c 120E lsrs r2, r2, #24 + 1813 .loc 1 1528 14 view .LVU623 + 1814 010e DA71 strb r2, [r3, #7] +1529:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1530:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Release the FIFO */ +1531:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if (RxFifo == CAN_RX_FIFO0) /* Rx element is assigned to Rx FIFO 0 */ + 1815 .loc 1 1531 5 is_stmt 1 view .LVU624 + 1816 .loc 1 1531 8 is_stmt 0 view .LVU625 + 1817 0110 79B9 cbnz r1, .L135 +1532:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1533:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Release RX FIFO 0 */ + ARM GAS /tmp/ccqPwHQi.s page 82 + + +1534:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** SET_BIT(hcan->Instance->RF0R, CAN_RF0R_RFOM0); + 1818 .loc 1 1534 7 is_stmt 1 view .LVU626 + 1819 0112 0268 ldr r2, [r0] + 1820 0114 D368 ldr r3, [r2, #12] + 1821 .LVL132: + 1822 .loc 1 1534 7 is_stmt 0 view .LVU627 + 1823 0116 43F02003 orr r3, r3, #32 + 1824 011a D360 str r3, [r2, #12] + 1825 .L136: +1535:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1536:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** else /* Rx element is assigned to Rx FIFO 1 */ +1537:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1538:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Release RX FIFO 1 */ +1539:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** SET_BIT(hcan->Instance->RF1R, CAN_RF1R_RFOM1); +1540:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1541:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1542:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Return function status */ +1543:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** return HAL_OK; + 1826 .loc 1 1543 5 is_stmt 1 view .LVU628 + 1827 .loc 1 1543 12 is_stmt 0 view .LVU629 + 1828 011c 0020 movs r0, #0 + 1829 .LVL133: + 1830 .L132: +1544:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1545:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** else +1546:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1547:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Update error code */ +1548:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED; +1549:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1550:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** return HAL_ERROR; +1551:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1552:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1831 .loc 1 1552 1 view .LVU630 + 1832 011e 30BC pop {r4, r5} + 1833 .cfi_remember_state + 1834 .cfi_restore 5 + 1835 .cfi_restore 4 + 1836 .cfi_def_cfa_offset 0 + 1837 0120 7047 bx lr + 1838 .LVL134: + 1839 .L133: + 1840 .cfi_restore_state +1513:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1841 .loc 1 1513 7 is_stmt 1 view .LVU631 +1513:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1842 .loc 1 1513 95 is_stmt 0 view .LVU632 + 1843 0122 01F11B04 add r4, r1, #27 + 1844 0126 2401 lsls r4, r4, #4 + 1845 0128 0568 ldr r5, [r0] + 1846 012a 2C59 ldr r4, [r5, r4] +1513:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1847 .loc 1 1513 101 view .LVU633 + 1848 012c E408 lsrs r4, r4, #3 +1513:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1849 .loc 1 1513 22 view .LVU634 + 1850 012e 5460 str r4, [r2, #4] + 1851 0130 99E7 b .L134 + ARM GAS /tmp/ccqPwHQi.s page 83 + + + 1852 .LVL135: + 1853 .L135: +1539:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1854 .loc 1 1539 7 is_stmt 1 view .LVU635 + 1855 0132 0268 ldr r2, [r0] + 1856 0134 1369 ldr r3, [r2, #16] + 1857 .LVL136: +1539:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1858 .loc 1 1539 7 is_stmt 0 view .LVU636 + 1859 0136 43F02003 orr r3, r3, #32 + 1860 013a 1361 str r3, [r2, #16] + 1861 013c EEE7 b .L136 + 1862 .LVL137: + 1863 .L129: + 1864 .cfi_def_cfa_offset 0 + 1865 .cfi_restore 4 + 1866 .cfi_restore 5 +1548:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 1867 .loc 1 1548 5 is_stmt 1 view .LVU637 +1548:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 1868 .loc 1 1548 9 is_stmt 0 view .LVU638 + 1869 013e 436A ldr r3, [r0, #36] + 1870 .LVL138: +1548:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 1871 .loc 1 1548 21 view .LVU639 + 1872 0140 43F48023 orr r3, r3, #262144 + 1873 0144 4362 str r3, [r0, #36] +1550:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1874 .loc 1 1550 5 is_stmt 1 view .LVU640 +1550:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1875 .loc 1 1550 12 is_stmt 0 view .LVU641 + 1876 0146 0120 movs r0, #1 + 1877 .LVL139: + 1878 .loc 1 1552 1 view .LVU642 + 1879 0148 7047 bx lr + 1880 .cfi_endproc + 1881 .LFE145: + 1883 .section .text.HAL_CAN_GetRxFifoFillLevel,"ax",%progbits + 1884 .align 1 + 1885 .global HAL_CAN_GetRxFifoFillLevel + 1886 .syntax unified + 1887 .thumb + 1888 .thumb_func + 1890 HAL_CAN_GetRxFifoFillLevel: + 1891 .LVL140: + 1892 .LFB146: +1553:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1554:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** +1555:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief Return Rx FIFO fill level. +1556:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param hcan pointer to an CAN_HandleTypeDef structure that contains +1557:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * the configuration information for the specified CAN. +1558:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param RxFifo Rx FIFO. +1559:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * This parameter can be a value of @arg CAN_receive_FIFO_number. +1560:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @retval Number of messages available in Rx FIFO. +1561:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +1562:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t HAL_CAN_GetRxFifoFillLevel(CAN_HandleTypeDef *hcan, uint32_t RxFifo) +1563:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + ARM GAS /tmp/ccqPwHQi.s page 84 + + + 1893 .loc 1 1563 1 is_stmt 1 view -0 + 1894 .cfi_startproc + 1895 @ args = 0, pretend = 0, frame = 0 + 1896 @ frame_needed = 0, uses_anonymous_args = 0 + 1897 @ link register save eliminated. +1564:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t filllevel = 0U; + 1898 .loc 1 1564 3 view .LVU644 +1565:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_StateTypeDef state = hcan->State; + 1899 .loc 1 1565 3 view .LVU645 + 1900 .loc 1 1565 24 is_stmt 0 view .LVU646 + 1901 0000 90F82030 ldrb r3, [r0, #32] @ zero_extendqisi2 + 1902 .LVL141: +1566:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1567:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Check function parameters */ +1568:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_CAN_RX_FIFO(RxFifo)); + 1903 .loc 1 1568 3 is_stmt 1 view .LVU647 +1569:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1570:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((state == HAL_CAN_STATE_READY) || + 1904 .loc 1 1570 3 view .LVU648 + 1905 .loc 1 1570 38 is_stmt 0 view .LVU649 + 1906 0004 013B subs r3, r3, #1 + 1907 .LVL142: + 1908 .loc 1 1570 38 view .LVU650 + 1909 0006 DBB2 uxtb r3, r3 + 1910 .loc 1 1570 6 view .LVU651 + 1911 0008 012B cmp r3, #1 + 1912 000a 01D9 bls .L145 +1564:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_StateTypeDef state = hcan->State; + 1913 .loc 1 1564 12 view .LVU652 + 1914 000c 0020 movs r0, #0 + 1915 .LVL143: +1571:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (state == HAL_CAN_STATE_LISTENING)) +1572:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1573:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if (RxFifo == CAN_RX_FIFO0) +1574:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1575:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** filllevel = hcan->Instance->RF0R & CAN_RF0R_FMP0; +1576:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1577:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** else /* RxFifo == CAN_RX_FIFO1 */ +1578:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1579:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** filllevel = hcan->Instance->RF1R & CAN_RF1R_FMP1; +1580:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1581:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1582:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1583:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Return Rx FIFO fill level */ +1584:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** return filllevel; + 1916 .loc 1 1584 3 is_stmt 1 view .LVU653 +1585:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1917 .loc 1 1585 1 is_stmt 0 view .LVU654 + 1918 000e 7047 bx lr + 1919 .LVL144: + 1920 .L145: +1573:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 1921 .loc 1 1573 5 is_stmt 1 view .LVU655 +1573:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 1922 .loc 1 1573 8 is_stmt 0 view .LVU656 + 1923 0010 21B9 cbnz r1, .L143 +1575:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + ARM GAS /tmp/ccqPwHQi.s page 85 + + + 1924 .loc 1 1575 7 is_stmt 1 view .LVU657 +1575:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1925 .loc 1 1575 23 is_stmt 0 view .LVU658 + 1926 0012 0368 ldr r3, [r0] +1575:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1927 .loc 1 1575 33 view .LVU659 + 1928 0014 D868 ldr r0, [r3, #12] + 1929 .LVL145: +1575:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1930 .loc 1 1575 17 view .LVU660 + 1931 0016 00F00300 and r0, r0, #3 + 1932 .LVL146: +1575:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1933 .loc 1 1575 17 view .LVU661 + 1934 001a 7047 bx lr + 1935 .LVL147: + 1936 .L143: +1579:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1937 .loc 1 1579 7 is_stmt 1 view .LVU662 +1579:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1938 .loc 1 1579 23 is_stmt 0 view .LVU663 + 1939 001c 0368 ldr r3, [r0] +1579:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1940 .loc 1 1579 33 view .LVU664 + 1941 001e 1869 ldr r0, [r3, #16] + 1942 .LVL148: +1579:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1943 .loc 1 1579 17 view .LVU665 + 1944 0020 00F00300 and r0, r0, #3 + 1945 .LVL149: +1579:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1946 .loc 1 1579 17 view .LVU666 + 1947 0024 7047 bx lr + 1948 .cfi_endproc + 1949 .LFE146: + 1951 .section .text.HAL_CAN_ActivateNotification,"ax",%progbits + 1952 .align 1 + 1953 .global HAL_CAN_ActivateNotification + 1954 .syntax unified + 1955 .thumb + 1956 .thumb_func + 1958 HAL_CAN_ActivateNotification: + 1959 .LVL150: + 1960 .LFB147: +1586:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1587:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** +1588:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @} +1589:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +1590:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1591:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** @defgroup CAN_Exported_Functions_Group4 Interrupts management +1592:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief Interrupts management +1593:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * +1594:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** @verbatim +1595:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ============================================================================== +1596:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ##### Interrupts management ##### +1597:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ============================================================================== +1598:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** [..] This section provides functions allowing to: + ARM GAS /tmp/ccqPwHQi.s page 86 + + +1599:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) HAL_CAN_ActivateNotification : Enable interrupts +1600:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) HAL_CAN_DeactivateNotification : Disable interrupts +1601:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) HAL_CAN_IRQHandler : Handles CAN interrupt request +1602:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1603:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** @endverbatim +1604:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @{ +1605:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +1606:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1607:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** +1608:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief Enable interrupts. +1609:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param hcan pointer to an CAN_HandleTypeDef structure that contains +1610:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * the configuration information for the specified CAN. +1611:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param ActiveITs indicates which interrupts will be enabled. +1612:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * This parameter can be any combination of @arg CAN_Interrupts. +1613:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @retval HAL status +1614:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +1615:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_StatusTypeDef HAL_CAN_ActivateNotification(CAN_HandleTypeDef *hcan, uint32_t ActiveITs) +1616:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 1961 .loc 1 1616 1 is_stmt 1 view -0 + 1962 .cfi_startproc + 1963 @ args = 0, pretend = 0, frame = 0 + 1964 @ frame_needed = 0, uses_anonymous_args = 0 + 1965 @ link register save eliminated. +1617:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_StateTypeDef state = hcan->State; + 1966 .loc 1 1617 3 view .LVU668 + 1967 .loc 1 1617 24 is_stmt 0 view .LVU669 + 1968 0000 90F82030 ldrb r3, [r0, #32] @ zero_extendqisi2 + 1969 .LVL151: +1618:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1619:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Check function parameters */ +1620:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_CAN_IT(ActiveITs)); + 1970 .loc 1 1620 3 is_stmt 1 view .LVU670 +1621:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1622:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((state == HAL_CAN_STATE_READY) || + 1971 .loc 1 1622 3 view .LVU671 + 1972 .loc 1 1622 38 is_stmt 0 view .LVU672 + 1973 0004 013B subs r3, r3, #1 + 1974 .LVL152: + 1975 .loc 1 1622 38 view .LVU673 + 1976 0006 DBB2 uxtb r3, r3 + 1977 .loc 1 1622 6 view .LVU674 + 1978 0008 012B cmp r3, #1 + 1979 000a 05D9 bls .L149 +1623:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (state == HAL_CAN_STATE_LISTENING)) +1624:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1625:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Enable the selected interrupts */ +1626:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** __HAL_CAN_ENABLE_IT(hcan, ActiveITs); +1627:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1628:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Return function status */ +1629:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** return HAL_OK; +1630:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1631:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** else +1632:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1633:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Update error code */ +1634:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED; + 1980 .loc 1 1634 5 is_stmt 1 view .LVU675 + 1981 .loc 1 1634 9 is_stmt 0 view .LVU676 + ARM GAS /tmp/ccqPwHQi.s page 87 + + + 1982 000c 436A ldr r3, [r0, #36] + 1983 .loc 1 1634 21 view .LVU677 + 1984 000e 43F48023 orr r3, r3, #262144 + 1985 0012 4362 str r3, [r0, #36] +1635:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1636:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** return HAL_ERROR; + 1986 .loc 1 1636 5 is_stmt 1 view .LVU678 + 1987 .loc 1 1636 12 is_stmt 0 view .LVU679 + 1988 0014 0120 movs r0, #1 + 1989 .LVL153: +1637:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1638:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1990 .loc 1 1638 1 view .LVU680 + 1991 0016 7047 bx lr + 1992 .LVL154: + 1993 .L149: +1626:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 1994 .loc 1 1626 5 is_stmt 1 view .LVU681 + 1995 0018 0268 ldr r2, [r0] + 1996 001a 5369 ldr r3, [r2, #20] + 1997 001c 0B43 orrs r3, r3, r1 + 1998 001e 5361 str r3, [r2, #20] +1629:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 1999 .loc 1 1629 5 view .LVU682 +1629:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2000 .loc 1 1629 12 is_stmt 0 view .LVU683 + 2001 0020 0020 movs r0, #0 + 2002 .LVL155: +1629:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2003 .loc 1 1629 12 view .LVU684 + 2004 0022 7047 bx lr + 2005 .cfi_endproc + 2006 .LFE147: + 2008 .section .text.HAL_CAN_DeactivateNotification,"ax",%progbits + 2009 .align 1 + 2010 .global HAL_CAN_DeactivateNotification + 2011 .syntax unified + 2012 .thumb + 2013 .thumb_func + 2015 HAL_CAN_DeactivateNotification: + 2016 .LVL156: + 2017 .LFB148: +1639:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1640:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** +1641:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief Disable interrupts. +1642:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param hcan pointer to an CAN_HandleTypeDef structure that contains +1643:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * the configuration information for the specified CAN. +1644:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param InactiveITs indicates which interrupts will be disabled. +1645:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * This parameter can be any combination of @arg CAN_Interrupts. +1646:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @retval HAL status +1647:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +1648:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_StatusTypeDef HAL_CAN_DeactivateNotification(CAN_HandleTypeDef *hcan, uint32_t InactiveITs) +1649:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2018 .loc 1 1649 1 is_stmt 1 view -0 + 2019 .cfi_startproc + 2020 @ args = 0, pretend = 0, frame = 0 + 2021 @ frame_needed = 0, uses_anonymous_args = 0 + ARM GAS /tmp/ccqPwHQi.s page 88 + + + 2022 @ link register save eliminated. +1650:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_StateTypeDef state = hcan->State; + 2023 .loc 1 1650 3 view .LVU686 + 2024 .loc 1 1650 24 is_stmt 0 view .LVU687 + 2025 0000 90F82030 ldrb r3, [r0, #32] @ zero_extendqisi2 + 2026 .LVL157: +1651:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1652:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Check function parameters */ +1653:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** assert_param(IS_CAN_IT(InactiveITs)); + 2027 .loc 1 1653 3 is_stmt 1 view .LVU688 +1654:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1655:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((state == HAL_CAN_STATE_READY) || + 2028 .loc 1 1655 3 view .LVU689 + 2029 .loc 1 1655 38 is_stmt 0 view .LVU690 + 2030 0004 013B subs r3, r3, #1 + 2031 .LVL158: + 2032 .loc 1 1655 38 view .LVU691 + 2033 0006 DBB2 uxtb r3, r3 + 2034 .loc 1 1655 6 view .LVU692 + 2035 0008 012B cmp r3, #1 + 2036 000a 05D9 bls .L153 +1656:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (state == HAL_CAN_STATE_LISTENING)) +1657:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1658:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Disable the selected interrupts */ +1659:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** __HAL_CAN_DISABLE_IT(hcan, InactiveITs); +1660:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1661:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Return function status */ +1662:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** return HAL_OK; +1663:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1664:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** else +1665:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1666:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Update error code */ +1667:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED; + 2037 .loc 1 1667 5 is_stmt 1 view .LVU693 + 2038 .loc 1 1667 9 is_stmt 0 view .LVU694 + 2039 000c 436A ldr r3, [r0, #36] + 2040 .loc 1 1667 21 view .LVU695 + 2041 000e 43F48023 orr r3, r3, #262144 + 2042 0012 4362 str r3, [r0, #36] +1668:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1669:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** return HAL_ERROR; + 2043 .loc 1 1669 5 is_stmt 1 view .LVU696 + 2044 .loc 1 1669 12 is_stmt 0 view .LVU697 + 2045 0014 0120 movs r0, #1 + 2046 .LVL159: +1670:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1671:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2047 .loc 1 1671 1 view .LVU698 + 2048 0016 7047 bx lr + 2049 .LVL160: + 2050 .L153: +1659:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 2051 .loc 1 1659 5 is_stmt 1 view .LVU699 + 2052 0018 0268 ldr r2, [r0] + 2053 001a 5369 ldr r3, [r2, #20] + 2054 001c 23EA0103 bic r3, r3, r1 + 2055 0020 5361 str r3, [r2, #20] + ARM GAS /tmp/ccqPwHQi.s page 89 + + +1662:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2056 .loc 1 1662 5 view .LVU700 +1662:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2057 .loc 1 1662 12 is_stmt 0 view .LVU701 + 2058 0022 0020 movs r0, #0 + 2059 .LVL161: +1662:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2060 .loc 1 1662 12 view .LVU702 + 2061 0024 7047 bx lr + 2062 .cfi_endproc + 2063 .LFE148: + 2065 .section .text.HAL_CAN_TxMailbox0CompleteCallback,"ax",%progbits + 2066 .align 1 + 2067 .weak HAL_CAN_TxMailbox0CompleteCallback + 2068 .syntax unified + 2069 .thumb + 2070 .thumb_func + 2072 HAL_CAN_TxMailbox0CompleteCallback: + 2073 .LVL162: + 2074 .LFB150: +1672:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1673:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** +1674:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief Handles CAN interrupt request +1675:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param hcan pointer to a CAN_HandleTypeDef structure that contains +1676:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * the configuration information for the specified CAN. +1677:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @retval None +1678:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +1679:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** void HAL_CAN_IRQHandler(CAN_HandleTypeDef *hcan) +1680:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1681:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t errorcode = HAL_CAN_ERROR_NONE; +1682:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t interrupts = READ_REG(hcan->Instance->IER); +1683:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t msrflags = READ_REG(hcan->Instance->MSR); +1684:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t tsrflags = READ_REG(hcan->Instance->TSR); +1685:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t rf0rflags = READ_REG(hcan->Instance->RF0R); +1686:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t rf1rflags = READ_REG(hcan->Instance->RF1R); +1687:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t esrflags = READ_REG(hcan->Instance->ESR); +1688:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1689:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Transmit Mailbox empty interrupt management *****************************/ +1690:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((interrupts & CAN_IT_TX_MAILBOX_EMPTY) != 0U) +1691:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1692:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Transmit Mailbox 0 management *****************************************/ +1693:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((tsrflags & CAN_TSR_RQCP0) != 0U) +1694:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1695:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Clear the Transmission Complete flag (and TXOK0,ALST0,TERR0 bits) */ +1696:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_RQCP0); +1697:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1698:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((tsrflags & CAN_TSR_TXOK0) != 0U) +1699:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1700:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Transmission Mailbox 0 complete callback */ +1701:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #if USE_HAL_CAN_REGISTER_CALLBACKS == 1 +1702:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Call registered callback*/ +1703:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->TxMailbox0CompleteCallback(hcan); +1704:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #else +1705:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Call weak (surcharged) callback */ +1706:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_TxMailbox0CompleteCallback(hcan); +1707:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ +1708:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + ARM GAS /tmp/ccqPwHQi.s page 90 + + +1709:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** else +1710:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1711:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((tsrflags & CAN_TSR_ALST0) != 0U) +1712:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1713:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Update error code */ +1714:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** errorcode |= HAL_CAN_ERROR_TX_ALST0; +1715:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1716:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** else if ((tsrflags & CAN_TSR_TERR0) != 0U) +1717:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1718:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Update error code */ +1719:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** errorcode |= HAL_CAN_ERROR_TX_TERR0; +1720:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1721:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** else +1722:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1723:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Transmission Mailbox 0 abort callback */ +1724:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #if USE_HAL_CAN_REGISTER_CALLBACKS == 1 +1725:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Call registered callback*/ +1726:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->TxMailbox0AbortCallback(hcan); +1727:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #else +1728:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Call weak (surcharged) callback */ +1729:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_TxMailbox0AbortCallback(hcan); +1730:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ +1731:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1732:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1733:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1734:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1735:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Transmit Mailbox 1 management *****************************************/ +1736:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((tsrflags & CAN_TSR_RQCP1) != 0U) +1737:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1738:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Clear the Transmission Complete flag (and TXOK1,ALST1,TERR1 bits) */ +1739:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_RQCP1); +1740:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1741:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((tsrflags & CAN_TSR_TXOK1) != 0U) +1742:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1743:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Transmission Mailbox 1 complete callback */ +1744:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #if USE_HAL_CAN_REGISTER_CALLBACKS == 1 +1745:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Call registered callback*/ +1746:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->TxMailbox1CompleteCallback(hcan); +1747:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #else +1748:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Call weak (surcharged) callback */ +1749:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_TxMailbox1CompleteCallback(hcan); +1750:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ +1751:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1752:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** else +1753:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1754:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((tsrflags & CAN_TSR_ALST1) != 0U) +1755:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1756:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Update error code */ +1757:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** errorcode |= HAL_CAN_ERROR_TX_ALST1; +1758:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1759:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** else if ((tsrflags & CAN_TSR_TERR1) != 0U) +1760:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1761:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Update error code */ +1762:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** errorcode |= HAL_CAN_ERROR_TX_TERR1; +1763:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1764:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** else +1765:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + ARM GAS /tmp/ccqPwHQi.s page 91 + + +1766:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Transmission Mailbox 1 abort callback */ +1767:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #if USE_HAL_CAN_REGISTER_CALLBACKS == 1 +1768:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Call registered callback*/ +1769:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->TxMailbox1AbortCallback(hcan); +1770:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #else +1771:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Call weak (surcharged) callback */ +1772:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_TxMailbox1AbortCallback(hcan); +1773:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ +1774:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1775:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1776:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1777:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1778:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Transmit Mailbox 2 management *****************************************/ +1779:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((tsrflags & CAN_TSR_RQCP2) != 0U) +1780:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1781:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Clear the Transmission Complete flag (and TXOK2,ALST2,TERR2 bits) */ +1782:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_RQCP2); +1783:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1784:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((tsrflags & CAN_TSR_TXOK2) != 0U) +1785:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1786:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Transmission Mailbox 2 complete callback */ +1787:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #if USE_HAL_CAN_REGISTER_CALLBACKS == 1 +1788:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Call registered callback*/ +1789:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->TxMailbox2CompleteCallback(hcan); +1790:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #else +1791:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Call weak (surcharged) callback */ +1792:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_TxMailbox2CompleteCallback(hcan); +1793:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ +1794:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1795:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** else +1796:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1797:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((tsrflags & CAN_TSR_ALST2) != 0U) +1798:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1799:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Update error code */ +1800:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** errorcode |= HAL_CAN_ERROR_TX_ALST2; +1801:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1802:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** else if ((tsrflags & CAN_TSR_TERR2) != 0U) +1803:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1804:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Update error code */ +1805:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** errorcode |= HAL_CAN_ERROR_TX_TERR2; +1806:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1807:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** else +1808:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1809:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Transmission Mailbox 2 abort callback */ +1810:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #if USE_HAL_CAN_REGISTER_CALLBACKS == 1 +1811:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Call registered callback*/ +1812:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->TxMailbox2AbortCallback(hcan); +1813:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #else +1814:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Call weak (surcharged) callback */ +1815:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_TxMailbox2AbortCallback(hcan); +1816:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ +1817:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1818:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1819:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1820:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1821:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1822:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Receive FIFO 0 overrun interrupt management *****************************/ + ARM GAS /tmp/ccqPwHQi.s page 92 + + +1823:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((interrupts & CAN_IT_RX_FIFO0_OVERRUN) != 0U) +1824:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1825:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((rf0rflags & CAN_RF0R_FOVR0) != 0U) +1826:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1827:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Set CAN error code to Rx Fifo 0 overrun error */ +1828:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** errorcode |= HAL_CAN_ERROR_RX_FOV0; +1829:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1830:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Clear FIFO0 Overrun Flag */ +1831:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FOV0); +1832:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1833:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1834:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1835:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Receive FIFO 0 full interrupt management ********************************/ +1836:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((interrupts & CAN_IT_RX_FIFO0_FULL) != 0U) +1837:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1838:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((rf0rflags & CAN_RF0R_FULL0) != 0U) +1839:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1840:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Clear FIFO 0 full Flag */ +1841:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FF0); +1842:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1843:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Receive FIFO 0 full Callback */ +1844:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #if USE_HAL_CAN_REGISTER_CALLBACKS == 1 +1845:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Call registered callback*/ +1846:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->RxFifo0FullCallback(hcan); +1847:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #else +1848:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Call weak (surcharged) callback */ +1849:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_RxFifo0FullCallback(hcan); +1850:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ +1851:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1852:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1853:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1854:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Receive FIFO 0 message pending interrupt management *********************/ +1855:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((interrupts & CAN_IT_RX_FIFO0_MSG_PENDING) != 0U) +1856:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1857:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Check if message is still pending */ +1858:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((hcan->Instance->RF0R & CAN_RF0R_FMP0) != 0U) +1859:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1860:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Receive FIFO 0 message pending Callback */ +1861:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #if USE_HAL_CAN_REGISTER_CALLBACKS == 1 +1862:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Call registered callback*/ +1863:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->RxFifo0MsgPendingCallback(hcan); +1864:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #else +1865:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Call weak (surcharged) callback */ +1866:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_RxFifo0MsgPendingCallback(hcan); +1867:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ +1868:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1869:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1870:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1871:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Receive FIFO 1 overrun interrupt management *****************************/ +1872:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((interrupts & CAN_IT_RX_FIFO1_OVERRUN) != 0U) +1873:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1874:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((rf1rflags & CAN_RF1R_FOVR1) != 0U) +1875:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1876:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Set CAN error code to Rx Fifo 1 overrun error */ +1877:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** errorcode |= HAL_CAN_ERROR_RX_FOV1; +1878:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1879:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Clear FIFO1 Overrun Flag */ + ARM GAS /tmp/ccqPwHQi.s page 93 + + +1880:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FOV1); +1881:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1882:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1883:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1884:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Receive FIFO 1 full interrupt management ********************************/ +1885:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((interrupts & CAN_IT_RX_FIFO1_FULL) != 0U) +1886:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1887:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((rf1rflags & CAN_RF1R_FULL1) != 0U) +1888:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1889:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Clear FIFO 1 full Flag */ +1890:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FF1); +1891:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1892:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Receive FIFO 1 full Callback */ +1893:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #if USE_HAL_CAN_REGISTER_CALLBACKS == 1 +1894:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Call registered callback*/ +1895:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->RxFifo1FullCallback(hcan); +1896:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #else +1897:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Call weak (surcharged) callback */ +1898:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_RxFifo1FullCallback(hcan); +1899:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ +1900:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1901:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1902:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1903:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Receive FIFO 1 message pending interrupt management *********************/ +1904:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((interrupts & CAN_IT_RX_FIFO1_MSG_PENDING) != 0U) +1905:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1906:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Check if message is still pending */ +1907:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((hcan->Instance->RF1R & CAN_RF1R_FMP1) != 0U) +1908:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1909:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Receive FIFO 1 message pending Callback */ +1910:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #if USE_HAL_CAN_REGISTER_CALLBACKS == 1 +1911:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Call registered callback*/ +1912:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->RxFifo1MsgPendingCallback(hcan); +1913:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #else +1914:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Call weak (surcharged) callback */ +1915:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_RxFifo1MsgPendingCallback(hcan); +1916:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ +1917:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1918:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1919:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1920:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Sleep interrupt management *********************************************/ +1921:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((interrupts & CAN_IT_SLEEP_ACK) != 0U) +1922:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1923:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((msrflags & CAN_MSR_SLAKI) != 0U) +1924:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1925:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Clear Sleep interrupt Flag */ +1926:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_SLAKI); +1927:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1928:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Sleep Callback */ +1929:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #if USE_HAL_CAN_REGISTER_CALLBACKS == 1 +1930:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Call registered callback*/ +1931:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->SleepCallback(hcan); +1932:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #else +1933:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Call weak (surcharged) callback */ +1934:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_SleepCallback(hcan); +1935:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ +1936:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + ARM GAS /tmp/ccqPwHQi.s page 94 + + +1937:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1938:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1939:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* WakeUp interrupt management *********************************************/ +1940:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((interrupts & CAN_IT_WAKEUP) != 0U) +1941:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1942:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((msrflags & CAN_MSR_WKUI) != 0U) +1943:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1944:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Clear WakeUp Flag */ +1945:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_WKU); +1946:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1947:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* WakeUp Callback */ +1948:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #if USE_HAL_CAN_REGISTER_CALLBACKS == 1 +1949:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Call registered callback*/ +1950:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->WakeUpFromRxMsgCallback(hcan); +1951:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #else +1952:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Call weak (surcharged) callback */ +1953:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_WakeUpFromRxMsgCallback(hcan); +1954:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ +1955:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1956:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1957:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1958:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Error interrupts management *********************************************/ +1959:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((interrupts & CAN_IT_ERROR) != 0U) +1960:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1961:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((msrflags & CAN_MSR_ERRI) != 0U) +1962:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1963:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Check Error Warning Flag */ +1964:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if (((interrupts & CAN_IT_ERROR_WARNING) != 0U) && +1965:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ((esrflags & CAN_ESR_EWGF) != 0U)) +1966:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1967:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Set CAN error code to Error Warning */ +1968:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** errorcode |= HAL_CAN_ERROR_EWG; +1969:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1970:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* No need for clear of Error Warning Flag as read-only */ +1971:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1972:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1973:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Check Error Passive Flag */ +1974:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if (((interrupts & CAN_IT_ERROR_PASSIVE) != 0U) && +1975:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ((esrflags & CAN_ESR_EPVF) != 0U)) +1976:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1977:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Set CAN error code to Error Passive */ +1978:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** errorcode |= HAL_CAN_ERROR_EPV; +1979:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1980:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* No need for clear of Error Passive Flag as read-only */ +1981:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1982:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1983:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Check Bus-off Flag */ +1984:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if (((interrupts & CAN_IT_BUSOFF) != 0U) && +1985:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ((esrflags & CAN_ESR_BOFF) != 0U)) +1986:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1987:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Set CAN error code to Bus-Off */ +1988:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** errorcode |= HAL_CAN_ERROR_BOF; +1989:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1990:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* No need for clear of Error Bus-Off as read-only */ +1991:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +1992:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +1993:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Check Last Error Code Flag */ + ARM GAS /tmp/ccqPwHQi.s page 95 + + +1994:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if (((interrupts & CAN_IT_LAST_ERROR_CODE) != 0U) && +1995:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ((esrflags & CAN_ESR_LEC) != 0U)) +1996:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1997:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** switch (esrflags & CAN_ESR_LEC) +1998:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +1999:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case (CAN_ESR_LEC_0): +2000:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Set CAN error code to Stuff error */ +2001:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** errorcode |= HAL_CAN_ERROR_STF; +2002:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; +2003:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case (CAN_ESR_LEC_1): +2004:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Set CAN error code to Form error */ +2005:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** errorcode |= HAL_CAN_ERROR_FOR; +2006:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; +2007:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case (CAN_ESR_LEC_1 | CAN_ESR_LEC_0): +2008:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Set CAN error code to Acknowledgement error */ +2009:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** errorcode |= HAL_CAN_ERROR_ACK; +2010:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; +2011:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case (CAN_ESR_LEC_2): +2012:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Set CAN error code to Bit recessive error */ +2013:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** errorcode |= HAL_CAN_ERROR_BR; +2014:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; +2015:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case (CAN_ESR_LEC_2 | CAN_ESR_LEC_0): +2016:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Set CAN error code to Bit Dominant error */ +2017:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** errorcode |= HAL_CAN_ERROR_BD; +2018:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; +2019:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case (CAN_ESR_LEC_2 | CAN_ESR_LEC_1): +2020:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Set CAN error code to CRC error */ +2021:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** errorcode |= HAL_CAN_ERROR_CRC; +2022:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; +2023:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** default: +2024:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; +2025:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +2026:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +2027:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Clear Last error code Flag */ +2028:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** CLEAR_BIT(hcan->Instance->ESR, CAN_ESR_LEC); +2029:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +2030:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +2031:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +2032:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Clear ERRI Flag */ +2033:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** __HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_ERRI); +2034:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +2035:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +2036:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Call the Error call Back in case of Errors */ +2037:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if (errorcode != HAL_CAN_ERROR_NONE) +2038:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +2039:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Update error code in handle */ +2040:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->ErrorCode |= errorcode; +2041:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +2042:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Call Error callback function */ +2043:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #if USE_HAL_CAN_REGISTER_CALLBACKS == 1 +2044:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Call registered callback*/ +2045:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->ErrorCallback(hcan); +2046:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #else +2047:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Call weak (surcharged) callback */ +2048:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_ErrorCallback(hcan); +2049:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ +2050:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + ARM GAS /tmp/ccqPwHQi.s page 96 + + +2051:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +2052:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +2053:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** +2054:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @} +2055:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +2056:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +2057:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** @defgroup CAN_Exported_Functions_Group5 Callback functions +2058:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief CAN Callback functions +2059:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * +2060:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** @verbatim +2061:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ============================================================================== +2062:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ##### Callback functions ##### +2063:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ============================================================================== +2064:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** [..] +2065:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** This subsection provides the following callback functions: +2066:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) HAL_CAN_TxMailbox0CompleteCallback +2067:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) HAL_CAN_TxMailbox1CompleteCallback +2068:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) HAL_CAN_TxMailbox2CompleteCallback +2069:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) HAL_CAN_TxMailbox0AbortCallback +2070:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) HAL_CAN_TxMailbox1AbortCallback +2071:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) HAL_CAN_TxMailbox2AbortCallback +2072:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) HAL_CAN_RxFifo0MsgPendingCallback +2073:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) HAL_CAN_RxFifo0FullCallback +2074:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) HAL_CAN_RxFifo1MsgPendingCallback +2075:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) HAL_CAN_RxFifo1FullCallback +2076:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) HAL_CAN_SleepCallback +2077:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) HAL_CAN_WakeUpFromRxMsgCallback +2078:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) HAL_CAN_ErrorCallback +2079:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +2080:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** @endverbatim +2081:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @{ +2082:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +2083:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +2084:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** +2085:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief Transmission Mailbox 0 complete callback. +2086:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param hcan pointer to a CAN_HandleTypeDef structure that contains +2087:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * the configuration information for the specified CAN. +2088:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @retval None +2089:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +2090:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** __weak void HAL_CAN_TxMailbox0CompleteCallback(CAN_HandleTypeDef *hcan) +2091:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2075 .loc 1 2091 1 is_stmt 1 view -0 + 2076 .cfi_startproc + 2077 @ args = 0, pretend = 0, frame = 0 + 2078 @ frame_needed = 0, uses_anonymous_args = 0 + 2079 @ link register save eliminated. +2092:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Prevent unused argument(s) compilation warning */ +2093:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** UNUSED(hcan); + 2080 .loc 1 2093 3 view .LVU704 +2094:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +2095:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* NOTE : This function Should not be modified, when the callback is needed, +2096:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** the HAL_CAN_TxMailbox0CompleteCallback could be implemented in the +2097:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** user file +2098:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +2099:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2081 .loc 1 2099 1 is_stmt 0 view .LVU705 + 2082 0000 7047 bx lr + ARM GAS /tmp/ccqPwHQi.s page 97 + + + 2083 .cfi_endproc + 2084 .LFE150: + 2086 .section .text.HAL_CAN_TxMailbox1CompleteCallback,"ax",%progbits + 2087 .align 1 + 2088 .weak HAL_CAN_TxMailbox1CompleteCallback + 2089 .syntax unified + 2090 .thumb + 2091 .thumb_func + 2093 HAL_CAN_TxMailbox1CompleteCallback: + 2094 .LVL163: + 2095 .LFB151: +2100:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +2101:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** +2102:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief Transmission Mailbox 1 complete callback. +2103:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param hcan pointer to a CAN_HandleTypeDef structure that contains +2104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * the configuration information for the specified CAN. +2105:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @retval None +2106:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +2107:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** __weak void HAL_CAN_TxMailbox1CompleteCallback(CAN_HandleTypeDef *hcan) +2108:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2096 .loc 1 2108 1 is_stmt 1 view -0 + 2097 .cfi_startproc + 2098 @ args = 0, pretend = 0, frame = 0 + 2099 @ frame_needed = 0, uses_anonymous_args = 0 + 2100 @ link register save eliminated. +2109:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Prevent unused argument(s) compilation warning */ +2110:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** UNUSED(hcan); + 2101 .loc 1 2110 3 view .LVU707 +2111:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +2112:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* NOTE : This function Should not be modified, when the callback is needed, +2113:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** the HAL_CAN_TxMailbox1CompleteCallback could be implemented in the +2114:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** user file +2115:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +2116:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2102 .loc 1 2116 1 is_stmt 0 view .LVU708 + 2103 0000 7047 bx lr + 2104 .cfi_endproc + 2105 .LFE151: + 2107 .section .text.HAL_CAN_TxMailbox2CompleteCallback,"ax",%progbits + 2108 .align 1 + 2109 .weak HAL_CAN_TxMailbox2CompleteCallback + 2110 .syntax unified + 2111 .thumb + 2112 .thumb_func + 2114 HAL_CAN_TxMailbox2CompleteCallback: + 2115 .LVL164: + 2116 .LFB152: +2117:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +2118:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** +2119:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief Transmission Mailbox 2 complete callback. +2120:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param hcan pointer to a CAN_HandleTypeDef structure that contains +2121:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * the configuration information for the specified CAN. +2122:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @retval None +2123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +2124:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** __weak void HAL_CAN_TxMailbox2CompleteCallback(CAN_HandleTypeDef *hcan) +2125:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2117 .loc 1 2125 1 is_stmt 1 view -0 + ARM GAS /tmp/ccqPwHQi.s page 98 + + + 2118 .cfi_startproc + 2119 @ args = 0, pretend = 0, frame = 0 + 2120 @ frame_needed = 0, uses_anonymous_args = 0 + 2121 @ link register save eliminated. +2126:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Prevent unused argument(s) compilation warning */ +2127:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** UNUSED(hcan); + 2122 .loc 1 2127 3 view .LVU710 +2128:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +2129:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* NOTE : This function Should not be modified, when the callback is needed, +2130:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** the HAL_CAN_TxMailbox2CompleteCallback could be implemented in the +2131:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** user file +2132:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +2133:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2123 .loc 1 2133 1 is_stmt 0 view .LVU711 + 2124 0000 7047 bx lr + 2125 .cfi_endproc + 2126 .LFE152: + 2128 .section .text.HAL_CAN_TxMailbox0AbortCallback,"ax",%progbits + 2129 .align 1 + 2130 .weak HAL_CAN_TxMailbox0AbortCallback + 2131 .syntax unified + 2132 .thumb + 2133 .thumb_func + 2135 HAL_CAN_TxMailbox0AbortCallback: + 2136 .LVL165: + 2137 .LFB153: +2134:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +2135:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** +2136:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief Transmission Mailbox 0 Cancellation callback. +2137:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param hcan pointer to an CAN_HandleTypeDef structure that contains +2138:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * the configuration information for the specified CAN. +2139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @retval None +2140:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +2141:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** __weak void HAL_CAN_TxMailbox0AbortCallback(CAN_HandleTypeDef *hcan) +2142:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2138 .loc 1 2142 1 is_stmt 1 view -0 + 2139 .cfi_startproc + 2140 @ args = 0, pretend = 0, frame = 0 + 2141 @ frame_needed = 0, uses_anonymous_args = 0 + 2142 @ link register save eliminated. +2143:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Prevent unused argument(s) compilation warning */ +2144:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** UNUSED(hcan); + 2143 .loc 1 2144 3 view .LVU713 +2145:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +2146:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* NOTE : This function Should not be modified, when the callback is needed, +2147:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** the HAL_CAN_TxMailbox0AbortCallback could be implemented in the +2148:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** user file +2149:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +2150:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2144 .loc 1 2150 1 is_stmt 0 view .LVU714 + 2145 0000 7047 bx lr + 2146 .cfi_endproc + 2147 .LFE153: + 2149 .section .text.HAL_CAN_TxMailbox1AbortCallback,"ax",%progbits + 2150 .align 1 + 2151 .weak HAL_CAN_TxMailbox1AbortCallback + 2152 .syntax unified + ARM GAS /tmp/ccqPwHQi.s page 99 + + + 2153 .thumb + 2154 .thumb_func + 2156 HAL_CAN_TxMailbox1AbortCallback: + 2157 .LVL166: + 2158 .LFB154: +2151:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +2152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** +2153:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief Transmission Mailbox 1 Cancellation callback. +2154:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param hcan pointer to an CAN_HandleTypeDef structure that contains +2155:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * the configuration information for the specified CAN. +2156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @retval None +2157:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +2158:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** __weak void HAL_CAN_TxMailbox1AbortCallback(CAN_HandleTypeDef *hcan) +2159:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2159 .loc 1 2159 1 is_stmt 1 view -0 + 2160 .cfi_startproc + 2161 @ args = 0, pretend = 0, frame = 0 + 2162 @ frame_needed = 0, uses_anonymous_args = 0 + 2163 @ link register save eliminated. +2160:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Prevent unused argument(s) compilation warning */ +2161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** UNUSED(hcan); + 2164 .loc 1 2161 3 view .LVU716 +2162:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +2163:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* NOTE : This function Should not be modified, when the callback is needed, +2164:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** the HAL_CAN_TxMailbox1AbortCallback could be implemented in the +2165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** user file +2166:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +2167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2165 .loc 1 2167 1 is_stmt 0 view .LVU717 + 2166 0000 7047 bx lr + 2167 .cfi_endproc + 2168 .LFE154: + 2170 .section .text.HAL_CAN_TxMailbox2AbortCallback,"ax",%progbits + 2171 .align 1 + 2172 .weak HAL_CAN_TxMailbox2AbortCallback + 2173 .syntax unified + 2174 .thumb + 2175 .thumb_func + 2177 HAL_CAN_TxMailbox2AbortCallback: + 2178 .LVL167: + 2179 .LFB155: +2168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +2169:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** +2170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief Transmission Mailbox 2 Cancellation callback. +2171:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param hcan pointer to an CAN_HandleTypeDef structure that contains +2172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * the configuration information for the specified CAN. +2173:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @retval None +2174:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +2175:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** __weak void HAL_CAN_TxMailbox2AbortCallback(CAN_HandleTypeDef *hcan) +2176:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2180 .loc 1 2176 1 is_stmt 1 view -0 + 2181 .cfi_startproc + 2182 @ args = 0, pretend = 0, frame = 0 + 2183 @ frame_needed = 0, uses_anonymous_args = 0 + 2184 @ link register save eliminated. +2177:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Prevent unused argument(s) compilation warning */ +2178:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** UNUSED(hcan); + ARM GAS /tmp/ccqPwHQi.s page 100 + + + 2185 .loc 1 2178 3 view .LVU719 +2179:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +2180:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* NOTE : This function Should not be modified, when the callback is needed, +2181:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** the HAL_CAN_TxMailbox2AbortCallback could be implemented in the +2182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** user file +2183:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +2184:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2186 .loc 1 2184 1 is_stmt 0 view .LVU720 + 2187 0000 7047 bx lr + 2188 .cfi_endproc + 2189 .LFE155: + 2191 .section .text.HAL_CAN_RxFifo0MsgPendingCallback,"ax",%progbits + 2192 .align 1 + 2193 .weak HAL_CAN_RxFifo0MsgPendingCallback + 2194 .syntax unified + 2195 .thumb + 2196 .thumb_func + 2198 HAL_CAN_RxFifo0MsgPendingCallback: + 2199 .LVL168: + 2200 .LFB156: +2185:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +2186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** +2187:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief Rx FIFO 0 message pending callback. +2188:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param hcan pointer to a CAN_HandleTypeDef structure that contains +2189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * the configuration information for the specified CAN. +2190:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @retval None +2191:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +2192:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** __weak void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) +2193:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2201 .loc 1 2193 1 is_stmt 1 view -0 + 2202 .cfi_startproc + 2203 @ args = 0, pretend = 0, frame = 0 + 2204 @ frame_needed = 0, uses_anonymous_args = 0 + 2205 @ link register save eliminated. +2194:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Prevent unused argument(s) compilation warning */ +2195:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** UNUSED(hcan); + 2206 .loc 1 2195 3 view .LVU722 +2196:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +2197:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* NOTE : This function Should not be modified, when the callback is needed, +2198:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** the HAL_CAN_RxFifo0MsgPendingCallback could be implemented in the +2199:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** user file +2200:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +2201:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2207 .loc 1 2201 1 is_stmt 0 view .LVU723 + 2208 0000 7047 bx lr + 2209 .cfi_endproc + 2210 .LFE156: + 2212 .section .text.HAL_CAN_RxFifo0FullCallback,"ax",%progbits + 2213 .align 1 + 2214 .weak HAL_CAN_RxFifo0FullCallback + 2215 .syntax unified + 2216 .thumb + 2217 .thumb_func + 2219 HAL_CAN_RxFifo0FullCallback: + 2220 .LVL169: + 2221 .LFB157: +2202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + ARM GAS /tmp/ccqPwHQi.s page 101 + + +2203:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** +2204:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief Rx FIFO 0 full callback. +2205:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param hcan pointer to a CAN_HandleTypeDef structure that contains +2206:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * the configuration information for the specified CAN. +2207:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @retval None +2208:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +2209:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** __weak void HAL_CAN_RxFifo0FullCallback(CAN_HandleTypeDef *hcan) +2210:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2222 .loc 1 2210 1 is_stmt 1 view -0 + 2223 .cfi_startproc + 2224 @ args = 0, pretend = 0, frame = 0 + 2225 @ frame_needed = 0, uses_anonymous_args = 0 + 2226 @ link register save eliminated. +2211:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Prevent unused argument(s) compilation warning */ +2212:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** UNUSED(hcan); + 2227 .loc 1 2212 3 view .LVU725 +2213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +2214:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* NOTE : This function Should not be modified, when the callback is needed, +2215:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** the HAL_CAN_RxFifo0FullCallback could be implemented in the user +2216:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** file +2217:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +2218:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2228 .loc 1 2218 1 is_stmt 0 view .LVU726 + 2229 0000 7047 bx lr + 2230 .cfi_endproc + 2231 .LFE157: + 2233 .section .text.HAL_CAN_RxFifo1MsgPendingCallback,"ax",%progbits + 2234 .align 1 + 2235 .weak HAL_CAN_RxFifo1MsgPendingCallback + 2236 .syntax unified + 2237 .thumb + 2238 .thumb_func + 2240 HAL_CAN_RxFifo1MsgPendingCallback: + 2241 .LVL170: + 2242 .LFB158: +2219:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +2220:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** +2221:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief Rx FIFO 1 message pending callback. +2222:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param hcan pointer to a CAN_HandleTypeDef structure that contains +2223:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * the configuration information for the specified CAN. +2224:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @retval None +2225:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +2226:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** __weak void HAL_CAN_RxFifo1MsgPendingCallback(CAN_HandleTypeDef *hcan) +2227:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2243 .loc 1 2227 1 is_stmt 1 view -0 + 2244 .cfi_startproc + 2245 @ args = 0, pretend = 0, frame = 0 + 2246 @ frame_needed = 0, uses_anonymous_args = 0 + 2247 @ link register save eliminated. +2228:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Prevent unused argument(s) compilation warning */ +2229:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** UNUSED(hcan); + 2248 .loc 1 2229 3 view .LVU728 +2230:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +2231:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* NOTE : This function Should not be modified, when the callback is needed, +2232:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** the HAL_CAN_RxFifo1MsgPendingCallback could be implemented in the +2233:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** user file +2234:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ + ARM GAS /tmp/ccqPwHQi.s page 102 + + +2235:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2249 .loc 1 2235 1 is_stmt 0 view .LVU729 + 2250 0000 7047 bx lr + 2251 .cfi_endproc + 2252 .LFE158: + 2254 .section .text.HAL_CAN_RxFifo1FullCallback,"ax",%progbits + 2255 .align 1 + 2256 .weak HAL_CAN_RxFifo1FullCallback + 2257 .syntax unified + 2258 .thumb + 2259 .thumb_func + 2261 HAL_CAN_RxFifo1FullCallback: + 2262 .LVL171: + 2263 .LFB159: +2236:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +2237:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** +2238:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief Rx FIFO 1 full callback. +2239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param hcan pointer to a CAN_HandleTypeDef structure that contains +2240:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * the configuration information for the specified CAN. +2241:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @retval None +2242:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +2243:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** __weak void HAL_CAN_RxFifo1FullCallback(CAN_HandleTypeDef *hcan) +2244:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2264 .loc 1 2244 1 is_stmt 1 view -0 + 2265 .cfi_startproc + 2266 @ args = 0, pretend = 0, frame = 0 + 2267 @ frame_needed = 0, uses_anonymous_args = 0 + 2268 @ link register save eliminated. +2245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Prevent unused argument(s) compilation warning */ +2246:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** UNUSED(hcan); + 2269 .loc 1 2246 3 view .LVU731 +2247:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +2248:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* NOTE : This function Should not be modified, when the callback is needed, +2249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** the HAL_CAN_RxFifo1FullCallback could be implemented in the user +2250:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** file +2251:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +2252:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2270 .loc 1 2252 1 is_stmt 0 view .LVU732 + 2271 0000 7047 bx lr + 2272 .cfi_endproc + 2273 .LFE159: + 2275 .section .text.HAL_CAN_SleepCallback,"ax",%progbits + 2276 .align 1 + 2277 .weak HAL_CAN_SleepCallback + 2278 .syntax unified + 2279 .thumb + 2280 .thumb_func + 2282 HAL_CAN_SleepCallback: + 2283 .LVL172: + 2284 .LFB160: +2253:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +2254:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** +2255:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief Sleep callback. +2256:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param hcan pointer to a CAN_HandleTypeDef structure that contains +2257:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * the configuration information for the specified CAN. +2258:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @retval None +2259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ + ARM GAS /tmp/ccqPwHQi.s page 103 + + +2260:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** __weak void HAL_CAN_SleepCallback(CAN_HandleTypeDef *hcan) +2261:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2285 .loc 1 2261 1 is_stmt 1 view -0 + 2286 .cfi_startproc + 2287 @ args = 0, pretend = 0, frame = 0 + 2288 @ frame_needed = 0, uses_anonymous_args = 0 + 2289 @ link register save eliminated. +2262:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Prevent unused argument(s) compilation warning */ +2263:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** UNUSED(hcan); + 2290 .loc 1 2263 3 view .LVU734 +2264:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +2265:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* NOTE : This function Should not be modified, when the callback is needed, +2266:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** the HAL_CAN_SleepCallback could be implemented in the user file +2267:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +2268:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2291 .loc 1 2268 1 is_stmt 0 view .LVU735 + 2292 0000 7047 bx lr + 2293 .cfi_endproc + 2294 .LFE160: + 2296 .section .text.HAL_CAN_WakeUpFromRxMsgCallback,"ax",%progbits + 2297 .align 1 + 2298 .weak HAL_CAN_WakeUpFromRxMsgCallback + 2299 .syntax unified + 2300 .thumb + 2301 .thumb_func + 2303 HAL_CAN_WakeUpFromRxMsgCallback: + 2304 .LVL173: + 2305 .LFB161: +2269:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +2270:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** +2271:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief WakeUp from Rx message callback. +2272:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param hcan pointer to a CAN_HandleTypeDef structure that contains +2273:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * the configuration information for the specified CAN. +2274:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @retval None +2275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +2276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** __weak void HAL_CAN_WakeUpFromRxMsgCallback(CAN_HandleTypeDef *hcan) +2277:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2306 .loc 1 2277 1 is_stmt 1 view -0 + 2307 .cfi_startproc + 2308 @ args = 0, pretend = 0, frame = 0 + 2309 @ frame_needed = 0, uses_anonymous_args = 0 + 2310 @ link register save eliminated. +2278:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Prevent unused argument(s) compilation warning */ +2279:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** UNUSED(hcan); + 2311 .loc 1 2279 3 view .LVU737 +2280:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +2281:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* NOTE : This function Should not be modified, when the callback is needed, +2282:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** the HAL_CAN_WakeUpFromRxMsgCallback could be implemented in the +2283:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** user file +2284:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +2285:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2312 .loc 1 2285 1 is_stmt 0 view .LVU738 + 2313 0000 7047 bx lr + 2314 .cfi_endproc + 2315 .LFE161: + 2317 .section .text.HAL_CAN_ErrorCallback,"ax",%progbits + 2318 .align 1 + ARM GAS /tmp/ccqPwHQi.s page 104 + + + 2319 .weak HAL_CAN_ErrorCallback + 2320 .syntax unified + 2321 .thumb + 2322 .thumb_func + 2324 HAL_CAN_ErrorCallback: + 2325 .LVL174: + 2326 .LFB162: +2286:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +2287:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** +2288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief Error CAN callback. +2289:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param hcan pointer to a CAN_HandleTypeDef structure that contains +2290:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * the configuration information for the specified CAN. +2291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @retval None +2292:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +2293:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** __weak void HAL_CAN_ErrorCallback(CAN_HandleTypeDef *hcan) +2294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2327 .loc 1 2294 1 is_stmt 1 view -0 + 2328 .cfi_startproc + 2329 @ args = 0, pretend = 0, frame = 0 + 2330 @ frame_needed = 0, uses_anonymous_args = 0 + 2331 @ link register save eliminated. +2295:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Prevent unused argument(s) compilation warning */ +2296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** UNUSED(hcan); + 2332 .loc 1 2296 3 view .LVU740 +2297:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +2298:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* NOTE : This function Should not be modified, when the callback is needed, +2299:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** the HAL_CAN_ErrorCallback could be implemented in the user file +2300:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +2301:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2333 .loc 1 2301 1 is_stmt 0 view .LVU741 + 2334 0000 7047 bx lr + 2335 .cfi_endproc + 2336 .LFE162: + 2338 .section .text.HAL_CAN_IRQHandler,"ax",%progbits + 2339 .align 1 + 2340 .global HAL_CAN_IRQHandler + 2341 .syntax unified + 2342 .thumb + 2343 .thumb_func + 2345 HAL_CAN_IRQHandler: + 2346 .LVL175: + 2347 .LFB149: +1680:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t errorcode = HAL_CAN_ERROR_NONE; + 2348 .loc 1 1680 1 is_stmt 1 view -0 + 2349 .cfi_startproc + 2350 @ args = 0, pretend = 0, frame = 0 + 2351 @ frame_needed = 0, uses_anonymous_args = 0 +1680:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t errorcode = HAL_CAN_ERROR_NONE; + 2352 .loc 1 1680 1 is_stmt 0 view .LVU743 + 2353 0000 2DE9F84F push {r3, r4, r5, r6, r7, r8, r9, r10, fp, lr} + 2354 .cfi_def_cfa_offset 40 + 2355 .cfi_offset 3, -40 + 2356 .cfi_offset 4, -36 + 2357 .cfi_offset 5, -32 + 2358 .cfi_offset 6, -28 + 2359 .cfi_offset 7, -24 + 2360 .cfi_offset 8, -20 + ARM GAS /tmp/ccqPwHQi.s page 105 + + + 2361 .cfi_offset 9, -16 + 2362 .cfi_offset 10, -12 + 2363 .cfi_offset 11, -8 + 2364 .cfi_offset 14, -4 + 2365 0004 0546 mov r5, r0 +1681:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t interrupts = READ_REG(hcan->Instance->IER); + 2366 .loc 1 1681 3 is_stmt 1 view .LVU744 + 2367 .LVL176: +1682:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t msrflags = READ_REG(hcan->Instance->MSR); + 2368 .loc 1 1682 3 view .LVU745 +1682:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t msrflags = READ_REG(hcan->Instance->MSR); + 2369 .loc 1 1682 25 is_stmt 0 view .LVU746 + 2370 0006 0368 ldr r3, [r0] +1682:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t msrflags = READ_REG(hcan->Instance->MSR); + 2371 .loc 1 1682 12 view .LVU747 + 2372 0008 5C69 ldr r4, [r3, #20] + 2373 .LVL177: +1683:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t tsrflags = READ_REG(hcan->Instance->TSR); + 2374 .loc 1 1683 3 is_stmt 1 view .LVU748 +1683:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t tsrflags = READ_REG(hcan->Instance->TSR); + 2375 .loc 1 1683 12 is_stmt 0 view .LVU749 + 2376 000a D3F80480 ldr r8, [r3, #4] + 2377 .LVL178: +1684:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t rf0rflags = READ_REG(hcan->Instance->RF0R); + 2378 .loc 1 1684 3 is_stmt 1 view .LVU750 +1684:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t rf0rflags = READ_REG(hcan->Instance->RF0R); + 2379 .loc 1 1684 12 is_stmt 0 view .LVU751 + 2380 000e 9F68 ldr r7, [r3, #8] + 2381 .LVL179: +1685:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t rf1rflags = READ_REG(hcan->Instance->RF1R); + 2382 .loc 1 1685 3 is_stmt 1 view .LVU752 +1685:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t rf1rflags = READ_REG(hcan->Instance->RF1R); + 2383 .loc 1 1685 12 is_stmt 0 view .LVU753 + 2384 0010 D3F80CB0 ldr fp, [r3, #12] + 2385 .LVL180: +1686:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t esrflags = READ_REG(hcan->Instance->ESR); + 2386 .loc 1 1686 3 is_stmt 1 view .LVU754 +1686:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t esrflags = READ_REG(hcan->Instance->ESR); + 2387 .loc 1 1686 12 is_stmt 0 view .LVU755 + 2388 0014 D3F810A0 ldr r10, [r3, #16] + 2389 .LVL181: +1687:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 2390 .loc 1 1687 3 is_stmt 1 view .LVU756 +1687:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 2391 .loc 1 1687 12 is_stmt 0 view .LVU757 + 2392 0018 D3F81890 ldr r9, [r3, #24] + 2393 .LVL182: +1690:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2394 .loc 1 1690 3 is_stmt 1 view .LVU758 +1690:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2395 .loc 1 1690 6 is_stmt 0 view .LVU759 + 2396 001c 14F00106 ands r6, r4, #1 + 2397 0020 3BD0 beq .L168 +1693:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2398 .loc 1 1693 5 is_stmt 1 view .LVU760 +1693:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2399 .loc 1 1693 8 is_stmt 0 view .LVU761 + ARM GAS /tmp/ccqPwHQi.s page 106 + + + 2400 0022 17F00106 ands r6, r7, #1 + 2401 0026 16D0 beq .L169 +1696:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 2402 .loc 1 1696 7 is_stmt 1 view .LVU762 + 2403 0028 0122 movs r2, #1 + 2404 002a 9A60 str r2, [r3, #8] +1698:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2405 .loc 1 1698 7 view .LVU763 +1698:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2406 .loc 1 1698 10 is_stmt 0 view .LVU764 + 2407 002c 17F0020F tst r7, #2 + 2408 0030 08D1 bne .L203 +1711:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2409 .loc 1 1711 9 is_stmt 1 view .LVU765 +1711:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2410 .loc 1 1711 12 is_stmt 0 view .LVU766 + 2411 0032 17F0040F tst r7, #4 + 2412 0036 0CD1 bne .L200 +1716:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2413 .loc 1 1716 14 is_stmt 1 view .LVU767 +1716:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2414 .loc 1 1716 17 is_stmt 0 view .LVU768 + 2415 0038 17F00806 ands r6, r7, #8 + 2416 003c 06D0 beq .L204 +1719:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2417 .loc 1 1719 21 view .LVU769 + 2418 003e 4FF48056 mov r6, #4096 + 2419 0042 08E0 b .L169 + 2420 .L203: +1706:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + 2421 .loc 1 1706 9 is_stmt 1 view .LVU770 + 2422 0044 FFF7FEFF bl HAL_CAN_TxMailbox0CompleteCallback + 2423 .LVL183: +1681:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t interrupts = READ_REG(hcan->Instance->IER); + 2424 .loc 1 1681 12 is_stmt 0 view .LVU771 + 2425 0048 0026 movs r6, #0 + 2426 004a 04E0 b .L169 + 2427 .LVL184: + 2428 .L204: +1729:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + 2429 .loc 1 1729 11 is_stmt 1 view .LVU772 + 2430 004c FFF7FEFF bl HAL_CAN_TxMailbox0AbortCallback + 2431 .LVL185: +1729:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + 2432 .loc 1 1729 11 is_stmt 0 view .LVU773 + 2433 0050 01E0 b .L169 + 2434 .LVL186: + 2435 .L200: +1714:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2436 .loc 1 1714 21 view .LVU774 + 2437 0052 4FF40066 mov r6, #2048 + 2438 .LVL187: + 2439 .L169: +1736:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2440 .loc 1 1736 5 is_stmt 1 view .LVU775 +1736:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2441 .loc 1 1736 8 is_stmt 0 view .LVU776 + ARM GAS /tmp/ccqPwHQi.s page 107 + + + 2442 0056 17F4807F tst r7, #256 + 2443 005a 0DD0 beq .L171 +1739:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 2444 .loc 1 1739 7 is_stmt 1 view .LVU777 + 2445 005c 2B68 ldr r3, [r5] + 2446 005e 4FF48072 mov r2, #256 + 2447 0062 9A60 str r2, [r3, #8] +1741:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2448 .loc 1 1741 7 view .LVU778 +1741:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2449 .loc 1 1741 10 is_stmt 0 view .LVU779 + 2450 0064 17F4007F tst r7, #512 + 2451 0068 40F08680 bne .L205 +1754:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2452 .loc 1 1754 9 is_stmt 1 view .LVU780 +1754:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2453 .loc 1 1754 12 is_stmt 0 view .LVU781 + 2454 006c 17F4806F tst r7, #1024 + 2455 0070 00F08680 beq .L173 +1757:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2456 .loc 1 1757 11 is_stmt 1 view .LVU782 +1757:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2457 .loc 1 1757 21 is_stmt 0 view .LVU783 + 2458 0074 46F40056 orr r6, r6, #8192 + 2459 .LVL188: + 2460 .L171: +1779:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2461 .loc 1 1779 5 is_stmt 1 view .LVU784 +1779:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2462 .loc 1 1779 8 is_stmt 0 view .LVU785 + 2463 0078 17F4803F tst r7, #65536 + 2464 007c 0DD0 beq .L168 +1782:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 2465 .loc 1 1782 7 is_stmt 1 view .LVU786 + 2466 007e 2B68 ldr r3, [r5] + 2467 0080 4FF48032 mov r2, #65536 + 2468 0084 9A60 str r2, [r3, #8] +1784:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2469 .loc 1 1784 7 view .LVU787 +1784:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2470 .loc 1 1784 10 is_stmt 0 view .LVU788 + 2471 0086 17F4003F tst r7, #131072 + 2472 008a 40F08380 bne .L206 +1797:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2473 .loc 1 1797 9 is_stmt 1 view .LVU789 +1797:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2474 .loc 1 1797 12 is_stmt 0 view .LVU790 + 2475 008e 17F4802F tst r7, #262144 + 2476 0092 00F08380 beq .L176 +1800:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2477 .loc 1 1800 11 is_stmt 1 view .LVU791 +1800:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2478 .loc 1 1800 21 is_stmt 0 view .LVU792 + 2479 0096 46F40046 orr r6, r6, #32768 + 2480 .LVL189: + 2481 .L168: +1823:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + ARM GAS /tmp/ccqPwHQi.s page 108 + + + 2482 .loc 1 1823 3 is_stmt 1 view .LVU793 +1823:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2483 .loc 1 1823 6 is_stmt 0 view .LVU794 + 2484 009a 14F0080F tst r4, #8 + 2485 009e 07D0 beq .L178 +1825:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2486 .loc 1 1825 5 is_stmt 1 view .LVU795 +1825:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2487 .loc 1 1825 8 is_stmt 0 view .LVU796 + 2488 00a0 1BF0100F tst fp, #16 + 2489 00a4 04D0 beq .L178 +1828:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 2490 .loc 1 1828 7 is_stmt 1 view .LVU797 +1828:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 2491 .loc 1 1828 17 is_stmt 0 view .LVU798 + 2492 00a6 46F40076 orr r6, r6, #512 + 2493 .LVL190: +1831:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2494 .loc 1 1831 7 is_stmt 1 view .LVU799 + 2495 00aa 2B68 ldr r3, [r5] + 2496 00ac 1022 movs r2, #16 + 2497 00ae DA60 str r2, [r3, #12] + 2498 .L178: +1836:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2499 .loc 1 1836 3 view .LVU800 +1836:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2500 .loc 1 1836 6 is_stmt 0 view .LVU801 + 2501 00b0 14F0040F tst r4, #4 + 2502 00b4 02D0 beq .L179 +1838:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2503 .loc 1 1838 5 is_stmt 1 view .LVU802 +1838:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2504 .loc 1 1838 8 is_stmt 0 view .LVU803 + 2505 00b6 1BF0080F tst fp, #8 + 2506 00ba 79D1 bne .L207 + 2507 .L179: +1855:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2508 .loc 1 1855 3 is_stmt 1 view .LVU804 +1855:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2509 .loc 1 1855 6 is_stmt 0 view .LVU805 + 2510 00bc 14F0020F tst r4, #2 + 2511 00c0 04D0 beq .L180 +1858:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2512 .loc 1 1858 5 is_stmt 1 view .LVU806 +1858:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2513 .loc 1 1858 14 is_stmt 0 view .LVU807 + 2514 00c2 2B68 ldr r3, [r5] +1858:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2515 .loc 1 1858 24 view .LVU808 + 2516 00c4 DB68 ldr r3, [r3, #12] +1858:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2517 .loc 1 1858 8 view .LVU809 + 2518 00c6 13F0030F tst r3, #3 + 2519 00ca 78D1 bne .L208 + 2520 .L180: +1872:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2521 .loc 1 1872 3 is_stmt 1 view .LVU810 + ARM GAS /tmp/ccqPwHQi.s page 109 + + +1872:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2522 .loc 1 1872 6 is_stmt 0 view .LVU811 + 2523 00cc 14F0400F tst r4, #64 + 2524 00d0 07D0 beq .L181 +1874:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2525 .loc 1 1874 5 is_stmt 1 view .LVU812 +1874:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2526 .loc 1 1874 8 is_stmt 0 view .LVU813 + 2527 00d2 1AF0100F tst r10, #16 + 2528 00d6 04D0 beq .L181 +1877:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 2529 .loc 1 1877 7 is_stmt 1 view .LVU814 +1877:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 2530 .loc 1 1877 17 is_stmt 0 view .LVU815 + 2531 00d8 46F48066 orr r6, r6, #1024 + 2532 .LVL191: +1880:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2533 .loc 1 1880 7 is_stmt 1 view .LVU816 + 2534 00dc 2B68 ldr r3, [r5] + 2535 00de 1022 movs r2, #16 + 2536 00e0 1A61 str r2, [r3, #16] + 2537 .L181: +1885:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2538 .loc 1 1885 3 view .LVU817 +1885:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2539 .loc 1 1885 6 is_stmt 0 view .LVU818 + 2540 00e2 14F0200F tst r4, #32 + 2541 00e6 02D0 beq .L182 +1887:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2542 .loc 1 1887 5 is_stmt 1 view .LVU819 +1887:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2543 .loc 1 1887 8 is_stmt 0 view .LVU820 + 2544 00e8 1AF0080F tst r10, #8 + 2545 00ec 6BD1 bne .L209 + 2546 .L182: +1904:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2547 .loc 1 1904 3 is_stmt 1 view .LVU821 +1904:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2548 .loc 1 1904 6 is_stmt 0 view .LVU822 + 2549 00ee 14F0100F tst r4, #16 + 2550 00f2 04D0 beq .L183 +1907:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2551 .loc 1 1907 5 is_stmt 1 view .LVU823 +1907:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2552 .loc 1 1907 14 is_stmt 0 view .LVU824 + 2553 00f4 2B68 ldr r3, [r5] +1907:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2554 .loc 1 1907 24 view .LVU825 + 2555 00f6 1B69 ldr r3, [r3, #16] +1907:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2556 .loc 1 1907 8 view .LVU826 + 2557 00f8 13F0030F tst r3, #3 + 2558 00fc 6AD1 bne .L210 + 2559 .L183: +1921:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2560 .loc 1 1921 3 is_stmt 1 view .LVU827 +1921:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + ARM GAS /tmp/ccqPwHQi.s page 110 + + + 2561 .loc 1 1921 6 is_stmt 0 view .LVU828 + 2562 00fe 14F4003F tst r4, #131072 + 2563 0102 02D0 beq .L184 +1923:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2564 .loc 1 1923 5 is_stmt 1 view .LVU829 +1923:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2565 .loc 1 1923 8 is_stmt 0 view .LVU830 + 2566 0104 18F0100F tst r8, #16 + 2567 0108 68D1 bne .L211 + 2568 .L184: +1940:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2569 .loc 1 1940 3 is_stmt 1 view .LVU831 +1940:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2570 .loc 1 1940 6 is_stmt 0 view .LVU832 + 2571 010a 14F4803F tst r4, #65536 + 2572 010e 02D0 beq .L185 +1942:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2573 .loc 1 1942 5 is_stmt 1 view .LVU833 +1942:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2574 .loc 1 1942 8 is_stmt 0 view .LVU834 + 2575 0110 18F0080F tst r8, #8 + 2576 0114 69D1 bne .L212 + 2577 .L185: +1959:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2578 .loc 1 1959 3 is_stmt 1 view .LVU835 +1959:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2579 .loc 1 1959 6 is_stmt 0 view .LVU836 + 2580 0116 14F4004F tst r4, #32768 + 2581 011a 7AD0 beq .L186 +1961:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2582 .loc 1 1961 5 is_stmt 1 view .LVU837 +1961:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2583 .loc 1 1961 8 is_stmt 0 view .LVU838 + 2584 011c 18F0040F tst r8, #4 + 2585 0120 74D0 beq .L187 +1964:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ((esrflags & CAN_ESR_EWGF) != 0U)) + 2586 .loc 1 1964 7 is_stmt 1 view .LVU839 +1964:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ((esrflags & CAN_ESR_EWGF) != 0U)) + 2587 .loc 1 1964 10 is_stmt 0 view .LVU840 + 2588 0122 14F4807F tst r4, #256 + 2589 0126 04D0 beq .L188 +1964:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ((esrflags & CAN_ESR_EWGF) != 0U)) + 2590 .loc 1 1964 55 discriminator 1 view .LVU841 + 2591 0128 19F0010F tst r9, #1 + 2592 012c 01D0 beq .L188 +1968:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 2593 .loc 1 1968 9 is_stmt 1 view .LVU842 +1968:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 2594 .loc 1 1968 19 is_stmt 0 view .LVU843 + 2595 012e 46F00106 orr r6, r6, #1 + 2596 .LVL192: + 2597 .L188: +1974:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ((esrflags & CAN_ESR_EPVF) != 0U)) + 2598 .loc 1 1974 7 is_stmt 1 view .LVU844 +1974:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ((esrflags & CAN_ESR_EPVF) != 0U)) + 2599 .loc 1 1974 10 is_stmt 0 view .LVU845 + 2600 0132 14F4007F tst r4, #512 + ARM GAS /tmp/ccqPwHQi.s page 111 + + + 2601 0136 04D0 beq .L189 +1974:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ((esrflags & CAN_ESR_EPVF) != 0U)) + 2602 .loc 1 1974 55 discriminator 1 view .LVU846 + 2603 0138 19F0020F tst r9, #2 + 2604 013c 01D0 beq .L189 +1978:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 2605 .loc 1 1978 9 is_stmt 1 view .LVU847 +1978:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 2606 .loc 1 1978 19 is_stmt 0 view .LVU848 + 2607 013e 46F00206 orr r6, r6, #2 + 2608 .LVL193: + 2609 .L189: +1984:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ((esrflags & CAN_ESR_BOFF) != 0U)) + 2610 .loc 1 1984 7 is_stmt 1 view .LVU849 +1984:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ((esrflags & CAN_ESR_BOFF) != 0U)) + 2611 .loc 1 1984 10 is_stmt 0 view .LVU850 + 2612 0142 14F4806F tst r4, #1024 + 2613 0146 04D0 beq .L190 +1984:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ((esrflags & CAN_ESR_BOFF) != 0U)) + 2614 .loc 1 1984 48 discriminator 1 view .LVU851 + 2615 0148 19F0040F tst r9, #4 + 2616 014c 01D0 beq .L190 +1988:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 2617 .loc 1 1988 9 is_stmt 1 view .LVU852 +1988:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 2618 .loc 1 1988 19 is_stmt 0 view .LVU853 + 2619 014e 46F00406 orr r6, r6, #4 + 2620 .LVL194: + 2621 .L190: +1994:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ((esrflags & CAN_ESR_LEC) != 0U)) + 2622 .loc 1 1994 7 is_stmt 1 view .LVU854 +1994:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ((esrflags & CAN_ESR_LEC) != 0U)) + 2623 .loc 1 1994 10 is_stmt 0 view .LVU855 + 2624 0152 14F4006F tst r4, #2048 + 2625 0156 59D0 beq .L187 +1994:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ((esrflags & CAN_ESR_LEC) != 0U)) + 2626 .loc 1 1994 57 discriminator 1 view .LVU856 + 2627 0158 19F07009 ands r9, r9, #112 + 2628 .LVL195: +1994:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ((esrflags & CAN_ESR_LEC) != 0U)) + 2629 .loc 1 1994 57 discriminator 1 view .LVU857 + 2630 015c 56D0 beq .L187 +1997:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2631 .loc 1 1997 9 is_stmt 1 view .LVU858 + 2632 015e B9F1400F cmp r9, #64 + 2633 0162 65D0 beq .L191 + 2634 0164 58D8 bhi .L192 + 2635 0166 B9F1200F cmp r9, #32 + 2636 016a 5ED0 beq .L193 + 2637 016c B9F1300F cmp r9, #48 + 2638 0170 42D1 bne .L213 +2009:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 2639 .loc 1 2009 13 view .LVU859 +2009:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 2640 .loc 1 2009 23 is_stmt 0 view .LVU860 + 2641 0172 46F02006 orr r6, r6, #32 + 2642 .LVL196: + ARM GAS /tmp/ccqPwHQi.s page 112 + + +2010:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case (CAN_ESR_LEC_2): + 2643 .loc 1 2010 13 is_stmt 1 view .LVU861 + 2644 0176 44E0 b .L196 + 2645 .LVL197: + 2646 .L205: +1749:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + 2647 .loc 1 1749 9 view .LVU862 + 2648 0178 2846 mov r0, r5 + 2649 017a FFF7FEFF bl HAL_CAN_TxMailbox1CompleteCallback + 2650 .LVL198: + 2651 017e 7BE7 b .L171 + 2652 .L173: +1759:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2653 .loc 1 1759 14 view .LVU863 +1759:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2654 .loc 1 1759 17 is_stmt 0 view .LVU864 + 2655 0180 17F4006F tst r7, #2048 + 2656 0184 02D0 beq .L174 +1762:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2657 .loc 1 1762 11 is_stmt 1 view .LVU865 +1762:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2658 .loc 1 1762 21 is_stmt 0 view .LVU866 + 2659 0186 46F48046 orr r6, r6, #16384 + 2660 .LVL199: +1762:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2661 .loc 1 1762 21 view .LVU867 + 2662 018a 75E7 b .L171 + 2663 .L174: +1772:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + 2664 .loc 1 1772 11 is_stmt 1 view .LVU868 + 2665 018c 2846 mov r0, r5 + 2666 018e FFF7FEFF bl HAL_CAN_TxMailbox1AbortCallback + 2667 .LVL200: + 2668 0192 71E7 b .L171 + 2669 .L206: +1792:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + 2670 .loc 1 1792 9 view .LVU869 + 2671 0194 2846 mov r0, r5 + 2672 0196 FFF7FEFF bl HAL_CAN_TxMailbox2CompleteCallback + 2673 .LVL201: + 2674 019a 7EE7 b .L168 + 2675 .L176: +1802:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2676 .loc 1 1802 14 view .LVU870 +1802:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2677 .loc 1 1802 17 is_stmt 0 view .LVU871 + 2678 019c 17F4002F tst r7, #524288 + 2679 01a0 02D0 beq .L177 +1805:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2680 .loc 1 1805 11 is_stmt 1 view .LVU872 +1805:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2681 .loc 1 1805 21 is_stmt 0 view .LVU873 + 2682 01a2 46F48036 orr r6, r6, #65536 + 2683 .LVL202: +1805:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2684 .loc 1 1805 21 view .LVU874 + 2685 01a6 78E7 b .L168 + ARM GAS /tmp/ccqPwHQi.s page 113 + + + 2686 .L177: +1815:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + 2687 .loc 1 1815 11 is_stmt 1 view .LVU875 + 2688 01a8 2846 mov r0, r5 + 2689 01aa FFF7FEFF bl HAL_CAN_TxMailbox2AbortCallback + 2690 .LVL203: + 2691 01ae 74E7 b .L168 + 2692 .L207: +1841:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 2693 .loc 1 1841 7 view .LVU876 + 2694 01b0 2B68 ldr r3, [r5] + 2695 01b2 0822 movs r2, #8 + 2696 01b4 DA60 str r2, [r3, #12] +1849:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + 2697 .loc 1 1849 7 view .LVU877 + 2698 01b6 2846 mov r0, r5 + 2699 01b8 FFF7FEFF bl HAL_CAN_RxFifo0FullCallback + 2700 .LVL204: + 2701 01bc 7EE7 b .L179 + 2702 .L208: +1866:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + 2703 .loc 1 1866 7 view .LVU878 + 2704 01be 2846 mov r0, r5 + 2705 01c0 FFF7FEFF bl HAL_CAN_RxFifo0MsgPendingCallback + 2706 .LVL205: + 2707 01c4 82E7 b .L180 + 2708 .L209: +1890:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 2709 .loc 1 1890 7 view .LVU879 + 2710 01c6 2B68 ldr r3, [r5] + 2711 01c8 0822 movs r2, #8 + 2712 01ca 1A61 str r2, [r3, #16] +1898:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + 2713 .loc 1 1898 7 view .LVU880 + 2714 01cc 2846 mov r0, r5 + 2715 01ce FFF7FEFF bl HAL_CAN_RxFifo1FullCallback + 2716 .LVL206: + 2717 01d2 8CE7 b .L182 + 2718 .L210: +1915:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + 2719 .loc 1 1915 7 view .LVU881 + 2720 01d4 2846 mov r0, r5 + 2721 01d6 FFF7FEFF bl HAL_CAN_RxFifo1MsgPendingCallback + 2722 .LVL207: + 2723 01da 90E7 b .L183 + 2724 .L211: +1926:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 2725 .loc 1 1926 7 view .LVU882 + 2726 01dc 2B68 ldr r3, [r5] + 2727 01de 1022 movs r2, #16 + 2728 01e0 5A60 str r2, [r3, #4] +1934:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + 2729 .loc 1 1934 7 view .LVU883 + 2730 01e2 2846 mov r0, r5 + 2731 01e4 FFF7FEFF bl HAL_CAN_SleepCallback + 2732 .LVL208: + 2733 01e8 8FE7 b .L184 + ARM GAS /tmp/ccqPwHQi.s page 114 + + + 2734 .L212: +1945:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 2735 .loc 1 1945 7 view .LVU884 + 2736 01ea 2B68 ldr r3, [r5] + 2737 01ec 0822 movs r2, #8 + 2738 01ee 5A60 str r2, [r3, #4] +1953:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + 2739 .loc 1 1953 7 view .LVU885 + 2740 01f0 2846 mov r0, r5 + 2741 01f2 FFF7FEFF bl HAL_CAN_WakeUpFromRxMsgCallback + 2742 .LVL209: + 2743 01f6 8EE7 b .L185 + 2744 .LVL210: + 2745 .L213: +1997:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2746 .loc 1 1997 9 is_stmt 0 view .LVU886 + 2747 01f8 B9F1100F cmp r9, #16 + 2748 01fc 01D1 bne .L196 +2001:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 2749 .loc 1 2001 13 is_stmt 1 view .LVU887 +2001:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 2750 .loc 1 2001 23 is_stmt 0 view .LVU888 + 2751 01fe 46F00806 orr r6, r6, #8 + 2752 .LVL211: +2002:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case (CAN_ESR_LEC_1): + 2753 .loc 1 2002 13 is_stmt 1 view .LVU889 + 2754 .L196: +2028:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2755 .loc 1 2028 9 view .LVU890 + 2756 0202 2A68 ldr r2, [r5] + 2757 0204 9369 ldr r3, [r2, #24] + 2758 0206 23F07003 bic r3, r3, #112 + 2759 020a 9361 str r3, [r2, #24] + 2760 .L187: +2033:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2761 .loc 1 2033 5 view .LVU891 + 2762 020c 2B68 ldr r3, [r5] + 2763 020e 0422 movs r2, #4 + 2764 0210 5A60 str r2, [r3, #4] + 2765 .L186: +2037:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2766 .loc 1 2037 3 view .LVU892 +2037:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2767 .loc 1 2037 6 is_stmt 0 view .LVU893 + 2768 0212 9EB9 cbnz r6, .L214 + 2769 .L167: +2051:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 2770 .loc 1 2051 1 view .LVU894 + 2771 0214 BDE8F88F pop {r3, r4, r5, r6, r7, r8, r9, r10, fp, pc} + 2772 .LVL212: + 2773 .L192: +1997:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2774 .loc 1 1997 9 view .LVU895 + 2775 0218 B9F1500F cmp r9, #80 + 2776 021c 0BD0 beq .L197 + 2777 021e B9F1600F cmp r9, #96 + 2778 0222 EED1 bne .L196 + ARM GAS /tmp/ccqPwHQi.s page 115 + + +2021:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 2779 .loc 1 2021 13 is_stmt 1 view .LVU896 +2021:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 2780 .loc 1 2021 23 is_stmt 0 view .LVU897 + 2781 0224 46F48076 orr r6, r6, #256 + 2782 .LVL213: +2022:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** default: + 2783 .loc 1 2022 13 is_stmt 1 view .LVU898 + 2784 0228 EBE7 b .L196 + 2785 .L193: +2005:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 2786 .loc 1 2005 13 view .LVU899 +2005:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 2787 .loc 1 2005 23 is_stmt 0 view .LVU900 + 2788 022a 46F01006 orr r6, r6, #16 + 2789 .LVL214: +2006:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case (CAN_ESR_LEC_1 | CAN_ESR_LEC_0): + 2790 .loc 1 2006 13 is_stmt 1 view .LVU901 + 2791 022e E8E7 b .L196 + 2792 .L191: +2013:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 2793 .loc 1 2013 13 view .LVU902 +2013:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 2794 .loc 1 2013 23 is_stmt 0 view .LVU903 + 2795 0230 46F04006 orr r6, r6, #64 + 2796 .LVL215: +2014:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case (CAN_ESR_LEC_2 | CAN_ESR_LEC_0): + 2797 .loc 1 2014 13 is_stmt 1 view .LVU904 + 2798 0234 E5E7 b .L196 + 2799 .L197: +2017:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 2800 .loc 1 2017 13 view .LVU905 +2017:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** break; + 2801 .loc 1 2017 23 is_stmt 0 view .LVU906 + 2802 0236 46F08006 orr r6, r6, #128 + 2803 .LVL216: +2018:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** case (CAN_ESR_LEC_2 | CAN_ESR_LEC_1): + 2804 .loc 1 2018 13 is_stmt 1 view .LVU907 + 2805 023a E2E7 b .L196 + 2806 .L214: +2040:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 2807 .loc 1 2040 5 view .LVU908 +2040:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 2808 .loc 1 2040 9 is_stmt 0 view .LVU909 + 2809 023c 6B6A ldr r3, [r5, #36] +2040:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 2810 .loc 1 2040 21 view .LVU910 + 2811 023e 3343 orrs r3, r3, r6 + 2812 0240 6B62 str r3, [r5, #36] +2048:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** #endif /* USE_HAL_CAN_REGISTER_CALLBACKS */ + 2813 .loc 1 2048 5 is_stmt 1 view .LVU911 + 2814 0242 2846 mov r0, r5 + 2815 0244 FFF7FEFF bl HAL_CAN_ErrorCallback + 2816 .LVL217: +2051:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** + 2817 .loc 1 2051 1 is_stmt 0 view .LVU912 + 2818 0248 E4E7 b .L167 + ARM GAS /tmp/ccqPwHQi.s page 116 + + + 2819 .cfi_endproc + 2820 .LFE149: + 2822 .section .text.HAL_CAN_GetState,"ax",%progbits + 2823 .align 1 + 2824 .global HAL_CAN_GetState + 2825 .syntax unified + 2826 .thumb + 2827 .thumb_func + 2829 HAL_CAN_GetState: + 2830 .LVL218: + 2831 .LFB163: +2302:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +2303:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** +2304:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @} +2305:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +2306:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +2307:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** @defgroup CAN_Exported_Functions_Group6 Peripheral State and Error functions +2308:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief CAN Peripheral State functions +2309:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * +2310:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** @verbatim +2311:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ============================================================================== +2312:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ##### Peripheral State and Error functions ##### +2313:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** ============================================================================== +2314:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** [..] +2315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** This subsection provides functions allowing to : +2316:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) HAL_CAN_GetState() : Return the CAN state. +2317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) HAL_CAN_GetError() : Return the CAN error codes if any. +2318:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (+) HAL_CAN_ResetError(): Reset the CAN error codes if any. +2319:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +2320:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** @endverbatim +2321:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @{ +2322:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +2323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +2324:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** +2325:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief Return the CAN state. +2326:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param hcan pointer to a CAN_HandleTypeDef structure that contains +2327:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * the configuration information for the specified CAN. +2328:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @retval HAL state +2329:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +2330:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_StateTypeDef HAL_CAN_GetState(CAN_HandleTypeDef *hcan) +2331:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2832 .loc 1 2331 1 is_stmt 1 view -0 + 2833 .cfi_startproc + 2834 @ args = 0, pretend = 0, frame = 0 + 2835 @ frame_needed = 0, uses_anonymous_args = 0 + 2836 @ link register save eliminated. + 2837 .loc 1 2331 1 is_stmt 0 view .LVU914 + 2838 0000 0246 mov r2, r0 +2332:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_StateTypeDef state = hcan->State; + 2839 .loc 1 2332 3 is_stmt 1 view .LVU915 + 2840 .loc 1 2332 24 is_stmt 0 view .LVU916 + 2841 0002 90F82030 ldrb r3, [r0, #32] @ zero_extendqisi2 + 2842 0006 D8B2 uxtb r0, r3 + 2843 .LVL219: +2333:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +2334:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((state == HAL_CAN_STATE_READY) || + 2844 .loc 1 2334 3 is_stmt 1 view .LVU917 + ARM GAS /tmp/ccqPwHQi.s page 117 + + + 2845 .loc 1 2334 38 is_stmt 0 view .LVU918 + 2846 0008 013B subs r3, r3, #1 + 2847 000a DBB2 uxtb r3, r3 + 2848 .loc 1 2334 6 view .LVU919 + 2849 000c 012B cmp r3, #1 + 2850 000e 00D9 bls .L219 + 2851 .LVL220: + 2852 .L216: +2335:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (state == HAL_CAN_STATE_LISTENING)) +2336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +2337:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Check sleep mode acknowledge flag */ +2338:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((hcan->Instance->MSR & CAN_MSR_SLAK) != 0U) +2339:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +2340:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Sleep mode is active */ +2341:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** state = HAL_CAN_STATE_SLEEP_ACTIVE; +2342:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +2343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Check sleep mode request flag */ +2344:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** else if ((hcan->Instance->MCR & CAN_MCR_SLEEP) != 0U) +2345:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +2346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Sleep mode request is pending */ +2347:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** state = HAL_CAN_STATE_SLEEP_PENDING; +2348:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +2349:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** else +2350:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +2351:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Neither sleep mode request nor sleep mode acknowledge */ +2352:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2853 .loc 1 2352 5 is_stmt 1 view .LVU920 +2353:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +2354:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +2355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Return CAN state */ +2356:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** return state; + 2854 .loc 1 2356 3 view .LVU921 +2357:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2855 .loc 1 2357 1 is_stmt 0 view .LVU922 + 2856 0010 7047 bx lr + 2857 .LVL221: + 2858 .L219: +2338:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2859 .loc 1 2338 5 is_stmt 1 view .LVU923 +2338:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2860 .loc 1 2338 14 is_stmt 0 view .LVU924 + 2861 0012 1368 ldr r3, [r2] +2338:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2862 .loc 1 2338 24 view .LVU925 + 2863 0014 5A68 ldr r2, [r3, #4] + 2864 .LVL222: +2338:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2865 .loc 1 2338 8 view .LVU926 + 2866 0016 12F0020F tst r2, #2 + 2867 001a 05D1 bne .L217 +2344:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2868 .loc 1 2344 10 is_stmt 1 view .LVU927 +2344:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2869 .loc 1 2344 29 is_stmt 0 view .LVU928 + 2870 001c 1B68 ldr r3, [r3] +2344:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2871 .loc 1 2344 13 view .LVU929 + ARM GAS /tmp/ccqPwHQi.s page 118 + + + 2872 001e 13F0020F tst r3, #2 + 2873 0022 F5D0 beq .L216 +2347:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2874 .loc 1 2347 13 view .LVU930 + 2875 0024 0320 movs r0, #3 + 2876 .LVL223: +2347:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2877 .loc 1 2347 13 view .LVU931 + 2878 0026 F3E7 b .L216 + 2879 .LVL224: + 2880 .L217: +2341:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2881 .loc 1 2341 13 view .LVU932 + 2882 0028 0420 movs r0, #4 + 2883 .LVL225: +2341:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2884 .loc 1 2341 13 view .LVU933 + 2885 002a 7047 bx lr + 2886 .cfi_endproc + 2887 .LFE163: + 2889 .section .text.HAL_CAN_GetError,"ax",%progbits + 2890 .align 1 + 2891 .global HAL_CAN_GetError + 2892 .syntax unified + 2893 .thumb + 2894 .thumb_func + 2896 HAL_CAN_GetError: + 2897 .LVL226: + 2898 .LFB164: +2358:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +2359:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** +2360:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief Return the CAN error code. +2361:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param hcan pointer to a CAN_HandleTypeDef structure that contains +2362:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * the configuration information for the specified CAN. +2363:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @retval CAN Error Code +2364:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +2365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** uint32_t HAL_CAN_GetError(CAN_HandleTypeDef *hcan) +2366:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2899 .loc 1 2366 1 is_stmt 1 view -0 + 2900 .cfi_startproc + 2901 @ args = 0, pretend = 0, frame = 0 + 2902 @ frame_needed = 0, uses_anonymous_args = 0 + 2903 @ link register save eliminated. +2367:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Return CAN error code */ +2368:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** return hcan->ErrorCode; + 2904 .loc 1 2368 3 view .LVU935 + 2905 .loc 1 2368 14 is_stmt 0 view .LVU936 + 2906 0000 406A ldr r0, [r0, #36] + 2907 .LVL227: +2369:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2908 .loc 1 2369 1 view .LVU937 + 2909 0002 7047 bx lr + 2910 .cfi_endproc + 2911 .LFE164: + 2913 .section .text.HAL_CAN_ResetError,"ax",%progbits + 2914 .align 1 + 2915 .global HAL_CAN_ResetError + ARM GAS /tmp/ccqPwHQi.s page 119 + + + 2916 .syntax unified + 2917 .thumb + 2918 .thumb_func + 2920 HAL_CAN_ResetError: + 2921 .LVL228: + 2922 .LFB165: +2370:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +2371:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /** +2372:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @brief Reset the CAN error code. +2373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @param hcan pointer to a CAN_HandleTypeDef structure that contains +2374:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * the configuration information for the specified CAN. +2375:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** * @retval HAL status +2376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** */ +2377:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_StatusTypeDef HAL_CAN_ResetError(CAN_HandleTypeDef *hcan) +2378:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { + 2923 .loc 1 2378 1 is_stmt 1 view -0 + 2924 .cfi_startproc + 2925 @ args = 0, pretend = 0, frame = 0 + 2926 @ frame_needed = 0, uses_anonymous_args = 0 + 2927 @ link register save eliminated. +2379:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_StatusTypeDef status = HAL_OK; + 2928 .loc 1 2379 3 view .LVU939 +2380:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_StateTypeDef state = hcan->State; + 2929 .loc 1 2380 3 view .LVU940 + 2930 .loc 1 2380 24 is_stmt 0 view .LVU941 + 2931 0000 90F82030 ldrb r3, [r0, #32] @ zero_extendqisi2 + 2932 .LVL229: +2381:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +2382:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** if ((state == HAL_CAN_STATE_READY) || + 2933 .loc 1 2382 3 is_stmt 1 view .LVU942 + 2934 .loc 1 2382 38 is_stmt 0 view .LVU943 + 2935 0004 013B subs r3, r3, #1 + 2936 .LVL230: + 2937 .loc 1 2382 38 view .LVU944 + 2938 0006 DBB2 uxtb r3, r3 + 2939 .loc 1 2382 6 view .LVU945 + 2940 0008 012B cmp r3, #1 + 2941 000a 05D9 bls .L224 +2383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** (state == HAL_CAN_STATE_LISTENING)) +2384:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +2385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Reset CAN error code */ +2386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->ErrorCode = 0U; +2387:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +2388:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** else +2389:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** { +2390:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Update error code */ +2391:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** hcan->ErrorCode |= HAL_CAN_ERROR_NOT_INITIALIZED; + 2942 .loc 1 2391 5 is_stmt 1 view .LVU946 + 2943 .loc 1 2391 9 is_stmt 0 view .LVU947 + 2944 000c 436A ldr r3, [r0, #36] + 2945 .loc 1 2391 21 view .LVU948 + 2946 000e 43F48023 orr r3, r3, #262144 + 2947 0012 4362 str r3, [r0, #36] +2392:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +2393:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** status = HAL_ERROR; + 2948 .loc 1 2393 5 is_stmt 1 view .LVU949 + 2949 .LVL231: + ARM GAS /tmp/ccqPwHQi.s page 120 + + + 2950 .loc 1 2393 12 is_stmt 0 view .LVU950 + 2951 0014 0120 movs r0, #1 + 2952 .LVL232: +2394:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } +2395:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** +2396:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** /* Return the status */ +2397:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** return status; + 2953 .loc 1 2397 3 is_stmt 1 view .LVU951 +2398:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2954 .loc 1 2398 1 is_stmt 0 view .LVU952 + 2955 0016 7047 bx lr + 2956 .LVL233: + 2957 .L224: +2386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2958 .loc 1 2386 5 is_stmt 1 view .LVU953 +2386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** } + 2959 .loc 1 2386 21 is_stmt 0 view .LVU954 + 2960 0018 0023 movs r3, #0 + 2961 001a 4362 str r3, [r0, #36] +2379:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_StateTypeDef state = hcan->State; + 2962 .loc 1 2379 21 view .LVU955 + 2963 001c 1846 mov r0, r3 + 2964 .LVL234: +2379:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_can.c **** HAL_CAN_StateTypeDef state = hcan->State; + 2965 .loc 1 2379 21 view .LVU956 + 2966 001e 7047 bx lr + 2967 .cfi_endproc + 2968 .LFE165: + 2970 .text + 2971 .Letext0: + 2972 .file 3 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 2973 .file 4 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 2974 .file 5 "Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h" + 2975 .file 6 "Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h" + 2976 .file 7 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h" + 2977 .file 8 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h" + 2978 .file 9 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h" + ARM GAS /tmp/ccqPwHQi.s page 121 + + +DEFINED SYMBOLS + *ABS*:0000000000000000 stm32f3xx_hal_can.c + /tmp/ccqPwHQi.s:21 .text.HAL_CAN_MspInit:0000000000000000 $t + /tmp/ccqPwHQi.s:27 .text.HAL_CAN_MspInit:0000000000000000 HAL_CAN_MspInit + /tmp/ccqPwHQi.s:42 .text.HAL_CAN_Init:0000000000000000 $t + /tmp/ccqPwHQi.s:48 .text.HAL_CAN_Init:0000000000000000 HAL_CAN_Init + /tmp/ccqPwHQi.s:338 .text.HAL_CAN_MspDeInit:0000000000000000 $t + /tmp/ccqPwHQi.s:344 .text.HAL_CAN_MspDeInit:0000000000000000 HAL_CAN_MspDeInit + /tmp/ccqPwHQi.s:359 .text.HAL_CAN_ConfigFilter:0000000000000000 $t + /tmp/ccqPwHQi.s:365 .text.HAL_CAN_ConfigFilter:0000000000000000 HAL_CAN_ConfigFilter + /tmp/ccqPwHQi.s:578 .text.HAL_CAN_Start:0000000000000000 $t + /tmp/ccqPwHQi.s:584 .text.HAL_CAN_Start:0000000000000000 HAL_CAN_Start + /tmp/ccqPwHQi.s:683 .text.HAL_CAN_Stop:0000000000000000 $t + /tmp/ccqPwHQi.s:689 .text.HAL_CAN_Stop:0000000000000000 HAL_CAN_Stop + /tmp/ccqPwHQi.s:789 .text.HAL_CAN_DeInit:0000000000000000 $t + /tmp/ccqPwHQi.s:795 .text.HAL_CAN_DeInit:0000000000000000 HAL_CAN_DeInit + /tmp/ccqPwHQi.s:849 .text.HAL_CAN_RequestSleep:0000000000000000 $t + /tmp/ccqPwHQi.s:855 .text.HAL_CAN_RequestSleep:0000000000000000 HAL_CAN_RequestSleep + /tmp/ccqPwHQi.s:905 .text.HAL_CAN_WakeUp:0000000000000000 $t + /tmp/ccqPwHQi.s:911 .text.HAL_CAN_WakeUp:0000000000000000 HAL_CAN_WakeUp + /tmp/ccqPwHQi.s:1008 .text.HAL_CAN_WakeUp:0000000000000054 $d + /tmp/ccqPwHQi.s:1013 .text.HAL_CAN_IsSleepActive:0000000000000000 $t + /tmp/ccqPwHQi.s:1019 .text.HAL_CAN_IsSleepActive:0000000000000000 HAL_CAN_IsSleepActive + /tmp/ccqPwHQi.s:1069 .text.HAL_CAN_AddTxMessage:0000000000000000 $t + /tmp/ccqPwHQi.s:1075 .text.HAL_CAN_AddTxMessage:0000000000000000 HAL_CAN_AddTxMessage + /tmp/ccqPwHQi.s:1289 .text.HAL_CAN_AbortTxRequest:0000000000000000 $t + /tmp/ccqPwHQi.s:1295 .text.HAL_CAN_AbortTxRequest:0000000000000000 HAL_CAN_AbortTxRequest + /tmp/ccqPwHQi.s:1371 .text.HAL_CAN_GetTxMailboxesFreeLevel:0000000000000000 $t + /tmp/ccqPwHQi.s:1377 .text.HAL_CAN_GetTxMailboxesFreeLevel:0000000000000000 HAL_CAN_GetTxMailboxesFreeLevel + /tmp/ccqPwHQi.s:1448 .text.HAL_CAN_IsTxMessagePending:0000000000000000 $t + /tmp/ccqPwHQi.s:1454 .text.HAL_CAN_IsTxMessagePending:0000000000000000 HAL_CAN_IsTxMessagePending + /tmp/ccqPwHQi.s:1511 .text.HAL_CAN_GetTxTimestamp:0000000000000000 $t + /tmp/ccqPwHQi.s:1517 .text.HAL_CAN_GetTxTimestamp:0000000000000000 HAL_CAN_GetTxTimestamp + /tmp/ccqPwHQi.s:1590 .text.HAL_CAN_GetRxMessage:0000000000000000 $t + /tmp/ccqPwHQi.s:1596 .text.HAL_CAN_GetRxMessage:0000000000000000 HAL_CAN_GetRxMessage + /tmp/ccqPwHQi.s:1884 .text.HAL_CAN_GetRxFifoFillLevel:0000000000000000 $t + /tmp/ccqPwHQi.s:1890 .text.HAL_CAN_GetRxFifoFillLevel:0000000000000000 HAL_CAN_GetRxFifoFillLevel + /tmp/ccqPwHQi.s:1952 .text.HAL_CAN_ActivateNotification:0000000000000000 $t + /tmp/ccqPwHQi.s:1958 .text.HAL_CAN_ActivateNotification:0000000000000000 HAL_CAN_ActivateNotification + /tmp/ccqPwHQi.s:2009 .text.HAL_CAN_DeactivateNotification:0000000000000000 $t + /tmp/ccqPwHQi.s:2015 .text.HAL_CAN_DeactivateNotification:0000000000000000 HAL_CAN_DeactivateNotification + /tmp/ccqPwHQi.s:2066 .text.HAL_CAN_TxMailbox0CompleteCallback:0000000000000000 $t + /tmp/ccqPwHQi.s:2072 .text.HAL_CAN_TxMailbox0CompleteCallback:0000000000000000 HAL_CAN_TxMailbox0CompleteCallback + /tmp/ccqPwHQi.s:2087 .text.HAL_CAN_TxMailbox1CompleteCallback:0000000000000000 $t + /tmp/ccqPwHQi.s:2093 .text.HAL_CAN_TxMailbox1CompleteCallback:0000000000000000 HAL_CAN_TxMailbox1CompleteCallback + /tmp/ccqPwHQi.s:2108 .text.HAL_CAN_TxMailbox2CompleteCallback:0000000000000000 $t + /tmp/ccqPwHQi.s:2114 .text.HAL_CAN_TxMailbox2CompleteCallback:0000000000000000 HAL_CAN_TxMailbox2CompleteCallback + /tmp/ccqPwHQi.s:2129 .text.HAL_CAN_TxMailbox0AbortCallback:0000000000000000 $t + /tmp/ccqPwHQi.s:2135 .text.HAL_CAN_TxMailbox0AbortCallback:0000000000000000 HAL_CAN_TxMailbox0AbortCallback + /tmp/ccqPwHQi.s:2150 .text.HAL_CAN_TxMailbox1AbortCallback:0000000000000000 $t + /tmp/ccqPwHQi.s:2156 .text.HAL_CAN_TxMailbox1AbortCallback:0000000000000000 HAL_CAN_TxMailbox1AbortCallback + /tmp/ccqPwHQi.s:2171 .text.HAL_CAN_TxMailbox2AbortCallback:0000000000000000 $t + /tmp/ccqPwHQi.s:2177 .text.HAL_CAN_TxMailbox2AbortCallback:0000000000000000 HAL_CAN_TxMailbox2AbortCallback + /tmp/ccqPwHQi.s:2192 .text.HAL_CAN_RxFifo0MsgPendingCallback:0000000000000000 $t + /tmp/ccqPwHQi.s:2198 .text.HAL_CAN_RxFifo0MsgPendingCallback:0000000000000000 HAL_CAN_RxFifo0MsgPendingCallback + /tmp/ccqPwHQi.s:2213 .text.HAL_CAN_RxFifo0FullCallback:0000000000000000 $t + /tmp/ccqPwHQi.s:2219 .text.HAL_CAN_RxFifo0FullCallback:0000000000000000 HAL_CAN_RxFifo0FullCallback + ARM GAS /tmp/ccqPwHQi.s page 122 + + + /tmp/ccqPwHQi.s:2234 .text.HAL_CAN_RxFifo1MsgPendingCallback:0000000000000000 $t + /tmp/ccqPwHQi.s:2240 .text.HAL_CAN_RxFifo1MsgPendingCallback:0000000000000000 HAL_CAN_RxFifo1MsgPendingCallback + /tmp/ccqPwHQi.s:2255 .text.HAL_CAN_RxFifo1FullCallback:0000000000000000 $t + /tmp/ccqPwHQi.s:2261 .text.HAL_CAN_RxFifo1FullCallback:0000000000000000 HAL_CAN_RxFifo1FullCallback + /tmp/ccqPwHQi.s:2276 .text.HAL_CAN_SleepCallback:0000000000000000 $t + /tmp/ccqPwHQi.s:2282 .text.HAL_CAN_SleepCallback:0000000000000000 HAL_CAN_SleepCallback + /tmp/ccqPwHQi.s:2297 .text.HAL_CAN_WakeUpFromRxMsgCallback:0000000000000000 $t + /tmp/ccqPwHQi.s:2303 .text.HAL_CAN_WakeUpFromRxMsgCallback:0000000000000000 HAL_CAN_WakeUpFromRxMsgCallback + /tmp/ccqPwHQi.s:2318 .text.HAL_CAN_ErrorCallback:0000000000000000 $t + /tmp/ccqPwHQi.s:2324 .text.HAL_CAN_ErrorCallback:0000000000000000 HAL_CAN_ErrorCallback + /tmp/ccqPwHQi.s:2339 .text.HAL_CAN_IRQHandler:0000000000000000 $t + /tmp/ccqPwHQi.s:2345 .text.HAL_CAN_IRQHandler:0000000000000000 HAL_CAN_IRQHandler + /tmp/ccqPwHQi.s:2823 .text.HAL_CAN_GetState:0000000000000000 $t + /tmp/ccqPwHQi.s:2829 .text.HAL_CAN_GetState:0000000000000000 HAL_CAN_GetState + /tmp/ccqPwHQi.s:2890 .text.HAL_CAN_GetError:0000000000000000 $t + /tmp/ccqPwHQi.s:2896 .text.HAL_CAN_GetError:0000000000000000 HAL_CAN_GetError + /tmp/ccqPwHQi.s:2914 .text.HAL_CAN_ResetError:0000000000000000 $t + /tmp/ccqPwHQi.s:2920 .text.HAL_CAN_ResetError:0000000000000000 HAL_CAN_ResetError + +UNDEFINED SYMBOLS +HAL_GetTick diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_can.o b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_can.o new file mode 100644 index 0000000000000000000000000000000000000000..344ea1f36121b1da75947dd482f7915002cef43c GIT binary patch literal 30700 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 + 35:Drivers/CMSIS/Include/core_cm4.h **** + 36:Drivers/CMSIS/Include/core_cm4.h **** #ifdef __cplusplus + 37:Drivers/CMSIS/Include/core_cm4.h **** extern "C" { + 38:Drivers/CMSIS/Include/core_cm4.h **** #endif + 39:Drivers/CMSIS/Include/core_cm4.h **** + 40:Drivers/CMSIS/Include/core_cm4.h **** /** + 41:Drivers/CMSIS/Include/core_cm4.h **** \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + 42:Drivers/CMSIS/Include/core_cm4.h **** CMSIS violates the following MISRA-C:2004 rules: + 43:Drivers/CMSIS/Include/core_cm4.h **** + 44:Drivers/CMSIS/Include/core_cm4.h **** \li Required Rule 8.5, object/function definition in header file.
    + 45:Drivers/CMSIS/Include/core_cm4.h **** Function definitions in header files are used to allow 'inlining'. + 46:Drivers/CMSIS/Include/core_cm4.h **** + 47:Drivers/CMSIS/Include/core_cm4.h **** \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
    + 48:Drivers/CMSIS/Include/core_cm4.h **** Unions are used for effective representation of core registers. + 49:Drivers/CMSIS/Include/core_cm4.h **** + 50:Drivers/CMSIS/Include/core_cm4.h **** \li Advisory Rule 19.7, Function-like macro defined.
    + 51:Drivers/CMSIS/Include/core_cm4.h **** Function-like macros are used to allow more efficient code. + 52:Drivers/CMSIS/Include/core_cm4.h **** */ + 53:Drivers/CMSIS/Include/core_cm4.h **** + 54:Drivers/CMSIS/Include/core_cm4.h **** + 55:Drivers/CMSIS/Include/core_cm4.h **** /******************************************************************************* + 56:Drivers/CMSIS/Include/core_cm4.h **** * CMSIS definitions + 57:Drivers/CMSIS/Include/core_cm4.h **** ******************************************************************************/ + 58:Drivers/CMSIS/Include/core_cm4.h **** /** + 59:Drivers/CMSIS/Include/core_cm4.h **** \ingroup Cortex_M4 + 60:Drivers/CMSIS/Include/core_cm4.h **** @{ + 61:Drivers/CMSIS/Include/core_cm4.h **** */ + 62:Drivers/CMSIS/Include/core_cm4.h **** + 63:Drivers/CMSIS/Include/core_cm4.h **** #include "cmsis_version.h" + 64:Drivers/CMSIS/Include/core_cm4.h **** + 65:Drivers/CMSIS/Include/core_cm4.h **** /* CMSIS CM4 definitions */ + 66:Drivers/CMSIS/Include/core_cm4.h **** #define __CM4_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] C + 67:Drivers/CMSIS/Include/core_cm4.h **** #define __CM4_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] C + 68:Drivers/CMSIS/Include/core_cm4.h **** #define __CM4_CMSIS_VERSION ((__CM4_CMSIS_VERSION_MAIN << 16U) | \ + 69:Drivers/CMSIS/Include/core_cm4.h **** __CM4_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL + 70:Drivers/CMSIS/Include/core_cm4.h **** + 71:Drivers/CMSIS/Include/core_cm4.h **** #define __CORTEX_M (4U) /*!< Cortex-M Core */ + 72:Drivers/CMSIS/Include/core_cm4.h **** + 73:Drivers/CMSIS/Include/core_cm4.h **** /** __FPU_USED indicates whether an FPU is used or not. + 74:Drivers/CMSIS/Include/core_cm4.h **** For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and fun + 75:Drivers/CMSIS/Include/core_cm4.h **** */ + 76:Drivers/CMSIS/Include/core_cm4.h **** #if defined ( __CC_ARM ) + 77:Drivers/CMSIS/Include/core_cm4.h **** #if defined __TARGET_FPU_VFP + 78:Drivers/CMSIS/Include/core_cm4.h **** #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + 79:Drivers/CMSIS/Include/core_cm4.h **** #define __FPU_USED 1U + 80:Drivers/CMSIS/Include/core_cm4.h **** #else + 81:Drivers/CMSIS/Include/core_cm4.h **** #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT) + 82:Drivers/CMSIS/Include/core_cm4.h **** #define __FPU_USED 0U + 83:Drivers/CMSIS/Include/core_cm4.h **** #endif + 84:Drivers/CMSIS/Include/core_cm4.h **** #else + 85:Drivers/CMSIS/Include/core_cm4.h **** #define __FPU_USED 0U + 86:Drivers/CMSIS/Include/core_cm4.h **** #endif + ARM GAS /tmp/ccPJu8Ry.s page 3 + + + 87:Drivers/CMSIS/Include/core_cm4.h **** + 88:Drivers/CMSIS/Include/core_cm4.h **** #elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + 89:Drivers/CMSIS/Include/core_cm4.h **** #if defined __ARM_PCS_VFP + 90:Drivers/CMSIS/Include/core_cm4.h **** #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + 91:Drivers/CMSIS/Include/core_cm4.h **** #define __FPU_USED 1U + 92:Drivers/CMSIS/Include/core_cm4.h **** #else + 93:Drivers/CMSIS/Include/core_cm4.h **** #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESEN + 94:Drivers/CMSIS/Include/core_cm4.h **** #define __FPU_USED 0U + 95:Drivers/CMSIS/Include/core_cm4.h **** #endif + 96:Drivers/CMSIS/Include/core_cm4.h **** #else + 97:Drivers/CMSIS/Include/core_cm4.h **** #define __FPU_USED 0U + 98:Drivers/CMSIS/Include/core_cm4.h **** #endif + 99:Drivers/CMSIS/Include/core_cm4.h **** + 100:Drivers/CMSIS/Include/core_cm4.h **** #elif defined ( __GNUC__ ) + 101:Drivers/CMSIS/Include/core_cm4.h **** #if defined (__VFP_FP__) && !defined(__SOFTFP__) + 102:Drivers/CMSIS/Include/core_cm4.h **** #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + 103:Drivers/CMSIS/Include/core_cm4.h **** #define __FPU_USED 1U + 104:Drivers/CMSIS/Include/core_cm4.h **** #else + 105:Drivers/CMSIS/Include/core_cm4.h **** #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT) + 106:Drivers/CMSIS/Include/core_cm4.h **** #define __FPU_USED 0U + 107:Drivers/CMSIS/Include/core_cm4.h **** #endif + 108:Drivers/CMSIS/Include/core_cm4.h **** #else + 109:Drivers/CMSIS/Include/core_cm4.h **** #define __FPU_USED 0U + 110:Drivers/CMSIS/Include/core_cm4.h **** #endif + 111:Drivers/CMSIS/Include/core_cm4.h **** + 112:Drivers/CMSIS/Include/core_cm4.h **** #elif defined ( __ICCARM__ ) + 113:Drivers/CMSIS/Include/core_cm4.h **** #if defined __ARMVFP__ + 114:Drivers/CMSIS/Include/core_cm4.h **** #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + 115:Drivers/CMSIS/Include/core_cm4.h **** #define __FPU_USED 1U + 116:Drivers/CMSIS/Include/core_cm4.h **** #else + 117:Drivers/CMSIS/Include/core_cm4.h **** #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT) + 118:Drivers/CMSIS/Include/core_cm4.h **** #define __FPU_USED 0U + 119:Drivers/CMSIS/Include/core_cm4.h **** #endif + 120:Drivers/CMSIS/Include/core_cm4.h **** #else + 121:Drivers/CMSIS/Include/core_cm4.h **** #define __FPU_USED 0U + 122:Drivers/CMSIS/Include/core_cm4.h **** #endif + 123:Drivers/CMSIS/Include/core_cm4.h **** + 124:Drivers/CMSIS/Include/core_cm4.h **** #elif defined ( __TI_ARM__ ) + 125:Drivers/CMSIS/Include/core_cm4.h **** #if defined __TI_VFP_SUPPORT__ + 126:Drivers/CMSIS/Include/core_cm4.h **** #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + 127:Drivers/CMSIS/Include/core_cm4.h **** #define __FPU_USED 1U + 128:Drivers/CMSIS/Include/core_cm4.h **** #else + 129:Drivers/CMSIS/Include/core_cm4.h **** #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT) + 130:Drivers/CMSIS/Include/core_cm4.h **** #define __FPU_USED 0U + 131:Drivers/CMSIS/Include/core_cm4.h **** #endif + 132:Drivers/CMSIS/Include/core_cm4.h **** #else + 133:Drivers/CMSIS/Include/core_cm4.h **** #define __FPU_USED 0U + 134:Drivers/CMSIS/Include/core_cm4.h **** #endif + 135:Drivers/CMSIS/Include/core_cm4.h **** + 136:Drivers/CMSIS/Include/core_cm4.h **** #elif defined ( __TASKING__ ) + 137:Drivers/CMSIS/Include/core_cm4.h **** #if defined __FPU_VFP__ + 138:Drivers/CMSIS/Include/core_cm4.h **** #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + 139:Drivers/CMSIS/Include/core_cm4.h **** #define __FPU_USED 1U + 140:Drivers/CMSIS/Include/core_cm4.h **** #else + 141:Drivers/CMSIS/Include/core_cm4.h **** #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT) + 142:Drivers/CMSIS/Include/core_cm4.h **** #define __FPU_USED 0U + 143:Drivers/CMSIS/Include/core_cm4.h **** #endif + ARM GAS /tmp/ccPJu8Ry.s page 4 + + + 144:Drivers/CMSIS/Include/core_cm4.h **** #else + 145:Drivers/CMSIS/Include/core_cm4.h **** #define __FPU_USED 0U + 146:Drivers/CMSIS/Include/core_cm4.h **** #endif + 147:Drivers/CMSIS/Include/core_cm4.h **** + 148:Drivers/CMSIS/Include/core_cm4.h **** #elif defined ( __CSMC__ ) + 149:Drivers/CMSIS/Include/core_cm4.h **** #if ( __CSMC__ & 0x400U) + 150:Drivers/CMSIS/Include/core_cm4.h **** #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + 151:Drivers/CMSIS/Include/core_cm4.h **** #define __FPU_USED 1U + 152:Drivers/CMSIS/Include/core_cm4.h **** #else + 153:Drivers/CMSIS/Include/core_cm4.h **** #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT) + 154:Drivers/CMSIS/Include/core_cm4.h **** #define __FPU_USED 0U + 155:Drivers/CMSIS/Include/core_cm4.h **** #endif + 156:Drivers/CMSIS/Include/core_cm4.h **** #else + 157:Drivers/CMSIS/Include/core_cm4.h **** #define __FPU_USED 0U + 158:Drivers/CMSIS/Include/core_cm4.h **** #endif + 159:Drivers/CMSIS/Include/core_cm4.h **** + 160:Drivers/CMSIS/Include/core_cm4.h **** #endif + 161:Drivers/CMSIS/Include/core_cm4.h **** + 162:Drivers/CMSIS/Include/core_cm4.h **** #include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + 163:Drivers/CMSIS/Include/core_cm4.h **** + 164:Drivers/CMSIS/Include/core_cm4.h **** + 165:Drivers/CMSIS/Include/core_cm4.h **** #ifdef __cplusplus + 166:Drivers/CMSIS/Include/core_cm4.h **** } + 167:Drivers/CMSIS/Include/core_cm4.h **** #endif + 168:Drivers/CMSIS/Include/core_cm4.h **** + 169:Drivers/CMSIS/Include/core_cm4.h **** #endif /* __CORE_CM4_H_GENERIC */ + 170:Drivers/CMSIS/Include/core_cm4.h **** + 171:Drivers/CMSIS/Include/core_cm4.h **** #ifndef __CMSIS_GENERIC + 172:Drivers/CMSIS/Include/core_cm4.h **** + 173:Drivers/CMSIS/Include/core_cm4.h **** #ifndef __CORE_CM4_H_DEPENDANT + 174:Drivers/CMSIS/Include/core_cm4.h **** #define __CORE_CM4_H_DEPENDANT + 175:Drivers/CMSIS/Include/core_cm4.h **** + 176:Drivers/CMSIS/Include/core_cm4.h **** #ifdef __cplusplus + 177:Drivers/CMSIS/Include/core_cm4.h **** extern "C" { + 178:Drivers/CMSIS/Include/core_cm4.h **** #endif + 179:Drivers/CMSIS/Include/core_cm4.h **** + 180:Drivers/CMSIS/Include/core_cm4.h **** /* check device defines and use defaults */ + 181:Drivers/CMSIS/Include/core_cm4.h **** #if defined __CHECK_DEVICE_DEFINES + 182:Drivers/CMSIS/Include/core_cm4.h **** #ifndef __CM4_REV + 183:Drivers/CMSIS/Include/core_cm4.h **** #define __CM4_REV 0x0000U + 184:Drivers/CMSIS/Include/core_cm4.h **** #warning "__CM4_REV not defined in device header file; using default!" + 185:Drivers/CMSIS/Include/core_cm4.h **** #endif + 186:Drivers/CMSIS/Include/core_cm4.h **** + 187:Drivers/CMSIS/Include/core_cm4.h **** #ifndef __FPU_PRESENT + 188:Drivers/CMSIS/Include/core_cm4.h **** #define __FPU_PRESENT 0U + 189:Drivers/CMSIS/Include/core_cm4.h **** #warning "__FPU_PRESENT not defined in device header file; using default!" + 190:Drivers/CMSIS/Include/core_cm4.h **** #endif + 191:Drivers/CMSIS/Include/core_cm4.h **** + 192:Drivers/CMSIS/Include/core_cm4.h **** #ifndef __MPU_PRESENT + 193:Drivers/CMSIS/Include/core_cm4.h **** #define __MPU_PRESENT 0U + 194:Drivers/CMSIS/Include/core_cm4.h **** #warning "__MPU_PRESENT not defined in device header file; using default!" + 195:Drivers/CMSIS/Include/core_cm4.h **** #endif + 196:Drivers/CMSIS/Include/core_cm4.h **** + 197:Drivers/CMSIS/Include/core_cm4.h **** #ifndef __NVIC_PRIO_BITS + 198:Drivers/CMSIS/Include/core_cm4.h **** #define __NVIC_PRIO_BITS 3U + 199:Drivers/CMSIS/Include/core_cm4.h **** #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + 200:Drivers/CMSIS/Include/core_cm4.h **** #endif + ARM GAS /tmp/ccPJu8Ry.s page 5 + + + 201:Drivers/CMSIS/Include/core_cm4.h **** + 202:Drivers/CMSIS/Include/core_cm4.h **** #ifndef __Vendor_SysTickConfig + 203:Drivers/CMSIS/Include/core_cm4.h **** #define __Vendor_SysTickConfig 0U + 204:Drivers/CMSIS/Include/core_cm4.h **** #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + 205:Drivers/CMSIS/Include/core_cm4.h **** #endif + 206:Drivers/CMSIS/Include/core_cm4.h **** #endif + 207:Drivers/CMSIS/Include/core_cm4.h **** + 208:Drivers/CMSIS/Include/core_cm4.h **** /* IO definitions (access restrictions to peripheral registers) */ + 209:Drivers/CMSIS/Include/core_cm4.h **** /** + 210:Drivers/CMSIS/Include/core_cm4.h **** \defgroup CMSIS_glob_defs CMSIS Global Defines + 211:Drivers/CMSIS/Include/core_cm4.h **** + 212:Drivers/CMSIS/Include/core_cm4.h **** IO Type Qualifiers are used + 213:Drivers/CMSIS/Include/core_cm4.h **** \li to specify the access to peripheral variables. + 214:Drivers/CMSIS/Include/core_cm4.h **** \li for automatic generation of peripheral register debug information. + 215:Drivers/CMSIS/Include/core_cm4.h **** */ + 216:Drivers/CMSIS/Include/core_cm4.h **** #ifdef __cplusplus + 217:Drivers/CMSIS/Include/core_cm4.h **** #define __I volatile /*!< Defines 'read only' permissions */ + 218:Drivers/CMSIS/Include/core_cm4.h **** #else + 219:Drivers/CMSIS/Include/core_cm4.h **** #define __I volatile const /*!< Defines 'read only' permissions */ + 220:Drivers/CMSIS/Include/core_cm4.h **** #endif + 221:Drivers/CMSIS/Include/core_cm4.h **** #define __O volatile /*!< Defines 'write only' permissions */ + 222:Drivers/CMSIS/Include/core_cm4.h **** #define __IO volatile /*!< Defines 'read / write' permissions */ + 223:Drivers/CMSIS/Include/core_cm4.h **** + 224:Drivers/CMSIS/Include/core_cm4.h **** /* following defines should be used for structure members */ + 225:Drivers/CMSIS/Include/core_cm4.h **** #define __IM volatile const /*! Defines 'read only' structure member permissions */ + 226:Drivers/CMSIS/Include/core_cm4.h **** #define __OM volatile /*! Defines 'write only' structure member permissions */ + 227:Drivers/CMSIS/Include/core_cm4.h **** #define __IOM volatile /*! Defines 'read / write' structure member permissions */ + 228:Drivers/CMSIS/Include/core_cm4.h **** + 229:Drivers/CMSIS/Include/core_cm4.h **** /*@} end of group Cortex_M4 */ + 230:Drivers/CMSIS/Include/core_cm4.h **** + 231:Drivers/CMSIS/Include/core_cm4.h **** + 232:Drivers/CMSIS/Include/core_cm4.h **** + 233:Drivers/CMSIS/Include/core_cm4.h **** /******************************************************************************* + 234:Drivers/CMSIS/Include/core_cm4.h **** * Register Abstraction + 235:Drivers/CMSIS/Include/core_cm4.h **** Core Register contain: + 236:Drivers/CMSIS/Include/core_cm4.h **** - Core Register + 237:Drivers/CMSIS/Include/core_cm4.h **** - Core NVIC Register + 238:Drivers/CMSIS/Include/core_cm4.h **** - Core SCB Register + 239:Drivers/CMSIS/Include/core_cm4.h **** - Core SysTick Register + 240:Drivers/CMSIS/Include/core_cm4.h **** - Core Debug Register + 241:Drivers/CMSIS/Include/core_cm4.h **** - Core MPU Register + 242:Drivers/CMSIS/Include/core_cm4.h **** - Core FPU Register + 243:Drivers/CMSIS/Include/core_cm4.h **** ******************************************************************************/ + 244:Drivers/CMSIS/Include/core_cm4.h **** /** + 245:Drivers/CMSIS/Include/core_cm4.h **** \defgroup CMSIS_core_register Defines and Type Definitions + 246:Drivers/CMSIS/Include/core_cm4.h **** \brief Type definitions and defines for Cortex-M processor based devices. + 247:Drivers/CMSIS/Include/core_cm4.h **** */ + 248:Drivers/CMSIS/Include/core_cm4.h **** + 249:Drivers/CMSIS/Include/core_cm4.h **** /** + 250:Drivers/CMSIS/Include/core_cm4.h **** \ingroup CMSIS_core_register + 251:Drivers/CMSIS/Include/core_cm4.h **** \defgroup CMSIS_CORE Status and Control Registers + 252:Drivers/CMSIS/Include/core_cm4.h **** \brief Core Register type definitions. + 253:Drivers/CMSIS/Include/core_cm4.h **** @{ + 254:Drivers/CMSIS/Include/core_cm4.h **** */ + 255:Drivers/CMSIS/Include/core_cm4.h **** + 256:Drivers/CMSIS/Include/core_cm4.h **** /** + 257:Drivers/CMSIS/Include/core_cm4.h **** \brief Union type to access the Application Program Status Register (APSR). + ARM GAS /tmp/ccPJu8Ry.s page 6 + + + 258:Drivers/CMSIS/Include/core_cm4.h **** */ + 259:Drivers/CMSIS/Include/core_cm4.h **** typedef union + 260:Drivers/CMSIS/Include/core_cm4.h **** { + 261:Drivers/CMSIS/Include/core_cm4.h **** struct + 262:Drivers/CMSIS/Include/core_cm4.h **** { + 263:Drivers/CMSIS/Include/core_cm4.h **** uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + 264:Drivers/CMSIS/Include/core_cm4.h **** uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + 265:Drivers/CMSIS/Include/core_cm4.h **** uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ + 266:Drivers/CMSIS/Include/core_cm4.h **** uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + 267:Drivers/CMSIS/Include/core_cm4.h **** uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + 268:Drivers/CMSIS/Include/core_cm4.h **** uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + 269:Drivers/CMSIS/Include/core_cm4.h **** uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + 270:Drivers/CMSIS/Include/core_cm4.h **** uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + 271:Drivers/CMSIS/Include/core_cm4.h **** } b; /*!< Structure used for bit access */ + 272:Drivers/CMSIS/Include/core_cm4.h **** uint32_t w; /*!< Type used for word access */ + 273:Drivers/CMSIS/Include/core_cm4.h **** } APSR_Type; + 274:Drivers/CMSIS/Include/core_cm4.h **** + 275:Drivers/CMSIS/Include/core_cm4.h **** /* APSR Register Definitions */ + 276:Drivers/CMSIS/Include/core_cm4.h **** #define APSR_N_Pos 31U /*!< APSR + 277:Drivers/CMSIS/Include/core_cm4.h **** #define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR + 278:Drivers/CMSIS/Include/core_cm4.h **** + 279:Drivers/CMSIS/Include/core_cm4.h **** #define APSR_Z_Pos 30U /*!< APSR + 280:Drivers/CMSIS/Include/core_cm4.h **** #define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR + 281:Drivers/CMSIS/Include/core_cm4.h **** + 282:Drivers/CMSIS/Include/core_cm4.h **** #define APSR_C_Pos 29U /*!< APSR + 283:Drivers/CMSIS/Include/core_cm4.h **** #define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR + 284:Drivers/CMSIS/Include/core_cm4.h **** + 285:Drivers/CMSIS/Include/core_cm4.h **** #define APSR_V_Pos 28U /*!< APSR + 286:Drivers/CMSIS/Include/core_cm4.h **** #define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR + 287:Drivers/CMSIS/Include/core_cm4.h **** + 288:Drivers/CMSIS/Include/core_cm4.h **** #define APSR_Q_Pos 27U /*!< APSR + 289:Drivers/CMSIS/Include/core_cm4.h **** #define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR + 290:Drivers/CMSIS/Include/core_cm4.h **** + 291:Drivers/CMSIS/Include/core_cm4.h **** #define APSR_GE_Pos 16U /*!< APSR + 292:Drivers/CMSIS/Include/core_cm4.h **** #define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR + 293:Drivers/CMSIS/Include/core_cm4.h **** + 294:Drivers/CMSIS/Include/core_cm4.h **** + 295:Drivers/CMSIS/Include/core_cm4.h **** /** + 296:Drivers/CMSIS/Include/core_cm4.h **** \brief Union type to access the Interrupt Program Status Register (IPSR). + 297:Drivers/CMSIS/Include/core_cm4.h **** */ + 298:Drivers/CMSIS/Include/core_cm4.h **** typedef union + 299:Drivers/CMSIS/Include/core_cm4.h **** { + 300:Drivers/CMSIS/Include/core_cm4.h **** struct + 301:Drivers/CMSIS/Include/core_cm4.h **** { + 302:Drivers/CMSIS/Include/core_cm4.h **** uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + 303:Drivers/CMSIS/Include/core_cm4.h **** uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + 304:Drivers/CMSIS/Include/core_cm4.h **** } b; /*!< Structure used for bit access */ + 305:Drivers/CMSIS/Include/core_cm4.h **** uint32_t w; /*!< Type used for word access */ + 306:Drivers/CMSIS/Include/core_cm4.h **** } IPSR_Type; + 307:Drivers/CMSIS/Include/core_cm4.h **** + 308:Drivers/CMSIS/Include/core_cm4.h **** /* IPSR Register Definitions */ + 309:Drivers/CMSIS/Include/core_cm4.h **** #define IPSR_ISR_Pos 0U /*!< IPSR + 310:Drivers/CMSIS/Include/core_cm4.h **** #define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR + 311:Drivers/CMSIS/Include/core_cm4.h **** + 312:Drivers/CMSIS/Include/core_cm4.h **** + 313:Drivers/CMSIS/Include/core_cm4.h **** /** + 314:Drivers/CMSIS/Include/core_cm4.h **** \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + ARM GAS /tmp/ccPJu8Ry.s page 7 + + + 315:Drivers/CMSIS/Include/core_cm4.h **** */ + 316:Drivers/CMSIS/Include/core_cm4.h **** typedef union + 317:Drivers/CMSIS/Include/core_cm4.h **** { + 318:Drivers/CMSIS/Include/core_cm4.h **** struct + 319:Drivers/CMSIS/Include/core_cm4.h **** { + 320:Drivers/CMSIS/Include/core_cm4.h **** uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + 321:Drivers/CMSIS/Include/core_cm4.h **** uint32_t _reserved0:1; /*!< bit: 9 Reserved */ + 322:Drivers/CMSIS/Include/core_cm4.h **** uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ + 323:Drivers/CMSIS/Include/core_cm4.h **** uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + 324:Drivers/CMSIS/Include/core_cm4.h **** uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ + 325:Drivers/CMSIS/Include/core_cm4.h **** uint32_t T:1; /*!< bit: 24 Thumb bit */ + 326:Drivers/CMSIS/Include/core_cm4.h **** uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ + 327:Drivers/CMSIS/Include/core_cm4.h **** uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + 328:Drivers/CMSIS/Include/core_cm4.h **** uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + 329:Drivers/CMSIS/Include/core_cm4.h **** uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + 330:Drivers/CMSIS/Include/core_cm4.h **** uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + 331:Drivers/CMSIS/Include/core_cm4.h **** uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + 332:Drivers/CMSIS/Include/core_cm4.h **** } b; /*!< Structure used for bit access */ + 333:Drivers/CMSIS/Include/core_cm4.h **** uint32_t w; /*!< Type used for word access */ + 334:Drivers/CMSIS/Include/core_cm4.h **** } xPSR_Type; + 335:Drivers/CMSIS/Include/core_cm4.h **** + 336:Drivers/CMSIS/Include/core_cm4.h **** /* xPSR Register Definitions */ + 337:Drivers/CMSIS/Include/core_cm4.h **** #define xPSR_N_Pos 31U /*!< xPSR + 338:Drivers/CMSIS/Include/core_cm4.h **** #define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR + 339:Drivers/CMSIS/Include/core_cm4.h **** + 340:Drivers/CMSIS/Include/core_cm4.h **** #define xPSR_Z_Pos 30U /*!< xPSR + 341:Drivers/CMSIS/Include/core_cm4.h **** #define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR + 342:Drivers/CMSIS/Include/core_cm4.h **** + 343:Drivers/CMSIS/Include/core_cm4.h **** #define xPSR_C_Pos 29U /*!< xPSR + 344:Drivers/CMSIS/Include/core_cm4.h **** #define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR + 345:Drivers/CMSIS/Include/core_cm4.h **** + 346:Drivers/CMSIS/Include/core_cm4.h **** #define xPSR_V_Pos 28U /*!< xPSR + 347:Drivers/CMSIS/Include/core_cm4.h **** #define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR + 348:Drivers/CMSIS/Include/core_cm4.h **** + 349:Drivers/CMSIS/Include/core_cm4.h **** #define xPSR_Q_Pos 27U /*!< xPSR + 350:Drivers/CMSIS/Include/core_cm4.h **** #define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR + 351:Drivers/CMSIS/Include/core_cm4.h **** + 352:Drivers/CMSIS/Include/core_cm4.h **** #define xPSR_ICI_IT_2_Pos 25U /*!< xPSR + 353:Drivers/CMSIS/Include/core_cm4.h **** #define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR + 354:Drivers/CMSIS/Include/core_cm4.h **** + 355:Drivers/CMSIS/Include/core_cm4.h **** #define xPSR_T_Pos 24U /*!< xPSR + 356:Drivers/CMSIS/Include/core_cm4.h **** #define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR + 357:Drivers/CMSIS/Include/core_cm4.h **** + 358:Drivers/CMSIS/Include/core_cm4.h **** #define xPSR_GE_Pos 16U /*!< xPSR + 359:Drivers/CMSIS/Include/core_cm4.h **** #define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR + 360:Drivers/CMSIS/Include/core_cm4.h **** + 361:Drivers/CMSIS/Include/core_cm4.h **** #define xPSR_ICI_IT_1_Pos 10U /*!< xPSR + 362:Drivers/CMSIS/Include/core_cm4.h **** #define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR + 363:Drivers/CMSIS/Include/core_cm4.h **** + 364:Drivers/CMSIS/Include/core_cm4.h **** #define xPSR_ISR_Pos 0U /*!< xPSR + 365:Drivers/CMSIS/Include/core_cm4.h **** #define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR + 366:Drivers/CMSIS/Include/core_cm4.h **** + 367:Drivers/CMSIS/Include/core_cm4.h **** + 368:Drivers/CMSIS/Include/core_cm4.h **** /** + 369:Drivers/CMSIS/Include/core_cm4.h **** \brief Union type to access the Control Registers (CONTROL). + 370:Drivers/CMSIS/Include/core_cm4.h **** */ + 371:Drivers/CMSIS/Include/core_cm4.h **** typedef union + ARM GAS /tmp/ccPJu8Ry.s page 8 + + + 372:Drivers/CMSIS/Include/core_cm4.h **** { + 373:Drivers/CMSIS/Include/core_cm4.h **** struct + 374:Drivers/CMSIS/Include/core_cm4.h **** { + 375:Drivers/CMSIS/Include/core_cm4.h **** uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + 376:Drivers/CMSIS/Include/core_cm4.h **** uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + 377:Drivers/CMSIS/Include/core_cm4.h **** uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ + 378:Drivers/CMSIS/Include/core_cm4.h **** uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ + 379:Drivers/CMSIS/Include/core_cm4.h **** } b; /*!< Structure used for bit access */ + 380:Drivers/CMSIS/Include/core_cm4.h **** uint32_t w; /*!< Type used for word access */ + 381:Drivers/CMSIS/Include/core_cm4.h **** } CONTROL_Type; + 382:Drivers/CMSIS/Include/core_cm4.h **** + 383:Drivers/CMSIS/Include/core_cm4.h **** /* CONTROL Register Definitions */ + 384:Drivers/CMSIS/Include/core_cm4.h **** #define CONTROL_FPCA_Pos 2U /*!< CONT + 385:Drivers/CMSIS/Include/core_cm4.h **** #define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONT + 386:Drivers/CMSIS/Include/core_cm4.h **** + 387:Drivers/CMSIS/Include/core_cm4.h **** #define CONTROL_SPSEL_Pos 1U /*!< CONT + 388:Drivers/CMSIS/Include/core_cm4.h **** #define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONT + 389:Drivers/CMSIS/Include/core_cm4.h **** + 390:Drivers/CMSIS/Include/core_cm4.h **** #define CONTROL_nPRIV_Pos 0U /*!< CONT + 391:Drivers/CMSIS/Include/core_cm4.h **** #define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONT + 392:Drivers/CMSIS/Include/core_cm4.h **** + 393:Drivers/CMSIS/Include/core_cm4.h **** /*@} end of group CMSIS_CORE */ + 394:Drivers/CMSIS/Include/core_cm4.h **** + 395:Drivers/CMSIS/Include/core_cm4.h **** + 396:Drivers/CMSIS/Include/core_cm4.h **** /** + 397:Drivers/CMSIS/Include/core_cm4.h **** \ingroup CMSIS_core_register + 398:Drivers/CMSIS/Include/core_cm4.h **** \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + 399:Drivers/CMSIS/Include/core_cm4.h **** \brief Type definitions for the NVIC Registers + 400:Drivers/CMSIS/Include/core_cm4.h **** @{ + 401:Drivers/CMSIS/Include/core_cm4.h **** */ + 402:Drivers/CMSIS/Include/core_cm4.h **** + 403:Drivers/CMSIS/Include/core_cm4.h **** /** + 404:Drivers/CMSIS/Include/core_cm4.h **** \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + 405:Drivers/CMSIS/Include/core_cm4.h **** */ + 406:Drivers/CMSIS/Include/core_cm4.h **** typedef struct + 407:Drivers/CMSIS/Include/core_cm4.h **** { + 408:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + 409:Drivers/CMSIS/Include/core_cm4.h **** uint32_t RESERVED0[24U]; + 410:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register + 411:Drivers/CMSIS/Include/core_cm4.h **** uint32_t RSERVED1[24U]; + 412:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register * + 413:Drivers/CMSIS/Include/core_cm4.h **** uint32_t RESERVED2[24U]; + 414:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register + 415:Drivers/CMSIS/Include/core_cm4.h **** uint32_t RESERVED3[24U]; + 416:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + 417:Drivers/CMSIS/Include/core_cm4.h **** uint32_t RESERVED4[56U]; + 418:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bi + 419:Drivers/CMSIS/Include/core_cm4.h **** uint32_t RESERVED5[644U]; + 420:Drivers/CMSIS/Include/core_cm4.h **** __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Regis + 421:Drivers/CMSIS/Include/core_cm4.h **** } NVIC_Type; + 422:Drivers/CMSIS/Include/core_cm4.h **** + 423:Drivers/CMSIS/Include/core_cm4.h **** /* Software Triggered Interrupt Register Definitions */ + 424:Drivers/CMSIS/Include/core_cm4.h **** #define NVIC_STIR_INTID_Pos 0U /*!< STIR: I + 425:Drivers/CMSIS/Include/core_cm4.h **** #define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: I + 426:Drivers/CMSIS/Include/core_cm4.h **** + 427:Drivers/CMSIS/Include/core_cm4.h **** /*@} end of group CMSIS_NVIC */ + 428:Drivers/CMSIS/Include/core_cm4.h **** + ARM GAS /tmp/ccPJu8Ry.s page 9 + + + 429:Drivers/CMSIS/Include/core_cm4.h **** + 430:Drivers/CMSIS/Include/core_cm4.h **** /** + 431:Drivers/CMSIS/Include/core_cm4.h **** \ingroup CMSIS_core_register + 432:Drivers/CMSIS/Include/core_cm4.h **** \defgroup CMSIS_SCB System Control Block (SCB) + 433:Drivers/CMSIS/Include/core_cm4.h **** \brief Type definitions for the System Control Block Registers + 434:Drivers/CMSIS/Include/core_cm4.h **** @{ + 435:Drivers/CMSIS/Include/core_cm4.h **** */ + 436:Drivers/CMSIS/Include/core_cm4.h **** + 437:Drivers/CMSIS/Include/core_cm4.h **** /** + 438:Drivers/CMSIS/Include/core_cm4.h **** \brief Structure type to access the System Control Block (SCB). + 439:Drivers/CMSIS/Include/core_cm4.h **** */ + 440:Drivers/CMSIS/Include/core_cm4.h **** typedef struct + 441:Drivers/CMSIS/Include/core_cm4.h **** { + 442:Drivers/CMSIS/Include/core_cm4.h **** __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + 443:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Regi + 444:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + 445:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset + 446:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + 447:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register * + 448:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registe + 449:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State + 450:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Regist + 451:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + 452:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + 453:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register + 454:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + 455:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register + 456:Drivers/CMSIS/Include/core_cm4.h **** __IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + 457:Drivers/CMSIS/Include/core_cm4.h **** __IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + 458:Drivers/CMSIS/Include/core_cm4.h **** __IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + 459:Drivers/CMSIS/Include/core_cm4.h **** __IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + 460:Drivers/CMSIS/Include/core_cm4.h **** __IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Regis + 461:Drivers/CMSIS/Include/core_cm4.h **** uint32_t RESERVED0[5U]; + 462:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Regis + 463:Drivers/CMSIS/Include/core_cm4.h **** } SCB_Type; + 464:Drivers/CMSIS/Include/core_cm4.h **** + 465:Drivers/CMSIS/Include/core_cm4.h **** /* SCB CPUID Register Definitions */ + 466:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB + 467:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB + 468:Drivers/CMSIS/Include/core_cm4.h **** + 469:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CPUID_VARIANT_Pos 20U /*!< SCB + 470:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB + 471:Drivers/CMSIS/Include/core_cm4.h **** + 472:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB + 473:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB + 474:Drivers/CMSIS/Include/core_cm4.h **** + 475:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CPUID_PARTNO_Pos 4U /*!< SCB + 476:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB + 477:Drivers/CMSIS/Include/core_cm4.h **** + 478:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CPUID_REVISION_Pos 0U /*!< SCB + 479:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB + 480:Drivers/CMSIS/Include/core_cm4.h **** + 481:Drivers/CMSIS/Include/core_cm4.h **** /* SCB Interrupt Control State Register Definitions */ + 482:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB + 483:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB + 484:Drivers/CMSIS/Include/core_cm4.h **** + 485:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB + ARM GAS /tmp/ccPJu8Ry.s page 10 + + + 486:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB + 487:Drivers/CMSIS/Include/core_cm4.h **** + 488:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB + 489:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB + 490:Drivers/CMSIS/Include/core_cm4.h **** + 491:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB + 492:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB + 493:Drivers/CMSIS/Include/core_cm4.h **** + 494:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB + 495:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB + 496:Drivers/CMSIS/Include/core_cm4.h **** + 497:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB + 498:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB + 499:Drivers/CMSIS/Include/core_cm4.h **** + 500:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB + 501:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB + 502:Drivers/CMSIS/Include/core_cm4.h **** + 503:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB + 504:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB + 505:Drivers/CMSIS/Include/core_cm4.h **** + 506:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB + 507:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB + 508:Drivers/CMSIS/Include/core_cm4.h **** + 509:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB + 510:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB + 511:Drivers/CMSIS/Include/core_cm4.h **** + 512:Drivers/CMSIS/Include/core_cm4.h **** /* SCB Vector Table Offset Register Definitions */ + 513:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB + 514:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB + 515:Drivers/CMSIS/Include/core_cm4.h **** + 516:Drivers/CMSIS/Include/core_cm4.h **** /* SCB Application Interrupt and Reset Control Register Definitions */ + 517:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB + 518:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB + 519:Drivers/CMSIS/Include/core_cm4.h **** + 520:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB + 521:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB + 522:Drivers/CMSIS/Include/core_cm4.h **** + 523:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB + 524:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB + 525:Drivers/CMSIS/Include/core_cm4.h **** + 526:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB + 527:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB + 528:Drivers/CMSIS/Include/core_cm4.h **** + 529:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB + 530:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB + 531:Drivers/CMSIS/Include/core_cm4.h **** + 532:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB + 533:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB + 534:Drivers/CMSIS/Include/core_cm4.h **** + 535:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB + 536:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB + 537:Drivers/CMSIS/Include/core_cm4.h **** + 538:Drivers/CMSIS/Include/core_cm4.h **** /* SCB System Control Register Definitions */ + 539:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB + 540:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB + 541:Drivers/CMSIS/Include/core_cm4.h **** + 542:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB + ARM GAS /tmp/ccPJu8Ry.s page 11 + + + 543:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB + 544:Drivers/CMSIS/Include/core_cm4.h **** + 545:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB + 546:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB + 547:Drivers/CMSIS/Include/core_cm4.h **** + 548:Drivers/CMSIS/Include/core_cm4.h **** /* SCB Configuration Control Register Definitions */ + 549:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CCR_STKALIGN_Pos 9U /*!< SCB + 550:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB + 551:Drivers/CMSIS/Include/core_cm4.h **** + 552:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB + 553:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB + 554:Drivers/CMSIS/Include/core_cm4.h **** + 555:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB + 556:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB + 557:Drivers/CMSIS/Include/core_cm4.h **** + 558:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB + 559:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB + 560:Drivers/CMSIS/Include/core_cm4.h **** + 561:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB + 562:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB + 563:Drivers/CMSIS/Include/core_cm4.h **** + 564:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB + 565:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB + 566:Drivers/CMSIS/Include/core_cm4.h **** + 567:Drivers/CMSIS/Include/core_cm4.h **** /* SCB System Handler Control and State Register Definitions */ + 568:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB + 569:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB + 570:Drivers/CMSIS/Include/core_cm4.h **** + 571:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB + 572:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB + 573:Drivers/CMSIS/Include/core_cm4.h **** + 574:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB + 575:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB + 576:Drivers/CMSIS/Include/core_cm4.h **** + 577:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB + 578:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB + 579:Drivers/CMSIS/Include/core_cm4.h **** + 580:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB + 581:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB + 582:Drivers/CMSIS/Include/core_cm4.h **** + 583:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB + 584:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB + 585:Drivers/CMSIS/Include/core_cm4.h **** + 586:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB + 587:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB + 588:Drivers/CMSIS/Include/core_cm4.h **** + 589:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB + 590:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB + 591:Drivers/CMSIS/Include/core_cm4.h **** + 592:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB + 593:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB + 594:Drivers/CMSIS/Include/core_cm4.h **** + 595:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB + 596:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB + 597:Drivers/CMSIS/Include/core_cm4.h **** + 598:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB + 599:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB + ARM GAS /tmp/ccPJu8Ry.s page 12 + + + 600:Drivers/CMSIS/Include/core_cm4.h **** + 601:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB + 602:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB + 603:Drivers/CMSIS/Include/core_cm4.h **** + 604:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB + 605:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB + 606:Drivers/CMSIS/Include/core_cm4.h **** + 607:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB + 608:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB + 609:Drivers/CMSIS/Include/core_cm4.h **** + 610:Drivers/CMSIS/Include/core_cm4.h **** /* SCB Configurable Fault Status Register Definitions */ + 611:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB + 612:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB + 613:Drivers/CMSIS/Include/core_cm4.h **** + 614:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB + 615:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB + 616:Drivers/CMSIS/Include/core_cm4.h **** + 617:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB + 618:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB + 619:Drivers/CMSIS/Include/core_cm4.h **** + 620:Drivers/CMSIS/Include/core_cm4.h **** /* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ + 621:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB + 622:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB + 623:Drivers/CMSIS/Include/core_cm4.h **** + 624:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CFSR_MLSPERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 5U) /*!< SCB + 625:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB + 626:Drivers/CMSIS/Include/core_cm4.h **** + 627:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB + 628:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB + 629:Drivers/CMSIS/Include/core_cm4.h **** + 630:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB + 631:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB + 632:Drivers/CMSIS/Include/core_cm4.h **** + 633:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB + 634:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB + 635:Drivers/CMSIS/Include/core_cm4.h **** + 636:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB + 637:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB + 638:Drivers/CMSIS/Include/core_cm4.h **** + 639:Drivers/CMSIS/Include/core_cm4.h **** /* BusFault Status Register (part of SCB Configurable Fault Status Register) */ + 640:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB + 641:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB + 642:Drivers/CMSIS/Include/core_cm4.h **** + 643:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB + 644:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB + 645:Drivers/CMSIS/Include/core_cm4.h **** + 646:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB + 647:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB + 648:Drivers/CMSIS/Include/core_cm4.h **** + 649:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB + 650:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB + 651:Drivers/CMSIS/Include/core_cm4.h **** + 652:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB + 653:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB + 654:Drivers/CMSIS/Include/core_cm4.h **** + 655:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB + 656:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB + ARM GAS /tmp/ccPJu8Ry.s page 13 + + + 657:Drivers/CMSIS/Include/core_cm4.h **** + 658:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB + 659:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB + 660:Drivers/CMSIS/Include/core_cm4.h **** + 661:Drivers/CMSIS/Include/core_cm4.h **** /* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ + 662:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB + 663:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB + 664:Drivers/CMSIS/Include/core_cm4.h **** + 665:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB + 666:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB + 667:Drivers/CMSIS/Include/core_cm4.h **** + 668:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB + 669:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB + 670:Drivers/CMSIS/Include/core_cm4.h **** + 671:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB + 672:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB + 673:Drivers/CMSIS/Include/core_cm4.h **** + 674:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB + 675:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB + 676:Drivers/CMSIS/Include/core_cm4.h **** + 677:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB + 678:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB + 679:Drivers/CMSIS/Include/core_cm4.h **** + 680:Drivers/CMSIS/Include/core_cm4.h **** /* SCB Hard Fault Status Register Definitions */ + 681:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB + 682:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB + 683:Drivers/CMSIS/Include/core_cm4.h **** + 684:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_HFSR_FORCED_Pos 30U /*!< SCB + 685:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB + 686:Drivers/CMSIS/Include/core_cm4.h **** + 687:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB + 688:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB + 689:Drivers/CMSIS/Include/core_cm4.h **** + 690:Drivers/CMSIS/Include/core_cm4.h **** /* SCB Debug Fault Status Register Definitions */ + 691:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB + 692:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB + 693:Drivers/CMSIS/Include/core_cm4.h **** + 694:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_DFSR_VCATCH_Pos 3U /*!< SCB + 695:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB + 696:Drivers/CMSIS/Include/core_cm4.h **** + 697:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB + 698:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB + 699:Drivers/CMSIS/Include/core_cm4.h **** + 700:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_DFSR_BKPT_Pos 1U /*!< SCB + 701:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB + 702:Drivers/CMSIS/Include/core_cm4.h **** + 703:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_DFSR_HALTED_Pos 0U /*!< SCB + 704:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB + 705:Drivers/CMSIS/Include/core_cm4.h **** + 706:Drivers/CMSIS/Include/core_cm4.h **** /*@} end of group CMSIS_SCB */ + 707:Drivers/CMSIS/Include/core_cm4.h **** + 708:Drivers/CMSIS/Include/core_cm4.h **** + 709:Drivers/CMSIS/Include/core_cm4.h **** /** + 710:Drivers/CMSIS/Include/core_cm4.h **** \ingroup CMSIS_core_register + 711:Drivers/CMSIS/Include/core_cm4.h **** \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + 712:Drivers/CMSIS/Include/core_cm4.h **** \brief Type definitions for the System Control and ID Register not in the SCB + 713:Drivers/CMSIS/Include/core_cm4.h **** @{ + ARM GAS /tmp/ccPJu8Ry.s page 14 + + + 714:Drivers/CMSIS/Include/core_cm4.h **** */ + 715:Drivers/CMSIS/Include/core_cm4.h **** + 716:Drivers/CMSIS/Include/core_cm4.h **** /** + 717:Drivers/CMSIS/Include/core_cm4.h **** \brief Structure type to access the System Control and ID Register not in the SCB. + 718:Drivers/CMSIS/Include/core_cm4.h **** */ + 719:Drivers/CMSIS/Include/core_cm4.h **** typedef struct + 720:Drivers/CMSIS/Include/core_cm4.h **** { + 721:Drivers/CMSIS/Include/core_cm4.h **** uint32_t RESERVED0[1U]; + 722:Drivers/CMSIS/Include/core_cm4.h **** __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Regist + 723:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ + 724:Drivers/CMSIS/Include/core_cm4.h **** } SCnSCB_Type; + 725:Drivers/CMSIS/Include/core_cm4.h **** + 726:Drivers/CMSIS/Include/core_cm4.h **** /* Interrupt Controller Type Register Definitions */ + 727:Drivers/CMSIS/Include/core_cm4.h **** #define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: I + 728:Drivers/CMSIS/Include/core_cm4.h **** #define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: I + 729:Drivers/CMSIS/Include/core_cm4.h **** + 730:Drivers/CMSIS/Include/core_cm4.h **** /* Auxiliary Control Register Definitions */ + 731:Drivers/CMSIS/Include/core_cm4.h **** #define SCnSCB_ACTLR_DISOOFP_Pos 9U /*!< ACTLR: + 732:Drivers/CMSIS/Include/core_cm4.h **** #define SCnSCB_ACTLR_DISOOFP_Msk (1UL << SCnSCB_ACTLR_DISOOFP_Pos) /*!< ACTLR: + 733:Drivers/CMSIS/Include/core_cm4.h **** + 734:Drivers/CMSIS/Include/core_cm4.h **** #define SCnSCB_ACTLR_DISFPCA_Pos 8U /*!< ACTLR: + 735:Drivers/CMSIS/Include/core_cm4.h **** #define SCnSCB_ACTLR_DISFPCA_Msk (1UL << SCnSCB_ACTLR_DISFPCA_Pos) /*!< ACTLR: + 736:Drivers/CMSIS/Include/core_cm4.h **** + 737:Drivers/CMSIS/Include/core_cm4.h **** #define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: + 738:Drivers/CMSIS/Include/core_cm4.h **** #define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: + 739:Drivers/CMSIS/Include/core_cm4.h **** + 740:Drivers/CMSIS/Include/core_cm4.h **** #define SCnSCB_ACTLR_DISDEFWBUF_Pos 1U /*!< ACTLR: + 741:Drivers/CMSIS/Include/core_cm4.h **** #define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: + 742:Drivers/CMSIS/Include/core_cm4.h **** + 743:Drivers/CMSIS/Include/core_cm4.h **** #define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: + 744:Drivers/CMSIS/Include/core_cm4.h **** #define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: + 745:Drivers/CMSIS/Include/core_cm4.h **** + 746:Drivers/CMSIS/Include/core_cm4.h **** /*@} end of group CMSIS_SCnotSCB */ + 747:Drivers/CMSIS/Include/core_cm4.h **** + 748:Drivers/CMSIS/Include/core_cm4.h **** + 749:Drivers/CMSIS/Include/core_cm4.h **** /** + 750:Drivers/CMSIS/Include/core_cm4.h **** \ingroup CMSIS_core_register + 751:Drivers/CMSIS/Include/core_cm4.h **** \defgroup CMSIS_SysTick System Tick Timer (SysTick) + 752:Drivers/CMSIS/Include/core_cm4.h **** \brief Type definitions for the System Timer Registers. + 753:Drivers/CMSIS/Include/core_cm4.h **** @{ + 754:Drivers/CMSIS/Include/core_cm4.h **** */ + 755:Drivers/CMSIS/Include/core_cm4.h **** + 756:Drivers/CMSIS/Include/core_cm4.h **** /** + 757:Drivers/CMSIS/Include/core_cm4.h **** \brief Structure type to access the System Timer (SysTick). + 758:Drivers/CMSIS/Include/core_cm4.h **** */ + 759:Drivers/CMSIS/Include/core_cm4.h **** typedef struct + 760:Drivers/CMSIS/Include/core_cm4.h **** { + 761:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Regis + 762:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + 763:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register * + 764:Drivers/CMSIS/Include/core_cm4.h **** __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ + 765:Drivers/CMSIS/Include/core_cm4.h **** } SysTick_Type; + 766:Drivers/CMSIS/Include/core_cm4.h **** + 767:Drivers/CMSIS/Include/core_cm4.h **** /* SysTick Control / Status Register Definitions */ + 768:Drivers/CMSIS/Include/core_cm4.h **** #define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysT + 769:Drivers/CMSIS/Include/core_cm4.h **** #define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysT + 770:Drivers/CMSIS/Include/core_cm4.h **** + ARM GAS /tmp/ccPJu8Ry.s page 15 + + + 771:Drivers/CMSIS/Include/core_cm4.h **** #define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysT + 772:Drivers/CMSIS/Include/core_cm4.h **** #define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysT + 773:Drivers/CMSIS/Include/core_cm4.h **** + 774:Drivers/CMSIS/Include/core_cm4.h **** #define SysTick_CTRL_TICKINT_Pos 1U /*!< SysT + 775:Drivers/CMSIS/Include/core_cm4.h **** #define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysT + 776:Drivers/CMSIS/Include/core_cm4.h **** + 777:Drivers/CMSIS/Include/core_cm4.h **** #define SysTick_CTRL_ENABLE_Pos 0U /*!< SysT + 778:Drivers/CMSIS/Include/core_cm4.h **** #define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysT + 779:Drivers/CMSIS/Include/core_cm4.h **** + 780:Drivers/CMSIS/Include/core_cm4.h **** /* SysTick Reload Register Definitions */ + 781:Drivers/CMSIS/Include/core_cm4.h **** #define SysTick_LOAD_RELOAD_Pos 0U /*!< SysT + 782:Drivers/CMSIS/Include/core_cm4.h **** #define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysT + 783:Drivers/CMSIS/Include/core_cm4.h **** + 784:Drivers/CMSIS/Include/core_cm4.h **** /* SysTick Current Register Definitions */ + 785:Drivers/CMSIS/Include/core_cm4.h **** #define SysTick_VAL_CURRENT_Pos 0U /*!< SysT + 786:Drivers/CMSIS/Include/core_cm4.h **** #define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysT + 787:Drivers/CMSIS/Include/core_cm4.h **** + 788:Drivers/CMSIS/Include/core_cm4.h **** /* SysTick Calibration Register Definitions */ + 789:Drivers/CMSIS/Include/core_cm4.h **** #define SysTick_CALIB_NOREF_Pos 31U /*!< SysT + 790:Drivers/CMSIS/Include/core_cm4.h **** #define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysT + 791:Drivers/CMSIS/Include/core_cm4.h **** + 792:Drivers/CMSIS/Include/core_cm4.h **** #define SysTick_CALIB_SKEW_Pos 30U /*!< SysT + 793:Drivers/CMSIS/Include/core_cm4.h **** #define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysT + 794:Drivers/CMSIS/Include/core_cm4.h **** + 795:Drivers/CMSIS/Include/core_cm4.h **** #define SysTick_CALIB_TENMS_Pos 0U /*!< SysT + 796:Drivers/CMSIS/Include/core_cm4.h **** #define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysT + 797:Drivers/CMSIS/Include/core_cm4.h **** + 798:Drivers/CMSIS/Include/core_cm4.h **** /*@} end of group CMSIS_SysTick */ + 799:Drivers/CMSIS/Include/core_cm4.h **** + 800:Drivers/CMSIS/Include/core_cm4.h **** + 801:Drivers/CMSIS/Include/core_cm4.h **** /** + 802:Drivers/CMSIS/Include/core_cm4.h **** \ingroup CMSIS_core_register + 803:Drivers/CMSIS/Include/core_cm4.h **** \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + 804:Drivers/CMSIS/Include/core_cm4.h **** \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + 805:Drivers/CMSIS/Include/core_cm4.h **** @{ + 806:Drivers/CMSIS/Include/core_cm4.h **** */ + 807:Drivers/CMSIS/Include/core_cm4.h **** + 808:Drivers/CMSIS/Include/core_cm4.h **** /** + 809:Drivers/CMSIS/Include/core_cm4.h **** \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + 810:Drivers/CMSIS/Include/core_cm4.h **** */ + 811:Drivers/CMSIS/Include/core_cm4.h **** typedef struct + 812:Drivers/CMSIS/Include/core_cm4.h **** { + 813:Drivers/CMSIS/Include/core_cm4.h **** __OM union + 814:Drivers/CMSIS/Include/core_cm4.h **** { + 815:Drivers/CMSIS/Include/core_cm4.h **** __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + 816:Drivers/CMSIS/Include/core_cm4.h **** __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + 817:Drivers/CMSIS/Include/core_cm4.h **** __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + 818:Drivers/CMSIS/Include/core_cm4.h **** } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + 819:Drivers/CMSIS/Include/core_cm4.h **** uint32_t RESERVED0[864U]; + 820:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + 821:Drivers/CMSIS/Include/core_cm4.h **** uint32_t RESERVED1[15U]; + 822:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + 823:Drivers/CMSIS/Include/core_cm4.h **** uint32_t RESERVED2[15U]; + 824:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + 825:Drivers/CMSIS/Include/core_cm4.h **** uint32_t RESERVED3[29U]; + 826:Drivers/CMSIS/Include/core_cm4.h **** __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register * + 827:Drivers/CMSIS/Include/core_cm4.h **** __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + ARM GAS /tmp/ccPJu8Ry.s page 16 + + + 828:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Reg + 829:Drivers/CMSIS/Include/core_cm4.h **** uint32_t RESERVED4[43U]; + 830:Drivers/CMSIS/Include/core_cm4.h **** __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + 831:Drivers/CMSIS/Include/core_cm4.h **** __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + 832:Drivers/CMSIS/Include/core_cm4.h **** uint32_t RESERVED5[6U]; + 833:Drivers/CMSIS/Include/core_cm4.h **** __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Re + 834:Drivers/CMSIS/Include/core_cm4.h **** __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Re + 835:Drivers/CMSIS/Include/core_cm4.h **** __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Re + 836:Drivers/CMSIS/Include/core_cm4.h **** __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Re + 837:Drivers/CMSIS/Include/core_cm4.h **** __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Re + 838:Drivers/CMSIS/Include/core_cm4.h **** __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Re + 839:Drivers/CMSIS/Include/core_cm4.h **** __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Re + 840:Drivers/CMSIS/Include/core_cm4.h **** __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Re + 841:Drivers/CMSIS/Include/core_cm4.h **** __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Re + 842:Drivers/CMSIS/Include/core_cm4.h **** __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Re + 843:Drivers/CMSIS/Include/core_cm4.h **** __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Re + 844:Drivers/CMSIS/Include/core_cm4.h **** __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Re + 845:Drivers/CMSIS/Include/core_cm4.h **** } ITM_Type; + 846:Drivers/CMSIS/Include/core_cm4.h **** + 847:Drivers/CMSIS/Include/core_cm4.h **** /* ITM Trace Privilege Register Definitions */ + 848:Drivers/CMSIS/Include/core_cm4.h **** #define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM + 849:Drivers/CMSIS/Include/core_cm4.h **** #define ITM_TPR_PRIVMASK_Msk (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM + 850:Drivers/CMSIS/Include/core_cm4.h **** + 851:Drivers/CMSIS/Include/core_cm4.h **** /* ITM Trace Control Register Definitions */ + 852:Drivers/CMSIS/Include/core_cm4.h **** #define ITM_TCR_BUSY_Pos 23U /*!< ITM + 853:Drivers/CMSIS/Include/core_cm4.h **** #define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM + 854:Drivers/CMSIS/Include/core_cm4.h **** + 855:Drivers/CMSIS/Include/core_cm4.h **** #define ITM_TCR_TraceBusID_Pos 16U /*!< ITM + 856:Drivers/CMSIS/Include/core_cm4.h **** #define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM + 857:Drivers/CMSIS/Include/core_cm4.h **** + 858:Drivers/CMSIS/Include/core_cm4.h **** #define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM + 859:Drivers/CMSIS/Include/core_cm4.h **** #define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM + 860:Drivers/CMSIS/Include/core_cm4.h **** + 861:Drivers/CMSIS/Include/core_cm4.h **** #define ITM_TCR_TSPrescale_Pos 8U /*!< ITM + 862:Drivers/CMSIS/Include/core_cm4.h **** #define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM + 863:Drivers/CMSIS/Include/core_cm4.h **** + 864:Drivers/CMSIS/Include/core_cm4.h **** #define ITM_TCR_SWOENA_Pos 4U /*!< ITM + 865:Drivers/CMSIS/Include/core_cm4.h **** #define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM + 866:Drivers/CMSIS/Include/core_cm4.h **** + 867:Drivers/CMSIS/Include/core_cm4.h **** #define ITM_TCR_DWTENA_Pos 3U /*!< ITM + 868:Drivers/CMSIS/Include/core_cm4.h **** #define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM + 869:Drivers/CMSIS/Include/core_cm4.h **** + 870:Drivers/CMSIS/Include/core_cm4.h **** #define ITM_TCR_SYNCENA_Pos 2U /*!< ITM + 871:Drivers/CMSIS/Include/core_cm4.h **** #define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM + 872:Drivers/CMSIS/Include/core_cm4.h **** + 873:Drivers/CMSIS/Include/core_cm4.h **** #define ITM_TCR_TSENA_Pos 1U /*!< ITM + 874:Drivers/CMSIS/Include/core_cm4.h **** #define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM + 875:Drivers/CMSIS/Include/core_cm4.h **** + 876:Drivers/CMSIS/Include/core_cm4.h **** #define ITM_TCR_ITMENA_Pos 0U /*!< ITM + 877:Drivers/CMSIS/Include/core_cm4.h **** #define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM + 878:Drivers/CMSIS/Include/core_cm4.h **** + 879:Drivers/CMSIS/Include/core_cm4.h **** /* ITM Integration Write Register Definitions */ + 880:Drivers/CMSIS/Include/core_cm4.h **** #define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM + 881:Drivers/CMSIS/Include/core_cm4.h **** #define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM + 882:Drivers/CMSIS/Include/core_cm4.h **** + 883:Drivers/CMSIS/Include/core_cm4.h **** /* ITM Integration Read Register Definitions */ + 884:Drivers/CMSIS/Include/core_cm4.h **** #define ITM_IRR_ATREADYM_Pos 0U /*!< ITM + ARM GAS /tmp/ccPJu8Ry.s page 17 + + + 885:Drivers/CMSIS/Include/core_cm4.h **** #define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM + 886:Drivers/CMSIS/Include/core_cm4.h **** + 887:Drivers/CMSIS/Include/core_cm4.h **** /* ITM Integration Mode Control Register Definitions */ + 888:Drivers/CMSIS/Include/core_cm4.h **** #define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM + 889:Drivers/CMSIS/Include/core_cm4.h **** #define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM + 890:Drivers/CMSIS/Include/core_cm4.h **** + 891:Drivers/CMSIS/Include/core_cm4.h **** /* ITM Lock Status Register Definitions */ + 892:Drivers/CMSIS/Include/core_cm4.h **** #define ITM_LSR_ByteAcc_Pos 2U /*!< ITM + 893:Drivers/CMSIS/Include/core_cm4.h **** #define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM + 894:Drivers/CMSIS/Include/core_cm4.h **** + 895:Drivers/CMSIS/Include/core_cm4.h **** #define ITM_LSR_Access_Pos 1U /*!< ITM + 896:Drivers/CMSIS/Include/core_cm4.h **** #define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM + 897:Drivers/CMSIS/Include/core_cm4.h **** + 898:Drivers/CMSIS/Include/core_cm4.h **** #define ITM_LSR_Present_Pos 0U /*!< ITM + 899:Drivers/CMSIS/Include/core_cm4.h **** #define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM + 900:Drivers/CMSIS/Include/core_cm4.h **** + 901:Drivers/CMSIS/Include/core_cm4.h **** /*@}*/ /* end of group CMSIS_ITM */ + 902:Drivers/CMSIS/Include/core_cm4.h **** + 903:Drivers/CMSIS/Include/core_cm4.h **** + 904:Drivers/CMSIS/Include/core_cm4.h **** /** + 905:Drivers/CMSIS/Include/core_cm4.h **** \ingroup CMSIS_core_register + 906:Drivers/CMSIS/Include/core_cm4.h **** \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + 907:Drivers/CMSIS/Include/core_cm4.h **** \brief Type definitions for the Data Watchpoint and Trace (DWT) + 908:Drivers/CMSIS/Include/core_cm4.h **** @{ + 909:Drivers/CMSIS/Include/core_cm4.h **** */ + 910:Drivers/CMSIS/Include/core_cm4.h **** + 911:Drivers/CMSIS/Include/core_cm4.h **** /** + 912:Drivers/CMSIS/Include/core_cm4.h **** \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + 913:Drivers/CMSIS/Include/core_cm4.h **** */ + 914:Drivers/CMSIS/Include/core_cm4.h **** typedef struct + 915:Drivers/CMSIS/Include/core_cm4.h **** { + 916:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + 917:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + 918:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + 919:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Registe + 920:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + 921:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + 922:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Registe + 923:Drivers/CMSIS/Include/core_cm4.h **** __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register + 924:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + 925:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ + 926:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + 927:Drivers/CMSIS/Include/core_cm4.h **** uint32_t RESERVED0[1U]; + 928:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + 929:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ + 930:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + 931:Drivers/CMSIS/Include/core_cm4.h **** uint32_t RESERVED1[1U]; + 932:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + 933:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ + 934:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + 935:Drivers/CMSIS/Include/core_cm4.h **** uint32_t RESERVED2[1U]; + 936:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + 937:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ + 938:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + 939:Drivers/CMSIS/Include/core_cm4.h **** } DWT_Type; + 940:Drivers/CMSIS/Include/core_cm4.h **** + 941:Drivers/CMSIS/Include/core_cm4.h **** /* DWT Control Register Definitions */ + ARM GAS /tmp/ccPJu8Ry.s page 18 + + + 942:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTR + 943:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTR + 944:Drivers/CMSIS/Include/core_cm4.h **** + 945:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTR + 946:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTR + 947:Drivers/CMSIS/Include/core_cm4.h **** + 948:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTR + 949:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTR + 950:Drivers/CMSIS/Include/core_cm4.h **** + 951:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTR + 952:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTR + 953:Drivers/CMSIS/Include/core_cm4.h **** + 954:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTR + 955:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTR + 956:Drivers/CMSIS/Include/core_cm4.h **** + 957:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTR + 958:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTR + 959:Drivers/CMSIS/Include/core_cm4.h **** + 960:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTR + 961:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTR + 962:Drivers/CMSIS/Include/core_cm4.h **** + 963:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTR + 964:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTR + 965:Drivers/CMSIS/Include/core_cm4.h **** + 966:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTR + 967:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTR + 968:Drivers/CMSIS/Include/core_cm4.h **** + 969:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTR + 970:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTR + 971:Drivers/CMSIS/Include/core_cm4.h **** + 972:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTR + 973:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTR + 974:Drivers/CMSIS/Include/core_cm4.h **** + 975:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTR + 976:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTR + 977:Drivers/CMSIS/Include/core_cm4.h **** + 978:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTR + 979:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTR + 980:Drivers/CMSIS/Include/core_cm4.h **** + 981:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTR + 982:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTR + 983:Drivers/CMSIS/Include/core_cm4.h **** + 984:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTR + 985:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTR + 986:Drivers/CMSIS/Include/core_cm4.h **** + 987:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTR + 988:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTR + 989:Drivers/CMSIS/Include/core_cm4.h **** + 990:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTR + 991:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTR + 992:Drivers/CMSIS/Include/core_cm4.h **** + 993:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTR + 994:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTR + 995:Drivers/CMSIS/Include/core_cm4.h **** + 996:Drivers/CMSIS/Include/core_cm4.h **** /* DWT CPI Count Register Definitions */ + 997:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPI + 998:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPI + ARM GAS /tmp/ccPJu8Ry.s page 19 + + + 999:Drivers/CMSIS/Include/core_cm4.h **** +1000:Drivers/CMSIS/Include/core_cm4.h **** /* DWT Exception Overhead Count Register Definitions */ +1001:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXC +1002:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXC +1003:Drivers/CMSIS/Include/core_cm4.h **** +1004:Drivers/CMSIS/Include/core_cm4.h **** /* DWT Sleep Count Register Definitions */ +1005:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLE +1006:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLE +1007:Drivers/CMSIS/Include/core_cm4.h **** +1008:Drivers/CMSIS/Include/core_cm4.h **** /* DWT LSU Count Register Definitions */ +1009:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSU +1010:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSU +1011:Drivers/CMSIS/Include/core_cm4.h **** +1012:Drivers/CMSIS/Include/core_cm4.h **** /* DWT Folded-instruction Count Register Definitions */ +1013:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOL +1014:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOL +1015:Drivers/CMSIS/Include/core_cm4.h **** +1016:Drivers/CMSIS/Include/core_cm4.h **** /* DWT Comparator Mask Register Definitions */ +1017:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_MASK_MASK_Pos 0U /*!< DWT MAS +1018:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MAS +1019:Drivers/CMSIS/Include/core_cm4.h **** +1020:Drivers/CMSIS/Include/core_cm4.h **** /* DWT Comparator Function Register Definitions */ +1021:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUN +1022:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUN +1023:Drivers/CMSIS/Include/core_cm4.h **** +1024:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUN +1025:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUN +1026:Drivers/CMSIS/Include/core_cm4.h **** +1027:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUN +1028:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUN +1029:Drivers/CMSIS/Include/core_cm4.h **** +1030:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUN +1031:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUN +1032:Drivers/CMSIS/Include/core_cm4.h **** +1033:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUN +1034:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUN +1035:Drivers/CMSIS/Include/core_cm4.h **** +1036:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUN +1037:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUN +1038:Drivers/CMSIS/Include/core_cm4.h **** +1039:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUN +1040:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUN +1041:Drivers/CMSIS/Include/core_cm4.h **** +1042:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUN +1043:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUN +1044:Drivers/CMSIS/Include/core_cm4.h **** +1045:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUN +1046:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUN +1047:Drivers/CMSIS/Include/core_cm4.h **** +1048:Drivers/CMSIS/Include/core_cm4.h **** /*@}*/ /* end of group CMSIS_DWT */ +1049:Drivers/CMSIS/Include/core_cm4.h **** +1050:Drivers/CMSIS/Include/core_cm4.h **** +1051:Drivers/CMSIS/Include/core_cm4.h **** /** +1052:Drivers/CMSIS/Include/core_cm4.h **** \ingroup CMSIS_core_register +1053:Drivers/CMSIS/Include/core_cm4.h **** \defgroup CMSIS_TPI Trace Port Interface (TPI) +1054:Drivers/CMSIS/Include/core_cm4.h **** \brief Type definitions for the Trace Port Interface (TPI) +1055:Drivers/CMSIS/Include/core_cm4.h **** @{ + ARM GAS /tmp/ccPJu8Ry.s page 20 + + +1056:Drivers/CMSIS/Include/core_cm4.h **** */ +1057:Drivers/CMSIS/Include/core_cm4.h **** +1058:Drivers/CMSIS/Include/core_cm4.h **** /** +1059:Drivers/CMSIS/Include/core_cm4.h **** \brief Structure type to access the Trace Port Interface Register (TPI). +1060:Drivers/CMSIS/Include/core_cm4.h **** */ +1061:Drivers/CMSIS/Include/core_cm4.h **** typedef struct +1062:Drivers/CMSIS/Include/core_cm4.h **** { +1063:Drivers/CMSIS/Include/core_cm4.h **** __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Reg +1064:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Regis +1065:Drivers/CMSIS/Include/core_cm4.h **** uint32_t RESERVED0[2U]; +1066:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Reg +1067:Drivers/CMSIS/Include/core_cm4.h **** uint32_t RESERVED1[55U]; +1068:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register * +1069:Drivers/CMSIS/Include/core_cm4.h **** uint32_t RESERVED2[131U]; +1070:Drivers/CMSIS/Include/core_cm4.h **** __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Regis +1071:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Regi +1072:Drivers/CMSIS/Include/core_cm4.h **** __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counte +1073:Drivers/CMSIS/Include/core_cm4.h **** uint32_t RESERVED3[759U]; +1074:Drivers/CMSIS/Include/core_cm4.h **** __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ +1075:Drivers/CMSIS/Include/core_cm4.h **** __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ +1076:Drivers/CMSIS/Include/core_cm4.h **** __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ +1077:Drivers/CMSIS/Include/core_cm4.h **** uint32_t RESERVED4[1U]; +1078:Drivers/CMSIS/Include/core_cm4.h **** __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ +1079:Drivers/CMSIS/Include/core_cm4.h **** __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ +1080:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ +1081:Drivers/CMSIS/Include/core_cm4.h **** uint32_t RESERVED5[39U]; +1082:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ +1083:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ +1084:Drivers/CMSIS/Include/core_cm4.h **** uint32_t RESERVED7[8U]; +1085:Drivers/CMSIS/Include/core_cm4.h **** __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ +1086:Drivers/CMSIS/Include/core_cm4.h **** __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ +1087:Drivers/CMSIS/Include/core_cm4.h **** } TPI_Type; +1088:Drivers/CMSIS/Include/core_cm4.h **** +1089:Drivers/CMSIS/Include/core_cm4.h **** /* TPI Asynchronous Clock Prescaler Register Definitions */ +1090:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACP +1091:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACP +1092:Drivers/CMSIS/Include/core_cm4.h **** +1093:Drivers/CMSIS/Include/core_cm4.h **** /* TPI Selected Pin Protocol Register Definitions */ +1094:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPP +1095:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPP +1096:Drivers/CMSIS/Include/core_cm4.h **** +1097:Drivers/CMSIS/Include/core_cm4.h **** /* TPI Formatter and Flush Status Register Definitions */ +1098:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFS +1099:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFS +1100:Drivers/CMSIS/Include/core_cm4.h **** +1101:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFS +1102:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFS +1103:Drivers/CMSIS/Include/core_cm4.h **** +1104:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFS +1105:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFS +1106:Drivers/CMSIS/Include/core_cm4.h **** +1107:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFS +1108:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFS +1109:Drivers/CMSIS/Include/core_cm4.h **** +1110:Drivers/CMSIS/Include/core_cm4.h **** /* TPI Formatter and Flush Control Register Definitions */ +1111:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFC +1112:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFC + ARM GAS /tmp/ccPJu8Ry.s page 21 + + +1113:Drivers/CMSIS/Include/core_cm4.h **** +1114:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFC +1115:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFC +1116:Drivers/CMSIS/Include/core_cm4.h **** +1117:Drivers/CMSIS/Include/core_cm4.h **** /* TPI TRIGGER Register Definitions */ +1118:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRI +1119:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRI +1120:Drivers/CMSIS/Include/core_cm4.h **** +1121:Drivers/CMSIS/Include/core_cm4.h **** /* TPI Integration ETM Data Register Definitions (FIFO0) */ +1122:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIF +1123:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIF +1124:Drivers/CMSIS/Include/core_cm4.h **** +1125:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIF +1126:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIF +1127:Drivers/CMSIS/Include/core_cm4.h **** +1128:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIF +1129:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIF +1130:Drivers/CMSIS/Include/core_cm4.h **** +1131:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIF +1132:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIF +1133:Drivers/CMSIS/Include/core_cm4.h **** +1134:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIF +1135:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIF +1136:Drivers/CMSIS/Include/core_cm4.h **** +1137:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIF +1138:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIF +1139:Drivers/CMSIS/Include/core_cm4.h **** +1140:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIF +1141:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIF +1142:Drivers/CMSIS/Include/core_cm4.h **** +1143:Drivers/CMSIS/Include/core_cm4.h **** /* TPI ITATBCTR2 Register Definitions */ +1144:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_ITATBCTR2_ATREADY2_Pos 0U /*!< TPI ITA +1145:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_ITATBCTR2_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY2_Pos*/) /*!< TPI ITA +1146:Drivers/CMSIS/Include/core_cm4.h **** +1147:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_ITATBCTR2_ATREADY1_Pos 0U /*!< TPI ITA +1148:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_ITATBCTR2_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY1_Pos*/) /*!< TPI ITA +1149:Drivers/CMSIS/Include/core_cm4.h **** +1150:Drivers/CMSIS/Include/core_cm4.h **** /* TPI Integration ITM Data Register Definitions (FIFO1) */ +1151:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIF +1152:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIF +1153:Drivers/CMSIS/Include/core_cm4.h **** +1154:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIF +1155:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIF +1156:Drivers/CMSIS/Include/core_cm4.h **** +1157:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIF +1158:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIF +1159:Drivers/CMSIS/Include/core_cm4.h **** +1160:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIF +1161:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIF +1162:Drivers/CMSIS/Include/core_cm4.h **** +1163:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIF +1164:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIF +1165:Drivers/CMSIS/Include/core_cm4.h **** +1166:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIF +1167:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIF +1168:Drivers/CMSIS/Include/core_cm4.h **** +1169:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIF + ARM GAS /tmp/ccPJu8Ry.s page 22 + + +1170:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIF +1171:Drivers/CMSIS/Include/core_cm4.h **** +1172:Drivers/CMSIS/Include/core_cm4.h **** /* TPI ITATBCTR0 Register Definitions */ +1173:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_ITATBCTR0_ATREADY2_Pos 0U /*!< TPI ITA +1174:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_ITATBCTR0_ATREADY2_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY2_Pos*/) /*!< TPI ITA +1175:Drivers/CMSIS/Include/core_cm4.h **** +1176:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_ITATBCTR0_ATREADY1_Pos 0U /*!< TPI ITA +1177:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_ITATBCTR0_ATREADY1_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY1_Pos*/) /*!< TPI ITA +1178:Drivers/CMSIS/Include/core_cm4.h **** +1179:Drivers/CMSIS/Include/core_cm4.h **** /* TPI Integration Mode Control Register Definitions */ +1180:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITC +1181:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_ITCTRL_Mode_Msk (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITC +1182:Drivers/CMSIS/Include/core_cm4.h **** +1183:Drivers/CMSIS/Include/core_cm4.h **** /* TPI DEVID Register Definitions */ +1184:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEV +1185:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEV +1186:Drivers/CMSIS/Include/core_cm4.h **** +1187:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEV +1188:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEV +1189:Drivers/CMSIS/Include/core_cm4.h **** +1190:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEV +1191:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEV +1192:Drivers/CMSIS/Include/core_cm4.h **** +1193:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEV +1194:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEV +1195:Drivers/CMSIS/Include/core_cm4.h **** +1196:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEV +1197:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEV +1198:Drivers/CMSIS/Include/core_cm4.h **** +1199:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEV +1200:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEV +1201:Drivers/CMSIS/Include/core_cm4.h **** +1202:Drivers/CMSIS/Include/core_cm4.h **** /* TPI DEVTYPE Register Definitions */ +1203:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_DEVTYPE_SubType_Pos 4U /*!< TPI DEV +1204:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEV +1205:Drivers/CMSIS/Include/core_cm4.h **** +1206:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_DEVTYPE_MajorType_Pos 0U /*!< TPI DEV +1207:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEV +1208:Drivers/CMSIS/Include/core_cm4.h **** +1209:Drivers/CMSIS/Include/core_cm4.h **** /*@}*/ /* end of group CMSIS_TPI */ +1210:Drivers/CMSIS/Include/core_cm4.h **** +1211:Drivers/CMSIS/Include/core_cm4.h **** +1212:Drivers/CMSIS/Include/core_cm4.h **** #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +1213:Drivers/CMSIS/Include/core_cm4.h **** /** +1214:Drivers/CMSIS/Include/core_cm4.h **** \ingroup CMSIS_core_register +1215:Drivers/CMSIS/Include/core_cm4.h **** \defgroup CMSIS_MPU Memory Protection Unit (MPU) +1216:Drivers/CMSIS/Include/core_cm4.h **** \brief Type definitions for the Memory Protection Unit (MPU) +1217:Drivers/CMSIS/Include/core_cm4.h **** @{ +1218:Drivers/CMSIS/Include/core_cm4.h **** */ +1219:Drivers/CMSIS/Include/core_cm4.h **** +1220:Drivers/CMSIS/Include/core_cm4.h **** /** +1221:Drivers/CMSIS/Include/core_cm4.h **** \brief Structure type to access the Memory Protection Unit (MPU). +1222:Drivers/CMSIS/Include/core_cm4.h **** */ +1223:Drivers/CMSIS/Include/core_cm4.h **** typedef struct +1224:Drivers/CMSIS/Include/core_cm4.h **** { +1225:Drivers/CMSIS/Include/core_cm4.h **** __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ +1226:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + ARM GAS /tmp/ccPJu8Ry.s page 23 + + +1227:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ +1228:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register +1229:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Re +1230:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address +1231:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and +1232:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address +1233:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and +1234:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address +1235:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and +1236:Drivers/CMSIS/Include/core_cm4.h **** } MPU_Type; +1237:Drivers/CMSIS/Include/core_cm4.h **** +1238:Drivers/CMSIS/Include/core_cm4.h **** #define MPU_TYPE_RALIASES 4U +1239:Drivers/CMSIS/Include/core_cm4.h **** +1240:Drivers/CMSIS/Include/core_cm4.h **** /* MPU Type Register Definitions */ +1241:Drivers/CMSIS/Include/core_cm4.h **** #define MPU_TYPE_IREGION_Pos 16U /*!< MPU +1242:Drivers/CMSIS/Include/core_cm4.h **** #define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU +1243:Drivers/CMSIS/Include/core_cm4.h **** +1244:Drivers/CMSIS/Include/core_cm4.h **** #define MPU_TYPE_DREGION_Pos 8U /*!< MPU +1245:Drivers/CMSIS/Include/core_cm4.h **** #define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU +1246:Drivers/CMSIS/Include/core_cm4.h **** +1247:Drivers/CMSIS/Include/core_cm4.h **** #define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU +1248:Drivers/CMSIS/Include/core_cm4.h **** #define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU +1249:Drivers/CMSIS/Include/core_cm4.h **** +1250:Drivers/CMSIS/Include/core_cm4.h **** /* MPU Control Register Definitions */ +1251:Drivers/CMSIS/Include/core_cm4.h **** #define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU +1252:Drivers/CMSIS/Include/core_cm4.h **** #define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU +1253:Drivers/CMSIS/Include/core_cm4.h **** +1254:Drivers/CMSIS/Include/core_cm4.h **** #define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU +1255:Drivers/CMSIS/Include/core_cm4.h **** #define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU +1256:Drivers/CMSIS/Include/core_cm4.h **** +1257:Drivers/CMSIS/Include/core_cm4.h **** #define MPU_CTRL_ENABLE_Pos 0U /*!< MPU +1258:Drivers/CMSIS/Include/core_cm4.h **** #define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU +1259:Drivers/CMSIS/Include/core_cm4.h **** +1260:Drivers/CMSIS/Include/core_cm4.h **** /* MPU Region Number Register Definitions */ +1261:Drivers/CMSIS/Include/core_cm4.h **** #define MPU_RNR_REGION_Pos 0U /*!< MPU +1262:Drivers/CMSIS/Include/core_cm4.h **** #define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU +1263:Drivers/CMSIS/Include/core_cm4.h **** +1264:Drivers/CMSIS/Include/core_cm4.h **** /* MPU Region Base Address Register Definitions */ +1265:Drivers/CMSIS/Include/core_cm4.h **** #define MPU_RBAR_ADDR_Pos 5U /*!< MPU +1266:Drivers/CMSIS/Include/core_cm4.h **** #define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU +1267:Drivers/CMSIS/Include/core_cm4.h **** +1268:Drivers/CMSIS/Include/core_cm4.h **** #define MPU_RBAR_VALID_Pos 4U /*!< MPU +1269:Drivers/CMSIS/Include/core_cm4.h **** #define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU +1270:Drivers/CMSIS/Include/core_cm4.h **** +1271:Drivers/CMSIS/Include/core_cm4.h **** #define MPU_RBAR_REGION_Pos 0U /*!< MPU +1272:Drivers/CMSIS/Include/core_cm4.h **** #define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU +1273:Drivers/CMSIS/Include/core_cm4.h **** +1274:Drivers/CMSIS/Include/core_cm4.h **** /* MPU Region Attribute and Size Register Definitions */ +1275:Drivers/CMSIS/Include/core_cm4.h **** #define MPU_RASR_ATTRS_Pos 16U /*!< MPU +1276:Drivers/CMSIS/Include/core_cm4.h **** #define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU +1277:Drivers/CMSIS/Include/core_cm4.h **** +1278:Drivers/CMSIS/Include/core_cm4.h **** #define MPU_RASR_XN_Pos 28U /*!< MPU +1279:Drivers/CMSIS/Include/core_cm4.h **** #define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU +1280:Drivers/CMSIS/Include/core_cm4.h **** +1281:Drivers/CMSIS/Include/core_cm4.h **** #define MPU_RASR_AP_Pos 24U /*!< MPU +1282:Drivers/CMSIS/Include/core_cm4.h **** #define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU +1283:Drivers/CMSIS/Include/core_cm4.h **** + ARM GAS /tmp/ccPJu8Ry.s page 24 + + +1284:Drivers/CMSIS/Include/core_cm4.h **** #define MPU_RASR_TEX_Pos 19U /*!< MPU +1285:Drivers/CMSIS/Include/core_cm4.h **** #define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU +1286:Drivers/CMSIS/Include/core_cm4.h **** +1287:Drivers/CMSIS/Include/core_cm4.h **** #define MPU_RASR_S_Pos 18U /*!< MPU +1288:Drivers/CMSIS/Include/core_cm4.h **** #define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU +1289:Drivers/CMSIS/Include/core_cm4.h **** +1290:Drivers/CMSIS/Include/core_cm4.h **** #define MPU_RASR_C_Pos 17U /*!< MPU +1291:Drivers/CMSIS/Include/core_cm4.h **** #define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU +1292:Drivers/CMSIS/Include/core_cm4.h **** +1293:Drivers/CMSIS/Include/core_cm4.h **** #define MPU_RASR_B_Pos 16U /*!< MPU +1294:Drivers/CMSIS/Include/core_cm4.h **** #define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU +1295:Drivers/CMSIS/Include/core_cm4.h **** +1296:Drivers/CMSIS/Include/core_cm4.h **** #define MPU_RASR_SRD_Pos 8U /*!< MPU +1297:Drivers/CMSIS/Include/core_cm4.h **** #define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU +1298:Drivers/CMSIS/Include/core_cm4.h **** +1299:Drivers/CMSIS/Include/core_cm4.h **** #define MPU_RASR_SIZE_Pos 1U /*!< MPU +1300:Drivers/CMSIS/Include/core_cm4.h **** #define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU +1301:Drivers/CMSIS/Include/core_cm4.h **** +1302:Drivers/CMSIS/Include/core_cm4.h **** #define MPU_RASR_ENABLE_Pos 0U /*!< MPU +1303:Drivers/CMSIS/Include/core_cm4.h **** #define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU +1304:Drivers/CMSIS/Include/core_cm4.h **** +1305:Drivers/CMSIS/Include/core_cm4.h **** /*@} end of group CMSIS_MPU */ +1306:Drivers/CMSIS/Include/core_cm4.h **** #endif /* defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) */ +1307:Drivers/CMSIS/Include/core_cm4.h **** +1308:Drivers/CMSIS/Include/core_cm4.h **** +1309:Drivers/CMSIS/Include/core_cm4.h **** /** +1310:Drivers/CMSIS/Include/core_cm4.h **** \ingroup CMSIS_core_register +1311:Drivers/CMSIS/Include/core_cm4.h **** \defgroup CMSIS_FPU Floating Point Unit (FPU) +1312:Drivers/CMSIS/Include/core_cm4.h **** \brief Type definitions for the Floating Point Unit (FPU) +1313:Drivers/CMSIS/Include/core_cm4.h **** @{ +1314:Drivers/CMSIS/Include/core_cm4.h **** */ +1315:Drivers/CMSIS/Include/core_cm4.h **** +1316:Drivers/CMSIS/Include/core_cm4.h **** /** +1317:Drivers/CMSIS/Include/core_cm4.h **** \brief Structure type to access the Floating Point Unit (FPU). +1318:Drivers/CMSIS/Include/core_cm4.h **** */ +1319:Drivers/CMSIS/Include/core_cm4.h **** typedef struct +1320:Drivers/CMSIS/Include/core_cm4.h **** { +1321:Drivers/CMSIS/Include/core_cm4.h **** uint32_t RESERVED0[1U]; +1322:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control R +1323:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address R +1324:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Co +1325:Drivers/CMSIS/Include/core_cm4.h **** __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 +1326:Drivers/CMSIS/Include/core_cm4.h **** __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 +1327:Drivers/CMSIS/Include/core_cm4.h **** } FPU_Type; +1328:Drivers/CMSIS/Include/core_cm4.h **** +1329:Drivers/CMSIS/Include/core_cm4.h **** /* Floating-Point Context Control Register Definitions */ +1330:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCC +1331:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCC +1332:Drivers/CMSIS/Include/core_cm4.h **** +1333:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCC +1334:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCC +1335:Drivers/CMSIS/Include/core_cm4.h **** +1336:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCC +1337:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCC +1338:Drivers/CMSIS/Include/core_cm4.h **** +1339:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCC +1340:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCC + ARM GAS /tmp/ccPJu8Ry.s page 25 + + +1341:Drivers/CMSIS/Include/core_cm4.h **** +1342:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCC +1343:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCC +1344:Drivers/CMSIS/Include/core_cm4.h **** +1345:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCC +1346:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCC +1347:Drivers/CMSIS/Include/core_cm4.h **** +1348:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_FPCCR_THREAD_Pos 3U /*!< FPCC +1349:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCC +1350:Drivers/CMSIS/Include/core_cm4.h **** +1351:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_FPCCR_USER_Pos 1U /*!< FPCC +1352:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCC +1353:Drivers/CMSIS/Include/core_cm4.h **** +1354:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCC +1355:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCC +1356:Drivers/CMSIS/Include/core_cm4.h **** +1357:Drivers/CMSIS/Include/core_cm4.h **** /* Floating-Point Context Address Register Definitions */ +1358:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCA +1359:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCA +1360:Drivers/CMSIS/Include/core_cm4.h **** +1361:Drivers/CMSIS/Include/core_cm4.h **** /* Floating-Point Default Status Control Register Definitions */ +1362:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_FPDSCR_AHP_Pos 26U /*!< FPDS +1363:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDS +1364:Drivers/CMSIS/Include/core_cm4.h **** +1365:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_FPDSCR_DN_Pos 25U /*!< FPDS +1366:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDS +1367:Drivers/CMSIS/Include/core_cm4.h **** +1368:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_FPDSCR_FZ_Pos 24U /*!< FPDS +1369:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDS +1370:Drivers/CMSIS/Include/core_cm4.h **** +1371:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_FPDSCR_RMode_Pos 22U /*!< FPDS +1372:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDS +1373:Drivers/CMSIS/Include/core_cm4.h **** +1374:Drivers/CMSIS/Include/core_cm4.h **** /* Media and FP Feature Register 0 Definitions */ +1375:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR +1376:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR +1377:Drivers/CMSIS/Include/core_cm4.h **** +1378:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR +1379:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR +1380:Drivers/CMSIS/Include/core_cm4.h **** +1381:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR +1382:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR +1383:Drivers/CMSIS/Include/core_cm4.h **** +1384:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_MVFR0_Divide_Pos 16U /*!< MVFR +1385:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR +1386:Drivers/CMSIS/Include/core_cm4.h **** +1387:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR +1388:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR +1389:Drivers/CMSIS/Include/core_cm4.h **** +1390:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR +1391:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR +1392:Drivers/CMSIS/Include/core_cm4.h **** +1393:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR +1394:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR +1395:Drivers/CMSIS/Include/core_cm4.h **** +1396:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR +1397:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR + ARM GAS /tmp/ccPJu8Ry.s page 26 + + +1398:Drivers/CMSIS/Include/core_cm4.h **** +1399:Drivers/CMSIS/Include/core_cm4.h **** /* Media and FP Feature Register 1 Definitions */ +1400:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR +1401:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR +1402:Drivers/CMSIS/Include/core_cm4.h **** +1403:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR +1404:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR +1405:Drivers/CMSIS/Include/core_cm4.h **** +1406:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR +1407:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR +1408:Drivers/CMSIS/Include/core_cm4.h **** +1409:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR +1410:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR +1411:Drivers/CMSIS/Include/core_cm4.h **** +1412:Drivers/CMSIS/Include/core_cm4.h **** /*@} end of group CMSIS_FPU */ +1413:Drivers/CMSIS/Include/core_cm4.h **** +1414:Drivers/CMSIS/Include/core_cm4.h **** +1415:Drivers/CMSIS/Include/core_cm4.h **** /** +1416:Drivers/CMSIS/Include/core_cm4.h **** \ingroup CMSIS_core_register +1417:Drivers/CMSIS/Include/core_cm4.h **** \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) +1418:Drivers/CMSIS/Include/core_cm4.h **** \brief Type definitions for the Core Debug Registers +1419:Drivers/CMSIS/Include/core_cm4.h **** @{ +1420:Drivers/CMSIS/Include/core_cm4.h **** */ +1421:Drivers/CMSIS/Include/core_cm4.h **** +1422:Drivers/CMSIS/Include/core_cm4.h **** /** +1423:Drivers/CMSIS/Include/core_cm4.h **** \brief Structure type to access the Core Debug Register (CoreDebug). +1424:Drivers/CMSIS/Include/core_cm4.h **** */ +1425:Drivers/CMSIS/Include/core_cm4.h **** typedef struct +1426:Drivers/CMSIS/Include/core_cm4.h **** { +1427:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status +1428:Drivers/CMSIS/Include/core_cm4.h **** __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Reg +1429:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Registe +1430:Drivers/CMSIS/Include/core_cm4.h **** __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Cont +1431:Drivers/CMSIS/Include/core_cm4.h **** } CoreDebug_Type; +1432:Drivers/CMSIS/Include/core_cm4.h **** +1433:Drivers/CMSIS/Include/core_cm4.h **** /* Debug Halting Control and Status Register Definitions */ +1434:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< Core +1435:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< Core +1436:Drivers/CMSIS/Include/core_cm4.h **** +1437:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< Core +1438:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< Core +1439:Drivers/CMSIS/Include/core_cm4.h **** +1440:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< Core +1441:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< Core +1442:Drivers/CMSIS/Include/core_cm4.h **** +1443:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< Core +1444:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< Core +1445:Drivers/CMSIS/Include/core_cm4.h **** +1446:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< Core +1447:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< Core +1448:Drivers/CMSIS/Include/core_cm4.h **** +1449:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< Core +1450:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< Core +1451:Drivers/CMSIS/Include/core_cm4.h **** +1452:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< Core +1453:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< Core +1454:Drivers/CMSIS/Include/core_cm4.h **** + ARM GAS /tmp/ccPJu8Ry.s page 27 + + +1455:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< Core +1456:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< Core +1457:Drivers/CMSIS/Include/core_cm4.h **** +1458:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< Core +1459:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< Core +1460:Drivers/CMSIS/Include/core_cm4.h **** +1461:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< Core +1462:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< Core +1463:Drivers/CMSIS/Include/core_cm4.h **** +1464:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< Core +1465:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< Core +1466:Drivers/CMSIS/Include/core_cm4.h **** +1467:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< Core +1468:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< Core +1469:Drivers/CMSIS/Include/core_cm4.h **** +1470:Drivers/CMSIS/Include/core_cm4.h **** /* Debug Core Register Selector Register Definitions */ +1471:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< Core +1472:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< Core +1473:Drivers/CMSIS/Include/core_cm4.h **** +1474:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< Core +1475:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< Core +1476:Drivers/CMSIS/Include/core_cm4.h **** +1477:Drivers/CMSIS/Include/core_cm4.h **** /* Debug Exception and Monitor Control Register Definitions */ +1478:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< Core +1479:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< Core +1480:Drivers/CMSIS/Include/core_cm4.h **** +1481:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< Core +1482:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< Core +1483:Drivers/CMSIS/Include/core_cm4.h **** +1484:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< Core +1485:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< Core +1486:Drivers/CMSIS/Include/core_cm4.h **** +1487:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< Core +1488:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< Core +1489:Drivers/CMSIS/Include/core_cm4.h **** +1490:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< Core +1491:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< Core +1492:Drivers/CMSIS/Include/core_cm4.h **** +1493:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< Core +1494:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< Core +1495:Drivers/CMSIS/Include/core_cm4.h **** +1496:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< Core +1497:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< Core +1498:Drivers/CMSIS/Include/core_cm4.h **** +1499:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< Core +1500:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< Core +1501:Drivers/CMSIS/Include/core_cm4.h **** +1502:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< Core +1503:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< Core +1504:Drivers/CMSIS/Include/core_cm4.h **** +1505:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< Core +1506:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< Core +1507:Drivers/CMSIS/Include/core_cm4.h **** +1508:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< Core +1509:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< Core +1510:Drivers/CMSIS/Include/core_cm4.h **** +1511:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< Core + ARM GAS /tmp/ccPJu8Ry.s page 28 + + +1512:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< Core +1513:Drivers/CMSIS/Include/core_cm4.h **** +1514:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< Core +1515:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< Core +1516:Drivers/CMSIS/Include/core_cm4.h **** +1517:Drivers/CMSIS/Include/core_cm4.h **** /*@} end of group CMSIS_CoreDebug */ +1518:Drivers/CMSIS/Include/core_cm4.h **** +1519:Drivers/CMSIS/Include/core_cm4.h **** +1520:Drivers/CMSIS/Include/core_cm4.h **** /** +1521:Drivers/CMSIS/Include/core_cm4.h **** \ingroup CMSIS_core_register +1522:Drivers/CMSIS/Include/core_cm4.h **** \defgroup CMSIS_core_bitfield Core register bit field macros +1523:Drivers/CMSIS/Include/core_cm4.h **** \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). +1524:Drivers/CMSIS/Include/core_cm4.h **** @{ +1525:Drivers/CMSIS/Include/core_cm4.h **** */ +1526:Drivers/CMSIS/Include/core_cm4.h **** +1527:Drivers/CMSIS/Include/core_cm4.h **** /** +1528:Drivers/CMSIS/Include/core_cm4.h **** \brief Mask and shift a bit field value for use in a register bit range. +1529:Drivers/CMSIS/Include/core_cm4.h **** \param[in] field Name of the register bit field. +1530:Drivers/CMSIS/Include/core_cm4.h **** \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. +1531:Drivers/CMSIS/Include/core_cm4.h **** \return Masked and shifted value. +1532:Drivers/CMSIS/Include/core_cm4.h **** */ +1533:Drivers/CMSIS/Include/core_cm4.h **** #define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) +1534:Drivers/CMSIS/Include/core_cm4.h **** +1535:Drivers/CMSIS/Include/core_cm4.h **** /** +1536:Drivers/CMSIS/Include/core_cm4.h **** \brief Mask and shift a register value to extract a bit filed value. +1537:Drivers/CMSIS/Include/core_cm4.h **** \param[in] field Name of the register bit field. +1538:Drivers/CMSIS/Include/core_cm4.h **** \param[in] value Value of register. This parameter is interpreted as an uint32_t type. +1539:Drivers/CMSIS/Include/core_cm4.h **** \return Masked and shifted bit field value. +1540:Drivers/CMSIS/Include/core_cm4.h **** */ +1541:Drivers/CMSIS/Include/core_cm4.h **** #define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) +1542:Drivers/CMSIS/Include/core_cm4.h **** +1543:Drivers/CMSIS/Include/core_cm4.h **** /*@} end of group CMSIS_core_bitfield */ +1544:Drivers/CMSIS/Include/core_cm4.h **** +1545:Drivers/CMSIS/Include/core_cm4.h **** +1546:Drivers/CMSIS/Include/core_cm4.h **** /** +1547:Drivers/CMSIS/Include/core_cm4.h **** \ingroup CMSIS_core_register +1548:Drivers/CMSIS/Include/core_cm4.h **** \defgroup CMSIS_core_base Core Definitions +1549:Drivers/CMSIS/Include/core_cm4.h **** \brief Definitions for base addresses, unions, and structures. +1550:Drivers/CMSIS/Include/core_cm4.h **** @{ +1551:Drivers/CMSIS/Include/core_cm4.h **** */ +1552:Drivers/CMSIS/Include/core_cm4.h **** +1553:Drivers/CMSIS/Include/core_cm4.h **** /* Memory mapping of Core Hardware */ +1554:Drivers/CMSIS/Include/core_cm4.h **** #define SCS_BASE (0xE000E000UL) /*!< System Control Space Bas +1555:Drivers/CMSIS/Include/core_cm4.h **** #define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ +1556:Drivers/CMSIS/Include/core_cm4.h **** #define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ +1557:Drivers/CMSIS/Include/core_cm4.h **** #define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ +1558:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address +1559:Drivers/CMSIS/Include/core_cm4.h **** #define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +1560:Drivers/CMSIS/Include/core_cm4.h **** #define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +1561:Drivers/CMSIS/Include/core_cm4.h **** #define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Bas +1562:Drivers/CMSIS/Include/core_cm4.h **** +1563:Drivers/CMSIS/Include/core_cm4.h **** #define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register +1564:Drivers/CMSIS/Include/core_cm4.h **** #define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct +1565:Drivers/CMSIS/Include/core_cm4.h **** #define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration st +1566:Drivers/CMSIS/Include/core_cm4.h **** #define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struc +1567:Drivers/CMSIS/Include/core_cm4.h **** #define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct +1568:Drivers/CMSIS/Include/core_cm4.h **** #define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct + ARM GAS /tmp/ccPJu8Ry.s page 29 + + +1569:Drivers/CMSIS/Include/core_cm4.h **** #define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct +1570:Drivers/CMSIS/Include/core_cm4.h **** #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration +1571:Drivers/CMSIS/Include/core_cm4.h **** +1572:Drivers/CMSIS/Include/core_cm4.h **** #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +1573:Drivers/CMSIS/Include/core_cm4.h **** #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit * +1574:Drivers/CMSIS/Include/core_cm4.h **** #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit * +1575:Drivers/CMSIS/Include/core_cm4.h **** #endif +1576:Drivers/CMSIS/Include/core_cm4.h **** +1577:Drivers/CMSIS/Include/core_cm4.h **** #define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ +1578:Drivers/CMSIS/Include/core_cm4.h **** #define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ +1579:Drivers/CMSIS/Include/core_cm4.h **** +1580:Drivers/CMSIS/Include/core_cm4.h **** /*@} */ +1581:Drivers/CMSIS/Include/core_cm4.h **** +1582:Drivers/CMSIS/Include/core_cm4.h **** +1583:Drivers/CMSIS/Include/core_cm4.h **** +1584:Drivers/CMSIS/Include/core_cm4.h **** /******************************************************************************* +1585:Drivers/CMSIS/Include/core_cm4.h **** * Hardware Abstraction Layer +1586:Drivers/CMSIS/Include/core_cm4.h **** Core Function Interface contains: +1587:Drivers/CMSIS/Include/core_cm4.h **** - Core NVIC Functions +1588:Drivers/CMSIS/Include/core_cm4.h **** - Core SysTick Functions +1589:Drivers/CMSIS/Include/core_cm4.h **** - Core Debug Functions +1590:Drivers/CMSIS/Include/core_cm4.h **** - Core Register Access Functions +1591:Drivers/CMSIS/Include/core_cm4.h **** ******************************************************************************/ +1592:Drivers/CMSIS/Include/core_cm4.h **** /** +1593:Drivers/CMSIS/Include/core_cm4.h **** \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +1594:Drivers/CMSIS/Include/core_cm4.h **** */ +1595:Drivers/CMSIS/Include/core_cm4.h **** +1596:Drivers/CMSIS/Include/core_cm4.h **** +1597:Drivers/CMSIS/Include/core_cm4.h **** +1598:Drivers/CMSIS/Include/core_cm4.h **** /* ########################## NVIC functions #################################### */ +1599:Drivers/CMSIS/Include/core_cm4.h **** /** +1600:Drivers/CMSIS/Include/core_cm4.h **** \ingroup CMSIS_Core_FunctionInterface +1601:Drivers/CMSIS/Include/core_cm4.h **** \defgroup CMSIS_Core_NVICFunctions NVIC Functions +1602:Drivers/CMSIS/Include/core_cm4.h **** \brief Functions that manage interrupts and exceptions via the NVIC. +1603:Drivers/CMSIS/Include/core_cm4.h **** @{ +1604:Drivers/CMSIS/Include/core_cm4.h **** */ +1605:Drivers/CMSIS/Include/core_cm4.h **** +1606:Drivers/CMSIS/Include/core_cm4.h **** #ifdef CMSIS_NVIC_VIRTUAL +1607:Drivers/CMSIS/Include/core_cm4.h **** #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE +1608:Drivers/CMSIS/Include/core_cm4.h **** #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" +1609:Drivers/CMSIS/Include/core_cm4.h **** #endif +1610:Drivers/CMSIS/Include/core_cm4.h **** #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +1611:Drivers/CMSIS/Include/core_cm4.h **** #else +1612:Drivers/CMSIS/Include/core_cm4.h **** #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping +1613:Drivers/CMSIS/Include/core_cm4.h **** #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping +1614:Drivers/CMSIS/Include/core_cm4.h **** #define NVIC_EnableIRQ __NVIC_EnableIRQ +1615:Drivers/CMSIS/Include/core_cm4.h **** #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ +1616:Drivers/CMSIS/Include/core_cm4.h **** #define NVIC_DisableIRQ __NVIC_DisableIRQ +1617:Drivers/CMSIS/Include/core_cm4.h **** #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ +1618:Drivers/CMSIS/Include/core_cm4.h **** #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ +1619:Drivers/CMSIS/Include/core_cm4.h **** #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ +1620:Drivers/CMSIS/Include/core_cm4.h **** #define NVIC_GetActive __NVIC_GetActive +1621:Drivers/CMSIS/Include/core_cm4.h **** #define NVIC_SetPriority __NVIC_SetPriority +1622:Drivers/CMSIS/Include/core_cm4.h **** #define NVIC_GetPriority __NVIC_GetPriority +1623:Drivers/CMSIS/Include/core_cm4.h **** #define NVIC_SystemReset __NVIC_SystemReset +1624:Drivers/CMSIS/Include/core_cm4.h **** #endif /* CMSIS_NVIC_VIRTUAL */ +1625:Drivers/CMSIS/Include/core_cm4.h **** + ARM GAS /tmp/ccPJu8Ry.s page 30 + + +1626:Drivers/CMSIS/Include/core_cm4.h **** #ifdef CMSIS_VECTAB_VIRTUAL +1627:Drivers/CMSIS/Include/core_cm4.h **** #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE +1628:Drivers/CMSIS/Include/core_cm4.h **** #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" +1629:Drivers/CMSIS/Include/core_cm4.h **** #endif +1630:Drivers/CMSIS/Include/core_cm4.h **** #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +1631:Drivers/CMSIS/Include/core_cm4.h **** #else +1632:Drivers/CMSIS/Include/core_cm4.h **** #define NVIC_SetVector __NVIC_SetVector +1633:Drivers/CMSIS/Include/core_cm4.h **** #define NVIC_GetVector __NVIC_GetVector +1634:Drivers/CMSIS/Include/core_cm4.h **** #endif /* (CMSIS_VECTAB_VIRTUAL) */ +1635:Drivers/CMSIS/Include/core_cm4.h **** +1636:Drivers/CMSIS/Include/core_cm4.h **** #define NVIC_USER_IRQ_OFFSET 16 +1637:Drivers/CMSIS/Include/core_cm4.h **** +1638:Drivers/CMSIS/Include/core_cm4.h **** +1639:Drivers/CMSIS/Include/core_cm4.h **** /* The following EXC_RETURN values are saved the LR on exception entry */ +1640:Drivers/CMSIS/Include/core_cm4.h **** #define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after ret +1641:Drivers/CMSIS/Include/core_cm4.h **** #define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after retu +1642:Drivers/CMSIS/Include/core_cm4.h **** #define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after retu +1643:Drivers/CMSIS/Include/core_cm4.h **** #define EXC_RETURN_HANDLER_FPU (0xFFFFFFE1UL) /* return to Handler mode, uses MSP after ret +1644:Drivers/CMSIS/Include/core_cm4.h **** #define EXC_RETURN_THREAD_MSP_FPU (0xFFFFFFE9UL) /* return to Thread mode, uses MSP after retu +1645:Drivers/CMSIS/Include/core_cm4.h **** #define EXC_RETURN_THREAD_PSP_FPU (0xFFFFFFEDUL) /* return to Thread mode, uses PSP after retu +1646:Drivers/CMSIS/Include/core_cm4.h **** +1647:Drivers/CMSIS/Include/core_cm4.h **** +1648:Drivers/CMSIS/Include/core_cm4.h **** /** +1649:Drivers/CMSIS/Include/core_cm4.h **** \brief Set Priority Grouping +1650:Drivers/CMSIS/Include/core_cm4.h **** \details Sets the priority grouping field using the required unlock sequence. +1651:Drivers/CMSIS/Include/core_cm4.h **** The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. +1652:Drivers/CMSIS/Include/core_cm4.h **** Only values from 0..7 are used. +1653:Drivers/CMSIS/Include/core_cm4.h **** In case of a conflict between priority grouping and available +1654:Drivers/CMSIS/Include/core_cm4.h **** priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. +1655:Drivers/CMSIS/Include/core_cm4.h **** \param [in] PriorityGroup Priority grouping field. +1656:Drivers/CMSIS/Include/core_cm4.h **** */ +1657:Drivers/CMSIS/Include/core_cm4.h **** __STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +1658:Drivers/CMSIS/Include/core_cm4.h **** { +1659:Drivers/CMSIS/Include/core_cm4.h **** uint32_t reg_value; +1660:Drivers/CMSIS/Include/core_cm4.h **** uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 a +1661:Drivers/CMSIS/Include/core_cm4.h **** +1662:Drivers/CMSIS/Include/core_cm4.h **** reg_value = SCB->AIRCR; /* read old register +1663:Drivers/CMSIS/Include/core_cm4.h **** reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to chan +1664:Drivers/CMSIS/Include/core_cm4.h **** reg_value = (reg_value | +1665:Drivers/CMSIS/Include/core_cm4.h **** ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | +1666:Drivers/CMSIS/Include/core_cm4.h **** (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key a +1667:Drivers/CMSIS/Include/core_cm4.h **** SCB->AIRCR = reg_value; +1668:Drivers/CMSIS/Include/core_cm4.h **** } +1669:Drivers/CMSIS/Include/core_cm4.h **** +1670:Drivers/CMSIS/Include/core_cm4.h **** +1671:Drivers/CMSIS/Include/core_cm4.h **** /** +1672:Drivers/CMSIS/Include/core_cm4.h **** \brief Get Priority Grouping +1673:Drivers/CMSIS/Include/core_cm4.h **** \details Reads the priority grouping field from the NVIC Interrupt Controller. +1674:Drivers/CMSIS/Include/core_cm4.h **** \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). +1675:Drivers/CMSIS/Include/core_cm4.h **** */ +1676:Drivers/CMSIS/Include/core_cm4.h **** __STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +1677:Drivers/CMSIS/Include/core_cm4.h **** { +1678:Drivers/CMSIS/Include/core_cm4.h **** return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +1679:Drivers/CMSIS/Include/core_cm4.h **** } +1680:Drivers/CMSIS/Include/core_cm4.h **** +1681:Drivers/CMSIS/Include/core_cm4.h **** +1682:Drivers/CMSIS/Include/core_cm4.h **** /** + ARM GAS /tmp/ccPJu8Ry.s page 31 + + +1683:Drivers/CMSIS/Include/core_cm4.h **** \brief Enable Interrupt +1684:Drivers/CMSIS/Include/core_cm4.h **** \details Enables a device specific interrupt in the NVIC interrupt controller. +1685:Drivers/CMSIS/Include/core_cm4.h **** \param [in] IRQn Device specific interrupt number. +1686:Drivers/CMSIS/Include/core_cm4.h **** \note IRQn must not be negative. +1687:Drivers/CMSIS/Include/core_cm4.h **** */ +1688:Drivers/CMSIS/Include/core_cm4.h **** __STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +1689:Drivers/CMSIS/Include/core_cm4.h **** { +1690:Drivers/CMSIS/Include/core_cm4.h **** if ((int32_t)(IRQn) >= 0) +1691:Drivers/CMSIS/Include/core_cm4.h **** { +1692:Drivers/CMSIS/Include/core_cm4.h **** NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); +1693:Drivers/CMSIS/Include/core_cm4.h **** } +1694:Drivers/CMSIS/Include/core_cm4.h **** } +1695:Drivers/CMSIS/Include/core_cm4.h **** +1696:Drivers/CMSIS/Include/core_cm4.h **** +1697:Drivers/CMSIS/Include/core_cm4.h **** /** +1698:Drivers/CMSIS/Include/core_cm4.h **** \brief Get Interrupt Enable status +1699:Drivers/CMSIS/Include/core_cm4.h **** \details Returns a device specific interrupt enable status from the NVIC interrupt controller. +1700:Drivers/CMSIS/Include/core_cm4.h **** \param [in] IRQn Device specific interrupt number. +1701:Drivers/CMSIS/Include/core_cm4.h **** \return 0 Interrupt is not enabled. +1702:Drivers/CMSIS/Include/core_cm4.h **** \return 1 Interrupt is enabled. +1703:Drivers/CMSIS/Include/core_cm4.h **** \note IRQn must not be negative. +1704:Drivers/CMSIS/Include/core_cm4.h **** */ +1705:Drivers/CMSIS/Include/core_cm4.h **** __STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +1706:Drivers/CMSIS/Include/core_cm4.h **** { +1707:Drivers/CMSIS/Include/core_cm4.h **** if ((int32_t)(IRQn) >= 0) +1708:Drivers/CMSIS/Include/core_cm4.h **** { +1709:Drivers/CMSIS/Include/core_cm4.h **** return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL) +1710:Drivers/CMSIS/Include/core_cm4.h **** } +1711:Drivers/CMSIS/Include/core_cm4.h **** else +1712:Drivers/CMSIS/Include/core_cm4.h **** { +1713:Drivers/CMSIS/Include/core_cm4.h **** return(0U); +1714:Drivers/CMSIS/Include/core_cm4.h **** } +1715:Drivers/CMSIS/Include/core_cm4.h **** } +1716:Drivers/CMSIS/Include/core_cm4.h **** +1717:Drivers/CMSIS/Include/core_cm4.h **** +1718:Drivers/CMSIS/Include/core_cm4.h **** /** +1719:Drivers/CMSIS/Include/core_cm4.h **** \brief Disable Interrupt +1720:Drivers/CMSIS/Include/core_cm4.h **** \details Disables a device specific interrupt in the NVIC interrupt controller. +1721:Drivers/CMSIS/Include/core_cm4.h **** \param [in] IRQn Device specific interrupt number. +1722:Drivers/CMSIS/Include/core_cm4.h **** \note IRQn must not be negative. +1723:Drivers/CMSIS/Include/core_cm4.h **** */ +1724:Drivers/CMSIS/Include/core_cm4.h **** __STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +1725:Drivers/CMSIS/Include/core_cm4.h **** { + 30 .loc 2 1725 1 view -0 + 31 .cfi_startproc + 32 @ args = 0, pretend = 0, frame = 0 + 33 @ frame_needed = 0, uses_anonymous_args = 0 + 34 @ link register save eliminated. +1726:Drivers/CMSIS/Include/core_cm4.h **** if ((int32_t)(IRQn) >= 0) + 35 .loc 2 1726 3 view .LVU1 + 36 .loc 2 1726 6 is_stmt 0 view .LVU2 + 37 0000 0028 cmp r0, #0 + 38 .LVL1: + 39 .loc 2 1726 6 view .LVU3 + 40 0002 0CDB blt .L1 +1727:Drivers/CMSIS/Include/core_cm4.h **** { +1728:Drivers/CMSIS/Include/core_cm4.h **** NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + ARM GAS /tmp/ccPJu8Ry.s page 32 + + + 41 .loc 2 1728 5 is_stmt 1 view .LVU4 + 42 .loc 2 1728 81 is_stmt 0 view .LVU5 + 43 0004 00F01F02 and r2, r0, #31 + 44 .loc 2 1728 34 view .LVU6 + 45 0008 4009 lsrs r0, r0, #5 + 46 .loc 2 1728 45 view .LVU7 + 47 000a 0123 movs r3, #1 + 48 000c 9340 lsls r3, r3, r2 + 49 .loc 2 1728 43 view .LVU8 + 50 000e 2030 adds r0, r0, #32 + 51 0010 034A ldr r2, .L3 + 52 0012 42F82030 str r3, [r2, r0, lsl #2] +1729:Drivers/CMSIS/Include/core_cm4.h **** __DSB(); + 53 .loc 2 1729 5 is_stmt 1 view .LVU9 + 54 .LBB32: + 55 .LBI32: + 56 .file 3 "Drivers/CMSIS/Include/cmsis_gcc.h" + 1:Drivers/CMSIS/Include/cmsis_gcc.h **** /**************************************************************************//** + 2:Drivers/CMSIS/Include/cmsis_gcc.h **** * @file cmsis_gcc.h + 3:Drivers/CMSIS/Include/cmsis_gcc.h **** * @brief CMSIS compiler GCC header file + 4:Drivers/CMSIS/Include/cmsis_gcc.h **** * @version V5.0.4 + 5:Drivers/CMSIS/Include/cmsis_gcc.h **** * @date 09. April 2018 + 6:Drivers/CMSIS/Include/cmsis_gcc.h **** ******************************************************************************/ + 7:Drivers/CMSIS/Include/cmsis_gcc.h **** /* + 8:Drivers/CMSIS/Include/cmsis_gcc.h **** * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + 9:Drivers/CMSIS/Include/cmsis_gcc.h **** * + 10:Drivers/CMSIS/Include/cmsis_gcc.h **** * SPDX-License-Identifier: Apache-2.0 + 11:Drivers/CMSIS/Include/cmsis_gcc.h **** * + 12:Drivers/CMSIS/Include/cmsis_gcc.h **** * Licensed under the Apache License, Version 2.0 (the License); you may + 13:Drivers/CMSIS/Include/cmsis_gcc.h **** * not use this file except in compliance with the License. + 14:Drivers/CMSIS/Include/cmsis_gcc.h **** * You may obtain a copy of the License at + 15:Drivers/CMSIS/Include/cmsis_gcc.h **** * + 16:Drivers/CMSIS/Include/cmsis_gcc.h **** * www.apache.org/licenses/LICENSE-2.0 + 17:Drivers/CMSIS/Include/cmsis_gcc.h **** * + 18:Drivers/CMSIS/Include/cmsis_gcc.h **** * Unless required by applicable law or agreed to in writing, software + 19:Drivers/CMSIS/Include/cmsis_gcc.h **** * distributed under the License is distributed on an AS IS BASIS, WITHOUT + 20:Drivers/CMSIS/Include/cmsis_gcc.h **** * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + 21:Drivers/CMSIS/Include/cmsis_gcc.h **** * See the License for the specific language governing permissions and + 22:Drivers/CMSIS/Include/cmsis_gcc.h **** * limitations under the License. + 23:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 24:Drivers/CMSIS/Include/cmsis_gcc.h **** + 25:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __CMSIS_GCC_H + 26:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __CMSIS_GCC_H + 27:Drivers/CMSIS/Include/cmsis_gcc.h **** + 28:Drivers/CMSIS/Include/cmsis_gcc.h **** /* ignore some GCC warnings */ + 29:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic push + 30:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wsign-conversion" + 31:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wconversion" + 32:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wunused-parameter" + 33:Drivers/CMSIS/Include/cmsis_gcc.h **** + 34:Drivers/CMSIS/Include/cmsis_gcc.h **** /* Fallback for __has_builtin */ + 35:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __has_builtin + 36:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __has_builtin(x) (0) + 37:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 38:Drivers/CMSIS/Include/cmsis_gcc.h **** + 39:Drivers/CMSIS/Include/cmsis_gcc.h **** /* CMSIS compiler specific defines */ + 40:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __ASM + ARM GAS /tmp/ccPJu8Ry.s page 33 + + + 41:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __ASM __asm + 42:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 43:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __INLINE + 44:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __INLINE inline + 45:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 46:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __STATIC_INLINE + 47:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __STATIC_INLINE static inline + 48:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 49:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __STATIC_FORCEINLINE + 50:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __STATIC_FORCEINLINE __attribute__((always_inline)) static inline + 51:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 52:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __NO_RETURN + 53:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __NO_RETURN __attribute__((__noreturn__)) + 54:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 55:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __USED + 56:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __USED __attribute__((used)) + 57:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 58:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __WEAK + 59:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __WEAK __attribute__((weak)) + 60:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 61:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __PACKED + 62:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __PACKED __attribute__((packed, aligned(1))) + 63:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 64:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __PACKED_STRUCT + 65:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) + 66:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 67:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __PACKED_UNION + 68:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __PACKED_UNION union __attribute__((packed, aligned(1))) + 69:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 70:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __UNALIGNED_UINT32 /* deprecated */ + 71:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic push + 72:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wpacked" + 73:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wattributes" + 74:Drivers/CMSIS/Include/cmsis_gcc.h **** struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + 75:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic pop + 76:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + 77:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 78:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __UNALIGNED_UINT16_WRITE + 79:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic push + 80:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wpacked" + 81:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wattributes" + 82:Drivers/CMSIS/Include/cmsis_gcc.h **** __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + 83:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic pop + 84:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))- + 85:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 86:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __UNALIGNED_UINT16_READ + 87:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic push + 88:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wpacked" + 89:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wattributes" + 90:Drivers/CMSIS/Include/cmsis_gcc.h **** __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + 91:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic pop + 92:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(add + 93:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 94:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __UNALIGNED_UINT32_WRITE + 95:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic push + 96:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wpacked" + 97:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wattributes" + ARM GAS /tmp/ccPJu8Ry.s page 34 + + + 98:Drivers/CMSIS/Include/cmsis_gcc.h **** __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + 99:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic pop + 100:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))- + 101:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 102:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __UNALIGNED_UINT32_READ + 103:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic push + 104:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wpacked" + 105:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wattributes" + 106:Drivers/CMSIS/Include/cmsis_gcc.h **** __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + 107:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic pop + 108:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(add + 109:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 110:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __ALIGNED + 111:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __ALIGNED(x) __attribute__((aligned(x))) + 112:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 113:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __RESTRICT + 114:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __RESTRICT __restrict + 115:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 116:Drivers/CMSIS/Include/cmsis_gcc.h **** + 117:Drivers/CMSIS/Include/cmsis_gcc.h **** + 118:Drivers/CMSIS/Include/cmsis_gcc.h **** /* ########################### Core Function Access ########################### */ + 119:Drivers/CMSIS/Include/cmsis_gcc.h **** /** \ingroup CMSIS_Core_FunctionInterface + 120:Drivers/CMSIS/Include/cmsis_gcc.h **** \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + 121:Drivers/CMSIS/Include/cmsis_gcc.h **** @{ + 122:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 123:Drivers/CMSIS/Include/cmsis_gcc.h **** + 124:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 125:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Enable IRQ Interrupts + 126:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + 127:Drivers/CMSIS/Include/cmsis_gcc.h **** Can only be executed in Privileged modes. + 128:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 129:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __enable_irq(void) + 130:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 131:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("cpsie i" : : : "memory"); + 132:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 133:Drivers/CMSIS/Include/cmsis_gcc.h **** + 134:Drivers/CMSIS/Include/cmsis_gcc.h **** + 135:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 136:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Disable IRQ Interrupts + 137:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Disables IRQ interrupts by setting the I-bit in the CPSR. + 138:Drivers/CMSIS/Include/cmsis_gcc.h **** Can only be executed in Privileged modes. + 139:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 140:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __disable_irq(void) + 141:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 142:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("cpsid i" : : : "memory"); + 143:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 144:Drivers/CMSIS/Include/cmsis_gcc.h **** + 145:Drivers/CMSIS/Include/cmsis_gcc.h **** + 146:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 147:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Control Register + 148:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the content of the Control Register. + 149:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Control Register value + 150:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 151:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_CONTROL(void) + 152:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 153:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 154:Drivers/CMSIS/Include/cmsis_gcc.h **** + ARM GAS /tmp/ccPJu8Ry.s page 35 + + + 155:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, control" : "=r" (result) ); + 156:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 157:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 158:Drivers/CMSIS/Include/cmsis_gcc.h **** + 159:Drivers/CMSIS/Include/cmsis_gcc.h **** + 160:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 161:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 162:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Control Register (non-secure) + 163:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the content of the non-secure Control Register when in secure mode. + 164:Drivers/CMSIS/Include/cmsis_gcc.h **** \return non-secure Control Register value + 165:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 166:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) + 167:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 168:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 169:Drivers/CMSIS/Include/cmsis_gcc.h **** + 170:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); + 171:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 172:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 173:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 174:Drivers/CMSIS/Include/cmsis_gcc.h **** + 175:Drivers/CMSIS/Include/cmsis_gcc.h **** + 176:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 177:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Control Register + 178:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Writes the given value to the Control Register. + 179:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] control Control Register value to set + 180:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 181:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) + 182:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 183:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); + 184:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 185:Drivers/CMSIS/Include/cmsis_gcc.h **** + 186:Drivers/CMSIS/Include/cmsis_gcc.h **** + 187:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 188:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 189:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Control Register (non-secure) + 190:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Writes the given value to the non-secure Control Register when in secure state. + 191:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] control Control Register value to set + 192:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 193:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) + 194:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 195:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); + 196:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 197:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 198:Drivers/CMSIS/Include/cmsis_gcc.h **** + 199:Drivers/CMSIS/Include/cmsis_gcc.h **** + 200:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 201:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get IPSR Register + 202:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the content of the IPSR Register. + 203:Drivers/CMSIS/Include/cmsis_gcc.h **** \return IPSR Register value + 204:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 205:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_IPSR(void) + 206:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 207:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 208:Drivers/CMSIS/Include/cmsis_gcc.h **** + 209:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); + 210:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 211:Drivers/CMSIS/Include/cmsis_gcc.h **** } + ARM GAS /tmp/ccPJu8Ry.s page 36 + + + 212:Drivers/CMSIS/Include/cmsis_gcc.h **** + 213:Drivers/CMSIS/Include/cmsis_gcc.h **** + 214:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 215:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get APSR Register + 216:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the content of the APSR Register. + 217:Drivers/CMSIS/Include/cmsis_gcc.h **** \return APSR Register value + 218:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 219:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_APSR(void) + 220:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 221:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 222:Drivers/CMSIS/Include/cmsis_gcc.h **** + 223:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, apsr" : "=r" (result) ); + 224:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 225:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 226:Drivers/CMSIS/Include/cmsis_gcc.h **** + 227:Drivers/CMSIS/Include/cmsis_gcc.h **** + 228:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 229:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get xPSR Register + 230:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the content of the xPSR Register. + 231:Drivers/CMSIS/Include/cmsis_gcc.h **** \return xPSR Register value + 232:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 233:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_xPSR(void) + 234:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 235:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 236:Drivers/CMSIS/Include/cmsis_gcc.h **** + 237:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); + 238:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 239:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 240:Drivers/CMSIS/Include/cmsis_gcc.h **** + 241:Drivers/CMSIS/Include/cmsis_gcc.h **** + 242:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 243:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Process Stack Pointer + 244:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the Process Stack Pointer (PSP). + 245:Drivers/CMSIS/Include/cmsis_gcc.h **** \return PSP Register value + 246:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 247:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_PSP(void) + 248:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 249:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 250:Drivers/CMSIS/Include/cmsis_gcc.h **** + 251:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, psp" : "=r" (result) ); + 252:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 253:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 254:Drivers/CMSIS/Include/cmsis_gcc.h **** + 255:Drivers/CMSIS/Include/cmsis_gcc.h **** + 256:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 257:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 258:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Process Stack Pointer (non-secure) + 259:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure s + 260:Drivers/CMSIS/Include/cmsis_gcc.h **** \return PSP Register value + 261:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 262:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) + 263:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 264:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 265:Drivers/CMSIS/Include/cmsis_gcc.h **** + 266:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); + 267:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 268:Drivers/CMSIS/Include/cmsis_gcc.h **** } + ARM GAS /tmp/ccPJu8Ry.s page 37 + + + 269:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 270:Drivers/CMSIS/Include/cmsis_gcc.h **** + 271:Drivers/CMSIS/Include/cmsis_gcc.h **** + 272:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 273:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Process Stack Pointer + 274:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Process Stack Pointer (PSP). + 275:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] topOfProcStack Process Stack Pointer value to set + 276:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 277:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) + 278:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 279:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); + 280:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 281:Drivers/CMSIS/Include/cmsis_gcc.h **** + 282:Drivers/CMSIS/Include/cmsis_gcc.h **** + 283:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 284:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 285:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Process Stack Pointer (non-secure) + 286:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure sta + 287:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] topOfProcStack Process Stack Pointer value to set + 288:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 289:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) + 290:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 291:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); + 292:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 293:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 294:Drivers/CMSIS/Include/cmsis_gcc.h **** + 295:Drivers/CMSIS/Include/cmsis_gcc.h **** + 296:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 297:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Main Stack Pointer + 298:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the Main Stack Pointer (MSP). + 299:Drivers/CMSIS/Include/cmsis_gcc.h **** \return MSP Register value + 300:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 301:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_MSP(void) + 302:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 303:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 304:Drivers/CMSIS/Include/cmsis_gcc.h **** + 305:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, msp" : "=r" (result) ); + 306:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 307:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 308:Drivers/CMSIS/Include/cmsis_gcc.h **** + 309:Drivers/CMSIS/Include/cmsis_gcc.h **** + 310:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 311:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 312:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Main Stack Pointer (non-secure) + 313:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure stat + 314:Drivers/CMSIS/Include/cmsis_gcc.h **** \return MSP Register value + 315:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 316:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) + 317:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 318:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 319:Drivers/CMSIS/Include/cmsis_gcc.h **** + 320:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); + 321:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 322:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 323:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 324:Drivers/CMSIS/Include/cmsis_gcc.h **** + 325:Drivers/CMSIS/Include/cmsis_gcc.h **** + ARM GAS /tmp/ccPJu8Ry.s page 38 + + + 326:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 327:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Main Stack Pointer + 328:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Main Stack Pointer (MSP). + 329:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] topOfMainStack Main Stack Pointer value to set + 330:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 331:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) + 332:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 333:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); + 334:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 335:Drivers/CMSIS/Include/cmsis_gcc.h **** + 336:Drivers/CMSIS/Include/cmsis_gcc.h **** + 337:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 338:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 339:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Main Stack Pointer (non-secure) + 340:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. + 341:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] topOfMainStack Main Stack Pointer value to set + 342:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 343:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) + 344:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 345:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); + 346:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 347:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 348:Drivers/CMSIS/Include/cmsis_gcc.h **** + 349:Drivers/CMSIS/Include/cmsis_gcc.h **** + 350:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 351:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 352:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Stack Pointer (non-secure) + 353:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. + 354:Drivers/CMSIS/Include/cmsis_gcc.h **** \return SP Register value + 355:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 356:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) + 357:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 358:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 359:Drivers/CMSIS/Include/cmsis_gcc.h **** + 360:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); + 361:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 362:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 363:Drivers/CMSIS/Include/cmsis_gcc.h **** + 364:Drivers/CMSIS/Include/cmsis_gcc.h **** + 365:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 366:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Stack Pointer (non-secure) + 367:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. + 368:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] topOfStack Stack Pointer value to set + 369:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 370:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) + 371:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 372:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); + 373:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 374:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 375:Drivers/CMSIS/Include/cmsis_gcc.h **** + 376:Drivers/CMSIS/Include/cmsis_gcc.h **** + 377:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 378:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Priority Mask + 379:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current state of the priority mask bit from the Priority Mask Register. + 380:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Priority Mask value + 381:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 382:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) + ARM GAS /tmp/ccPJu8Ry.s page 39 + + + 383:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 384:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 385:Drivers/CMSIS/Include/cmsis_gcc.h **** + 386:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, primask" : "=r" (result) :: "memory"); + 387:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 388:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 389:Drivers/CMSIS/Include/cmsis_gcc.h **** + 390:Drivers/CMSIS/Include/cmsis_gcc.h **** + 391:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 392:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 393:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Priority Mask (non-secure) + 394:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current state of the non-secure priority mask bit from the Priority Mask Reg + 395:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Priority Mask value + 396:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 397:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) + 398:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 399:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 400:Drivers/CMSIS/Include/cmsis_gcc.h **** + 401:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, primask_ns" : "=r" (result) :: "memory"); + 402:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 403:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 404:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 405:Drivers/CMSIS/Include/cmsis_gcc.h **** + 406:Drivers/CMSIS/Include/cmsis_gcc.h **** + 407:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 408:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Priority Mask + 409:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Priority Mask Register. + 410:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] priMask Priority Mask + 411:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 412:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) + 413:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 414:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); + 415:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 416:Drivers/CMSIS/Include/cmsis_gcc.h **** + 417:Drivers/CMSIS/Include/cmsis_gcc.h **** + 418:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 419:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 420:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Priority Mask (non-secure) + 421:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the non-secure Priority Mask Register when in secure state. + 422:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] priMask Priority Mask + 423:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 424:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) + 425:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 426:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); + 427:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 428:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 429:Drivers/CMSIS/Include/cmsis_gcc.h **** + 430:Drivers/CMSIS/Include/cmsis_gcc.h **** + 431:Drivers/CMSIS/Include/cmsis_gcc.h **** #if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + 432:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + 433:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + 434:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 435:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Enable FIQ + 436:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Enables FIQ interrupts by clearing the F-bit in the CPSR. + 437:Drivers/CMSIS/Include/cmsis_gcc.h **** Can only be executed in Privileged modes. + 438:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 439:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __enable_fault_irq(void) + ARM GAS /tmp/ccPJu8Ry.s page 40 + + + 440:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 441:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("cpsie f" : : : "memory"); + 442:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 443:Drivers/CMSIS/Include/cmsis_gcc.h **** + 444:Drivers/CMSIS/Include/cmsis_gcc.h **** + 445:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 446:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Disable FIQ + 447:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Disables FIQ interrupts by setting the F-bit in the CPSR. + 448:Drivers/CMSIS/Include/cmsis_gcc.h **** Can only be executed in Privileged modes. + 449:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 450:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __disable_fault_irq(void) + 451:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 452:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("cpsid f" : : : "memory"); + 453:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 454:Drivers/CMSIS/Include/cmsis_gcc.h **** + 455:Drivers/CMSIS/Include/cmsis_gcc.h **** + 456:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 457:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Base Priority + 458:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the Base Priority register. + 459:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Base Priority register value + 460:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 461:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) + 462:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 463:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 464:Drivers/CMSIS/Include/cmsis_gcc.h **** + 465:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, basepri" : "=r" (result) ); + 466:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 467:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 468:Drivers/CMSIS/Include/cmsis_gcc.h **** + 469:Drivers/CMSIS/Include/cmsis_gcc.h **** + 470:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 471:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 472:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Base Priority (non-secure) + 473:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the non-secure Base Priority register when in secure state. + 474:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Base Priority register value + 475:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 476:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) + 477:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 478:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 479:Drivers/CMSIS/Include/cmsis_gcc.h **** + 480:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); + 481:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 482:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 483:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 484:Drivers/CMSIS/Include/cmsis_gcc.h **** + 485:Drivers/CMSIS/Include/cmsis_gcc.h **** + 486:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 487:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Base Priority + 488:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Base Priority register. + 489:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] basePri Base Priority value to set + 490:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 491:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) + 492:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 493:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); + 494:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 495:Drivers/CMSIS/Include/cmsis_gcc.h **** + 496:Drivers/CMSIS/Include/cmsis_gcc.h **** + ARM GAS /tmp/ccPJu8Ry.s page 41 + + + 497:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 498:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 499:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Base Priority (non-secure) + 500:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the non-secure Base Priority register when in secure state. + 501:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] basePri Base Priority value to set + 502:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 503:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) + 504:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 505:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); + 506:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 507:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 508:Drivers/CMSIS/Include/cmsis_gcc.h **** + 509:Drivers/CMSIS/Include/cmsis_gcc.h **** + 510:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 511:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Base Priority with condition + 512:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Base Priority register only if BASEPRI masking is disable + 513:Drivers/CMSIS/Include/cmsis_gcc.h **** or the new value increases the BASEPRI priority level. + 514:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] basePri Base Priority value to set + 515:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 516:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) + 517:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 518:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); + 519:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 520:Drivers/CMSIS/Include/cmsis_gcc.h **** + 521:Drivers/CMSIS/Include/cmsis_gcc.h **** + 522:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 523:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Fault Mask + 524:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the Fault Mask register. + 525:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Fault Mask register value + 526:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 527:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) + 528:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 529:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 530:Drivers/CMSIS/Include/cmsis_gcc.h **** + 531:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + 532:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 533:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 534:Drivers/CMSIS/Include/cmsis_gcc.h **** + 535:Drivers/CMSIS/Include/cmsis_gcc.h **** + 536:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 537:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 538:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Fault Mask (non-secure) + 539:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the non-secure Fault Mask register when in secure state. + 540:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Fault Mask register value + 541:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 542:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) + 543:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 544:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 545:Drivers/CMSIS/Include/cmsis_gcc.h **** + 546:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); + 547:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 548:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 549:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 550:Drivers/CMSIS/Include/cmsis_gcc.h **** + 551:Drivers/CMSIS/Include/cmsis_gcc.h **** + 552:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 553:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Fault Mask + ARM GAS /tmp/ccPJu8Ry.s page 42 + + + 554:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Fault Mask register. + 555:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] faultMask Fault Mask value to set + 556:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 557:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) + 558:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 559:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); + 560:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 561:Drivers/CMSIS/Include/cmsis_gcc.h **** + 562:Drivers/CMSIS/Include/cmsis_gcc.h **** + 563:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 564:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 565:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Fault Mask (non-secure) + 566:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the non-secure Fault Mask register when in secure state. + 567:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] faultMask Fault Mask value to set + 568:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 569:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) + 570:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 571:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); + 572:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 573:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 574:Drivers/CMSIS/Include/cmsis_gcc.h **** + 575:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + 576:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + 577:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + 578:Drivers/CMSIS/Include/cmsis_gcc.h **** + 579:Drivers/CMSIS/Include/cmsis_gcc.h **** + 580:Drivers/CMSIS/Include/cmsis_gcc.h **** #if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + 581:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + 582:Drivers/CMSIS/Include/cmsis_gcc.h **** + 583:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 584:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Process Stack Pointer Limit + 585:Drivers/CMSIS/Include/cmsis_gcc.h **** Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + 586:Drivers/CMSIS/Include/cmsis_gcc.h **** Stack Pointer Limit register hence zero is returned always in non-secure + 587:Drivers/CMSIS/Include/cmsis_gcc.h **** mode. + 588:Drivers/CMSIS/Include/cmsis_gcc.h **** + 589:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). + 590:Drivers/CMSIS/Include/cmsis_gcc.h **** \return PSPLIM Register value + 591:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 592:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) + 593:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 594:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + 595:Drivers/CMSIS/Include/cmsis_gcc.h **** (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + 596:Drivers/CMSIS/Include/cmsis_gcc.h **** // without main extensions, the non-secure PSPLIM is RAZ/WI + 597:Drivers/CMSIS/Include/cmsis_gcc.h **** return 0U; + 598:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 599:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 600:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, psplim" : "=r" (result) ); + 601:Drivers/CMSIS/Include/cmsis_gcc.h **** return result; + 602:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 603:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 604:Drivers/CMSIS/Include/cmsis_gcc.h **** + 605:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)) + 606:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 607:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Process Stack Pointer Limit (non-secure) + 608:Drivers/CMSIS/Include/cmsis_gcc.h **** Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + 609:Drivers/CMSIS/Include/cmsis_gcc.h **** Stack Pointer Limit register hence zero is returned always. + 610:Drivers/CMSIS/Include/cmsis_gcc.h **** + ARM GAS /tmp/ccPJu8Ry.s page 43 + + + 611:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in + 612:Drivers/CMSIS/Include/cmsis_gcc.h **** \return PSPLIM Register value + 613:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 614:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) + 615:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 616:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + 617:Drivers/CMSIS/Include/cmsis_gcc.h **** // without main extensions, the non-secure PSPLIM is RAZ/WI + 618:Drivers/CMSIS/Include/cmsis_gcc.h **** return 0U; + 619:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 620:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 621:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); + 622:Drivers/CMSIS/Include/cmsis_gcc.h **** return result; + 623:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 624:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 625:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 626:Drivers/CMSIS/Include/cmsis_gcc.h **** + 627:Drivers/CMSIS/Include/cmsis_gcc.h **** + 628:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 629:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Process Stack Pointer Limit + 630:Drivers/CMSIS/Include/cmsis_gcc.h **** Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + 631:Drivers/CMSIS/Include/cmsis_gcc.h **** Stack Pointer Limit register hence the write is silently ignored in non-secure + 632:Drivers/CMSIS/Include/cmsis_gcc.h **** mode. + 633:Drivers/CMSIS/Include/cmsis_gcc.h **** + 634:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). + 635:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + 636:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 637:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) + 638:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 639:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + 640:Drivers/CMSIS/Include/cmsis_gcc.h **** (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + 641:Drivers/CMSIS/Include/cmsis_gcc.h **** // without main extensions, the non-secure PSPLIM is RAZ/WI + 642:Drivers/CMSIS/Include/cmsis_gcc.h **** (void)ProcStackPtrLimit; + 643:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 644:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); + 645:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 646:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 647:Drivers/CMSIS/Include/cmsis_gcc.h **** + 648:Drivers/CMSIS/Include/cmsis_gcc.h **** + 649:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 650:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 651:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Process Stack Pointer (non-secure) + 652:Drivers/CMSIS/Include/cmsis_gcc.h **** Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + 653:Drivers/CMSIS/Include/cmsis_gcc.h **** Stack Pointer Limit register hence the write is silently ignored. + 654:Drivers/CMSIS/Include/cmsis_gcc.h **** + 655:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in s + 656:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + 657:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 658:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) + 659:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 660:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + 661:Drivers/CMSIS/Include/cmsis_gcc.h **** // without main extensions, the non-secure PSPLIM is RAZ/WI + 662:Drivers/CMSIS/Include/cmsis_gcc.h **** (void)ProcStackPtrLimit; + 663:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 664:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); + 665:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 666:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 667:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + ARM GAS /tmp/ccPJu8Ry.s page 44 + + + 668:Drivers/CMSIS/Include/cmsis_gcc.h **** + 669:Drivers/CMSIS/Include/cmsis_gcc.h **** + 670:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 671:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Main Stack Pointer Limit + 672:Drivers/CMSIS/Include/cmsis_gcc.h **** Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + 673:Drivers/CMSIS/Include/cmsis_gcc.h **** Stack Pointer Limit register hence zero is returned always in non-secure + 674:Drivers/CMSIS/Include/cmsis_gcc.h **** mode. + 675:Drivers/CMSIS/Include/cmsis_gcc.h **** + 676:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). + 677:Drivers/CMSIS/Include/cmsis_gcc.h **** \return MSPLIM Register value + 678:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 679:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) + 680:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 681:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + 682:Drivers/CMSIS/Include/cmsis_gcc.h **** (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + 683:Drivers/CMSIS/Include/cmsis_gcc.h **** // without main extensions, the non-secure MSPLIM is RAZ/WI + 684:Drivers/CMSIS/Include/cmsis_gcc.h **** return 0U; + 685:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 686:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 687:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, msplim" : "=r" (result) ); + 688:Drivers/CMSIS/Include/cmsis_gcc.h **** return result; + 689:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 690:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 691:Drivers/CMSIS/Include/cmsis_gcc.h **** + 692:Drivers/CMSIS/Include/cmsis_gcc.h **** + 693:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 694:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 695:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Main Stack Pointer Limit (non-secure) + 696:Drivers/CMSIS/Include/cmsis_gcc.h **** Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + 697:Drivers/CMSIS/Include/cmsis_gcc.h **** Stack Pointer Limit register hence zero is returned always. + 698:Drivers/CMSIS/Include/cmsis_gcc.h **** + 699:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in sec + 700:Drivers/CMSIS/Include/cmsis_gcc.h **** \return MSPLIM Register value + 701:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 702:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) + 703:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 704:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + 705:Drivers/CMSIS/Include/cmsis_gcc.h **** // without main extensions, the non-secure MSPLIM is RAZ/WI + 706:Drivers/CMSIS/Include/cmsis_gcc.h **** return 0U; + 707:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 708:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 709:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); + 710:Drivers/CMSIS/Include/cmsis_gcc.h **** return result; + 711:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 712:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 713:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 714:Drivers/CMSIS/Include/cmsis_gcc.h **** + 715:Drivers/CMSIS/Include/cmsis_gcc.h **** + 716:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 717:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Main Stack Pointer Limit + 718:Drivers/CMSIS/Include/cmsis_gcc.h **** Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + 719:Drivers/CMSIS/Include/cmsis_gcc.h **** Stack Pointer Limit register hence the write is silently ignored in non-secure + 720:Drivers/CMSIS/Include/cmsis_gcc.h **** mode. + 721:Drivers/CMSIS/Include/cmsis_gcc.h **** + 722:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). + 723:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set + 724:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + ARM GAS /tmp/ccPJu8Ry.s page 45 + + + 725:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) + 726:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 727:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + 728:Drivers/CMSIS/Include/cmsis_gcc.h **** (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + 729:Drivers/CMSIS/Include/cmsis_gcc.h **** // without main extensions, the non-secure MSPLIM is RAZ/WI + 730:Drivers/CMSIS/Include/cmsis_gcc.h **** (void)MainStackPtrLimit; + 731:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 732:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); + 733:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 734:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 735:Drivers/CMSIS/Include/cmsis_gcc.h **** + 736:Drivers/CMSIS/Include/cmsis_gcc.h **** + 737:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 738:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 739:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Main Stack Pointer Limit (non-secure) + 740:Drivers/CMSIS/Include/cmsis_gcc.h **** Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + 741:Drivers/CMSIS/Include/cmsis_gcc.h **** Stack Pointer Limit register hence the write is silently ignored. + 742:Drivers/CMSIS/Include/cmsis_gcc.h **** + 743:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secu + 744:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] MainStackPtrLimit Main Stack Pointer value to set + 745:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 746:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) + 747:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 748:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + 749:Drivers/CMSIS/Include/cmsis_gcc.h **** // without main extensions, the non-secure MSPLIM is RAZ/WI + 750:Drivers/CMSIS/Include/cmsis_gcc.h **** (void)MainStackPtrLimit; + 751:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 752:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); + 753:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 754:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 755:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 756:Drivers/CMSIS/Include/cmsis_gcc.h **** + 757:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + 758:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + 759:Drivers/CMSIS/Include/cmsis_gcc.h **** + 760:Drivers/CMSIS/Include/cmsis_gcc.h **** + 761:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 762:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get FPSCR + 763:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the Floating Point Status/Control register. + 764:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Floating Point Status/Control register value + 765:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 766:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_FPSCR(void) + 767:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 768:Drivers/CMSIS/Include/cmsis_gcc.h **** #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + 769:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + 770:Drivers/CMSIS/Include/cmsis_gcc.h **** #if __has_builtin(__builtin_arm_get_fpscr) + 771:Drivers/CMSIS/Include/cmsis_gcc.h **** // Re-enable using built-in when GCC has been fixed + 772:Drivers/CMSIS/Include/cmsis_gcc.h **** // || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) + 773:Drivers/CMSIS/Include/cmsis_gcc.h **** /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ + 774:Drivers/CMSIS/Include/cmsis_gcc.h **** return __builtin_arm_get_fpscr(); + 775:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 776:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 777:Drivers/CMSIS/Include/cmsis_gcc.h **** + 778:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); + 779:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 780:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 781:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + ARM GAS /tmp/ccPJu8Ry.s page 46 + + + 782:Drivers/CMSIS/Include/cmsis_gcc.h **** return(0U); + 783:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 784:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 785:Drivers/CMSIS/Include/cmsis_gcc.h **** + 786:Drivers/CMSIS/Include/cmsis_gcc.h **** + 787:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 788:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set FPSCR + 789:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Floating Point Status/Control register. + 790:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] fpscr Floating Point Status/Control value to set + 791:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 792:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_FPSCR(uint32_t fpscr) + 793:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 794:Drivers/CMSIS/Include/cmsis_gcc.h **** #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + 795:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + 796:Drivers/CMSIS/Include/cmsis_gcc.h **** #if __has_builtin(__builtin_arm_set_fpscr) + 797:Drivers/CMSIS/Include/cmsis_gcc.h **** // Re-enable using built-in when GCC has been fixed + 798:Drivers/CMSIS/Include/cmsis_gcc.h **** // || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) + 799:Drivers/CMSIS/Include/cmsis_gcc.h **** /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ + 800:Drivers/CMSIS/Include/cmsis_gcc.h **** __builtin_arm_set_fpscr(fpscr); + 801:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 802:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc", "memory"); + 803:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 804:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 805:Drivers/CMSIS/Include/cmsis_gcc.h **** (void)fpscr; + 806:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 807:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 808:Drivers/CMSIS/Include/cmsis_gcc.h **** + 809:Drivers/CMSIS/Include/cmsis_gcc.h **** + 810:Drivers/CMSIS/Include/cmsis_gcc.h **** /*@} end of CMSIS_Core_RegAccFunctions */ + 811:Drivers/CMSIS/Include/cmsis_gcc.h **** + 812:Drivers/CMSIS/Include/cmsis_gcc.h **** + 813:Drivers/CMSIS/Include/cmsis_gcc.h **** /* ########################## Core Instruction Access ######################### */ + 814:Drivers/CMSIS/Include/cmsis_gcc.h **** /** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + 815:Drivers/CMSIS/Include/cmsis_gcc.h **** Access to dedicated instructions + 816:Drivers/CMSIS/Include/cmsis_gcc.h **** @{ + 817:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 818:Drivers/CMSIS/Include/cmsis_gcc.h **** + 819:Drivers/CMSIS/Include/cmsis_gcc.h **** /* Define macros for porting to both thumb1 and thumb2. + 820:Drivers/CMSIS/Include/cmsis_gcc.h **** * For thumb1, use low register (r0-r7), specified by constraint "l" + 821:Drivers/CMSIS/Include/cmsis_gcc.h **** * Otherwise, use general registers, specified by constraint "r" */ + 822:Drivers/CMSIS/Include/cmsis_gcc.h **** #if defined (__thumb__) && !defined (__thumb2__) + 823:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __CMSIS_GCC_OUT_REG(r) "=l" (r) + 824:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __CMSIS_GCC_RW_REG(r) "+l" (r) + 825:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __CMSIS_GCC_USE_REG(r) "l" (r) + 826:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 827:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __CMSIS_GCC_OUT_REG(r) "=r" (r) + 828:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __CMSIS_GCC_RW_REG(r) "+r" (r) + 829:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __CMSIS_GCC_USE_REG(r) "r" (r) + 830:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 831:Drivers/CMSIS/Include/cmsis_gcc.h **** + 832:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 833:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief No Operation + 834:Drivers/CMSIS/Include/cmsis_gcc.h **** \details No Operation does nothing. This instruction can be used for code alignment purposes. + 835:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 836:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __NOP() __ASM volatile ("nop") + 837:Drivers/CMSIS/Include/cmsis_gcc.h **** + 838:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + ARM GAS /tmp/ccPJu8Ry.s page 47 + + + 839:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Wait For Interrupt + 840:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Wait For Interrupt is a hint instruction that suspends execution until one of a number o + 841:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 842:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __WFI() __ASM volatile ("wfi") + 843:Drivers/CMSIS/Include/cmsis_gcc.h **** + 844:Drivers/CMSIS/Include/cmsis_gcc.h **** + 845:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 846:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Wait For Event + 847:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Wait For Event is a hint instruction that permits the processor to enter + 848:Drivers/CMSIS/Include/cmsis_gcc.h **** a low-power state until one of a number of events occurs. + 849:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 850:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __WFE() __ASM volatile ("wfe") + 851:Drivers/CMSIS/Include/cmsis_gcc.h **** + 852:Drivers/CMSIS/Include/cmsis_gcc.h **** + 853:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 854:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Send Event + 855:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + 856:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 857:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __SEV() __ASM volatile ("sev") + 858:Drivers/CMSIS/Include/cmsis_gcc.h **** + 859:Drivers/CMSIS/Include/cmsis_gcc.h **** + 860:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 861:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Instruction Synchronization Barrier + 862:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Instruction Synchronization Barrier flushes the pipeline in the processor, + 863:Drivers/CMSIS/Include/cmsis_gcc.h **** so that all instructions following the ISB are fetched from cache or memory, + 864:Drivers/CMSIS/Include/cmsis_gcc.h **** after the instruction has been completed. + 865:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 866:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __ISB(void) + 867:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 868:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("isb 0xF":::"memory"); + 869:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 870:Drivers/CMSIS/Include/cmsis_gcc.h **** + 871:Drivers/CMSIS/Include/cmsis_gcc.h **** + 872:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 873:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Data Synchronization Barrier + 874:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Acts as a special kind of Data Memory Barrier. + 875:Drivers/CMSIS/Include/cmsis_gcc.h **** It completes when all explicit memory accesses before this instruction complete. + 876:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 877:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __DSB(void) + 57 .loc 3 877 27 view .LVU10 + 58 .LBB33: + 878:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 879:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("dsb 0xF":::"memory"); + 59 .loc 3 879 3 view .LVU11 + 60 .syntax unified + 61 @ 879 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 62 0016 BFF34F8F dsb 0xF + 63 @ 0 "" 2 + 64 .thumb + 65 .syntax unified + 66 .LBE33: + 67 .LBE32: +1730:Drivers/CMSIS/Include/core_cm4.h **** __ISB(); + 68 .loc 2 1730 5 view .LVU12 + 69 .LBB34: + 70 .LBI34: + 866:Drivers/CMSIS/Include/cmsis_gcc.h **** { + ARM GAS /tmp/ccPJu8Ry.s page 48 + + + 71 .loc 3 866 27 view .LVU13 + 72 .LBB35: + 868:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 73 .loc 3 868 3 view .LVU14 + 74 .syntax unified + 75 @ 868 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 76 001a BFF36F8F isb 0xF + 77 @ 0 "" 2 + 78 .thumb + 79 .syntax unified + 80 .L1: + 81 .LBE35: + 82 .LBE34: +1731:Drivers/CMSIS/Include/core_cm4.h **** } +1732:Drivers/CMSIS/Include/core_cm4.h **** } + 83 .loc 2 1732 1 is_stmt 0 view .LVU15 + 84 001e 7047 bx lr + 85 .L4: + 86 .align 2 + 87 .L3: + 88 0020 00E100E0 .word -536813312 + 89 .cfi_endproc + 90 .LFE106: + 92 .section .text.__NVIC_SetPriority,"ax",%progbits + 93 .align 1 + 94 .syntax unified + 95 .thumb + 96 .thumb_func + 98 __NVIC_SetPriority: + 99 .LVL2: + 100 .LFB111: +1733:Drivers/CMSIS/Include/core_cm4.h **** +1734:Drivers/CMSIS/Include/core_cm4.h **** +1735:Drivers/CMSIS/Include/core_cm4.h **** /** +1736:Drivers/CMSIS/Include/core_cm4.h **** \brief Get Pending Interrupt +1737:Drivers/CMSIS/Include/core_cm4.h **** \details Reads the NVIC pending register and returns the pending bit for the specified device spe +1738:Drivers/CMSIS/Include/core_cm4.h **** \param [in] IRQn Device specific interrupt number. +1739:Drivers/CMSIS/Include/core_cm4.h **** \return 0 Interrupt status is not pending. +1740:Drivers/CMSIS/Include/core_cm4.h **** \return 1 Interrupt status is pending. +1741:Drivers/CMSIS/Include/core_cm4.h **** \note IRQn must not be negative. +1742:Drivers/CMSIS/Include/core_cm4.h **** */ +1743:Drivers/CMSIS/Include/core_cm4.h **** __STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +1744:Drivers/CMSIS/Include/core_cm4.h **** { +1745:Drivers/CMSIS/Include/core_cm4.h **** if ((int32_t)(IRQn) >= 0) +1746:Drivers/CMSIS/Include/core_cm4.h **** { +1747:Drivers/CMSIS/Include/core_cm4.h **** return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL) +1748:Drivers/CMSIS/Include/core_cm4.h **** } +1749:Drivers/CMSIS/Include/core_cm4.h **** else +1750:Drivers/CMSIS/Include/core_cm4.h **** { +1751:Drivers/CMSIS/Include/core_cm4.h **** return(0U); +1752:Drivers/CMSIS/Include/core_cm4.h **** } +1753:Drivers/CMSIS/Include/core_cm4.h **** } +1754:Drivers/CMSIS/Include/core_cm4.h **** +1755:Drivers/CMSIS/Include/core_cm4.h **** +1756:Drivers/CMSIS/Include/core_cm4.h **** /** +1757:Drivers/CMSIS/Include/core_cm4.h **** \brief Set Pending Interrupt +1758:Drivers/CMSIS/Include/core_cm4.h **** \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + ARM GAS /tmp/ccPJu8Ry.s page 49 + + +1759:Drivers/CMSIS/Include/core_cm4.h **** \param [in] IRQn Device specific interrupt number. +1760:Drivers/CMSIS/Include/core_cm4.h **** \note IRQn must not be negative. +1761:Drivers/CMSIS/Include/core_cm4.h **** */ +1762:Drivers/CMSIS/Include/core_cm4.h **** __STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +1763:Drivers/CMSIS/Include/core_cm4.h **** { +1764:Drivers/CMSIS/Include/core_cm4.h **** if ((int32_t)(IRQn) >= 0) +1765:Drivers/CMSIS/Include/core_cm4.h **** { +1766:Drivers/CMSIS/Include/core_cm4.h **** NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); +1767:Drivers/CMSIS/Include/core_cm4.h **** } +1768:Drivers/CMSIS/Include/core_cm4.h **** } +1769:Drivers/CMSIS/Include/core_cm4.h **** +1770:Drivers/CMSIS/Include/core_cm4.h **** +1771:Drivers/CMSIS/Include/core_cm4.h **** /** +1772:Drivers/CMSIS/Include/core_cm4.h **** \brief Clear Pending Interrupt +1773:Drivers/CMSIS/Include/core_cm4.h **** \details Clears the pending bit of a device specific interrupt in the NVIC pending register. +1774:Drivers/CMSIS/Include/core_cm4.h **** \param [in] IRQn Device specific interrupt number. +1775:Drivers/CMSIS/Include/core_cm4.h **** \note IRQn must not be negative. +1776:Drivers/CMSIS/Include/core_cm4.h **** */ +1777:Drivers/CMSIS/Include/core_cm4.h **** __STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +1778:Drivers/CMSIS/Include/core_cm4.h **** { +1779:Drivers/CMSIS/Include/core_cm4.h **** if ((int32_t)(IRQn) >= 0) +1780:Drivers/CMSIS/Include/core_cm4.h **** { +1781:Drivers/CMSIS/Include/core_cm4.h **** NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); +1782:Drivers/CMSIS/Include/core_cm4.h **** } +1783:Drivers/CMSIS/Include/core_cm4.h **** } +1784:Drivers/CMSIS/Include/core_cm4.h **** +1785:Drivers/CMSIS/Include/core_cm4.h **** +1786:Drivers/CMSIS/Include/core_cm4.h **** /** +1787:Drivers/CMSIS/Include/core_cm4.h **** \brief Get Active Interrupt +1788:Drivers/CMSIS/Include/core_cm4.h **** \details Reads the active register in the NVIC and returns the active bit for the device specific +1789:Drivers/CMSIS/Include/core_cm4.h **** \param [in] IRQn Device specific interrupt number. +1790:Drivers/CMSIS/Include/core_cm4.h **** \return 0 Interrupt status is not active. +1791:Drivers/CMSIS/Include/core_cm4.h **** \return 1 Interrupt status is active. +1792:Drivers/CMSIS/Include/core_cm4.h **** \note IRQn must not be negative. +1793:Drivers/CMSIS/Include/core_cm4.h **** */ +1794:Drivers/CMSIS/Include/core_cm4.h **** __STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +1795:Drivers/CMSIS/Include/core_cm4.h **** { +1796:Drivers/CMSIS/Include/core_cm4.h **** if ((int32_t)(IRQn) >= 0) +1797:Drivers/CMSIS/Include/core_cm4.h **** { +1798:Drivers/CMSIS/Include/core_cm4.h **** return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL) +1799:Drivers/CMSIS/Include/core_cm4.h **** } +1800:Drivers/CMSIS/Include/core_cm4.h **** else +1801:Drivers/CMSIS/Include/core_cm4.h **** { +1802:Drivers/CMSIS/Include/core_cm4.h **** return(0U); +1803:Drivers/CMSIS/Include/core_cm4.h **** } +1804:Drivers/CMSIS/Include/core_cm4.h **** } +1805:Drivers/CMSIS/Include/core_cm4.h **** +1806:Drivers/CMSIS/Include/core_cm4.h **** +1807:Drivers/CMSIS/Include/core_cm4.h **** /** +1808:Drivers/CMSIS/Include/core_cm4.h **** \brief Set Interrupt Priority +1809:Drivers/CMSIS/Include/core_cm4.h **** \details Sets the priority of a device specific interrupt or a processor exception. +1810:Drivers/CMSIS/Include/core_cm4.h **** The interrupt number can be positive to specify a device specific interrupt, +1811:Drivers/CMSIS/Include/core_cm4.h **** or negative to specify a processor exception. +1812:Drivers/CMSIS/Include/core_cm4.h **** \param [in] IRQn Interrupt number. +1813:Drivers/CMSIS/Include/core_cm4.h **** \param [in] priority Priority to set. +1814:Drivers/CMSIS/Include/core_cm4.h **** \note The priority cannot be set for every processor exception. +1815:Drivers/CMSIS/Include/core_cm4.h **** */ + ARM GAS /tmp/ccPJu8Ry.s page 50 + + +1816:Drivers/CMSIS/Include/core_cm4.h **** __STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +1817:Drivers/CMSIS/Include/core_cm4.h **** { + 101 .loc 2 1817 1 is_stmt 1 view -0 + 102 .cfi_startproc + 103 @ args = 0, pretend = 0, frame = 0 + 104 @ frame_needed = 0, uses_anonymous_args = 0 + 105 @ link register save eliminated. +1818:Drivers/CMSIS/Include/core_cm4.h **** if ((int32_t)(IRQn) >= 0) + 106 .loc 2 1818 3 view .LVU17 + 107 .loc 2 1818 6 is_stmt 0 view .LVU18 + 108 0000 0028 cmp r0, #0 + 109 .LVL3: + 110 .loc 2 1818 6 view .LVU19 + 111 0002 08DB blt .L6 +1819:Drivers/CMSIS/Include/core_cm4.h **** { +1820:Drivers/CMSIS/Include/core_cm4.h **** NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (u + 112 .loc 2 1820 5 is_stmt 1 view .LVU20 + 113 .loc 2 1820 48 is_stmt 0 view .LVU21 + 114 0004 0901 lsls r1, r1, #4 + 115 .LVL4: + 116 .loc 2 1820 48 view .LVU22 + 117 0006 C9B2 uxtb r1, r1 + 118 .loc 2 1820 46 view .LVU23 + 119 0008 00F16040 add r0, r0, #-536870912 + 120 000c 00F56140 add r0, r0, #57600 + 121 0010 80F80013 strb r1, [r0, #768] + 122 0014 7047 bx lr + 123 .LVL5: + 124 .L6: +1821:Drivers/CMSIS/Include/core_cm4.h **** } +1822:Drivers/CMSIS/Include/core_cm4.h **** else +1823:Drivers/CMSIS/Include/core_cm4.h **** { +1824:Drivers/CMSIS/Include/core_cm4.h **** SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (u + 125 .loc 2 1824 5 is_stmt 1 view .LVU24 + 126 .loc 2 1824 32 is_stmt 0 view .LVU25 + 127 0016 00F00F00 and r0, r0, #15 + 128 .loc 2 1824 48 view .LVU26 + 129 001a 0901 lsls r1, r1, #4 + 130 .LVL6: + 131 .loc 2 1824 48 view .LVU27 + 132 001c C9B2 uxtb r1, r1 + 133 .loc 2 1824 46 view .LVU28 + 134 001e 014B ldr r3, .L8 + 135 0020 1954 strb r1, [r3, r0] +1825:Drivers/CMSIS/Include/core_cm4.h **** } +1826:Drivers/CMSIS/Include/core_cm4.h **** } + 136 .loc 2 1826 1 view .LVU29 + 137 0022 7047 bx lr + 138 .L9: + 139 .align 2 + 140 .L8: + 141 0024 14ED00E0 .word -536810220 + 142 .cfi_endproc + 143 .LFE111: + 145 .section .text.__NVIC_GetPriority,"ax",%progbits + 146 .align 1 + 147 .syntax unified + ARM GAS /tmp/ccPJu8Ry.s page 51 + + + 148 .thumb + 149 .thumb_func + 151 __NVIC_GetPriority: + 152 .LVL7: + 153 .LFB112: +1827:Drivers/CMSIS/Include/core_cm4.h **** +1828:Drivers/CMSIS/Include/core_cm4.h **** +1829:Drivers/CMSIS/Include/core_cm4.h **** /** +1830:Drivers/CMSIS/Include/core_cm4.h **** \brief Get Interrupt Priority +1831:Drivers/CMSIS/Include/core_cm4.h **** \details Reads the priority of a device specific interrupt or a processor exception. +1832:Drivers/CMSIS/Include/core_cm4.h **** The interrupt number can be positive to specify a device specific interrupt, +1833:Drivers/CMSIS/Include/core_cm4.h **** or negative to specify a processor exception. +1834:Drivers/CMSIS/Include/core_cm4.h **** \param [in] IRQn Interrupt number. +1835:Drivers/CMSIS/Include/core_cm4.h **** \return Interrupt Priority. +1836:Drivers/CMSIS/Include/core_cm4.h **** Value is aligned automatically to the implemented priority bits of the microc +1837:Drivers/CMSIS/Include/core_cm4.h **** */ +1838:Drivers/CMSIS/Include/core_cm4.h **** __STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +1839:Drivers/CMSIS/Include/core_cm4.h **** { + 154 .loc 2 1839 1 is_stmt 1 view -0 + 155 .cfi_startproc + 156 @ args = 0, pretend = 0, frame = 0 + 157 @ frame_needed = 0, uses_anonymous_args = 0 + 158 @ link register save eliminated. +1840:Drivers/CMSIS/Include/core_cm4.h **** +1841:Drivers/CMSIS/Include/core_cm4.h **** if ((int32_t)(IRQn) >= 0) + 159 .loc 2 1841 3 view .LVU31 + 160 .loc 2 1841 6 is_stmt 0 view .LVU32 + 161 0000 0028 cmp r0, #0 + 162 .LVL8: + 163 .loc 2 1841 6 view .LVU33 + 164 0002 07DB blt .L11 +1842:Drivers/CMSIS/Include/core_cm4.h **** { +1843:Drivers/CMSIS/Include/core_cm4.h **** return(((uint32_t)NVIC->IP[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + 165 .loc 2 1843 5 is_stmt 1 view .LVU34 + 166 .loc 2 1843 31 is_stmt 0 view .LVU35 + 167 0004 00F16040 add r0, r0, #-536870912 + 168 0008 00F56140 add r0, r0, #57600 + 169 000c 90F80003 ldrb r0, [r0, #768] @ zero_extendqisi2 + 170 .loc 2 1843 64 view .LVU36 + 171 0010 0009 lsrs r0, r0, #4 + 172 0012 7047 bx lr + 173 .L11: +1844:Drivers/CMSIS/Include/core_cm4.h **** } +1845:Drivers/CMSIS/Include/core_cm4.h **** else +1846:Drivers/CMSIS/Include/core_cm4.h **** { +1847:Drivers/CMSIS/Include/core_cm4.h **** return(((uint32_t)SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + 174 .loc 2 1847 5 is_stmt 1 view .LVU37 + 175 .loc 2 1847 50 is_stmt 0 view .LVU38 + 176 0014 00F00F00 and r0, r0, #15 + 177 .loc 2 1847 31 view .LVU39 + 178 0018 014B ldr r3, .L13 + 179 001a 185C ldrb r0, [r3, r0] @ zero_extendqisi2 + 180 .loc 2 1847 64 view .LVU40 + 181 001c 0009 lsrs r0, r0, #4 +1848:Drivers/CMSIS/Include/core_cm4.h **** } +1849:Drivers/CMSIS/Include/core_cm4.h **** } + 182 .loc 2 1849 1 view .LVU41 + ARM GAS /tmp/ccPJu8Ry.s page 52 + + + 183 001e 7047 bx lr + 184 .L14: + 185 .align 2 + 186 .L13: + 187 0020 14ED00E0 .word -536810220 + 188 .cfi_endproc + 189 .LFE112: + 191 .section .text.NVIC_EncodePriority,"ax",%progbits + 192 .align 1 + 193 .syntax unified + 194 .thumb + 195 .thumb_func + 197 NVIC_EncodePriority: + 198 .LVL9: + 199 .LFB113: +1850:Drivers/CMSIS/Include/core_cm4.h **** +1851:Drivers/CMSIS/Include/core_cm4.h **** +1852:Drivers/CMSIS/Include/core_cm4.h **** /** +1853:Drivers/CMSIS/Include/core_cm4.h **** \brief Encode Priority +1854:Drivers/CMSIS/Include/core_cm4.h **** \details Encodes the priority for an interrupt with the given priority group, +1855:Drivers/CMSIS/Include/core_cm4.h **** preemptive priority value, and subpriority value. +1856:Drivers/CMSIS/Include/core_cm4.h **** In case of a conflict between priority grouping and available +1857:Drivers/CMSIS/Include/core_cm4.h **** priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. +1858:Drivers/CMSIS/Include/core_cm4.h **** \param [in] PriorityGroup Used priority group. +1859:Drivers/CMSIS/Include/core_cm4.h **** \param [in] PreemptPriority Preemptive priority value (starting from 0). +1860:Drivers/CMSIS/Include/core_cm4.h **** \param [in] SubPriority Subpriority value (starting from 0). +1861:Drivers/CMSIS/Include/core_cm4.h **** \return Encoded priority. Value can be used in the function \ref NVIC_SetP +1862:Drivers/CMSIS/Include/core_cm4.h **** */ +1863:Drivers/CMSIS/Include/core_cm4.h **** __STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uin +1864:Drivers/CMSIS/Include/core_cm4.h **** { + 200 .loc 2 1864 1 is_stmt 1 view -0 + 201 .cfi_startproc + 202 @ args = 0, pretend = 0, frame = 0 + 203 @ frame_needed = 0, uses_anonymous_args = 0 + 204 .loc 2 1864 1 is_stmt 0 view .LVU43 + 205 0000 00B5 push {lr} + 206 .cfi_def_cfa_offset 4 + 207 .cfi_offset 14, -4 +1865:Drivers/CMSIS/Include/core_cm4.h **** uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used + 208 .loc 2 1865 3 is_stmt 1 view .LVU44 + 209 .loc 2 1865 12 is_stmt 0 view .LVU45 + 210 0002 00F00700 and r0, r0, #7 + 211 .LVL10: +1866:Drivers/CMSIS/Include/core_cm4.h **** uint32_t PreemptPriorityBits; + 212 .loc 2 1866 3 is_stmt 1 view .LVU46 +1867:Drivers/CMSIS/Include/core_cm4.h **** uint32_t SubPriorityBits; + 213 .loc 2 1867 3 view .LVU47 +1868:Drivers/CMSIS/Include/core_cm4.h **** +1869:Drivers/CMSIS/Include/core_cm4.h **** PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NV + 214 .loc 2 1869 3 view .LVU48 + 215 .loc 2 1869 31 is_stmt 0 view .LVU49 + 216 0006 C0F1070C rsb ip, r0, #7 + 217 .loc 2 1869 23 view .LVU50 + 218 000a BCF1040F cmp ip, #4 + 219 000e 28BF it cs + 220 0010 4FF0040C movcs ip, #4 + 221 .LVL11: + ARM GAS /tmp/ccPJu8Ry.s page 53 + + +1870:Drivers/CMSIS/Include/core_cm4.h **** SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint + 222 .loc 2 1870 3 is_stmt 1 view .LVU51 + 223 .loc 2 1870 44 is_stmt 0 view .LVU52 + 224 0014 031D adds r3, r0, #4 + 225 .loc 2 1870 109 view .LVU53 + 226 0016 062B cmp r3, #6 + 227 0018 0FD9 bls .L17 + 228 .loc 2 1870 109 discriminator 1 view .LVU54 + 229 001a C31E subs r3, r0, #3 + 230 .L16: + 231 .LVL12: +1871:Drivers/CMSIS/Include/core_cm4.h **** +1872:Drivers/CMSIS/Include/core_cm4.h **** return ( + 232 .loc 2 1872 3 is_stmt 1 discriminator 4 view .LVU55 +1873:Drivers/CMSIS/Include/core_cm4.h **** ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits + 233 .loc 2 1873 30 is_stmt 0 discriminator 4 view .LVU56 + 234 001c 4FF0FF3E mov lr, #-1 + 235 0020 0EFA0CF0 lsl r0, lr, ip + 236 .LVL13: + 237 .loc 2 1873 30 discriminator 4 view .LVU57 + 238 0024 21EA0001 bic r1, r1, r0 + 239 .LVL14: + 240 .loc 2 1873 82 discriminator 4 view .LVU58 + 241 0028 9940 lsls r1, r1, r3 +1874:Drivers/CMSIS/Include/core_cm4.h **** ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + 242 .loc 2 1874 30 discriminator 4 view .LVU59 + 243 002a 0EFA03FE lsl lr, lr, r3 + 244 002e 22EA0E02 bic r2, r2, lr + 245 .LVL15: +1875:Drivers/CMSIS/Include/core_cm4.h **** ); +1876:Drivers/CMSIS/Include/core_cm4.h **** } + 246 .loc 2 1876 1 discriminator 4 view .LVU60 + 247 0032 41EA0200 orr r0, r1, r2 + 248 0036 5DF804FB ldr pc, [sp], #4 + 249 .LVL16: + 250 .L17: +1870:Drivers/CMSIS/Include/core_cm4.h **** + 251 .loc 2 1870 109 view .LVU61 + 252 003a 0023 movs r3, #0 + 253 003c EEE7 b .L16 + 254 .cfi_endproc + 255 .LFE113: + 257 .section .text.NVIC_DecodePriority,"ax",%progbits + 258 .align 1 + 259 .syntax unified + 260 .thumb + 261 .thumb_func + 263 NVIC_DecodePriority: + 264 .LVL17: + 265 .LFB114: +1877:Drivers/CMSIS/Include/core_cm4.h **** +1878:Drivers/CMSIS/Include/core_cm4.h **** +1879:Drivers/CMSIS/Include/core_cm4.h **** /** +1880:Drivers/CMSIS/Include/core_cm4.h **** \brief Decode Priority +1881:Drivers/CMSIS/Include/core_cm4.h **** \details Decodes an interrupt priority value with a given priority group to +1882:Drivers/CMSIS/Include/core_cm4.h **** preemptive priority value and subpriority value. +1883:Drivers/CMSIS/Include/core_cm4.h **** In case of a conflict between priority grouping and available + ARM GAS /tmp/ccPJu8Ry.s page 54 + + +1884:Drivers/CMSIS/Include/core_cm4.h **** priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. +1885:Drivers/CMSIS/Include/core_cm4.h **** \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC +1886:Drivers/CMSIS/Include/core_cm4.h **** \param [in] PriorityGroup Used priority group. +1887:Drivers/CMSIS/Include/core_cm4.h **** \param [out] pPreemptPriority Preemptive priority value (starting from 0). +1888:Drivers/CMSIS/Include/core_cm4.h **** \param [out] pSubPriority Subpriority value (starting from 0). +1889:Drivers/CMSIS/Include/core_cm4.h **** */ +1890:Drivers/CMSIS/Include/core_cm4.h **** __STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* cons +1891:Drivers/CMSIS/Include/core_cm4.h **** { + 266 .loc 2 1891 1 is_stmt 1 view -0 + 267 .cfi_startproc + 268 @ args = 0, pretend = 0, frame = 0 + 269 @ frame_needed = 0, uses_anonymous_args = 0 + 270 .loc 2 1891 1 is_stmt 0 view .LVU63 + 271 0000 10B5 push {r4, lr} + 272 .cfi_def_cfa_offset 8 + 273 .cfi_offset 4, -8 + 274 .cfi_offset 14, -4 +1892:Drivers/CMSIS/Include/core_cm4.h **** uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used + 275 .loc 2 1892 3 is_stmt 1 view .LVU64 + 276 .loc 2 1892 12 is_stmt 0 view .LVU65 + 277 0002 01F00701 and r1, r1, #7 + 278 .LVL18: +1893:Drivers/CMSIS/Include/core_cm4.h **** uint32_t PreemptPriorityBits; + 279 .loc 2 1893 3 is_stmt 1 view .LVU66 +1894:Drivers/CMSIS/Include/core_cm4.h **** uint32_t SubPriorityBits; + 280 .loc 2 1894 3 view .LVU67 +1895:Drivers/CMSIS/Include/core_cm4.h **** +1896:Drivers/CMSIS/Include/core_cm4.h **** PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NV + 281 .loc 2 1896 3 view .LVU68 + 282 .loc 2 1896 31 is_stmt 0 view .LVU69 + 283 0006 C1F1070C rsb ip, r1, #7 + 284 .loc 2 1896 23 view .LVU70 + 285 000a BCF1040F cmp ip, #4 + 286 000e 28BF it cs + 287 0010 4FF0040C movcs ip, #4 + 288 .LVL19: +1897:Drivers/CMSIS/Include/core_cm4.h **** SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint + 289 .loc 2 1897 3 is_stmt 1 view .LVU71 + 290 .loc 2 1897 44 is_stmt 0 view .LVU72 + 291 0014 0C1D adds r4, r1, #4 + 292 .loc 2 1897 109 view .LVU73 + 293 0016 062C cmp r4, #6 + 294 0018 0FD9 bls .L21 + 295 .loc 2 1897 109 discriminator 1 view .LVU74 + 296 001a 0339 subs r1, r1, #3 + 297 .LVL20: + 298 .L20: +1898:Drivers/CMSIS/Include/core_cm4.h **** +1899:Drivers/CMSIS/Include/core_cm4.h **** *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1 + 299 .loc 2 1899 3 is_stmt 1 discriminator 4 view .LVU75 + 300 .loc 2 1899 33 is_stmt 0 discriminator 4 view .LVU76 + 301 001c 20FA01F4 lsr r4, r0, r1 + 302 .LVL21: + 303 .loc 2 1899 53 discriminator 4 view .LVU77 + 304 0020 4FF0FF3E mov lr, #-1 + 305 0024 0EFA0CFC lsl ip, lr, ip + 306 .LVL22: + ARM GAS /tmp/ccPJu8Ry.s page 55 + + + 307 .loc 2 1899 53 discriminator 4 view .LVU78 + 308 0028 24EA0C04 bic r4, r4, ip + 309 .loc 2 1899 21 discriminator 4 view .LVU79 + 310 002c 1460 str r4, [r2] +1900:Drivers/CMSIS/Include/core_cm4.h **** *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1 + 311 .loc 2 1900 3 is_stmt 1 discriminator 4 view .LVU80 + 312 .loc 2 1900 53 is_stmt 0 discriminator 4 view .LVU81 + 313 002e 0EFA01FE lsl lr, lr, r1 + 314 0032 20EA0E00 bic r0, r0, lr + 315 .LVL23: + 316 .loc 2 1900 21 discriminator 4 view .LVU82 + 317 0036 1860 str r0, [r3] +1901:Drivers/CMSIS/Include/core_cm4.h **** } + 318 .loc 2 1901 1 discriminator 4 view .LVU83 + 319 0038 10BD pop {r4, pc} + 320 .LVL24: + 321 .L21: +1897:Drivers/CMSIS/Include/core_cm4.h **** + 322 .loc 2 1897 109 view .LVU84 + 323 003a 0021 movs r1, #0 + 324 .LVL25: +1897:Drivers/CMSIS/Include/core_cm4.h **** + 325 .loc 2 1897 109 view .LVU85 + 326 003c EEE7 b .L20 + 327 .cfi_endproc + 328 .LFE114: + 330 .section .text.__NVIC_SystemReset,"ax",%progbits + 331 .align 1 + 332 .syntax unified + 333 .thumb + 334 .thumb_func + 336 __NVIC_SystemReset: + 337 .LFB117: +1902:Drivers/CMSIS/Include/core_cm4.h **** +1903:Drivers/CMSIS/Include/core_cm4.h **** +1904:Drivers/CMSIS/Include/core_cm4.h **** /** +1905:Drivers/CMSIS/Include/core_cm4.h **** \brief Set Interrupt Vector +1906:Drivers/CMSIS/Include/core_cm4.h **** \details Sets an interrupt vector in SRAM based interrupt vector table. +1907:Drivers/CMSIS/Include/core_cm4.h **** The interrupt number can be positive to specify a device specific interrupt, +1908:Drivers/CMSIS/Include/core_cm4.h **** or negative to specify a processor exception. +1909:Drivers/CMSIS/Include/core_cm4.h **** VTOR must been relocated to SRAM before. +1910:Drivers/CMSIS/Include/core_cm4.h **** \param [in] IRQn Interrupt number +1911:Drivers/CMSIS/Include/core_cm4.h **** \param [in] vector Address of interrupt handler function +1912:Drivers/CMSIS/Include/core_cm4.h **** */ +1913:Drivers/CMSIS/Include/core_cm4.h **** __STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +1914:Drivers/CMSIS/Include/core_cm4.h **** { +1915:Drivers/CMSIS/Include/core_cm4.h **** uint32_t *vectors = (uint32_t *)SCB->VTOR; +1916:Drivers/CMSIS/Include/core_cm4.h **** vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +1917:Drivers/CMSIS/Include/core_cm4.h **** } +1918:Drivers/CMSIS/Include/core_cm4.h **** +1919:Drivers/CMSIS/Include/core_cm4.h **** +1920:Drivers/CMSIS/Include/core_cm4.h **** /** +1921:Drivers/CMSIS/Include/core_cm4.h **** \brief Get Interrupt Vector +1922:Drivers/CMSIS/Include/core_cm4.h **** \details Reads an interrupt vector from interrupt vector table. +1923:Drivers/CMSIS/Include/core_cm4.h **** The interrupt number can be positive to specify a device specific interrupt, +1924:Drivers/CMSIS/Include/core_cm4.h **** or negative to specify a processor exception. +1925:Drivers/CMSIS/Include/core_cm4.h **** \param [in] IRQn Interrupt number. + ARM GAS /tmp/ccPJu8Ry.s page 56 + + +1926:Drivers/CMSIS/Include/core_cm4.h **** \return Address of interrupt handler function +1927:Drivers/CMSIS/Include/core_cm4.h **** */ +1928:Drivers/CMSIS/Include/core_cm4.h **** __STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +1929:Drivers/CMSIS/Include/core_cm4.h **** { +1930:Drivers/CMSIS/Include/core_cm4.h **** uint32_t *vectors = (uint32_t *)SCB->VTOR; +1931:Drivers/CMSIS/Include/core_cm4.h **** return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +1932:Drivers/CMSIS/Include/core_cm4.h **** } +1933:Drivers/CMSIS/Include/core_cm4.h **** +1934:Drivers/CMSIS/Include/core_cm4.h **** +1935:Drivers/CMSIS/Include/core_cm4.h **** /** +1936:Drivers/CMSIS/Include/core_cm4.h **** \brief System Reset +1937:Drivers/CMSIS/Include/core_cm4.h **** \details Initiates a system reset request to reset the MCU. +1938:Drivers/CMSIS/Include/core_cm4.h **** */ +1939:Drivers/CMSIS/Include/core_cm4.h **** __NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) +1940:Drivers/CMSIS/Include/core_cm4.h **** { + 338 .loc 2 1940 1 is_stmt 1 view -0 + 339 .cfi_startproc + 340 @ Volatile: function does not return. + 341 @ args = 0, pretend = 0, frame = 0 + 342 @ frame_needed = 0, uses_anonymous_args = 0 + 343 @ link register save eliminated. +1941:Drivers/CMSIS/Include/core_cm4.h **** __DSB(); /* Ensure all outstanding memor + 344 .loc 2 1941 3 view .LVU87 + 345 .LBB36: + 346 .LBI36: + 877:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 347 .loc 3 877 27 view .LVU88 + 348 .LBB37: + 349 .loc 3 879 3 view .LVU89 + 350 .syntax unified + 351 @ 879 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 352 0000 BFF34F8F dsb 0xF + 353 @ 0 "" 2 + 354 .thumb + 355 .syntax unified + 356 .LBE37: + 357 .LBE36: +1942:Drivers/CMSIS/Include/core_cm4.h **** buffered write are completed +1943:Drivers/CMSIS/Include/core_cm4.h **** SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + 358 .loc 2 1943 3 view .LVU90 +1944:Drivers/CMSIS/Include/core_cm4.h **** (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + 359 .loc 2 1944 32 is_stmt 0 view .LVU91 + 360 0004 0549 ldr r1, .L25 + 361 0006 CA68 ldr r2, [r1, #12] + 362 .loc 2 1944 40 view .LVU92 + 363 0008 02F4E062 and r2, r2, #1792 +1943:Drivers/CMSIS/Include/core_cm4.h **** (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + 364 .loc 2 1943 17 view .LVU93 + 365 000c 044B ldr r3, .L25+4 + 366 000e 1343 orrs r3, r3, r2 +1943:Drivers/CMSIS/Include/core_cm4.h **** (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + 367 .loc 2 1943 15 view .LVU94 + 368 0010 CB60 str r3, [r1, #12] +1945:Drivers/CMSIS/Include/core_cm4.h **** SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchange +1946:Drivers/CMSIS/Include/core_cm4.h **** __DSB(); /* Ensure completion of memory + 369 .loc 2 1946 3 is_stmt 1 view .LVU95 + 370 .LBB38: + ARM GAS /tmp/ccPJu8Ry.s page 57 + + + 371 .LBI38: + 877:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 372 .loc 3 877 27 view .LVU96 + 373 .LBB39: + 374 .loc 3 879 3 view .LVU97 + 375 .syntax unified + 376 @ 879 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 377 0012 BFF34F8F dsb 0xF + 378 @ 0 "" 2 + 379 .thumb + 380 .syntax unified + 381 .L24: + 382 .LBE39: + 383 .LBE38: +1947:Drivers/CMSIS/Include/core_cm4.h **** +1948:Drivers/CMSIS/Include/core_cm4.h **** for(;;) /* wait until reset */ + 384 .loc 2 1948 3 discriminator 1 view .LVU98 +1949:Drivers/CMSIS/Include/core_cm4.h **** { +1950:Drivers/CMSIS/Include/core_cm4.h **** __NOP(); + 385 .loc 2 1950 5 discriminator 1 view .LVU99 + 386 .syntax unified + 387 @ 1950 "Drivers/CMSIS/Include/core_cm4.h" 1 + 388 0016 00BF nop + 389 @ 0 "" 2 +1948:Drivers/CMSIS/Include/core_cm4.h **** { + 390 .loc 2 1948 3 discriminator 1 view .LVU100 + 391 .thumb + 392 .syntax unified + 393 0018 FDE7 b .L24 + 394 .L26: + 395 001a 00BF .align 2 + 396 .L25: + 397 001c 00ED00E0 .word -536810240 + 398 0020 0400FA05 .word 100270084 + 399 .cfi_endproc + 400 .LFE117: + 402 .section .text.HAL_NVIC_SetPriorityGrouping,"ax",%progbits + 403 .align 1 + 404 .global HAL_NVIC_SetPriorityGrouping + 405 .syntax unified + 406 .thumb + 407 .thumb_func + 409 HAL_NVIC_SetPriorityGrouping: + 410 .LVL26: + 411 .LFB130: + 1:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /** + 2:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** ****************************************************************************** + 3:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @file stm32f3xx_hal_cortex.c + 4:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @author MCD Application Team + 5:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @brief CORTEX HAL module driver. + 6:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * This file provides firmware functions to manage the following + 7:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * functionalities of the CORTEX: + 8:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * + Initialization and de-initialization functions + 9:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * + Peripheral Control functions + 10:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * + 11:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @verbatim + 12:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** ============================================================================== + ARM GAS /tmp/ccPJu8Ry.s page 58 + + + 13:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** ##### How to use this driver ##### + 14:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** ============================================================================== + 15:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 16:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** [..] + 17:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** *** How to configure Interrupts using CORTEX HAL driver *** + 18:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** =========================================================== + 19:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** [..] + 20:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** This section provides functions allowing to configure the NVIC interrupts (IRQ). + 21:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** The Cortex-M4 exceptions are managed by CMSIS functions. + 22:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 23:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** (#) Configure the NVIC Priority Grouping using HAL_NVIC_SetPriorityGrouping() function + 24:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 25:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** (#) Configure the priority of the selected IRQ Channels using HAL_NVIC_SetPriority() + 26:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 27:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** (#) Enable the selected IRQ Channels using HAL_NVIC_EnableIRQ() + 28:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 29:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 30:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** -@- When the NVIC_PRIORITYGROUP_0 is selected, IRQ pre-emption is no more possible. + 31:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** The pending IRQ priority will be managed only by the sub priority. + 32:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 33:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** -@- IRQ priority order (sorted by highest to lowest priority): + 34:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** (+@) Lowest pre-emption priority + 35:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** (+@) Lowest sub priority + 36:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** (+@) Lowest hardware priority (IRQ number) + 37:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 38:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** [..] + 39:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** *** How to configure Systick using CORTEX HAL driver *** + 40:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** ======================================================== + 41:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** [..] + 42:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** Setup SysTick Timer for time base + 43:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 44:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** (+) The HAL_SYSTICK_Config()function calls the SysTick_Config() function which + 45:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** is a CMSIS function that: + 46:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** (++) Configures the SysTick Reload register with value passed as function parameter. + 47:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** (++) Configures the SysTick IRQ priority to the lowest value (0x0FU). + 48:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** (++) Resets the SysTick Counter register. + 49:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** (++) Configures the SysTick Counter clock source to be Core Clock Source (HCLK). + 50:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** (++) Enables the SysTick Interrupt. + 51:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** (++) Starts the SysTick Counter. + 52:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 53:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** (+) You can change the SysTick Clock source to be HCLK_Div8 by calling the macro + 54:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** __HAL_CORTEX_SYSTICKCLK_CONFIG(SYSTICK_CLKSOURCE_HCLK_DIV8) just after the + 55:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** HAL_SYSTICK_Config() function call. The __HAL_CORTEX_SYSTICKCLK_CONFIG() macro is defined + 56:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** inside the stm32f3xx_hal_cortex.h file. + 57:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 58:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** (+) You can change the SysTick IRQ priority by calling the + 59:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** HAL_NVIC_SetPriority(SysTick_IRQn,...) function just after the HAL_SYSTICK_Config() function + 60:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** call. The HAL_NVIC_SetPriority() call the NVIC_SetPriority() function which is a CMSIS funct + 61:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 62:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** (+) To adjust the SysTick time base, use the following formula: + 63:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 64:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** Reload Value = SysTick Counter Clock (Hz) x Desired Time base (s) + 65:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** (++) Reload Value is the parameter to be passed for HAL_SYSTICK_Config() function + 66:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** (++) Reload Value should not exceed 0xFFFFFF + 67:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 68:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** @endverbatim + 69:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** ****************************************************************************** + ARM GAS /tmp/ccPJu8Ry.s page 59 + + + 70:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @attention + 71:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * + 72:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** *

    © Copyright (c) 2016 STMicroelectronics. + 73:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * All rights reserved.

    + 74:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * + 75:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * This software component is licensed by ST under BSD 3-Clause license, + 76:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * the "License"; You may not use this file except in compliance with the + 77:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * License. You may obtain a copy of the License at: + 78:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * opensource.org/licenses/BSD-3-Clause + 79:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * + 80:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** ****************************************************************************** + 81:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** */ + 82:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 83:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /* + 84:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** Additional Tables: CORTEX_NVIC_Priority_Table + 85:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** The table below gives the allowed values of the pre-emption priority and subpriority according + 86:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** to the Priority Grouping configuration performed by HAL_NVIC_SetPriorityGrouping() function + 87:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** ============================================================================================ + 88:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** NVIC_PriorityGroup | NVIC_IRQChannelPreemptionPriority | NVIC_IRQChannelSubPriority | + 89:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** ============================================================================================ + 90:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** NVIC_PRIORITYGROUP_0 | 0 | 0U-15 | + 91:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** | | | 4 + 92:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** -------------------------------------------------------------------------------------------- + 93:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** NVIC_PRIORITYGROUP_1 | 0U-1 | 0U-7 | + 94:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** | | | 3 + 95:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** -------------------------------------------------------------------------------------------- + 96:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** NVIC_PRIORITYGROUP_2 | 0U-3 | 0U-3 | + 97:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** | | | 2 + 98:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** -------------------------------------------------------------------------------------------- + 99:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** NVIC_PRIORITYGROUP_3 | 0U-7 | 0U-1 | + 100:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** | | | 1 + 101:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** -------------------------------------------------------------------------------------------- + 102:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** NVIC_PRIORITYGROUP_4 | 0U-15 | 0 | + 103:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** | | | 0 + 104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** ============================================================================================ + 105:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 106:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** */ + 107:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 108:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /* Includes ------------------------------------------------------------------*/ + 109:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** #include "stm32f3xx_hal.h" + 110:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 111:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /** @addtogroup STM32F3xx_HAL_Driver + 112:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @{ + 113:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** */ + 114:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 115:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /** @defgroup CORTEX CORTEX + 116:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @brief CORTEX CORTEX HAL module driver + 117:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @{ + 118:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** */ + 119:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 120:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** #ifdef HAL_CORTEX_MODULE_ENABLED + 121:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 122:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /* Private typedef -----------------------------------------------------------*/ + 123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /* Private define ------------------------------------------------------------*/ + 124:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /* Private macro -------------------------------------------------------------*/ + 125:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /* Private variables ---------------------------------------------------------*/ + 126:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /* Private function prototypes -----------------------------------------------*/ + ARM GAS /tmp/ccPJu8Ry.s page 60 + + + 127:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /* Exported functions ---------------------------------------------------------*/ + 128:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 129:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /** @defgroup CORTEX_Exported_Functions CORTEX Exported Functions + 130:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @{ + 131:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** */ + 132:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 133:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 134:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /** @defgroup CORTEX_Exported_Functions_Group1 Initialization and de-initialization functions + 135:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @brief Initialization and Configuration functions + 136:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * + 137:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** @verbatim + 138:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** ============================================================================== + 139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** ##### Initialization and de-initialization functions ##### + 140:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** ============================================================================== + 141:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** [..] + 142:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** This section provides the CORTEX HAL driver functions allowing to configure Interrupts + 143:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** Systick functionalities + 144:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 145:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** @endverbatim + 146:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @{ + 147:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** */ + 148:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 149:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 150:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /** + 151:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @brief Sets the priority grouping field (pre-emption priority and subpriority) + 152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * using the required unlock sequence. + 153:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @param PriorityGroup The priority grouping bits length. + 154:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * This parameter can be one of the following values: + 155:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @arg NVIC_PRIORITYGROUP_0: 0 bits for pre-emption priority + 156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * 4 bits for subpriority + 157:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @arg NVIC_PRIORITYGROUP_1: 1 bits for pre-emption priority + 158:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * 3 bits for subpriority + 159:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @arg NVIC_PRIORITYGROUP_2: 2 bits for pre-emption priority + 160:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * 2 bits for subpriority + 161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @arg NVIC_PRIORITYGROUP_3: 3 bits for pre-emption priority + 162:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * 1 bits for subpriority + 163:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @arg NVIC_PRIORITYGROUP_4: 4 bits for pre-emption priority + 164:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * 0 bits for subpriority + 165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @note When the NVIC_PriorityGroup_0 is selected, IRQ pre-emption is no more possible. + 166:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * The pending IRQ priority will be managed only by the subpriority. + 167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @retval None + 168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** */ + 169:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup) + 170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** { + 412 .loc 1 170 1 view -0 + 413 .cfi_startproc + 414 @ args = 0, pretend = 0, frame = 0 + 415 @ frame_needed = 0, uses_anonymous_args = 0 + 416 @ link register save eliminated. + 171:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /* Check the parameters */ + 172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup)); + 417 .loc 1 172 3 view .LVU102 + 173:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 174:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /* Set the PRIGROUP[10:8] bits according to the PriorityGroup parameter value */ + 175:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** NVIC_SetPriorityGrouping(PriorityGroup); + 418 .loc 1 175 3 view .LVU103 + 419 .LBB40: + ARM GAS /tmp/ccPJu8Ry.s page 61 + + + 420 .LBI40: +1657:Drivers/CMSIS/Include/core_cm4.h **** { + 421 .loc 2 1657 22 view .LVU104 + 422 .LBB41: +1659:Drivers/CMSIS/Include/core_cm4.h **** uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 a + 423 .loc 2 1659 3 view .LVU105 +1660:Drivers/CMSIS/Include/core_cm4.h **** + 424 .loc 2 1660 3 view .LVU106 +1662:Drivers/CMSIS/Include/core_cm4.h **** reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to chan + 425 .loc 2 1662 3 view .LVU107 +1662:Drivers/CMSIS/Include/core_cm4.h **** reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to chan + 426 .loc 2 1662 14 is_stmt 0 view .LVU108 + 427 0000 074A ldr r2, .L28 + 428 0002 D368 ldr r3, [r2, #12] + 429 .LVL27: +1663:Drivers/CMSIS/Include/core_cm4.h **** reg_value = (reg_value | + 430 .loc 2 1663 3 is_stmt 1 view .LVU109 +1663:Drivers/CMSIS/Include/core_cm4.h **** reg_value = (reg_value | + 431 .loc 2 1663 13 is_stmt 0 view .LVU110 + 432 0004 23F4E063 bic r3, r3, #1792 + 433 .LVL28: +1663:Drivers/CMSIS/Include/core_cm4.h **** reg_value = (reg_value | + 434 .loc 2 1663 13 view .LVU111 + 435 0008 1B04 lsls r3, r3, #16 + 436 000a 1B0C lsrs r3, r3, #16 + 437 .LVL29: +1664:Drivers/CMSIS/Include/core_cm4.h **** ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + 438 .loc 2 1664 3 is_stmt 1 view .LVU112 +1666:Drivers/CMSIS/Include/core_cm4.h **** SCB->AIRCR = reg_value; + 439 .loc 2 1666 35 is_stmt 0 view .LVU113 + 440 000c 0002 lsls r0, r0, #8 + 441 .LVL30: +1666:Drivers/CMSIS/Include/core_cm4.h **** SCB->AIRCR = reg_value; + 442 .loc 2 1666 35 view .LVU114 + 443 000e 00F4E060 and r0, r0, #1792 +1665:Drivers/CMSIS/Include/core_cm4.h **** (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key a + 444 .loc 2 1665 62 view .LVU115 + 445 0012 0343 orrs r3, r3, r0 + 446 .LVL31: +1664:Drivers/CMSIS/Include/core_cm4.h **** ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + 447 .loc 2 1664 14 view .LVU116 + 448 0014 43F0BF63 orr r3, r3, #100139008 + 449 0018 43F40033 orr r3, r3, #131072 + 450 .LVL32: +1667:Drivers/CMSIS/Include/core_cm4.h **** } + 451 .loc 2 1667 3 is_stmt 1 view .LVU117 +1667:Drivers/CMSIS/Include/core_cm4.h **** } + 452 .loc 2 1667 14 is_stmt 0 view .LVU118 + 453 001c D360 str r3, [r2, #12] + 454 .LVL33: +1667:Drivers/CMSIS/Include/core_cm4.h **** } + 455 .loc 2 1667 14 view .LVU119 + 456 .LBE41: + 457 .LBE40: + 176:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** } + 458 .loc 1 176 1 view .LVU120 + 459 001e 7047 bx lr + ARM GAS /tmp/ccPJu8Ry.s page 62 + + + 460 .L29: + 461 .align 2 + 462 .L28: + 463 0020 00ED00E0 .word -536810240 + 464 .cfi_endproc + 465 .LFE130: + 467 .section .text.HAL_NVIC_SetPriority,"ax",%progbits + 468 .align 1 + 469 .global HAL_NVIC_SetPriority + 470 .syntax unified + 471 .thumb + 472 .thumb_func + 474 HAL_NVIC_SetPriority: + 475 .LVL34: + 476 .LFB131: + 177:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 178:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /** + 179:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @brief Sets the priority of an interrupt. + 180:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @param IRQn External interrupt number + 181:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * This parameter can be an enumerator of IRQn_Type enumeration + 182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSI + 183:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @param PreemptPriority The pre-emption priority for the IRQn channel. + 184:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * This parameter can be a value between 0 and 15 as described in the table CORTEX_NVIC_Pr + 185:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * A lower priority value indicates a higher priority + 186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @param SubPriority the subpriority level for the IRQ channel. + 187:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * This parameter can be a value between 0 and 15 as described in the table CORTEX_NVIC_Pr + 188:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * A lower priority value indicates a higher priority. + 189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @retval None + 190:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** */ + 191:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority) + 192:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** { + 477 .loc 1 192 1 is_stmt 1 view -0 + 478 .cfi_startproc + 479 @ args = 0, pretend = 0, frame = 0 + 480 @ frame_needed = 0, uses_anonymous_args = 0 + 481 .loc 1 192 1 is_stmt 0 view .LVU122 + 482 0000 10B5 push {r4, lr} + 483 .cfi_def_cfa_offset 8 + 484 .cfi_offset 4, -8 + 485 .cfi_offset 14, -4 + 486 0002 0446 mov r4, r0 + 193:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** uint32_t prioritygroup = 0x00U; + 487 .loc 1 193 3 is_stmt 1 view .LVU123 + 488 .LVL35: + 194:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 195:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /* Check the parameters */ + 196:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** assert_param(IS_NVIC_SUB_PRIORITY(SubPriority)); + 489 .loc 1 196 3 view .LVU124 + 197:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** assert_param(IS_NVIC_PREEMPTION_PRIORITY(PreemptPriority)); + 490 .loc 1 197 3 view .LVU125 + 198:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 199:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** prioritygroup = NVIC_GetPriorityGrouping(); + 491 .loc 1 199 3 view .LVU126 + 492 .LBB42: + 493 .LBI42: +1676:Drivers/CMSIS/Include/core_cm4.h **** { + 494 .loc 2 1676 26 view .LVU127 + ARM GAS /tmp/ccPJu8Ry.s page 63 + + + 495 .LBB43: +1678:Drivers/CMSIS/Include/core_cm4.h **** } + 496 .loc 2 1678 3 view .LVU128 +1678:Drivers/CMSIS/Include/core_cm4.h **** } + 497 .loc 2 1678 26 is_stmt 0 view .LVU129 + 498 0004 054B ldr r3, .L32 + 499 0006 D868 ldr r0, [r3, #12] + 500 .LVL36: +1678:Drivers/CMSIS/Include/core_cm4.h **** } + 501 .loc 2 1678 26 view .LVU130 + 502 .LBE43: + 503 .LBE42: + 200:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 201:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** NVIC_SetPriority(IRQn, NVIC_EncodePriority(prioritygroup, PreemptPriority, SubPriority)); + 504 .loc 1 201 3 is_stmt 1 view .LVU131 + 505 0008 C0F30220 ubfx r0, r0, #8, #3 + 506 .LVL37: + 507 .loc 1 201 3 is_stmt 0 view .LVU132 + 508 000c FFF7FEFF bl NVIC_EncodePriority + 509 .LVL38: + 510 .loc 1 201 3 view .LVU133 + 511 0010 0146 mov r1, r0 + 512 0012 2046 mov r0, r4 + 513 0014 FFF7FEFF bl __NVIC_SetPriority + 514 .LVL39: + 202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** } + 515 .loc 1 202 1 view .LVU134 + 516 0018 10BD pop {r4, pc} + 517 .L33: + 518 001a 00BF .align 2 + 519 .L32: + 520 001c 00ED00E0 .word -536810240 + 521 .cfi_endproc + 522 .LFE131: + 524 .section .text.HAL_NVIC_EnableIRQ,"ax",%progbits + 525 .align 1 + 526 .global HAL_NVIC_EnableIRQ + 527 .syntax unified + 528 .thumb + 529 .thumb_func + 531 HAL_NVIC_EnableIRQ: + 532 .LVL40: + 533 .LFB132: + 203:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 204:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /** + 205:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @brief Enables a device specific interrupt in the NVIC interrupt controller. + 206:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @note To configure interrupts priority correctly, the NVIC_PriorityGroupConfig() + 207:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * function should be called before. + 208:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @param IRQn External interrupt number + 209:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * This parameter can be an enumerator of IRQn_Type enumeration + 210:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSI + 211:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @retval None + 212:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** */ + 213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** void HAL_NVIC_EnableIRQ(IRQn_Type IRQn) + 214:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** { + 534 .loc 1 214 1 is_stmt 1 view -0 + 535 .cfi_startproc + ARM GAS /tmp/ccPJu8Ry.s page 64 + + + 536 @ args = 0, pretend = 0, frame = 0 + 537 @ frame_needed = 0, uses_anonymous_args = 0 + 538 @ link register save eliminated. + 215:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /* Check the parameters */ + 216:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); + 539 .loc 1 216 3 view .LVU136 + 217:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 218:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /* Enable interrupt */ + 219:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** NVIC_EnableIRQ(IRQn); + 540 .loc 1 219 3 view .LVU137 + 541 .LBB44: + 542 .LBI44: +1688:Drivers/CMSIS/Include/core_cm4.h **** { + 543 .loc 2 1688 22 view .LVU138 + 544 .LBB45: +1690:Drivers/CMSIS/Include/core_cm4.h **** { + 545 .loc 2 1690 3 view .LVU139 +1690:Drivers/CMSIS/Include/core_cm4.h **** { + 546 .loc 2 1690 6 is_stmt 0 view .LVU140 + 547 0000 0028 cmp r0, #0 + 548 .LVL41: +1690:Drivers/CMSIS/Include/core_cm4.h **** { + 549 .loc 2 1690 6 view .LVU141 + 550 0002 07DB blt .L34 +1692:Drivers/CMSIS/Include/core_cm4.h **** } + 551 .loc 2 1692 5 is_stmt 1 view .LVU142 +1692:Drivers/CMSIS/Include/core_cm4.h **** } + 552 .loc 2 1692 81 is_stmt 0 view .LVU143 + 553 0004 00F01F02 and r2, r0, #31 +1692:Drivers/CMSIS/Include/core_cm4.h **** } + 554 .loc 2 1692 34 view .LVU144 + 555 0008 4009 lsrs r0, r0, #5 +1692:Drivers/CMSIS/Include/core_cm4.h **** } + 556 .loc 2 1692 45 view .LVU145 + 557 000a 0123 movs r3, #1 + 558 000c 9340 lsls r3, r3, r2 +1692:Drivers/CMSIS/Include/core_cm4.h **** } + 559 .loc 2 1692 43 view .LVU146 + 560 000e 024A ldr r2, .L36 + 561 0010 42F82030 str r3, [r2, r0, lsl #2] + 562 .LVL42: + 563 .L34: +1692:Drivers/CMSIS/Include/core_cm4.h **** } + 564 .loc 2 1692 43 view .LVU147 + 565 .LBE45: + 566 .LBE44: + 220:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** } + 567 .loc 1 220 1 view .LVU148 + 568 0014 7047 bx lr + 569 .L37: + 570 0016 00BF .align 2 + 571 .L36: + 572 0018 00E100E0 .word -536813312 + 573 .cfi_endproc + 574 .LFE132: + 576 .section .text.HAL_NVIC_DisableIRQ,"ax",%progbits + 577 .align 1 + ARM GAS /tmp/ccPJu8Ry.s page 65 + + + 578 .global HAL_NVIC_DisableIRQ + 579 .syntax unified + 580 .thumb + 581 .thumb_func + 583 HAL_NVIC_DisableIRQ: + 584 .LVL43: + 585 .LFB133: + 221:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 222:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /** + 223:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @brief Disables a device specific interrupt in the NVIC interrupt controller. + 224:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @param IRQn External interrupt number + 225:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * This parameter can be an enumerator of IRQn_Type enumeration + 226:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSI + 227:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @retval None + 228:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** */ + 229:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** void HAL_NVIC_DisableIRQ(IRQn_Type IRQn) + 230:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** { + 586 .loc 1 230 1 is_stmt 1 view -0 + 587 .cfi_startproc + 588 @ args = 0, pretend = 0, frame = 0 + 589 @ frame_needed = 0, uses_anonymous_args = 0 + 590 .loc 1 230 1 is_stmt 0 view .LVU150 + 591 0000 08B5 push {r3, lr} + 592 .cfi_def_cfa_offset 8 + 593 .cfi_offset 3, -8 + 594 .cfi_offset 14, -4 + 231:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /* Check the parameters */ + 232:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** assert_param(IS_NVIC_DEVICE_IRQ(IRQn)); + 595 .loc 1 232 3 is_stmt 1 view .LVU151 + 233:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 234:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /* Disable interrupt */ + 235:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** NVIC_DisableIRQ(IRQn); + 596 .loc 1 235 3 view .LVU152 + 597 0002 FFF7FEFF bl __NVIC_DisableIRQ + 598 .LVL44: + 236:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** } + 599 .loc 1 236 1 is_stmt 0 view .LVU153 + 600 0006 08BD pop {r3, pc} + 601 .cfi_endproc + 602 .LFE133: + 604 .section .text.HAL_NVIC_SystemReset,"ax",%progbits + 605 .align 1 + 606 .global HAL_NVIC_SystemReset + 607 .syntax unified + 608 .thumb + 609 .thumb_func + 611 HAL_NVIC_SystemReset: + 612 .LFB134: + 237:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 238:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /** + 239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @brief Initiates a system reset request to reset the MCU. + 240:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @retval None + 241:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** */ + 242:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** void HAL_NVIC_SystemReset(void) + 243:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** { + 613 .loc 1 243 1 is_stmt 1 view -0 + 614 .cfi_startproc + ARM GAS /tmp/ccPJu8Ry.s page 66 + + + 615 @ Volatile: function does not return. + 616 @ args = 0, pretend = 0, frame = 0 + 617 @ frame_needed = 0, uses_anonymous_args = 0 + 618 0000 08B5 push {r3, lr} + 619 .cfi_def_cfa_offset 8 + 620 .cfi_offset 3, -8 + 621 .cfi_offset 14, -4 + 244:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /* System Reset */ + 245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** NVIC_SystemReset(); + 622 .loc 1 245 3 view .LVU155 + 623 0002 FFF7FEFF bl __NVIC_SystemReset + 624 .LVL45: + 625 .cfi_endproc + 626 .LFE134: + 628 .section .text.HAL_SYSTICK_Config,"ax",%progbits + 629 .align 1 + 630 .global HAL_SYSTICK_Config + 631 .syntax unified + 632 .thumb + 633 .thumb_func + 635 HAL_SYSTICK_Config: + 636 .LVL46: + 637 .LFB135: + 246:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** } + 247:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 248:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /** + 249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @brief Initializes the System Timer and its interrupt, and starts the System Tick Timer. + 250:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * Counter is in free running mode to generate periodic interrupts. + 251:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @param TicksNumb Specifies the ticks Number of ticks between two interrupts. + 252:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @retval status: - 0 Function succeeded. + 253:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * - 1 Function failed. + 254:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** */ + 255:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb) + 256:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** { + 638 .loc 1 256 1 view -0 + 639 .cfi_startproc + 640 @ args = 0, pretend = 0, frame = 0 + 641 @ frame_needed = 0, uses_anonymous_args = 0 + 642 @ link register save eliminated. + 257:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** return SysTick_Config(TicksNumb); + 643 .loc 1 257 4 view .LVU157 + 644 .LBB46: + 645 .LBI46: +1951:Drivers/CMSIS/Include/core_cm4.h **** } +1952:Drivers/CMSIS/Include/core_cm4.h **** } +1953:Drivers/CMSIS/Include/core_cm4.h **** +1954:Drivers/CMSIS/Include/core_cm4.h **** /*@} end of CMSIS_Core_NVICFunctions */ +1955:Drivers/CMSIS/Include/core_cm4.h **** +1956:Drivers/CMSIS/Include/core_cm4.h **** /* ########################## MPU functions #################################### */ +1957:Drivers/CMSIS/Include/core_cm4.h **** +1958:Drivers/CMSIS/Include/core_cm4.h **** #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +1959:Drivers/CMSIS/Include/core_cm4.h **** +1960:Drivers/CMSIS/Include/core_cm4.h **** #include "mpu_armv7.h" +1961:Drivers/CMSIS/Include/core_cm4.h **** +1962:Drivers/CMSIS/Include/core_cm4.h **** #endif +1963:Drivers/CMSIS/Include/core_cm4.h **** +1964:Drivers/CMSIS/Include/core_cm4.h **** + ARM GAS /tmp/ccPJu8Ry.s page 67 + + +1965:Drivers/CMSIS/Include/core_cm4.h **** /* ########################## FPU functions #################################### */ +1966:Drivers/CMSIS/Include/core_cm4.h **** /** +1967:Drivers/CMSIS/Include/core_cm4.h **** \ingroup CMSIS_Core_FunctionInterface +1968:Drivers/CMSIS/Include/core_cm4.h **** \defgroup CMSIS_Core_FpuFunctions FPU Functions +1969:Drivers/CMSIS/Include/core_cm4.h **** \brief Function that provides FPU type. +1970:Drivers/CMSIS/Include/core_cm4.h **** @{ +1971:Drivers/CMSIS/Include/core_cm4.h **** */ +1972:Drivers/CMSIS/Include/core_cm4.h **** +1973:Drivers/CMSIS/Include/core_cm4.h **** /** +1974:Drivers/CMSIS/Include/core_cm4.h **** \brief get FPU type +1975:Drivers/CMSIS/Include/core_cm4.h **** \details returns the FPU type +1976:Drivers/CMSIS/Include/core_cm4.h **** \returns +1977:Drivers/CMSIS/Include/core_cm4.h **** - \b 0: No FPU +1978:Drivers/CMSIS/Include/core_cm4.h **** - \b 1: Single precision FPU +1979:Drivers/CMSIS/Include/core_cm4.h **** - \b 2: Double + Single precision FPU +1980:Drivers/CMSIS/Include/core_cm4.h **** */ +1981:Drivers/CMSIS/Include/core_cm4.h **** __STATIC_INLINE uint32_t SCB_GetFPUType(void) +1982:Drivers/CMSIS/Include/core_cm4.h **** { +1983:Drivers/CMSIS/Include/core_cm4.h **** uint32_t mvfr0; +1984:Drivers/CMSIS/Include/core_cm4.h **** +1985:Drivers/CMSIS/Include/core_cm4.h **** mvfr0 = FPU->MVFR0; +1986:Drivers/CMSIS/Include/core_cm4.h **** if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) +1987:Drivers/CMSIS/Include/core_cm4.h **** { +1988:Drivers/CMSIS/Include/core_cm4.h **** return 1U; /* Single precision FPU */ +1989:Drivers/CMSIS/Include/core_cm4.h **** } +1990:Drivers/CMSIS/Include/core_cm4.h **** else +1991:Drivers/CMSIS/Include/core_cm4.h **** { +1992:Drivers/CMSIS/Include/core_cm4.h **** return 0U; /* No FPU */ +1993:Drivers/CMSIS/Include/core_cm4.h **** } +1994:Drivers/CMSIS/Include/core_cm4.h **** } +1995:Drivers/CMSIS/Include/core_cm4.h **** +1996:Drivers/CMSIS/Include/core_cm4.h **** +1997:Drivers/CMSIS/Include/core_cm4.h **** /*@} end of CMSIS_Core_FpuFunctions */ +1998:Drivers/CMSIS/Include/core_cm4.h **** +1999:Drivers/CMSIS/Include/core_cm4.h **** +2000:Drivers/CMSIS/Include/core_cm4.h **** +2001:Drivers/CMSIS/Include/core_cm4.h **** /* ################################## SysTick function ######################################## +2002:Drivers/CMSIS/Include/core_cm4.h **** /** +2003:Drivers/CMSIS/Include/core_cm4.h **** \ingroup CMSIS_Core_FunctionInterface +2004:Drivers/CMSIS/Include/core_cm4.h **** \defgroup CMSIS_Core_SysTickFunctions SysTick Functions +2005:Drivers/CMSIS/Include/core_cm4.h **** \brief Functions that configure the System. +2006:Drivers/CMSIS/Include/core_cm4.h **** @{ +2007:Drivers/CMSIS/Include/core_cm4.h **** */ +2008:Drivers/CMSIS/Include/core_cm4.h **** +2009:Drivers/CMSIS/Include/core_cm4.h **** #if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) +2010:Drivers/CMSIS/Include/core_cm4.h **** +2011:Drivers/CMSIS/Include/core_cm4.h **** /** +2012:Drivers/CMSIS/Include/core_cm4.h **** \brief System Tick Configuration +2013:Drivers/CMSIS/Include/core_cm4.h **** \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. +2014:Drivers/CMSIS/Include/core_cm4.h **** Counter is in free running mode to generate periodic interrupts. +2015:Drivers/CMSIS/Include/core_cm4.h **** \param [in] ticks Number of ticks between two interrupts. +2016:Drivers/CMSIS/Include/core_cm4.h **** \return 0 Function succeeded. +2017:Drivers/CMSIS/Include/core_cm4.h **** \return 1 Function failed. +2018:Drivers/CMSIS/Include/core_cm4.h **** \note When the variable __Vendor_SysTickConfig is set to 1, then the +2019:Drivers/CMSIS/Include/core_cm4.h **** function SysTick_Config is not included. In this case, the file device. +2020:Drivers/CMSIS/Include/core_cm4.h **** must contain a vendor-specific implementation of this function. +2021:Drivers/CMSIS/Include/core_cm4.h **** */ + ARM GAS /tmp/ccPJu8Ry.s page 68 + + +2022:Drivers/CMSIS/Include/core_cm4.h **** __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) + 646 .loc 2 2022 26 view .LVU158 + 647 .LBB47: +2023:Drivers/CMSIS/Include/core_cm4.h **** { +2024:Drivers/CMSIS/Include/core_cm4.h **** if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + 648 .loc 2 2024 3 view .LVU159 + 649 .loc 2 2024 14 is_stmt 0 view .LVU160 + 650 0000 0138 subs r0, r0, #1 + 651 .LVL47: + 652 .loc 2 2024 6 view .LVU161 + 653 0002 B0F1807F cmp r0, #16777216 + 654 0006 0BD2 bcs .L44 +2025:Drivers/CMSIS/Include/core_cm4.h **** { +2026:Drivers/CMSIS/Include/core_cm4.h **** return (1UL); /* Reload value impossible */ +2027:Drivers/CMSIS/Include/core_cm4.h **** } +2028:Drivers/CMSIS/Include/core_cm4.h **** +2029:Drivers/CMSIS/Include/core_cm4.h **** SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + 655 .loc 2 2029 3 is_stmt 1 view .LVU162 + 656 .loc 2 2029 18 is_stmt 0 view .LVU163 + 657 0008 4FF0E023 mov r3, #-536813568 + 658 000c 5861 str r0, [r3, #20] +2030:Drivers/CMSIS/Include/core_cm4.h **** NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Int + 659 .loc 2 2030 3 is_stmt 1 view .LVU164 + 660 .LVL48: + 661 .LBB48: + 662 .LBI48: +1816:Drivers/CMSIS/Include/core_cm4.h **** { + 663 .loc 2 1816 22 view .LVU165 + 664 .LBB49: +1818:Drivers/CMSIS/Include/core_cm4.h **** { + 665 .loc 2 1818 3 view .LVU166 +1824:Drivers/CMSIS/Include/core_cm4.h **** } + 666 .loc 2 1824 5 view .LVU167 +1824:Drivers/CMSIS/Include/core_cm4.h **** } + 667 .loc 2 1824 46 is_stmt 0 view .LVU168 + 668 000e 054A ldr r2, .L45 + 669 0010 F021 movs r1, #240 + 670 0012 82F82310 strb r1, [r2, #35] + 671 .LVL49: +1824:Drivers/CMSIS/Include/core_cm4.h **** } + 672 .loc 2 1824 46 view .LVU169 + 673 .LBE49: + 674 .LBE48: +2031:Drivers/CMSIS/Include/core_cm4.h **** SysTick->VAL = 0UL; /* Load the SysTick Counter Val + 675 .loc 2 2031 3 is_stmt 1 view .LVU170 + 676 .loc 2 2031 18 is_stmt 0 view .LVU171 + 677 0016 0020 movs r0, #0 + 678 .LVL50: + 679 .loc 2 2031 18 view .LVU172 + 680 0018 9861 str r0, [r3, #24] +2032:Drivers/CMSIS/Include/core_cm4.h **** SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + 681 .loc 2 2032 3 is_stmt 1 view .LVU173 + 682 .loc 2 2032 18 is_stmt 0 view .LVU174 + 683 001a 0722 movs r2, #7 + 684 001c 1A61 str r2, [r3, #16] +2033:Drivers/CMSIS/Include/core_cm4.h **** SysTick_CTRL_TICKINT_Msk | +2034:Drivers/CMSIS/Include/core_cm4.h **** SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTi + ARM GAS /tmp/ccPJu8Ry.s page 69 + + +2035:Drivers/CMSIS/Include/core_cm4.h **** return (0UL); /* Function successful */ + 685 .loc 2 2035 3 is_stmt 1 view .LVU175 + 686 .loc 2 2035 10 is_stmt 0 view .LVU176 + 687 001e 7047 bx lr + 688 .L44: +2026:Drivers/CMSIS/Include/core_cm4.h **** } + 689 .loc 2 2026 12 view .LVU177 + 690 0020 0120 movs r0, #1 + 691 .LVL51: +2026:Drivers/CMSIS/Include/core_cm4.h **** } + 692 .loc 2 2026 12 view .LVU178 + 693 .LBE47: + 694 .LBE46: + 258:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** } + 695 .loc 1 258 1 view .LVU179 + 696 0022 7047 bx lr + 697 .L46: + 698 .align 2 + 699 .L45: + 700 0024 00ED00E0 .word -536810240 + 701 .cfi_endproc + 702 .LFE135: + 704 .section .text.HAL_MPU_Disable,"ax",%progbits + 705 .align 1 + 706 .global HAL_MPU_Disable + 707 .syntax unified + 708 .thumb + 709 .thumb_func + 711 HAL_MPU_Disable: + 712 .LFB136: + 259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /** + 260:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @} + 261:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** */ + 262:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 263:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /** @defgroup CORTEX_Exported_Functions_Group2 Peripheral Control functions + 264:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @brief Cortex control functions + 265:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * + 266:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** @verbatim + 267:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** ============================================================================== + 268:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** ##### Peripheral Control functions ##### + 269:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** ============================================================================== + 270:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** [..] + 271:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** This subsection provides a set of functions allowing to control the CORTEX + 272:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** (NVIC, SYSTICK, MPU) functionalities. + 273:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 274:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** @endverbatim + 276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @{ + 277:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** */ + 278:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 279:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** #if (__MPU_PRESENT == 1U) + 280:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 281:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /** + 282:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @brief Disables the MPU also clears the HFNMIENA bit (ARM recommendation) + 283:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @retval None + 284:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** */ + 285:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** void HAL_MPU_Disable(void) + ARM GAS /tmp/ccPJu8Ry.s page 70 + + + 286:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** { + 713 .loc 1 286 1 is_stmt 1 view -0 + 714 .cfi_startproc + 715 @ args = 0, pretend = 0, frame = 0 + 716 @ frame_needed = 0, uses_anonymous_args = 0 + 717 @ link register save eliminated. + 287:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /* Disable fault exceptions */ + 288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; + 718 .loc 1 288 3 view .LVU181 + 719 .loc 1 288 6 is_stmt 0 view .LVU182 + 720 0000 044B ldr r3, .L48 + 721 0002 5A6A ldr r2, [r3, #36] + 722 .loc 1 288 14 view .LVU183 + 723 0004 22F48032 bic r2, r2, #65536 + 724 0008 5A62 str r2, [r3, #36] + 289:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 290:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /* Disable the MPU */ + 291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** MPU->CTRL = 0U; + 725 .loc 1 291 3 is_stmt 1 view .LVU184 + 726 .loc 1 291 13 is_stmt 0 view .LVU185 + 727 000a 0022 movs r2, #0 + 728 000c C3F89420 str r2, [r3, #148] + 292:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** } + 729 .loc 1 292 1 view .LVU186 + 730 0010 7047 bx lr + 731 .L49: + 732 0012 00BF .align 2 + 733 .L48: + 734 0014 00ED00E0 .word -536810240 + 735 .cfi_endproc + 736 .LFE136: + 738 .section .text.HAL_MPU_Enable,"ax",%progbits + 739 .align 1 + 740 .global HAL_MPU_Enable + 741 .syntax unified + 742 .thumb + 743 .thumb_func + 745 HAL_MPU_Enable: + 746 .LVL52: + 747 .LFB137: + 293:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /** + 295:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @brief Enables the MPU + 296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @param MPU_Control Specifies the control mode of the MPU during hard fault, + 297:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * NMI, FAULTMASK and privileged access to the default memory + 298:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * This parameter can be one of the following values: + 299:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @arg MPU_HFNMI_PRIVDEF_NONE + 300:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @arg MPU_HARDFAULT_NMI + 301:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @arg MPU_PRIVILEGED_DEFAULT + 302:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @arg MPU_HFNMI_PRIVDEF + 303:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @retval None + 304:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** */ + 305:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** void HAL_MPU_Enable(uint32_t MPU_Control) + 306:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** { + 748 .loc 1 306 1 is_stmt 1 view -0 + 749 .cfi_startproc + 750 @ args = 0, pretend = 0, frame = 0 + ARM GAS /tmp/ccPJu8Ry.s page 71 + + + 751 @ frame_needed = 0, uses_anonymous_args = 0 + 752 @ link register save eliminated. + 307:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /* Enable the MPU */ + 308:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; + 753 .loc 1 308 3 view .LVU188 + 754 .loc 1 308 29 is_stmt 0 view .LVU189 + 755 0000 40F00100 orr r0, r0, #1 + 756 .LVL53: + 757 .loc 1 308 15 view .LVU190 + 758 0004 034B ldr r3, .L51 + 759 0006 C3F89400 str r0, [r3, #148] + 309:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 310:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /* Enable fault exceptions */ + 311:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; + 760 .loc 1 311 3 is_stmt 1 view .LVU191 + 761 .loc 1 311 6 is_stmt 0 view .LVU192 + 762 000a 5A6A ldr r2, [r3, #36] + 763 .loc 1 311 14 view .LVU193 + 764 000c 42F48032 orr r2, r2, #65536 + 765 0010 5A62 str r2, [r3, #36] + 312:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** } + 766 .loc 1 312 1 view .LVU194 + 767 0012 7047 bx lr + 768 .L52: + 769 .align 2 + 770 .L51: + 771 0014 00ED00E0 .word -536810240 + 772 .cfi_endproc + 773 .LFE137: + 775 .section .text.HAL_MPU_ConfigRegion,"ax",%progbits + 776 .align 1 + 777 .global HAL_MPU_ConfigRegion + 778 .syntax unified + 779 .thumb + 780 .thumb_func + 782 HAL_MPU_ConfigRegion: + 783 .LVL54: + 784 .LFB138: + 313:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 314:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /** + 315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @brief Initializes and configures the Region and the memory to be protected. + 316:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @param MPU_Init Pointer to a MPU_Region_InitTypeDef structure that contains + 317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * the initialization and configuration information. + 318:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @retval None + 319:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** */ + 320:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** void HAL_MPU_ConfigRegion(MPU_Region_InitTypeDef *MPU_Init) + 321:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** { + 785 .loc 1 321 1 is_stmt 1 view -0 + 786 .cfi_startproc + 787 @ args = 0, pretend = 0, frame = 0 + 788 @ frame_needed = 0, uses_anonymous_args = 0 + 789 @ link register save eliminated. + 322:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /* Check the parameters */ + 323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** assert_param(IS_MPU_REGION_NUMBER(MPU_Init->Number)); + 790 .loc 1 323 3 view .LVU196 + 324:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** assert_param(IS_MPU_REGION_ENABLE(MPU_Init->Enable)); + 791 .loc 1 324 3 view .LVU197 + ARM GAS /tmp/ccPJu8Ry.s page 72 + + + 325:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 326:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /* Set the Region number */ + 327:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** MPU->RNR = MPU_Init->Number; + 792 .loc 1 327 3 view .LVU198 + 793 .loc 1 327 22 is_stmt 0 view .LVU199 + 794 0000 4278 ldrb r2, [r0, #1] @ zero_extendqisi2 + 795 .loc 1 327 12 view .LVU200 + 796 0002 164B ldr r3, .L56 + 797 0004 C3F89820 str r2, [r3, #152] + 328:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 329:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** if ((MPU_Init->Enable) != RESET) + 798 .loc 1 329 3 is_stmt 1 view .LVU201 + 799 .loc 1 329 16 is_stmt 0 view .LVU202 + 800 0008 0378 ldrb r3, [r0] @ zero_extendqisi2 + 801 .loc 1 329 6 view .LVU203 + 802 000a FBB1 cbz r3, .L54 + 330:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** { + 331:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /* Check the parameters */ + 332:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** assert_param(IS_MPU_INSTRUCTION_ACCESS(MPU_Init->DisableExec)); + 803 .loc 1 332 5 is_stmt 1 view .LVU204 + 333:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** assert_param(IS_MPU_REGION_PERMISSION_ATTRIBUTE(MPU_Init->AccessPermission)); + 804 .loc 1 333 5 view .LVU205 + 334:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** assert_param(IS_MPU_TEX_LEVEL(MPU_Init->TypeExtField)); + 805 .loc 1 334 5 view .LVU206 + 335:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** assert_param(IS_MPU_ACCESS_SHAREABLE(MPU_Init->IsShareable)); + 806 .loc 1 335 5 view .LVU207 + 336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** assert_param(IS_MPU_ACCESS_CACHEABLE(MPU_Init->IsCacheable)); + 807 .loc 1 336 5 view .LVU208 + 337:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** assert_param(IS_MPU_ACCESS_BUFFERABLE(MPU_Init->IsBufferable)); + 808 .loc 1 337 5 view .LVU209 + 338:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** assert_param(IS_MPU_SUB_REGION_DISABLE(MPU_Init->SubRegionDisable)); + 809 .loc 1 338 5 view .LVU210 + 339:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** assert_param(IS_MPU_REGION_SIZE(MPU_Init->Size)); + 810 .loc 1 339 5 view .LVU211 + 340:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 341:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** MPU->RBAR = MPU_Init->BaseAddress; + 811 .loc 1 341 5 view .LVU212 + 812 .loc 1 341 25 is_stmt 0 view .LVU213 + 813 000c 4368 ldr r3, [r0, #4] + 814 .loc 1 341 15 view .LVU214 + 815 000e 134A ldr r2, .L56 + 816 0010 C2F89C30 str r3, [r2, #156] + 342:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** MPU->RASR = ((uint32_t)MPU_Init->DisableExec << MPU_RASR_XN_Pos) | + 817 .loc 1 342 5 is_stmt 1 view .LVU215 + 818 .loc 1 342 36 is_stmt 0 view .LVU216 + 819 0014 017B ldrb r1, [r0, #12] @ zero_extendqisi2 + 343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** ((uint32_t)MPU_Init->AccessPermission << MPU_RASR_AP_Pos) | + 820 .loc 1 343 36 view .LVU217 + 821 0016 C37A ldrb r3, [r0, #11] @ zero_extendqisi2 + 822 .loc 1 343 62 view .LVU218 + 823 0018 1B06 lsls r3, r3, #24 + 342:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** MPU->RASR = ((uint32_t)MPU_Init->DisableExec << MPU_RASR_XN_Pos) | + 824 .loc 1 342 84 view .LVU219 + 825 001a 43EA0173 orr r3, r3, r1, lsl #28 + 344:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** ((uint32_t)MPU_Init->TypeExtField << MPU_RASR_TEX_Pos) | + 826 .loc 1 344 36 view .LVU220 + 827 001e 817A ldrb r1, [r0, #10] @ zero_extendqisi2 + ARM GAS /tmp/ccPJu8Ry.s page 73 + + + 343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** ((uint32_t)MPU_Init->AccessPermission << MPU_RASR_AP_Pos) | + 828 .loc 1 343 84 view .LVU221 + 829 0020 43EAC143 orr r3, r3, r1, lsl #19 + 345:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** ((uint32_t)MPU_Init->IsShareable << MPU_RASR_S_Pos) | + 830 .loc 1 345 36 view .LVU222 + 831 0024 417B ldrb r1, [r0, #13] @ zero_extendqisi2 + 344:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** ((uint32_t)MPU_Init->TypeExtField << MPU_RASR_TEX_Pos) | + 832 .loc 1 344 84 view .LVU223 + 833 0026 43EA8143 orr r3, r3, r1, lsl #18 + 346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** ((uint32_t)MPU_Init->IsCacheable << MPU_RASR_C_Pos) | + 834 .loc 1 346 36 view .LVU224 + 835 002a 817B ldrb r1, [r0, #14] @ zero_extendqisi2 + 345:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** ((uint32_t)MPU_Init->IsShareable << MPU_RASR_S_Pos) | + 836 .loc 1 345 84 view .LVU225 + 837 002c 43EA4143 orr r3, r3, r1, lsl #17 + 347:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** ((uint32_t)MPU_Init->IsBufferable << MPU_RASR_B_Pos) | + 838 .loc 1 347 36 view .LVU226 + 839 0030 C17B ldrb r1, [r0, #15] @ zero_extendqisi2 + 346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** ((uint32_t)MPU_Init->IsCacheable << MPU_RASR_C_Pos) | + 840 .loc 1 346 84 view .LVU227 + 841 0032 43EA0143 orr r3, r3, r1, lsl #16 + 348:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** ((uint32_t)MPU_Init->SubRegionDisable << MPU_RASR_SRD_Pos) | + 842 .loc 1 348 36 view .LVU228 + 843 0036 417A ldrb r1, [r0, #9] @ zero_extendqisi2 + 347:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** ((uint32_t)MPU_Init->IsBufferable << MPU_RASR_B_Pos) | + 844 .loc 1 347 84 view .LVU229 + 845 0038 43EA0123 orr r3, r3, r1, lsl #8 + 349:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** ((uint32_t)MPU_Init->Size << MPU_RASR_SIZE_Pos) | + 846 .loc 1 349 36 view .LVU230 + 847 003c 017A ldrb r1, [r0, #8] @ zero_extendqisi2 + 348:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** ((uint32_t)MPU_Init->SubRegionDisable << MPU_RASR_SRD_Pos) | + 848 .loc 1 348 84 view .LVU231 + 849 003e 43EA4103 orr r3, r3, r1, lsl #1 + 350:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** ((uint32_t)MPU_Init->Enable << MPU_RASR_ENABLE_Pos); + 850 .loc 1 350 36 view .LVU232 + 851 0042 0178 ldrb r1, [r0] @ zero_extendqisi2 + 349:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** ((uint32_t)MPU_Init->Size << MPU_RASR_SIZE_Pos) | + 852 .loc 1 349 84 view .LVU233 + 853 0044 0B43 orrs r3, r3, r1 + 342:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** ((uint32_t)MPU_Init->AccessPermission << MPU_RASR_AP_Pos) | + 854 .loc 1 342 15 view .LVU234 + 855 0046 C2F8A030 str r3, [r2, #160] + 856 004a 7047 bx lr + 857 .L54: + 351:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** } + 352:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** else + 353:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** { + 354:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** MPU->RBAR = 0x00U; + 858 .loc 1 354 5 is_stmt 1 view .LVU235 + 859 .loc 1 354 15 is_stmt 0 view .LVU236 + 860 004c 034B ldr r3, .L56 + 861 004e 0022 movs r2, #0 + 862 0050 C3F89C20 str r2, [r3, #156] + 355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** MPU->RASR = 0x00U; + 863 .loc 1 355 5 is_stmt 1 view .LVU237 + 864 .loc 1 355 15 is_stmt 0 view .LVU238 + 865 0054 C3F8A020 str r2, [r3, #160] + ARM GAS /tmp/ccPJu8Ry.s page 74 + + + 356:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** } + 357:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** } + 866 .loc 1 357 1 view .LVU239 + 867 0058 7047 bx lr + 868 .L57: + 869 005a 00BF .align 2 + 870 .L56: + 871 005c 00ED00E0 .word -536810240 + 872 .cfi_endproc + 873 .LFE138: + 875 .section .text.HAL_NVIC_GetPriorityGrouping,"ax",%progbits + 876 .align 1 + 877 .global HAL_NVIC_GetPriorityGrouping + 878 .syntax unified + 879 .thumb + 880 .thumb_func + 882 HAL_NVIC_GetPriorityGrouping: + 883 .LFB139: + 358:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** #endif /* __MPU_PRESENT */ + 359:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 360:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /** + 361:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @brief Gets the priority grouping field from the NVIC Interrupt Controller. + 362:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @retval Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field) + 363:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** */ + 364:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** uint32_t HAL_NVIC_GetPriorityGrouping(void) + 365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** { + 884 .loc 1 365 1 is_stmt 1 view -0 + 885 .cfi_startproc + 886 @ args = 0, pretend = 0, frame = 0 + 887 @ frame_needed = 0, uses_anonymous_args = 0 + 888 @ link register save eliminated. + 366:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /* Get the PRIGROUP[10:8] field value */ + 367:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** return NVIC_GetPriorityGrouping(); + 889 .loc 1 367 3 view .LVU241 + 890 .LBB50: + 891 .LBI50: +1676:Drivers/CMSIS/Include/core_cm4.h **** { + 892 .loc 2 1676 26 view .LVU242 + 893 .LBB51: +1678:Drivers/CMSIS/Include/core_cm4.h **** } + 894 .loc 2 1678 3 view .LVU243 +1678:Drivers/CMSIS/Include/core_cm4.h **** } + 895 .loc 2 1678 26 is_stmt 0 view .LVU244 + 896 0000 024B ldr r3, .L59 + 897 0002 D868 ldr r0, [r3, #12] + 898 .LBE51: + 899 .LBE50: + 368:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** } + 900 .loc 1 368 1 view .LVU245 + 901 0004 C0F30220 ubfx r0, r0, #8, #3 + 902 0008 7047 bx lr + 903 .L60: + 904 000a 00BF .align 2 + 905 .L59: + 906 000c 00ED00E0 .word -536810240 + 907 .cfi_endproc + 908 .LFE139: + ARM GAS /tmp/ccPJu8Ry.s page 75 + + + 910 .section .text.HAL_NVIC_GetPriority,"ax",%progbits + 911 .align 1 + 912 .global HAL_NVIC_GetPriority + 913 .syntax unified + 914 .thumb + 915 .thumb_func + 917 HAL_NVIC_GetPriority: + 918 .LVL55: + 919 .LFB140: + 369:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 370:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /** + 371:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @brief Gets the priority of an interrupt. + 372:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @param IRQn External interrupt number + 373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * This parameter can be an enumerator of IRQn_Type enumeration + 374:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSI + 375:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @param PriorityGroup: the priority grouping bits length. + 376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * This parameter can be one of the following values: + 377:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @arg NVIC_PRIORITYGROUP_0: 0 bits for pre-emption priority + 378:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * 4 bits for subpriority + 379:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @arg NVIC_PRIORITYGROUP_1: 1 bits for pre-emption priority + 380:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * 3 bits for subpriority + 381:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @arg NVIC_PRIORITYGROUP_2: 2 bits for pre-emption priority + 382:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * 2 bits for subpriority + 383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @arg NVIC_PRIORITYGROUP_3: 3 bits for pre-emption priority + 384:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * 1 bits for subpriority + 385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @arg NVIC_PRIORITYGROUP_4: 4 bits for pre-emption priority + 386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * 0 bits for subpriority + 387:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @param pPreemptPriority Pointer on the Preemptive priority value (starting from 0). + 388:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @param pSubPriority Pointer on the Subpriority value (starting from 0). + 389:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @retval None + 390:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** */ + 391:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** void HAL_NVIC_GetPriority(IRQn_Type IRQn, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint3 + 392:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** { + 920 .loc 1 392 1 is_stmt 1 view -0 + 921 .cfi_startproc + 922 @ args = 0, pretend = 0, frame = 0 + 923 @ frame_needed = 0, uses_anonymous_args = 0 + 924 .loc 1 392 1 is_stmt 0 view .LVU247 + 925 0000 70B5 push {r4, r5, r6, lr} + 926 .cfi_def_cfa_offset 16 + 927 .cfi_offset 4, -16 + 928 .cfi_offset 5, -12 + 929 .cfi_offset 6, -8 + 930 .cfi_offset 14, -4 + 931 0002 0C46 mov r4, r1 + 932 0004 1546 mov r5, r2 + 933 0006 1E46 mov r6, r3 + 393:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /* Check the parameters */ + 394:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup)); + 934 .loc 1 394 3 is_stmt 1 view .LVU248 + 395:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /* Get priority for Cortex-M system or device specific interrupts */ + 396:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** NVIC_DecodePriority(NVIC_GetPriority(IRQn), PriorityGroup, pPreemptPriority, pSubPriority); + 935 .loc 1 396 3 view .LVU249 + 936 0008 FFF7FEFF bl __NVIC_GetPriority + 937 .LVL56: + 938 .loc 1 396 3 is_stmt 0 view .LVU250 + 939 000c 3346 mov r3, r6 + ARM GAS /tmp/ccPJu8Ry.s page 76 + + + 940 000e 2A46 mov r2, r5 + 941 0010 2146 mov r1, r4 + 942 0012 FFF7FEFF bl NVIC_DecodePriority + 943 .LVL57: + 397:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** } + 944 .loc 1 397 1 view .LVU251 + 945 0016 70BD pop {r4, r5, r6, pc} + 946 .loc 1 397 1 view .LVU252 + 947 .cfi_endproc + 948 .LFE140: + 950 .section .text.HAL_NVIC_SetPendingIRQ,"ax",%progbits + 951 .align 1 + 952 .global HAL_NVIC_SetPendingIRQ + 953 .syntax unified + 954 .thumb + 955 .thumb_func + 957 HAL_NVIC_SetPendingIRQ: + 958 .LVL58: + 959 .LFB141: + 398:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 399:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /** + 400:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @brief Sets Pending bit of an external interrupt. + 401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @param IRQn External interrupt number + 402:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * This parameter can be an enumerator of IRQn_Type enumeration + 403:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSI + 404:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @retval None + 405:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** */ + 406:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** void HAL_NVIC_SetPendingIRQ(IRQn_Type IRQn) + 407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** { + 960 .loc 1 407 1 is_stmt 1 view -0 + 961 .cfi_startproc + 962 @ args = 0, pretend = 0, frame = 0 + 963 @ frame_needed = 0, uses_anonymous_args = 0 + 964 @ link register save eliminated. + 408:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /* Set interrupt pending */ + 409:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** NVIC_SetPendingIRQ(IRQn); + 965 .loc 1 409 3 view .LVU254 + 966 .LBB52: + 967 .LBI52: +1762:Drivers/CMSIS/Include/core_cm4.h **** { + 968 .loc 2 1762 22 view .LVU255 + 969 .LBB53: +1764:Drivers/CMSIS/Include/core_cm4.h **** { + 970 .loc 2 1764 3 view .LVU256 +1764:Drivers/CMSIS/Include/core_cm4.h **** { + 971 .loc 2 1764 6 is_stmt 0 view .LVU257 + 972 0000 0028 cmp r0, #0 + 973 .LVL59: +1764:Drivers/CMSIS/Include/core_cm4.h **** { + 974 .loc 2 1764 6 view .LVU258 + 975 0002 08DB blt .L63 +1766:Drivers/CMSIS/Include/core_cm4.h **** } + 976 .loc 2 1766 5 is_stmt 1 view .LVU259 +1766:Drivers/CMSIS/Include/core_cm4.h **** } + 977 .loc 2 1766 81 is_stmt 0 view .LVU260 + 978 0004 00F01F02 and r2, r0, #31 +1766:Drivers/CMSIS/Include/core_cm4.h **** } + ARM GAS /tmp/ccPJu8Ry.s page 77 + + + 979 .loc 2 1766 34 view .LVU261 + 980 0008 4009 lsrs r0, r0, #5 +1766:Drivers/CMSIS/Include/core_cm4.h **** } + 981 .loc 2 1766 45 view .LVU262 + 982 000a 0123 movs r3, #1 + 983 000c 9340 lsls r3, r3, r2 +1766:Drivers/CMSIS/Include/core_cm4.h **** } + 984 .loc 2 1766 43 view .LVU263 + 985 000e 4030 adds r0, r0, #64 + 986 0010 014A ldr r2, .L65 + 987 0012 42F82030 str r3, [r2, r0, lsl #2] + 988 .LVL60: + 989 .L63: +1766:Drivers/CMSIS/Include/core_cm4.h **** } + 990 .loc 2 1766 43 view .LVU264 + 991 .LBE53: + 992 .LBE52: + 410:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** } + 993 .loc 1 410 1 view .LVU265 + 994 0016 7047 bx lr + 995 .L66: + 996 .align 2 + 997 .L65: + 998 0018 00E100E0 .word -536813312 + 999 .cfi_endproc + 1000 .LFE141: + 1002 .section .text.HAL_NVIC_GetPendingIRQ,"ax",%progbits + 1003 .align 1 + 1004 .global HAL_NVIC_GetPendingIRQ + 1005 .syntax unified + 1006 .thumb + 1007 .thumb_func + 1009 HAL_NVIC_GetPendingIRQ: + 1010 .LVL61: + 1011 .LFB142: + 411:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 412:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /** + 413:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @brief Gets Pending Interrupt (reads the pending register in the NVIC + 414:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * and returns the pending bit for the specified interrupt). + 415:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @param IRQn External interrupt number + 416:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * This parameter can be an enumerator of IRQn_Type enumeration + 417:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSI + 418:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @retval status: - 0 Interrupt status is not pending. + 419:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * - 1 Interrupt status is pending. + 420:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** */ + 421:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** uint32_t HAL_NVIC_GetPendingIRQ(IRQn_Type IRQn) + 422:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** { + 1012 .loc 1 422 1 is_stmt 1 view -0 + 1013 .cfi_startproc + 1014 @ args = 0, pretend = 0, frame = 0 + 1015 @ frame_needed = 0, uses_anonymous_args = 0 + 1016 @ link register save eliminated. + 423:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /* Return 1 if pending else 0U */ + 424:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** return NVIC_GetPendingIRQ(IRQn); + 1017 .loc 1 424 3 view .LVU267 + 1018 .LBB54: + 1019 .LBI54: + ARM GAS /tmp/ccPJu8Ry.s page 78 + + +1743:Drivers/CMSIS/Include/core_cm4.h **** { + 1020 .loc 2 1743 26 view .LVU268 + 1021 .LBB55: +1745:Drivers/CMSIS/Include/core_cm4.h **** { + 1022 .loc 2 1745 3 view .LVU269 +1745:Drivers/CMSIS/Include/core_cm4.h **** { + 1023 .loc 2 1745 6 is_stmt 0 view .LVU270 + 1024 0000 0028 cmp r0, #0 + 1025 .LVL62: +1745:Drivers/CMSIS/Include/core_cm4.h **** { + 1026 .loc 2 1745 6 view .LVU271 + 1027 0002 0BDB blt .L69 +1747:Drivers/CMSIS/Include/core_cm4.h **** } + 1028 .loc 2 1747 5 is_stmt 1 view .LVU272 +1747:Drivers/CMSIS/Include/core_cm4.h **** } + 1029 .loc 2 1747 54 is_stmt 0 view .LVU273 + 1030 0004 4309 lsrs r3, r0, #5 +1747:Drivers/CMSIS/Include/core_cm4.h **** } + 1031 .loc 2 1747 35 view .LVU274 + 1032 0006 4033 adds r3, r3, #64 + 1033 0008 054A ldr r2, .L70 + 1034 000a 52F82330 ldr r3, [r2, r3, lsl #2] +1747:Drivers/CMSIS/Include/core_cm4.h **** } + 1035 .loc 2 1747 91 view .LVU275 + 1036 000e 00F01F00 and r0, r0, #31 +1747:Drivers/CMSIS/Include/core_cm4.h **** } + 1037 .loc 2 1747 103 view .LVU276 + 1038 0012 23FA00F0 lsr r0, r3, r0 +1747:Drivers/CMSIS/Include/core_cm4.h **** } + 1039 .loc 2 1747 12 view .LVU277 + 1040 0016 00F00100 and r0, r0, #1 + 1041 001a 7047 bx lr + 1042 .L69: +1751:Drivers/CMSIS/Include/core_cm4.h **** } + 1043 .loc 2 1751 11 view .LVU278 + 1044 001c 0020 movs r0, #0 + 1045 .LVL63: +1751:Drivers/CMSIS/Include/core_cm4.h **** } + 1046 .loc 2 1751 11 view .LVU279 + 1047 .LBE55: + 1048 .LBE54: + 425:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** } + 1049 .loc 1 425 1 view .LVU280 + 1050 001e 7047 bx lr + 1051 .L71: + 1052 .align 2 + 1053 .L70: + 1054 0020 00E100E0 .word -536813312 + 1055 .cfi_endproc + 1056 .LFE142: + 1058 .section .text.HAL_NVIC_ClearPendingIRQ,"ax",%progbits + 1059 .align 1 + 1060 .global HAL_NVIC_ClearPendingIRQ + 1061 .syntax unified + 1062 .thumb + 1063 .thumb_func + 1065 HAL_NVIC_ClearPendingIRQ: + ARM GAS /tmp/ccPJu8Ry.s page 79 + + + 1066 .LVL64: + 1067 .LFB143: + 426:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 427:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /** + 428:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @brief Clears the pending bit of an external interrupt. + 429:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @param IRQn External interrupt number + 430:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * This parameter can be an enumerator of IRQn_Type enumeration + 431:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSI + 432:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @retval None + 433:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** */ + 434:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** void HAL_NVIC_ClearPendingIRQ(IRQn_Type IRQn) + 435:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** { + 1068 .loc 1 435 1 is_stmt 1 view -0 + 1069 .cfi_startproc + 1070 @ args = 0, pretend = 0, frame = 0 + 1071 @ frame_needed = 0, uses_anonymous_args = 0 + 1072 @ link register save eliminated. + 436:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /* Clear pending interrupt */ + 437:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** NVIC_ClearPendingIRQ(IRQn); + 1073 .loc 1 437 3 view .LVU282 + 1074 .LBB56: + 1075 .LBI56: +1777:Drivers/CMSIS/Include/core_cm4.h **** { + 1076 .loc 2 1777 22 view .LVU283 + 1077 .LBB57: +1779:Drivers/CMSIS/Include/core_cm4.h **** { + 1078 .loc 2 1779 3 view .LVU284 +1779:Drivers/CMSIS/Include/core_cm4.h **** { + 1079 .loc 2 1779 6 is_stmt 0 view .LVU285 + 1080 0000 0028 cmp r0, #0 + 1081 .LVL65: +1779:Drivers/CMSIS/Include/core_cm4.h **** { + 1082 .loc 2 1779 6 view .LVU286 + 1083 0002 08DB blt .L72 +1781:Drivers/CMSIS/Include/core_cm4.h **** } + 1084 .loc 2 1781 5 is_stmt 1 view .LVU287 +1781:Drivers/CMSIS/Include/core_cm4.h **** } + 1085 .loc 2 1781 81 is_stmt 0 view .LVU288 + 1086 0004 00F01F02 and r2, r0, #31 +1781:Drivers/CMSIS/Include/core_cm4.h **** } + 1087 .loc 2 1781 34 view .LVU289 + 1088 0008 4009 lsrs r0, r0, #5 +1781:Drivers/CMSIS/Include/core_cm4.h **** } + 1089 .loc 2 1781 45 view .LVU290 + 1090 000a 0123 movs r3, #1 + 1091 000c 9340 lsls r3, r3, r2 +1781:Drivers/CMSIS/Include/core_cm4.h **** } + 1092 .loc 2 1781 43 view .LVU291 + 1093 000e 6030 adds r0, r0, #96 + 1094 0010 014A ldr r2, .L74 + 1095 0012 42F82030 str r3, [r2, r0, lsl #2] + 1096 .LVL66: + 1097 .L72: +1781:Drivers/CMSIS/Include/core_cm4.h **** } + 1098 .loc 2 1781 43 view .LVU292 + 1099 .LBE57: + 1100 .LBE56: + ARM GAS /tmp/ccPJu8Ry.s page 80 + + + 438:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** } + 1101 .loc 1 438 1 view .LVU293 + 1102 0016 7047 bx lr + 1103 .L75: + 1104 .align 2 + 1105 .L74: + 1106 0018 00E100E0 .word -536813312 + 1107 .cfi_endproc + 1108 .LFE143: + 1110 .section .text.HAL_NVIC_GetActive,"ax",%progbits + 1111 .align 1 + 1112 .global HAL_NVIC_GetActive + 1113 .syntax unified + 1114 .thumb + 1115 .thumb_func + 1117 HAL_NVIC_GetActive: + 1118 .LVL67: + 1119 .LFB144: + 439:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 440:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /** + 441:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @brief Gets active interrupt ( reads the active register in NVIC and returns the active bit). + 442:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @param IRQn External interrupt number + 443:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * This parameter can be an enumerator of IRQn_Type enumeration + 444:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSI + 445:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @retval status: - 0 Interrupt status is not pending. + 446:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * - 1 Interrupt status is pending. + 447:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** */ + 448:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** uint32_t HAL_NVIC_GetActive(IRQn_Type IRQn) + 449:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** { + 1120 .loc 1 449 1 is_stmt 1 view -0 + 1121 .cfi_startproc + 1122 @ args = 0, pretend = 0, frame = 0 + 1123 @ frame_needed = 0, uses_anonymous_args = 0 + 1124 @ link register save eliminated. + 450:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /* Return 1 if active else 0U */ + 451:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** return NVIC_GetActive(IRQn); + 1125 .loc 1 451 3 view .LVU295 + 1126 .LBB58: + 1127 .LBI58: +1794:Drivers/CMSIS/Include/core_cm4.h **** { + 1128 .loc 2 1794 26 view .LVU296 + 1129 .LBB59: +1796:Drivers/CMSIS/Include/core_cm4.h **** { + 1130 .loc 2 1796 3 view .LVU297 +1796:Drivers/CMSIS/Include/core_cm4.h **** { + 1131 .loc 2 1796 6 is_stmt 0 view .LVU298 + 1132 0000 0028 cmp r0, #0 + 1133 .LVL68: +1796:Drivers/CMSIS/Include/core_cm4.h **** { + 1134 .loc 2 1796 6 view .LVU299 + 1135 0002 0BDB blt .L78 +1798:Drivers/CMSIS/Include/core_cm4.h **** } + 1136 .loc 2 1798 5 is_stmt 1 view .LVU300 +1798:Drivers/CMSIS/Include/core_cm4.h **** } + 1137 .loc 2 1798 54 is_stmt 0 view .LVU301 + 1138 0004 4309 lsrs r3, r0, #5 +1798:Drivers/CMSIS/Include/core_cm4.h **** } + ARM GAS /tmp/ccPJu8Ry.s page 81 + + + 1139 .loc 2 1798 35 view .LVU302 + 1140 0006 8033 adds r3, r3, #128 + 1141 0008 054A ldr r2, .L79 + 1142 000a 52F82330 ldr r3, [r2, r3, lsl #2] +1798:Drivers/CMSIS/Include/core_cm4.h **** } + 1143 .loc 2 1798 91 view .LVU303 + 1144 000e 00F01F00 and r0, r0, #31 +1798:Drivers/CMSIS/Include/core_cm4.h **** } + 1145 .loc 2 1798 103 view .LVU304 + 1146 0012 23FA00F0 lsr r0, r3, r0 +1798:Drivers/CMSIS/Include/core_cm4.h **** } + 1147 .loc 2 1798 12 view .LVU305 + 1148 0016 00F00100 and r0, r0, #1 + 1149 001a 7047 bx lr + 1150 .L78: +1802:Drivers/CMSIS/Include/core_cm4.h **** } + 1151 .loc 2 1802 11 view .LVU306 + 1152 001c 0020 movs r0, #0 + 1153 .LVL69: +1802:Drivers/CMSIS/Include/core_cm4.h **** } + 1154 .loc 2 1802 11 view .LVU307 + 1155 .LBE59: + 1156 .LBE58: + 452:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** } + 1157 .loc 1 452 1 view .LVU308 + 1158 001e 7047 bx lr + 1159 .L80: + 1160 .align 2 + 1161 .L79: + 1162 0020 00E100E0 .word -536813312 + 1163 .cfi_endproc + 1164 .LFE144: + 1166 .section .text.HAL_SYSTICK_CLKSourceConfig,"ax",%progbits + 1167 .align 1 + 1168 .global HAL_SYSTICK_CLKSourceConfig + 1169 .syntax unified + 1170 .thumb + 1171 .thumb_func + 1173 HAL_SYSTICK_CLKSourceConfig: + 1174 .LVL70: + 1175 .LFB145: + 453:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 454:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /** + 455:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @brief Configures the SysTick clock source. + 456:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @param CLKSource specifies the SysTick clock source. + 457:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * This parameter can be one of the following values: + 458:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @arg SYSTICK_CLKSOURCE_HCLK_DIV8: AHB clock divided by 8 selected as SysTick clock + 459:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @arg SYSTICK_CLKSOURCE_HCLK: AHB clock selected as SysTick clock source. + 460:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @retval None + 461:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** */ + 462:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** void HAL_SYSTICK_CLKSourceConfig(uint32_t CLKSource) + 463:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** { + 1176 .loc 1 463 1 is_stmt 1 view -0 + 1177 .cfi_startproc + 1178 @ args = 0, pretend = 0, frame = 0 + 1179 @ frame_needed = 0, uses_anonymous_args = 0 + 1180 @ link register save eliminated. + ARM GAS /tmp/ccPJu8Ry.s page 82 + + + 464:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /* Check the parameters */ + 465:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** assert_param(IS_SYSTICK_CLK_SOURCE(CLKSource)); + 1181 .loc 1 465 3 view .LVU310 + 466:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** if (CLKSource == SYSTICK_CLKSOURCE_HCLK) + 1182 .loc 1 466 3 view .LVU311 + 1183 .loc 1 466 6 is_stmt 0 view .LVU312 + 1184 0000 0428 cmp r0, #4 + 1185 0002 06D0 beq .L84 + 467:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** { + 468:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** SysTick->CTRL |= SYSTICK_CLKSOURCE_HCLK; + 469:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** } + 470:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** else + 471:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** { + 472:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** SysTick->CTRL &= ~SYSTICK_CLKSOURCE_HCLK; + 1186 .loc 1 472 5 is_stmt 1 view .LVU313 + 1187 .loc 1 472 12 is_stmt 0 view .LVU314 + 1188 0004 4FF0E022 mov r2, #-536813568 + 1189 0008 1369 ldr r3, [r2, #16] + 1190 .loc 1 472 19 view .LVU315 + 1191 000a 23F00403 bic r3, r3, #4 + 1192 000e 1361 str r3, [r2, #16] + 473:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** } + 474:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** } + 1193 .loc 1 474 1 view .LVU316 + 1194 0010 7047 bx lr + 1195 .L84: + 468:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** } + 1196 .loc 1 468 5 is_stmt 1 view .LVU317 + 468:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** } + 1197 .loc 1 468 12 is_stmt 0 view .LVU318 + 1198 0012 4FF0E022 mov r2, #-536813568 + 1199 0016 1369 ldr r3, [r2, #16] + 468:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** } + 1200 .loc 1 468 19 view .LVU319 + 1201 0018 43F00403 orr r3, r3, #4 + 1202 001c 1361 str r3, [r2, #16] + 1203 001e 7047 bx lr + 1204 .cfi_endproc + 1205 .LFE145: + 1207 .section .text.HAL_SYSTICK_Callback,"ax",%progbits + 1208 .align 1 + 1209 .weak HAL_SYSTICK_Callback + 1210 .syntax unified + 1211 .thumb + 1212 .thumb_func + 1214 HAL_SYSTICK_Callback: + 1215 .LFB147: + 475:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 476:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /** + 477:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @brief This function handles SYSTICK interrupt request. + 478:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @retval None + 479:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** */ + 480:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** void HAL_SYSTICK_IRQHandler(void) + 481:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** { + 482:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** HAL_SYSTICK_Callback(); + 483:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** } + 484:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + ARM GAS /tmp/ccPJu8Ry.s page 83 + + + 485:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /** + 486:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @brief SYSTICK callback. + 487:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** * @retval None + 488:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** */ + 489:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** __weak void HAL_SYSTICK_Callback(void) + 490:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** { + 1216 .loc 1 490 1 is_stmt 1 view -0 + 1217 .cfi_startproc + 1218 @ args = 0, pretend = 0, frame = 0 + 1219 @ frame_needed = 0, uses_anonymous_args = 0 + 1220 @ link register save eliminated. + 491:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** /* NOTE : This function Should not be modified, when the callback is needed, + 492:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** the HAL_SYSTICK_Callback could be implemented in the user file + 493:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** */ + 494:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** } + 1221 .loc 1 494 1 view .LVU321 + 1222 0000 7047 bx lr + 1223 .cfi_endproc + 1224 .LFE147: + 1226 .section .text.HAL_SYSTICK_IRQHandler,"ax",%progbits + 1227 .align 1 + 1228 .global HAL_SYSTICK_IRQHandler + 1229 .syntax unified + 1230 .thumb + 1231 .thumb_func + 1233 HAL_SYSTICK_IRQHandler: + 1234 .LFB146: + 481:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** HAL_SYSTICK_Callback(); + 1235 .loc 1 481 1 view -0 + 1236 .cfi_startproc + 1237 @ args = 0, pretend = 0, frame = 0 + 1238 @ frame_needed = 0, uses_anonymous_args = 0 + 1239 0000 08B5 push {r3, lr} + 1240 .cfi_def_cfa_offset 8 + 1241 .cfi_offset 3, -8 + 1242 .cfi_offset 14, -4 + 482:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** } + 1243 .loc 1 482 3 view .LVU323 + 1244 0002 FFF7FEFF bl HAL_SYSTICK_Callback + 1245 .LVL71: + 483:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c **** + 1246 .loc 1 483 1 is_stmt 0 view .LVU324 + 1247 0006 08BD pop {r3, pc} + 1248 .cfi_endproc + 1249 .LFE146: + 1251 .text + 1252 .Letext0: + 1253 .file 4 "Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h" + 1254 .file 5 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 1255 .file 6 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 1256 .file 7 "Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h" + 1257 .file 8 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h" + ARM GAS /tmp/ccPJu8Ry.s page 84 + + +DEFINED SYMBOLS + *ABS*:0000000000000000 stm32f3xx_hal_cortex.c + /tmp/ccPJu8Ry.s:21 .text.__NVIC_DisableIRQ:0000000000000000 $t + /tmp/ccPJu8Ry.s:26 .text.__NVIC_DisableIRQ:0000000000000000 __NVIC_DisableIRQ + /tmp/ccPJu8Ry.s:88 .text.__NVIC_DisableIRQ:0000000000000020 $d + /tmp/ccPJu8Ry.s:93 .text.__NVIC_SetPriority:0000000000000000 $t + /tmp/ccPJu8Ry.s:98 .text.__NVIC_SetPriority:0000000000000000 __NVIC_SetPriority + /tmp/ccPJu8Ry.s:141 .text.__NVIC_SetPriority:0000000000000024 $d + /tmp/ccPJu8Ry.s:146 .text.__NVIC_GetPriority:0000000000000000 $t + /tmp/ccPJu8Ry.s:151 .text.__NVIC_GetPriority:0000000000000000 __NVIC_GetPriority + /tmp/ccPJu8Ry.s:187 .text.__NVIC_GetPriority:0000000000000020 $d + /tmp/ccPJu8Ry.s:192 .text.NVIC_EncodePriority:0000000000000000 $t + /tmp/ccPJu8Ry.s:197 .text.NVIC_EncodePriority:0000000000000000 NVIC_EncodePriority + /tmp/ccPJu8Ry.s:258 .text.NVIC_DecodePriority:0000000000000000 $t + /tmp/ccPJu8Ry.s:263 .text.NVIC_DecodePriority:0000000000000000 NVIC_DecodePriority + /tmp/ccPJu8Ry.s:331 .text.__NVIC_SystemReset:0000000000000000 $t + /tmp/ccPJu8Ry.s:336 .text.__NVIC_SystemReset:0000000000000000 __NVIC_SystemReset + /tmp/ccPJu8Ry.s:397 .text.__NVIC_SystemReset:000000000000001c $d + /tmp/ccPJu8Ry.s:403 .text.HAL_NVIC_SetPriorityGrouping:0000000000000000 $t + /tmp/ccPJu8Ry.s:409 .text.HAL_NVIC_SetPriorityGrouping:0000000000000000 HAL_NVIC_SetPriorityGrouping + /tmp/ccPJu8Ry.s:463 .text.HAL_NVIC_SetPriorityGrouping:0000000000000020 $d + /tmp/ccPJu8Ry.s:468 .text.HAL_NVIC_SetPriority:0000000000000000 $t + /tmp/ccPJu8Ry.s:474 .text.HAL_NVIC_SetPriority:0000000000000000 HAL_NVIC_SetPriority + /tmp/ccPJu8Ry.s:520 .text.HAL_NVIC_SetPriority:000000000000001c $d + /tmp/ccPJu8Ry.s:525 .text.HAL_NVIC_EnableIRQ:0000000000000000 $t + /tmp/ccPJu8Ry.s:531 .text.HAL_NVIC_EnableIRQ:0000000000000000 HAL_NVIC_EnableIRQ + /tmp/ccPJu8Ry.s:572 .text.HAL_NVIC_EnableIRQ:0000000000000018 $d + /tmp/ccPJu8Ry.s:577 .text.HAL_NVIC_DisableIRQ:0000000000000000 $t + /tmp/ccPJu8Ry.s:583 .text.HAL_NVIC_DisableIRQ:0000000000000000 HAL_NVIC_DisableIRQ + /tmp/ccPJu8Ry.s:605 .text.HAL_NVIC_SystemReset:0000000000000000 $t + /tmp/ccPJu8Ry.s:611 .text.HAL_NVIC_SystemReset:0000000000000000 HAL_NVIC_SystemReset + /tmp/ccPJu8Ry.s:629 .text.HAL_SYSTICK_Config:0000000000000000 $t + /tmp/ccPJu8Ry.s:635 .text.HAL_SYSTICK_Config:0000000000000000 HAL_SYSTICK_Config + /tmp/ccPJu8Ry.s:700 .text.HAL_SYSTICK_Config:0000000000000024 $d + /tmp/ccPJu8Ry.s:705 .text.HAL_MPU_Disable:0000000000000000 $t + /tmp/ccPJu8Ry.s:711 .text.HAL_MPU_Disable:0000000000000000 HAL_MPU_Disable + /tmp/ccPJu8Ry.s:734 .text.HAL_MPU_Disable:0000000000000014 $d + /tmp/ccPJu8Ry.s:739 .text.HAL_MPU_Enable:0000000000000000 $t + /tmp/ccPJu8Ry.s:745 .text.HAL_MPU_Enable:0000000000000000 HAL_MPU_Enable + /tmp/ccPJu8Ry.s:771 .text.HAL_MPU_Enable:0000000000000014 $d + /tmp/ccPJu8Ry.s:776 .text.HAL_MPU_ConfigRegion:0000000000000000 $t + /tmp/ccPJu8Ry.s:782 .text.HAL_MPU_ConfigRegion:0000000000000000 HAL_MPU_ConfigRegion + /tmp/ccPJu8Ry.s:871 .text.HAL_MPU_ConfigRegion:000000000000005c $d + /tmp/ccPJu8Ry.s:876 .text.HAL_NVIC_GetPriorityGrouping:0000000000000000 $t + /tmp/ccPJu8Ry.s:882 .text.HAL_NVIC_GetPriorityGrouping:0000000000000000 HAL_NVIC_GetPriorityGrouping + /tmp/ccPJu8Ry.s:906 .text.HAL_NVIC_GetPriorityGrouping:000000000000000c $d + /tmp/ccPJu8Ry.s:911 .text.HAL_NVIC_GetPriority:0000000000000000 $t + /tmp/ccPJu8Ry.s:917 .text.HAL_NVIC_GetPriority:0000000000000000 HAL_NVIC_GetPriority + /tmp/ccPJu8Ry.s:951 .text.HAL_NVIC_SetPendingIRQ:0000000000000000 $t + /tmp/ccPJu8Ry.s:957 .text.HAL_NVIC_SetPendingIRQ:0000000000000000 HAL_NVIC_SetPendingIRQ + /tmp/ccPJu8Ry.s:998 .text.HAL_NVIC_SetPendingIRQ:0000000000000018 $d + /tmp/ccPJu8Ry.s:1003 .text.HAL_NVIC_GetPendingIRQ:0000000000000000 $t + /tmp/ccPJu8Ry.s:1009 .text.HAL_NVIC_GetPendingIRQ:0000000000000000 HAL_NVIC_GetPendingIRQ + /tmp/ccPJu8Ry.s:1054 .text.HAL_NVIC_GetPendingIRQ:0000000000000020 $d + /tmp/ccPJu8Ry.s:1059 .text.HAL_NVIC_ClearPendingIRQ:0000000000000000 $t + /tmp/ccPJu8Ry.s:1065 .text.HAL_NVIC_ClearPendingIRQ:0000000000000000 HAL_NVIC_ClearPendingIRQ + /tmp/ccPJu8Ry.s:1106 .text.HAL_NVIC_ClearPendingIRQ:0000000000000018 $d + ARM GAS /tmp/ccPJu8Ry.s page 85 + + + /tmp/ccPJu8Ry.s:1111 .text.HAL_NVIC_GetActive:0000000000000000 $t + /tmp/ccPJu8Ry.s:1117 .text.HAL_NVIC_GetActive:0000000000000000 HAL_NVIC_GetActive + /tmp/ccPJu8Ry.s:1162 .text.HAL_NVIC_GetActive:0000000000000020 $d + /tmp/ccPJu8Ry.s:1167 .text.HAL_SYSTICK_CLKSourceConfig:0000000000000000 $t + /tmp/ccPJu8Ry.s:1173 .text.HAL_SYSTICK_CLKSourceConfig:0000000000000000 HAL_SYSTICK_CLKSourceConfig + /tmp/ccPJu8Ry.s:1208 .text.HAL_SYSTICK_Callback:0000000000000000 $t + /tmp/ccPJu8Ry.s:1214 .text.HAL_SYSTICK_Callback:0000000000000000 HAL_SYSTICK_Callback + /tmp/ccPJu8Ry.s:1227 .text.HAL_SYSTICK_IRQHandler:0000000000000000 $t + /tmp/ccPJu8Ry.s:1233 .text.HAL_SYSTICK_IRQHandler:0000000000000000 HAL_SYSTICK_IRQHandler + +NO UNDEFINED SYMBOLS diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_cortex.o b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_cortex.o new file mode 100644 index 0000000000000000000000000000000000000000..7327a9de4afe8bc5e5b0914cf7fc2b2931294071 GIT binary patch literal 21976 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 literal 0 HcmV?d00001 diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_dma.d b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_dma.d new file mode 100644 index 0000000..34cb86c --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_dma.d @@ -0,0 +1,58 @@ +build/stm32f3xx_hal_dma.o: \ + Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h \ + Core/Inc/stm32f3xx_hal_conf.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h \ + Drivers/CMSIS/Include/core_cm4.h Drivers/CMSIS/Include/cmsis_version.h \ + Drivers/CMSIS/Include/cmsis_compiler.h Drivers/CMSIS/Include/cmsis_gcc.h \ + Drivers/CMSIS/Include/mpu_armv7.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h: +Core/Inc/stm32f3xx_hal_conf.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h: +Drivers/CMSIS/Include/core_cm4.h: +Drivers/CMSIS/Include/cmsis_version.h: +Drivers/CMSIS/Include/cmsis_compiler.h: +Drivers/CMSIS/Include/cmsis_gcc.h: +Drivers/CMSIS/Include/mpu_armv7.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h: +Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h: diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_dma.lst b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_dma.lst new file mode 100644 index 0000000..e627a51 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_dma.lst @@ -0,0 +1,3047 @@ +ARM GAS /tmp/ccaRdTju.s page 1 + + + 1 .cpu cortex-m4 + 2 .arch armv7e-m + 3 .fpu fpv4-sp-d16 + 4 .eabi_attribute 27, 1 + 5 .eabi_attribute 28, 1 + 6 .eabi_attribute 20, 1 + 7 .eabi_attribute 21, 1 + 8 .eabi_attribute 23, 3 + 9 .eabi_attribute 24, 1 + 10 .eabi_attribute 25, 1 + 11 .eabi_attribute 26, 1 + 12 .eabi_attribute 30, 1 + 13 .eabi_attribute 34, 1 + 14 .eabi_attribute 18, 4 + 15 .file "stm32f3xx_hal_dma.c" + 16 .text + 17 .Ltext0: + 18 .cfi_sections .debug_frame + 19 .file 1 "Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c" + 20 .section .text.DMA_SetConfig,"ax",%progbits + 21 .align 1 + 22 .syntax unified + 23 .thumb + 24 .thumb_func + 26 DMA_SetConfig: + 27 .LVL0: + 28 .LFB142: + 1:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /** + 2:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** ****************************************************************************** + 3:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @file stm32f3xx_hal_dma.c + 4:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @author MCD Application Team + 5:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @brief DMA HAL module driver. + 6:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * + 7:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * This file provides firmware functions to manage the following + 8:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * functionalities of the Direct Memory Access (DMA) peripheral: + 9:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * + Initialization and de-initialization functions + 10:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * + IO operation functions + 11:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * + Peripheral State and errors functions + 12:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** @verbatim + 13:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** ============================================================================== + 14:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** ##### How to use this driver ##### + 15:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** ============================================================================== + 16:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** [..] + 17:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** (#) Enable and configure the peripheral to be connected to the DMA Channel + 18:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** (except for internal SRAM / FLASH memories: no initialization is + 19:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** necessary). Please refer to Reference manual for connection between peripherals + 20:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** and DMA requests . + 21:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 22:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** (#) For a given Channel, program the required configuration through the following parameters: + 23:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** Transfer Direction, Source and Destination data formats, + 24:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** Circular or Normal mode, Channel Priority level, Source and Destination Increment mode, + 25:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** using HAL_DMA_Init() function. + 26:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 27:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** (#) Use HAL_DMA_GetState() function to return the DMA state and HAL_DMA_GetError() in case of er + 28:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** detection. + 29:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 30:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** (#) Use HAL_DMA_Abort() function to abort the current transfer + ARM GAS /tmp/ccaRdTju.s page 2 + + + 31:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 32:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** -@- In Memory-to-Memory transfer mode, Circular mode is not allowed. + 33:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** *** Polling mode IO operation *** + 34:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** ================================= + 35:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** [..] + 36:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** (+) Use HAL_DMA_Start() to start DMA transfer after the configuration of Source + 37:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** address and destination address and the Length of data to be transferred + 38:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** (+) Use HAL_DMA_PollForTransfer() to poll for the end of current transfer, in this + 39:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** case a fixed Timeout can be configured by User depending from his application. + 40:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 41:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** *** Interrupt mode IO operation *** + 42:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** =================================== + 43:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** [..] + 44:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** (+) Configure the DMA interrupt priority using HAL_NVIC_SetPriority() + 45:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** (+) Enable the DMA IRQ handler using HAL_NVIC_EnableIRQ() + 46:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** (+) Use HAL_DMA_Start_IT() to start DMA transfer after the configuration of + 47:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** Source address and destination address and the Length of data to be transferred. + 48:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** In this case the DMA interrupt is configured + 49:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** (+) Use HAL_DMA_Channel_IRQHandler() called under DMA_IRQHandler() Interrupt subroutine + 50:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** (+) At the end of data transfer HAL_DMA_IRQHandler() function is executed and user can + 51:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** add his own function by customization of function pointer XferCpltCallback and + 52:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** XferErrorCallback (i.e a member of DMA handle structure). + 53:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 54:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** *** DMA HAL driver macros list *** + 55:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** ============================================= + 56:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** [..] + 57:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** Below the list of most used macros in DMA HAL driver. + 58:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 59:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** [..] + 60:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** (@) You can refer to the DMA HAL driver header file for more useful macros + 61:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 62:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** @endverbatim + 63:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** ****************************************************************************** + 64:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @attention + 65:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * + 66:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** *

    © Copyright (c) 2016 STMicroelectronics. + 67:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * All rights reserved.

    + 68:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * + 69:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * This software component is licensed by ST under BSD 3-Clause license, + 70:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * the "License"; You may not use this file except in compliance with the + 71:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * License. You may obtain a copy of the License at: + 72:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * opensource.org/licenses/BSD-3-Clause + 73:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * + 74:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** ****************************************************************************** + 75:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** */ + 76:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 77:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Includes ------------------------------------------------------------------*/ + 78:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** #include "stm32f3xx_hal.h" + 79:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 80:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /** @addtogroup STM32F3xx_HAL_Driver + 81:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @{ + 82:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** */ + 83:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 84:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /** @defgroup DMA DMA + 85:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @brief DMA HAL module driver + 86:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @{ + 87:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** */ + ARM GAS /tmp/ccaRdTju.s page 3 + + + 88:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 89:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** #ifdef HAL_DMA_MODULE_ENABLED + 90:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 91:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Private typedef -----------------------------------------------------------*/ + 92:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Private define ------------------------------------------------------------*/ + 93:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Private macro -------------------------------------------------------------*/ + 94:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Private variables ---------------------------------------------------------*/ + 95:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Private function prototypes -----------------------------------------------*/ + 96:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /** @defgroup DMA_Private_Functions DMA Private Functions + 97:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @{ + 98:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** */ + 99:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** static void DMA_SetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32 + 100:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** static void DMA_CalcBaseAndBitshift(DMA_HandleTypeDef *hdma); + 101:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /** + 102:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @} + 103:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** */ + 104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 105:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Exported functions ---------------------------------------------------------*/ + 106:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 107:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /** @defgroup DMA_Exported_Functions DMA Exported Functions + 108:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @{ + 109:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** */ + 110:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 111:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /** @defgroup DMA_Exported_Functions_Group1 Initialization and de-initialization functions + 112:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @brief Initialization and de-initialization functions + 113:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * + 114:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** @verbatim + 115:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** =============================================================================== + 116:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** ##### Initialization and de-initialization functions ##### + 117:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** =============================================================================== + 118:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** [..] + 119:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** This section provides functions allowing to initialize the DMA Channel source + 120:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** and destination addresses, incrementation and data sizes, transfer direction, + 121:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** circular/normal mode selection, memory-to-memory mode selection and Channel priority value. + 122:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** [..] + 123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** The HAL_DMA_Init() function follows the DMA configuration procedures as described in + 124:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** reference manual. + 125:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 126:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** @endverbatim + 127:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @{ + 128:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** */ + 129:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 130:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /** + 131:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @brief Initialize the DMA according to the specified + 132:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * parameters in the DMA_InitTypeDef and initialize the associated handle. + 133:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @param hdma Pointer to a DMA_HandleTypeDef structure that contains + 134:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * the configuration information for the specified DMA Channel. + 135:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @retval HAL status + 136:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** */ + 137:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma) + 138:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** uint32_t tmp = 0U; + 140:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 141:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Check the DMA handle allocation */ + 142:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** if(NULL == hdma) + 143:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 144:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** return HAL_ERROR; + ARM GAS /tmp/ccaRdTju.s page 4 + + + 145:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 146:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 147:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Check the parameters */ + 148:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** assert_param(IS_DMA_ALL_INSTANCE(hdma->Instance)); + 149:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** assert_param(IS_DMA_DIRECTION(hdma->Init.Direction)); + 150:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** assert_param(IS_DMA_PERIPHERAL_INC_STATE(hdma->Init.PeriphInc)); + 151:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** assert_param(IS_DMA_MEMORY_INC_STATE(hdma->Init.MemInc)); + 152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** assert_param(IS_DMA_PERIPHERAL_DATA_SIZE(hdma->Init.PeriphDataAlignment)); + 153:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** assert_param(IS_DMA_MEMORY_DATA_SIZE(hdma->Init.MemDataAlignment)); + 154:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** assert_param(IS_DMA_MODE(hdma->Init.Mode)); + 155:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** assert_param(IS_DMA_PRIORITY(hdma->Init.Priority)); + 156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 157:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Change DMA peripheral state */ + 158:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->State = HAL_DMA_STATE_BUSY; + 159:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 160:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Get the CR register value */ + 161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** tmp = hdma->Instance->CCR; + 162:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 163:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Clear PL, MSIZE, PSIZE, MINC, PINC, CIRC, DIR bits */ + 164:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** tmp &= ((uint32_t)~(DMA_CCR_PL | DMA_CCR_MSIZE | DMA_CCR_PSIZE | \ + 165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** DMA_CCR_MINC | DMA_CCR_PINC | DMA_CCR_CIRC | \ + 166:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** DMA_CCR_DIR)); + 167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Prepare the DMA Channel configuration */ + 169:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** tmp |= hdma->Init.Direction | + 170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Init.PeriphInc | hdma->Init.MemInc | + 171:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Init.PeriphDataAlignment | hdma->Init.MemDataAlignment | + 172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Init.Mode | hdma->Init.Priority; + 173:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 174:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Write to DMA Channel CR register */ + 175:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Instance->CCR = tmp; + 176:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 177:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Initialize DmaBaseAddress and ChannelIndex parameters used + 178:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** by HAL_DMA_IRQHandler() and HAL_DMA_PollForTransfer() */ + 179:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** DMA_CalcBaseAndBitshift(hdma); + 180:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 181:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Initialise the error code */ + 182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->ErrorCode = HAL_DMA_ERROR_NONE; + 183:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 184:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Initialize the DMA state*/ + 185:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->State = HAL_DMA_STATE_READY; + 186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 187:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Allocate lock resource and initialize it */ + 188:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Lock = HAL_UNLOCKED; + 189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 190:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** return HAL_OK; + 191:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 192:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 193:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /** + 194:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @brief DeInitialize the DMA peripheral + 195:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @param hdma pointer to a DMA_HandleTypeDef structure that contains + 196:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * the configuration information for the specified DMA Channel. + 197:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @retval HAL status + 198:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** */ + 199:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** HAL_StatusTypeDef HAL_DMA_DeInit(DMA_HandleTypeDef *hdma) + 200:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 201:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Check the DMA handle allocation */ + ARM GAS /tmp/ccaRdTju.s page 5 + + + 202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** if(NULL == hdma) + 203:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 204:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** return HAL_ERROR; + 205:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 206:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 207:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Check the parameters */ + 208:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** assert_param(IS_DMA_ALL_INSTANCE(hdma->Instance)); + 209:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 210:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Disable the selected DMA Channelx */ + 211:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Instance->CCR &= ~DMA_CCR_EN; + 212:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Reset DMA Channel control register */ + 214:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Instance->CCR = 0U; + 215:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 216:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Reset DMA Channel Number of Data to Transfer register */ + 217:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Instance->CNDTR = 0U; + 218:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 219:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Reset DMA Channel peripheral address register */ + 220:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Instance->CPAR = 0U; + 221:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 222:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Reset DMA Channel memory address register */ + 223:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Instance->CMAR = 0U; + 224:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 225:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Get DMA Base Address */ + 226:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** DMA_CalcBaseAndBitshift(hdma); + 227:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 228:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Clear all flags */ + 229:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->DmaBaseAddress->IFCR = DMA_FLAG_GL1 << hdma->ChannelIndex; + 230:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 231:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Clean callbacks */ + 232:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->XferCpltCallback = NULL; + 233:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->XferHalfCpltCallback = NULL; + 234:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->XferErrorCallback = NULL; + 235:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->XferAbortCallback = NULL; + 236:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 237:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Reset the error code */ + 238:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->ErrorCode = HAL_DMA_ERROR_NONE; + 239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 240:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Reset the DMA state */ + 241:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->State = HAL_DMA_STATE_RESET; + 242:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 243:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Release Lock */ + 244:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** __HAL_UNLOCK(hdma); + 245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 246:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** return HAL_OK; + 247:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 248:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /** + 250:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @} + 251:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** */ + 252:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 253:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /** @defgroup DMA_Exported_Functions_Group2 Input and Output operation functions + 254:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @brief I/O operation functions + 255:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * + 256:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** @verbatim + 257:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** =============================================================================== + 258:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** ##### IO operation functions ##### + ARM GAS /tmp/ccaRdTju.s page 6 + + + 259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** =============================================================================== + 260:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** [..] This section provides functions allowing to: + 261:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** (+) Configure the source, destination address and data length and Start DMA transfer + 262:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** (+) Configure the source, destination address and data length and + 263:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** Start DMA transfer with interrupt + 264:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** (+) Abort DMA transfer + 265:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** (+) Poll for transfer complete + 266:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** (+) Handle DMA interrupt request + 267:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 268:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** @endverbatim + 269:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @{ + 270:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** */ + 271:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 272:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /** + 273:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @brief Start the DMA Transfer. + 274:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @param hdma : pointer to a DMA_HandleTypeDef structure that contains + 275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * the configuration information for the specified DMA Channel. + 276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @param SrcAddress The source memory Buffer address + 277:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @param DstAddress The destination memory Buffer address + 278:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @param DataLength The length of data to be transferred from source to destination + 279:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @retval HAL status + 280:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** */ + 281:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** HAL_StatusTypeDef HAL_DMA_Start(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, + 282:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 283:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** HAL_StatusTypeDef status = HAL_OK; + 284:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 285:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Check the parameters */ + 286:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** assert_param(IS_DMA_BUFFER_SIZE(DataLength)); + 287:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Process locked */ + 289:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** __HAL_LOCK(hdma); + 290:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** if(HAL_DMA_STATE_READY == hdma->State) + 292:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 293:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Change DMA peripheral state */ + 294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->State = HAL_DMA_STATE_BUSY; + 295:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->ErrorCode = HAL_DMA_ERROR_NONE; + 297:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 298:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Disable the peripheral */ + 299:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Instance->CCR &= ~DMA_CCR_EN; + 300:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 301:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Configure the source, destination address and the data length */ + 302:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** DMA_SetConfig(hdma, SrcAddress, DstAddress, DataLength); + 303:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 304:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Enable the Peripheral */ + 305:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Instance->CCR |= DMA_CCR_EN; + 306:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 307:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** else + 308:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 309:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Process Unlocked */ + 310:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** __HAL_UNLOCK(hdma); + 311:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 312:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Remain BUSY */ + 313:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** status = HAL_BUSY; + 314:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + ARM GAS /tmp/ccaRdTju.s page 7 + + + 316:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** return status; + 317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 318:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 319:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /** + 320:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @brief Start the DMA Transfer with interrupt enabled. + 321:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @param hdma pointer to a DMA_HandleTypeDef structure that contains + 322:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * the configuration information for the specified DMA Channel. + 323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @param SrcAddress The source memory Buffer address + 324:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @param DstAddress The destination memory Buffer address + 325:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @param DataLength The length of data to be transferred from source to destination + 326:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @retval HAL status + 327:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** */ + 328:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddres + 329:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 330:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** HAL_StatusTypeDef status = HAL_OK; + 331:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 332:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Check the parameters */ + 333:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** assert_param(IS_DMA_BUFFER_SIZE(DataLength)); + 334:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 335:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Process locked */ + 336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** __HAL_LOCK(hdma); + 337:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 338:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** if(HAL_DMA_STATE_READY == hdma->State) + 339:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 340:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Change DMA peripheral state */ + 341:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->State = HAL_DMA_STATE_BUSY; + 342:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->ErrorCode = HAL_DMA_ERROR_NONE; + 344:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 345:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Disable the peripheral */ + 346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Instance->CCR &= ~DMA_CCR_EN; + 347:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 348:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Configure the source, destination address and the data length */ + 349:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** DMA_SetConfig(hdma, SrcAddress, DstAddress, DataLength); + 350:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 351:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Enable the transfer complete, & transfer error interrupts */ + 352:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Half transfer interrupt is optional: enable it only if associated callback is available */ + 353:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** if(NULL != hdma->XferHalfCpltCallback ) + 354:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Instance->CCR |= (DMA_IT_TC | DMA_IT_HT | DMA_IT_TE); + 356:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 357:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** else + 358:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 359:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Instance->CCR |= (DMA_IT_TC | DMA_IT_TE); + 360:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Instance->CCR &= ~DMA_IT_HT; + 361:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 362:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 363:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Enable the Peripheral */ + 364:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Instance->CCR |= DMA_CCR_EN; + 365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 366:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** else + 367:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 368:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Process Unlocked */ + 369:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** __HAL_UNLOCK(hdma); + 370:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 371:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Remain BUSY */ + 372:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** status = HAL_BUSY; + ARM GAS /tmp/ccaRdTju.s page 8 + + + 373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 374:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 375:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** return status; + 376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 377:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 378:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /** + 379:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @brief Abort the DMA Transfer. + 380:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @param hdma : pointer to a DMA_HandleTypeDef structure that contains + 381:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * the configuration information for the specified DMA Channel. + 382:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @retval HAL status + 383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** */ + 384:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** HAL_StatusTypeDef HAL_DMA_Abort(DMA_HandleTypeDef *hdma) + 385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** if(hdma->State != HAL_DMA_STATE_BUSY) + 387:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 388:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* no transfer ongoing */ + 389:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->ErrorCode = HAL_DMA_ERROR_NO_XFER; + 390:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 391:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Process Unlocked */ + 392:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** __HAL_UNLOCK(hdma); + 393:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 394:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** return HAL_ERROR; + 395:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 396:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** else + 397:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 398:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Disable DMA IT */ + 399:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Instance->CCR &= ~(DMA_IT_TC | DMA_IT_HT | DMA_IT_TE); + 400:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Disable the channel */ + 402:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Instance->CCR &= ~DMA_CCR_EN; + 403:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 404:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Clear all flags */ + 405:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->DmaBaseAddress->IFCR = (DMA_FLAG_GL1 << hdma->ChannelIndex); + 406:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Change the DMA state*/ + 408:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->State = HAL_DMA_STATE_READY; + 409:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 410:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Process Unlocked */ + 411:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** __HAL_UNLOCK(hdma); + 412:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 413:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** return HAL_OK; + 414:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 415:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 416:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /** + 417:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @brief Abort the DMA Transfer in Interrupt mode. + 418:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @param hdma : pointer to a DMA_HandleTypeDef structure that contains + 419:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * the configuration information for the specified DMA Stream. + 420:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @retval HAL status + 421:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** */ + 422:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** HAL_StatusTypeDef HAL_DMA_Abort_IT(DMA_HandleTypeDef *hdma) + 423:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 424:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** HAL_StatusTypeDef status = HAL_OK; + 425:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 426:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** if(HAL_DMA_STATE_BUSY != hdma->State) + 427:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 428:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* no transfer ongoing */ + 429:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->ErrorCode = HAL_DMA_ERROR_NO_XFER; + ARM GAS /tmp/ccaRdTju.s page 9 + + + 430:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 431:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** status = HAL_ERROR; + 432:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 433:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** else + 434:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 435:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 436:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Disable DMA IT */ + 437:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Instance->CCR &= ~(DMA_IT_TC | DMA_IT_HT | DMA_IT_TE); + 438:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 439:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Disable the channel */ + 440:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Instance->CCR &= ~DMA_CCR_EN; + 441:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 442:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Clear all flags */ + 443:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->DmaBaseAddress->IFCR = DMA_FLAG_GL1 << hdma->ChannelIndex; + 444:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 445:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Change the DMA state */ + 446:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->State = HAL_DMA_STATE_READY; + 447:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 448:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Process Unlocked */ + 449:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** __HAL_UNLOCK(hdma); + 450:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 451:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Call User Abort callback */ + 452:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** if(hdma->XferAbortCallback != NULL) + 453:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 454:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->XferAbortCallback(hdma); + 455:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 456:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 457:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** return status; + 458:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 459:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 460:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /** + 461:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @brief Polling for transfer complete. + 462:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @param hdma pointer to a DMA_HandleTypeDef structure that contains + 463:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * the configuration information for the specified DMA Channel. + 464:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @param CompleteLevel Specifies the DMA level complete. + 465:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @param Timeout Timeout duration. + 466:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @retval HAL status + 467:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** */ + 468:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** HAL_StatusTypeDef HAL_DMA_PollForTransfer(DMA_HandleTypeDef *hdma, uint32_t CompleteLevel, uint32_t + 469:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 470:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** uint32_t temp; + 471:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** uint32_t tickstart = 0U; + 472:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 473:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** if(HAL_DMA_STATE_BUSY != hdma->State) + 474:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 475:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* no transfer ongoing */ + 476:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->ErrorCode = HAL_DMA_ERROR_NO_XFER; + 477:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** __HAL_UNLOCK(hdma); + 478:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** return HAL_ERROR; + 479:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 480:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 481:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Polling mode not supported in circular mode */ + 482:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** if (RESET != (hdma->Instance->CCR & DMA_CCR_CIRC)) + 483:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 484:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->ErrorCode = HAL_DMA_ERROR_NOT_SUPPORTED; + 485:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** return HAL_ERROR; + 486:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + ARM GAS /tmp/ccaRdTju.s page 10 + + + 487:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 488:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Get the level transfer complete flag */ + 489:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** if(HAL_DMA_FULL_TRANSFER == CompleteLevel) + 490:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 491:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Transfer Complete flag */ + 492:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** temp = DMA_FLAG_TC1 << hdma->ChannelIndex; + 493:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 494:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** else + 495:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 496:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Half Transfer Complete flag */ + 497:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** temp = DMA_FLAG_HT1 << hdma->ChannelIndex; + 498:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 499:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 500:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Get tick */ + 501:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** tickstart = HAL_GetTick(); + 502:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 503:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** while(RESET == (hdma->DmaBaseAddress->ISR & temp)) + 504:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 505:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** if(RESET != (hdma->DmaBaseAddress->ISR & (DMA_FLAG_TE1 << hdma->ChannelIndex))) + 506:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 507:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* When a DMA transfer error occurs */ + 508:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* A hardware clear of its EN bits is performed */ + 509:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Clear all flags */ + 510:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->DmaBaseAddress->IFCR = DMA_FLAG_GL1 << hdma->ChannelIndex; + 511:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 512:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Update error code */ + 513:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->ErrorCode = HAL_DMA_ERROR_TE; + 514:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 515:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Change the DMA state */ + 516:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->State= HAL_DMA_STATE_READY; + 517:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 518:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Process Unlocked */ + 519:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** __HAL_UNLOCK(hdma); + 520:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 521:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** return HAL_ERROR; + 522:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 523:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Check for the Timeout */ + 524:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** if(Timeout != HAL_MAX_DELAY) + 525:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 526:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** if((Timeout == 0U) || ((HAL_GetTick() - tickstart) > Timeout)) + 527:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 528:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Update error code */ + 529:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->ErrorCode = HAL_DMA_ERROR_TIMEOUT; + 530:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 531:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Change the DMA state */ + 532:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->State = HAL_DMA_STATE_READY; + 533:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 534:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Process Unlocked */ + 535:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** __HAL_UNLOCK(hdma); + 536:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 537:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** return HAL_ERROR; + 538:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 539:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 540:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 541:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 542:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** if(HAL_DMA_FULL_TRANSFER == CompleteLevel) + 543:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + ARM GAS /tmp/ccaRdTju.s page 11 + + + 544:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Clear the transfer complete flag */ + 545:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->DmaBaseAddress->IFCR = DMA_FLAG_TC1 << hdma->ChannelIndex; + 546:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 547:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* The selected Channelx EN bit is cleared (DMA is disabled and + 548:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** all transfers are complete) */ + 549:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->State = HAL_DMA_STATE_READY; + 550:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 551:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** else + 552:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 553:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Clear the half transfer complete flag */ + 554:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->DmaBaseAddress->IFCR = DMA_FLAG_HT1 << hdma->ChannelIndex; + 555:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 556:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 557:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Process unlocked */ + 558:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** __HAL_UNLOCK(hdma); + 559:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 560:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** return HAL_OK; + 561:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 562:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 563:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /** + 564:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @brief Handle DMA interrupt request. + 565:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @param hdma pointer to a DMA_HandleTypeDef structure that contains + 566:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * the configuration information for the specified DMA Channel. + 567:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @retval None + 568:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** */ + 569:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** void HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma) + 570:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 571:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** uint32_t flag_it = hdma->DmaBaseAddress->ISR; + 572:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** uint32_t source_it = hdma->Instance->CCR; + 573:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 574:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Half Transfer Complete Interrupt management ******************************/ + 575:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** if ((RESET != (flag_it & (DMA_FLAG_HT1 << hdma->ChannelIndex))) && (RESET != (source_it & DMA_IT_ + 576:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 577:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Disable the half transfer interrupt if the DMA mode is not CIRCULAR */ + 578:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** if((hdma->Instance->CCR & DMA_CCR_CIRC) == 0U) + 579:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 580:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Disable the half transfer interrupt */ + 581:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Instance->CCR &= ~DMA_IT_HT; + 582:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 583:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 584:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Clear the half transfer complete flag */ + 585:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->DmaBaseAddress->IFCR = DMA_FLAG_HT1 << hdma->ChannelIndex; + 586:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 587:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* DMA peripheral state is not updated in Half Transfer */ + 588:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* State is updated only in Transfer Complete case */ + 589:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 590:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** if(hdma->XferHalfCpltCallback != NULL) + 591:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 592:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Half transfer callback */ + 593:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->XferHalfCpltCallback(hdma); + 594:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 595:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 596:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 597:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Transfer Complete Interrupt management ***********************************/ + 598:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** else if ((RESET != (flag_it & (DMA_FLAG_TC1 << hdma->ChannelIndex))) && (RESET != (source_it & DM + 599:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 600:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** if((hdma->Instance->CCR & DMA_CCR_CIRC) == 0U) + ARM GAS /tmp/ccaRdTju.s page 12 + + + 601:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 602:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Disable the transfer complete & transfer error interrupts */ + 603:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* if the DMA mode is not CIRCULAR */ + 604:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Instance->CCR &= ~(DMA_IT_TC | DMA_IT_TE); + 605:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 606:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Change the DMA state */ + 607:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->State = HAL_DMA_STATE_READY; + 608:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 609:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 610:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Clear the transfer complete flag */ + 611:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->DmaBaseAddress->IFCR = DMA_FLAG_TC1 << hdma->ChannelIndex; + 612:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 613:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Process Unlocked */ + 614:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** __HAL_UNLOCK(hdma); + 615:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 616:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** if(hdma->XferCpltCallback != NULL) + 617:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 618:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Transfer complete callback */ + 619:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->XferCpltCallback(hdma); + 620:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 621:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 622:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 623:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Transfer Error Interrupt management ***************************************/ + 624:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** else if (( RESET != (flag_it & (DMA_FLAG_TE1 << hdma->ChannelIndex))) && (RESET != (source_it & D + 625:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 626:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* When a DMA transfer error occurs */ + 627:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* A hardware clear of its EN bits is performed */ + 628:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Then, disable all DMA interrupts */ + 629:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Instance->CCR &= ~(DMA_IT_TC | DMA_IT_HT | DMA_IT_TE); + 630:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 631:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Clear all flags */ + 632:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->DmaBaseAddress->IFCR = DMA_FLAG_GL1 << hdma->ChannelIndex; + 633:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 634:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Update error code */ + 635:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->ErrorCode = HAL_DMA_ERROR_TE; + 636:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 637:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Change the DMA state */ + 638:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->State = HAL_DMA_STATE_READY; + 639:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 640:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Process Unlocked */ + 641:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** __HAL_UNLOCK(hdma); + 642:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 643:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** if(hdma->XferErrorCallback != NULL) + 644:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 645:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Transfer error callback */ + 646:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->XferErrorCallback(hdma); + 647:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 648:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 649:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 650:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 651:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /** + 652:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @brief Register callbacks + 653:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @param hdma pointer to a DMA_HandleTypeDef structure that contains + 654:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * the configuration information for the specified DMA Stream. + 655:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @param CallbackID User Callback identifer + 656:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * a HAL_DMA_CallbackIDTypeDef ENUM as parameter. + 657:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @param pCallback pointer to private callback function which has pointer to + ARM GAS /tmp/ccaRdTju.s page 13 + + + 658:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * a DMA_HandleTypeDef structure as parameter. + 659:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @retval HAL status + 660:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** */ + 661:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** HAL_StatusTypeDef HAL_DMA_RegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef Callb + 662:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 663:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** HAL_StatusTypeDef status = HAL_OK; + 664:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 665:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Process locked */ + 666:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** __HAL_LOCK(hdma); + 667:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 668:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** if(HAL_DMA_STATE_READY == hdma->State) + 669:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 670:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** switch (CallbackID) + 671:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 672:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** case HAL_DMA_XFER_CPLT_CB_ID: + 673:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->XferCpltCallback = pCallback; + 674:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** break; + 675:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 676:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** case HAL_DMA_XFER_HALFCPLT_CB_ID: + 677:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->XferHalfCpltCallback = pCallback; + 678:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** break; + 679:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 680:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** case HAL_DMA_XFER_ERROR_CB_ID: + 681:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->XferErrorCallback = pCallback; + 682:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** break; + 683:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 684:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** case HAL_DMA_XFER_ABORT_CB_ID: + 685:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->XferAbortCallback = pCallback; + 686:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** break; + 687:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 688:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** default: + 689:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** status = HAL_ERROR; + 690:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** break; + 691:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 692:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 693:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** else + 694:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 695:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** status = HAL_ERROR; + 696:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 697:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 698:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Release Lock */ + 699:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** __HAL_UNLOCK(hdma); + 700:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 701:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** return status; + 702:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 703:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 704:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /** + 705:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @brief UnRegister callbacks + 706:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @param hdma pointer to a DMA_HandleTypeDef structure that contains + 707:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * the configuration information for the specified DMA Stream. + 708:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @param CallbackID User Callback identifer + 709:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * a HAL_DMA_CallbackIDTypeDef ENUM as parameter. + 710:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @retval HAL status + 711:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** */ + 712:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** HAL_StatusTypeDef HAL_DMA_UnRegisterCallback(DMA_HandleTypeDef *hdma, HAL_DMA_CallbackIDTypeDef Cal + 713:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 714:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** HAL_StatusTypeDef status = HAL_OK; + ARM GAS /tmp/ccaRdTju.s page 14 + + + 715:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 716:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Process locked */ + 717:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** __HAL_LOCK(hdma); + 718:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 719:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** if(HAL_DMA_STATE_READY == hdma->State) + 720:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 721:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** switch (CallbackID) + 722:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 723:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** case HAL_DMA_XFER_CPLT_CB_ID: + 724:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->XferCpltCallback = NULL; + 725:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** break; + 726:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 727:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** case HAL_DMA_XFER_HALFCPLT_CB_ID: + 728:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->XferHalfCpltCallback = NULL; + 729:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** break; + 730:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 731:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** case HAL_DMA_XFER_ERROR_CB_ID: + 732:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->XferErrorCallback = NULL; + 733:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** break; + 734:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 735:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** case HAL_DMA_XFER_ABORT_CB_ID: + 736:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->XferAbortCallback = NULL; + 737:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** break; + 738:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 739:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** case HAL_DMA_XFER_ALL_CB_ID: + 740:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->XferCpltCallback = NULL; + 741:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->XferHalfCpltCallback = NULL; + 742:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->XferErrorCallback = NULL; + 743:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->XferAbortCallback = NULL; + 744:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** break; + 745:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 746:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** default: + 747:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** status = HAL_ERROR; + 748:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** break; + 749:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 750:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 751:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** else + 752:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 753:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** status = HAL_ERROR; + 754:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 755:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 756:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Release Lock */ + 757:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** __HAL_UNLOCK(hdma); + 758:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 759:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** return status; + 760:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 761:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 762:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /** + 763:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @} + 764:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** */ + 765:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 766:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /** @defgroup DMA_Exported_Functions_Group3 Peripheral State functions + 767:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @brief Peripheral State functions + 768:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * + 769:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** @verbatim + 770:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** =============================================================================== + 771:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** ##### State and Errors functions ##### + ARM GAS /tmp/ccaRdTju.s page 15 + + + 772:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** =============================================================================== + 773:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** [..] + 774:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** This subsection provides functions allowing to + 775:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** (+) Check the DMA state + 776:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** (+) Get error code + 777:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 778:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** @endverbatim + 779:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @{ + 780:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** */ + 781:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 782:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /** + 783:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @brief Returns the DMA state. + 784:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @param hdma pointer to a DMA_HandleTypeDef structure that contains + 785:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * the configuration information for the specified DMA Channel. + 786:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @retval HAL state + 787:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** */ + 788:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** HAL_DMA_StateTypeDef HAL_DMA_GetState(DMA_HandleTypeDef *hdma) + 789:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 790:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** return hdma->State; + 791:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 792:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 793:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /** + 794:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @brief Return the DMA error code + 795:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @param hdma pointer to a DMA_HandleTypeDef structure that contains + 796:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * the configuration information for the specified DMA Channel. + 797:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @retval DMA Error Code + 798:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** */ + 799:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** uint32_t HAL_DMA_GetError(DMA_HandleTypeDef *hdma) + 800:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 801:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** return hdma->ErrorCode; + 802:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 803:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 804:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /** + 805:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @} + 806:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** */ + 807:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 808:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /** + 809:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @} + 810:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** */ + 811:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 812:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /** @addtogroup DMA_Private_Functions + 813:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @{ + 814:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** */ + 815:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 816:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /** + 817:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @brief Set the DMA Transfer parameters. + 818:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @param hdma pointer to a DMA_HandleTypeDef structure that contains + 819:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * the configuration information for the specified DMA Channel. + 820:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @param SrcAddress The source memory Buffer address + 821:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @param DstAddress The destination memory Buffer address + 822:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @param DataLength The length of data to be transferred from source to destination + 823:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @retval HAL status + 824:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** */ + 825:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** static void DMA_SetConfig(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32 + 826:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 29 .loc 1 826 1 view -0 + 30 .cfi_startproc + ARM GAS /tmp/ccaRdTju.s page 16 + + + 31 @ args = 0, pretend = 0, frame = 0 + 32 @ frame_needed = 0, uses_anonymous_args = 0 + 33 @ link register save eliminated. + 34 .loc 1 826 1 is_stmt 0 view .LVU1 + 35 0000 30B4 push {r4, r5} + 36 .cfi_def_cfa_offset 8 + 37 .cfi_offset 4, -8 + 38 .cfi_offset 5, -4 + 827:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Clear all flags */ + 828:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->DmaBaseAddress->IFCR = (DMA_FLAG_GL1 << hdma->ChannelIndex); + 39 .loc 1 828 3 is_stmt 1 view .LVU2 + 40 .loc 1 828 47 is_stmt 0 view .LVU3 + 41 0002 0124 movs r4, #1 + 42 0004 056C ldr r5, [r0, #64] + 43 0006 AC40 lsls r4, r4, r5 + 44 .loc 1 828 31 view .LVU4 + 45 0008 C56B ldr r5, [r0, #60] + 46 000a 6C60 str r4, [r5, #4] + 829:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 830:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Configure DMA Channel data length */ + 831:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Instance->CNDTR = DataLength; + 47 .loc 1 831 3 is_stmt 1 view .LVU5 + 48 .loc 1 831 7 is_stmt 0 view .LVU6 + 49 000c 0468 ldr r4, [r0] + 50 .loc 1 831 25 view .LVU7 + 51 000e 6360 str r3, [r4, #4] + 832:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 833:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Peripheral to Memory */ + 834:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** if((hdma->Init.Direction) == DMA_MEMORY_TO_PERIPH) + 52 .loc 1 834 3 is_stmt 1 view .LVU8 + 53 .loc 1 834 17 is_stmt 0 view .LVU9 + 54 0010 4368 ldr r3, [r0, #4] + 55 .LVL1: + 56 .loc 1 834 5 view .LVU10 + 57 0012 102B cmp r3, #16 + 58 0014 05D0 beq .L5 + 835:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 836:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Configure DMA Channel destination address */ + 837:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Instance->CPAR = DstAddress; + 838:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 839:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Configure DMA Channel source address */ + 840:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Instance->CMAR = SrcAddress; + 841:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 842:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Memory to Peripheral */ + 843:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** else + 844:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 845:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Configure DMA Channel source address */ + 846:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Instance->CPAR = SrcAddress; + 59 .loc 1 846 5 is_stmt 1 view .LVU11 + 60 .loc 1 846 9 is_stmt 0 view .LVU12 + 61 0016 0368 ldr r3, [r0] + 62 .loc 1 846 26 view .LVU13 + 63 0018 9960 str r1, [r3, #8] + 64 .LVL2: + 847:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 848:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Configure DMA Channel destination address */ + 849:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Instance->CMAR = DstAddress; + ARM GAS /tmp/ccaRdTju.s page 17 + + + 65 .loc 1 849 5 is_stmt 1 view .LVU14 + 66 .loc 1 849 9 is_stmt 0 view .LVU15 + 67 001a 0368 ldr r3, [r0] + 68 .loc 1 849 26 view .LVU16 + 69 001c DA60 str r2, [r3, #12] + 70 .L1: + 850:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 851:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 71 .loc 1 851 1 view .LVU17 + 72 001e 30BC pop {r4, r5} + 73 .cfi_remember_state + 74 .cfi_restore 5 + 75 .cfi_restore 4 + 76 .cfi_def_cfa_offset 0 + 77 0020 7047 bx lr + 78 .LVL3: + 79 .L5: + 80 .cfi_restore_state + 837:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 81 .loc 1 837 5 is_stmt 1 view .LVU18 + 837:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 82 .loc 1 837 9 is_stmt 0 view .LVU19 + 83 0022 0368 ldr r3, [r0] + 837:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 84 .loc 1 837 26 view .LVU20 + 85 0024 9A60 str r2, [r3, #8] + 86 .LVL4: + 840:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 87 .loc 1 840 5 is_stmt 1 view .LVU21 + 840:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 88 .loc 1 840 9 is_stmt 0 view .LVU22 + 89 0026 0368 ldr r3, [r0] + 840:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 90 .loc 1 840 26 view .LVU23 + 91 0028 D960 str r1, [r3, #12] + 92 002a F8E7 b .L1 + 93 .cfi_endproc + 94 .LFE142: + 96 .section .text.DMA_CalcBaseAndBitshift,"ax",%progbits + 97 .align 1 + 98 .syntax unified + 99 .thumb + 100 .thumb_func + 102 DMA_CalcBaseAndBitshift: + 103 .LVL5: + 104 .LFB143: + 852:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 853:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /** + 854:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @brief Set the DMA base address and channel index depending on DMA instance + 855:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @param hdma pointer to a DMA_HandleTypeDef structure that contains + 856:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * the configuration information for the specified DMA Stream. + 857:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** * @retval None + 858:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** */ + 859:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** static void DMA_CalcBaseAndBitshift(DMA_HandleTypeDef *hdma) + 860:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 105 .loc 1 860 1 is_stmt 1 view -0 + 106 .cfi_startproc + ARM GAS /tmp/ccaRdTju.s page 18 + + + 107 @ args = 0, pretend = 0, frame = 0 + 108 @ frame_needed = 0, uses_anonymous_args = 0 + 109 @ link register save eliminated. + 861:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** #if defined (DMA2) + 862:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* calculation of the channel index */ + 863:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** if ((uint32_t)(hdma->Instance) < (uint32_t)(DMA2_Channel1)) + 110 .loc 1 863 3 view .LVU25 + 111 .loc 1 863 22 is_stmt 0 view .LVU26 + 112 0000 0268 ldr r2, [r0] + 113 .loc 1 863 6 view .LVU27 + 114 0002 0C4B ldr r3, .L9 + 115 0004 9A42 cmp r2, r3 + 116 0006 0AD8 bhi .L7 + 864:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 865:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* DMA1 */ + 866:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->ChannelIndex = (((uint32_t)hdma->Instance - (uint32_t)DMA1_Channel1) / ((uint32_t)DMA1_Ch + 117 .loc 1 866 5 is_stmt 1 view .LVU28 + 118 .loc 1 866 53 is_stmt 0 view .LVU29 + 119 0008 0B4B ldr r3, .L9+4 + 120 000a 1344 add r3, r3, r2 + 121 .loc 1 866 80 view .LVU30 + 122 000c 0B4A ldr r2, .L9+8 + 123 000e A2FB0323 umull r2, r3, r2, r3 + 124 0012 1B09 lsrs r3, r3, #4 + 125 .loc 1 866 135 view .LVU31 + 126 0014 9B00 lsls r3, r3, #2 + 127 .loc 1 866 24 view .LVU32 + 128 0016 0364 str r3, [r0, #64] + 867:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->DmaBaseAddress = DMA1; + 129 .loc 1 867 5 is_stmt 1 view .LVU33 + 130 .loc 1 867 26 is_stmt 0 view .LVU34 + 131 0018 094B ldr r3, .L9+12 + 132 001a C363 str r3, [r0, #60] + 133 001c 7047 bx lr + 134 .L7: + 868:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 869:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** else + 870:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 871:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* DMA2 */ + 872:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->ChannelIndex = (((uint32_t)hdma->Instance - (uint32_t)DMA2_Channel1) / ((uint32_t)DMA2_Ch + 135 .loc 1 872 5 is_stmt 1 view .LVU35 + 136 .loc 1 872 53 is_stmt 0 view .LVU36 + 137 001e 094B ldr r3, .L9+16 + 138 0020 1344 add r3, r3, r2 + 139 .loc 1 872 80 view .LVU37 + 140 0022 064A ldr r2, .L9+8 + 141 0024 A2FB0323 umull r2, r3, r2, r3 + 142 0028 1B09 lsrs r3, r3, #4 + 143 .loc 1 872 135 view .LVU38 + 144 002a 9B00 lsls r3, r3, #2 + 145 .loc 1 872 24 view .LVU39 + 146 002c 0364 str r3, [r0, #64] + 873:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->DmaBaseAddress = DMA2; + 147 .loc 1 873 5 is_stmt 1 view .LVU40 + 148 .loc 1 873 26 is_stmt 0 view .LVU41 + 149 002e 064B ldr r3, .L9+20 + 150 0030 C363 str r3, [r0, #60] + ARM GAS /tmp/ccaRdTju.s page 19 + + + 874:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 875:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** #else + 876:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* calculation of the channel index */ + 877:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* DMA1 */ + 878:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->ChannelIndex = (((uint32_t)hdma->Instance - (uint32_t)DMA1_Channel1) / ((uint32_t)DMA1_Chan + 879:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->DmaBaseAddress = DMA1; + 880:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** #endif + 881:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 151 .loc 1 881 1 view .LVU42 + 152 0032 7047 bx lr + 153 .L10: + 154 .align 2 + 155 .L9: + 156 0034 07040240 .word 1073873927 + 157 0038 F8FFFDBF .word -1073872904 + 158 003c CDCCCCCC .word -858993459 + 159 0040 00000240 .word 1073872896 + 160 0044 F8FBFDBF .word -1073873928 + 161 0048 00040240 .word 1073873920 + 162 .cfi_endproc + 163 .LFE143: + 165 .section .text.HAL_DMA_Init,"ax",%progbits + 166 .align 1 + 167 .global HAL_DMA_Init + 168 .syntax unified + 169 .thumb + 170 .thumb_func + 172 HAL_DMA_Init: + 173 .LVL6: + 174 .LFB130: + 138:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** uint32_t tmp = 0U; + 175 .loc 1 138 1 is_stmt 1 view -0 + 176 .cfi_startproc + 177 @ args = 0, pretend = 0, frame = 0 + 178 @ frame_needed = 0, uses_anonymous_args = 0 + 139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 179 .loc 1 139 3 view .LVU44 + 142:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 180 .loc 1 142 3 view .LVU45 + 142:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 181 .loc 1 142 5 is_stmt 0 view .LVU46 + 182 0000 20B3 cbz r0, .L13 + 138:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** uint32_t tmp = 0U; + 183 .loc 1 138 1 view .LVU47 + 184 0002 10B5 push {r4, lr} + 185 .cfi_def_cfa_offset 8 + 186 .cfi_offset 4, -8 + 187 .cfi_offset 14, -4 + 188 0004 0446 mov r4, r0 + 148:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** assert_param(IS_DMA_DIRECTION(hdma->Init.Direction)); + 189 .loc 1 148 3 is_stmt 1 view .LVU48 + 149:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** assert_param(IS_DMA_PERIPHERAL_INC_STATE(hdma->Init.PeriphInc)); + 190 .loc 1 149 3 view .LVU49 + 150:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** assert_param(IS_DMA_MEMORY_INC_STATE(hdma->Init.MemInc)); + 191 .loc 1 150 3 view .LVU50 + 151:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** assert_param(IS_DMA_PERIPHERAL_DATA_SIZE(hdma->Init.PeriphDataAlignment)); + 192 .loc 1 151 3 view .LVU51 + ARM GAS /tmp/ccaRdTju.s page 20 + + + 152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** assert_param(IS_DMA_MEMORY_DATA_SIZE(hdma->Init.MemDataAlignment)); + 193 .loc 1 152 3 view .LVU52 + 153:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** assert_param(IS_DMA_MODE(hdma->Init.Mode)); + 194 .loc 1 153 3 view .LVU53 + 154:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** assert_param(IS_DMA_PRIORITY(hdma->Init.Priority)); + 195 .loc 1 154 3 view .LVU54 + 155:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 196 .loc 1 155 3 view .LVU55 + 158:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 197 .loc 1 158 3 view .LVU56 + 158:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 198 .loc 1 158 15 is_stmt 0 view .LVU57 + 199 0006 0223 movs r3, #2 + 200 0008 80F82130 strb r3, [r0, #33] + 161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 201 .loc 1 161 3 is_stmt 1 view .LVU58 + 161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 202 .loc 1 161 13 is_stmt 0 view .LVU59 + 203 000c 0168 ldr r1, [r0] + 161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 204 .loc 1 161 7 view .LVU60 + 205 000e 0A68 ldr r2, [r1] + 206 .LVL7: + 164:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** DMA_CCR_MINC | DMA_CCR_PINC | DMA_CCR_CIRC | \ + 207 .loc 1 164 3 is_stmt 1 view .LVU61 + 164:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** DMA_CCR_MINC | DMA_CCR_PINC | DMA_CCR_CIRC | \ + 208 .loc 1 164 7 is_stmt 0 view .LVU62 + 209 0010 22F47F52 bic r2, r2, #16320 + 210 .LVL8: + 164:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** DMA_CCR_MINC | DMA_CCR_PINC | DMA_CCR_CIRC | \ + 211 .loc 1 164 7 view .LVU63 + 212 0014 22F03002 bic r2, r2, #48 + 213 .LVL9: + 169:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Init.PeriphInc | hdma->Init.MemInc | + 214 .loc 1 169 3 is_stmt 1 view .LVU64 + 169:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Init.PeriphInc | hdma->Init.MemInc | + 215 .loc 1 169 21 is_stmt 0 view .LVU65 + 216 0018 4368 ldr r3, [r0, #4] + 170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Init.PeriphDataAlignment | hdma->Init.MemDataAlignment | + 217 .loc 1 170 21 view .LVU66 + 218 001a 8068 ldr r0, [r0, #8] + 219 .LVL10: + 169:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Init.PeriphInc | hdma->Init.MemInc | + 220 .loc 1 169 39 view .LVU67 + 221 001c 0343 orrs r3, r3, r0 + 170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Init.PeriphDataAlignment | hdma->Init.MemDataAlignment | + 222 .loc 1 170 54 view .LVU68 + 223 001e E068 ldr r0, [r4, #12] + 170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Init.PeriphDataAlignment | hdma->Init.MemDataAlignment | + 224 .loc 1 170 42 view .LVU69 + 225 0020 0343 orrs r3, r3, r0 + 171:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Init.Mode | hdma->Init.Priority; + 226 .loc 1 171 21 view .LVU70 + 227 0022 2069 ldr r0, [r4, #16] + 170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Init.PeriphDataAlignment | hdma->Init.MemDataAlignment | + 228 .loc 1 170 72 view .LVU71 + 229 0024 0343 orrs r3, r3, r0 + ARM GAS /tmp/ccaRdTju.s page 21 + + + 171:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Init.Mode | hdma->Init.Priority; + 230 .loc 1 171 54 view .LVU72 + 231 0026 6069 ldr r0, [r4, #20] + 171:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Init.Mode | hdma->Init.Priority; + 232 .loc 1 171 42 view .LVU73 + 233 0028 0343 orrs r3, r3, r0 + 172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 234 .loc 1 172 21 view .LVU74 + 235 002a A069 ldr r0, [r4, #24] + 171:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Init.Mode | hdma->Init.Priority; + 236 .loc 1 171 72 view .LVU75 + 237 002c 0343 orrs r3, r3, r0 + 172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 238 .loc 1 172 54 view .LVU76 + 239 002e E069 ldr r0, [r4, #28] + 172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 240 .loc 1 172 42 view .LVU77 + 241 0030 0343 orrs r3, r3, r0 + 169:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Init.PeriphInc | hdma->Init.MemInc | + 242 .loc 1 169 7 view .LVU78 + 243 0032 1343 orrs r3, r3, r2 + 244 .LVL11: + 175:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 245 .loc 1 175 3 is_stmt 1 view .LVU79 + 175:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 246 .loc 1 175 23 is_stmt 0 view .LVU80 + 247 0034 0B60 str r3, [r1] + 179:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 248 .loc 1 179 3 is_stmt 1 view .LVU81 + 249 0036 2046 mov r0, r4 + 250 0038 FFF7FEFF bl DMA_CalcBaseAndBitshift + 251 .LVL12: + 182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 252 .loc 1 182 3 view .LVU82 + 182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 253 .loc 1 182 19 is_stmt 0 view .LVU83 + 254 003c 0020 movs r0, #0 + 255 003e A063 str r0, [r4, #56] + 185:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 256 .loc 1 185 3 is_stmt 1 view .LVU84 + 185:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 257 .loc 1 185 15 is_stmt 0 view .LVU85 + 258 0040 0123 movs r3, #1 + 259 0042 84F82130 strb r3, [r4, #33] + 188:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 260 .loc 1 188 3 is_stmt 1 view .LVU86 + 188:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 261 .loc 1 188 14 is_stmt 0 view .LVU87 + 262 0046 84F82000 strb r0, [r4, #32] + 190:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 263 .loc 1 190 3 is_stmt 1 view .LVU88 + 191:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 264 .loc 1 191 1 is_stmt 0 view .LVU89 + 265 004a 10BD pop {r4, pc} + 266 .LVL13: + 267 .L13: + 268 .cfi_def_cfa_offset 0 + ARM GAS /tmp/ccaRdTju.s page 22 + + + 269 .cfi_restore 4 + 270 .cfi_restore 14 + 144:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 271 .loc 1 144 12 view .LVU90 + 272 004c 0120 movs r0, #1 + 273 .LVL14: + 191:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 274 .loc 1 191 1 view .LVU91 + 275 004e 7047 bx lr + 276 .cfi_endproc + 277 .LFE130: + 279 .section .text.HAL_DMA_DeInit,"ax",%progbits + 280 .align 1 + 281 .global HAL_DMA_DeInit + 282 .syntax unified + 283 .thumb + 284 .thumb_func + 286 HAL_DMA_DeInit: + 287 .LVL15: + 288 .LFB131: + 200:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Check the DMA handle allocation */ + 289 .loc 1 200 1 is_stmt 1 view -0 + 290 .cfi_startproc + 291 @ args = 0, pretend = 0, frame = 0 + 292 @ frame_needed = 0, uses_anonymous_args = 0 + 202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 293 .loc 1 202 3 view .LVU93 + 202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 294 .loc 1 202 5 is_stmt 0 view .LVU94 + 295 0000 08B3 cbz r0, .L20 + 200:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** /* Check the DMA handle allocation */ + 296 .loc 1 200 1 view .LVU95 + 297 0002 38B5 push {r3, r4, r5, lr} + 298 .cfi_def_cfa_offset 16 + 299 .cfi_offset 3, -16 + 300 .cfi_offset 4, -12 + 301 .cfi_offset 5, -8 + 302 .cfi_offset 14, -4 + 303 0004 0446 mov r4, r0 + 208:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 304 .loc 1 208 3 is_stmt 1 view .LVU96 + 211:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 305 .loc 1 211 3 view .LVU97 + 211:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 306 .loc 1 211 7 is_stmt 0 view .LVU98 + 307 0006 0268 ldr r2, [r0] + 211:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 308 .loc 1 211 17 view .LVU99 + 309 0008 1368 ldr r3, [r2] + 211:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 310 .loc 1 211 23 view .LVU100 + 311 000a 23F00103 bic r3, r3, #1 + 312 000e 1360 str r3, [r2] + 214:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 313 .loc 1 214 3 is_stmt 1 view .LVU101 + 214:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 314 .loc 1 214 7 is_stmt 0 view .LVU102 + ARM GAS /tmp/ccaRdTju.s page 23 + + + 315 0010 0368 ldr r3, [r0] + 214:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 316 .loc 1 214 24 view .LVU103 + 317 0012 0025 movs r5, #0 + 318 0014 1D60 str r5, [r3] + 217:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 319 .loc 1 217 3 is_stmt 1 view .LVU104 + 217:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 320 .loc 1 217 7 is_stmt 0 view .LVU105 + 321 0016 0368 ldr r3, [r0] + 217:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 322 .loc 1 217 25 view .LVU106 + 323 0018 5D60 str r5, [r3, #4] + 220:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 324 .loc 1 220 3 is_stmt 1 view .LVU107 + 220:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 325 .loc 1 220 7 is_stmt 0 view .LVU108 + 326 001a 0368 ldr r3, [r0] + 220:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 327 .loc 1 220 25 view .LVU109 + 328 001c 9D60 str r5, [r3, #8] + 223:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 329 .loc 1 223 3 is_stmt 1 view .LVU110 + 223:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 330 .loc 1 223 7 is_stmt 0 view .LVU111 + 331 001e 0368 ldr r3, [r0] + 223:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 332 .loc 1 223 24 view .LVU112 + 333 0020 DD60 str r5, [r3, #12] + 226:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 334 .loc 1 226 3 is_stmt 1 view .LVU113 + 335 0022 FFF7FEFF bl DMA_CalcBaseAndBitshift + 336 .LVL16: + 229:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 337 .loc 1 229 3 view .LVU114 + 229:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 338 .loc 1 229 52 is_stmt 0 view .LVU115 + 339 0026 216C ldr r1, [r4, #64] + 229:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 340 .loc 1 229 7 view .LVU116 + 341 0028 E26B ldr r2, [r4, #60] + 229:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 342 .loc 1 229 45 view .LVU117 + 343 002a 0123 movs r3, #1 + 344 002c 8B40 lsls r3, r3, r1 + 229:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 345 .loc 1 229 30 view .LVU118 + 346 002e 5360 str r3, [r2, #4] + 232:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->XferHalfCpltCallback = NULL; + 347 .loc 1 232 3 is_stmt 1 view .LVU119 + 232:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->XferHalfCpltCallback = NULL; + 348 .loc 1 232 26 is_stmt 0 view .LVU120 + 349 0030 A562 str r5, [r4, #40] + 233:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->XferErrorCallback = NULL; + 350 .loc 1 233 3 is_stmt 1 view .LVU121 + 233:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->XferErrorCallback = NULL; + 351 .loc 1 233 30 is_stmt 0 view .LVU122 + ARM GAS /tmp/ccaRdTju.s page 24 + + + 352 0032 E562 str r5, [r4, #44] + 234:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->XferAbortCallback = NULL; + 353 .loc 1 234 3 is_stmt 1 view .LVU123 + 234:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->XferAbortCallback = NULL; + 354 .loc 1 234 27 is_stmt 0 view .LVU124 + 355 0034 2563 str r5, [r4, #48] + 235:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 356 .loc 1 235 3 is_stmt 1 view .LVU125 + 235:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 357 .loc 1 235 27 is_stmt 0 view .LVU126 + 358 0036 6563 str r5, [r4, #52] + 238:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 359 .loc 1 238 3 is_stmt 1 view .LVU127 + 238:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 360 .loc 1 238 19 is_stmt 0 view .LVU128 + 361 0038 A563 str r5, [r4, #56] + 241:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 362 .loc 1 241 3 is_stmt 1 view .LVU129 + 241:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 363 .loc 1 241 15 is_stmt 0 view .LVU130 + 364 003a 84F82150 strb r5, [r4, #33] + 244:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 365 .loc 1 244 3 is_stmt 1 view .LVU131 + 244:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 366 .loc 1 244 3 view .LVU132 + 367 003e 84F82050 strb r5, [r4, #32] + 244:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 368 .loc 1 244 3 view .LVU133 + 246:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 369 .loc 1 246 3 view .LVU134 + 246:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 370 .loc 1 246 10 is_stmt 0 view .LVU135 + 371 0042 2846 mov r0, r5 + 247:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 372 .loc 1 247 1 view .LVU136 + 373 0044 38BD pop {r3, r4, r5, pc} + 374 .LVL17: + 375 .L20: + 376 .cfi_def_cfa_offset 0 + 377 .cfi_restore 3 + 378 .cfi_restore 4 + 379 .cfi_restore 5 + 380 .cfi_restore 14 + 204:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 381 .loc 1 204 12 view .LVU137 + 382 0046 0120 movs r0, #1 + 383 .LVL18: + 247:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 384 .loc 1 247 1 view .LVU138 + 385 0048 7047 bx lr + 386 .cfi_endproc + 387 .LFE131: + 389 .section .text.HAL_DMA_Start,"ax",%progbits + 390 .align 1 + 391 .global HAL_DMA_Start + 392 .syntax unified + 393 .thumb + ARM GAS /tmp/ccaRdTju.s page 25 + + + 394 .thumb_func + 396 HAL_DMA_Start: + 397 .LVL19: + 398 .LFB132: + 282:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** HAL_StatusTypeDef status = HAL_OK; + 399 .loc 1 282 1 is_stmt 1 view -0 + 400 .cfi_startproc + 401 @ args = 0, pretend = 0, frame = 0 + 402 @ frame_needed = 0, uses_anonymous_args = 0 + 282:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** HAL_StatusTypeDef status = HAL_OK; + 403 .loc 1 282 1 is_stmt 0 view .LVU140 + 404 0000 70B5 push {r4, r5, r6, lr} + 405 .cfi_def_cfa_offset 16 + 406 .cfi_offset 4, -16 + 407 .cfi_offset 5, -12 + 408 .cfi_offset 6, -8 + 409 .cfi_offset 14, -4 + 410 0002 0446 mov r4, r0 + 283:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 411 .loc 1 283 2 is_stmt 1 view .LVU141 + 412 .LVL20: + 286:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 413 .loc 1 286 3 view .LVU142 + 289:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 414 .loc 1 289 3 view .LVU143 + 289:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 415 .loc 1 289 3 view .LVU144 + 416 0004 90F82000 ldrb r0, [r0, #32] @ zero_extendqisi2 + 417 .LVL21: + 289:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 418 .loc 1 289 3 is_stmt 0 view .LVU145 + 419 0008 0128 cmp r0, #1 + 420 000a 1FD0 beq .L28 + 289:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 421 .loc 1 289 3 is_stmt 1 discriminator 2 view .LVU146 + 422 000c 0120 movs r0, #1 + 423 000e 84F82000 strb r0, [r4, #32] + 289:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 424 .loc 1 289 3 discriminator 2 view .LVU147 + 291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 425 .loc 1 291 3 discriminator 2 view .LVU148 + 291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 426 .loc 1 291 33 is_stmt 0 discriminator 2 view .LVU149 + 427 0012 94F82100 ldrb r0, [r4, #33] @ zero_extendqisi2 + 291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 428 .loc 1 291 5 discriminator 2 view .LVU150 + 429 0016 0128 cmp r0, #1 + 430 0018 04D0 beq .L30 + 310:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 431 .loc 1 310 4 is_stmt 1 view .LVU151 + 310:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 432 .loc 1 310 4 view .LVU152 + 433 001a 0023 movs r3, #0 + 434 .LVL22: + 310:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 435 .loc 1 310 4 is_stmt 0 view .LVU153 + 436 001c 84F82030 strb r3, [r4, #32] + ARM GAS /tmp/ccaRdTju.s page 26 + + + 310:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 437 .loc 1 310 4 is_stmt 1 view .LVU154 + 313:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 438 .loc 1 313 4 view .LVU155 + 439 .LVL23: + 313:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 440 .loc 1 313 11 is_stmt 0 view .LVU156 + 441 0020 0220 movs r0, #2 + 442 .LVL24: + 443 .L26: + 317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 444 .loc 1 317 1 view .LVU157 + 445 0022 70BD pop {r4, r5, r6, pc} + 446 .LVL25: + 447 .L30: + 294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 448 .loc 1 294 4 is_stmt 1 view .LVU158 + 294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 449 .loc 1 294 16 is_stmt 0 view .LVU159 + 450 0024 0220 movs r0, #2 + 451 0026 84F82100 strb r0, [r4, #33] + 296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 452 .loc 1 296 4 is_stmt 1 view .LVU160 + 296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 453 .loc 1 296 20 is_stmt 0 view .LVU161 + 454 002a 0025 movs r5, #0 + 455 002c A563 str r5, [r4, #56] + 299:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 456 .loc 1 299 4 is_stmt 1 view .LVU162 + 299:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 457 .loc 1 299 8 is_stmt 0 view .LVU163 + 458 002e 2668 ldr r6, [r4] + 299:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 459 .loc 1 299 18 view .LVU164 + 460 0030 3068 ldr r0, [r6] + 299:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 461 .loc 1 299 24 view .LVU165 + 462 0032 20F00100 bic r0, r0, #1 + 463 0036 3060 str r0, [r6] + 302:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 464 .loc 1 302 4 is_stmt 1 view .LVU166 + 465 0038 2046 mov r0, r4 + 466 003a FFF7FEFF bl DMA_SetConfig + 467 .LVL26: + 305:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 468 .loc 1 305 4 view .LVU167 + 305:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 469 .loc 1 305 8 is_stmt 0 view .LVU168 + 470 003e 2268 ldr r2, [r4] + 305:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 471 .loc 1 305 18 view .LVU169 + 472 0040 1368 ldr r3, [r2] + 305:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 473 .loc 1 305 24 view .LVU170 + 474 0042 43F00103 orr r3, r3, #1 + 475 0046 1360 str r3, [r2] + 283:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + ARM GAS /tmp/ccaRdTju.s page 27 + + + 476 .loc 1 283 20 view .LVU171 + 477 0048 2846 mov r0, r5 + 478 004a EAE7 b .L26 + 479 .LVL27: + 480 .L28: + 289:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 481 .loc 1 289 3 view .LVU172 + 482 004c 0220 movs r0, #2 + 483 004e E8E7 b .L26 + 484 .cfi_endproc + 485 .LFE132: + 487 .section .text.HAL_DMA_Start_IT,"ax",%progbits + 488 .align 1 + 489 .global HAL_DMA_Start_IT + 490 .syntax unified + 491 .thumb + 492 .thumb_func + 494 HAL_DMA_Start_IT: + 495 .LVL28: + 496 .LFB133: + 329:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** HAL_StatusTypeDef status = HAL_OK; + 497 .loc 1 329 1 is_stmt 1 view -0 + 498 .cfi_startproc + 499 @ args = 0, pretend = 0, frame = 0 + 500 @ frame_needed = 0, uses_anonymous_args = 0 + 329:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** HAL_StatusTypeDef status = HAL_OK; + 501 .loc 1 329 1 is_stmt 0 view .LVU174 + 502 0000 38B5 push {r3, r4, r5, lr} + 503 .cfi_def_cfa_offset 16 + 504 .cfi_offset 3, -16 + 505 .cfi_offset 4, -12 + 506 .cfi_offset 5, -8 + 507 .cfi_offset 14, -4 + 508 0002 0446 mov r4, r0 + 330:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 509 .loc 1 330 2 is_stmt 1 view .LVU175 + 510 .LVL29: + 333:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 511 .loc 1 333 3 view .LVU176 + 336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 512 .loc 1 336 3 view .LVU177 + 336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 513 .loc 1 336 3 view .LVU178 + 514 0004 90F82000 ldrb r0, [r0, #32] @ zero_extendqisi2 + 515 .LVL30: + 336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 516 .loc 1 336 3 is_stmt 0 view .LVU179 + 517 0008 0128 cmp r0, #1 + 518 000a 31D0 beq .L36 + 336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 519 .loc 1 336 3 is_stmt 1 discriminator 2 view .LVU180 + 520 000c 0120 movs r0, #1 + 521 000e 84F82000 strb r0, [r4, #32] + 336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 522 .loc 1 336 3 discriminator 2 view .LVU181 + 338:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 523 .loc 1 338 3 discriminator 2 view .LVU182 + ARM GAS /tmp/ccaRdTju.s page 28 + + + 338:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 524 .loc 1 338 33 is_stmt 0 discriminator 2 view .LVU183 + 525 0012 94F82100 ldrb r0, [r4, #33] @ zero_extendqisi2 + 338:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 526 .loc 1 338 5 discriminator 2 view .LVU184 + 527 0016 0128 cmp r0, #1 + 528 0018 04D0 beq .L38 + 369:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 529 .loc 1 369 5 is_stmt 1 view .LVU185 + 369:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 530 .loc 1 369 5 view .LVU186 + 531 001a 0023 movs r3, #0 + 532 .LVL31: + 369:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 533 .loc 1 369 5 is_stmt 0 view .LVU187 + 534 001c 84F82030 strb r3, [r4, #32] + 369:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 535 .loc 1 369 5 is_stmt 1 view .LVU188 + 372:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 536 .loc 1 372 5 view .LVU189 + 537 .LVL32: + 372:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 538 .loc 1 372 12 is_stmt 0 view .LVU190 + 539 0020 0220 movs r0, #2 + 540 .LVL33: + 541 .L32: + 376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 542 .loc 1 376 1 view .LVU191 + 543 0022 38BD pop {r3, r4, r5, pc} + 544 .LVL34: + 545 .L38: + 341:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 546 .loc 1 341 4 is_stmt 1 view .LVU192 + 341:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 547 .loc 1 341 16 is_stmt 0 view .LVU193 + 548 0024 0220 movs r0, #2 + 549 0026 84F82100 strb r0, [r4, #33] + 343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 550 .loc 1 343 4 is_stmt 1 view .LVU194 + 343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 551 .loc 1 343 20 is_stmt 0 view .LVU195 + 552 002a 0020 movs r0, #0 + 553 002c A063 str r0, [r4, #56] + 346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 554 .loc 1 346 4 is_stmt 1 view .LVU196 + 346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 555 .loc 1 346 8 is_stmt 0 view .LVU197 + 556 002e 2568 ldr r5, [r4] + 346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 557 .loc 1 346 18 view .LVU198 + 558 0030 2868 ldr r0, [r5] + 346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 559 .loc 1 346 24 view .LVU199 + 560 0032 20F00100 bic r0, r0, #1 + 561 0036 2860 str r0, [r5] + 349:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 562 .loc 1 349 4 is_stmt 1 view .LVU200 + ARM GAS /tmp/ccaRdTju.s page 29 + + + 563 0038 2046 mov r0, r4 + 564 003a FFF7FEFF bl DMA_SetConfig + 565 .LVL35: + 353:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 566 .loc 1 353 5 view .LVU201 + 353:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 567 .loc 1 353 20 is_stmt 0 view .LVU202 + 568 003e E36A ldr r3, [r4, #44] + 353:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 569 .loc 1 353 7 view .LVU203 + 570 0040 5BB1 cbz r3, .L34 + 355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 571 .loc 1 355 7 is_stmt 1 view .LVU204 + 355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 572 .loc 1 355 11 is_stmt 0 view .LVU205 + 573 0042 2268 ldr r2, [r4] + 355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 574 .loc 1 355 21 view .LVU206 + 575 0044 1368 ldr r3, [r2] + 355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 576 .loc 1 355 27 view .LVU207 + 577 0046 43F00E03 orr r3, r3, #14 + 578 004a 1360 str r3, [r2] + 579 .L35: + 364:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 580 .loc 1 364 4 is_stmt 1 view .LVU208 + 364:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 581 .loc 1 364 8 is_stmt 0 view .LVU209 + 582 004c 2268 ldr r2, [r4] + 364:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 583 .loc 1 364 18 view .LVU210 + 584 004e 1368 ldr r3, [r2] + 364:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 585 .loc 1 364 24 view .LVU211 + 586 0050 43F00103 orr r3, r3, #1 + 587 0054 1360 str r3, [r2] + 330:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 588 .loc 1 330 20 view .LVU212 + 589 0056 0020 movs r0, #0 + 590 0058 E3E7 b .L32 + 591 .L34: + 359:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Instance->CCR &= ~DMA_IT_HT; + 592 .loc 1 359 5 is_stmt 1 view .LVU213 + 359:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Instance->CCR &= ~DMA_IT_HT; + 593 .loc 1 359 9 is_stmt 0 view .LVU214 + 594 005a 2268 ldr r2, [r4] + 359:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Instance->CCR &= ~DMA_IT_HT; + 595 .loc 1 359 19 view .LVU215 + 596 005c 1368 ldr r3, [r2] + 359:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->Instance->CCR &= ~DMA_IT_HT; + 597 .loc 1 359 25 view .LVU216 + 598 005e 43F00A03 orr r3, r3, #10 + 599 0062 1360 str r3, [r2] + 360:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 600 .loc 1 360 5 is_stmt 1 view .LVU217 + 360:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 601 .loc 1 360 9 is_stmt 0 view .LVU218 + ARM GAS /tmp/ccaRdTju.s page 30 + + + 602 0064 2268 ldr r2, [r4] + 360:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 603 .loc 1 360 19 view .LVU219 + 604 0066 1368 ldr r3, [r2] + 360:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 605 .loc 1 360 25 view .LVU220 + 606 0068 23F00403 bic r3, r3, #4 + 607 006c 1360 str r3, [r2] + 608 006e EDE7 b .L35 + 609 .LVL36: + 610 .L36: + 336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 611 .loc 1 336 3 view .LVU221 + 612 0070 0220 movs r0, #2 + 613 0072 D6E7 b .L32 + 614 .cfi_endproc + 615 .LFE133: + 617 .section .text.HAL_DMA_Abort,"ax",%progbits + 618 .align 1 + 619 .global HAL_DMA_Abort + 620 .syntax unified + 621 .thumb + 622 .thumb_func + 624 HAL_DMA_Abort: + 625 .LVL37: + 626 .LFB134: + 385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** if(hdma->State != HAL_DMA_STATE_BUSY) + 627 .loc 1 385 1 is_stmt 1 view -0 + 628 .cfi_startproc + 629 @ args = 0, pretend = 0, frame = 0 + 630 @ frame_needed = 0, uses_anonymous_args = 0 + 631 @ link register save eliminated. + 385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** if(hdma->State != HAL_DMA_STATE_BUSY) + 632 .loc 1 385 1 is_stmt 0 view .LVU223 + 633 0000 0346 mov r3, r0 + 386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 634 .loc 1 386 3 is_stmt 1 view .LVU224 + 386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 635 .loc 1 386 10 is_stmt 0 view .LVU225 + 636 0002 90F82120 ldrb r2, [r0, #33] @ zero_extendqisi2 + 386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 637 .loc 1 386 5 view .LVU226 + 638 0006 022A cmp r2, #2 + 639 0008 06D0 beq .L40 + 389:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 640 .loc 1 389 5 is_stmt 1 view .LVU227 + 389:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 641 .loc 1 389 21 is_stmt 0 view .LVU228 + 642 000a 0422 movs r2, #4 + 643 000c 8263 str r2, [r0, #56] + 392:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 644 .loc 1 392 5 is_stmt 1 view .LVU229 + 392:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 645 .loc 1 392 5 view .LVU230 + 646 000e 0022 movs r2, #0 + 647 0010 80F82020 strb r2, [r0, #32] + 392:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + ARM GAS /tmp/ccaRdTju.s page 31 + + + 648 .loc 1 392 5 view .LVU231 + 394:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 649 .loc 1 394 5 view .LVU232 + 394:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 650 .loc 1 394 12 is_stmt 0 view .LVU233 + 651 0014 0120 movs r0, #1 + 652 .LVL38: + 394:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 653 .loc 1 394 12 view .LVU234 + 654 0016 7047 bx lr + 655 .LVL39: + 656 .L40: + 399:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 657 .loc 1 399 6 is_stmt 1 view .LVU235 + 399:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 658 .loc 1 399 10 is_stmt 0 view .LVU236 + 659 0018 0168 ldr r1, [r0] + 399:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 660 .loc 1 399 20 view .LVU237 + 661 001a 0A68 ldr r2, [r1] + 399:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 662 .loc 1 399 26 view .LVU238 + 663 001c 22F00E02 bic r2, r2, #14 + 664 0020 0A60 str r2, [r1] + 402:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 665 .loc 1 402 5 is_stmt 1 view .LVU239 + 402:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 666 .loc 1 402 9 is_stmt 0 view .LVU240 + 667 0022 0168 ldr r1, [r0] + 402:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 668 .loc 1 402 19 view .LVU241 + 669 0024 0A68 ldr r2, [r1] + 402:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 670 .loc 1 402 25 view .LVU242 + 671 0026 22F00102 bic r2, r2, #1 + 672 002a 0A60 str r2, [r1] + 405:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 673 .loc 1 405 5 is_stmt 1 view .LVU243 + 405:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 674 .loc 1 405 55 is_stmt 0 view .LVU244 + 675 002c 026C ldr r2, [r0, #64] + 405:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 676 .loc 1 405 9 view .LVU245 + 677 002e C06B ldr r0, [r0, #60] + 678 .LVL40: + 405:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 679 .loc 1 405 48 view .LVU246 + 680 0030 0121 movs r1, #1 + 681 0032 01FA02F2 lsl r2, r1, r2 + 405:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 682 .loc 1 405 32 view .LVU247 + 683 0036 4260 str r2, [r0, #4] + 408:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 684 .loc 1 408 3 is_stmt 1 view .LVU248 + 408:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 685 .loc 1 408 15 is_stmt 0 view .LVU249 + 686 0038 83F82110 strb r1, [r3, #33] + ARM GAS /tmp/ccaRdTju.s page 32 + + + 411:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 687 .loc 1 411 3 is_stmt 1 view .LVU250 + 411:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 688 .loc 1 411 3 view .LVU251 + 689 003c 0020 movs r0, #0 + 690 003e 83F82000 strb r0, [r3, #32] + 411:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 691 .loc 1 411 3 view .LVU252 + 413:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 692 .loc 1 413 3 view .LVU253 + 414:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 693 .loc 1 414 1 is_stmt 0 view .LVU254 + 694 0042 7047 bx lr + 695 .cfi_endproc + 696 .LFE134: + 698 .section .text.HAL_DMA_Abort_IT,"ax",%progbits + 699 .align 1 + 700 .global HAL_DMA_Abort_IT + 701 .syntax unified + 702 .thumb + 703 .thumb_func + 705 HAL_DMA_Abort_IT: + 706 .LVL41: + 707 .LFB135: + 423:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** HAL_StatusTypeDef status = HAL_OK; + 708 .loc 1 423 1 is_stmt 1 view -0 + 709 .cfi_startproc + 710 @ args = 0, pretend = 0, frame = 0 + 711 @ frame_needed = 0, uses_anonymous_args = 0 + 423:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** HAL_StatusTypeDef status = HAL_OK; + 712 .loc 1 423 1 is_stmt 0 view .LVU256 + 713 0000 08B5 push {r3, lr} + 714 .cfi_def_cfa_offset 8 + 715 .cfi_offset 3, -8 + 716 .cfi_offset 14, -4 + 424:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 717 .loc 1 424 3 is_stmt 1 view .LVU257 + 718 .LVL42: + 426:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 719 .loc 1 426 3 view .LVU258 + 426:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 720 .loc 1 426 32 is_stmt 0 view .LVU259 + 721 0002 90F82130 ldrb r3, [r0, #33] @ zero_extendqisi2 + 426:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 722 .loc 1 426 5 view .LVU260 + 723 0006 022B cmp r3, #2 + 724 0008 03D0 beq .L43 + 429:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 725 .loc 1 429 5 is_stmt 1 view .LVU261 + 429:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 726 .loc 1 429 21 is_stmt 0 view .LVU262 + 727 000a 0423 movs r3, #4 + 728 000c 8363 str r3, [r0, #56] + 431:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 729 .loc 1 431 5 is_stmt 1 view .LVU263 + 730 .LVL43: + 431:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + ARM GAS /tmp/ccaRdTju.s page 33 + + + 731 .loc 1 431 12 is_stmt 0 view .LVU264 + 732 000e 0120 movs r0, #1 + 733 .LVL44: + 734 .L44: + 457:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 735 .loc 1 457 3 is_stmt 1 view .LVU265 + 458:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 736 .loc 1 458 1 is_stmt 0 view .LVU266 + 737 0010 08BD pop {r3, pc} + 738 .LVL45: + 739 .L43: + 437:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 740 .loc 1 437 5 is_stmt 1 view .LVU267 + 437:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 741 .loc 1 437 9 is_stmt 0 view .LVU268 + 742 0012 0268 ldr r2, [r0] + 437:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 743 .loc 1 437 19 view .LVU269 + 744 0014 1368 ldr r3, [r2] + 437:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 745 .loc 1 437 25 view .LVU270 + 746 0016 23F00E03 bic r3, r3, #14 + 747 001a 1360 str r3, [r2] + 440:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 748 .loc 1 440 5 is_stmt 1 view .LVU271 + 440:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 749 .loc 1 440 9 is_stmt 0 view .LVU272 + 750 001c 0268 ldr r2, [r0] + 440:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 751 .loc 1 440 19 view .LVU273 + 752 001e 1368 ldr r3, [r2] + 440:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 753 .loc 1 440 25 view .LVU274 + 754 0020 23F00103 bic r3, r3, #1 + 755 0024 1360 str r3, [r2] + 443:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 756 .loc 1 443 5 is_stmt 1 view .LVU275 + 443:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 757 .loc 1 443 54 is_stmt 0 view .LVU276 + 758 0026 036C ldr r3, [r0, #64] + 443:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 759 .loc 1 443 9 view .LVU277 + 760 0028 C16B ldr r1, [r0, #60] + 443:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 761 .loc 1 443 47 view .LVU278 + 762 002a 0122 movs r2, #1 + 763 002c 02FA03F3 lsl r3, r2, r3 + 443:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 764 .loc 1 443 32 view .LVU279 + 765 0030 4B60 str r3, [r1, #4] + 446:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 766 .loc 1 446 5 is_stmt 1 view .LVU280 + 446:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 767 .loc 1 446 17 is_stmt 0 view .LVU281 + 768 0032 80F82120 strb r2, [r0, #33] + 449:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 769 .loc 1 449 5 is_stmt 1 view .LVU282 + ARM GAS /tmp/ccaRdTju.s page 34 + + + 449:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 770 .loc 1 449 5 view .LVU283 + 771 0036 0023 movs r3, #0 + 772 0038 80F82030 strb r3, [r0, #32] + 449:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 773 .loc 1 449 5 view .LVU284 + 452:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 774 .loc 1 452 5 view .LVU285 + 452:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 775 .loc 1 452 12 is_stmt 0 view .LVU286 + 776 003c 436B ldr r3, [r0, #52] + 452:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 777 .loc 1 452 7 view .LVU287 + 778 003e 13B1 cbz r3, .L45 + 454:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 779 .loc 1 454 7 is_stmt 1 view .LVU288 + 780 0040 9847 blx r3 + 781 .LVL46: + 424:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 782 .loc 1 424 21 is_stmt 0 view .LVU289 + 783 0042 0020 movs r0, #0 + 784 0044 E4E7 b .L44 + 785 .LVL47: + 786 .L45: + 424:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 787 .loc 1 424 21 view .LVU290 + 788 0046 0020 movs r0, #0 + 789 .LVL48: + 424:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 790 .loc 1 424 21 view .LVU291 + 791 0048 E2E7 b .L44 + 792 .cfi_endproc + 793 .LFE135: + 795 .section .text.HAL_DMA_PollForTransfer,"ax",%progbits + 796 .align 1 + 797 .global HAL_DMA_PollForTransfer + 798 .syntax unified + 799 .thumb + 800 .thumb_func + 802 HAL_DMA_PollForTransfer: + 803 .LVL49: + 804 .LFB136: + 469:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** uint32_t temp; + 805 .loc 1 469 1 is_stmt 1 view -0 + 806 .cfi_startproc + 807 @ args = 0, pretend = 0, frame = 0 + 808 @ frame_needed = 0, uses_anonymous_args = 0 + 469:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** uint32_t temp; + 809 .loc 1 469 1 is_stmt 0 view .LVU293 + 810 0000 2DE9F843 push {r3, r4, r5, r6, r7, r8, r9, lr} + 811 .cfi_def_cfa_offset 32 + 812 .cfi_offset 3, -32 + 813 .cfi_offset 4, -28 + 814 .cfi_offset 5, -24 + 815 .cfi_offset 6, -20 + 816 .cfi_offset 7, -16 + 817 .cfi_offset 8, -12 + ARM GAS /tmp/ccaRdTju.s page 35 + + + 818 .cfi_offset 9, -8 + 819 .cfi_offset 14, -4 + 820 0004 0446 mov r4, r0 + 470:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** uint32_t tickstart = 0U; + 821 .loc 1 470 3 is_stmt 1 view .LVU294 + 471:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 822 .loc 1 471 3 view .LVU295 + 823 .LVL50: + 473:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 824 .loc 1 473 3 view .LVU296 + 473:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 825 .loc 1 473 32 is_stmt 0 view .LVU297 + 826 0006 90F82130 ldrb r3, [r0, #33] @ zero_extendqisi2 + 473:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 827 .loc 1 473 5 view .LVU298 + 828 000a 022B cmp r3, #2 + 829 000c 07D0 beq .L48 + 476:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** __HAL_UNLOCK(hdma); + 830 .loc 1 476 5 is_stmt 1 view .LVU299 + 476:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** __HAL_UNLOCK(hdma); + 831 .loc 1 476 21 is_stmt 0 view .LVU300 + 832 000e 0423 movs r3, #4 + 833 0010 8363 str r3, [r0, #56] + 477:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** return HAL_ERROR; + 834 .loc 1 477 5 is_stmt 1 view .LVU301 + 477:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** return HAL_ERROR; + 835 .loc 1 477 5 view .LVU302 + 836 0012 0023 movs r3, #0 + 837 0014 80F82030 strb r3, [r0, #32] + 477:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** return HAL_ERROR; + 838 .loc 1 477 5 view .LVU303 + 478:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 839 .loc 1 478 5 view .LVU304 + 478:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 840 .loc 1 478 12 is_stmt 0 view .LVU305 + 841 0018 0120 movs r0, #1 + 842 .LVL51: + 843 .L49: + 561:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 844 .loc 1 561 1 view .LVU306 + 845 001a BDE8F883 pop {r3, r4, r5, r6, r7, r8, r9, pc} + 846 .LVL52: + 847 .L48: + 561:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 848 .loc 1 561 1 view .LVU307 + 849 001e 8846 mov r8, r1 + 850 0020 1646 mov r6, r2 + 482:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 851 .loc 1 482 3 is_stmt 1 view .LVU308 + 482:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 852 .loc 1 482 21 is_stmt 0 view .LVU309 + 853 0022 0368 ldr r3, [r0] + 482:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 854 .loc 1 482 31 view .LVU310 + 855 0024 1B68 ldr r3, [r3] + 482:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 856 .loc 1 482 6 view .LVU311 + ARM GAS /tmp/ccaRdTju.s page 36 + + + 857 0026 13F0200F tst r3, #32 + 858 002a 23D1 bne .L61 + 489:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 859 .loc 1 489 3 is_stmt 1 view .LVU312 + 489:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 860 .loc 1 489 5 is_stmt 0 view .LVU313 + 861 002c 39BB cbnz r1, .L51 + 492:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 862 .loc 1 492 5 is_stmt 1 view .LVU314 + 492:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 863 .loc 1 492 32 is_stmt 0 view .LVU315 + 864 002e 036C ldr r3, [r0, #64] + 492:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 865 .loc 1 492 10 view .LVU316 + 866 0030 0227 movs r7, #2 + 867 0032 9F40 lsls r7, r7, r3 + 868 .LVL53: + 869 .L52: + 501:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 870 .loc 1 501 3 is_stmt 1 view .LVU317 + 501:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 871 .loc 1 501 15 is_stmt 0 view .LVU318 + 872 0034 FFF7FEFF bl HAL_GetTick + 873 .LVL54: + 501:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 874 .loc 1 501 15 view .LVU319 + 875 0038 8146 mov r9, r0 + 876 .LVL55: + 503:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 877 .loc 1 503 3 is_stmt 1 view .LVU320 + 878 .L55: + 503:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 879 .loc 1 503 15 view .LVU321 + 503:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 880 .loc 1 503 23 is_stmt 0 view .LVU322 + 881 003a E56B ldr r5, [r4, #60] + 503:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 882 .loc 1 503 39 view .LVU323 + 883 003c 2B68 ldr r3, [r5] + 503:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 884 .loc 1 503 15 view .LVU324 + 885 003e 3B42 tst r3, r7 + 886 0040 2CD1 bne .L62 + 505:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 887 .loc 1 505 5 is_stmt 1 view .LVU325 + 505:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 888 .loc 1 505 38 is_stmt 0 view .LVU326 + 889 0042 2968 ldr r1, [r5] + 505:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 890 .loc 1 505 67 view .LVU327 + 891 0044 226C ldr r2, [r4, #64] + 505:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 892 .loc 1 505 60 view .LVU328 + 893 0046 0823 movs r3, #8 + 894 0048 9340 lsls r3, r3, r2 + 505:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 895 .loc 1 505 7 view .LVU329 + ARM GAS /tmp/ccaRdTju.s page 37 + + + 896 004a 1942 tst r1, r3 + 897 004c 1BD1 bne .L63 + 524:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 898 .loc 1 524 5 is_stmt 1 view .LVU330 + 524:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 899 .loc 1 524 7 is_stmt 0 view .LVU331 + 900 004e B6F1FF3F cmp r6, #-1 + 901 0052 F2D0 beq .L55 + 526:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 902 .loc 1 526 7 is_stmt 1 view .LVU332 + 526:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 903 .loc 1 526 9 is_stmt 0 view .LVU333 + 904 0054 2EB1 cbz r6, .L56 + 526:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 905 .loc 1 526 31 discriminator 1 view .LVU334 + 906 0056 FFF7FEFF bl HAL_GetTick + 907 .LVL56: + 526:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 908 .loc 1 526 45 discriminator 1 view .LVU335 + 909 005a A0EB0900 sub r0, r0, r9 + 526:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 910 .loc 1 526 26 discriminator 1 view .LVU336 + 911 005e B042 cmp r0, r6 + 912 0060 EBD9 bls .L55 + 913 .L56: + 529:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 914 .loc 1 529 9 is_stmt 1 view .LVU337 + 529:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 915 .loc 1 529 25 is_stmt 0 view .LVU338 + 916 0062 2023 movs r3, #32 + 917 0064 A363 str r3, [r4, #56] + 532:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 918 .loc 1 532 9 is_stmt 1 view .LVU339 + 532:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 919 .loc 1 532 21 is_stmt 0 view .LVU340 + 920 0066 0120 movs r0, #1 + 921 0068 84F82100 strb r0, [r4, #33] + 535:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 922 .loc 1 535 9 is_stmt 1 view .LVU341 + 535:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 923 .loc 1 535 9 view .LVU342 + 924 006c 0023 movs r3, #0 + 925 006e 84F82030 strb r3, [r4, #32] + 535:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 926 .loc 1 535 9 view .LVU343 + 537:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 927 .loc 1 537 9 view .LVU344 + 537:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 928 .loc 1 537 16 is_stmt 0 view .LVU345 + 929 0072 D2E7 b .L49 + 930 .LVL57: + 931 .L61: + 484:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** return HAL_ERROR; + 932 .loc 1 484 5 is_stmt 1 view .LVU346 + 484:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** return HAL_ERROR; + 933 .loc 1 484 21 is_stmt 0 view .LVU347 + 934 0074 4FF48073 mov r3, #256 + ARM GAS /tmp/ccaRdTju.s page 38 + + + 935 0078 8363 str r3, [r0, #56] + 485:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 936 .loc 1 485 5 is_stmt 1 view .LVU348 + 485:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 937 .loc 1 485 12 is_stmt 0 view .LVU349 + 938 007a 0120 movs r0, #1 + 939 .LVL58: + 485:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 940 .loc 1 485 12 view .LVU350 + 941 007c CDE7 b .L49 + 942 .LVL59: + 943 .L51: + 497:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 944 .loc 1 497 5 is_stmt 1 view .LVU351 + 497:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 945 .loc 1 497 32 is_stmt 0 view .LVU352 + 946 007e 036C ldr r3, [r0, #64] + 497:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 947 .loc 1 497 10 view .LVU353 + 948 0080 0427 movs r7, #4 + 949 0082 9F40 lsls r7, r7, r3 + 950 .LVL60: + 497:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 951 .loc 1 497 10 view .LVU354 + 952 0084 D6E7 b .L52 + 953 .LVL61: + 954 .L63: + 510:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 955 .loc 1 510 7 is_stmt 1 view .LVU355 + 510:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 956 .loc 1 510 49 is_stmt 0 view .LVU356 + 957 0086 0120 movs r0, #1 + 958 0088 00FA02F2 lsl r2, r0, r2 + 510:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 959 .loc 1 510 34 view .LVU357 + 960 008c 6A60 str r2, [r5, #4] + 513:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 961 .loc 1 513 7 is_stmt 1 view .LVU358 + 513:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 962 .loc 1 513 23 is_stmt 0 view .LVU359 + 963 008e A063 str r0, [r4, #56] + 516:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 964 .loc 1 516 7 is_stmt 1 view .LVU360 + 516:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 965 .loc 1 516 18 is_stmt 0 view .LVU361 + 966 0090 84F82100 strb r0, [r4, #33] + 519:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 967 .loc 1 519 7 is_stmt 1 view .LVU362 + 519:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 968 .loc 1 519 7 view .LVU363 + 969 0094 0023 movs r3, #0 + 970 0096 84F82030 strb r3, [r4, #32] + 519:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 971 .loc 1 519 7 view .LVU364 + 521:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 972 .loc 1 521 7 view .LVU365 + 521:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + ARM GAS /tmp/ccaRdTju.s page 39 + + + 973 .loc 1 521 14 is_stmt 0 view .LVU366 + 974 009a BEE7 b .L49 + 975 .L62: + 542:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 976 .loc 1 542 3 is_stmt 1 view .LVU367 + 542:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 977 .loc 1 542 5 is_stmt 0 view .LVU368 + 978 009c B8F1000F cmp r8, #0 + 979 00a0 0AD1 bne .L58 + 545:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 980 .loc 1 545 5 is_stmt 1 view .LVU369 + 545:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 981 .loc 1 545 54 is_stmt 0 view .LVU370 + 982 00a2 226C ldr r2, [r4, #64] + 545:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 983 .loc 1 545 47 view .LVU371 + 984 00a4 0223 movs r3, #2 + 985 00a6 9340 lsls r3, r3, r2 + 545:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 986 .loc 1 545 32 view .LVU372 + 987 00a8 6B60 str r3, [r5, #4] + 549:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 988 .loc 1 549 5 is_stmt 1 view .LVU373 + 549:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 989 .loc 1 549 17 is_stmt 0 view .LVU374 + 990 00aa 0123 movs r3, #1 + 991 00ac 84F82130 strb r3, [r4, #33] + 992 .L59: + 558:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 993 .loc 1 558 3 is_stmt 1 view .LVU375 + 558:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 994 .loc 1 558 3 view .LVU376 + 995 00b0 0020 movs r0, #0 + 996 00b2 84F82000 strb r0, [r4, #32] + 558:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 997 .loc 1 558 3 view .LVU377 + 560:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 998 .loc 1 560 3 view .LVU378 + 560:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 999 .loc 1 560 10 is_stmt 0 view .LVU379 + 1000 00b6 B0E7 b .L49 + 1001 .L58: + 554:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 1002 .loc 1 554 5 is_stmt 1 view .LVU380 + 554:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 1003 .loc 1 554 54 is_stmt 0 view .LVU381 + 1004 00b8 226C ldr r2, [r4, #64] + 554:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 1005 .loc 1 554 47 view .LVU382 + 1006 00ba 0423 movs r3, #4 + 1007 00bc 9340 lsls r3, r3, r2 + 554:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 1008 .loc 1 554 32 view .LVU383 + 1009 00be 6B60 str r3, [r5, #4] + 1010 00c0 F6E7 b .L59 + 1011 .cfi_endproc + 1012 .LFE136: + ARM GAS /tmp/ccaRdTju.s page 40 + + + 1014 .section .text.HAL_DMA_IRQHandler,"ax",%progbits + 1015 .align 1 + 1016 .global HAL_DMA_IRQHandler + 1017 .syntax unified + 1018 .thumb + 1019 .thumb_func + 1021 HAL_DMA_IRQHandler: + 1022 .LVL62: + 1023 .LFB137: + 570:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** uint32_t flag_it = hdma->DmaBaseAddress->ISR; + 1024 .loc 1 570 1 is_stmt 1 view -0 + 1025 .cfi_startproc + 1026 @ args = 0, pretend = 0, frame = 0 + 1027 @ frame_needed = 0, uses_anonymous_args = 0 + 570:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** uint32_t flag_it = hdma->DmaBaseAddress->ISR; + 1028 .loc 1 570 1 is_stmt 0 view .LVU385 + 1029 0000 38B5 push {r3, r4, r5, lr} + 1030 .cfi_def_cfa_offset 16 + 1031 .cfi_offset 3, -16 + 1032 .cfi_offset 4, -12 + 1033 .cfi_offset 5, -8 + 1034 .cfi_offset 14, -4 + 571:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** uint32_t source_it = hdma->Instance->CCR; + 1035 .loc 1 571 2 is_stmt 1 view .LVU386 + 571:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** uint32_t source_it = hdma->Instance->CCR; + 1036 .loc 1 571 25 is_stmt 0 view .LVU387 + 1037 0002 C36B ldr r3, [r0, #60] + 571:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** uint32_t source_it = hdma->Instance->CCR; + 1038 .loc 1 571 11 view .LVU388 + 1039 0004 1A68 ldr r2, [r3] + 1040 .LVL63: + 572:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1041 .loc 1 572 3 is_stmt 1 view .LVU389 + 572:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1042 .loc 1 572 28 is_stmt 0 view .LVU390 + 1043 0006 0468 ldr r4, [r0] + 572:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1044 .loc 1 572 12 view .LVU391 + 1045 0008 2568 ldr r5, [r4] + 1046 .LVL64: + 575:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 1047 .loc 1 575 3 is_stmt 1 view .LVU392 + 575:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 1048 .loc 1 575 49 is_stmt 0 view .LVU393 + 1049 000a 016C ldr r1, [r0, #64] + 575:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 1050 .loc 1 575 42 view .LVU394 + 1051 000c 0423 movs r3, #4 + 1052 000e 8B40 lsls r3, r3, r1 + 575:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 1053 .loc 1 575 6 view .LVU395 + 1054 0010 1342 tst r3, r2 + 1055 0012 13D0 beq .L65 + 575:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 1056 .loc 1 575 67 discriminator 1 view .LVU396 + 1057 0014 15F0040F tst r5, #4 + 1058 0018 10D0 beq .L65 + ARM GAS /tmp/ccaRdTju.s page 41 + + + 578:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 1059 .loc 1 578 4 is_stmt 1 view .LVU397 + 578:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 1060 .loc 1 578 22 is_stmt 0 view .LVU398 + 1061 001a 2368 ldr r3, [r4] + 578:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 1062 .loc 1 578 6 view .LVU399 + 1063 001c 13F0200F tst r3, #32 + 1064 0020 03D1 bne .L66 + 581:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 1065 .loc 1 581 5 is_stmt 1 view .LVU400 + 581:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 1066 .loc 1 581 19 is_stmt 0 view .LVU401 + 1067 0022 2368 ldr r3, [r4] + 581:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 1068 .loc 1 581 25 view .LVU402 + 1069 0024 23F00403 bic r3, r3, #4 + 1070 0028 2360 str r3, [r4] + 1071 .L66: + 585:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1072 .loc 1 585 4 is_stmt 1 view .LVU403 + 585:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1073 .loc 1 585 53 is_stmt 0 view .LVU404 + 1074 002a 016C ldr r1, [r0, #64] + 585:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1075 .loc 1 585 8 view .LVU405 + 1076 002c C26B ldr r2, [r0, #60] + 1077 .LVL65: + 585:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1078 .loc 1 585 46 view .LVU406 + 1079 002e 0423 movs r3, #4 + 1080 0030 8B40 lsls r3, r3, r1 + 585:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1081 .loc 1 585 31 view .LVU407 + 1082 0032 5360 str r3, [r2, #4] + 590:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 1083 .loc 1 590 4 is_stmt 1 view .LVU408 + 590:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 1084 .loc 1 590 11 is_stmt 0 view .LVU409 + 1085 0034 C36A ldr r3, [r0, #44] + 590:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 1086 .loc 1 590 6 view .LVU410 + 1087 0036 03B1 cbz r3, .L64 + 593:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 1088 .loc 1 593 5 is_stmt 1 view .LVU411 + 1089 0038 9847 blx r3 + 1090 .LVL66: + 1091 .L64: + 649:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1092 .loc 1 649 1 is_stmt 0 view .LVU412 + 1093 003a 38BD pop {r3, r4, r5, pc} + 1094 .LVL67: + 1095 .L65: + 598:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 1096 .loc 1 598 8 is_stmt 1 view .LVU413 + 598:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 1097 .loc 1 598 47 is_stmt 0 view .LVU414 + ARM GAS /tmp/ccaRdTju.s page 42 + + + 1098 003c 0223 movs r3, #2 + 1099 003e 8B40 lsls r3, r3, r1 + 598:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 1100 .loc 1 598 11 view .LVU415 + 1101 0040 1342 tst r3, r2 + 1102 0042 1AD0 beq .L68 + 598:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 1103 .loc 1 598 72 discriminator 1 view .LVU416 + 1104 0044 15F0020F tst r5, #2 + 1105 0048 17D0 beq .L68 + 600:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 1106 .loc 1 600 4 is_stmt 1 view .LVU417 + 600:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 1107 .loc 1 600 22 is_stmt 0 view .LVU418 + 1108 004a 2368 ldr r3, [r4] + 600:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 1109 .loc 1 600 6 view .LVU419 + 1110 004c 13F0200F tst r3, #32 + 1111 0050 06D1 bne .L69 + 604:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1112 .loc 1 604 5 is_stmt 1 view .LVU420 + 604:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1113 .loc 1 604 19 is_stmt 0 view .LVU421 + 1114 0052 2368 ldr r3, [r4] + 604:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1115 .loc 1 604 25 view .LVU422 + 1116 0054 23F00A03 bic r3, r3, #10 + 1117 0058 2360 str r3, [r4] + 607:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 1118 .loc 1 607 5 is_stmt 1 view .LVU423 + 607:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 1119 .loc 1 607 17 is_stmt 0 view .LVU424 + 1120 005a 0123 movs r3, #1 + 1121 005c 80F82130 strb r3, [r0, #33] + 1122 .L69: + 611:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1123 .loc 1 611 4 is_stmt 1 view .LVU425 + 611:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1124 .loc 1 611 53 is_stmt 0 view .LVU426 + 1125 0060 016C ldr r1, [r0, #64] + 611:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1126 .loc 1 611 8 view .LVU427 + 1127 0062 C26B ldr r2, [r0, #60] + 1128 .LVL68: + 611:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1129 .loc 1 611 46 view .LVU428 + 1130 0064 0223 movs r3, #2 + 1131 0066 8B40 lsls r3, r3, r1 + 611:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1132 .loc 1 611 31 view .LVU429 + 1133 0068 5360 str r3, [r2, #4] + 614:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1134 .loc 1 614 4 is_stmt 1 view .LVU430 + 614:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1135 .loc 1 614 4 view .LVU431 + 1136 006a 0023 movs r3, #0 + 1137 006c 80F82030 strb r3, [r0, #32] + ARM GAS /tmp/ccaRdTju.s page 43 + + + 614:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1138 .loc 1 614 4 view .LVU432 + 616:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 1139 .loc 1 616 4 view .LVU433 + 616:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 1140 .loc 1 616 11 is_stmt 0 view .LVU434 + 1141 0070 836A ldr r3, [r0, #40] + 616:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 1142 .loc 1 616 6 view .LVU435 + 1143 0072 002B cmp r3, #0 + 1144 0074 E1D0 beq .L64 + 619:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 1145 .loc 1 619 5 is_stmt 1 view .LVU436 + 1146 0076 9847 blx r3 + 1147 .LVL69: + 619:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 1148 .loc 1 619 5 is_stmt 0 view .LVU437 + 1149 0078 DFE7 b .L64 + 1150 .LVL70: + 1151 .L68: + 624:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 1152 .loc 1 624 8 is_stmt 1 view .LVU438 + 624:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 1153 .loc 1 624 48 is_stmt 0 view .LVU439 + 1154 007a 0823 movs r3, #8 + 1155 007c 8B40 lsls r3, r3, r1 + 624:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 1156 .loc 1 624 11 view .LVU440 + 1157 007e 1342 tst r3, r2 + 1158 0080 DBD0 beq .L64 + 624:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 1159 .loc 1 624 73 discriminator 1 view .LVU441 + 1160 0082 15F0080F tst r5, #8 + 1161 0086 D8D0 beq .L64 + 629:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1162 .loc 1 629 5 is_stmt 1 view .LVU442 + 629:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1163 .loc 1 629 19 is_stmt 0 view .LVU443 + 1164 0088 2368 ldr r3, [r4] + 629:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1165 .loc 1 629 25 view .LVU444 + 1166 008a 23F00E03 bic r3, r3, #14 + 1167 008e 2360 str r3, [r4] + 632:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1168 .loc 1 632 5 is_stmt 1 view .LVU445 + 632:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1169 .loc 1 632 54 is_stmt 0 view .LVU446 + 1170 0090 026C ldr r2, [r0, #64] + 1171 .LVL71: + 632:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1172 .loc 1 632 9 view .LVU447 + 1173 0092 C16B ldr r1, [r0, #60] + 632:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1174 .loc 1 632 47 view .LVU448 + 1175 0094 0123 movs r3, #1 + 1176 0096 03FA02F2 lsl r2, r3, r2 + 632:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + ARM GAS /tmp/ccaRdTju.s page 44 + + + 1177 .loc 1 632 32 view .LVU449 + 1178 009a 4A60 str r2, [r1, #4] + 635:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1179 .loc 1 635 5 is_stmt 1 view .LVU450 + 635:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1180 .loc 1 635 21 is_stmt 0 view .LVU451 + 1181 009c 8363 str r3, [r0, #56] + 638:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1182 .loc 1 638 5 is_stmt 1 view .LVU452 + 638:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1183 .loc 1 638 17 is_stmt 0 view .LVU453 + 1184 009e 80F82130 strb r3, [r0, #33] + 641:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1185 .loc 1 641 5 is_stmt 1 view .LVU454 + 641:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1186 .loc 1 641 5 view .LVU455 + 1187 00a2 0023 movs r3, #0 + 1188 00a4 80F82030 strb r3, [r0, #32] + 641:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1189 .loc 1 641 5 view .LVU456 + 643:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 1190 .loc 1 643 5 view .LVU457 + 643:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 1191 .loc 1 643 12 is_stmt 0 view .LVU458 + 1192 00a8 036B ldr r3, [r0, #48] + 643:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 1193 .loc 1 643 7 view .LVU459 + 1194 00aa 002B cmp r3, #0 + 1195 00ac C5D0 beq .L64 + 646:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 1196 .loc 1 646 6 is_stmt 1 view .LVU460 + 1197 00ae 9847 blx r3 + 1198 .LVL72: + 649:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1199 .loc 1 649 1 is_stmt 0 view .LVU461 + 1200 00b0 C3E7 b .L64 + 1201 .cfi_endproc + 1202 .LFE137: + 1204 .section .text.HAL_DMA_RegisterCallback,"ax",%progbits + 1205 .align 1 + 1206 .global HAL_DMA_RegisterCallback + 1207 .syntax unified + 1208 .thumb + 1209 .thumb_func + 1211 HAL_DMA_RegisterCallback: + 1212 .LVL73: + 1213 .LFB138: + 662:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** HAL_StatusTypeDef status = HAL_OK; + 1214 .loc 1 662 1 is_stmt 1 view -0 + 1215 .cfi_startproc + 1216 @ args = 0, pretend = 0, frame = 0 + 1217 @ frame_needed = 0, uses_anonymous_args = 0 + 1218 @ link register save eliminated. + 662:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** HAL_StatusTypeDef status = HAL_OK; + 1219 .loc 1 662 1 is_stmt 0 view .LVU463 + 1220 0000 0346 mov r3, r0 + 663:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + ARM GAS /tmp/ccaRdTju.s page 45 + + + 1221 .loc 1 663 3 is_stmt 1 view .LVU464 + 1222 .LVL74: + 666:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1223 .loc 1 666 3 view .LVU465 + 666:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1224 .loc 1 666 3 view .LVU466 + 1225 0002 90F82000 ldrb r0, [r0, #32] @ zero_extendqisi2 + 1226 .LVL75: + 666:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1227 .loc 1 666 3 is_stmt 0 view .LVU467 + 1228 0006 0128 cmp r0, #1 + 1229 0008 1DD0 beq .L79 + 666:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1230 .loc 1 666 3 is_stmt 1 discriminator 2 view .LVU468 + 1231 000a 0120 movs r0, #1 + 1232 000c 83F82000 strb r0, [r3, #32] + 666:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1233 .loc 1 666 3 discriminator 2 view .LVU469 + 668:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 1234 .loc 1 668 3 discriminator 2 view .LVU470 + 668:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 1235 .loc 1 668 33 is_stmt 0 discriminator 2 view .LVU471 + 1236 0010 93F82100 ldrb r0, [r3, #33] @ zero_extendqisi2 + 668:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 1237 .loc 1 668 5 discriminator 2 view .LVU472 + 1238 0014 0128 cmp r0, #1 + 1239 0016 04D0 beq .L82 + 695:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 1240 .loc 1 695 12 view .LVU473 + 1241 0018 0120 movs r0, #1 + 1242 .L73: + 1243 .LVL76: + 699:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1244 .loc 1 699 3 is_stmt 1 view .LVU474 + 699:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1245 .loc 1 699 3 view .LVU475 + 1246 001a 0022 movs r2, #0 + 1247 .LVL77: + 699:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1248 .loc 1 699 3 is_stmt 0 view .LVU476 + 1249 001c 83F82020 strb r2, [r3, #32] + 699:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1250 .loc 1 699 3 is_stmt 1 view .LVU477 + 701:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 1251 .loc 1 701 3 view .LVU478 + 701:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 1252 .loc 1 701 10 is_stmt 0 view .LVU479 + 1253 0020 7047 bx lr + 1254 .LVL78: + 1255 .L82: + 670:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 1256 .loc 1 670 5 is_stmt 1 view .LVU480 + 1257 0022 0329 cmp r1, #3 + 1258 0024 F9D8 bhi .L73 + 1259 0026 DFE801F0 tbb [pc, r1] + 1260 .L75: + 1261 002a 02 .byte (.L78-.L75)/2 + ARM GAS /tmp/ccaRdTju.s page 46 + + + 1262 002b 05 .byte (.L77-.L75)/2 + 1263 002c 08 .byte (.L76-.L75)/2 + 1264 002d 0B .byte (.L74-.L75)/2 + 1265 .p2align 1 + 1266 .L78: + 673:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** break; + 1267 .loc 1 673 12 view .LVU481 + 673:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** break; + 1268 .loc 1 673 35 is_stmt 0 view .LVU482 + 1269 002e 9A62 str r2, [r3, #40] + 674:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1270 .loc 1 674 12 is_stmt 1 view .LVU483 + 663:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1271 .loc 1 663 21 is_stmt 0 view .LVU484 + 1272 0030 0846 mov r0, r1 + 674:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1273 .loc 1 674 12 view .LVU485 + 1274 0032 F2E7 b .L73 + 1275 .L77: + 677:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** break; + 1276 .loc 1 677 12 is_stmt 1 view .LVU486 + 677:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** break; + 1277 .loc 1 677 39 is_stmt 0 view .LVU487 + 1278 0034 DA62 str r2, [r3, #44] + 678:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1279 .loc 1 678 12 is_stmt 1 view .LVU488 + 663:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1280 .loc 1 663 21 is_stmt 0 view .LVU489 + 1281 0036 0020 movs r0, #0 + 678:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1282 .loc 1 678 12 view .LVU490 + 1283 0038 EFE7 b .L73 + 1284 .L76: + 681:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** break; + 1285 .loc 1 681 12 is_stmt 1 view .LVU491 + 681:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** break; + 1286 .loc 1 681 36 is_stmt 0 view .LVU492 + 1287 003a 1A63 str r2, [r3, #48] + 682:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1288 .loc 1 682 12 is_stmt 1 view .LVU493 + 663:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1289 .loc 1 663 21 is_stmt 0 view .LVU494 + 1290 003c 0020 movs r0, #0 + 682:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1291 .loc 1 682 12 view .LVU495 + 1292 003e ECE7 b .L73 + 1293 .L74: + 685:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** break; + 1294 .loc 1 685 12 is_stmt 1 view .LVU496 + 685:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** break; + 1295 .loc 1 685 36 is_stmt 0 view .LVU497 + 1296 0040 5A63 str r2, [r3, #52] + 686:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1297 .loc 1 686 12 is_stmt 1 view .LVU498 + 663:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1298 .loc 1 663 21 is_stmt 0 view .LVU499 + 1299 0042 0020 movs r0, #0 + ARM GAS /tmp/ccaRdTju.s page 47 + + + 686:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1300 .loc 1 686 12 view .LVU500 + 1301 0044 E9E7 b .L73 + 1302 .L79: + 666:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1303 .loc 1 666 3 view .LVU501 + 1304 0046 0220 movs r0, #2 + 702:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1305 .loc 1 702 1 view .LVU502 + 1306 0048 7047 bx lr + 1307 .cfi_endproc + 1308 .LFE138: + 1310 .section .text.HAL_DMA_UnRegisterCallback,"ax",%progbits + 1311 .align 1 + 1312 .global HAL_DMA_UnRegisterCallback + 1313 .syntax unified + 1314 .thumb + 1315 .thumb_func + 1317 HAL_DMA_UnRegisterCallback: + 1318 .LVL79: + 1319 .LFB139: + 713:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** HAL_StatusTypeDef status = HAL_OK; + 1320 .loc 1 713 1 is_stmt 1 view -0 + 1321 .cfi_startproc + 1322 @ args = 0, pretend = 0, frame = 0 + 1323 @ frame_needed = 0, uses_anonymous_args = 0 + 1324 @ link register save eliminated. + 713:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** HAL_StatusTypeDef status = HAL_OK; + 1325 .loc 1 713 1 is_stmt 0 view .LVU504 + 1326 0000 0346 mov r3, r0 + 714:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1327 .loc 1 714 3 is_stmt 1 view .LVU505 + 1328 .LVL80: + 717:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1329 .loc 1 717 3 view .LVU506 + 717:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1330 .loc 1 717 3 view .LVU507 + 1331 0002 90F82020 ldrb r2, [r0, #32] @ zero_extendqisi2 + 1332 0006 012A cmp r2, #1 + 1333 0008 25D0 beq .L92 + 717:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1334 .loc 1 717 3 discriminator 2 view .LVU508 + 1335 000a 0122 movs r2, #1 + 1336 000c 80F82020 strb r2, [r0, #32] + 717:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1337 .loc 1 717 3 discriminator 2 view .LVU509 + 719:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 1338 .loc 1 719 3 discriminator 2 view .LVU510 + 719:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 1339 .loc 1 719 33 is_stmt 0 discriminator 2 view .LVU511 + 1340 0010 90F82100 ldrb r0, [r0, #33] @ zero_extendqisi2 + 1341 .LVL81: + 719:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 1342 .loc 1 719 5 discriminator 2 view .LVU512 + 1343 0014 9042 cmp r0, r2 + 1344 0016 04D0 beq .L95 + 753:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + ARM GAS /tmp/ccaRdTju.s page 48 + + + 1345 .loc 1 753 12 view .LVU513 + 1346 0018 0120 movs r0, #1 + 1347 .L85: + 1348 .LVL82: + 757:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1349 .loc 1 757 3 is_stmt 1 view .LVU514 + 757:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1350 .loc 1 757 3 view .LVU515 + 1351 001a 0022 movs r2, #0 + 1352 001c 83F82020 strb r2, [r3, #32] + 757:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1353 .loc 1 757 3 view .LVU516 + 759:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 1354 .loc 1 759 3 view .LVU517 + 759:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 1355 .loc 1 759 10 is_stmt 0 view .LVU518 + 1356 0020 7047 bx lr + 1357 .LVL83: + 1358 .L95: + 721:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** { + 1359 .loc 1 721 5 is_stmt 1 view .LVU519 + 1360 0022 0429 cmp r1, #4 + 1361 0024 F9D8 bhi .L85 + 1362 0026 DFE801F0 tbb [pc, r1] + 1363 .L87: + 1364 002a 03 .byte (.L91-.L87)/2 + 1365 002b 07 .byte (.L90-.L87)/2 + 1366 002c 0A .byte (.L89-.L87)/2 + 1367 002d 0D .byte (.L88-.L87)/2 + 1368 002e 10 .byte (.L86-.L87)/2 + 1369 002f 00 .p2align 1 + 1370 .L91: + 724:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** break; + 1371 .loc 1 724 12 view .LVU520 + 724:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** break; + 1372 .loc 1 724 35 is_stmt 0 view .LVU521 + 1373 0030 0022 movs r2, #0 + 1374 0032 9A62 str r2, [r3, #40] + 725:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1375 .loc 1 725 12 is_stmt 1 view .LVU522 + 714:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1376 .loc 1 714 21 is_stmt 0 view .LVU523 + 1377 0034 0846 mov r0, r1 + 725:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1378 .loc 1 725 12 view .LVU524 + 1379 0036 F0E7 b .L85 + 1380 .L90: + 728:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** break; + 1381 .loc 1 728 12 is_stmt 1 view .LVU525 + 728:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** break; + 1382 .loc 1 728 39 is_stmt 0 view .LVU526 + 1383 0038 0020 movs r0, #0 + 1384 003a D862 str r0, [r3, #44] + 729:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1385 .loc 1 729 12 is_stmt 1 view .LVU527 + 1386 003c EDE7 b .L85 + 1387 .L89: + ARM GAS /tmp/ccaRdTju.s page 49 + + + 732:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** break; + 1388 .loc 1 732 12 view .LVU528 + 732:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** break; + 1389 .loc 1 732 36 is_stmt 0 view .LVU529 + 1390 003e 0020 movs r0, #0 + 1391 0040 1863 str r0, [r3, #48] + 733:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1392 .loc 1 733 12 is_stmt 1 view .LVU530 + 1393 0042 EAE7 b .L85 + 1394 .L88: + 736:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** break; + 1395 .loc 1 736 12 view .LVU531 + 736:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** break; + 1396 .loc 1 736 36 is_stmt 0 view .LVU532 + 1397 0044 0020 movs r0, #0 + 1398 0046 5863 str r0, [r3, #52] + 737:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1399 .loc 1 737 12 is_stmt 1 view .LVU533 + 1400 0048 E7E7 b .L85 + 1401 .L86: + 740:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->XferHalfCpltCallback = NULL; + 1402 .loc 1 740 12 view .LVU534 + 740:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->XferHalfCpltCallback = NULL; + 1403 .loc 1 740 35 is_stmt 0 view .LVU535 + 1404 004a 0020 movs r0, #0 + 1405 004c 9862 str r0, [r3, #40] + 741:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->XferErrorCallback = NULL; + 1406 .loc 1 741 12 is_stmt 1 view .LVU536 + 741:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->XferErrorCallback = NULL; + 1407 .loc 1 741 39 is_stmt 0 view .LVU537 + 1408 004e D862 str r0, [r3, #44] + 742:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->XferAbortCallback = NULL; + 1409 .loc 1 742 12 is_stmt 1 view .LVU538 + 742:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** hdma->XferAbortCallback = NULL; + 1410 .loc 1 742 36 is_stmt 0 view .LVU539 + 1411 0050 1863 str r0, [r3, #48] + 743:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** break; + 1412 .loc 1 743 12 is_stmt 1 view .LVU540 + 743:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** break; + 1413 .loc 1 743 36 is_stmt 0 view .LVU541 + 1414 0052 5863 str r0, [r3, #52] + 744:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1415 .loc 1 744 12 is_stmt 1 view .LVU542 + 1416 0054 E1E7 b .L85 + 1417 .LVL84: + 1418 .L92: + 717:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1419 .loc 1 717 3 is_stmt 0 view .LVU543 + 1420 0056 0220 movs r0, #2 + 1421 .LVL85: + 760:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1422 .loc 1 760 1 view .LVU544 + 1423 0058 7047 bx lr + 1424 .cfi_endproc + 1425 .LFE139: + 1427 .section .text.HAL_DMA_GetState,"ax",%progbits + 1428 .align 1 + ARM GAS /tmp/ccaRdTju.s page 50 + + + 1429 .global HAL_DMA_GetState + 1430 .syntax unified + 1431 .thumb + 1432 .thumb_func + 1434 HAL_DMA_GetState: + 1435 .LVL86: + 1436 .LFB140: + 789:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** return hdma->State; + 1437 .loc 1 789 1 is_stmt 1 view -0 + 1438 .cfi_startproc + 1439 @ args = 0, pretend = 0, frame = 0 + 1440 @ frame_needed = 0, uses_anonymous_args = 0 + 1441 @ link register save eliminated. + 790:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 1442 .loc 1 790 3 view .LVU546 + 791:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1443 .loc 1 791 1 is_stmt 0 view .LVU547 + 1444 0000 90F82100 ldrb r0, [r0, #33] @ zero_extendqisi2 + 1445 .LVL87: + 791:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1446 .loc 1 791 1 view .LVU548 + 1447 0004 7047 bx lr + 1448 .cfi_endproc + 1449 .LFE140: + 1451 .section .text.HAL_DMA_GetError,"ax",%progbits + 1452 .align 1 + 1453 .global HAL_DMA_GetError + 1454 .syntax unified + 1455 .thumb + 1456 .thumb_func + 1458 HAL_DMA_GetError: + 1459 .LVL88: + 1460 .LFB141: + 800:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** return hdma->ErrorCode; + 1461 .loc 1 800 1 is_stmt 1 view -0 + 1462 .cfi_startproc + 1463 @ args = 0, pretend = 0, frame = 0 + 1464 @ frame_needed = 0, uses_anonymous_args = 0 + 1465 @ link register save eliminated. + 801:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 1466 .loc 1 801 3 view .LVU550 + 801:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** } + 1467 .loc 1 801 14 is_stmt 0 view .LVU551 + 1468 0000 806B ldr r0, [r0, #56] + 1469 .LVL89: + 802:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_dma.c **** + 1470 .loc 1 802 1 view .LVU552 + 1471 0002 7047 bx lr + 1472 .cfi_endproc + 1473 .LFE141: + 1475 .text + 1476 .Letext0: + 1477 .file 2 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 1478 .file 3 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 1479 .file 4 "Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h" + 1480 .file 5 "Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h" + 1481 .file 6 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h" + ARM GAS /tmp/ccaRdTju.s page 51 + + + 1482 .file 7 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h" + 1483 .file 8 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h" + ARM GAS /tmp/ccaRdTju.s page 52 + + +DEFINED SYMBOLS + *ABS*:0000000000000000 stm32f3xx_hal_dma.c + /tmp/ccaRdTju.s:21 .text.DMA_SetConfig:0000000000000000 $t + /tmp/ccaRdTju.s:26 .text.DMA_SetConfig:0000000000000000 DMA_SetConfig + /tmp/ccaRdTju.s:97 .text.DMA_CalcBaseAndBitshift:0000000000000000 $t + /tmp/ccaRdTju.s:102 .text.DMA_CalcBaseAndBitshift:0000000000000000 DMA_CalcBaseAndBitshift + /tmp/ccaRdTju.s:156 .text.DMA_CalcBaseAndBitshift:0000000000000034 $d + /tmp/ccaRdTju.s:166 .text.HAL_DMA_Init:0000000000000000 $t + /tmp/ccaRdTju.s:172 .text.HAL_DMA_Init:0000000000000000 HAL_DMA_Init + /tmp/ccaRdTju.s:280 .text.HAL_DMA_DeInit:0000000000000000 $t + /tmp/ccaRdTju.s:286 .text.HAL_DMA_DeInit:0000000000000000 HAL_DMA_DeInit + /tmp/ccaRdTju.s:390 .text.HAL_DMA_Start:0000000000000000 $t + /tmp/ccaRdTju.s:396 .text.HAL_DMA_Start:0000000000000000 HAL_DMA_Start + /tmp/ccaRdTju.s:488 .text.HAL_DMA_Start_IT:0000000000000000 $t + /tmp/ccaRdTju.s:494 .text.HAL_DMA_Start_IT:0000000000000000 HAL_DMA_Start_IT + /tmp/ccaRdTju.s:618 .text.HAL_DMA_Abort:0000000000000000 $t + /tmp/ccaRdTju.s:624 .text.HAL_DMA_Abort:0000000000000000 HAL_DMA_Abort + /tmp/ccaRdTju.s:699 .text.HAL_DMA_Abort_IT:0000000000000000 $t + /tmp/ccaRdTju.s:705 .text.HAL_DMA_Abort_IT:0000000000000000 HAL_DMA_Abort_IT + /tmp/ccaRdTju.s:796 .text.HAL_DMA_PollForTransfer:0000000000000000 $t + /tmp/ccaRdTju.s:802 .text.HAL_DMA_PollForTransfer:0000000000000000 HAL_DMA_PollForTransfer + /tmp/ccaRdTju.s:1015 .text.HAL_DMA_IRQHandler:0000000000000000 $t + /tmp/ccaRdTju.s:1021 .text.HAL_DMA_IRQHandler:0000000000000000 HAL_DMA_IRQHandler + /tmp/ccaRdTju.s:1205 .text.HAL_DMA_RegisterCallback:0000000000000000 $t + /tmp/ccaRdTju.s:1211 .text.HAL_DMA_RegisterCallback:0000000000000000 HAL_DMA_RegisterCallback + /tmp/ccaRdTju.s:1261 .text.HAL_DMA_RegisterCallback:000000000000002a $d + /tmp/ccaRdTju.s:1265 .text.HAL_DMA_RegisterCallback:000000000000002e $t + /tmp/ccaRdTju.s:1311 .text.HAL_DMA_UnRegisterCallback:0000000000000000 $t + /tmp/ccaRdTju.s:1317 .text.HAL_DMA_UnRegisterCallback:0000000000000000 HAL_DMA_UnRegisterCallback + /tmp/ccaRdTju.s:1364 .text.HAL_DMA_UnRegisterCallback:000000000000002a $d + /tmp/ccaRdTju.s:1428 .text.HAL_DMA_GetState:0000000000000000 $t + /tmp/ccaRdTju.s:1434 .text.HAL_DMA_GetState:0000000000000000 HAL_DMA_GetState + /tmp/ccaRdTju.s:1452 .text.HAL_DMA_GetError:0000000000000000 $t + /tmp/ccaRdTju.s:1458 .text.HAL_DMA_GetError:0000000000000000 HAL_DMA_GetError + /tmp/ccaRdTju.s:1369 .text.HAL_DMA_UnRegisterCallback:000000000000002f $d + /tmp/ccaRdTju.s:1369 .text.HAL_DMA_UnRegisterCallback:0000000000000030 $t + +UNDEFINED SYMBOLS +HAL_GetTick diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_dma.o b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_dma.o new file mode 100644 index 0000000000000000000000000000000000000000..47e1b93f17700b3dd8007bcbc8d475e752a556a6 GIT binary patch literal 16136 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 literal 0 HcmV?d00001 diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_exti.d b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_exti.d new file mode 100644 index 0000000..0a52110 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_exti.d @@ -0,0 +1,58 @@ +build/stm32f3xx_hal_exti.o: \ + Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h \ + Core/Inc/stm32f3xx_hal_conf.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h \ + Drivers/CMSIS/Include/core_cm4.h Drivers/CMSIS/Include/cmsis_version.h \ + Drivers/CMSIS/Include/cmsis_compiler.h Drivers/CMSIS/Include/cmsis_gcc.h \ + Drivers/CMSIS/Include/mpu_armv7.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h: +Core/Inc/stm32f3xx_hal_conf.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h: +Drivers/CMSIS/Include/core_cm4.h: +Drivers/CMSIS/Include/cmsis_version.h: +Drivers/CMSIS/Include/cmsis_compiler.h: +Drivers/CMSIS/Include/cmsis_gcc.h: +Drivers/CMSIS/Include/mpu_armv7.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h: +Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h: diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_exti.lst b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_exti.lst new file mode 100644 index 0000000..a4e4499 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_exti.lst @@ -0,0 +1,1819 @@ +ARM GAS /tmp/ccQLKAuM.s page 1 + + + 1 .cpu cortex-m4 + 2 .arch armv7e-m + 3 .fpu fpv4-sp-d16 + 4 .eabi_attribute 27, 1 + 5 .eabi_attribute 28, 1 + 6 .eabi_attribute 20, 1 + 7 .eabi_attribute 21, 1 + 8 .eabi_attribute 23, 3 + 9 .eabi_attribute 24, 1 + 10 .eabi_attribute 25, 1 + 11 .eabi_attribute 26, 1 + 12 .eabi_attribute 30, 1 + 13 .eabi_attribute 34, 1 + 14 .eabi_attribute 18, 4 + 15 .file "stm32f3xx_hal_exti.c" + 16 .text + 17 .Ltext0: + 18 .cfi_sections .debug_frame + 19 .file 1 "Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c" + 20 .section .text.HAL_EXTI_SetConfigLine,"ax",%progbits + 21 .align 1 + 22 .global HAL_EXTI_SetConfigLine + 23 .syntax unified + 24 .thumb + 25 .thumb_func + 27 HAL_EXTI_SetConfigLine: + 28 .LVL0: + 29 .LFB130: + 1:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /** + 2:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** ****************************************************************************** + 3:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @file stm32f3xx_hal_exti.c + 4:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @author MCD Application Team + 5:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @brief EXTI HAL module driver. + 6:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * This file provides firmware functions to manage the following + 7:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * functionalities of the Extended Interrupts and events controller (EXTI) peripheral: + 8:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * + Initialization and de-initialization functions + 9:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * + IO operation functions + 10:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * + 11:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** @verbatim + 12:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** ============================================================================== + 13:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** ##### EXTI Peripheral features ##### + 14:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** ============================================================================== + 15:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** [..] + 16:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** (+) Each Exti line can be configured within this driver. + 17:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 18:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** (+) Exti line can be configured in 3 different modes + 19:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** (++) Interrupt + 20:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** (++) Event + 21:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** (++) Both of them + 22:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 23:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** (+) Configurable Exti lines can be configured with 3 different triggers + 24:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** (++) Rising + 25:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** (++) Falling + 26:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** (++) Both of them + 27:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 28:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** (+) When set in interrupt mode, configurable Exti lines have two different + 29:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** interrupts pending registers which allow to distinguish which transition + ARM GAS /tmp/ccQLKAuM.s page 2 + + + 30:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** occurs: + 31:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** (++) Rising edge pending interrupt + 32:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** (++) Falling + 33:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 34:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** (+) Exti lines 0 to 15 are linked to gpio pin number 0 to 15. Gpio port can + 35:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** be selected through multiplexer. + 36:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 37:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** ##### How to use this driver ##### + 38:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** ============================================================================== + 39:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** [..] + 40:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 41:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** (#) Configure the EXTI line using HAL_EXTI_SetConfigLine(). + 42:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** (++) Choose the interrupt line number by setting "Line" member from + 43:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** EXTI_ConfigTypeDef structure. + 44:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** (++) Configure the interrupt and/or event mode using "Mode" member from + 45:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** EXTI_ConfigTypeDef structure. + 46:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** (++) For configurable lines, configure rising and/or falling trigger + 47:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** "Trigger" member from EXTI_ConfigTypeDef structure. + 48:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** (++) For Exti lines linked to gpio, choose gpio port using "GPIOSel" + 49:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** member from GPIO_InitTypeDef structure. + 50:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 51:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** (#) Get current Exti configuration of a dedicated line using + 52:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** HAL_EXTI_GetConfigLine(). + 53:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** (++) Provide exiting handle as parameter. + 54:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** (++) Provide pointer on EXTI_ConfigTypeDef structure as second parameter. + 55:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 56:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** (#) Clear Exti configuration of a dedicated line using HAL_EXTI_GetConfigLine(). + 57:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** (++) Provide exiting handle as parameter. + 58:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 59:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** (#) Register callback to treat Exti interrupts using HAL_EXTI_RegisterCallback(). + 60:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** (++) Provide exiting handle as first parameter. + 61:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** (++) Provide which callback will be registered using one value from + 62:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** EXTI_CallbackIDTypeDef. + 63:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** (++) Provide callback function pointer. + 64:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 65:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** (#) Get interrupt pending bit using HAL_EXTI_GetPending(). + 66:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 67:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** (#) Clear interrupt pending bit using HAL_EXTI_GetPending(). + 68:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 69:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** (#) Generate software interrupt using HAL_EXTI_GenerateSWI(). + 70:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 71:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** @endverbatim + 72:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** ****************************************************************************** + 73:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @attention + 74:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * + 75:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** *

    © Copyright (c) 2019 STMicroelectronics. + 76:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * All rights reserved.

    + 77:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * + 78:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * This software component is licensed by ST under BSD 3-Clause license, + 79:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * the "License"; You may not use this file except in compliance with the + 80:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * License. You may obtain a copy of the License at: + 81:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * opensource.org/licenses/BSD-3-Clause + 82:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * + 83:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** ****************************************************************************** + 84:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** */ + 85:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 86:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Includes ------------------------------------------------------------------*/ + ARM GAS /tmp/ccQLKAuM.s page 3 + + + 87:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** #include "stm32f3xx_hal.h" + 88:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 89:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /** @addtogroup STM32F3xx_HAL_Driver + 90:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @{ + 91:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** */ + 92:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 93:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /** @addtogroup EXTI + 94:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @{ + 95:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** */ + 96:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /** MISRA C:2012 deviation rule has been granted for following rule: + 97:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * Rule-18.1_b - Medium: Array `EXTICR' 1st subscript interval [0,7] may be out + 98:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * of bounds [0,3] in following API : + 99:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * HAL_EXTI_SetConfigLine + 100:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * HAL_EXTI_GetConfigLine + 101:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * HAL_EXTI_ClearConfigLine + 102:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** */ + 103:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** #ifdef HAL_EXTI_MODULE_ENABLED + 105:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 106:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Private typedef -----------------------------------------------------------*/ + 107:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Private defines -----------------------------------------------------------*/ + 108:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /** @defgroup EXTI_Private_Constants EXTI Private Constants + 109:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @{ + 110:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** */ + 111:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** #define EXTI_MODE_OFFSET 0x08u /* 0x20: offset between CPU IMR/EMR registers * + 112:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** #define EXTI_CONFIG_OFFSET 0x08u /* 0x20: offset between CPU Rising/Falling conf + 113:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /** + 114:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @} + 115:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** */ + 116:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 117:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Private macros ------------------------------------------------------------*/ + 118:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Private variables ---------------------------------------------------------*/ + 119:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Private function prototypes -----------------------------------------------*/ + 120:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Exported functions --------------------------------------------------------*/ + 121:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 122:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /** @addtogroup EXTI_Exported_Functions + 123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @{ + 124:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** */ + 125:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 126:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /** @addtogroup EXTI_Exported_Functions_Group1 + 127:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @brief Configuration functions + 128:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * + 129:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** @verbatim + 130:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** =============================================================================== + 131:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** ##### Configuration functions ##### + 132:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** =============================================================================== + 133:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 134:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** @endverbatim + 135:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @{ + 136:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** */ + 137:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 138:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /** + 139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @brief Set configuration of a dedicated Exti line. + 140:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @param hexti Exti handle. + 141:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @param pExtiConfig Pointer on EXTI configuration to be set. + 142:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @retval HAL Status. + 143:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** */ + ARM GAS /tmp/ccQLKAuM.s page 4 + + + 144:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig + 145:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** { + 30 .loc 1 145 1 view -0 + 31 .cfi_startproc + 32 @ args = 0, pretend = 0, frame = 0 + 33 @ frame_needed = 0, uses_anonymous_args = 0 + 34 @ link register save eliminated. + 146:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** __IO uint32_t *regaddr; + 35 .loc 1 146 3 view .LVU1 + 147:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** uint32_t regval; + 36 .loc 1 147 3 view .LVU2 + 148:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** uint32_t linepos; + 37 .loc 1 148 3 view .LVU3 + 149:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** uint32_t maskline; + 38 .loc 1 149 3 view .LVU4 + 150:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** uint32_t offset; + 39 .loc 1 150 3 view .LVU5 + 151:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Check null pointer */ + 153:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** if ((hexti == NULL) || (pExtiConfig == NULL)) + 40 .loc 1 153 3 view .LVU6 + 41 .loc 1 153 6 is_stmt 0 view .LVU7 + 42 0000 0028 cmp r0, #0 + 43 0002 5ED0 beq .L12 + 44 .loc 1 153 23 discriminator 1 view .LVU8 + 45 0004 0029 cmp r1, #0 + 46 0006 5ED0 beq .L13 + 145:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** __IO uint32_t *regaddr; + 47 .loc 1 145 1 view .LVU9 + 48 0008 F0B4 push {r4, r5, r6, r7} + 49 .cfi_def_cfa_offset 16 + 50 .cfi_offset 4, -16 + 51 .cfi_offset 5, -12 + 52 .cfi_offset 6, -8 + 53 .cfi_offset 7, -4 + 154:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** { + 155:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** return HAL_ERROR; + 156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 157:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 158:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Check parameters */ + 159:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** assert_param(IS_EXTI_LINE(pExtiConfig->Line)); + 54 .loc 1 159 3 is_stmt 1 view .LVU10 + 160:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** assert_param(IS_EXTI_MODE(pExtiConfig->Mode)); + 55 .loc 1 160 3 view .LVU11 + 161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 162:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Assign line number to handle */ + 163:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** hexti->Line = pExtiConfig->Line; + 56 .loc 1 163 3 view .LVU12 + 57 .loc 1 163 28 is_stmt 0 view .LVU13 + 58 000a 0A68 ldr r2, [r1] + 59 .loc 1 163 15 view .LVU14 + 60 000c 0260 str r2, [r0] + 164:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Compute line register offset and line mask */ + 166:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** offset = ((pExtiConfig->Line & EXTI_REG_MASK) >> EXTI_REG_SHIFT); + 61 .loc 1 166 3 is_stmt 1 view .LVU15 + 62 .loc 1 166 10 is_stmt 0 view .LVU16 + ARM GAS /tmp/ccQLKAuM.s page 5 + + + 63 000e C2F30043 ubfx r3, r2, #16, #1 + 64 .LVL1: + 167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** linepos = (pExtiConfig->Line & EXTI_PIN_MASK); + 65 .loc 1 167 3 is_stmt 1 view .LVU17 + 66 .loc 1 167 11 is_stmt 0 view .LVU18 + 67 0012 02F01F04 and r4, r2, #31 + 68 .LVL2: + 168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** maskline = (1uL << linepos); + 69 .loc 1 168 3 is_stmt 1 view .LVU19 + 70 .loc 1 168 12 is_stmt 0 view .LVU20 + 71 0016 0120 movs r0, #1 + 72 .LVL3: + 73 .loc 1 168 12 view .LVU21 + 74 0018 A040 lsls r0, r0, r4 + 75 .LVL4: + 169:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Configure triggers for configurable lines */ + 171:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** if ((pExtiConfig->Line & EXTI_CONFIG) != 0x00u) + 76 .loc 1 171 3 is_stmt 1 view .LVU22 + 77 .loc 1 171 6 is_stmt 0 view .LVU23 + 78 001a 12F0007F tst r2, #33554432 + 79 001e 1BD0 beq .L3 + 172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** { + 173:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** assert_param(IS_EXTI_TRIGGER(pExtiConfig->Trigger)); + 80 .loc 1 173 5 is_stmt 1 view .LVU24 + 174:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 175:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Configure rising trigger */ + 176:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regaddr = (&EXTI->RTSR + (EXTI_CONFIG_OFFSET * offset)); + 81 .loc 1 176 5 view .LVU25 + 82 .loc 1 176 28 is_stmt 0 view .LVU26 + 83 0020 4FEA431C lsl ip, r3, #5 + 84 .loc 1 176 13 view .LVU27 + 85 0024 294F ldr r7, .L19 + 86 .LVL5: + 177:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regval = *regaddr; + 87 .loc 1 177 5 is_stmt 1 view .LVU28 + 88 .loc 1 177 12 is_stmt 0 view .LVU29 + 89 0026 5CF80750 ldr r5, [ip, r7] + 90 .LVL6: + 178:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 179:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Mask or set line */ + 180:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** if ((pExtiConfig->Trigger & EXTI_TRIGGER_RISING) != 0x00u) + 91 .loc 1 180 5 is_stmt 1 view .LVU30 + 92 .loc 1 180 21 is_stmt 0 view .LVU31 + 93 002a 8E68 ldr r6, [r1, #8] + 94 .loc 1 180 8 view .LVU32 + 95 002c 16F0010F tst r6, #1 + 96 0030 29D0 beq .L4 + 181:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** { + 182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regval |= maskline; + 97 .loc 1 182 7 is_stmt 1 view .LVU33 + 98 .loc 1 182 14 is_stmt 0 view .LVU34 + 99 0032 0543 orrs r5, r5, r0 + 100 .LVL7: + 101 .L5: + 183:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 184:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** else + ARM GAS /tmp/ccQLKAuM.s page 6 + + + 185:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** { + 186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regval &= ~maskline; + 187:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 188:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Store rising trigger mode */ + 190:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** *regaddr = regval; + 102 .loc 1 190 5 is_stmt 1 view .LVU35 + 103 .loc 1 190 14 is_stmt 0 view .LVU36 + 104 0034 4CF80750 str r5, [ip, r7] + 191:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 192:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Configure falling trigger */ + 193:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regaddr = (&EXTI->FTSR + (EXTI_CONFIG_OFFSET * offset)); + 105 .loc 1 193 5 is_stmt 1 view .LVU37 + 106 .loc 1 193 13 is_stmt 0 view .LVU38 + 107 0038 254E ldr r6, .L19+4 + 108 .LVL8: + 194:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regval = *regaddr; + 109 .loc 1 194 5 is_stmt 1 view .LVU39 + 110 .loc 1 194 12 is_stmt 0 view .LVU40 + 111 003a 5CF80650 ldr r5, [ip, r6] + 112 .LVL9: + 195:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 196:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Mask or set line */ + 197:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** if ((pExtiConfig->Trigger & EXTI_TRIGGER_FALLING) != 0x00u) + 113 .loc 1 197 5 is_stmt 1 view .LVU41 + 114 .loc 1 197 8 is_stmt 0 view .LVU42 + 115 003e 8F68 ldr r7, [r1, #8] + 116 0040 17F0020F tst r7, #2 + 117 0044 22D0 beq .L6 + 198:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** { + 199:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regval |= maskline; + 118 .loc 1 199 7 is_stmt 1 view .LVU43 + 119 .loc 1 199 14 is_stmt 0 view .LVU44 + 120 0046 0543 orrs r5, r5, r0 + 121 .LVL10: + 122 .L7: + 200:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 201:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** else + 202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** { + 203:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regval &= ~maskline; + 204:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 205:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 206:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Store falling trigger mode */ + 207:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** *regaddr = regval; + 123 .loc 1 207 5 is_stmt 1 view .LVU45 + 124 .loc 1 207 14 is_stmt 0 view .LVU46 + 125 0048 4CF80650 str r5, [ip, r6] + 208:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 209:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Configure gpio port selection in case of gpio exti line */ + 210:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** if ((pExtiConfig->Line & EXTI_GPIO) == EXTI_GPIO) + 126 .loc 1 210 5 is_stmt 1 view .LVU47 + 127 .loc 1 210 28 is_stmt 0 view .LVU48 + 128 004c 0D68 ldr r5, [r1] + 129 .LVL11: + 130 .loc 1 210 28 view .LVU49 + 131 004e 05F0C06C and ip, r5, #100663296 + 132 .LVL12: + ARM GAS /tmp/ccQLKAuM.s page 7 + + + 133 .loc 1 210 8 view .LVU50 + 134 0052 BCF1C06F cmp ip, #100663296 + 135 0056 1CD0 beq .L18 + 136 .LVL13: + 137 .L3: + 211:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** { + 212:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** assert_param(IS_EXTI_GPIO_PORT(pExtiConfig->GPIOSel)); + 213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** assert_param(IS_EXTI_GPIO_PIN(linepos)); + 214:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 215:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regval = SYSCFG->EXTICR[linepos >> 2u]; + 216:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + 217:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regval |= (pExtiConfig->GPIOSel << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + 218:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** SYSCFG->EXTICR[linepos >> 2u] = regval; + 219:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 220:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 221:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 222:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Configure interrupt mode : read current mode */ + 223:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regaddr = (&EXTI->IMR + (EXTI_MODE_OFFSET * offset)); + 138 .loc 1 223 3 is_stmt 1 view .LVU51 + 139 .loc 1 223 25 is_stmt 0 view .LVU52 + 140 0058 5B01 lsls r3, r3, #5 + 141 .LVL14: + 142 .loc 1 223 11 view .LVU53 + 143 005a 03F18042 add r2, r3, #1073741824 + 144 005e 02F58232 add r2, r2, #66560 + 145 .LVL15: + 224:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regval = *regaddr; + 146 .loc 1 224 3 is_stmt 1 view .LVU54 + 147 .loc 1 224 10 is_stmt 0 view .LVU55 + 148 0062 1468 ldr r4, [r2] + 149 .LVL16: + 225:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 226:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Mask or set line */ + 227:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** if ((pExtiConfig->Mode & EXTI_MODE_INTERRUPT) != 0x00u) + 150 .loc 1 227 3 is_stmt 1 view .LVU56 + 151 .loc 1 227 6 is_stmt 0 view .LVU57 + 152 0064 4D68 ldr r5, [r1, #4] + 153 0066 15F0010F tst r5, #1 + 154 006a 24D0 beq .L8 + 228:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** { + 229:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regval |= maskline; + 155 .loc 1 229 5 is_stmt 1 view .LVU58 + 156 .loc 1 229 12 is_stmt 0 view .LVU59 + 157 006c 0443 orrs r4, r4, r0 + 158 .LVL17: + 159 .L9: + 230:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 231:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** else + 232:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** { + 233:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regval &= ~maskline; + 234:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 235:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 236:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Store interrupt mode */ + 237:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** *regaddr = regval; + 160 .loc 1 237 3 is_stmt 1 view .LVU60 + 161 .loc 1 237 12 is_stmt 0 view .LVU61 + 162 006e 1460 str r4, [r2] + ARM GAS /tmp/ccQLKAuM.s page 8 + + + 238:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Configure event mode : read current mode */ + 240:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regaddr = (&EXTI->EMR + (EXTI_MODE_OFFSET * offset)); + 163 .loc 1 240 3 is_stmt 1 view .LVU62 + 164 .loc 1 240 11 is_stmt 0 view .LVU63 + 165 0070 184C ldr r4, .L19+8 + 166 .LVL18: + 241:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regval = *regaddr; + 167 .loc 1 241 3 is_stmt 1 view .LVU64 + 168 .loc 1 241 10 is_stmt 0 view .LVU65 + 169 0072 1A59 ldr r2, [r3, r4] + 170 .LVL19: + 242:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 243:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Mask or set line */ + 244:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** if ((pExtiConfig->Mode & EXTI_MODE_EVENT) != 0x00u) + 171 .loc 1 244 3 is_stmt 1 view .LVU66 + 172 .loc 1 244 19 is_stmt 0 view .LVU67 + 173 0074 4968 ldr r1, [r1, #4] + 174 .LVL20: + 175 .loc 1 244 6 view .LVU68 + 176 0076 11F0020F tst r1, #2 + 177 007a 1FD0 beq .L10 + 245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** { + 246:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regval |= maskline; + 178 .loc 1 246 5 is_stmt 1 view .LVU69 + 179 .loc 1 246 12 is_stmt 0 view .LVU70 + 180 007c 0243 orrs r2, r2, r0 + 181 .LVL21: + 182 .L11: + 247:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 248:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** else + 249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** { + 250:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regval &= ~maskline; + 251:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 252:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 253:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Store event mode */ + 254:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** *regaddr = regval; + 183 .loc 1 254 3 is_stmt 1 view .LVU71 + 184 .loc 1 254 12 is_stmt 0 view .LVU72 + 185 007e 1A51 str r2, [r3, r4] + 255:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 256:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** return HAL_OK; + 186 .loc 1 256 3 is_stmt 1 view .LVU73 + 187 .loc 1 256 10 is_stmt 0 view .LVU74 + 188 0080 0020 movs r0, #0 + 189 .LVL22: + 257:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 190 .loc 1 257 1 view .LVU75 + 191 0082 F0BC pop {r4, r5, r6, r7} + 192 .cfi_remember_state + 193 .cfi_restore 7 + 194 .cfi_restore 6 + 195 .cfi_restore 5 + 196 .cfi_restore 4 + 197 .cfi_def_cfa_offset 0 + 198 .LVL23: + 199 .loc 1 257 1 view .LVU76 + ARM GAS /tmp/ccQLKAuM.s page 9 + + + 200 0084 7047 bx lr + 201 .LVL24: + 202 .L4: + 203 .cfi_restore_state + 186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 204 .loc 1 186 7 is_stmt 1 view .LVU77 + 186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 205 .loc 1 186 14 is_stmt 0 view .LVU78 + 206 0086 25EA0005 bic r5, r5, r0 + 207 .LVL25: + 186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 208 .loc 1 186 14 view .LVU79 + 209 008a D3E7 b .L5 + 210 .LVL26: + 211 .L6: + 203:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 212 .loc 1 203 7 is_stmt 1 view .LVU80 + 203:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 213 .loc 1 203 14 is_stmt 0 view .LVU81 + 214 008c 25EA0005 bic r5, r5, r0 + 215 .LVL27: + 203:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 216 .loc 1 203 14 view .LVU82 + 217 0090 DAE7 b .L7 + 218 .LVL28: + 219 .L18: + 212:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** assert_param(IS_EXTI_GPIO_PIN(linepos)); + 220 .loc 1 212 7 is_stmt 1 view .LVU83 + 213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 221 .loc 1 213 7 view .LVU84 + 215:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + 222 .loc 1 215 7 view .LVU85 + 215:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + 223 .loc 1 215 39 is_stmt 0 view .LVU86 + 224 0092 A408 lsrs r4, r4, #2 + 225 .LVL29: + 215:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + 226 .loc 1 215 14 view .LVU87 + 227 0094 104F ldr r7, .L19+12 + 228 0096 0234 adds r4, r4, #2 + 229 0098 57F82460 ldr r6, [r7, r4, lsl #2] + 230 .LVL30: + 216:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regval |= (pExtiConfig->GPIOSel << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + 231 .loc 1 216 7 is_stmt 1 view .LVU88 + 216:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regval |= (pExtiConfig->GPIOSel << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + 232 .loc 1 216 80 is_stmt 0 view .LVU89 + 233 009c 02F00302 and r2, r2, #3 + 234 .LVL31: + 216:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regval |= (pExtiConfig->GPIOSel << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + 235 .loc 1 216 69 view .LVU90 + 236 00a0 9200 lsls r2, r2, #2 + 216:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regval |= (pExtiConfig->GPIOSel << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + 237 .loc 1 216 40 view .LVU91 + 238 00a2 0F25 movs r5, #15 + 239 00a4 9540 lsls r5, r5, r2 + 216:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regval |= (pExtiConfig->GPIOSel << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + 240 .loc 1 216 14 view .LVU92 + ARM GAS /tmp/ccQLKAuM.s page 10 + + + 241 00a6 26EA0506 bic r6, r6, r5 + 242 .LVL32: + 217:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** SYSCFG->EXTICR[linepos >> 2u] = regval; + 243 .loc 1 217 7 is_stmt 1 view .LVU93 + 217:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** SYSCFG->EXTICR[linepos >> 2u] = regval; + 244 .loc 1 217 29 is_stmt 0 view .LVU94 + 245 00aa CD68 ldr r5, [r1, #12] + 217:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** SYSCFG->EXTICR[linepos >> 2u] = regval; + 246 .loc 1 217 39 view .LVU95 + 247 00ac 9540 lsls r5, r5, r2 + 217:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** SYSCFG->EXTICR[linepos >> 2u] = regval; + 248 .loc 1 217 14 view .LVU96 + 249 00ae 3543 orrs r5, r5, r6 + 250 .LVL33: + 218:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 251 .loc 1 218 7 is_stmt 1 view .LVU97 + 218:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 252 .loc 1 218 37 is_stmt 0 view .LVU98 + 253 00b0 47F82450 str r5, [r7, r4, lsl #2] + 254 00b4 D0E7 b .L3 + 255 .LVL34: + 256 .L8: + 233:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 257 .loc 1 233 5 is_stmt 1 view .LVU99 + 233:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 258 .loc 1 233 12 is_stmt 0 view .LVU100 + 259 00b6 24EA0004 bic r4, r4, r0 + 260 .LVL35: + 233:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 261 .loc 1 233 12 view .LVU101 + 262 00ba D8E7 b .L9 + 263 .LVL36: + 264 .L10: + 250:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 265 .loc 1 250 5 is_stmt 1 view .LVU102 + 250:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 266 .loc 1 250 12 is_stmt 0 view .LVU103 + 267 00bc 22EA0002 bic r2, r2, r0 + 268 .LVL37: + 250:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 269 .loc 1 250 12 view .LVU104 + 270 00c0 DDE7 b .L11 + 271 .LVL38: + 272 .L12: + 273 .cfi_def_cfa_offset 0 + 274 .cfi_restore 4 + 275 .cfi_restore 5 + 276 .cfi_restore 6 + 277 .cfi_restore 7 + 155:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 278 .loc 1 155 12 view .LVU105 + 279 00c2 0120 movs r0, #1 + 280 .LVL39: + 155:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 281 .loc 1 155 12 view .LVU106 + 282 00c4 7047 bx lr + 283 .LVL40: + ARM GAS /tmp/ccQLKAuM.s page 11 + + + 284 .L13: + 155:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 285 .loc 1 155 12 view .LVU107 + 286 00c6 0120 movs r0, #1 + 287 .LVL41: + 288 .loc 1 257 1 view .LVU108 + 289 00c8 7047 bx lr + 290 .L20: + 291 00ca 00BF .align 2 + 292 .L19: + 293 00cc 08040140 .word 1073808392 + 294 00d0 0C040140 .word 1073808396 + 295 00d4 04040140 .word 1073808388 + 296 00d8 00000140 .word 1073807360 + 297 .cfi_endproc + 298 .LFE130: + 300 .section .text.HAL_EXTI_GetConfigLine,"ax",%progbits + 301 .align 1 + 302 .global HAL_EXTI_GetConfigLine + 303 .syntax unified + 304 .thumb + 305 .thumb_func + 307 HAL_EXTI_GetConfigLine: + 308 .LVL42: + 309 .LFB131: + 258:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /** + 260:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @brief Get configuration of a dedicated Exti line. + 261:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @param hexti Exti handle. + 262:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @param pExtiConfig Pointer on structure to store Exti configuration. + 263:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @retval HAL Status. + 264:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** */ + 265:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig + 266:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** { + 310 .loc 1 266 1 is_stmt 1 view -0 + 311 .cfi_startproc + 312 @ args = 0, pretend = 0, frame = 0 + 313 @ frame_needed = 0, uses_anonymous_args = 0 + 267:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** __IO uint32_t *regaddr; + 314 .loc 1 267 3 view .LVU110 + 268:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** uint32_t regval; + 315 .loc 1 268 3 view .LVU111 + 269:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** uint32_t linepos; + 316 .loc 1 269 3 view .LVU112 + 270:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** uint32_t maskline; + 317 .loc 1 270 3 view .LVU113 + 271:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** uint32_t offset; + 318 .loc 1 271 3 view .LVU114 + 272:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 273:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Check null pointer */ + 274:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** if ((hexti == NULL) || (pExtiConfig == NULL)) + 319 .loc 1 274 3 view .LVU115 + 320 .loc 1 274 6 is_stmt 0 view .LVU116 + 321 0000 0028 cmp r0, #0 + 322 0002 4DD0 beq .L28 + 323 .loc 1 274 23 discriminator 1 view .LVU117 + 324 0004 0029 cmp r1, #0 + ARM GAS /tmp/ccQLKAuM.s page 12 + + + 325 0006 4DD0 beq .L29 + 266:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** __IO uint32_t *regaddr; + 326 .loc 1 266 1 view .LVU118 + 327 0008 10B5 push {r4, lr} + 328 .cfi_def_cfa_offset 8 + 329 .cfi_offset 4, -8 + 330 .cfi_offset 14, -4 + 275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** { + 276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** return HAL_ERROR; + 277:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 278:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 279:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Check the parameter */ + 280:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** assert_param(IS_EXTI_LINE(hexti->Line)); + 331 .loc 1 280 3 is_stmt 1 view .LVU119 + 281:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 282:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Store handle line number to configuration structure */ + 283:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** pExtiConfig->Line = hexti->Line; + 332 .loc 1 283 3 view .LVU120 + 333 .loc 1 283 28 is_stmt 0 view .LVU121 + 334 000a 0368 ldr r3, [r0] + 335 .loc 1 283 21 view .LVU122 + 336 000c 0B60 str r3, [r1] + 284:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 285:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* compute line register offset and line mask */ + 286:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** offset = ((pExtiConfig->Line & EXTI_REG_MASK) >> EXTI_REG_SHIFT); + 337 .loc 1 286 3 is_stmt 1 view .LVU123 + 338 .loc 1 286 10 is_stmt 0 view .LVU124 + 339 000e C3F30040 ubfx r0, r3, #16, #1 + 340 .LVL43: + 287:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** linepos = (pExtiConfig->Line & EXTI_PIN_MASK); + 341 .loc 1 287 3 is_stmt 1 view .LVU125 + 342 .loc 1 287 11 is_stmt 0 view .LVU126 + 343 0012 03F01F0E and lr, r3, #31 + 344 .LVL44: + 288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** maskline = (1uL << linepos); + 345 .loc 1 288 3 is_stmt 1 view .LVU127 + 346 .loc 1 288 12 is_stmt 0 view .LVU128 + 347 0016 0122 movs r2, #1 + 348 0018 02FA0EF2 lsl r2, r2, lr + 349 .LVL45: + 289:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 290:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* 1] Get core mode : interrupt */ + 291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regaddr = (&EXTI->IMR + (EXTI_MODE_OFFSET * offset)); + 350 .loc 1 291 3 is_stmt 1 view .LVU129 + 351 .loc 1 291 25 is_stmt 0 view .LVU130 + 352 001c 4001 lsls r0, r0, #5 + 353 .LVL46: + 354 .loc 1 291 11 view .LVU131 + 355 001e 00F1804C add ip, r0, #1073741824 + 356 0022 0CF5823C add ip, ip, #66560 + 357 .LVL47: + 292:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regval = *regaddr; + 358 .loc 1 292 3 is_stmt 1 view .LVU132 + 359 .loc 1 292 10 is_stmt 0 view .LVU133 + 360 0026 DCF80040 ldr r4, [ip] + 361 .LVL48: + 293:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + ARM GAS /tmp/ccQLKAuM.s page 13 + + + 294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Check if selected line is enable */ + 295:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** if ((regval & maskline) != 0x00u) + 362 .loc 1 295 3 is_stmt 1 view .LVU134 + 363 .loc 1 295 6 is_stmt 0 view .LVU135 + 364 002a 2242 tst r2, r4 + 365 002c 24D0 beq .L23 + 296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** { + 297:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** pExtiConfig->Mode = EXTI_MODE_INTERRUPT; + 366 .loc 1 297 5 is_stmt 1 view .LVU136 + 367 .loc 1 297 23 is_stmt 0 view .LVU137 + 368 002e 0124 movs r4, #1 + 369 .LVL49: + 370 .loc 1 297 23 view .LVU138 + 371 0030 4C60 str r4, [r1, #4] + 372 .L24: + 298:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 299:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** else + 300:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** { + 301:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** pExtiConfig->Mode = EXTI_MODE_NONE; + 302:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 303:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 304:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Get event mode */ + 305:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regaddr = (&EXTI->EMR + (EXTI_MODE_OFFSET * offset)); + 373 .loc 1 305 3 is_stmt 1 view .LVU139 + 374 .loc 1 305 11 is_stmt 0 view .LVU140 + 375 0032 1E4C ldr r4, .L37 + 376 .LVL50: + 306:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regval = *regaddr; + 377 .loc 1 306 3 is_stmt 1 view .LVU141 + 378 .loc 1 306 10 is_stmt 0 view .LVU142 + 379 0034 0459 ldr r4, [r0, r4] + 380 .LVL51: + 307:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 308:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Check if selected line is enable */ + 309:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** if ((regval & maskline) != 0x00u) + 381 .loc 1 309 3 is_stmt 1 view .LVU143 + 382 .loc 1 309 6 is_stmt 0 view .LVU144 + 383 0036 2242 tst r2, r4 + 384 0038 03D0 beq .L25 + 310:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** { + 311:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** pExtiConfig->Mode |= EXTI_MODE_EVENT; + 385 .loc 1 311 5 is_stmt 1 view .LVU145 + 386 .loc 1 311 16 is_stmt 0 view .LVU146 + 387 003a 4C68 ldr r4, [r1, #4] + 388 .LVL52: + 389 .loc 1 311 23 view .LVU147 + 390 003c 44F00204 orr r4, r4, #2 + 391 0040 4C60 str r4, [r1, #4] + 392 .L25: + 312:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 313:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 314:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Get default Trigger and GPIOSel configuration */ + 315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** pExtiConfig->Trigger = EXTI_TRIGGER_NONE; + 393 .loc 1 315 3 is_stmt 1 view .LVU148 + 394 .loc 1 315 24 is_stmt 0 view .LVU149 + 395 0042 0024 movs r4, #0 + 396 0044 8C60 str r4, [r1, #8] + ARM GAS /tmp/ccQLKAuM.s page 14 + + + 316:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** pExtiConfig->GPIOSel = 0x00u; + 397 .loc 1 316 3 is_stmt 1 view .LVU150 + 398 .loc 1 316 24 is_stmt 0 view .LVU151 + 399 0046 CC60 str r4, [r1, #12] + 317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 318:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* 2] Get trigger for configurable lines : rising */ + 319:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** if ((pExtiConfig->Line & EXTI_CONFIG) != 0x00u) + 400 .loc 1 319 3 is_stmt 1 view .LVU152 + 401 .loc 1 319 6 is_stmt 0 view .LVU153 + 402 0048 13F0007F tst r3, #33554432 + 403 004c 2CD0 beq .L30 + 320:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** { + 321:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regaddr = (&EXTI->RTSR + (EXTI_CONFIG_OFFSET * offset)); + 404 .loc 1 321 5 is_stmt 1 view .LVU154 + 405 .loc 1 321 13 is_stmt 0 view .LVU155 + 406 004e 184C ldr r4, .L37+4 + 407 .LVL53: + 322:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regval = *regaddr; + 408 .loc 1 322 5 is_stmt 1 view .LVU156 + 409 .loc 1 322 12 is_stmt 0 view .LVU157 + 410 0050 0459 ldr r4, [r0, r4] + 411 .LVL54: + 323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 324:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Check if configuration of selected line is enable */ + 325:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** if ((regval & maskline) != 0x00u) + 412 .loc 1 325 5 is_stmt 1 view .LVU158 + 413 .loc 1 325 8 is_stmt 0 view .LVU159 + 414 0052 2242 tst r2, r4 + 415 0054 01D0 beq .L26 + 326:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** { + 327:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** pExtiConfig->Trigger = EXTI_TRIGGER_RISING; + 416 .loc 1 327 7 is_stmt 1 view .LVU160 + 417 .loc 1 327 28 is_stmt 0 view .LVU161 + 418 0056 0124 movs r4, #1 + 419 .LVL55: + 420 .loc 1 327 28 view .LVU162 + 421 0058 8C60 str r4, [r1, #8] + 422 .L26: + 328:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 329:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 330:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Get falling configuration */ + 331:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regaddr = (&EXTI->FTSR + (EXTI_CONFIG_OFFSET * offset)); + 423 .loc 1 331 5 is_stmt 1 view .LVU163 + 424 .loc 1 331 13 is_stmt 0 view .LVU164 + 425 005a 164C ldr r4, .L37+8 + 426 .LVL56: + 332:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regval = *regaddr; + 427 .loc 1 332 5 is_stmt 1 view .LVU165 + 428 .loc 1 332 12 is_stmt 0 view .LVU166 + 429 005c 0059 ldr r0, [r0, r4] + 430 .LVL57: + 333:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 334:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Check if configuration of selected line is enable */ + 335:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** if ((regval & maskline) != 0x00u) + 431 .loc 1 335 5 is_stmt 1 view .LVU167 + 432 .loc 1 335 8 is_stmt 0 view .LVU168 + 433 005e 0242 tst r2, r0 + ARM GAS /tmp/ccQLKAuM.s page 15 + + + 434 0060 03D0 beq .L27 + 336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** { + 337:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** pExtiConfig->Trigger |= EXTI_TRIGGER_FALLING; + 435 .loc 1 337 7 is_stmt 1 view .LVU169 + 436 .loc 1 337 18 is_stmt 0 view .LVU170 + 437 0062 8A68 ldr r2, [r1, #8] + 438 .LVL58: + 439 .loc 1 337 28 view .LVU171 + 440 0064 42F00202 orr r2, r2, #2 + 441 0068 8A60 str r2, [r1, #8] + 442 .L27: + 338:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 339:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 340:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Get Gpio port selection for gpio lines */ + 341:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** if ((pExtiConfig->Line & EXTI_GPIO) == EXTI_GPIO) + 443 .loc 1 341 5 is_stmt 1 view .LVU172 + 444 .loc 1 341 28 is_stmt 0 view .LVU173 + 445 006a 03F0C063 and r3, r3, #100663296 + 446 .LVL59: + 447 .loc 1 341 8 view .LVU174 + 448 006e B3F1C06F cmp r3, #100663296 + 449 0072 04D0 beq .L36 + 342:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** { + 343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** assert_param(IS_EXTI_GPIO_PIN(linepos)); + 344:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 345:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regval = SYSCFG->EXTICR[linepos >> 2u]; + 346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** pExtiConfig->GPIOSel = ((regval << (SYSCFG_EXTICR1_EXTI1_Pos * (3uL - (linepos & 0x03u)))) >> + 347:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 348:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 349:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 350:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** return HAL_OK; + 450 .loc 1 350 10 view .LVU175 + 451 0074 0020 movs r0, #0 + 452 .LVL60: + 453 .loc 1 350 10 view .LVU176 + 454 0076 18E0 b .L22 + 455 .LVL61: + 456 .L23: + 301:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 457 .loc 1 301 5 is_stmt 1 view .LVU177 + 301:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 458 .loc 1 301 23 is_stmt 0 view .LVU178 + 459 0078 0024 movs r4, #0 + 460 .LVL62: + 301:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 461 .loc 1 301 23 view .LVU179 + 462 007a 4C60 str r4, [r1, #4] + 463 007c D9E7 b .L24 + 464 .LVL63: + 465 .L36: + 343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 466 .loc 1 343 7 is_stmt 1 view .LVU180 + 345:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** pExtiConfig->GPIOSel = ((regval << (SYSCFG_EXTICR1_EXTI1_Pos * (3uL - (linepos & 0x03u)))) >> + 467 .loc 1 345 7 view .LVU181 + 345:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** pExtiConfig->GPIOSel = ((regval << (SYSCFG_EXTICR1_EXTI1_Pos * (3uL - (linepos & 0x03u)))) >> + 468 .loc 1 345 39 is_stmt 0 view .LVU182 + 469 007e 4FEA9E03 lsr r3, lr, #2 + ARM GAS /tmp/ccQLKAuM.s page 16 + + + 345:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** pExtiConfig->GPIOSel = ((regval << (SYSCFG_EXTICR1_EXTI1_Pos * (3uL - (linepos & 0x03u)))) >> + 470 .loc 1 345 14 view .LVU183 + 471 0082 0233 adds r3, r3, #2 + 472 0084 0C4A ldr r2, .L37+12 + 473 0086 52F82320 ldr r2, [r2, r3, lsl #2] + 474 .LVL64: + 346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 475 .loc 1 346 7 is_stmt 1 view .LVU184 + 346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 476 .loc 1 346 75 is_stmt 0 view .LVU185 + 477 008a 6FEA0E03 mvn r3, lr + 478 008e 03F00303 and r3, r3, #3 + 346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 479 .loc 1 346 68 view .LVU186 + 480 0092 9B00 lsls r3, r3, #2 + 346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 481 .loc 1 346 39 view .LVU187 + 482 0094 02FA03F3 lsl r3, r2, r3 + 346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 483 .loc 1 346 98 view .LVU188 + 484 0098 1B0E lsrs r3, r3, #24 + 346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 485 .loc 1 346 28 view .LVU189 + 486 009a CB60 str r3, [r1, #12] + 487 .loc 1 350 10 view .LVU190 + 488 009c 0020 movs r0, #0 + 489 009e 04E0 b .L22 + 490 .LVL65: + 491 .L28: + 492 .cfi_def_cfa_offset 0 + 493 .cfi_restore 4 + 494 .cfi_restore 14 + 276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 495 .loc 1 276 12 view .LVU191 + 496 00a0 0120 movs r0, #1 + 497 .LVL66: + 276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 498 .loc 1 276 12 view .LVU192 + 499 00a2 7047 bx lr + 500 .LVL67: + 501 .L29: + 276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 502 .loc 1 276 12 view .LVU193 + 503 00a4 0120 movs r0, #1 + 504 .LVL68: + 351:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 505 .loc 1 351 1 view .LVU194 + 506 00a6 7047 bx lr + 507 .LVL69: + 508 .L30: + 509 .cfi_def_cfa_offset 8 + 510 .cfi_offset 4, -8 + 511 .cfi_offset 14, -4 + 350:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 512 .loc 1 350 10 view .LVU195 + 513 00a8 0020 movs r0, #0 + 514 .LVL70: + ARM GAS /tmp/ccQLKAuM.s page 17 + + + 515 .L22: + 516 .loc 1 351 1 view .LVU196 + 517 00aa 10BD pop {r4, pc} + 518 .L38: + 519 .align 2 + 520 .L37: + 521 00ac 04040140 .word 1073808388 + 522 00b0 08040140 .word 1073808392 + 523 00b4 0C040140 .word 1073808396 + 524 00b8 00000140 .word 1073807360 + 525 .cfi_endproc + 526 .LFE131: + 528 .section .text.HAL_EXTI_ClearConfigLine,"ax",%progbits + 529 .align 1 + 530 .global HAL_EXTI_ClearConfigLine + 531 .syntax unified + 532 .thumb + 533 .thumb_func + 535 HAL_EXTI_ClearConfigLine: + 536 .LVL71: + 537 .LFB132: + 352:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 353:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /** + 354:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @brief Clear whole configuration of a dedicated Exti line. + 355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @param hexti Exti handle. + 356:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @retval HAL Status. + 357:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** */ + 358:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** HAL_StatusTypeDef HAL_EXTI_ClearConfigLine(EXTI_HandleTypeDef *hexti) + 359:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** { + 538 .loc 1 359 1 is_stmt 1 view -0 + 539 .cfi_startproc + 540 @ args = 0, pretend = 0, frame = 0 + 541 @ frame_needed = 0, uses_anonymous_args = 0 + 360:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** __IO uint32_t *regaddr; + 542 .loc 1 360 3 view .LVU198 + 361:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** uint32_t regval; + 543 .loc 1 361 3 view .LVU199 + 362:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** uint32_t linepos; + 544 .loc 1 362 3 view .LVU200 + 363:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** uint32_t maskline; + 545 .loc 1 363 3 view .LVU201 + 364:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** uint32_t offset; + 546 .loc 1 364 3 view .LVU202 + 365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 366:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Check null pointer */ + 367:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** if (hexti == NULL) + 547 .loc 1 367 3 view .LVU203 + 548 .loc 1 367 6 is_stmt 0 view .LVU204 + 549 0000 0028 cmp r0, #0 + 550 0002 40D0 beq .L41 + 359:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** __IO uint32_t *regaddr; + 551 .loc 1 359 1 view .LVU205 + 552 0004 30B5 push {r4, r5, lr} + 553 .cfi_def_cfa_offset 12 + 554 .cfi_offset 4, -12 + 555 .cfi_offset 5, -8 + 556 .cfi_offset 14, -4 + ARM GAS /tmp/ccQLKAuM.s page 18 + + + 557 0006 8446 mov ip, r0 + 368:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** { + 369:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** return HAL_ERROR; + 370:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 371:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 372:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Check the parameter */ + 373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** assert_param(IS_EXTI_LINE(hexti->Line)); + 558 .loc 1 373 3 is_stmt 1 view .LVU206 + 374:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 375:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* compute line register offset and line mask */ + 376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** offset = ((hexti->Line & EXTI_REG_MASK) >> EXTI_REG_SHIFT); + 559 .loc 1 376 3 view .LVU207 + 560 .loc 1 376 19 is_stmt 0 view .LVU208 + 561 0008 0468 ldr r4, [r0] + 562 .loc 1 376 10 view .LVU209 + 563 000a C4F30043 ubfx r3, r4, #16, #1 + 564 .LVL72: + 377:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** linepos = (hexti->Line & EXTI_PIN_MASK); + 565 .loc 1 377 3 is_stmt 1 view .LVU210 + 566 .loc 1 377 11 is_stmt 0 view .LVU211 + 567 000e 04F01F0E and lr, r4, #31 + 568 .LVL73: + 378:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** maskline = (1uL << linepos); + 569 .loc 1 378 3 is_stmt 1 view .LVU212 + 570 .loc 1 378 12 is_stmt 0 view .LVU213 + 571 0012 0122 movs r2, #1 + 572 0014 02FA0EF2 lsl r2, r2, lr + 573 .LVL74: + 379:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 380:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* 1] Clear interrupt mode */ + 381:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regaddr = (&EXTI->IMR + (EXTI_MODE_OFFSET * offset)); + 574 .loc 1 381 3 is_stmt 1 view .LVU214 + 575 .loc 1 381 25 is_stmt 0 view .LVU215 + 576 0018 5B01 lsls r3, r3, #5 + 577 .LVL75: + 578 .loc 1 381 11 view .LVU216 + 579 001a 03F18041 add r1, r3, #1073741824 + 580 001e 01F58231 add r1, r1, #66560 + 581 .LVL76: + 382:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regval = (*regaddr & ~maskline); + 582 .loc 1 382 3 is_stmt 1 view .LVU217 + 583 .loc 1 382 13 is_stmt 0 view .LVU218 + 584 0022 0868 ldr r0, [r1] + 585 .LVL77: + 586 .loc 1 382 24 view .LVU219 + 587 0024 D543 mvns r5, r2 + 588 .loc 1 382 10 view .LVU220 + 589 0026 20EA0200 bic r0, r0, r2 + 590 .LVL78: + 383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** *regaddr = regval; + 591 .loc 1 383 3 is_stmt 1 view .LVU221 + 592 .loc 1 383 12 is_stmt 0 view .LVU222 + 593 002a 0860 str r0, [r1] + 384:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* 2] Clear event mode */ + 386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regaddr = (&EXTI->EMR + (EXTI_MODE_OFFSET * offset)); + 594 .loc 1 386 3 is_stmt 1 view .LVU223 + ARM GAS /tmp/ccQLKAuM.s page 19 + + + 595 .loc 1 386 11 is_stmt 0 view .LVU224 + 596 002c 1848 ldr r0, .L49 + 597 .LVL79: + 387:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regval = (*regaddr & ~maskline); + 598 .loc 1 387 3 is_stmt 1 view .LVU225 + 599 .loc 1 387 13 is_stmt 0 view .LVU226 + 600 002e 1958 ldr r1, [r3, r0] + 601 .LVL80: + 602 .loc 1 387 10 view .LVU227 + 603 0030 21EA0202 bic r2, r1, r2 + 604 .LVL81: + 388:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** *regaddr = regval; + 605 .loc 1 388 3 is_stmt 1 view .LVU228 + 606 .loc 1 388 12 is_stmt 0 view .LVU229 + 607 0034 1A50 str r2, [r3, r0] + 389:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 390:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* 3] Clear triggers in case of configurable lines */ + 391:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** if ((hexti->Line & EXTI_CONFIG) != 0x00u) + 608 .loc 1 391 3 is_stmt 1 view .LVU230 + 609 .loc 1 391 13 is_stmt 0 view .LVU231 + 610 0036 DCF80020 ldr r2, [ip] + 611 .LVL82: + 612 .loc 1 391 6 view .LVU232 + 613 003a 12F0007F tst r2, #33554432 + 614 003e 24D0 beq .L42 + 392:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** { + 393:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regaddr = (&EXTI->RTSR + (EXTI_CONFIG_OFFSET * offset)); + 615 .loc 1 393 5 is_stmt 1 view .LVU233 + 616 .loc 1 393 13 is_stmt 0 view .LVU234 + 617 0040 1449 ldr r1, .L49+4 + 618 .LVL83: + 394:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regval = (*regaddr & ~maskline); + 619 .loc 1 394 5 is_stmt 1 view .LVU235 + 620 .loc 1 394 15 is_stmt 0 view .LVU236 + 621 0042 5A58 ldr r2, [r3, r1] + 622 .loc 1 394 12 view .LVU237 + 623 0044 2A40 ands r2, r2, r5 + 624 .LVL84: + 395:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** *regaddr = regval; + 625 .loc 1 395 5 is_stmt 1 view .LVU238 + 626 .loc 1 395 14 is_stmt 0 view .LVU239 + 627 0046 5A50 str r2, [r3, r1] + 396:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 397:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regaddr = (&EXTI->FTSR + (EXTI_CONFIG_OFFSET * offset)); + 628 .loc 1 397 5 is_stmt 1 view .LVU240 + 629 .loc 1 397 13 is_stmt 0 view .LVU241 + 630 0048 134A ldr r2, .L49+8 + 631 .LVL85: + 398:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regval = (*regaddr & ~maskline); + 632 .loc 1 398 5 is_stmt 1 view .LVU242 + 633 .loc 1 398 15 is_stmt 0 view .LVU243 + 634 004a 9958 ldr r1, [r3, r2] + 635 .LVL86: + 636 .loc 1 398 12 view .LVU244 + 637 004c 0D40 ands r5, r5, r1 + 638 .LVL87: + 399:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** *regaddr = regval; + ARM GAS /tmp/ccQLKAuM.s page 20 + + + 639 .loc 1 399 5 is_stmt 1 view .LVU245 + 640 .loc 1 399 14 is_stmt 0 view .LVU246 + 641 004e 9D50 str r5, [r3, r2] + 400:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Get Gpio port selection for gpio lines */ + 402:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** if ((hexti->Line & EXTI_GPIO) == EXTI_GPIO) + 642 .loc 1 402 5 is_stmt 1 view .LVU247 + 643 .loc 1 402 15 is_stmt 0 view .LVU248 + 644 0050 DCF80030 ldr r3, [ip] + 645 .LVL88: + 646 .loc 1 402 22 view .LVU249 + 647 0054 03F0C063 and r3, r3, #100663296 + 648 .loc 1 402 8 view .LVU250 + 649 0058 B3F1C06F cmp r3, #100663296 + 650 005c 01D0 beq .L48 + 403:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** { + 404:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** assert_param(IS_EXTI_GPIO_PIN(linepos)); + 405:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 406:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regval = SYSCFG->EXTICR[linepos >> 2u]; + 407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + 408:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** SYSCFG->EXTICR[linepos >> 2u] = regval; + 409:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 410:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 411:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 412:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** return HAL_OK; + 651 .loc 1 412 10 view .LVU251 + 652 005e 0020 movs r0, #0 + 653 0060 14E0 b .L40 + 654 .L48: + 404:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 655 .loc 1 404 7 is_stmt 1 view .LVU252 + 406:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + 656 .loc 1 406 7 view .LVU253 + 406:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + 657 .loc 1 406 39 is_stmt 0 view .LVU254 + 658 0062 4FEA9E0E lsr lr, lr, #2 + 659 .LVL89: + 406:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + 660 .loc 1 406 14 view .LVU255 + 661 0066 0D49 ldr r1, .L49+12 + 662 0068 0EF1020E add lr, lr, #2 + 663 006c 51F82E30 ldr r3, [r1, lr, lsl #2] + 664 .LVL90: + 407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** SYSCFG->EXTICR[linepos >> 2u] = regval; + 665 .loc 1 407 7 is_stmt 1 view .LVU256 + 407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** SYSCFG->EXTICR[linepos >> 2u] = regval; + 666 .loc 1 407 80 is_stmt 0 view .LVU257 + 667 0070 04F00304 and r4, r4, #3 + 668 .LVL91: + 407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** SYSCFG->EXTICR[linepos >> 2u] = regval; + 669 .loc 1 407 69 view .LVU258 + 670 0074 A400 lsls r4, r4, #2 + 407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** SYSCFG->EXTICR[linepos >> 2u] = regval; + 671 .loc 1 407 40 view .LVU259 + 672 0076 0F22 movs r2, #15 + 673 0078 A240 lsls r2, r2, r4 + 407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** SYSCFG->EXTICR[linepos >> 2u] = regval; + ARM GAS /tmp/ccQLKAuM.s page 21 + + + 674 .loc 1 407 14 view .LVU260 + 675 007a 23EA0203 bic r3, r3, r2 + 676 .LVL92: + 408:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 677 .loc 1 408 7 is_stmt 1 view .LVU261 + 408:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 678 .loc 1 408 37 is_stmt 0 view .LVU262 + 679 007e 41F82E30 str r3, [r1, lr, lsl #2] + 680 .loc 1 412 10 view .LVU263 + 681 0082 0020 movs r0, #0 + 682 0084 02E0 b .L40 + 683 .LVL93: + 684 .L41: + 685 .cfi_def_cfa_offset 0 + 686 .cfi_restore 4 + 687 .cfi_restore 5 + 688 .cfi_restore 14 + 369:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 689 .loc 1 369 12 view .LVU264 + 690 0086 0120 movs r0, #1 + 691 .LVL94: + 413:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 692 .loc 1 413 1 view .LVU265 + 693 0088 7047 bx lr + 694 .LVL95: + 695 .L42: + 696 .cfi_def_cfa_offset 12 + 697 .cfi_offset 4, -12 + 698 .cfi_offset 5, -8 + 699 .cfi_offset 14, -4 + 412:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 700 .loc 1 412 10 view .LVU266 + 701 008a 0020 movs r0, #0 + 702 .LVL96: + 703 .L40: + 704 .loc 1 413 1 view .LVU267 + 705 008c 30BD pop {r4, r5, pc} + 706 .L50: + 707 008e 00BF .align 2 + 708 .L49: + 709 0090 04040140 .word 1073808388 + 710 0094 08040140 .word 1073808392 + 711 0098 0C040140 .word 1073808396 + 712 009c 00000140 .word 1073807360 + 713 .cfi_endproc + 714 .LFE132: + 716 .section .text.HAL_EXTI_RegisterCallback,"ax",%progbits + 717 .align 1 + 718 .global HAL_EXTI_RegisterCallback + 719 .syntax unified + 720 .thumb + 721 .thumb_func + 723 HAL_EXTI_RegisterCallback: + 724 .LVL97: + 725 .LFB133: + 414:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 415:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /** + ARM GAS /tmp/ccQLKAuM.s page 22 + + + 416:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @brief Register callback for a dedicated Exti line. + 417:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @param hexti Exti handle. + 418:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @param CallbackID User callback identifier. + 419:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * This parameter can be one of @arg @ref EXTI_CallbackIDTypeDef values. + 420:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @param pPendingCbfn function pointer to be stored as callback. + 421:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @retval HAL Status. + 422:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** */ + 423:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** HAL_StatusTypeDef HAL_EXTI_RegisterCallback(EXTI_HandleTypeDef *hexti, EXTI_CallbackIDTypeDef Callb + 424:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** { + 726 .loc 1 424 1 is_stmt 1 view -0 + 727 .cfi_startproc + 728 @ args = 0, pretend = 0, frame = 0 + 729 @ frame_needed = 0, uses_anonymous_args = 0 + 730 @ link register save eliminated. + 731 .loc 1 424 1 is_stmt 0 view .LVU269 + 732 0000 0346 mov r3, r0 + 425:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** HAL_StatusTypeDef status = HAL_OK; + 733 .loc 1 425 3 is_stmt 1 view .LVU270 + 734 .LVL98: + 426:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 427:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** switch (CallbackID) + 735 .loc 1 427 3 view .LVU271 + 736 0002 0846 mov r0, r1 + 737 .LVL99: + 738 .loc 1 427 3 is_stmt 0 view .LVU272 + 739 0004 09B9 cbnz r1, .L53 + 428:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** { + 429:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** case HAL_EXTI_COMMON_CB_ID: + 430:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** hexti->PendingCallback = pPendingCbfn; + 740 .loc 1 430 7 is_stmt 1 view .LVU273 + 741 .loc 1 430 30 is_stmt 0 view .LVU274 + 742 0006 5A60 str r2, [r3, #4] + 431:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** break; + 743 .loc 1 431 7 is_stmt 1 view .LVU275 + 744 0008 7047 bx lr + 745 .L53: + 432:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 433:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** default: + 434:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** status = HAL_ERROR; + 746 .loc 1 434 14 is_stmt 0 view .LVU276 + 747 000a 0120 movs r0, #1 + 748 .LVL100: + 435:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** break; + 436:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 437:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 438:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** return status; + 749 .loc 1 438 3 is_stmt 1 view .LVU277 + 439:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 750 .loc 1 439 1 is_stmt 0 view .LVU278 + 751 000c 7047 bx lr + 752 .cfi_endproc + 753 .LFE133: + 755 .section .text.HAL_EXTI_GetHandle,"ax",%progbits + 756 .align 1 + 757 .global HAL_EXTI_GetHandle + 758 .syntax unified + 759 .thumb + ARM GAS /tmp/ccQLKAuM.s page 23 + + + 760 .thumb_func + 762 HAL_EXTI_GetHandle: + 763 .LVL101: + 764 .LFB134: + 440:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 441:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /** + 442:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @brief Store line number as handle private field. + 443:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @param hexti Exti handle. + 444:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @param ExtiLine Exti line number. + 445:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * This parameter can be from 0 to @ref EXTI_LINE_NB. + 446:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @retval HAL Status. + 447:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** */ + 448:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** HAL_StatusTypeDef HAL_EXTI_GetHandle(EXTI_HandleTypeDef *hexti, uint32_t ExtiLine) + 449:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** { + 765 .loc 1 449 1 is_stmt 1 view -0 + 766 .cfi_startproc + 767 @ args = 0, pretend = 0, frame = 0 + 768 @ frame_needed = 0, uses_anonymous_args = 0 + 769 @ link register save eliminated. + 450:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Check the parameters */ + 451:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** assert_param(IS_EXTI_LINE(ExtiLine)); + 770 .loc 1 451 3 view .LVU280 + 452:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 453:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Check null pointer */ + 454:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** if (hexti == NULL) + 771 .loc 1 454 3 view .LVU281 + 772 .loc 1 454 6 is_stmt 0 view .LVU282 + 773 0000 10B1 cbz r0, .L56 + 455:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** { + 456:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** return HAL_ERROR; + 457:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 458:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** else + 459:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** { + 460:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Store line number as handle private field */ + 461:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** hexti->Line = ExtiLine; + 774 .loc 1 461 5 is_stmt 1 view .LVU283 + 775 .loc 1 461 17 is_stmt 0 view .LVU284 + 776 0002 0160 str r1, [r0] + 462:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 463:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** return HAL_OK; + 777 .loc 1 463 5 is_stmt 1 view .LVU285 + 778 .loc 1 463 12 is_stmt 0 view .LVU286 + 779 0004 0020 movs r0, #0 + 780 .LVL102: + 781 .loc 1 463 12 view .LVU287 + 782 0006 7047 bx lr + 783 .LVL103: + 784 .L56: + 456:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 785 .loc 1 456 12 view .LVU288 + 786 0008 0120 movs r0, #1 + 787 .LVL104: + 464:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 465:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 788 .loc 1 465 1 view .LVU289 + 789 000a 7047 bx lr + 790 .cfi_endproc + ARM GAS /tmp/ccQLKAuM.s page 24 + + + 791 .LFE134: + 793 .section .text.HAL_EXTI_IRQHandler,"ax",%progbits + 794 .align 1 + 795 .global HAL_EXTI_IRQHandler + 796 .syntax unified + 797 .thumb + 798 .thumb_func + 800 HAL_EXTI_IRQHandler: + 801 .LVL105: + 802 .LFB135: + 466:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 467:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /** + 468:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @} + 469:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** */ + 470:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 471:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /** @addtogroup EXTI_Exported_Functions_Group2 + 472:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @brief EXTI IO functions. + 473:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * + 474:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** @verbatim + 475:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** =============================================================================== + 476:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** ##### IO operation functions ##### + 477:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** =============================================================================== + 478:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 479:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** @endverbatim + 480:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @{ + 481:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** */ + 482:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 483:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /** + 484:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @brief Handle EXTI interrupt request. + 485:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @param hexti Exti handle. + 486:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @retval none. + 487:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** */ + 488:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** void HAL_EXTI_IRQHandler(EXTI_HandleTypeDef *hexti) + 489:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** { + 803 .loc 1 489 1 is_stmt 1 view -0 + 804 .cfi_startproc + 805 @ args = 0, pretend = 0, frame = 0 + 806 @ frame_needed = 0, uses_anonymous_args = 0 + 807 .loc 1 489 1 is_stmt 0 view .LVU291 + 808 0000 08B5 push {r3, lr} + 809 .cfi_def_cfa_offset 8 + 810 .cfi_offset 3, -8 + 811 .cfi_offset 14, -4 + 490:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** __IO uint32_t *regaddr; + 812 .loc 1 490 3 is_stmt 1 view .LVU292 + 491:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** uint32_t regval; + 813 .loc 1 491 3 view .LVU293 + 492:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** uint32_t maskline; + 814 .loc 1 492 3 view .LVU294 + 493:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** uint32_t offset; + 815 .loc 1 493 3 view .LVU295 + 494:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 495:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Compute line register offset and line mask */ + 496:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** offset = ((hexti->Line & EXTI_REG_MASK) >> EXTI_REG_SHIFT); + 816 .loc 1 496 3 view .LVU296 + 817 .loc 1 496 19 is_stmt 0 view .LVU297 + 818 0002 0368 ldr r3, [r0] + ARM GAS /tmp/ccQLKAuM.s page 25 + + + 819 .loc 1 496 10 view .LVU298 + 820 0004 C3F30041 ubfx r1, r3, #16, #1 + 821 .LVL106: + 497:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); + 822 .loc 1 497 3 is_stmt 1 view .LVU299 + 823 .loc 1 497 35 is_stmt 0 view .LVU300 + 824 0008 03F01F03 and r3, r3, #31 + 825 .loc 1 497 12 view .LVU301 + 826 000c 0122 movs r2, #1 + 827 000e 02FA03F3 lsl r3, r2, r3 + 828 .LVL107: + 498:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 499:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Get pending bit */ + 500:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regaddr = (&EXTI->PR + (EXTI_CONFIG_OFFSET * offset)); + 829 .loc 1 500 3 is_stmt 1 view .LVU302 + 830 .loc 1 500 24 is_stmt 0 view .LVU303 + 831 0012 4A01 lsls r2, r1, #5 + 832 .loc 1 500 11 view .LVU304 + 833 0014 0449 ldr r1, .L60 + 834 .LVL108: + 501:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regval = (*regaddr & maskline); + 835 .loc 1 501 3 is_stmt 1 view .LVU305 + 836 .loc 1 501 13 is_stmt 0 view .LVU306 + 837 0016 5258 ldr r2, [r2, r1] + 838 .LVL109: + 502:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 503:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** if (regval != 0x00u) + 839 .loc 1 503 3 is_stmt 1 view .LVU307 + 840 .loc 1 503 6 is_stmt 0 view .LVU308 + 841 0018 1A42 tst r2, r3 + 842 001a 04D0 beq .L57 + 504:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** { + 505:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Clear pending bit */ + 506:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** EXTI->PR = maskline; + 843 .loc 1 506 5 is_stmt 1 view .LVU309 + 844 .loc 1 506 14 is_stmt 0 view .LVU310 + 845 001c 034A ldr r2, .L60+4 + 846 .LVL110: + 847 .loc 1 506 14 view .LVU311 + 848 001e 5361 str r3, [r2, #20] + 849 .LVL111: + 507:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 508:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Call callback */ + 509:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** if (hexti->PendingCallback != NULL) + 850 .loc 1 509 5 is_stmt 1 view .LVU312 + 851 .loc 1 509 14 is_stmt 0 view .LVU313 + 852 0020 4368 ldr r3, [r0, #4] + 853 .LVL112: + 854 .loc 1 509 8 view .LVU314 + 855 0022 03B1 cbz r3, .L57 + 510:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** { + 511:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** hexti->PendingCallback(); + 856 .loc 1 511 7 is_stmt 1 view .LVU315 + 857 0024 9847 blx r3 + 858 .LVL113: + 859 .L57: + 512:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + ARM GAS /tmp/ccQLKAuM.s page 26 + + + 513:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 514:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 860 .loc 1 514 1 is_stmt 0 view .LVU316 + 861 0026 08BD pop {r3, pc} + 862 .L61: + 863 .align 2 + 864 .L60: + 865 0028 14040140 .word 1073808404 + 866 002c 00040140 .word 1073808384 + 867 .cfi_endproc + 868 .LFE135: + 870 .section .text.HAL_EXTI_GetPending,"ax",%progbits + 871 .align 1 + 872 .global HAL_EXTI_GetPending + 873 .syntax unified + 874 .thumb + 875 .thumb_func + 877 HAL_EXTI_GetPending: + 878 .LVL114: + 879 .LFB136: + 515:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 516:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /** + 517:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @brief Get interrupt pending bit of a dedicated line. + 518:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @param hexti Exti handle. + 519:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @param Edge Specify which pending edge as to be checked. + 520:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * This parameter can be one of the following values: + 521:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @arg @ref EXTI_TRIGGER_RISING_FALLING + 522:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * This parameter is kept for compatibility with other series. + 523:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @retval 1 if interrupt is pending else 0. + 524:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** */ + 525:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** uint32_t HAL_EXTI_GetPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) + 526:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** { + 880 .loc 1 526 1 is_stmt 1 view -0 + 881 .cfi_startproc + 882 @ args = 0, pretend = 0, frame = 0 + 883 @ frame_needed = 0, uses_anonymous_args = 0 + 884 @ link register save eliminated. + 527:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** __IO uint32_t *regaddr; + 885 .loc 1 527 3 view .LVU318 + 528:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** uint32_t regval; + 886 .loc 1 528 3 view .LVU319 + 529:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** uint32_t linepos; + 887 .loc 1 529 3 view .LVU320 + 530:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** uint32_t maskline; + 888 .loc 1 530 3 view .LVU321 + 531:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** uint32_t offset; + 889 .loc 1 531 3 view .LVU322 + 532:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 533:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Check parameters */ + 534:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** assert_param(IS_EXTI_LINE(hexti->Line)); + 890 .loc 1 534 3 view .LVU323 + 535:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); + 891 .loc 1 535 3 view .LVU324 + 536:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** assert_param(IS_EXTI_PENDING_EDGE(Edge)); + 892 .loc 1 536 3 view .LVU325 + 537:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 538:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* compute line register offset and line mask */ + ARM GAS /tmp/ccQLKAuM.s page 27 + + + 539:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** offset = ((hexti->Line & EXTI_REG_MASK) >> EXTI_REG_SHIFT); + 893 .loc 1 539 3 view .LVU326 + 894 .loc 1 539 19 is_stmt 0 view .LVU327 + 895 0000 0368 ldr r3, [r0] + 896 .loc 1 539 10 view .LVU328 + 897 0002 C3F30041 ubfx r1, r3, #16, #1 + 898 .LVL115: + 540:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** linepos = (hexti->Line & EXTI_PIN_MASK); + 899 .loc 1 540 3 is_stmt 1 view .LVU329 + 900 .loc 1 540 11 is_stmt 0 view .LVU330 + 901 0006 03F01F03 and r3, r3, #31 + 902 .LVL116: + 541:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** maskline = (1uL << linepos); + 903 .loc 1 541 3 is_stmt 1 view .LVU331 + 904 .loc 1 541 12 is_stmt 0 view .LVU332 + 905 000a 0122 movs r2, #1 + 906 000c 9A40 lsls r2, r2, r3 + 907 .LVL117: + 542:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 543:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Get pending bit */ + 544:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regaddr = (&EXTI->PR + (EXTI_CONFIG_OFFSET * offset)); + 908 .loc 1 544 3 is_stmt 1 view .LVU333 + 909 .loc 1 544 24 is_stmt 0 view .LVU334 + 910 000e 4901 lsls r1, r1, #5 + 911 .LVL118: + 912 .loc 1 544 11 view .LVU335 + 913 0010 0248 ldr r0, .L63 + 914 .LVL119: + 545:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* return 1 if bit is set else 0 */ + 546:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regval = ((*regaddr & maskline) >> linepos); + 915 .loc 1 546 3 is_stmt 1 view .LVU336 + 916 .loc 1 546 14 is_stmt 0 view .LVU337 + 917 0012 0858 ldr r0, [r1, r0] + 918 .LVL120: + 919 .loc 1 546 23 view .LVU338 + 920 0014 1040 ands r0, r0, r2 + 921 .LVL121: + 547:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** return regval; + 922 .loc 1 547 3 is_stmt 1 view .LVU339 + 548:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 923 .loc 1 548 1 is_stmt 0 view .LVU340 + 924 0016 D840 lsrs r0, r0, r3 + 925 .LVL122: + 926 .loc 1 548 1 view .LVU341 + 927 0018 7047 bx lr + 928 .L64: + 929 001a 00BF .align 2 + 930 .L63: + 931 001c 14040140 .word 1073808404 + 932 .cfi_endproc + 933 .LFE136: + 935 .section .text.HAL_EXTI_ClearPending,"ax",%progbits + 936 .align 1 + 937 .global HAL_EXTI_ClearPending + 938 .syntax unified + 939 .thumb + 940 .thumb_func + ARM GAS /tmp/ccQLKAuM.s page 28 + + + 942 HAL_EXTI_ClearPending: + 943 .LVL123: + 944 .LFB137: + 549:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 550:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /** + 551:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @brief Clear interrupt pending bit of a dedicated line. + 552:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @param hexti Exti handle. + 553:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @param Edge Specify which pending edge as to be clear. + 554:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * This parameter can be one of the following values: + 555:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @arg @ref EXTI_TRIGGER_RISING_FALLING + 556:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * This parameter is kept for compatibility with other series. + 557:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @retval None. + 558:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** */ + 559:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** void HAL_EXTI_ClearPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) + 560:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** { + 945 .loc 1 560 1 is_stmt 1 view -0 + 946 .cfi_startproc + 947 @ args = 0, pretend = 0, frame = 0 + 948 @ frame_needed = 0, uses_anonymous_args = 0 + 949 @ link register save eliminated. + 561:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** __IO uint32_t *regaddr; + 950 .loc 1 561 3 view .LVU343 + 562:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** uint32_t maskline; + 951 .loc 1 562 3 view .LVU344 + 563:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** uint32_t offset; + 952 .loc 1 563 3 view .LVU345 + 564:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 565:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Check parameters */ + 566:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** assert_param(IS_EXTI_LINE(hexti->Line)); + 953 .loc 1 566 3 view .LVU346 + 567:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); + 954 .loc 1 567 3 view .LVU347 + 568:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** assert_param(IS_EXTI_PENDING_EDGE(Edge)); + 955 .loc 1 568 3 view .LVU348 + 569:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 570:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* compute line register offset and line mask */ + 571:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** offset = ((hexti->Line & EXTI_REG_MASK) >> EXTI_REG_SHIFT); + 956 .loc 1 571 3 view .LVU349 + 957 .loc 1 571 19 is_stmt 0 view .LVU350 + 958 0000 0368 ldr r3, [r0] + 959 .loc 1 571 10 view .LVU351 + 960 0002 C3F30042 ubfx r2, r3, #16, #1 + 961 .LVL124: + 572:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); + 962 .loc 1 572 3 is_stmt 1 view .LVU352 + 963 .loc 1 572 35 is_stmt 0 view .LVU353 + 964 0006 03F01F03 and r3, r3, #31 + 965 .loc 1 572 12 view .LVU354 + 966 000a 0121 movs r1, #1 + 967 .LVL125: + 968 .loc 1 572 12 view .LVU355 + 969 000c 9940 lsls r1, r1, r3 + 970 .LVL126: + 573:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 574:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Get pending bit */ + 575:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regaddr = (&EXTI->PR + (EXTI_CONFIG_OFFSET * offset)); + 971 .loc 1 575 3 is_stmt 1 view .LVU356 + ARM GAS /tmp/ccQLKAuM.s page 29 + + + 972 .loc 1 575 24 is_stmt 0 view .LVU357 + 973 000e 5301 lsls r3, r2, #5 + 974 .loc 1 575 11 view .LVU358 + 975 0010 014A ldr r2, .L66 + 976 .LVL127: + 576:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 577:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Clear Pending bit */ + 578:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** *regaddr = maskline; + 977 .loc 1 578 3 is_stmt 1 view .LVU359 + 978 .loc 1 578 12 is_stmt 0 view .LVU360 + 979 0012 9950 str r1, [r3, r2] + 980 .LVL128: + 579:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 981 .loc 1 579 1 view .LVU361 + 982 0014 7047 bx lr + 983 .L67: + 984 0016 00BF .align 2 + 985 .L66: + 986 0018 14040140 .word 1073808404 + 987 .cfi_endproc + 988 .LFE137: + 990 .section .text.HAL_EXTI_GenerateSWI,"ax",%progbits + 991 .align 1 + 992 .global HAL_EXTI_GenerateSWI + 993 .syntax unified + 994 .thumb + 995 .thumb_func + 997 HAL_EXTI_GenerateSWI: + 998 .LVL129: + 999 .LFB138: + 580:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 581:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /** + 582:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @brief Generate a software interrupt for a dedicated line. + 583:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @param hexti Exti handle. + 584:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** * @retval None. + 585:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** */ + 586:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** void HAL_EXTI_GenerateSWI(EXTI_HandleTypeDef *hexti) + 587:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** { + 1000 .loc 1 587 1 is_stmt 1 view -0 + 1001 .cfi_startproc + 1002 @ args = 0, pretend = 0, frame = 0 + 1003 @ frame_needed = 0, uses_anonymous_args = 0 + 1004 @ link register save eliminated. + 588:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** __IO uint32_t *regaddr; + 1005 .loc 1 588 3 view .LVU363 + 589:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** uint32_t maskline; + 1006 .loc 1 589 3 view .LVU364 + 590:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** uint32_t offset; + 1007 .loc 1 590 3 view .LVU365 + 591:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 592:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* Check parameters */ + 593:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** assert_param(IS_EXTI_LINE(hexti->Line)); + 1008 .loc 1 593 3 view .LVU366 + 594:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); + 1009 .loc 1 594 3 view .LVU367 + 595:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 596:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** /* compute line register offset and line mask */ + ARM GAS /tmp/ccQLKAuM.s page 30 + + + 597:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** offset = ((hexti->Line & EXTI_REG_MASK) >> EXTI_REG_SHIFT); + 1010 .loc 1 597 3 view .LVU368 + 1011 .loc 1 597 19 is_stmt 0 view .LVU369 + 1012 0000 0368 ldr r3, [r0] + 1013 .loc 1 597 10 view .LVU370 + 1014 0002 C3F30042 ubfx r2, r3, #16, #1 + 1015 .LVL130: + 598:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); + 1016 .loc 1 598 3 is_stmt 1 view .LVU371 + 1017 .loc 1 598 35 is_stmt 0 view .LVU372 + 1018 0006 03F01F03 and r3, r3, #31 + 1019 .loc 1 598 12 view .LVU373 + 1020 000a 0121 movs r1, #1 + 1021 000c 9940 lsls r1, r1, r3 + 1022 .LVL131: + 599:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** + 600:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** regaddr = (&EXTI->SWIER + (EXTI_CONFIG_OFFSET * offset)); + 1023 .loc 1 600 3 is_stmt 1 view .LVU374 + 1024 .loc 1 600 27 is_stmt 0 view .LVU375 + 1025 000e 5301 lsls r3, r2, #5 + 1026 .loc 1 600 11 view .LVU376 + 1027 0010 014A ldr r2, .L69 + 1028 .LVL132: + 601:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** *regaddr = maskline; + 1029 .loc 1 601 3 is_stmt 1 view .LVU377 + 1030 .loc 1 601 12 is_stmt 0 view .LVU378 + 1031 0012 9950 str r1, [r3, r2] + 1032 .LVL133: + 602:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_exti.c **** } + 1033 .loc 1 602 1 view .LVU379 + 1034 0014 7047 bx lr + 1035 .L70: + 1036 0016 00BF .align 2 + 1037 .L69: + 1038 0018 10040140 .word 1073808400 + 1039 .cfi_endproc + 1040 .LFE138: + 1042 .text + 1043 .Letext0: + 1044 .file 2 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 1045 .file 3 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 1046 .file 4 "Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h" + 1047 .file 5 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h" + 1048 .file 6 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h" + ARM GAS /tmp/ccQLKAuM.s page 31 + + +DEFINED SYMBOLS + *ABS*:0000000000000000 stm32f3xx_hal_exti.c + /tmp/ccQLKAuM.s:21 .text.HAL_EXTI_SetConfigLine:0000000000000000 $t + /tmp/ccQLKAuM.s:27 .text.HAL_EXTI_SetConfigLine:0000000000000000 HAL_EXTI_SetConfigLine + /tmp/ccQLKAuM.s:293 .text.HAL_EXTI_SetConfigLine:00000000000000cc $d + /tmp/ccQLKAuM.s:301 .text.HAL_EXTI_GetConfigLine:0000000000000000 $t + /tmp/ccQLKAuM.s:307 .text.HAL_EXTI_GetConfigLine:0000000000000000 HAL_EXTI_GetConfigLine + /tmp/ccQLKAuM.s:521 .text.HAL_EXTI_GetConfigLine:00000000000000ac $d + /tmp/ccQLKAuM.s:529 .text.HAL_EXTI_ClearConfigLine:0000000000000000 $t + /tmp/ccQLKAuM.s:535 .text.HAL_EXTI_ClearConfigLine:0000000000000000 HAL_EXTI_ClearConfigLine + /tmp/ccQLKAuM.s:709 .text.HAL_EXTI_ClearConfigLine:0000000000000090 $d + /tmp/ccQLKAuM.s:717 .text.HAL_EXTI_RegisterCallback:0000000000000000 $t + /tmp/ccQLKAuM.s:723 .text.HAL_EXTI_RegisterCallback:0000000000000000 HAL_EXTI_RegisterCallback + /tmp/ccQLKAuM.s:756 .text.HAL_EXTI_GetHandle:0000000000000000 $t + /tmp/ccQLKAuM.s:762 .text.HAL_EXTI_GetHandle:0000000000000000 HAL_EXTI_GetHandle + /tmp/ccQLKAuM.s:794 .text.HAL_EXTI_IRQHandler:0000000000000000 $t + /tmp/ccQLKAuM.s:800 .text.HAL_EXTI_IRQHandler:0000000000000000 HAL_EXTI_IRQHandler + /tmp/ccQLKAuM.s:865 .text.HAL_EXTI_IRQHandler:0000000000000028 $d + /tmp/ccQLKAuM.s:871 .text.HAL_EXTI_GetPending:0000000000000000 $t + /tmp/ccQLKAuM.s:877 .text.HAL_EXTI_GetPending:0000000000000000 HAL_EXTI_GetPending + /tmp/ccQLKAuM.s:931 .text.HAL_EXTI_GetPending:000000000000001c $d + /tmp/ccQLKAuM.s:936 .text.HAL_EXTI_ClearPending:0000000000000000 $t + /tmp/ccQLKAuM.s:942 .text.HAL_EXTI_ClearPending:0000000000000000 HAL_EXTI_ClearPending + /tmp/ccQLKAuM.s:986 .text.HAL_EXTI_ClearPending:0000000000000018 $d + /tmp/ccQLKAuM.s:991 .text.HAL_EXTI_GenerateSWI:0000000000000000 $t + /tmp/ccQLKAuM.s:997 .text.HAL_EXTI_GenerateSWI:0000000000000000 HAL_EXTI_GenerateSWI + /tmp/ccQLKAuM.s:1038 .text.HAL_EXTI_GenerateSWI:0000000000000018 $d + +NO UNDEFINED SYMBOLS diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_exti.o b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_exti.o new file mode 100644 index 0000000000000000000000000000000000000000..4056fce7770dd368819f9870f5569528f317c874 GIT binary patch literal 13340 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 literal 0 HcmV?d00001 diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_flash.d b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_flash.d new file mode 100644 index 0000000..073172a --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_flash.d @@ -0,0 +1,58 @@ +build/stm32f3xx_hal_flash.o: \ + Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h \ + Core/Inc/stm32f3xx_hal_conf.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h \ + Drivers/CMSIS/Include/core_cm4.h Drivers/CMSIS/Include/cmsis_version.h \ + Drivers/CMSIS/Include/cmsis_compiler.h Drivers/CMSIS/Include/cmsis_gcc.h \ + Drivers/CMSIS/Include/mpu_armv7.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h: +Core/Inc/stm32f3xx_hal_conf.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h: +Drivers/CMSIS/Include/core_cm4.h: +Drivers/CMSIS/Include/cmsis_version.h: +Drivers/CMSIS/Include/cmsis_compiler.h: +Drivers/CMSIS/Include/cmsis_gcc.h: +Drivers/CMSIS/Include/mpu_armv7.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h: +Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h: diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_flash.lst b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_flash.lst new file mode 100644 index 0000000..3a7d915 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_flash.lst @@ -0,0 +1,2165 @@ +ARM GAS /tmp/ccX3tCBb.s page 1 + + + 1 .cpu cortex-m4 + 2 .arch armv7e-m + 3 .fpu fpv4-sp-d16 + 4 .eabi_attribute 27, 1 + 5 .eabi_attribute 28, 1 + 6 .eabi_attribute 20, 1 + 7 .eabi_attribute 21, 1 + 8 .eabi_attribute 23, 3 + 9 .eabi_attribute 24, 1 + 10 .eabi_attribute 25, 1 + 11 .eabi_attribute 26, 1 + 12 .eabi_attribute 30, 1 + 13 .eabi_attribute 34, 1 + 14 .eabi_attribute 18, 4 + 15 .file "stm32f3xx_hal_flash.c" + 16 .text + 17 .Ltext0: + 18 .cfi_sections .debug_frame + 19 .file 1 "Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c" + 20 .section .text.FLASH_Program_HalfWord,"ax",%progbits + 21 .align 1 + 22 .syntax unified + 23 .thumb + 24 .thumb_func + 26 FLASH_Program_HalfWord: + 27 .LVL0: + 28 .LFB141: + 1:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /** + 2:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** ****************************************************************************** + 3:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @file stm32f3xx_hal_flash.c + 4:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @author MCD Application Team + 5:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @brief FLASH HAL module driver. + 6:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * This file provides firmware functions to manage the following + 7:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * functionalities of the internal FLASH memory: + 8:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * + Program operations functions + 9:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * + Memory Control functions + 10:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * + Peripheral State functions + 11:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * + 12:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** @verbatim + 13:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** ============================================================================== + 14:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** ##### FLASH peripheral features ##### + 15:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** ============================================================================== + 16:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** [..] The Flash memory interface manages CPU AHB I-Code and D-Code accesses + 17:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** to the Flash memory. It implements the erase and program Flash memory operations + 18:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** and the read and write protection mechanisms. + 19:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 20:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** [..] The Flash memory interface accelerates code execution with a system of instruction + 21:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** prefetch. + 22:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 23:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** [..] The FLASH main features are: + 24:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** (+) Flash memory read operations + 25:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** (+) Flash memory program/erase operations + 26:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** (+) Read / write protections + 27:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** (+) Prefetch on I-Code + 28:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** (+) Option Bytes programming + 29:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 30:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + ARM GAS /tmp/ccX3tCBb.s page 2 + + + 31:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** ##### How to use this driver ##### + 32:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** ============================================================================== + 33:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** [..] + 34:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** This driver provides functions and macros to configure and program the FLASH + 35:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** memory of all STM32F3xx devices. + 36:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 37:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** (#) FLASH Memory I/O Programming functions: this group includes all needed + 38:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** functions to erase and program the main memory: + 39:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** (++) Lock and Unlock the FLASH interface + 40:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** (++) Erase function: Erase page, erase all pages + 41:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** (++) Program functions: half word, word and doubleword + 42:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** (#) FLASH Option Bytes Programming functions: this group includes all needed + 43:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** functions to manage the Option Bytes: + 44:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** (++) Lock and Unlock the Option Bytes + 45:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** (++) Set/Reset the write protection + 46:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** (++) Set the Read protection Level + 47:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** (++) Program the user Option Bytes + 48:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** (++) Launch the Option Bytes loader + 49:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** (++) Erase Option Bytes + 50:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** (++) Program the data Option Bytes + 51:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** (++) Get the Write protection. + 52:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** (++) Get the user option bytes. + 53:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 54:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** (#) Interrupts and flags management functions : this group + 55:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** includes all needed functions to: + 56:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** (++) Handle FLASH interrupts + 57:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** (++) Wait for last FLASH operation according to its status + 58:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** (++) Get error flag status + 59:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 60:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** [..] In addition to these function, this driver includes a set of macros allowing + 61:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** to handle the following operations: + 62:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 63:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** (+) Set/Get the latency + 64:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** (+) Enable/Disable the prefetch buffer + 65:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** (+) Enable/Disable the half cycle access + 66:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** (+) Enable/Disable the FLASH interrupts + 67:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** (+) Monitor the FLASH flags status + 68:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 69:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** @endverbatim + 70:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** ****************************************************************************** + 71:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @attention + 72:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * + 73:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** *

    © Copyright (c) 2016 STMicroelectronics. + 74:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * All rights reserved.

    + 75:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * + 76:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * This software component is licensed by ST under BSD 3-Clause license, + 77:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * the "License"; You may not use this file except in compliance with the + 78:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * License. You may obtain a copy of the License at: + 79:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * opensource.org/licenses/BSD-3-Clause + 80:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * + 81:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** ****************************************************************************** + 82:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** */ + 83:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 84:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Includes ------------------------------------------------------------------*/ + 85:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** #include "stm32f3xx_hal.h" + 86:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 87:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /** @addtogroup STM32F3xx_HAL_Driver + ARM GAS /tmp/ccX3tCBb.s page 3 + + + 88:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @{ + 89:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** */ + 90:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 91:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** #ifdef HAL_FLASH_MODULE_ENABLED + 92:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 93:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /** @defgroup FLASH FLASH + 94:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @brief FLASH HAL module driver + 95:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @{ + 96:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** */ + 97:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 98:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Private typedef -----------------------------------------------------------*/ + 99:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Private define ------------------------------------------------------------*/ + 100:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /** @defgroup FLASH_Private_Constants FLASH Private Constants + 101:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @{ + 102:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** */ + 103:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /** + 104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @} + 105:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** */ + 106:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 107:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Private macro ---------------------------- ---------------------------------*/ + 108:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /** @defgroup FLASH_Private_Macros FLASH Private Macros + 109:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @{ + 110:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** */ + 111:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 112:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /** + 113:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @} + 114:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** */ + 115:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 116:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Private variables ---------------------------------------------------------*/ + 117:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /** @defgroup FLASH_Private_Variables FLASH Private Variables + 118:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @{ + 119:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** */ + 120:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Variables used for Erase pages under interruption*/ + 121:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** FLASH_ProcessTypeDef pFlash; + 122:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /** + 123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @} + 124:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** */ + 125:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 126:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Private function prototypes -----------------------------------------------*/ + 127:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /** @defgroup FLASH_Private_Functions FLASH Private Functions + 128:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @{ + 129:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** */ + 130:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** static void FLASH_Program_HalfWord(uint32_t Address, uint16_t Data); + 131:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** static void FLASH_SetErrorCode(void); + 132:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** extern void FLASH_PageErase(uint32_t PageAddress); + 133:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /** + 134:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @} + 135:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** */ + 136:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 137:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Exported functions ---------------------------------------------------------*/ + 138:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /** @defgroup FLASH_Exported_Functions FLASH Exported Functions + 139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @{ + 140:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** */ + 141:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 142:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /** @defgroup FLASH_Exported_Functions_Group1 Programming operation functions + 143:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @brief Programming operation functions + 144:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * + ARM GAS /tmp/ccX3tCBb.s page 4 + + + 145:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** @verbatim + 146:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** @endverbatim + 147:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @{ + 148:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** */ + 149:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 150:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /** + 151:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @brief Program halfword, word or double word at a specified address + 152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @note The function HAL_FLASH_Unlock() should be called before to unlock the FLASH interface + 153:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * The function HAL_FLASH_Lock() should be called after to lock the FLASH interface + 154:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * + 155:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @note If an erase and a program operations are requested simultaneously, + 156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * the erase operation is performed before the program one. + 157:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * + 158:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @note FLASH should be previously erased before new programming (only exception to this + 159:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * is when 0x0000 is programmed) + 160:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * + 161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @param TypeProgram Indicate the way to program at a specified address. + 162:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * This parameter can be a value of @ref FLASH_Type_Program + 163:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @param Address Specifie the address to be programmed. + 164:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @param Data Specifie the data to be programmed + 165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * + 166:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @retval HAL_StatusTypeDef HAL Status + 167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** */ + 168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data) + 169:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** HAL_StatusTypeDef status = HAL_ERROR; + 171:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** uint8_t index = 0U; + 172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** uint8_t nbiterations = 0U; + 173:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 174:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Process Locked */ + 175:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** __HAL_LOCK(&pFlash); + 176:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 177:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Check the parameters */ + 178:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** assert_param(IS_FLASH_TYPEPROGRAM(TypeProgram)); + 179:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** assert_param(IS_FLASH_PROGRAM_ADDRESS(Address)); + 180:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 181:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Wait for last operation to be completed */ + 182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE); + 183:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 184:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** if(status == HAL_OK) + 185:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** if(TypeProgram == FLASH_TYPEPROGRAM_HALFWORD) + 187:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 188:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Program halfword (16-bit) at a specified address. */ + 189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** nbiterations = 1U; + 190:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 191:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** else if(TypeProgram == FLASH_TYPEPROGRAM_WORD) + 192:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 193:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Program word (32-bit = 2*16-bit) at a specified address. */ + 194:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** nbiterations = 2U; + 195:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 196:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** else + 197:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 198:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Program double word (64-bit = 4*16-bit) at a specified address. */ + 199:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** nbiterations = 4U; + 200:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 201:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + ARM GAS /tmp/ccX3tCBb.s page 5 + + + 202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** for (index = 0U; index < nbiterations; index++) + 203:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 204:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** FLASH_Program_HalfWord((Address + (2U*index)), (uint16_t)(Data >> (16U*index))); + 205:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 206:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Wait for last operation to be completed */ + 207:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** status = FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE); + 208:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 209:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* If the program operation is completed, disable the PG Bit */ + 210:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** CLEAR_BIT(FLASH->CR, FLASH_CR_PG); + 211:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* In case of error, stop programming procedure */ + 212:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** if (status != HAL_OK) + 213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 214:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** break; + 215:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 216:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 217:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 218:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 219:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Process Unlocked */ + 220:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** __HAL_UNLOCK(&pFlash); + 221:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 222:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** return status; + 223:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 224:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 225:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /** + 226:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @brief Program halfword, word or double word at a specified address with interrupt enabled. + 227:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @note The function HAL_FLASH_Unlock() should be called before to unlock the FLASH interface + 228:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * The function HAL_FLASH_Lock() should be called after to lock the FLASH interface + 229:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * + 230:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @note If an erase and a program operations are requested simultaneously, + 231:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * the erase operation is performed before the program one. + 232:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * + 233:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @param TypeProgram Indicate the way to program at a specified address. + 234:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * This parameter can be a value of @ref FLASH_Type_Program + 235:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @param Address Specifie the address to be programmed. + 236:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @param Data Specifie the data to be programmed + 237:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * + 238:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @retval HAL_StatusTypeDef HAL Status + 239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** */ + 240:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** HAL_StatusTypeDef HAL_FLASH_Program_IT(uint32_t TypeProgram, uint32_t Address, uint64_t Data) + 241:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 242:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** HAL_StatusTypeDef status = HAL_OK; + 243:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 244:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Process Locked */ + 245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** __HAL_LOCK(&pFlash); + 246:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 247:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Check the parameters */ + 248:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** assert_param(IS_FLASH_TYPEPROGRAM(TypeProgram)); + 249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** assert_param(IS_FLASH_PROGRAM_ADDRESS(Address)); + 250:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 251:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Enable End of FLASH Operation and Error source interrupts */ + 252:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP | FLASH_IT_ERR); + 253:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 254:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** pFlash.Address = Address; + 255:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** pFlash.Data = Data; + 256:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 257:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** if(TypeProgram == FLASH_TYPEPROGRAM_HALFWORD) + 258:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + ARM GAS /tmp/ccX3tCBb.s page 6 + + + 259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** pFlash.ProcedureOnGoing = FLASH_PROC_PROGRAMHALFWORD; + 260:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Program halfword (16-bit) at a specified address. */ + 261:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** pFlash.DataRemaining = 1U; + 262:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 263:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** else if(TypeProgram == FLASH_TYPEPROGRAM_WORD) + 264:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 265:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** pFlash.ProcedureOnGoing = FLASH_PROC_PROGRAMWORD; + 266:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Program word (32-bit : 2*16-bit) at a specified address. */ + 267:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** pFlash.DataRemaining = 2U; + 268:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 269:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** else + 270:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 271:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** pFlash.ProcedureOnGoing = FLASH_PROC_PROGRAMDOUBLEWORD; + 272:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Program double word (64-bit : 4*16-bit) at a specified address. */ + 273:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** pFlash.DataRemaining = 4U; + 274:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Program halfword (16-bit) at a specified address. */ + 277:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** FLASH_Program_HalfWord(Address, (uint16_t)Data); + 278:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 279:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** return status; + 280:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 281:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 282:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /** + 283:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @brief This function handles FLASH interrupt request. + 284:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @retval None + 285:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** */ + 286:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** void HAL_FLASH_IRQHandler(void) + 287:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** uint32_t addresstmp = 0U; + 289:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 290:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Check FLASH operation error flags */ + 291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR) ||__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGERR)) + 292:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 293:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Return the faulty address */ + 294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** addresstmp = pFlash.Address; + 295:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Reset address */ + 296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** pFlash.Address = 0xFFFFFFFFU; + 297:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 298:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Save the Error code */ + 299:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** FLASH_SetErrorCode(); + 300:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 301:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* FLASH error interrupt user callback */ + 302:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** HAL_FLASH_OperationErrorCallback(addresstmp); + 303:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 304:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Stop the procedure ongoing */ + 305:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** pFlash.ProcedureOnGoing = FLASH_PROC_NONE; + 306:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 307:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 308:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Check FLASH End of Operation flag */ + 309:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP)) + 310:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 311:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Clear FLASH End of Operation pending bit */ + 312:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP); + 313:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 314:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Process can continue only if no error detected */ + 315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** if(pFlash.ProcedureOnGoing != FLASH_PROC_NONE) + ARM GAS /tmp/ccX3tCBb.s page 7 + + + 316:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** if(pFlash.ProcedureOnGoing == FLASH_PROC_PAGEERASE) + 318:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 319:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Nb of pages to erased can be decreased */ + 320:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** pFlash.DataRemaining--; + 321:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 322:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Check if there are still pages to erase */ + 323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** if(pFlash.DataRemaining != 0U) + 324:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 325:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** addresstmp = pFlash.Address; + 326:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /*Indicate user which sector has been erased */ + 327:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** HAL_FLASH_EndOfOperationCallback(addresstmp); + 328:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 329:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /*Increment sector number*/ + 330:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** addresstmp = pFlash.Address + FLASH_PAGE_SIZE; + 331:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** pFlash.Address = addresstmp; + 332:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 333:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* If the erase operation is completed, disable the PER Bit */ + 334:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** CLEAR_BIT(FLASH->CR, FLASH_CR_PER); + 335:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** FLASH_PageErase(addresstmp); + 337:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 338:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** else + 339:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 340:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* No more pages to Erase, user callback can be called. */ + 341:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Reset Sector and stop Erase pages procedure */ + 342:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** pFlash.Address = addresstmp = 0xFFFFFFFFU; + 343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** pFlash.ProcedureOnGoing = FLASH_PROC_NONE; + 344:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* FLASH EOP interrupt user callback */ + 345:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** HAL_FLASH_EndOfOperationCallback(addresstmp); + 346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 347:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 348:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** else if(pFlash.ProcedureOnGoing == FLASH_PROC_MASSERASE) + 349:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 350:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Operation is completed, disable the MER Bit */ + 351:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** CLEAR_BIT(FLASH->CR, FLASH_CR_MER); + 352:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 353:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* MassErase ended. Return the selected bank */ + 354:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* FLASH EOP interrupt user callback */ + 355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** HAL_FLASH_EndOfOperationCallback(0U); + 356:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 357:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Stop Mass Erase procedure*/ + 358:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** pFlash.ProcedureOnGoing = FLASH_PROC_NONE; + 359:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 360:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** else + 361:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 362:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Nb of 16-bit data to program can be decreased */ + 363:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** pFlash.DataRemaining--; + 364:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Check if there are still 16-bit data to program */ + 366:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** if(pFlash.DataRemaining != 0U) + 367:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 368:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Increment address to 16-bit */ + 369:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** pFlash.Address += 2U; + 370:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** addresstmp = pFlash.Address; + 371:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 372:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Shift to have next 16-bit data */ + ARM GAS /tmp/ccX3tCBb.s page 8 + + + 373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** pFlash.Data = (pFlash.Data >> 16U); + 374:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 375:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Operation is completed, disable the PG Bit */ + 376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** CLEAR_BIT(FLASH->CR, FLASH_CR_PG); + 377:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 378:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /*Program halfword (16-bit) at a specified address.*/ + 379:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** FLASH_Program_HalfWord(addresstmp, (uint16_t)pFlash.Data); + 380:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 381:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** else + 382:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Program ended. Return the selected address */ + 384:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* FLASH EOP interrupt user callback */ + 385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** if (pFlash.ProcedureOnGoing == FLASH_PROC_PROGRAMHALFWORD) + 386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 387:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** HAL_FLASH_EndOfOperationCallback(pFlash.Address); + 388:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 389:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** else if (pFlash.ProcedureOnGoing == FLASH_PROC_PROGRAMWORD) + 390:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 391:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** HAL_FLASH_EndOfOperationCallback(pFlash.Address - 2U); + 392:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 393:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** else + 394:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 395:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** HAL_FLASH_EndOfOperationCallback(pFlash.Address - 6U); + 396:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 397:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 398:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Reset Address and stop Program procedure */ + 399:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** pFlash.Address = 0xFFFFFFFFU; + 400:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** pFlash.ProcedureOnGoing = FLASH_PROC_NONE; + 401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 402:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 403:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 404:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 405:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 406:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** if(pFlash.ProcedureOnGoing == FLASH_PROC_NONE) + 408:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 409:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Operation is completed, disable the PG, PER and MER Bits */ + 410:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** CLEAR_BIT(FLASH->CR, (FLASH_CR_PG | FLASH_CR_PER | FLASH_CR_MER)); + 411:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 412:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Disable End of FLASH Operation and Error source interrupts */ + 413:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** __HAL_FLASH_DISABLE_IT(FLASH_IT_EOP | FLASH_IT_ERR); + 414:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 415:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Process Unlocked */ + 416:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** __HAL_UNLOCK(&pFlash); + 417:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 418:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 419:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 420:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /** + 421:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @brief FLASH end of operation interrupt callback + 422:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @param ReturnValue The value saved in this parameter depends on the ongoing procedure + 423:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * - Mass Erase: No return value expected + 424:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * - Pages Erase: Address of the page which has been erased + 425:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * (if 0xFFFFFFFF, it means that all the selected pages have been erased) + 426:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * - Program: Address which was selected for data program + 427:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @retval none + 428:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** */ + 429:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** __weak void HAL_FLASH_EndOfOperationCallback(uint32_t ReturnValue) + ARM GAS /tmp/ccX3tCBb.s page 9 + + + 430:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 431:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Prevent unused argument(s) compilation warning */ + 432:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** UNUSED(ReturnValue); + 433:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 434:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* NOTE : This function Should not be modified, when the callback is needed, + 435:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** the HAL_FLASH_EndOfOperationCallback could be implemented in the user file + 436:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** */ + 437:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 438:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 439:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /** + 440:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @brief FLASH operation error interrupt callback + 441:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @param ReturnValue The value saved in this parameter depends on the ongoing procedure + 442:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * - Mass Erase: No return value expected + 443:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * - Pages Erase: Address of the page which returned an error + 444:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * - Program: Address which was selected for data program + 445:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @retval none + 446:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** */ + 447:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** __weak void HAL_FLASH_OperationErrorCallback(uint32_t ReturnValue) + 448:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 449:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Prevent unused argument(s) compilation warning */ + 450:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** UNUSED(ReturnValue); + 451:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 452:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* NOTE : This function Should not be modified, when the callback is needed, + 453:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** the HAL_FLASH_OperationErrorCallback could be implemented in the user file + 454:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** */ + 455:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 456:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 457:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /** + 458:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @} + 459:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** */ + 460:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 461:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /** @defgroup FLASH_Exported_Functions_Group2 Peripheral Control functions + 462:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @brief management functions + 463:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * + 464:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** @verbatim + 465:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** =============================================================================== + 466:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** ##### Peripheral Control functions ##### + 467:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** =============================================================================== + 468:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** [..] + 469:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** This subsection provides a set of functions allowing to control the FLASH + 470:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** memory operations. + 471:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 472:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** @endverbatim + 473:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @{ + 474:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** */ + 475:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 476:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /** + 477:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @brief Unlock the FLASH control register access + 478:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @retval HAL Status + 479:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** */ + 480:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** HAL_StatusTypeDef HAL_FLASH_Unlock(void) + 481:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 482:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** HAL_StatusTypeDef status = HAL_OK; + 483:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 484:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** if(READ_BIT(FLASH->CR, FLASH_CR_LOCK) != RESET) + 485:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 486:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Authorize the FLASH Registers access */ + ARM GAS /tmp/ccX3tCBb.s page 10 + + + 487:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** WRITE_REG(FLASH->KEYR, FLASH_KEY1); + 488:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** WRITE_REG(FLASH->KEYR, FLASH_KEY2); + 489:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 490:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Verify Flash is unlocked */ + 491:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** if(READ_BIT(FLASH->CR, FLASH_CR_LOCK) != RESET) + 492:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 493:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** status = HAL_ERROR; + 494:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 495:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 496:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 497:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** return status; + 498:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 499:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 500:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /** + 501:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @brief Locks the FLASH control register access + 502:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @retval HAL Status + 503:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** */ + 504:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** HAL_StatusTypeDef HAL_FLASH_Lock(void) + 505:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 506:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Set the LOCK Bit to lock the FLASH Registers access */ + 507:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** SET_BIT(FLASH->CR, FLASH_CR_LOCK); + 508:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 509:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** return HAL_OK; + 510:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 511:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 512:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /** + 513:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @brief Unlock the FLASH Option Control Registers access. + 514:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @retval HAL Status + 515:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** */ + 516:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** HAL_StatusTypeDef HAL_FLASH_OB_Unlock(void) + 517:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 518:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** if (HAL_IS_BIT_CLR(FLASH->CR, FLASH_CR_OPTWRE)) + 519:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 520:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Authorizes the Option Byte register programming */ + 521:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** WRITE_REG(FLASH->OPTKEYR, FLASH_OPTKEY1); + 522:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** WRITE_REG(FLASH->OPTKEYR, FLASH_OPTKEY2); + 523:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 524:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** else + 525:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 526:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** return HAL_ERROR; + 527:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 528:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 529:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** return HAL_OK; + 530:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 531:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 532:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /** + 533:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @brief Lock the FLASH Option Control Registers access. + 534:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @retval HAL Status + 535:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** */ + 536:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** HAL_StatusTypeDef HAL_FLASH_OB_Lock(void) + 537:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 538:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Clear the OPTWRE Bit to lock the FLASH Option Byte Registers access */ + 539:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** CLEAR_BIT(FLASH->CR, FLASH_CR_OPTWRE); + 540:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 541:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** return HAL_OK; + 542:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 543:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + ARM GAS /tmp/ccX3tCBb.s page 11 + + + 544:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /** + 545:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @brief Launch the option byte loading. + 546:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @note This function will reset automatically the MCU. + 547:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @retval HAL Status + 548:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** */ + 549:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** HAL_StatusTypeDef HAL_FLASH_OB_Launch(void) + 550:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 551:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Set the OBL_Launch bit to launch the option byte loading */ + 552:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** SET_BIT(FLASH->CR, FLASH_CR_OBL_LAUNCH); + 553:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 554:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Wait for last operation to be completed */ + 555:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** return(FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE)); + 556:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 557:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 558:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /** + 559:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @} + 560:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** */ + 561:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 562:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /** @defgroup FLASH_Exported_Functions_Group3 Peripheral errors functions + 563:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @brief Peripheral errors functions + 564:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * + 565:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** @verbatim + 566:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** =============================================================================== + 567:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** ##### Peripheral Errors functions ##### + 568:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** =============================================================================== + 569:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** [..] + 570:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** This subsection permit to get in run-time errors of the FLASH peripheral. + 571:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 572:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** @endverbatim + 573:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @{ + 574:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** */ + 575:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 576:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /** + 577:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @brief Get the specific FLASH error flag. + 578:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @retval FLASH_ErrorCode The returned value can be: + 579:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @ref FLASH_Error_Codes + 580:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** */ + 581:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** uint32_t HAL_FLASH_GetError(void) + 582:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 583:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** return pFlash.ErrorCode; + 584:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 585:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 586:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /** + 587:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @} + 588:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** */ + 589:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 590:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /** + 591:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @} + 592:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** */ + 593:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 594:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /** @addtogroup FLASH_Private_Functions + 595:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @{ + 596:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** */ + 597:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 598:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /** + 599:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @brief Program a half-word (16-bit) at a specified address. + 600:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @param Address specify the address to be programmed. + ARM GAS /tmp/ccX3tCBb.s page 12 + + + 601:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @param Data specify the data to be programmed. + 602:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @retval None + 603:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** */ + 604:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** static void FLASH_Program_HalfWord(uint32_t Address, uint16_t Data) + 605:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 29 .loc 1 605 1 view -0 + 30 .cfi_startproc + 31 @ args = 0, pretend = 0, frame = 0 + 32 @ frame_needed = 0, uses_anonymous_args = 0 + 33 @ link register save eliminated. + 606:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Clean the error context */ + 607:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** pFlash.ErrorCode = HAL_FLASH_ERROR_NONE; + 34 .loc 1 607 3 view .LVU1 + 35 .loc 1 607 20 is_stmt 0 view .LVU2 + 36 0000 044B ldr r3, .L2 + 37 0002 0022 movs r2, #0 + 38 0004 DA61 str r2, [r3, #28] + 608:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 609:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Proceed to program the new data */ + 610:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** SET_BIT(FLASH->CR, FLASH_CR_PG); + 39 .loc 1 610 5 is_stmt 1 view .LVU3 + 40 0006 044A ldr r2, .L2+4 + 41 0008 1369 ldr r3, [r2, #16] + 42 000a 43F00103 orr r3, r3, #1 + 43 000e 1361 str r3, [r2, #16] + 611:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 612:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Write data in the address */ + 613:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** *(__IO uint16_t*)Address = Data; + 44 .loc 1 613 3 view .LVU4 + 45 .loc 1 613 28 is_stmt 0 view .LVU5 + 46 0010 0180 strh r1, [r0] @ movhi + 614:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 47 .loc 1 614 1 view .LVU6 + 48 0012 7047 bx lr + 49 .L3: + 50 .align 2 + 51 .L2: + 52 0014 00000000 .word pFlash + 53 0018 00200240 .word 1073881088 + 54 .cfi_endproc + 55 .LFE141: + 57 .section .text.FLASH_SetErrorCode,"ax",%progbits + 58 .align 1 + 59 .syntax unified + 60 .thumb + 61 .thumb_func + 63 FLASH_SetErrorCode: + 64 .LFB143: + 615:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 616:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /** + 617:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @brief Wait for a FLASH operation to complete. + 618:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @param Timeout maximum flash operation timeout + 619:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @retval HAL Status + 620:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** */ + 621:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout) + 622:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 623:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Wait for the FLASH operation to complete by polling on BUSY flag to be reset. + ARM GAS /tmp/ccX3tCBb.s page 13 + + + 624:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** Even if the FLASH operation fails, the BUSY flag will be reset and an error + 625:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** flag will be set */ + 626:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 627:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** uint32_t tickstart = HAL_GetTick(); + 628:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 629:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** while(__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY)) + 630:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 631:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** if (Timeout != HAL_MAX_DELAY) + 632:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 633:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** if((Timeout == 0U) || ((HAL_GetTick()-tickstart) > Timeout)) + 634:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 635:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** return HAL_TIMEOUT; + 636:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 637:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 638:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 639:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 640:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Check FLASH End of Operation flag */ + 641:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP)) + 642:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 643:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Clear FLASH End of Operation pending bit */ + 644:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP); + 645:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 646:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 647:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR) || + 648:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** __HAL_FLASH_GET_FLAG(FLASH_FLAG_PGERR)) + 649:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 650:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /*Save the error code*/ + 651:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** FLASH_SetErrorCode(); + 652:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** return HAL_ERROR; + 653:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 654:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 655:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* There is no error flag set */ + 656:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** return HAL_OK; + 657:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 658:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 659:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 660:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /** + 661:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @brief Set the specific FLASH error flag. + 662:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** * @retval None + 663:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** */ + 664:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** static void FLASH_SetErrorCode(void) + 665:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 65 .loc 1 665 1 is_stmt 1 view -0 + 66 .cfi_startproc + 67 @ args = 0, pretend = 0, frame = 0 + 68 @ frame_needed = 0, uses_anonymous_args = 0 + 69 @ link register save eliminated. + 666:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** uint32_t flags = 0U; + 70 .loc 1 666 3 view .LVU8 + 71 .LVL1: + 667:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 668:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_WRPERR)) + 72 .loc 1 668 3 view .LVU9 + 73 .loc 1 668 6 is_stmt 0 view .LVU10 + 74 0000 0C4B ldr r3, .L7 + 75 0002 DB68 ldr r3, [r3, #12] + 76 .loc 1 668 5 view .LVU11 + ARM GAS /tmp/ccX3tCBb.s page 14 + + + 77 0004 13F01003 ands r3, r3, #16 + 78 0008 05D0 beq .L5 + 669:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 670:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** pFlash.ErrorCode |= HAL_FLASH_ERROR_WRP; + 79 .loc 1 670 5 is_stmt 1 view .LVU12 + 80 .loc 1 670 11 is_stmt 0 view .LVU13 + 81 000a 0B4A ldr r2, .L7+4 + 82 000c D369 ldr r3, [r2, #28] + 83 .loc 1 670 22 view .LVU14 + 84 000e 43F00203 orr r3, r3, #2 + 85 0012 D361 str r3, [r2, #28] + 671:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** flags |= FLASH_FLAG_WRPERR; + 86 .loc 1 671 5 is_stmt 1 view .LVU15 + 87 .LVL2: + 88 .loc 1 671 11 is_stmt 0 view .LVU16 + 89 0014 1023 movs r3, #16 + 90 .LVL3: + 91 .L5: + 672:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 673:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_PGERR)) + 92 .loc 1 673 3 is_stmt 1 view .LVU17 + 93 .loc 1 673 6 is_stmt 0 view .LVU18 + 94 0016 074A ldr r2, .L7 + 95 0018 D268 ldr r2, [r2, #12] + 96 .loc 1 673 5 view .LVU19 + 97 001a 12F0040F tst r2, #4 + 98 001e 06D0 beq .L6 + 674:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 675:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** pFlash.ErrorCode |= HAL_FLASH_ERROR_PROG; + 99 .loc 1 675 5 is_stmt 1 view .LVU20 + 100 .loc 1 675 11 is_stmt 0 view .LVU21 + 101 0020 0549 ldr r1, .L7+4 + 102 0022 CA69 ldr r2, [r1, #28] + 103 .loc 1 675 22 view .LVU22 + 104 0024 42F00102 orr r2, r2, #1 + 105 0028 CA61 str r2, [r1, #28] + 676:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** flags |= FLASH_FLAG_PGERR; + 106 .loc 1 676 5 is_stmt 1 view .LVU23 + 107 .loc 1 676 11 is_stmt 0 view .LVU24 + 108 002a 43F00403 orr r3, r3, #4 + 109 .LVL4: + 110 .L6: + 677:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 678:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Clear FLASH error pending bits */ + 679:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** __HAL_FLASH_CLEAR_FLAG(flags); + 111 .loc 1 679 3 is_stmt 1 view .LVU25 + 112 002e 014A ldr r2, .L7 + 113 0030 D360 str r3, [r2, #12] + 680:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 114 .loc 1 680 1 is_stmt 0 view .LVU26 + 115 0032 7047 bx lr + 116 .L8: + 117 .align 2 + 118 .L7: + 119 0034 00200240 .word 1073881088 + 120 0038 00000000 .word pFlash + 121 .cfi_endproc + ARM GAS /tmp/ccX3tCBb.s page 15 + + + 122 .LFE143: + 124 .section .text.HAL_FLASH_Program_IT,"ax",%progbits + 125 .align 1 + 126 .global HAL_FLASH_Program_IT + 127 .syntax unified + 128 .thumb + 129 .thumb_func + 131 HAL_FLASH_Program_IT: + 132 .LVL5: + 133 .LFB131: + 241:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** HAL_StatusTypeDef status = HAL_OK; + 134 .loc 1 241 1 is_stmt 1 view -0 + 135 .cfi_startproc + 136 @ args = 0, pretend = 0, frame = 0 + 137 @ frame_needed = 0, uses_anonymous_args = 0 + 241:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** HAL_StatusTypeDef status = HAL_OK; + 138 .loc 1 241 1 is_stmt 0 view .LVU28 + 139 0000 38B5 push {r3, r4, r5, lr} + 140 .cfi_def_cfa_offset 16 + 141 .cfi_offset 3, -16 + 142 .cfi_offset 4, -12 + 143 .cfi_offset 5, -8 + 144 .cfi_offset 14, -4 + 145 0002 1D46 mov r5, r3 + 242:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 146 .loc 1 242 3 is_stmt 1 view .LVU29 + 147 .LVL6: + 245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 148 .loc 1 245 3 view .LVU30 + 245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 149 .loc 1 245 3 view .LVU31 + 150 0004 174B ldr r3, .L18 + 151 0006 1B7E ldrb r3, [r3, #24] @ zero_extendqisi2 + 152 0008 012B cmp r3, #1 + 153 000a 28D0 beq .L14 + 154 000c 8446 mov ip, r0 + 155 000e 0846 mov r0, r1 + 156 .LVL7: + 245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 157 .loc 1 245 3 is_stmt 0 view .LVU32 + 158 0010 1446 mov r4, r2 + 245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 159 .loc 1 245 3 is_stmt 1 discriminator 2 view .LVU33 + 160 0012 144B ldr r3, .L18 + 161 0014 0122 movs r2, #1 + 162 .LVL8: + 245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 163 .loc 1 245 3 is_stmt 0 discriminator 2 view .LVU34 + 164 0016 1A76 strb r2, [r3, #24] + 245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 165 .loc 1 245 3 is_stmt 1 discriminator 2 view .LVU35 + 248:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** assert_param(IS_FLASH_PROGRAM_ADDRESS(Address)); + 166 .loc 1 248 3 discriminator 2 view .LVU36 + 249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 167 .loc 1 249 3 discriminator 2 view .LVU37 + 252:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 168 .loc 1 252 3 discriminator 2 view .LVU38 + ARM GAS /tmp/ccX3tCBb.s page 16 + + + 169 0018 1349 ldr r1, .L18+4 + 170 .LVL9: + 252:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 171 .loc 1 252 3 is_stmt 0 discriminator 2 view .LVU39 + 172 001a 0A69 ldr r2, [r1, #16] + 173 001c 42F4A052 orr r2, r2, #5120 + 174 0020 0A61 str r2, [r1, #16] + 254:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** pFlash.Data = Data; + 175 .loc 1 254 3 is_stmt 1 discriminator 2 view .LVU40 + 254:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** pFlash.Data = Data; + 176 .loc 1 254 18 is_stmt 0 discriminator 2 view .LVU41 + 177 0022 9860 str r0, [r3, #8] + 255:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 178 .loc 1 255 3 is_stmt 1 discriminator 2 view .LVU42 + 255:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 179 .loc 1 255 15 is_stmt 0 discriminator 2 view .LVU43 + 180 0024 C3E90445 strd r4, [r3, #16] + 257:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 181 .loc 1 257 3 is_stmt 1 discriminator 2 view .LVU44 + 257:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 182 .loc 1 257 5 is_stmt 0 discriminator 2 view .LVU45 + 183 0028 BCF1010F cmp ip, #1 + 184 002c 0CD0 beq .L16 + 263:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 185 .loc 1 263 8 is_stmt 1 view .LVU46 + 263:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 186 .loc 1 263 10 is_stmt 0 view .LVU47 + 187 002e BCF1020F cmp ip, #2 + 188 0032 0ED0 beq .L17 + 271:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Program double word (64-bit : 4*16-bit) at a specified address. */ + 189 .loc 1 271 5 is_stmt 1 view .LVU48 + 271:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Program double word (64-bit : 4*16-bit) at a specified address. */ + 190 .loc 1 271 29 is_stmt 0 view .LVU49 + 191 0034 0B4B ldr r3, .L18 + 192 0036 0522 movs r2, #5 + 193 0038 1A70 strb r2, [r3] + 273:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 194 .loc 1 273 5 is_stmt 1 view .LVU50 + 273:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 195 .loc 1 273 26 is_stmt 0 view .LVU51 + 196 003a 0422 movs r2, #4 + 197 003c 5A60 str r2, [r3, #4] + 198 .L12: + 277:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 199 .loc 1 277 3 is_stmt 1 view .LVU52 + 200 003e A1B2 uxth r1, r4 + 201 0040 FFF7FEFF bl FLASH_Program_HalfWord + 202 .LVL10: + 279:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 203 .loc 1 279 3 view .LVU53 + 279:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 204 .loc 1 279 10 is_stmt 0 view .LVU54 + 205 0044 0020 movs r0, #0 + 206 .L10: + 280:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 207 .loc 1 280 1 view .LVU55 + 208 0046 38BD pop {r3, r4, r5, pc} + ARM GAS /tmp/ccX3tCBb.s page 17 + + + 209 .LVL11: + 210 .L16: + 259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Program halfword (16-bit) at a specified address. */ + 211 .loc 1 259 5 is_stmt 1 view .LVU56 + 259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Program halfword (16-bit) at a specified address. */ + 212 .loc 1 259 29 is_stmt 0 view .LVU57 + 213 0048 0322 movs r2, #3 + 214 004a 1A70 strb r2, [r3] + 261:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 215 .loc 1 261 5 is_stmt 1 view .LVU58 + 261:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 216 .loc 1 261 26 is_stmt 0 view .LVU59 + 217 004c 0122 movs r2, #1 + 218 004e 5A60 str r2, [r3, #4] + 219 0050 F5E7 b .L12 + 220 .L17: + 265:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Program word (32-bit : 2*16-bit) at a specified address. */ + 221 .loc 1 265 5 is_stmt 1 view .LVU60 + 265:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Program word (32-bit : 2*16-bit) at a specified address. */ + 222 .loc 1 265 29 is_stmt 0 view .LVU61 + 223 0052 044B ldr r3, .L18 + 224 0054 0422 movs r2, #4 + 225 0056 1A70 strb r2, [r3] + 267:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 226 .loc 1 267 5 is_stmt 1 view .LVU62 + 267:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 227 .loc 1 267 26 is_stmt 0 view .LVU63 + 228 0058 0222 movs r2, #2 + 229 005a 5A60 str r2, [r3, #4] + 230 005c EFE7 b .L12 + 231 .LVL12: + 232 .L14: + 245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 233 .loc 1 245 3 view .LVU64 + 234 005e 0220 movs r0, #2 + 235 .LVL13: + 245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 236 .loc 1 245 3 view .LVU65 + 237 0060 F1E7 b .L10 + 238 .L19: + 239 0062 00BF .align 2 + 240 .L18: + 241 0064 00000000 .word pFlash + 242 0068 00200240 .word 1073881088 + 243 .cfi_endproc + 244 .LFE131: + 246 .section .text.HAL_FLASH_EndOfOperationCallback,"ax",%progbits + 247 .align 1 + 248 .weak HAL_FLASH_EndOfOperationCallback + 249 .syntax unified + 250 .thumb + 251 .thumb_func + 253 HAL_FLASH_EndOfOperationCallback: + 254 .LVL14: + 255 .LFB133: + 430:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Prevent unused argument(s) compilation warning */ + 256 .loc 1 430 1 is_stmt 1 view -0 + ARM GAS /tmp/ccX3tCBb.s page 18 + + + 257 .cfi_startproc + 258 @ args = 0, pretend = 0, frame = 0 + 259 @ frame_needed = 0, uses_anonymous_args = 0 + 260 @ link register save eliminated. + 432:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 261 .loc 1 432 3 view .LVU67 + 437:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 262 .loc 1 437 1 is_stmt 0 view .LVU68 + 263 0000 7047 bx lr + 264 .cfi_endproc + 265 .LFE133: + 267 .section .text.HAL_FLASH_OperationErrorCallback,"ax",%progbits + 268 .align 1 + 269 .weak HAL_FLASH_OperationErrorCallback + 270 .syntax unified + 271 .thumb + 272 .thumb_func + 274 HAL_FLASH_OperationErrorCallback: + 275 .LVL15: + 276 .LFB134: + 448:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Prevent unused argument(s) compilation warning */ + 277 .loc 1 448 1 is_stmt 1 view -0 + 278 .cfi_startproc + 279 @ args = 0, pretend = 0, frame = 0 + 280 @ frame_needed = 0, uses_anonymous_args = 0 + 281 @ link register save eliminated. + 450:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 282 .loc 1 450 3 view .LVU70 + 455:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 283 .loc 1 455 1 is_stmt 0 view .LVU71 + 284 0000 7047 bx lr + 285 .cfi_endproc + 286 .LFE134: + 288 .section .text.HAL_FLASH_IRQHandler,"ax",%progbits + 289 .align 1 + 290 .global HAL_FLASH_IRQHandler + 291 .syntax unified + 292 .thumb + 293 .thumb_func + 295 HAL_FLASH_IRQHandler: + 296 .LFB132: + 287:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** uint32_t addresstmp = 0U; + 297 .loc 1 287 1 is_stmt 1 view -0 + 298 .cfi_startproc + 299 @ args = 0, pretend = 0, frame = 0 + 300 @ frame_needed = 0, uses_anonymous_args = 0 + 301 0000 F8B5 push {r3, r4, r5, r6, r7, lr} + 302 .cfi_def_cfa_offset 24 + 303 .cfi_offset 3, -24 + 304 .cfi_offset 4, -20 + 305 .cfi_offset 5, -16 + 306 .cfi_offset 6, -12 + 307 .cfi_offset 7, -8 + 308 .cfi_offset 14, -4 + 288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 309 .loc 1 288 3 view .LVU73 + 310 .LVL16: + ARM GAS /tmp/ccX3tCBb.s page 19 + + + 291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 311 .loc 1 291 3 view .LVU74 + 291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 312 .loc 1 291 6 is_stmt 0 view .LVU75 + 313 0002 524B ldr r3, .L40 + 314 0004 DB68 ldr r3, [r3, #12] + 291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 315 .loc 1 291 5 view .LVU76 + 316 0006 13F0100F tst r3, #16 + 317 000a 04D1 bne .L23 + 291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 318 .loc 1 291 48 discriminator 1 view .LVU77 + 319 000c 4F4B ldr r3, .L40 + 320 000e DB68 ldr r3, [r3, #12] + 291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 321 .loc 1 291 46 discriminator 1 view .LVU78 + 322 0010 13F0040F tst r3, #4 + 323 0014 0BD0 beq .L24 + 324 .L23: + 294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Reset address */ + 325 .loc 1 294 5 is_stmt 1 view .LVU79 + 294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Reset address */ + 326 .loc 1 294 16 is_stmt 0 view .LVU80 + 327 0016 4E4C ldr r4, .L40+4 + 328 0018 A568 ldr r5, [r4, #8] + 329 .LVL17: + 296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 330 .loc 1 296 5 is_stmt 1 view .LVU81 + 296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 331 .loc 1 296 20 is_stmt 0 view .LVU82 + 332 001a 4FF0FF33 mov r3, #-1 + 333 001e A360 str r3, [r4, #8] + 299:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 334 .loc 1 299 5 is_stmt 1 view .LVU83 + 335 0020 FFF7FEFF bl FLASH_SetErrorCode + 336 .LVL18: + 302:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 337 .loc 1 302 5 view .LVU84 + 338 0024 2846 mov r0, r5 + 339 0026 FFF7FEFF bl HAL_FLASH_OperationErrorCallback + 340 .LVL19: + 305:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 341 .loc 1 305 5 view .LVU85 + 305:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 342 .loc 1 305 29 is_stmt 0 view .LVU86 + 343 002a 0023 movs r3, #0 + 344 002c 2370 strb r3, [r4] + 345 .LVL20: + 346 .L24: + 309:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 347 .loc 1 309 3 is_stmt 1 view .LVU87 + 309:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 348 .loc 1 309 6 is_stmt 0 view .LVU88 + 349 002e 474B ldr r3, .L40 + 350 0030 DB68 ldr r3, [r3, #12] + 309:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 351 .loc 1 309 5 view .LVU89 + ARM GAS /tmp/ccX3tCBb.s page 20 + + + 352 0032 13F0200F tst r3, #32 + 353 0036 2BD0 beq .L25 + 312:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 354 .loc 1 312 5 is_stmt 1 view .LVU90 + 355 0038 444B ldr r3, .L40 + 356 003a 2022 movs r2, #32 + 357 003c DA60 str r2, [r3, #12] + 315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 358 .loc 1 315 5 view .LVU91 + 315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 359 .loc 1 315 14 is_stmt 0 view .LVU92 + 360 003e 444B ldr r3, .L40+4 + 361 0040 1B78 ldrb r3, [r3] @ zero_extendqisi2 + 315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 362 .loc 1 315 7 view .LVU93 + 363 0042 2BB3 cbz r3, .L25 + 317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 364 .loc 1 317 7 is_stmt 1 view .LVU94 + 317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 365 .loc 1 317 16 is_stmt 0 view .LVU95 + 366 0044 424B ldr r3, .L40+4 + 367 0046 1B78 ldrb r3, [r3] @ zero_extendqisi2 + 368 0048 DBB2 uxtb r3, r3 + 317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 369 .loc 1 317 9 view .LVU96 + 370 004a 012B cmp r3, #1 + 371 004c 30D0 beq .L35 + 348:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 372 .loc 1 348 12 is_stmt 1 view .LVU97 + 348:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 373 .loc 1 348 21 is_stmt 0 view .LVU98 + 374 004e 404B ldr r3, .L40+4 + 375 0050 1B78 ldrb r3, [r3] @ zero_extendqisi2 + 376 0052 DBB2 uxtb r3, r3 + 348:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 377 .loc 1 348 14 view .LVU99 + 378 0054 022B cmp r3, #2 + 379 0056 4AD0 beq .L36 + 363:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 380 .loc 1 363 9 is_stmt 1 view .LVU100 + 363:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 381 .loc 1 363 15 is_stmt 0 view .LVU101 + 382 0058 3D4B ldr r3, .L40+4 + 383 005a 5A68 ldr r2, [r3, #4] + 363:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 384 .loc 1 363 29 view .LVU102 + 385 005c 013A subs r2, r2, #1 + 386 005e 5A60 str r2, [r3, #4] + 366:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 387 .loc 1 366 9 is_stmt 1 view .LVU103 + 366:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 388 .loc 1 366 18 is_stmt 0 view .LVU104 + 389 0060 5B68 ldr r3, [r3, #4] + 366:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 390 .loc 1 366 11 view .LVU105 + 391 0062 002B cmp r3, #0 + 392 0064 4FD1 bne .L37 + ARM GAS /tmp/ccX3tCBb.s page 21 + + + 385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 393 .loc 1 385 11 is_stmt 1 view .LVU106 + 385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 394 .loc 1 385 21 is_stmt 0 view .LVU107 + 395 0066 3A4B ldr r3, .L40+4 + 396 0068 1B78 ldrb r3, [r3] @ zero_extendqisi2 + 397 006a DBB2 uxtb r3, r3 + 385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 398 .loc 1 385 14 view .LVU108 + 399 006c 032B cmp r3, #3 + 400 006e 62D0 beq .L38 + 389:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 401 .loc 1 389 16 is_stmt 1 view .LVU109 + 389:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 402 .loc 1 389 26 is_stmt 0 view .LVU110 + 403 0070 374B ldr r3, .L40+4 + 404 0072 1B78 ldrb r3, [r3] @ zero_extendqisi2 + 405 0074 DBB2 uxtb r3, r3 + 389:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 406 .loc 1 389 19 view .LVU111 + 407 0076 042B cmp r3, #4 + 408 0078 62D0 beq .L39 + 395:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 409 .loc 1 395 13 is_stmt 1 view .LVU112 + 395:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 410 .loc 1 395 52 is_stmt 0 view .LVU113 + 411 007a 354B ldr r3, .L40+4 + 412 007c 9868 ldr r0, [r3, #8] + 395:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 413 .loc 1 395 13 view .LVU114 + 414 007e 0638 subs r0, r0, #6 + 415 0080 FFF7FEFF bl HAL_FLASH_EndOfOperationCallback + 416 .LVL21: + 417 .L31: + 399:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** pFlash.ProcedureOnGoing = FLASH_PROC_NONE; + 418 .loc 1 399 11 is_stmt 1 view .LVU115 + 399:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** pFlash.ProcedureOnGoing = FLASH_PROC_NONE; + 419 .loc 1 399 26 is_stmt 0 view .LVU116 + 420 0084 324B ldr r3, .L40+4 + 421 0086 4FF0FF32 mov r2, #-1 + 422 008a 9A60 str r2, [r3, #8] + 400:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 423 .loc 1 400 11 is_stmt 1 view .LVU117 + 400:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 424 .loc 1 400 35 is_stmt 0 view .LVU118 + 425 008c 0022 movs r2, #0 + 426 008e 1A70 strb r2, [r3] + 427 .L25: + 407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 428 .loc 1 407 3 is_stmt 1 view .LVU119 + 407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 429 .loc 1 407 12 is_stmt 0 view .LVU120 + 430 0090 2F4B ldr r3, .L40+4 + 431 0092 1B78 ldrb r3, [r3] @ zero_extendqisi2 + 407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 432 .loc 1 407 5 view .LVU121 + 433 0094 5BB9 cbnz r3, .L22 + ARM GAS /tmp/ccX3tCBb.s page 22 + + + 410:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 434 .loc 1 410 5 is_stmt 1 view .LVU122 + 435 0096 2D4B ldr r3, .L40 + 436 0098 1A69 ldr r2, [r3, #16] + 437 009a 22F00702 bic r2, r2, #7 + 438 009e 1A61 str r2, [r3, #16] + 413:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 439 .loc 1 413 5 view .LVU123 + 440 00a0 1A69 ldr r2, [r3, #16] + 441 00a2 22F4A052 bic r2, r2, #5120 + 442 00a6 1A61 str r2, [r3, #16] + 416:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 443 .loc 1 416 5 view .LVU124 + 416:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 444 .loc 1 416 5 view .LVU125 + 445 00a8 294B ldr r3, .L40+4 + 446 00aa 0022 movs r2, #0 + 447 00ac 1A76 strb r2, [r3, #24] + 416:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 448 .loc 1 416 5 view .LVU126 + 449 .L22: + 418:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 450 .loc 1 418 1 is_stmt 0 view .LVU127 + 451 00ae F8BD pop {r3, r4, r5, r6, r7, pc} + 452 .L35: + 320:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 453 .loc 1 320 9 is_stmt 1 view .LVU128 + 320:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 454 .loc 1 320 15 is_stmt 0 view .LVU129 + 455 00b0 274B ldr r3, .L40+4 + 456 00b2 5A68 ldr r2, [r3, #4] + 320:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 457 .loc 1 320 29 view .LVU130 + 458 00b4 013A subs r2, r2, #1 + 459 00b6 5A60 str r2, [r3, #4] + 323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 460 .loc 1 323 9 is_stmt 1 view .LVU131 + 323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 461 .loc 1 323 18 is_stmt 0 view .LVU132 + 462 00b8 5B68 ldr r3, [r3, #4] + 323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 463 .loc 1 323 11 view .LVU133 + 464 00ba 7BB1 cbz r3, .L27 + 325:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /*Indicate user which sector has been erased */ + 465 .loc 1 325 11 is_stmt 1 view .LVU134 + 325:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /*Indicate user which sector has been erased */ + 466 .loc 1 325 22 is_stmt 0 view .LVU135 + 467 00bc 244C ldr r4, .L40+4 + 468 00be A068 ldr r0, [r4, #8] + 469 .LVL22: + 327:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 470 .loc 1 327 11 is_stmt 1 view .LVU136 + 471 00c0 FFF7FEFF bl HAL_FLASH_EndOfOperationCallback + 472 .LVL23: + 330:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** pFlash.Address = addresstmp; + 473 .loc 1 330 11 view .LVU137 + 330:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** pFlash.Address = addresstmp; + ARM GAS /tmp/ccX3tCBb.s page 23 + + + 474 .loc 1 330 30 is_stmt 0 view .LVU138 + 475 00c4 A068 ldr r0, [r4, #8] + 330:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** pFlash.Address = addresstmp; + 476 .loc 1 330 22 view .LVU139 + 477 00c6 00F50060 add r0, r0, #2048 + 478 .LVL24: + 331:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 479 .loc 1 331 11 is_stmt 1 view .LVU140 + 331:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 480 .loc 1 331 26 is_stmt 0 view .LVU141 + 481 00ca A060 str r0, [r4, #8] + 334:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 482 .loc 1 334 11 is_stmt 1 view .LVU142 + 483 00cc 1F4A ldr r2, .L40 + 484 00ce 1369 ldr r3, [r2, #16] + 485 00d0 23F00203 bic r3, r3, #2 + 486 00d4 1361 str r3, [r2, #16] + 336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 487 .loc 1 336 11 view .LVU143 + 488 00d6 FFF7FEFF bl FLASH_PageErase + 489 .LVL25: + 336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 490 .loc 1 336 11 is_stmt 0 view .LVU144 + 491 00da D9E7 b .L25 + 492 .LVL26: + 493 .L27: + 342:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** pFlash.ProcedureOnGoing = FLASH_PROC_NONE; + 494 .loc 1 342 11 is_stmt 1 view .LVU145 + 342:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** pFlash.ProcedureOnGoing = FLASH_PROC_NONE; + 495 .loc 1 342 26 is_stmt 0 view .LVU146 + 496 00dc 1C4B ldr r3, .L40+4 + 497 00de 4FF0FF30 mov r0, #-1 + 498 00e2 9860 str r0, [r3, #8] + 343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* FLASH EOP interrupt user callback */ + 499 .loc 1 343 11 is_stmt 1 view .LVU147 + 343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* FLASH EOP interrupt user callback */ + 500 .loc 1 343 35 is_stmt 0 view .LVU148 + 501 00e4 0022 movs r2, #0 + 502 00e6 1A70 strb r2, [r3] + 345:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 503 .loc 1 345 11 is_stmt 1 view .LVU149 + 504 00e8 FFF7FEFF bl HAL_FLASH_EndOfOperationCallback + 505 .LVL27: + 506 00ec D0E7 b .L25 + 507 .LVL28: + 508 .L36: + 351:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 509 .loc 1 351 9 view .LVU150 + 510 00ee 174A ldr r2, .L40 + 511 00f0 1369 ldr r3, [r2, #16] + 512 00f2 23F00403 bic r3, r3, #4 + 513 00f6 1361 str r3, [r2, #16] + 355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 514 .loc 1 355 11 view .LVU151 + 515 00f8 0020 movs r0, #0 + 516 00fa FFF7FEFF bl HAL_FLASH_EndOfOperationCallback + 517 .LVL29: + ARM GAS /tmp/ccX3tCBb.s page 24 + + + 358:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 518 .loc 1 358 11 view .LVU152 + 358:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 519 .loc 1 358 35 is_stmt 0 view .LVU153 + 520 00fe 144B ldr r3, .L40+4 + 521 0100 0022 movs r2, #0 + 522 0102 1A70 strb r2, [r3] + 523 0104 C4E7 b .L25 + 524 .L37: + 369:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** addresstmp = pFlash.Address; + 525 .loc 1 369 11 is_stmt 1 view .LVU154 + 369:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** addresstmp = pFlash.Address; + 526 .loc 1 369 17 is_stmt 0 view .LVU155 + 527 0106 124B ldr r3, .L40+4 + 528 0108 9A68 ldr r2, [r3, #8] + 369:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** addresstmp = pFlash.Address; + 529 .loc 1 369 26 view .LVU156 + 530 010a 0232 adds r2, r2, #2 + 531 010c 9A60 str r2, [r3, #8] + 370:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 532 .loc 1 370 11 is_stmt 1 view .LVU157 + 370:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 533 .loc 1 370 22 is_stmt 0 view .LVU158 + 534 010e 9868 ldr r0, [r3, #8] + 535 .LVL30: + 373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 536 .loc 1 373 11 is_stmt 1 view .LVU159 + 373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 537 .loc 1 373 32 is_stmt 0 view .LVU160 + 538 0110 D3E90467 ldrd r6, [r3, #16] + 373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 539 .loc 1 373 38 view .LVU161 + 540 0114 340C lsrs r4, r6, #16 + 541 0116 44EA0744 orr r4, r4, r7, lsl #16 + 542 011a 3D0C lsrs r5, r7, #16 + 373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 543 .loc 1 373 23 view .LVU162 + 544 011c C3E90445 strd r4, [r3, #16] + 376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 545 .loc 1 376 11 is_stmt 1 view .LVU163 + 546 0120 0A49 ldr r1, .L40 + 547 0122 0A69 ldr r2, [r1, #16] + 548 0124 22F00102 bic r2, r2, #1 + 549 0128 0A61 str r2, [r1, #16] + 379:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 550 .loc 1 379 11 view .LVU164 + 379:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 551 .loc 1 379 62 is_stmt 0 view .LVU165 + 552 012a D3E90423 ldrd r2, [r3, #16] + 379:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 553 .loc 1 379 11 view .LVU166 + 554 012e 91B2 uxth r1, r2 + 555 0130 FFF7FEFF bl FLASH_Program_HalfWord + 556 .LVL31: + 379:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 557 .loc 1 379 11 view .LVU167 + 558 0134 ACE7 b .L25 + ARM GAS /tmp/ccX3tCBb.s page 25 + + + 559 .LVL32: + 560 .L38: + 387:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 561 .loc 1 387 13 is_stmt 1 view .LVU168 + 387:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 562 .loc 1 387 52 is_stmt 0 view .LVU169 + 563 0136 064B ldr r3, .L40+4 + 564 0138 9868 ldr r0, [r3, #8] + 387:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 565 .loc 1 387 13 view .LVU170 + 566 013a FFF7FEFF bl HAL_FLASH_EndOfOperationCallback + 567 .LVL33: + 568 013e A1E7 b .L31 + 569 .L39: + 391:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 570 .loc 1 391 13 is_stmt 1 view .LVU171 + 391:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 571 .loc 1 391 52 is_stmt 0 view .LVU172 + 572 0140 034B ldr r3, .L40+4 + 573 0142 9868 ldr r0, [r3, #8] + 391:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 574 .loc 1 391 13 view .LVU173 + 575 0144 0238 subs r0, r0, #2 + 576 0146 FFF7FEFF bl HAL_FLASH_EndOfOperationCallback + 577 .LVL34: + 578 014a 9BE7 b .L31 + 579 .L41: + 580 .align 2 + 581 .L40: + 582 014c 00200240 .word 1073881088 + 583 0150 00000000 .word pFlash + 584 .cfi_endproc + 585 .LFE132: + 587 .section .text.HAL_FLASH_Unlock,"ax",%progbits + 588 .align 1 + 589 .global HAL_FLASH_Unlock + 590 .syntax unified + 591 .thumb + 592 .thumb_func + 594 HAL_FLASH_Unlock: + 595 .LFB135: + 481:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** HAL_StatusTypeDef status = HAL_OK; + 596 .loc 1 481 1 is_stmt 1 view -0 + 597 .cfi_startproc + 598 @ args = 0, pretend = 0, frame = 0 + 599 @ frame_needed = 0, uses_anonymous_args = 0 + 600 @ link register save eliminated. + 482:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 601 .loc 1 482 3 view .LVU175 + 602 .LVL35: + 484:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 603 .loc 1 484 3 view .LVU176 + 484:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 604 .loc 1 484 6 is_stmt 0 view .LVU177 + 605 0000 0A4B ldr r3, .L46 + 606 0002 1B69 ldr r3, [r3, #16] + 484:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + ARM GAS /tmp/ccX3tCBb.s page 26 + + + 607 .loc 1 484 5 view .LVU178 + 608 0004 13F0800F tst r3, #128 + 609 0008 0BD0 beq .L44 + 487:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** WRITE_REG(FLASH->KEYR, FLASH_KEY2); + 610 .loc 1 487 5 is_stmt 1 view .LVU179 + 611 000a 084B ldr r3, .L46 + 612 000c 084A ldr r2, .L46+4 + 613 000e 5A60 str r2, [r3, #4] + 488:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 614 .loc 1 488 5 view .LVU180 + 615 0010 02F18832 add r2, r2, #-2004318072 + 616 0014 5A60 str r2, [r3, #4] + 491:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 617 .loc 1 491 5 view .LVU181 + 491:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 618 .loc 1 491 8 is_stmt 0 view .LVU182 + 619 0016 1B69 ldr r3, [r3, #16] + 491:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 620 .loc 1 491 7 view .LVU183 + 621 0018 13F0800F tst r3, #128 + 622 001c 03D1 bne .L45 + 482:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 623 .loc 1 482 21 view .LVU184 + 624 001e 0020 movs r0, #0 + 625 0020 7047 bx lr + 626 .L44: + 627 0022 0020 movs r0, #0 + 628 0024 7047 bx lr + 629 .L45: + 493:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 630 .loc 1 493 14 view .LVU185 + 631 0026 0120 movs r0, #1 + 632 .LVL36: + 497:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 633 .loc 1 497 3 is_stmt 1 view .LVU186 + 498:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 634 .loc 1 498 1 is_stmt 0 view .LVU187 + 635 0028 7047 bx lr + 636 .L47: + 637 002a 00BF .align 2 + 638 .L46: + 639 002c 00200240 .word 1073881088 + 640 0030 23016745 .word 1164378403 + 641 .cfi_endproc + 642 .LFE135: + 644 .section .text.HAL_FLASH_Lock,"ax",%progbits + 645 .align 1 + 646 .global HAL_FLASH_Lock + 647 .syntax unified + 648 .thumb + 649 .thumb_func + 651 HAL_FLASH_Lock: + 652 .LFB136: + 505:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Set the LOCK Bit to lock the FLASH Registers access */ + 653 .loc 1 505 1 is_stmt 1 view -0 + 654 .cfi_startproc + 655 @ args = 0, pretend = 0, frame = 0 + ARM GAS /tmp/ccX3tCBb.s page 27 + + + 656 @ frame_needed = 0, uses_anonymous_args = 0 + 657 @ link register save eliminated. + 507:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 658 .loc 1 507 3 view .LVU189 + 659 0000 034A ldr r2, .L49 + 660 0002 1369 ldr r3, [r2, #16] + 661 0004 43F08003 orr r3, r3, #128 + 662 0008 1361 str r3, [r2, #16] + 509:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 663 .loc 1 509 3 view .LVU190 + 510:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 664 .loc 1 510 1 is_stmt 0 view .LVU191 + 665 000a 0020 movs r0, #0 + 666 000c 7047 bx lr + 667 .L50: + 668 000e 00BF .align 2 + 669 .L49: + 670 0010 00200240 .word 1073881088 + 671 .cfi_endproc + 672 .LFE136: + 674 .section .text.HAL_FLASH_OB_Unlock,"ax",%progbits + 675 .align 1 + 676 .global HAL_FLASH_OB_Unlock + 677 .syntax unified + 678 .thumb + 679 .thumb_func + 681 HAL_FLASH_OB_Unlock: + 682 .LFB137: + 517:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** if (HAL_IS_BIT_CLR(FLASH->CR, FLASH_CR_OPTWRE)) + 683 .loc 1 517 1 is_stmt 1 view -0 + 684 .cfi_startproc + 685 @ args = 0, pretend = 0, frame = 0 + 686 @ frame_needed = 0, uses_anonymous_args = 0 + 687 @ link register save eliminated. + 518:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 688 .loc 1 518 3 view .LVU193 + 518:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 689 .loc 1 518 7 is_stmt 0 view .LVU194 + 690 0000 074B ldr r3, .L54 + 691 0002 1B69 ldr r3, [r3, #16] + 518:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 692 .loc 1 518 6 view .LVU195 + 693 0004 13F4007F tst r3, #512 + 694 0008 07D1 bne .L53 + 521:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** WRITE_REG(FLASH->OPTKEYR, FLASH_OPTKEY2); + 695 .loc 1 521 5 is_stmt 1 view .LVU196 + 696 000a 054B ldr r3, .L54 + 697 000c 054A ldr r2, .L54+4 + 698 000e 9A60 str r2, [r3, #8] + 522:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 699 .loc 1 522 5 view .LVU197 + 700 0010 02F18832 add r2, r2, #-2004318072 + 701 0014 9A60 str r2, [r3, #8] + 529:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 702 .loc 1 529 3 view .LVU198 + 529:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 703 .loc 1 529 10 is_stmt 0 view .LVU199 + ARM GAS /tmp/ccX3tCBb.s page 28 + + + 704 0016 0020 movs r0, #0 + 705 0018 7047 bx lr + 706 .L53: + 526:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 707 .loc 1 526 12 view .LVU200 + 708 001a 0120 movs r0, #1 + 530:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 709 .loc 1 530 1 view .LVU201 + 710 001c 7047 bx lr + 711 .L55: + 712 001e 00BF .align 2 + 713 .L54: + 714 0020 00200240 .word 1073881088 + 715 0024 23016745 .word 1164378403 + 716 .cfi_endproc + 717 .LFE137: + 719 .section .text.HAL_FLASH_OB_Lock,"ax",%progbits + 720 .align 1 + 721 .global HAL_FLASH_OB_Lock + 722 .syntax unified + 723 .thumb + 724 .thumb_func + 726 HAL_FLASH_OB_Lock: + 727 .LFB138: + 537:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Clear the OPTWRE Bit to lock the FLASH Option Byte Registers access */ + 728 .loc 1 537 1 is_stmt 1 view -0 + 729 .cfi_startproc + 730 @ args = 0, pretend = 0, frame = 0 + 731 @ frame_needed = 0, uses_anonymous_args = 0 + 732 @ link register save eliminated. + 539:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 733 .loc 1 539 3 view .LVU203 + 734 0000 034A ldr r2, .L57 + 735 0002 1369 ldr r3, [r2, #16] + 736 0004 23F40073 bic r3, r3, #512 + 737 0008 1361 str r3, [r2, #16] + 541:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 738 .loc 1 541 3 view .LVU204 + 542:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 739 .loc 1 542 1 is_stmt 0 view .LVU205 + 740 000a 0020 movs r0, #0 + 741 000c 7047 bx lr + 742 .L58: + 743 000e 00BF .align 2 + 744 .L57: + 745 0010 00200240 .word 1073881088 + 746 .cfi_endproc + 747 .LFE138: + 749 .section .text.HAL_FLASH_GetError,"ax",%progbits + 750 .align 1 + 751 .global HAL_FLASH_GetError + 752 .syntax unified + 753 .thumb + 754 .thumb_func + 756 HAL_FLASH_GetError: + 757 .LFB140: + 582:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** return pFlash.ErrorCode; + ARM GAS /tmp/ccX3tCBb.s page 29 + + + 758 .loc 1 582 1 is_stmt 1 view -0 + 759 .cfi_startproc + 760 @ args = 0, pretend = 0, frame = 0 + 761 @ frame_needed = 0, uses_anonymous_args = 0 + 762 @ link register save eliminated. + 583:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 763 .loc 1 583 4 view .LVU207 + 583:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 764 .loc 1 583 17 is_stmt 0 view .LVU208 + 765 0000 014B ldr r3, .L60 + 766 0002 D869 ldr r0, [r3, #28] + 584:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 767 .loc 1 584 1 view .LVU209 + 768 0004 7047 bx lr + 769 .L61: + 770 0006 00BF .align 2 + 771 .L60: + 772 0008 00000000 .word pFlash + 773 .cfi_endproc + 774 .LFE140: + 776 .section .text.FLASH_WaitForLastOperation,"ax",%progbits + 777 .align 1 + 778 .global FLASH_WaitForLastOperation + 779 .syntax unified + 780 .thumb + 781 .thumb_func + 783 FLASH_WaitForLastOperation: + 784 .LVL37: + 785 .LFB142: + 622:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Wait for the FLASH operation to complete by polling on BUSY flag to be reset. + 786 .loc 1 622 1 is_stmt 1 view -0 + 787 .cfi_startproc + 788 @ args = 0, pretend = 0, frame = 0 + 789 @ frame_needed = 0, uses_anonymous_args = 0 + 622:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Wait for the FLASH operation to complete by polling on BUSY flag to be reset. + 790 .loc 1 622 1 is_stmt 0 view .LVU211 + 791 0000 38B5 push {r3, r4, r5, lr} + 792 .cfi_def_cfa_offset 16 + 793 .cfi_offset 3, -16 + 794 .cfi_offset 4, -12 + 795 .cfi_offset 5, -8 + 796 .cfi_offset 14, -4 + 797 0002 0446 mov r4, r0 + 627:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 798 .loc 1 627 3 is_stmt 1 view .LVU212 + 627:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 799 .loc 1 627 24 is_stmt 0 view .LVU213 + 800 0004 FFF7FEFF bl HAL_GetTick + 801 .LVL38: + 627:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 802 .loc 1 627 24 view .LVU214 + 803 0008 0546 mov r5, r0 + 804 .LVL39: + 629:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 805 .loc 1 629 3 is_stmt 1 view .LVU215 + 806 .L64: + 629:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + ARM GAS /tmp/ccX3tCBb.s page 30 + + + 807 .loc 1 629 9 view .LVU216 + 808 000a 144B ldr r3, .L73 + 809 000c DB68 ldr r3, [r3, #12] + 810 000e 13F0010F tst r3, #1 + 811 0012 0AD0 beq .L72 + 631:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 812 .loc 1 631 5 view .LVU217 + 631:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 813 .loc 1 631 8 is_stmt 0 view .LVU218 + 814 0014 B4F1FF3F cmp r4, #-1 + 815 0018 F7D0 beq .L64 + 633:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 816 .loc 1 633 7 is_stmt 1 view .LVU219 + 633:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 817 .loc 1 633 9 is_stmt 0 view .LVU220 + 818 001a 24B1 cbz r4, .L65 + 633:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 819 .loc 1 633 31 discriminator 1 view .LVU221 + 820 001c FFF7FEFF bl HAL_GetTick + 821 .LVL40: + 633:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 822 .loc 1 633 44 discriminator 1 view .LVU222 + 823 0020 401B subs r0, r0, r5 + 633:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 824 .loc 1 633 26 discriminator 1 view .LVU223 + 825 0022 A042 cmp r0, r4 + 826 0024 F1D9 bls .L64 + 827 .L65: + 635:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 828 .loc 1 635 9 is_stmt 1 view .LVU224 + 635:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 829 .loc 1 635 16 is_stmt 0 view .LVU225 + 830 0026 0320 movs r0, #3 + 831 0028 12E0 b .L66 + 832 .L72: + 641:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 833 .loc 1 641 3 is_stmt 1 view .LVU226 + 641:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 834 .loc 1 641 7 is_stmt 0 view .LVU227 + 835 002a 0C4B ldr r3, .L73 + 836 002c DB68 ldr r3, [r3, #12] + 641:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 837 .loc 1 641 6 view .LVU228 + 838 002e 13F0200F tst r3, #32 + 839 0032 02D0 beq .L68 + 644:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 840 .loc 1 644 5 is_stmt 1 view .LVU229 + 841 0034 094B ldr r3, .L73 + 842 0036 2022 movs r2, #32 + 843 0038 DA60 str r2, [r3, #12] + 844 .L68: + 647:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** __HAL_FLASH_GET_FLAG(FLASH_FLAG_PGERR)) + 845 .loc 1 647 3 view .LVU230 + 647:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** __HAL_FLASH_GET_FLAG(FLASH_FLAG_PGERR)) + 846 .loc 1 647 6 is_stmt 0 view .LVU231 + 847 003a 084B ldr r3, .L73 + 848 003c DB68 ldr r3, [r3, #12] + ARM GAS /tmp/ccX3tCBb.s page 31 + + + 647:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** __HAL_FLASH_GET_FLAG(FLASH_FLAG_PGERR)) + 849 .loc 1 647 5 view .LVU232 + 850 003e 13F0100F tst r3, #16 + 851 0042 06D1 bne .L69 + 648:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 852 .loc 1 648 6 discriminator 1 view .LVU233 + 853 0044 054B ldr r3, .L73 + 854 0046 DB68 ldr r3, [r3, #12] + 647:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** __HAL_FLASH_GET_FLAG(FLASH_FLAG_PGERR)) + 855 .loc 1 647 47 discriminator 1 view .LVU234 + 856 0048 13F0040F tst r3, #4 + 857 004c 01D1 bne .L69 + 656:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 858 .loc 1 656 10 view .LVU235 + 859 004e 0020 movs r0, #0 + 860 .L66: + 657:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 861 .loc 1 657 1 view .LVU236 + 862 0050 38BD pop {r3, r4, r5, pc} + 863 .LVL41: + 864 .L69: + 651:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** return HAL_ERROR; + 865 .loc 1 651 5 is_stmt 1 view .LVU237 + 866 0052 FFF7FEFF bl FLASH_SetErrorCode + 867 .LVL42: + 652:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 868 .loc 1 652 5 view .LVU238 + 652:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 869 .loc 1 652 12 is_stmt 0 view .LVU239 + 870 0056 0120 movs r0, #1 + 871 0058 FAE7 b .L66 + 872 .L74: + 873 005a 00BF .align 2 + 874 .L73: + 875 005c 00200240 .word 1073881088 + 876 .cfi_endproc + 877 .LFE142: + 879 .section .text.HAL_FLASH_Program,"ax",%progbits + 880 .align 1 + 881 .global HAL_FLASH_Program + 882 .syntax unified + 883 .thumb + 884 .thumb_func + 886 HAL_FLASH_Program: + 887 .LVL43: + 888 .LFB130: + 169:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** HAL_StatusTypeDef status = HAL_ERROR; + 889 .loc 1 169 1 is_stmt 1 view -0 + 890 .cfi_startproc + 891 @ args = 0, pretend = 0, frame = 0 + 892 @ frame_needed = 0, uses_anonymous_args = 0 + 169:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** HAL_StatusTypeDef status = HAL_ERROR; + 893 .loc 1 169 1 is_stmt 0 view .LVU241 + 894 0000 2DE9F843 push {r3, r4, r5, r6, r7, r8, r9, lr} + 895 .cfi_def_cfa_offset 32 + 896 .cfi_offset 3, -32 + 897 .cfi_offset 4, -28 + ARM GAS /tmp/ccX3tCBb.s page 32 + + + 898 .cfi_offset 5, -24 + 899 .cfi_offset 6, -20 + 900 .cfi_offset 7, -16 + 901 .cfi_offset 8, -12 + 902 .cfi_offset 9, -8 + 903 .cfi_offset 14, -4 + 904 0004 1E46 mov r6, r3 + 170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** uint8_t index = 0U; + 905 .loc 1 170 3 is_stmt 1 view .LVU242 + 906 .LVL44: + 171:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** uint8_t nbiterations = 0U; + 907 .loc 1 171 3 view .LVU243 + 172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 908 .loc 1 172 3 view .LVU244 + 175:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 909 .loc 1 175 3 view .LVU245 + 175:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 910 .loc 1 175 3 view .LVU246 + 911 0006 244B ldr r3, .L87 + 912 0008 1B7E ldrb r3, [r3, #24] @ zero_extendqisi2 + 913 000a 012B cmp r3, #1 + 914 000c 41D0 beq .L81 + 915 000e 0446 mov r4, r0 + 916 0010 0F46 mov r7, r1 + 917 0012 9046 mov r8, r2 + 175:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 918 .loc 1 175 3 discriminator 2 view .LVU247 + 919 0014 204B ldr r3, .L87 + 920 0016 0122 movs r2, #1 + 921 .LVL45: + 175:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 922 .loc 1 175 3 is_stmt 0 discriminator 2 view .LVU248 + 923 0018 1A76 strb r2, [r3, #24] + 175:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 924 .loc 1 175 3 is_stmt 1 discriminator 2 view .LVU249 + 178:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** assert_param(IS_FLASH_PROGRAM_ADDRESS(Address)); + 925 .loc 1 178 3 discriminator 2 view .LVU250 + 179:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 926 .loc 1 179 3 discriminator 2 view .LVU251 + 182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 927 .loc 1 182 5 discriminator 2 view .LVU252 + 182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 928 .loc 1 182 14 is_stmt 0 discriminator 2 view .LVU253 + 929 001a 4CF25030 movw r0, #50000 + 930 .LVL46: + 182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 931 .loc 1 182 14 discriminator 2 view .LVU254 + 932 001e FFF7FEFF bl FLASH_WaitForLastOperation + 933 .LVL47: + 184:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 934 .loc 1 184 3 is_stmt 1 discriminator 2 view .LVU255 + 184:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 935 .loc 1 184 5 is_stmt 0 discriminator 2 view .LVU256 + 936 0022 0346 mov r3, r0 + 937 0024 78BB cbnz r0, .L77 + 186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 938 .loc 1 186 5 is_stmt 1 view .LVU257 + ARM GAS /tmp/ccX3tCBb.s page 33 + + + 186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 939 .loc 1 186 7 is_stmt 0 view .LVU258 + 940 0026 012C cmp r4, #1 + 941 0028 08D0 beq .L82 + 191:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 942 .loc 1 191 10 is_stmt 1 view .LVU259 + 191:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 943 .loc 1 191 12 is_stmt 0 view .LVU260 + 944 002a 022C cmp r4, #2 + 945 002c 03D0 beq .L85 + 199:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 946 .loc 1 199 20 view .LVU261 + 947 002e 4FF00409 mov r9, #4 + 948 .L78: + 949 .LVL48: + 202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 950 .loc 1 202 5 is_stmt 1 view .LVU262 + 202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 951 .loc 1 202 16 is_stmt 0 view .LVU263 + 952 0032 1C46 mov r4, r3 + 953 .LVL49: + 202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 954 .loc 1 202 5 view .LVU264 + 955 0034 07E0 b .L79 + 956 .LVL50: + 957 .L85: + 194:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 958 .loc 1 194 20 view .LVU265 + 959 0036 4FF00209 mov r9, #2 + 960 003a FAE7 b .L78 + 961 .L82: + 189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 962 .loc 1 189 20 view .LVU266 + 963 003c 4FF00109 mov r9, #1 + 964 0040 F7E7 b .L78 + 965 .LVL51: + 966 .L86: + 202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 967 .loc 1 202 49 is_stmt 1 discriminator 2 view .LVU267 + 968 0042 0134 adds r4, r4, #1 + 969 .LVL52: + 202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 970 .loc 1 202 49 is_stmt 0 discriminator 2 view .LVU268 + 971 0044 E4B2 uxtb r4, r4 + 972 .LVL53: + 973 .L79: + 202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 974 .loc 1 202 28 is_stmt 1 discriminator 1 view .LVU269 + 975 0046 4C45 cmp r4, r9 + 976 0048 1DD2 bcs .L77 + 204:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 977 .loc 1 204 7 view .LVU270 + 204:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 978 .loc 1 204 77 is_stmt 0 view .LVU271 + 979 004a 2101 lsls r1, r4, #4 + 204:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 980 .loc 1 204 70 view .LVU272 + ARM GAS /tmp/ccX3tCBb.s page 34 + + + 981 004c C1F12002 rsb r2, r1, #32 + 982 0050 A1F12003 sub r3, r1, #32 + 983 .LVL54: + 204:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 984 .loc 1 204 70 view .LVU273 + 985 0054 28FA01F1 lsr r1, r8, r1 + 986 0058 06FA02F2 lsl r2, r6, r2 + 987 005c 1143 orrs r1, r1, r2 + 988 005e 26FA03F3 lsr r3, r6, r3 + 989 0062 1943 orrs r1, r1, r3 + 204:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 990 .loc 1 204 7 view .LVU274 + 991 0064 89B2 uxth r1, r1 + 992 0066 07EB4400 add r0, r7, r4, lsl #1 + 993 006a FFF7FEFF bl FLASH_Program_HalfWord + 994 .LVL55: + 207:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 995 .loc 1 207 9 is_stmt 1 view .LVU275 + 207:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 996 .loc 1 207 18 is_stmt 0 view .LVU276 + 997 006e 4CF25030 movw r0, #50000 + 998 0072 FFF7FEFF bl FLASH_WaitForLastOperation + 999 .LVL56: + 210:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* In case of error, stop programming procedure */ + 1000 .loc 1 210 9 is_stmt 1 view .LVU277 + 1001 0076 094B ldr r3, .L87+4 + 1002 0078 1D69 ldr r5, [r3, #16] + 1003 007a 25F00105 bic r5, r5, #1 + 1004 007e 1D61 str r5, [r3, #16] + 212:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 1005 .loc 1 212 7 view .LVU278 + 212:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** { + 1006 .loc 1 212 10 is_stmt 0 view .LVU279 + 1007 0080 0346 mov r3, r0 + 1008 0082 0028 cmp r0, #0 + 1009 0084 DDD0 beq .L86 + 1010 .LVL57: + 1011 .L77: + 220:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 1012 .loc 1 220 3 is_stmt 1 view .LVU280 + 220:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 1013 .loc 1 220 3 view .LVU281 + 1014 0086 044A ldr r2, .L87 + 1015 0088 0021 movs r1, #0 + 1016 008a 1176 strb r1, [r2, #24] + 220:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 1017 .loc 1 220 3 view .LVU282 + 222:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 1018 .loc 1 222 3 view .LVU283 + 1019 .LVL58: + 1020 .L76: + 223:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 1021 .loc 1 223 1 is_stmt 0 view .LVU284 + 1022 008c 1846 mov r0, r3 + 1023 008e BDE8F883 pop {r3, r4, r5, r6, r7, r8, r9, pc} + 1024 .LVL59: + 1025 .L81: + ARM GAS /tmp/ccX3tCBb.s page 35 + + + 175:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 1026 .loc 1 175 3 view .LVU285 + 1027 0092 0223 movs r3, #2 + 1028 0094 FAE7 b .L76 + 1029 .L88: + 1030 0096 00BF .align 2 + 1031 .L87: + 1032 0098 00000000 .word pFlash + 1033 009c 00200240 .word 1073881088 + 1034 .cfi_endproc + 1035 .LFE130: + 1037 .section .text.HAL_FLASH_OB_Launch,"ax",%progbits + 1038 .align 1 + 1039 .global HAL_FLASH_OB_Launch + 1040 .syntax unified + 1041 .thumb + 1042 .thumb_func + 1044 HAL_FLASH_OB_Launch: + 1045 .LFB139: + 550:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** /* Set the OBL_Launch bit to launch the option byte loading */ + 1046 .loc 1 550 1 is_stmt 1 view -0 + 1047 .cfi_startproc + 1048 @ args = 0, pretend = 0, frame = 0 + 1049 @ frame_needed = 0, uses_anonymous_args = 0 + 1050 0000 08B5 push {r3, lr} + 1051 .cfi_def_cfa_offset 8 + 1052 .cfi_offset 3, -8 + 1053 .cfi_offset 14, -4 + 552:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 1054 .loc 1 552 3 view .LVU287 + 1055 0002 054A ldr r2, .L91 + 1056 0004 1369 ldr r3, [r2, #16] + 1057 0006 43F40053 orr r3, r3, #8192 + 1058 000a 1361 str r3, [r2, #16] + 555:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 1059 .loc 1 555 3 view .LVU288 + 555:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** } + 1060 .loc 1 555 10 is_stmt 0 view .LVU289 + 1061 000c 4CF25030 movw r0, #50000 + 1062 0010 FFF7FEFF bl FLASH_WaitForLastOperation + 1063 .LVL60: + 556:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash.c **** + 1064 .loc 1 556 1 view .LVU290 + 1065 0014 08BD pop {r3, pc} + 1066 .L92: + 1067 0016 00BF .align 2 + 1068 .L91: + 1069 0018 00200240 .word 1073881088 + 1070 .cfi_endproc + 1071 .LFE139: + 1073 .global pFlash + 1074 .section .bss.pFlash,"aw",%nobits + 1075 .align 3 + 1078 pFlash: + 1079 0000 00000000 .space 32 + 1079 00000000 + 1079 00000000 + ARM GAS /tmp/ccX3tCBb.s page 36 + + + 1079 00000000 + 1079 00000000 + 1080 .text + 1081 .Letext0: + 1082 .file 2 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 1083 .file 3 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 1084 .file 4 "Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h" + 1085 .file 5 "Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h" + 1086 .file 6 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h" + 1087 .file 7 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h" + 1088 .file 8 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h" + ARM GAS /tmp/ccX3tCBb.s page 37 + + +DEFINED SYMBOLS + *ABS*:0000000000000000 stm32f3xx_hal_flash.c + /tmp/ccX3tCBb.s:21 .text.FLASH_Program_HalfWord:0000000000000000 $t + /tmp/ccX3tCBb.s:26 .text.FLASH_Program_HalfWord:0000000000000000 FLASH_Program_HalfWord + /tmp/ccX3tCBb.s:52 .text.FLASH_Program_HalfWord:0000000000000014 $d + /tmp/ccX3tCBb.s:1078 .bss.pFlash:0000000000000000 pFlash + /tmp/ccX3tCBb.s:58 .text.FLASH_SetErrorCode:0000000000000000 $t + /tmp/ccX3tCBb.s:63 .text.FLASH_SetErrorCode:0000000000000000 FLASH_SetErrorCode + /tmp/ccX3tCBb.s:119 .text.FLASH_SetErrorCode:0000000000000034 $d + /tmp/ccX3tCBb.s:125 .text.HAL_FLASH_Program_IT:0000000000000000 $t + /tmp/ccX3tCBb.s:131 .text.HAL_FLASH_Program_IT:0000000000000000 HAL_FLASH_Program_IT + /tmp/ccX3tCBb.s:241 .text.HAL_FLASH_Program_IT:0000000000000064 $d + /tmp/ccX3tCBb.s:247 .text.HAL_FLASH_EndOfOperationCallback:0000000000000000 $t + /tmp/ccX3tCBb.s:253 .text.HAL_FLASH_EndOfOperationCallback:0000000000000000 HAL_FLASH_EndOfOperationCallback + /tmp/ccX3tCBb.s:268 .text.HAL_FLASH_OperationErrorCallback:0000000000000000 $t + /tmp/ccX3tCBb.s:274 .text.HAL_FLASH_OperationErrorCallback:0000000000000000 HAL_FLASH_OperationErrorCallback + /tmp/ccX3tCBb.s:289 .text.HAL_FLASH_IRQHandler:0000000000000000 $t + /tmp/ccX3tCBb.s:295 .text.HAL_FLASH_IRQHandler:0000000000000000 HAL_FLASH_IRQHandler + /tmp/ccX3tCBb.s:582 .text.HAL_FLASH_IRQHandler:000000000000014c $d + /tmp/ccX3tCBb.s:588 .text.HAL_FLASH_Unlock:0000000000000000 $t + /tmp/ccX3tCBb.s:594 .text.HAL_FLASH_Unlock:0000000000000000 HAL_FLASH_Unlock + /tmp/ccX3tCBb.s:639 .text.HAL_FLASH_Unlock:000000000000002c $d + /tmp/ccX3tCBb.s:645 .text.HAL_FLASH_Lock:0000000000000000 $t + /tmp/ccX3tCBb.s:651 .text.HAL_FLASH_Lock:0000000000000000 HAL_FLASH_Lock + /tmp/ccX3tCBb.s:670 .text.HAL_FLASH_Lock:0000000000000010 $d + /tmp/ccX3tCBb.s:675 .text.HAL_FLASH_OB_Unlock:0000000000000000 $t + /tmp/ccX3tCBb.s:681 .text.HAL_FLASH_OB_Unlock:0000000000000000 HAL_FLASH_OB_Unlock + /tmp/ccX3tCBb.s:714 .text.HAL_FLASH_OB_Unlock:0000000000000020 $d + /tmp/ccX3tCBb.s:720 .text.HAL_FLASH_OB_Lock:0000000000000000 $t + /tmp/ccX3tCBb.s:726 .text.HAL_FLASH_OB_Lock:0000000000000000 HAL_FLASH_OB_Lock + /tmp/ccX3tCBb.s:745 .text.HAL_FLASH_OB_Lock:0000000000000010 $d + /tmp/ccX3tCBb.s:750 .text.HAL_FLASH_GetError:0000000000000000 $t + /tmp/ccX3tCBb.s:756 .text.HAL_FLASH_GetError:0000000000000000 HAL_FLASH_GetError + /tmp/ccX3tCBb.s:772 .text.HAL_FLASH_GetError:0000000000000008 $d + /tmp/ccX3tCBb.s:777 .text.FLASH_WaitForLastOperation:0000000000000000 $t + /tmp/ccX3tCBb.s:783 .text.FLASH_WaitForLastOperation:0000000000000000 FLASH_WaitForLastOperation + /tmp/ccX3tCBb.s:875 .text.FLASH_WaitForLastOperation:000000000000005c $d + /tmp/ccX3tCBb.s:880 .text.HAL_FLASH_Program:0000000000000000 $t + /tmp/ccX3tCBb.s:886 .text.HAL_FLASH_Program:0000000000000000 HAL_FLASH_Program + /tmp/ccX3tCBb.s:1032 .text.HAL_FLASH_Program:0000000000000098 $d + /tmp/ccX3tCBb.s:1038 .text.HAL_FLASH_OB_Launch:0000000000000000 $t + /tmp/ccX3tCBb.s:1044 .text.HAL_FLASH_OB_Launch:0000000000000000 HAL_FLASH_OB_Launch + /tmp/ccX3tCBb.s:1069 .text.HAL_FLASH_OB_Launch:0000000000000018 $d + /tmp/ccX3tCBb.s:1075 .bss.pFlash:0000000000000000 $d + +UNDEFINED SYMBOLS +FLASH_PageErase +HAL_GetTick diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_flash.o b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_flash.o new file mode 100644 index 0000000000000000000000000000000000000000..4e7d99f44764f673b4ab832e0d558c3a4a8066b9 GIT binary patch literal 13736 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
    © Copyright (c) 2016 STMicroelectronics. + ARM GAS /tmp/ccLRLOP3.s page 2 + + + 32:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * All rights reserved.

    =C<>wzJYc{M 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 literal 0 HcmV?d00001 diff --git a/BMS_Testbench/BMS_Software_V1/Debug/Core/Src/main.su b/BMS_Testbench/BMS_Software_V1/Debug/Core/Src/main.su new file mode 100644 index 0000000..6efb383 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Debug/Core/Src/main.su @@ -0,0 +1,12 @@ +../Core/Src/main.c:88:5:main 40 static +../Core/Src/main.c:163:6:SystemClock_Config 120 static +../Core/Src/main.c:209:13:MX_CAN_Init 8 static +../Core/Src/main.c:246:13:MX_I2C1_Init 8 static +../Core/Src/main.c:294:13:MX_I2C2_Init 8 static +../Core/Src/main.c:342:13:MX_SPI1_Init 8 static +../Core/Src/main.c:382:13:MX_GPIO_Init 40 static +../Core/Src/main.c:414:19:sensor_init 32 static +../Core/Src/main.c:420:19:sensor_read 32 static +../Core/Src/main.c:432:9:readeeprom 40 static +../Core/Src/main.c:443:6:writeeeprom 32 static +../Core/Src/main.c:453:6:Error_Handler 4 static,ignoring_inline_asm diff --git a/BMS_Testbench/BMS_Software_V1/Debug/Core/Src/stm32f3xx_hal_msp.d b/BMS_Testbench/BMS_Software_V1/Debug/Core/Src/stm32f3xx_hal_msp.d new file mode 100644 index 0000000..0e6f5d4 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Debug/Core/Src/stm32f3xx_hal_msp.d @@ -0,0 +1,60 @@ +Core/Src/stm32f3xx_hal_msp.o: ../Core/Src/stm32f3xx_hal_msp.c \ + ../Core/Inc/main.h ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h \ + ../Core/Inc/stm32f3xx_hal_conf.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h \ + ../Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h \ + ../Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h \ + ../Drivers/CMSIS/Include/core_cm4.h \ + ../Drivers/CMSIS/Include/cmsis_version.h \ + ../Drivers/CMSIS/Include/cmsis_compiler.h \ + ../Drivers/CMSIS/Include/cmsis_gcc.h \ + ../Drivers/CMSIS/Include/mpu_armv7.h \ + ../Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h +../Core/Inc/main.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h: +../Core/Inc/stm32f3xx_hal_conf.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h: +../Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h: +../Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h: +../Drivers/CMSIS/Include/core_cm4.h: +../Drivers/CMSIS/Include/cmsis_version.h: +../Drivers/CMSIS/Include/cmsis_compiler.h: +../Drivers/CMSIS/Include/cmsis_gcc.h: +../Drivers/CMSIS/Include/mpu_armv7.h: +../Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h: diff --git a/BMS_Testbench/BMS_Software_V1/Debug/Core/Src/stm32f3xx_hal_msp.o b/BMS_Testbench/BMS_Software_V1/Debug/Core/Src/stm32f3xx_hal_msp.o new file mode 100644 index 0000000000000000000000000000000000000000..e52248719dc77384174bad588c08495af405873e GIT binary patch literal 902700 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

  • + 33:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * + 34:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * This software component is licensed by ST under BSD 3-Clause license, + 35:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * the "License"; You may not use this file except in compliance with the + 36:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * License. You may obtain a copy of the License at: + 37:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * opensource.org/licenses/BSD-3-Clause + 38:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * + 39:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** ****************************************************************************** + 40:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** */ + 41:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 42:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Includes ------------------------------------------------------------------*/ + 43:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #include "stm32f3xx_hal.h" + 44:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 45:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /** @addtogroup STM32F3xx_HAL_Driver + 46:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @{ + 47:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** */ + 48:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #ifdef HAL_FLASH_MODULE_ENABLED + 49:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 50:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /** @addtogroup FLASH + 51:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @{ + 52:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** */ + 53:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /** @addtogroup FLASH_Private_Variables + 54:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @{ + 55:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** */ + 56:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Variables used for Erase pages under interruption*/ + 57:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** extern FLASH_ProcessTypeDef pFlash; + 58:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /** + 59:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @} + 60:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** */ + 61:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 62:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /** + 63:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @} + 64:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** */ + 65:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 66:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /** @defgroup FLASHEx FLASHEx + 67:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @brief FLASH HAL Extension module driver + 68:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @{ + 69:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** */ + 70:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 71:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Private typedef -----------------------------------------------------------*/ + 72:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Private define ------------------------------------------------------------*/ + 73:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /** @defgroup FLASHEx_Private_Constants FLASHEx Private Constants + 74:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @{ + 75:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** */ + 76:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #define FLASH_POSITION_IWDGSW_BIT (uint32_t)POSITION_VAL(FLASH_OBR_IWDG_SW) + 77:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #define FLASH_POSITION_OB_USERDATA0_BIT (uint32_t)POSITION_VAL(FLASH_OBR_DATA0) + 78:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #define FLASH_POSITION_OB_USERDATA1_BIT (uint32_t)POSITION_VAL(FLASH_OBR_DATA1) + 79:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /** + 80:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @} + 81:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** */ + 82:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 83:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Private macro -------------------------------------------------------------*/ + 84:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /** @defgroup FLASHEx_Private_Macros FLASHEx Private Macros + 85:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @{ + 86:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** */ + 87:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /** + 88:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @} + ARM GAS /tmp/ccLRLOP3.s page 3 + + + 89:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** */ + 90:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 91:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Private variables ---------------------------------------------------------*/ + 92:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Private function prototypes -----------------------------------------------*/ + 93:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /** @defgroup FLASHEx_Private_Functions FLASHEx Private Functions + 94:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @{ + 95:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** */ + 96:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Erase operations */ + 97:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** static void FLASH_MassErase(void); + 98:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** void FLASH_PageErase(uint32_t PageAddress); + 99:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 100:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Option bytes control */ + 101:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WriteProtectPage); + 102:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WriteProtectPage); + 103:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** static HAL_StatusTypeDef FLASH_OB_RDP_LevelConfig(uint8_t ReadProtectLevel); + 104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** static HAL_StatusTypeDef FLASH_OB_UserConfig(uint8_t UserConfig); + 105:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** static HAL_StatusTypeDef FLASH_OB_ProgramData(uint32_t Address, uint8_t Data); + 106:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** static uint32_t FLASH_OB_GetWRP(void); + 107:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** static uint32_t FLASH_OB_GetRDP(void); + 108:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** static uint8_t FLASH_OB_GetUser(void); + 109:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 110:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /** + 111:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @} + 112:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** */ + 113:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 114:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Exported functions ---------------------------------------------------------*/ + 115:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /** @defgroup FLASHEx_Exported_Functions FLASHEx Exported Functions + 116:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @{ + 117:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** */ + 118:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 119:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /** @defgroup FLASHEx_Exported_Functions_Group1 FLASHEx Memory Erasing functions + 120:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @brief FLASH Memory Erasing functions + 121:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * + 122:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** @verbatim + 123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** ============================================================================== + 124:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** ##### FLASH Erasing Programming functions ##### + 125:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** ============================================================================== + 126:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 127:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** [..] The FLASH Memory Erasing functions, includes the following functions: + 128:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** (+) HAL_FLASHEx_Erase: return only when erase has been done + 129:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** (+) HAL_FLASHEx_Erase_IT: end of erase is done when HAL_FLASH_EndOfOperationCallback + 130:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** is called with parameter 0xFFFFFFFF + 131:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 132:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** [..] Any operation of erase should follow these steps: + 133:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** (#) Call the HAL_FLASH_Unlock() function to enable the flash control register and + 134:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** program memory access. + 135:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** (#) Call the desired function to erase page. + 136:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** (#) Call the HAL_FLASH_Lock() to disable the flash program memory access + 137:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** (recommended to protect the FLASH memory against possible unwanted operation). + 138:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** @endverbatim + 140:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @{ + 141:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** */ + 142:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 143:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 144:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /** + 145:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @brief Perform a mass erase or erase the specified FLASH memory pages + ARM GAS /tmp/ccLRLOP3.s page 4 + + + 146:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @note To correctly run this function, the @ref HAL_FLASH_Unlock() function + 147:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * must be called before. + 148:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * Call the @ref HAL_FLASH_Lock() to disable the flash memory access + 149:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * (recommended to protect the FLASH memory against possible unwanted operation) + 150:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @param[in] pEraseInit pointer to an FLASH_EraseInitTypeDef structure that + 151:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * contains the configuration information for the erasing. + 152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * + 153:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @param[out] PageError pointer to variable that + 154:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * contains the configuration information on faulty page in case of error + 155:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * (0xFFFFFFFF means that all the pages have been correctly erased) + 156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * + 157:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @retval HAL_StatusTypeDef HAL Status + 158:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** */ + 159:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *PageError) + 160:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** HAL_StatusTypeDef status = HAL_ERROR; + 162:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** uint32_t address = 0U; + 163:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 164:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Process Locked */ + 165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** __HAL_LOCK(&pFlash); + 166:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Check the parameters */ + 168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** assert_param(IS_FLASH_TYPEERASE(pEraseInit->TypeErase)); + 169:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if (pEraseInit->TypeErase == FLASH_TYPEERASE_MASSERASE) + 171:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Mass Erase requested for Bank1 */ + 173:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Wait for last operation to be completed */ + 174:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if (FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE) == HAL_OK) + 175:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 176:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /*Mass erase to be done*/ + 177:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** FLASH_MassErase(); + 178:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 179:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Wait for last operation to be completed */ + 180:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + 181:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* If the erase operation is completed, disable the MER Bit */ + 183:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** CLEAR_BIT(FLASH->CR, FLASH_CR_MER); + 184:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 185:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** else + 187:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 188:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Page Erase is requested */ + 189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Check the parameters */ + 190:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** assert_param(IS_FLASH_PROGRAM_ADDRESS(pEraseInit->PageAddress)); + 191:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** assert_param(IS_FLASH_NB_PAGES(pEraseInit->PageAddress, pEraseInit->NbPages)); + 192:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 193:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Page Erase requested on address located on bank1 */ + 194:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Wait for last operation to be completed */ + 195:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if (FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE) == HAL_OK) + 196:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 197:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /*Initialization of PageError variable*/ + 198:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** *PageError = 0xFFFFFFFFU; + 199:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 200:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Erase page by page to be done*/ + 201:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** for(address = pEraseInit->PageAddress; + 202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** address < ((pEraseInit->NbPages * FLASH_PAGE_SIZE) + pEraseInit->PageAddress); + ARM GAS /tmp/ccLRLOP3.s page 5 + + + 203:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** address += FLASH_PAGE_SIZE) + 204:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 205:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** FLASH_PageErase(address); + 206:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 207:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Wait for last operation to be completed */ + 208:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + 209:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 210:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* If the erase operation is completed, disable the PER Bit */ + 211:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** CLEAR_BIT(FLASH->CR, FLASH_CR_PER); + 212:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if (status != HAL_OK) + 214:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 215:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* In case of error, stop erase procedure and return the faulty address */ + 216:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** *PageError = address; + 217:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** break; + 218:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 219:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 220:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 221:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 222:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 223:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Process Unlocked */ + 224:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** __HAL_UNLOCK(&pFlash); + 225:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 226:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** return status; + 227:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 228:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 229:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /** + 230:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @brief Perform a mass erase or erase the specified FLASH memory pages with interrupt enabled + 231:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @note To correctly run this function, the @ref HAL_FLASH_Unlock() function + 232:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * must be called before. + 233:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * Call the @ref HAL_FLASH_Lock() to disable the flash memory access + 234:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * (recommended to protect the FLASH memory against possible unwanted operation) + 235:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @param pEraseInit pointer to an FLASH_EraseInitTypeDef structure that + 236:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * contains the configuration information for the erasing. + 237:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * + 238:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @retval HAL_StatusTypeDef HAL Status + 239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** */ + 240:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** HAL_StatusTypeDef HAL_FLASHEx_Erase_IT(FLASH_EraseInitTypeDef *pEraseInit) + 241:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 242:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** HAL_StatusTypeDef status = HAL_OK; + 243:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 244:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Process Locked */ + 245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** __HAL_LOCK(&pFlash); + 246:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 247:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* If procedure already ongoing, reject the next one */ + 248:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if (pFlash.ProcedureOnGoing != FLASH_PROC_NONE) + 249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 250:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** return HAL_ERROR; + 251:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 252:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 253:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Check the parameters */ + 254:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** assert_param(IS_FLASH_TYPEERASE(pEraseInit->TypeErase)); + 255:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 256:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Enable End of FLASH Operation and Error source interrupts */ + 257:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** __HAL_FLASH_ENABLE_IT(FLASH_IT_EOP | FLASH_IT_ERR); + 258:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if (pEraseInit->TypeErase == FLASH_TYPEERASE_MASSERASE) + ARM GAS /tmp/ccLRLOP3.s page 6 + + + 260:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 261:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /*Mass erase to be done*/ + 262:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** pFlash.ProcedureOnGoing = FLASH_PROC_MASSERASE; + 263:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** FLASH_MassErase(); + 264:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 265:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** else + 266:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 267:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Erase by page to be done*/ + 268:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 269:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Check the parameters */ + 270:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** assert_param(IS_FLASH_PROGRAM_ADDRESS(pEraseInit->PageAddress)); + 271:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** assert_param(IS_FLASH_NB_PAGES(pEraseInit->PageAddress, pEraseInit->NbPages)); + 272:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 273:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** pFlash.ProcedureOnGoing = FLASH_PROC_PAGEERASE; + 274:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** pFlash.DataRemaining = pEraseInit->NbPages; + 275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** pFlash.Address = pEraseInit->PageAddress; + 276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 277:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /*Erase 1st page and wait for IT*/ + 278:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** FLASH_PageErase(pEraseInit->PageAddress); + 279:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 280:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 281:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** return status; + 282:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 283:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 284:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /** + 285:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @} + 286:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** */ + 287:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /** @defgroup FLASHEx_Exported_Functions_Group2 Option Bytes Programming functions + 289:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @brief Option Bytes Programming functions + 290:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * + 291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** @verbatim + 292:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** ============================================================================== + 293:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** ##### Option Bytes Programming functions ##### + 294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** ============================================================================== + 295:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** [..] + 296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** This subsection provides a set of functions allowing to control the FLASH + 297:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** option bytes operations. + 298:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 299:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** @endverbatim + 300:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @{ + 301:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** */ + 302:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 303:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /** + 304:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @brief Erases the FLASH option bytes. + 305:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @note This functions erases all option bytes except the Read protection (RDP). + 306:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * The function @ref HAL_FLASH_Unlock() should be called before to unlock the FLASH interf + 307:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * The function @ref HAL_FLASH_OB_Unlock() should be called before to unlock the options b + 308:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * The function @ref HAL_FLASH_OB_Launch() should be called after to force the reload of t + 309:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * (system reset will occur) + 310:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @retval HAL status + 311:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** */ + 312:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 313:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** HAL_StatusTypeDef HAL_FLASHEx_OBErase(void) + 314:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** uint8_t rdptmp = OB_RDP_LEVEL_0; + 316:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** HAL_StatusTypeDef status = HAL_ERROR; + ARM GAS /tmp/ccLRLOP3.s page 7 + + + 317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 318:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Get the actual read protection Option Byte value */ + 319:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** rdptmp = FLASH_OB_GetRDP(); + 320:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 321:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Wait for last operation to be completed */ + 322:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + 323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 324:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if(status == HAL_OK) + 325:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 326:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Clean the error context */ + 327:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** pFlash.ErrorCode = HAL_FLASH_ERROR_NONE; + 328:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 329:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* If the previous operation is completed, proceed to erase the option bytes */ + 330:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** SET_BIT(FLASH->CR, FLASH_CR_OPTER); + 331:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** SET_BIT(FLASH->CR, FLASH_CR_STRT); + 332:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 333:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Wait for last operation to be completed */ + 334:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + 335:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* If the erase operation is completed, disable the OPTER Bit */ + 337:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** CLEAR_BIT(FLASH->CR, FLASH_CR_OPTER); + 338:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 339:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if(status == HAL_OK) + 340:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 341:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Restore the last read protection Option Byte value */ + 342:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** status = FLASH_OB_RDP_LevelConfig(rdptmp); + 343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 344:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 345:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Return the erase status */ + 347:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** return status; + 348:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 349:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 350:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /** + 351:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @brief Program option bytes + 352:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @note The function @ref HAL_FLASH_Unlock() should be called before to unlock the FLASH interf + 353:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * The function @ref HAL_FLASH_OB_Unlock() should be called before to unlock the options b + 354:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * The function @ref HAL_FLASH_OB_Launch() should be called after to force the reload of t + 355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * (system reset will occur) + 356:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * + 357:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @param pOBInit pointer to an FLASH_OBInitStruct structure that + 358:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * contains the configuration information for the programming. + 359:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * + 360:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @retval HAL_StatusTypeDef HAL Status + 361:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** */ + 362:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** HAL_StatusTypeDef HAL_FLASHEx_OBProgram(FLASH_OBProgramInitTypeDef *pOBInit) + 363:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 364:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** HAL_StatusTypeDef status = HAL_ERROR; + 365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 366:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Process Locked */ + 367:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** __HAL_LOCK(&pFlash); + 368:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 369:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Check the parameters */ + 370:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** assert_param(IS_OPTIONBYTE(pOBInit->OptionType)); + 371:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 372:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Write protection configuration */ + 373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if((pOBInit->OptionType & OPTIONBYTE_WRP) == OPTIONBYTE_WRP) + ARM GAS /tmp/ccLRLOP3.s page 8 + + + 374:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 375:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** assert_param(IS_WRPSTATE(pOBInit->WRPState)); + 376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if (pOBInit->WRPState == OB_WRPSTATE_ENABLE) + 377:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 378:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Enable of Write protection on the selected page */ + 379:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** status = FLASH_OB_EnableWRP(pOBInit->WRPPage); + 380:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 381:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** else + 382:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Disable of Write protection on the selected page */ + 384:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** status = FLASH_OB_DisableWRP(pOBInit->WRPPage); + 385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if (status != HAL_OK) + 387:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 388:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Process Unlocked */ + 389:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** __HAL_UNLOCK(&pFlash); + 390:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** return status; + 391:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 392:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 393:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 394:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Read protection configuration */ + 395:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if((pOBInit->OptionType & OPTIONBYTE_RDP) == OPTIONBYTE_RDP) + 396:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 397:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** status = FLASH_OB_RDP_LevelConfig(pOBInit->RDPLevel); + 398:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if (status != HAL_OK) + 399:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 400:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Process Unlocked */ + 401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** __HAL_UNLOCK(&pFlash); + 402:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** return status; + 403:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 404:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 405:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 406:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* USER configuration */ + 407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if((pOBInit->OptionType & OPTIONBYTE_USER) == OPTIONBYTE_USER) + 408:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 409:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** status = FLASH_OB_UserConfig(pOBInit->USERConfig); + 410:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if (status != HAL_OK) + 411:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 412:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Process Unlocked */ + 413:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** __HAL_UNLOCK(&pFlash); + 414:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** return status; + 415:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 416:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 417:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 418:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* DATA configuration*/ + 419:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if((pOBInit->OptionType & OPTIONBYTE_DATA) == OPTIONBYTE_DATA) + 420:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 421:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** status = FLASH_OB_ProgramData(pOBInit->DATAAddress, pOBInit->DATAData); + 422:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if (status != HAL_OK) + 423:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 424:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Process Unlocked */ + 425:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** __HAL_UNLOCK(&pFlash); + 426:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** return status; + 427:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 428:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 429:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 430:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Process Unlocked */ + ARM GAS /tmp/ccLRLOP3.s page 9 + + + 431:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** __HAL_UNLOCK(&pFlash); + 432:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 433:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** return status; + 434:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 435:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 436:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /** + 437:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @brief Get the Option byte configuration + 438:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @param pOBInit pointer to an FLASH_OBInitStruct structure that + 439:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * contains the configuration information for the programming. + 440:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * + 441:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @retval None + 442:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** */ + 443:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** void HAL_FLASHEx_OBGetConfig(FLASH_OBProgramInitTypeDef *pOBInit) + 444:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 445:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** pOBInit->OptionType = OPTIONBYTE_WRP | OPTIONBYTE_RDP | OPTIONBYTE_USER; + 446:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 447:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /*Get WRP*/ + 448:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** pOBInit->WRPPage = FLASH_OB_GetWRP(); + 449:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 450:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /*Get RDP Level*/ + 451:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** pOBInit->RDPLevel = FLASH_OB_GetRDP(); + 452:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 453:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /*Get USER*/ + 454:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** pOBInit->USERConfig = FLASH_OB_GetUser(); + 455:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 456:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 457:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /** + 458:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @brief Get the Option byte user data + 459:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @param DATAAdress Address of the option byte DATA + 460:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * This parameter can be one of the following values: + 461:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @arg @ref OB_DATA_ADDRESS_DATA0 + 462:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @arg @ref OB_DATA_ADDRESS_DATA1 + 463:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @retval Value programmed in USER data + 464:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** */ + 465:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** uint32_t HAL_FLASHEx_OBGetUserData(uint32_t DATAAdress) + 466:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 467:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** uint32_t value = 0U; + 468:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 469:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if (DATAAdress == OB_DATA_ADDRESS_DATA0) + 470:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 471:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Get value programmed in OB USER Data0 */ + 472:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** value = READ_BIT(FLASH->OBR, FLASH_OBR_DATA0) >> FLASH_POSITION_OB_USERDATA0_BIT; + 473:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 474:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** else + 475:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 476:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Get value programmed in OB USER Data1 */ + 477:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** value = READ_BIT(FLASH->OBR, FLASH_OBR_DATA1) >> FLASH_POSITION_OB_USERDATA1_BIT; + 478:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 479:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 480:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** return value; + 481:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 482:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 483:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /** + 484:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @} + 485:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** */ + 486:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 487:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /** + ARM GAS /tmp/ccLRLOP3.s page 10 + + + 488:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @} + 489:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** */ + 490:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 491:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /** @addtogroup FLASHEx_Private_Functions + 492:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @{ + 493:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** */ + 494:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 495:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /** + 496:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @brief Full erase of FLASH memory Bank + 497:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * + 498:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @retval None + 499:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** */ + 500:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** static void FLASH_MassErase(void) + 501:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 28 .loc 1 501 1 view -0 + 29 .cfi_startproc + 30 @ args = 0, pretend = 0, frame = 0 + 31 @ frame_needed = 0, uses_anonymous_args = 0 + 32 @ link register save eliminated. + 502:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Clean the error context */ + 503:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** pFlash.ErrorCode = HAL_FLASH_ERROR_NONE; + 33 .loc 1 503 3 view .LVU1 + 34 .loc 1 503 20 is_stmt 0 view .LVU2 + 35 0000 064B ldr r3, .L2 + 36 0002 0022 movs r2, #0 + 37 0004 DA61 str r2, [r3, #28] + 504:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 505:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Only bank1 will be erased*/ + 506:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** SET_BIT(FLASH->CR, FLASH_CR_MER); + 38 .loc 1 506 5 is_stmt 1 view .LVU3 + 39 0006 064B ldr r3, .L2+4 + 40 0008 1A69 ldr r2, [r3, #16] + 41 000a 42F00402 orr r2, r2, #4 + 42 000e 1A61 str r2, [r3, #16] + 507:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** SET_BIT(FLASH->CR, FLASH_CR_STRT); + 43 .loc 1 507 5 view .LVU4 + 44 0010 1A69 ldr r2, [r3, #16] + 45 0012 42F04002 orr r2, r2, #64 + 46 0016 1A61 str r2, [r3, #16] + 508:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 47 .loc 1 508 1 is_stmt 0 view .LVU5 + 48 0018 7047 bx lr + 49 .L3: + 50 001a 00BF .align 2 + 51 .L2: + 52 001c 00000000 .word pFlash + 53 0020 00200240 .word 1073881088 + 54 .cfi_endproc + 55 .LFE136: + 57 .section .text.FLASH_OB_GetWRP,"ax",%progbits + 58 .align 1 + 59 .syntax unified + 60 .thumb + 61 .thumb_func + 63 FLASH_OB_GetWRP: + 64 .LFB142: + 509:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + ARM GAS /tmp/ccLRLOP3.s page 11 + + + 510:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /** + 511:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @brief Enable the write protection of the desired pages + 512:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @note An option byte erase is done automatically in this function. + 513:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @note When the memory read protection level is selected (RDP level = 1), + 514:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * it is not possible to program or erase the flash page i if + 515:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * debug features are connected or boot code is executed in RAM, even if nWRPi = 1 + 516:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * + 517:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @param WriteProtectPage specifies the page(s) to be write protected. + 518:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * The value of this parameter depend on device used within the same series + 519:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @retval HAL status + 520:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** */ + 521:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** static HAL_StatusTypeDef FLASH_OB_EnableWRP(uint32_t WriteProtectPage) + 522:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 523:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** HAL_StatusTypeDef status = HAL_OK; + 524:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** uint16_t WRP0_Data = 0xFFFFU; + 525:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #if defined(OB_WRP1_WRP1) + 526:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** uint16_t WRP1_Data = 0xFFFFU; + 527:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif /* OB_WRP1_WRP1 */ + 528:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #if defined(OB_WRP2_WRP2) + 529:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** uint16_t WRP2_Data = 0xFFFFU; + 530:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif /* OB_WRP2_WRP2 */ + 531:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #if defined(OB_WRP3_WRP3) + 532:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** uint16_t WRP3_Data = 0xFFFFU; + 533:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif /* OB_WRP3_WRP3 */ + 534:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 535:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Check the parameters */ + 536:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** assert_param(IS_OB_WRP(WriteProtectPage)); + 537:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 538:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Get current write protected pages and the new pages to be protected ******/ + 539:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** WriteProtectPage = (uint32_t)(~((~FLASH_OB_GetWRP()) | WriteProtectPage)); + 540:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 541:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #if defined(OB_WRP_PAGES0TO15MASK) + 542:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** WRP0_Data = (uint16_t)(WriteProtectPage & OB_WRP_PAGES0TO15MASK); + 543:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif /* OB_WRP_PAGES0TO31MASK */ + 544:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 545:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #if defined(OB_WRP_PAGES16TO31MASK) + 546:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** WRP1_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES16TO31MASK) >> 8U); + 547:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif /* OB_WRP_PAGES32TO63MASK */ + 548:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 549:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #if defined(OB_WRP_PAGES32TO47MASK) + 550:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** WRP2_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES32TO47MASK) >> 16U); + 551:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif /* OB_WRP_PAGES32TO47MASK */ + 552:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 553:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #if defined(OB_WRP_PAGES48TO127MASK) + 554:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** WRP3_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES48TO127MASK) >> 24U); + 555:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #elif defined(OB_WRP_PAGES48TO255MASK) + 556:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** WRP3_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES48TO255MASK) >> 24U); + 557:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif /* OB_WRP_PAGES48TO63MASK */ + 558:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 559:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Wait for last operation to be completed */ + 560:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + 561:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 562:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if(status == HAL_OK) + 563:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 564:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Clean the error context */ + 565:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** pFlash.ErrorCode = HAL_FLASH_ERROR_NONE; + 566:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + ARM GAS /tmp/ccLRLOP3.s page 12 + + + 567:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* To be able to write again option byte, need to perform a option byte erase */ + 568:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** status = HAL_FLASHEx_OBErase(); + 569:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if (status == HAL_OK) + 570:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 571:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Enable write protection */ + 572:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** SET_BIT(FLASH->CR, FLASH_CR_OPTPG); + 573:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 574:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #if defined(OB_WRP0_WRP0) + 575:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if(WRP0_Data != 0xFFU) + 576:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 577:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** OB->WRP0 &= WRP0_Data; + 578:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 579:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Wait for last operation to be completed */ + 580:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + 581:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 582:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif /* OB_WRP0_WRP0 */ + 583:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 584:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #if defined(OB_WRP1_WRP1) + 585:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if((status == HAL_OK) && (WRP1_Data != 0xFFU)) + 586:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 587:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** OB->WRP1 &= WRP1_Data; + 588:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 589:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Wait for last operation to be completed */ + 590:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + 591:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 592:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif /* OB_WRP1_WRP1 */ + 593:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 594:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #if defined(OB_WRP2_WRP2) + 595:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if((status == HAL_OK) && (WRP2_Data != 0xFFU)) + 596:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 597:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** OB->WRP2 &= WRP2_Data; + 598:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 599:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Wait for last operation to be completed */ + 600:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + 601:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 602:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif /* OB_WRP2_WRP2 */ + 603:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 604:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #if defined(OB_WRP3_WRP3) + 605:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if((status == HAL_OK) && (WRP3_Data != 0xFFU)) + 606:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 607:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** OB->WRP3 &= WRP3_Data; + 608:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 609:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Wait for last operation to be completed */ + 610:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + 611:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 612:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif /* OB_WRP3_WRP3 */ + 613:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 614:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* if the program operation is completed, disable the OPTPG Bit */ + 615:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** CLEAR_BIT(FLASH->CR, FLASH_CR_OPTPG); + 616:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 617:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 618:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 619:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** return status; + 620:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 621:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 622:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /** + 623:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @brief Disable the write protection of the desired pages + ARM GAS /tmp/ccLRLOP3.s page 13 + + + 624:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @note An option byte erase is done automatically in this function. + 625:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @note When the memory read protection level is selected (RDP level = 1), + 626:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * it is not possible to program or erase the flash page i if + 627:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * debug features are connected or boot code is executed in RAM, even if nWRPi = 1 + 628:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * + 629:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @param WriteProtectPage specifies the page(s) to be write unprotected. + 630:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * The value of this parameter depend on device used within the same series + 631:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @retval HAL status + 632:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** */ + 633:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WriteProtectPage) + 634:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 635:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** HAL_StatusTypeDef status = HAL_OK; + 636:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** uint16_t WRP0_Data = 0xFFFFU; + 637:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #if defined(OB_WRP1_WRP1) + 638:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** uint16_t WRP1_Data = 0xFFFFU; + 639:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif /* OB_WRP1_WRP1 */ + 640:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #if defined(OB_WRP2_WRP2) + 641:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** uint16_t WRP2_Data = 0xFFFFU; + 642:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif /* OB_WRP2_WRP2 */ + 643:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #if defined(OB_WRP3_WRP3) + 644:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** uint16_t WRP3_Data = 0xFFFFU; + 645:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif /* OB_WRP3_WRP3 */ + 646:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 647:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Check the parameters */ + 648:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** assert_param(IS_OB_WRP(WriteProtectPage)); + 649:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 650:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Get current write protected pages and the new pages to be unprotected ******/ + 651:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** WriteProtectPage = (FLASH_OB_GetWRP() | WriteProtectPage); + 652:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 653:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #if defined(OB_WRP_PAGES0TO15MASK) + 654:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** WRP0_Data = (uint16_t)(WriteProtectPage & OB_WRP_PAGES0TO15MASK); + 655:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif /* OB_WRP_PAGES0TO31MASK */ + 656:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 657:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #if defined(OB_WRP_PAGES16TO31MASK) + 658:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** WRP1_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES16TO31MASK) >> 8U); + 659:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif /* OB_WRP_PAGES32TO63MASK */ + 660:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 661:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #if defined(OB_WRP_PAGES32TO47MASK) + 662:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** WRP2_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES32TO47MASK) >> 16U); + 663:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif /* OB_WRP_PAGES32TO47MASK */ + 664:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 665:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #if defined(OB_WRP_PAGES48TO127MASK) + 666:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** WRP3_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES48TO127MASK) >> 24U); + 667:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #elif defined(OB_WRP_PAGES48TO255MASK) + 668:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** WRP3_Data = (uint16_t)((WriteProtectPage & OB_WRP_PAGES48TO255MASK) >> 24U); + 669:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif /* OB_WRP_PAGES48TO63MASK */ + 670:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 671:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 672:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Wait for last operation to be completed */ + 673:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + 674:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 675:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if(status == HAL_OK) + 676:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 677:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Clean the error context */ + 678:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** pFlash.ErrorCode = HAL_FLASH_ERROR_NONE; + 679:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 680:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* To be able to write again option byte, need to perform a option byte erase */ + ARM GAS /tmp/ccLRLOP3.s page 14 + + + 681:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** status = HAL_FLASHEx_OBErase(); + 682:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if (status == HAL_OK) + 683:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 684:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** SET_BIT(FLASH->CR, FLASH_CR_OPTPG); + 685:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 686:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #if defined(OB_WRP0_WRP0) + 687:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if(WRP0_Data != 0xFFU) + 688:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 689:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** OB->WRP0 |= WRP0_Data; + 690:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 691:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Wait for last operation to be completed */ + 692:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + 693:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 694:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif /* OB_WRP0_WRP0 */ + 695:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 696:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #if defined(OB_WRP1_WRP1) + 697:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if((status == HAL_OK) && (WRP1_Data != 0xFFU)) + 698:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 699:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** OB->WRP1 |= WRP1_Data; + 700:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 701:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Wait for last operation to be completed */ + 702:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + 703:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 704:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif /* OB_WRP1_WRP1 */ + 705:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 706:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #if defined(OB_WRP2_WRP2) + 707:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if((status == HAL_OK) && (WRP2_Data != 0xFFU)) + 708:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 709:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** OB->WRP2 |= WRP2_Data; + 710:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 711:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Wait for last operation to be completed */ + 712:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + 713:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 714:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif /* OB_WRP2_WRP2 */ + 715:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 716:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #if defined(OB_WRP3_WRP3) + 717:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if((status == HAL_OK) && (WRP3_Data != 0xFFU)) + 718:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 719:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** OB->WRP3 |= WRP3_Data; + 720:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 721:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Wait for last operation to be completed */ + 722:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + 723:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 724:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif /* OB_WRP3_WRP3 */ + 725:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 726:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* if the program operation is completed, disable the OPTPG Bit */ + 727:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** CLEAR_BIT(FLASH->CR, FLASH_CR_OPTPG); + 728:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 729:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 730:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** return status; + 731:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 732:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 733:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /** + 734:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @brief Set the read protection level. + 735:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @param ReadProtectLevel specifies the read protection level. + 736:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * This parameter can be one of the following values: + 737:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @arg @ref OB_RDP_LEVEL_0 No protection + ARM GAS /tmp/ccLRLOP3.s page 15 + + + 738:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @arg @ref OB_RDP_LEVEL_1 Read protection of the memory + 739:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @arg @ref OB_RDP_LEVEL_2 Full chip protection + 740:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @note Warning: When enabling OB_RDP level 2 it's no more possible to go back to level 1 or 0 + 741:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @retval HAL status + 742:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** */ + 743:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** static HAL_StatusTypeDef FLASH_OB_RDP_LevelConfig(uint8_t ReadProtectLevel) + 744:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 745:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** HAL_StatusTypeDef status = HAL_OK; + 746:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 747:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Check the parameters */ + 748:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** assert_param(IS_OB_RDP_LEVEL(ReadProtectLevel)); + 749:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 750:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Wait for last operation to be completed */ + 751:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + 752:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 753:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if(status == HAL_OK) + 754:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 755:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Clean the error context */ + 756:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** pFlash.ErrorCode = HAL_FLASH_ERROR_NONE; + 757:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 758:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* If the previous operation is completed, proceed to erase the option bytes */ + 759:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** SET_BIT(FLASH->CR, FLASH_CR_OPTER); + 760:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** SET_BIT(FLASH->CR, FLASH_CR_STRT); + 761:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 762:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Wait for last operation to be completed */ + 763:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + 764:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 765:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* If the erase operation is completed, disable the OPTER Bit */ + 766:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** CLEAR_BIT(FLASH->CR, FLASH_CR_OPTER); + 767:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 768:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if(status == HAL_OK) + 769:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 770:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Enable the Option Bytes Programming operation */ + 771:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** SET_BIT(FLASH->CR, FLASH_CR_OPTPG); + 772:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 773:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** WRITE_REG(OB->RDP, ReadProtectLevel); + 774:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 775:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Wait for last operation to be completed */ + 776:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + 777:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 778:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* if the program operation is completed, disable the OPTPG Bit */ + 779:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** CLEAR_BIT(FLASH->CR, FLASH_CR_OPTPG); + 780:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 781:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 782:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 783:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** return status; + 784:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 785:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 786:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /** + 787:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @brief Program the FLASH User Option Byte. + 788:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @note Programming of the OB should be performed only after an erase (otherwise PGERR occurs) + 789:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @param UserConfig The FLASH User Option Bytes values: IWDG_SW(Bit0), RST_STOP(Bit1), RST_STDBY + 790:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * VDDA_Analog_Monitoring(Bit5) and SRAM_Parity_Enable(Bit6). + 791:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * And SDADC12_VDD_MONITOR(Bit7) for STM32F373 or STM32F378 . + 792:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @retval HAL status + 793:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** */ + 794:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** static HAL_StatusTypeDef FLASH_OB_UserConfig(uint8_t UserConfig) + ARM GAS /tmp/ccLRLOP3.s page 16 + + + 795:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 796:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** HAL_StatusTypeDef status = HAL_OK; + 797:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 798:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Check the parameters */ + 799:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** assert_param(IS_OB_IWDG_SOURCE((UserConfig&OB_IWDG_SW))); + 800:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** assert_param(IS_OB_STOP_SOURCE((UserConfig&OB_STOP_NO_RST))); + 801:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** assert_param(IS_OB_STDBY_SOURCE((UserConfig&OB_STDBY_NO_RST))); + 802:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** assert_param(IS_OB_BOOT1((UserConfig&OB_BOOT1_SET))); + 803:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** assert_param(IS_OB_VDDA_ANALOG((UserConfig&OB_VDDA_ANALOG_ON))); + 804:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** assert_param(IS_OB_SRAM_PARITY((UserConfig&OB_SRAM_PARITY_RESET))); + 805:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #if defined(FLASH_OBR_SDADC12_VDD_MONITOR) + 806:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** assert_param(IS_OB_SDACD_VDD_MONITOR((UserConfig&OB_SDACD_VDD_MONITOR_SET))); + 807:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif /* FLASH_OBR_SDADC12_VDD_MONITOR */ + 808:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 809:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Wait for last operation to be completed */ + 810:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + 811:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 812:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if(status == HAL_OK) + 813:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 814:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Clean the error context */ + 815:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** pFlash.ErrorCode = HAL_FLASH_ERROR_NONE; + 816:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 817:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Enable the Option Bytes Programming operation */ + 818:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** SET_BIT(FLASH->CR, FLASH_CR_OPTPG); + 819:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 820:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #if defined(FLASH_OBR_SDADC12_VDD_MONITOR) + 821:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** OB->USER = (UserConfig | 0x08U); + 822:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #else + 823:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** OB->USER = (UserConfig | 0x88U); + 824:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif + 825:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 826:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Wait for last operation to be completed */ + 827:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + 828:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 829:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* if the program operation is completed, disable the OPTPG Bit */ + 830:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** CLEAR_BIT(FLASH->CR, FLASH_CR_OPTPG); + 831:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 832:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 833:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** return status; + 834:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 835:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 836:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /** + 837:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @brief Programs a half word at a specified Option Byte Data address. + 838:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @note The function @ref HAL_FLASH_Unlock() should be called before to unlock the FLASH interf + 839:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * The function @ref HAL_FLASH_OB_Unlock() should be called before to unlock the options b + 840:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * The function @ref HAL_FLASH_OB_Launch() should be called after to force the reload of t + 841:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * (system reset will occur) + 842:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * Programming of the OB should be performed only after an erase (otherwise PGERR occurs) + 843:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @param Address specifies the address to be programmed. + 844:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * This parameter can be 0x1FFFF804 or 0x1FFFF806. + 845:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @param Data specifies the data to be programmed. + 846:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @retval HAL status + 847:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** */ + 848:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** static HAL_StatusTypeDef FLASH_OB_ProgramData(uint32_t Address, uint8_t Data) + 849:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 850:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** HAL_StatusTypeDef status = HAL_ERROR; + 851:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + ARM GAS /tmp/ccLRLOP3.s page 17 + + + 852:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Check the parameters */ + 853:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** assert_param(IS_OB_DATA_ADDRESS(Address)); + 854:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 855:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Wait for last operation to be completed */ + 856:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + 857:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 858:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if(status == HAL_OK) + 859:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 860:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Clean the error context */ + 861:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** pFlash.ErrorCode = HAL_FLASH_ERROR_NONE; + 862:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 863:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Enables the Option Bytes Programming operation */ + 864:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** SET_BIT(FLASH->CR, FLASH_CR_OPTPG); + 865:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** *(__IO uint16_t*)Address = Data; + 866:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 867:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Wait for last operation to be completed */ + 868:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** status = FLASH_WaitForLastOperation((uint32_t)FLASH_TIMEOUT_VALUE); + 869:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 870:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* If the program operation is completed, disable the OPTPG Bit */ + 871:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** CLEAR_BIT(FLASH->CR, FLASH_CR_OPTPG); + 872:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 873:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Return the Option Byte Data Program Status */ + 874:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** return status; + 875:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 876:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 877:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /** + 878:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @brief Return the FLASH Write Protection Option Bytes value. + 879:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @retval The FLASH Write Protection Option Bytes value + 880:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** */ + 881:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** static uint32_t FLASH_OB_GetWRP(void) + 882:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 65 .loc 1 882 1 is_stmt 1 view -0 + 66 .cfi_startproc + 67 @ args = 0, pretend = 0, frame = 0 + 68 @ frame_needed = 0, uses_anonymous_args = 0 + 69 @ link register save eliminated. + 883:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Return the FLASH write protection Register value */ + 884:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** return (uint32_t)(READ_REG(FLASH->WRPR)); + 70 .loc 1 884 3 view .LVU7 + 71 .loc 1 884 10 is_stmt 0 view .LVU8 + 72 0000 014B ldr r3, .L5 + 73 0002 186A ldr r0, [r3, #32] + 885:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 74 .loc 1 885 1 view .LVU9 + 75 0004 7047 bx lr + 76 .L6: + 77 0006 00BF .align 2 + 78 .L5: + 79 0008 00200240 .word 1073881088 + 80 .cfi_endproc + 81 .LFE142: + 83 .section .text.FLASH_OB_GetRDP,"ax",%progbits + 84 .align 1 + 85 .syntax unified + 86 .thumb + 87 .thumb_func + 89 FLASH_OB_GetRDP: + ARM GAS /tmp/ccLRLOP3.s page 18 + + + 90 .LFB143: + 886:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 887:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /** + 888:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @brief Returns the FLASH Read Protection level. + 889:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @retval FLASH RDP level + 890:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * This parameter can be one of the following values: + 891:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @arg @ref OB_RDP_LEVEL_0 No protection + 892:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @arg @ref OB_RDP_LEVEL_1 Read protection of the memory + 893:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @arg @ref OB_RDP_LEVEL_2 Full chip protection + 894:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** */ + 895:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** static uint32_t FLASH_OB_GetRDP(void) + 896:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 91 .loc 1 896 1 is_stmt 1 view -0 + 92 .cfi_startproc + 93 @ args = 0, pretend = 0, frame = 0 + 94 @ frame_needed = 0, uses_anonymous_args = 0 + 95 @ link register save eliminated. + 897:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** uint32_t tmp_reg = 0U; + 96 .loc 1 897 3 view .LVU11 + 97 .LVL0: + 898:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 899:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Read RDP level bits */ + 900:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #if defined(FLASH_OBR_RDPRT) + 901:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** tmp_reg = READ_BIT(FLASH->OBR, FLASH_OBR_RDPRT); + 98 .loc 1 901 3 view .LVU12 + 99 .loc 1 901 13 is_stmt 0 view .LVU13 + 100 0000 064B ldr r3, .L11 + 101 0002 DB69 ldr r3, [r3, #28] + 102 .loc 1 901 11 view .LVU14 + 103 0004 03F00603 and r3, r3, #6 + 104 .LVL1: + 902:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #elif defined(FLASH_OBR_LEVEL1_PROT) + 903:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** tmp_reg = READ_BIT(FLASH->OBR, (FLASH_OBR_LEVEL1_PROT | FLASH_OBR_LEVEL2_PROT)); + 904:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif /* FLASH_OBR_RDPRT */ + 905:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 906:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #if defined(FLASH_OBR_RDPRT) + 907:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if (tmp_reg == FLASH_OBR_RDPRT_2) + 105 .loc 1 907 3 is_stmt 1 view .LVU15 + 106 .loc 1 907 6 is_stmt 0 view .LVU16 + 107 0008 062B cmp r3, #6 + 108 000a 02D0 beq .L9 + 908:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #elif defined(FLASH_OBR_LEVEL1_PROT) + 909:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if (tmp_reg == FLASH_OBR_LEVEL2_PROT) + 910:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif /* FLASH_OBR_RDPRT */ + 911:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 912:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** return OB_RDP_LEVEL_2; + 913:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 914:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** else if (tmp_reg == 0U) + 109 .loc 1 914 8 is_stmt 1 view .LVU17 + 110 .loc 1 914 11 is_stmt 0 view .LVU18 + 111 000c 1BB9 cbnz r3, .L10 + 915:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 916:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** return OB_RDP_LEVEL_0; + 112 .loc 1 916 12 view .LVU19 + 113 000e AA20 movs r0, #170 + 114 0010 7047 bx lr + 115 .L9: + ARM GAS /tmp/ccLRLOP3.s page 19 + + + 912:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 116 .loc 1 912 12 view .LVU20 + 117 0012 CC20 movs r0, #204 + 118 0014 7047 bx lr + 119 .L10: + 917:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 918:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** else + 919:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 920:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** return OB_RDP_LEVEL_1; + 120 .loc 1 920 12 view .LVU21 + 121 0016 BB20 movs r0, #187 + 921:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 922:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 122 .loc 1 922 1 view .LVU22 + 123 0018 7047 bx lr + 124 .L12: + 125 001a 00BF .align 2 + 126 .L11: + 127 001c 00200240 .word 1073881088 + 128 .cfi_endproc + 129 .LFE143: + 131 .section .text.FLASH_OB_RDP_LevelConfig,"ax",%progbits + 132 .align 1 + 133 .syntax unified + 134 .thumb + 135 .thumb_func + 137 FLASH_OB_RDP_LevelConfig: + 138 .LVL2: + 139 .LFB139: + 744:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** HAL_StatusTypeDef status = HAL_OK; + 140 .loc 1 744 1 is_stmt 1 view -0 + 141 .cfi_startproc + 142 @ args = 0, pretend = 0, frame = 0 + 143 @ frame_needed = 0, uses_anonymous_args = 0 + 744:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** HAL_StatusTypeDef status = HAL_OK; + 144 .loc 1 744 1 is_stmt 0 view .LVU24 + 145 0000 38B5 push {r3, r4, r5, lr} + 146 .cfi_def_cfa_offset 16 + 147 .cfi_offset 3, -16 + 148 .cfi_offset 4, -12 + 149 .cfi_offset 5, -8 + 150 .cfi_offset 14, -4 + 151 0002 0546 mov r5, r0 + 745:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 152 .loc 1 745 3 is_stmt 1 view .LVU25 + 153 .LVL3: + 748:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 154 .loc 1 748 3 view .LVU26 + 751:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 155 .loc 1 751 3 view .LVU27 + 751:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 156 .loc 1 751 12 is_stmt 0 view .LVU28 + 157 0004 4CF25030 movw r0, #50000 + 158 .LVL4: + 751:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 159 .loc 1 751 12 view .LVU29 + 160 0008 FFF7FEFF bl FLASH_WaitForLastOperation + ARM GAS /tmp/ccLRLOP3.s page 20 + + + 161 .LVL5: + 753:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 162 .loc 1 753 3 is_stmt 1 view .LVU30 + 753:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 163 .loc 1 753 5 is_stmt 0 view .LVU31 + 164 000c 00B1 cbz r0, .L16 + 165 .LVL6: + 166 .L14: + 783:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 167 .loc 1 783 3 is_stmt 1 view .LVU32 + 784:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 168 .loc 1 784 1 is_stmt 0 view .LVU33 + 169 000e 38BD pop {r3, r4, r5, pc} + 170 .LVL7: + 171 .L16: + 756:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 172 .loc 1 756 5 is_stmt 1 view .LVU34 + 756:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 173 .loc 1 756 22 is_stmt 0 view .LVU35 + 174 0010 124B ldr r3, .L17 + 175 0012 0022 movs r2, #0 + 176 0014 DA61 str r2, [r3, #28] + 759:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** SET_BIT(FLASH->CR, FLASH_CR_STRT); + 177 .loc 1 759 5 is_stmt 1 view .LVU36 + 178 0016 124C ldr r4, .L17+4 + 179 0018 2369 ldr r3, [r4, #16] + 180 001a 43F02003 orr r3, r3, #32 + 181 001e 2361 str r3, [r4, #16] + 760:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 182 .loc 1 760 5 view .LVU37 + 183 0020 2369 ldr r3, [r4, #16] + 184 0022 43F04003 orr r3, r3, #64 + 185 0026 2361 str r3, [r4, #16] + 763:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 186 .loc 1 763 5 view .LVU38 + 763:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 187 .loc 1 763 14 is_stmt 0 view .LVU39 + 188 0028 4CF25030 movw r0, #50000 + 189 002c FFF7FEFF bl FLASH_WaitForLastOperation + 190 .LVL8: + 766:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 191 .loc 1 766 5 is_stmt 1 view .LVU40 + 192 0030 2369 ldr r3, [r4, #16] + 193 0032 23F02003 bic r3, r3, #32 + 194 0036 2361 str r3, [r4, #16] + 768:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 195 .loc 1 768 5 view .LVU41 + 768:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 196 .loc 1 768 7 is_stmt 0 view .LVU42 + 197 0038 0028 cmp r0, #0 + 198 003a E8D1 bne .L14 + 771:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 199 .loc 1 771 7 is_stmt 1 view .LVU43 + 200 003c 2369 ldr r3, [r4, #16] + 201 003e 43F01003 orr r3, r3, #16 + 202 0042 2361 str r3, [r4, #16] + 773:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + ARM GAS /tmp/ccLRLOP3.s page 21 + + + 203 .loc 1 773 7 view .LVU44 + 204 0044 074B ldr r3, .L17+8 + 205 0046 1D80 strh r5, [r3] @ movhi + 776:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 206 .loc 1 776 7 view .LVU45 + 776:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 207 .loc 1 776 16 is_stmt 0 view .LVU46 + 208 0048 4CF25030 movw r0, #50000 + 209 .LVL9: + 776:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 210 .loc 1 776 16 view .LVU47 + 211 004c FFF7FEFF bl FLASH_WaitForLastOperation + 212 .LVL10: + 779:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 213 .loc 1 779 7 is_stmt 1 view .LVU48 + 214 0050 2369 ldr r3, [r4, #16] + 215 0052 23F01003 bic r3, r3, #16 + 216 0056 2361 str r3, [r4, #16] + 217 0058 D9E7 b .L14 + 218 .L18: + 219 005a 00BF .align 2 + 220 .L17: + 221 005c 00000000 .word pFlash + 222 0060 00200240 .word 1073881088 + 223 0064 00F8FF1F .word 536868864 + 224 .cfi_endproc + 225 .LFE139: + 227 .section .text.FLASH_OB_UserConfig,"ax",%progbits + 228 .align 1 + 229 .syntax unified + 230 .thumb + 231 .thumb_func + 233 FLASH_OB_UserConfig: + 234 .LVL11: + 235 .LFB140: + 795:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** HAL_StatusTypeDef status = HAL_OK; + 236 .loc 1 795 1 view -0 + 237 .cfi_startproc + 238 @ args = 0, pretend = 0, frame = 0 + 239 @ frame_needed = 0, uses_anonymous_args = 0 + 795:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** HAL_StatusTypeDef status = HAL_OK; + 240 .loc 1 795 1 is_stmt 0 view .LVU50 + 241 0000 38B5 push {r3, r4, r5, lr} + 242 .cfi_def_cfa_offset 16 + 243 .cfi_offset 3, -16 + 244 .cfi_offset 4, -12 + 245 .cfi_offset 5, -8 + 246 .cfi_offset 14, -4 + 247 0002 0446 mov r4, r0 + 796:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 248 .loc 1 796 3 is_stmt 1 view .LVU51 + 249 .LVL12: + 799:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** assert_param(IS_OB_STOP_SOURCE((UserConfig&OB_STOP_NO_RST))); + 250 .loc 1 799 3 view .LVU52 + 800:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** assert_param(IS_OB_STDBY_SOURCE((UserConfig&OB_STDBY_NO_RST))); + 251 .loc 1 800 3 view .LVU53 + 801:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** assert_param(IS_OB_BOOT1((UserConfig&OB_BOOT1_SET))); + ARM GAS /tmp/ccLRLOP3.s page 22 + + + 252 .loc 1 801 3 view .LVU54 + 802:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** assert_param(IS_OB_VDDA_ANALOG((UserConfig&OB_VDDA_ANALOG_ON))); + 253 .loc 1 802 3 view .LVU55 + 803:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** assert_param(IS_OB_SRAM_PARITY((UserConfig&OB_SRAM_PARITY_RESET))); + 254 .loc 1 803 3 view .LVU56 + 804:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #if defined(FLASH_OBR_SDADC12_VDD_MONITOR) + 255 .loc 1 804 3 view .LVU57 + 810:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 256 .loc 1 810 3 view .LVU58 + 810:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 257 .loc 1 810 12 is_stmt 0 view .LVU59 + 258 0004 4CF25030 movw r0, #50000 + 259 .LVL13: + 810:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 260 .loc 1 810 12 view .LVU60 + 261 0008 FFF7FEFF bl FLASH_WaitForLastOperation + 262 .LVL14: + 812:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 263 .loc 1 812 3 is_stmt 1 view .LVU61 + 812:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 264 .loc 1 812 5 is_stmt 0 view .LVU62 + 265 000c 00B1 cbz r0, .L22 + 266 .LVL15: + 267 .L20: + 833:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 268 .loc 1 833 3 is_stmt 1 view .LVU63 + 834:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 269 .loc 1 834 1 is_stmt 0 view .LVU64 + 270 000e 38BD pop {r3, r4, r5, pc} + 271 .LVL16: + 272 .L22: + 815:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 273 .loc 1 815 5 is_stmt 1 view .LVU65 + 815:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 274 .loc 1 815 22 is_stmt 0 view .LVU66 + 275 0010 0A4B ldr r3, .L23 + 276 0012 0022 movs r2, #0 + 277 0014 DA61 str r2, [r3, #28] + 818:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 278 .loc 1 818 5 is_stmt 1 view .LVU67 + 279 0016 0A4D ldr r5, .L23+4 + 280 0018 2B69 ldr r3, [r5, #16] + 281 001a 43F01003 orr r3, r3, #16 + 282 001e 2B61 str r3, [r5, #16] + 823:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif + 283 .loc 1 823 5 view .LVU68 + 823:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif + 284 .loc 1 823 14 is_stmt 0 view .LVU69 + 285 0020 44F08800 orr r0, r4, #136 + 286 0024 074B ldr r3, .L23+8 + 287 0026 5880 strh r0, [r3, #2] @ movhi + 827:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 288 .loc 1 827 5 is_stmt 1 view .LVU70 + 827:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 289 .loc 1 827 14 is_stmt 0 view .LVU71 + 290 0028 4CF25030 movw r0, #50000 + 291 002c FFF7FEFF bl FLASH_WaitForLastOperation + ARM GAS /tmp/ccLRLOP3.s page 23 + + + 292 .LVL17: + 830:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 293 .loc 1 830 5 is_stmt 1 view .LVU72 + 294 0030 2B69 ldr r3, [r5, #16] + 295 0032 23F01003 bic r3, r3, #16 + 296 0036 2B61 str r3, [r5, #16] + 297 0038 E9E7 b .L20 + 298 .L24: + 299 003a 00BF .align 2 + 300 .L23: + 301 003c 00000000 .word pFlash + 302 0040 00200240 .word 1073881088 + 303 0044 00F8FF1F .word 536868864 + 304 .cfi_endproc + 305 .LFE140: + 307 .section .text.FLASH_OB_ProgramData,"ax",%progbits + 308 .align 1 + 309 .syntax unified + 310 .thumb + 311 .thumb_func + 313 FLASH_OB_ProgramData: + 314 .LVL18: + 315 .LFB141: + 849:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** HAL_StatusTypeDef status = HAL_ERROR; + 316 .loc 1 849 1 view -0 + 317 .cfi_startproc + 318 @ args = 0, pretend = 0, frame = 0 + 319 @ frame_needed = 0, uses_anonymous_args = 0 + 849:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** HAL_StatusTypeDef status = HAL_ERROR; + 320 .loc 1 849 1 is_stmt 0 view .LVU74 + 321 0000 70B5 push {r4, r5, r6, lr} + 322 .cfi_def_cfa_offset 16 + 323 .cfi_offset 4, -16 + 324 .cfi_offset 5, -12 + 325 .cfi_offset 6, -8 + 326 .cfi_offset 14, -4 + 327 0002 0546 mov r5, r0 + 328 0004 0C46 mov r4, r1 + 850:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 329 .loc 1 850 3 is_stmt 1 view .LVU75 + 330 .LVL19: + 853:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 331 .loc 1 853 3 view .LVU76 + 856:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 332 .loc 1 856 3 view .LVU77 + 856:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 333 .loc 1 856 12 is_stmt 0 view .LVU78 + 334 0006 4CF25030 movw r0, #50000 + 335 .LVL20: + 856:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 336 .loc 1 856 12 view .LVU79 + 337 000a FFF7FEFF bl FLASH_WaitForLastOperation + 338 .LVL21: + 858:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 339 .loc 1 858 3 is_stmt 1 view .LVU80 + 858:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 340 .loc 1 858 5 is_stmt 0 view .LVU81 + ARM GAS /tmp/ccLRLOP3.s page 24 + + + 341 000e 00B1 cbz r0, .L28 + 342 .L26: + 343 .LVL22: + 874:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 344 .loc 1 874 3 is_stmt 1 view .LVU82 + 875:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 345 .loc 1 875 1 is_stmt 0 view .LVU83 + 346 0010 70BD pop {r4, r5, r6, pc} + 347 .LVL23: + 348 .L28: + 861:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 349 .loc 1 861 5 is_stmt 1 view .LVU84 + 861:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 350 .loc 1 861 22 is_stmt 0 view .LVU85 + 351 0012 094B ldr r3, .L29 + 352 0014 0022 movs r2, #0 + 353 0016 DA61 str r2, [r3, #28] + 864:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** *(__IO uint16_t*)Address = Data; + 354 .loc 1 864 5 is_stmt 1 view .LVU86 + 355 0018 084E ldr r6, .L29+4 + 356 001a 3369 ldr r3, [r6, #16] + 357 001c 43F01003 orr r3, r3, #16 + 358 0020 3361 str r3, [r6, #16] + 865:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 359 .loc 1 865 5 view .LVU87 + 865:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 360 .loc 1 865 30 is_stmt 0 view .LVU88 + 361 0022 2C80 strh r4, [r5] @ movhi + 868:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 362 .loc 1 868 5 is_stmt 1 view .LVU89 + 868:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 363 .loc 1 868 14 is_stmt 0 view .LVU90 + 364 0024 4CF25030 movw r0, #50000 + 365 0028 FFF7FEFF bl FLASH_WaitForLastOperation + 366 .LVL24: + 871:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 367 .loc 1 871 5 is_stmt 1 view .LVU91 + 368 002c 3369 ldr r3, [r6, #16] + 369 002e 23F01003 bic r3, r3, #16 + 370 0032 3361 str r3, [r6, #16] + 371 0034 ECE7 b .L26 + 372 .L30: + 373 0036 00BF .align 2 + 374 .L29: + 375 0038 00000000 .word pFlash + 376 003c 00200240 .word 1073881088 + 377 .cfi_endproc + 378 .LFE141: + 380 .section .text.FLASH_OB_GetUser,"ax",%progbits + 381 .align 1 + 382 .syntax unified + 383 .thumb + 384 .thumb_func + 386 FLASH_OB_GetUser: + 387 .LFB144: + 923:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 924:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /** + ARM GAS /tmp/ccLRLOP3.s page 25 + + + 925:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @brief Return the FLASH User Option Byte value. + 926:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @retval The FLASH User Option Bytes values: IWDG_SW(Bit0), RST_STOP(Bit1), RST_STDBY(Bit2), nB + 927:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * VDDA_Analog_Monitoring(Bit5) and SRAM_Parity_Enable(Bit6). + 928:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * And SDADC12_VDD_MONITOR(Bit7) for STM32F373 or STM32F378 . + 929:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** */ + 930:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** static uint8_t FLASH_OB_GetUser(void) + 931:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 388 .loc 1 931 1 view -0 + 389 .cfi_startproc + 390 @ args = 0, pretend = 0, frame = 0 + 391 @ frame_needed = 0, uses_anonymous_args = 0 + 392 @ link register save eliminated. + 932:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Return the User Option Byte */ + 933:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** return (uint8_t)((READ_REG(FLASH->OBR) & FLASH_OBR_USER) >> FLASH_POSITION_IWDGSW_BIT); + 393 .loc 1 933 3 view .LVU93 + 394 .loc 1 933 21 is_stmt 0 view .LVU94 + 395 0000 064B ldr r3, .L32 + 396 0002 D869 ldr r0, [r3, #28] + 397 .loc 1 933 42 view .LVU95 + 398 0004 00F4EE40 and r0, r0, #30464 + 399 .LVL25: + 400 .LBB8: + 401 .LBI8: + 402 .file 2 "Drivers/CMSIS/Include/cmsis_gcc.h" + 1:Drivers/CMSIS/Include/cmsis_gcc.h **** /**************************************************************************//** + 2:Drivers/CMSIS/Include/cmsis_gcc.h **** * @file cmsis_gcc.h + 3:Drivers/CMSIS/Include/cmsis_gcc.h **** * @brief CMSIS compiler GCC header file + 4:Drivers/CMSIS/Include/cmsis_gcc.h **** * @version V5.0.4 + 5:Drivers/CMSIS/Include/cmsis_gcc.h **** * @date 09. April 2018 + 6:Drivers/CMSIS/Include/cmsis_gcc.h **** ******************************************************************************/ + 7:Drivers/CMSIS/Include/cmsis_gcc.h **** /* + 8:Drivers/CMSIS/Include/cmsis_gcc.h **** * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + 9:Drivers/CMSIS/Include/cmsis_gcc.h **** * + 10:Drivers/CMSIS/Include/cmsis_gcc.h **** * SPDX-License-Identifier: Apache-2.0 + 11:Drivers/CMSIS/Include/cmsis_gcc.h **** * + 12:Drivers/CMSIS/Include/cmsis_gcc.h **** * Licensed under the Apache License, Version 2.0 (the License); you may + 13:Drivers/CMSIS/Include/cmsis_gcc.h **** * not use this file except in compliance with the License. + 14:Drivers/CMSIS/Include/cmsis_gcc.h **** * You may obtain a copy of the License at + 15:Drivers/CMSIS/Include/cmsis_gcc.h **** * + 16:Drivers/CMSIS/Include/cmsis_gcc.h **** * www.apache.org/licenses/LICENSE-2.0 + 17:Drivers/CMSIS/Include/cmsis_gcc.h **** * + 18:Drivers/CMSIS/Include/cmsis_gcc.h **** * Unless required by applicable law or agreed to in writing, software + 19:Drivers/CMSIS/Include/cmsis_gcc.h **** * distributed under the License is distributed on an AS IS BASIS, WITHOUT + 20:Drivers/CMSIS/Include/cmsis_gcc.h **** * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + 21:Drivers/CMSIS/Include/cmsis_gcc.h **** * See the License for the specific language governing permissions and + 22:Drivers/CMSIS/Include/cmsis_gcc.h **** * limitations under the License. + 23:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 24:Drivers/CMSIS/Include/cmsis_gcc.h **** + 25:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __CMSIS_GCC_H + 26:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __CMSIS_GCC_H + 27:Drivers/CMSIS/Include/cmsis_gcc.h **** + 28:Drivers/CMSIS/Include/cmsis_gcc.h **** /* ignore some GCC warnings */ + 29:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic push + 30:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wsign-conversion" + 31:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wconversion" + 32:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wunused-parameter" + 33:Drivers/CMSIS/Include/cmsis_gcc.h **** + ARM GAS /tmp/ccLRLOP3.s page 26 + + + 34:Drivers/CMSIS/Include/cmsis_gcc.h **** /* Fallback for __has_builtin */ + 35:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __has_builtin + 36:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __has_builtin(x) (0) + 37:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 38:Drivers/CMSIS/Include/cmsis_gcc.h **** + 39:Drivers/CMSIS/Include/cmsis_gcc.h **** /* CMSIS compiler specific defines */ + 40:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __ASM + 41:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __ASM __asm + 42:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 43:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __INLINE + 44:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __INLINE inline + 45:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 46:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __STATIC_INLINE + 47:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __STATIC_INLINE static inline + 48:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 49:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __STATIC_FORCEINLINE + 50:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __STATIC_FORCEINLINE __attribute__((always_inline)) static inline + 51:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 52:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __NO_RETURN + 53:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __NO_RETURN __attribute__((__noreturn__)) + 54:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 55:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __USED + 56:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __USED __attribute__((used)) + 57:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 58:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __WEAK + 59:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __WEAK __attribute__((weak)) + 60:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 61:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __PACKED + 62:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __PACKED __attribute__((packed, aligned(1))) + 63:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 64:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __PACKED_STRUCT + 65:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) + 66:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 67:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __PACKED_UNION + 68:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __PACKED_UNION union __attribute__((packed, aligned(1))) + 69:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 70:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __UNALIGNED_UINT32 /* deprecated */ + 71:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic push + 72:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wpacked" + 73:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wattributes" + 74:Drivers/CMSIS/Include/cmsis_gcc.h **** struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + 75:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic pop + 76:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + 77:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 78:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __UNALIGNED_UINT16_WRITE + 79:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic push + 80:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wpacked" + 81:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wattributes" + 82:Drivers/CMSIS/Include/cmsis_gcc.h **** __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + 83:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic pop + 84:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))- + 85:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 86:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __UNALIGNED_UINT16_READ + 87:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic push + 88:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wpacked" + 89:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wattributes" + 90:Drivers/CMSIS/Include/cmsis_gcc.h **** __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + ARM GAS /tmp/ccLRLOP3.s page 27 + + + 91:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic pop + 92:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(add + 93:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 94:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __UNALIGNED_UINT32_WRITE + 95:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic push + 96:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wpacked" + 97:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wattributes" + 98:Drivers/CMSIS/Include/cmsis_gcc.h **** __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + 99:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic pop + 100:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))- + 101:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 102:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __UNALIGNED_UINT32_READ + 103:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic push + 104:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wpacked" + 105:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wattributes" + 106:Drivers/CMSIS/Include/cmsis_gcc.h **** __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + 107:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic pop + 108:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(add + 109:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 110:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __ALIGNED + 111:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __ALIGNED(x) __attribute__((aligned(x))) + 112:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 113:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __RESTRICT + 114:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __RESTRICT __restrict + 115:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 116:Drivers/CMSIS/Include/cmsis_gcc.h **** + 117:Drivers/CMSIS/Include/cmsis_gcc.h **** + 118:Drivers/CMSIS/Include/cmsis_gcc.h **** /* ########################### Core Function Access ########################### */ + 119:Drivers/CMSIS/Include/cmsis_gcc.h **** /** \ingroup CMSIS_Core_FunctionInterface + 120:Drivers/CMSIS/Include/cmsis_gcc.h **** \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + 121:Drivers/CMSIS/Include/cmsis_gcc.h **** @{ + 122:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 123:Drivers/CMSIS/Include/cmsis_gcc.h **** + 124:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 125:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Enable IRQ Interrupts + 126:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + 127:Drivers/CMSIS/Include/cmsis_gcc.h **** Can only be executed in Privileged modes. + 128:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 129:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __enable_irq(void) + 130:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 131:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("cpsie i" : : : "memory"); + 132:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 133:Drivers/CMSIS/Include/cmsis_gcc.h **** + 134:Drivers/CMSIS/Include/cmsis_gcc.h **** + 135:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 136:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Disable IRQ Interrupts + 137:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Disables IRQ interrupts by setting the I-bit in the CPSR. + 138:Drivers/CMSIS/Include/cmsis_gcc.h **** Can only be executed in Privileged modes. + 139:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 140:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __disable_irq(void) + 141:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 142:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("cpsid i" : : : "memory"); + 143:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 144:Drivers/CMSIS/Include/cmsis_gcc.h **** + 145:Drivers/CMSIS/Include/cmsis_gcc.h **** + 146:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 147:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Control Register + ARM GAS /tmp/ccLRLOP3.s page 28 + + + 148:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the content of the Control Register. + 149:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Control Register value + 150:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 151:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_CONTROL(void) + 152:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 153:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 154:Drivers/CMSIS/Include/cmsis_gcc.h **** + 155:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, control" : "=r" (result) ); + 156:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 157:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 158:Drivers/CMSIS/Include/cmsis_gcc.h **** + 159:Drivers/CMSIS/Include/cmsis_gcc.h **** + 160:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 161:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 162:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Control Register (non-secure) + 163:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the content of the non-secure Control Register when in secure mode. + 164:Drivers/CMSIS/Include/cmsis_gcc.h **** \return non-secure Control Register value + 165:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 166:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) + 167:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 168:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 169:Drivers/CMSIS/Include/cmsis_gcc.h **** + 170:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); + 171:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 172:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 173:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 174:Drivers/CMSIS/Include/cmsis_gcc.h **** + 175:Drivers/CMSIS/Include/cmsis_gcc.h **** + 176:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 177:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Control Register + 178:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Writes the given value to the Control Register. + 179:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] control Control Register value to set + 180:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 181:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) + 182:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 183:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); + 184:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 185:Drivers/CMSIS/Include/cmsis_gcc.h **** + 186:Drivers/CMSIS/Include/cmsis_gcc.h **** + 187:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 188:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 189:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Control Register (non-secure) + 190:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Writes the given value to the non-secure Control Register when in secure state. + 191:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] control Control Register value to set + 192:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 193:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) + 194:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 195:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); + 196:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 197:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 198:Drivers/CMSIS/Include/cmsis_gcc.h **** + 199:Drivers/CMSIS/Include/cmsis_gcc.h **** + 200:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 201:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get IPSR Register + 202:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the content of the IPSR Register. + 203:Drivers/CMSIS/Include/cmsis_gcc.h **** \return IPSR Register value + 204:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + ARM GAS /tmp/ccLRLOP3.s page 29 + + + 205:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_IPSR(void) + 206:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 207:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 208:Drivers/CMSIS/Include/cmsis_gcc.h **** + 209:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); + 210:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 211:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 212:Drivers/CMSIS/Include/cmsis_gcc.h **** + 213:Drivers/CMSIS/Include/cmsis_gcc.h **** + 214:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 215:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get APSR Register + 216:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the content of the APSR Register. + 217:Drivers/CMSIS/Include/cmsis_gcc.h **** \return APSR Register value + 218:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 219:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_APSR(void) + 220:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 221:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 222:Drivers/CMSIS/Include/cmsis_gcc.h **** + 223:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, apsr" : "=r" (result) ); + 224:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 225:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 226:Drivers/CMSIS/Include/cmsis_gcc.h **** + 227:Drivers/CMSIS/Include/cmsis_gcc.h **** + 228:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 229:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get xPSR Register + 230:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the content of the xPSR Register. + 231:Drivers/CMSIS/Include/cmsis_gcc.h **** \return xPSR Register value + 232:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 233:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_xPSR(void) + 234:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 235:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 236:Drivers/CMSIS/Include/cmsis_gcc.h **** + 237:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); + 238:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 239:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 240:Drivers/CMSIS/Include/cmsis_gcc.h **** + 241:Drivers/CMSIS/Include/cmsis_gcc.h **** + 242:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 243:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Process Stack Pointer + 244:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the Process Stack Pointer (PSP). + 245:Drivers/CMSIS/Include/cmsis_gcc.h **** \return PSP Register value + 246:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 247:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_PSP(void) + 248:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 249:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 250:Drivers/CMSIS/Include/cmsis_gcc.h **** + 251:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, psp" : "=r" (result) ); + 252:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 253:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 254:Drivers/CMSIS/Include/cmsis_gcc.h **** + 255:Drivers/CMSIS/Include/cmsis_gcc.h **** + 256:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 257:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 258:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Process Stack Pointer (non-secure) + 259:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure s + 260:Drivers/CMSIS/Include/cmsis_gcc.h **** \return PSP Register value + 261:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + ARM GAS /tmp/ccLRLOP3.s page 30 + + + 262:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) + 263:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 264:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 265:Drivers/CMSIS/Include/cmsis_gcc.h **** + 266:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); + 267:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 268:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 269:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 270:Drivers/CMSIS/Include/cmsis_gcc.h **** + 271:Drivers/CMSIS/Include/cmsis_gcc.h **** + 272:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 273:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Process Stack Pointer + 274:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Process Stack Pointer (PSP). + 275:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] topOfProcStack Process Stack Pointer value to set + 276:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 277:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) + 278:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 279:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); + 280:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 281:Drivers/CMSIS/Include/cmsis_gcc.h **** + 282:Drivers/CMSIS/Include/cmsis_gcc.h **** + 283:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 284:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 285:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Process Stack Pointer (non-secure) + 286:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure sta + 287:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] topOfProcStack Process Stack Pointer value to set + 288:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 289:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) + 290:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 291:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); + 292:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 293:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 294:Drivers/CMSIS/Include/cmsis_gcc.h **** + 295:Drivers/CMSIS/Include/cmsis_gcc.h **** + 296:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 297:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Main Stack Pointer + 298:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the Main Stack Pointer (MSP). + 299:Drivers/CMSIS/Include/cmsis_gcc.h **** \return MSP Register value + 300:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 301:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_MSP(void) + 302:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 303:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 304:Drivers/CMSIS/Include/cmsis_gcc.h **** + 305:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, msp" : "=r" (result) ); + 306:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 307:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 308:Drivers/CMSIS/Include/cmsis_gcc.h **** + 309:Drivers/CMSIS/Include/cmsis_gcc.h **** + 310:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 311:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 312:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Main Stack Pointer (non-secure) + 313:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure stat + 314:Drivers/CMSIS/Include/cmsis_gcc.h **** \return MSP Register value + 315:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 316:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) + 317:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 318:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + ARM GAS /tmp/ccLRLOP3.s page 31 + + + 319:Drivers/CMSIS/Include/cmsis_gcc.h **** + 320:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); + 321:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 322:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 323:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 324:Drivers/CMSIS/Include/cmsis_gcc.h **** + 325:Drivers/CMSIS/Include/cmsis_gcc.h **** + 326:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 327:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Main Stack Pointer + 328:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Main Stack Pointer (MSP). + 329:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] topOfMainStack Main Stack Pointer value to set + 330:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 331:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) + 332:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 333:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); + 334:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 335:Drivers/CMSIS/Include/cmsis_gcc.h **** + 336:Drivers/CMSIS/Include/cmsis_gcc.h **** + 337:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 338:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 339:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Main Stack Pointer (non-secure) + 340:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. + 341:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] topOfMainStack Main Stack Pointer value to set + 342:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 343:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) + 344:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 345:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); + 346:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 347:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 348:Drivers/CMSIS/Include/cmsis_gcc.h **** + 349:Drivers/CMSIS/Include/cmsis_gcc.h **** + 350:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 351:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 352:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Stack Pointer (non-secure) + 353:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. + 354:Drivers/CMSIS/Include/cmsis_gcc.h **** \return SP Register value + 355:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 356:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) + 357:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 358:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 359:Drivers/CMSIS/Include/cmsis_gcc.h **** + 360:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); + 361:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 362:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 363:Drivers/CMSIS/Include/cmsis_gcc.h **** + 364:Drivers/CMSIS/Include/cmsis_gcc.h **** + 365:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 366:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Stack Pointer (non-secure) + 367:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. + 368:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] topOfStack Stack Pointer value to set + 369:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 370:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) + 371:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 372:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); + 373:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 374:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 375:Drivers/CMSIS/Include/cmsis_gcc.h **** + ARM GAS /tmp/ccLRLOP3.s page 32 + + + 376:Drivers/CMSIS/Include/cmsis_gcc.h **** + 377:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 378:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Priority Mask + 379:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current state of the priority mask bit from the Priority Mask Register. + 380:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Priority Mask value + 381:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 382:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) + 383:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 384:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 385:Drivers/CMSIS/Include/cmsis_gcc.h **** + 386:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, primask" : "=r" (result) :: "memory"); + 387:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 388:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 389:Drivers/CMSIS/Include/cmsis_gcc.h **** + 390:Drivers/CMSIS/Include/cmsis_gcc.h **** + 391:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 392:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 393:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Priority Mask (non-secure) + 394:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current state of the non-secure priority mask bit from the Priority Mask Reg + 395:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Priority Mask value + 396:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 397:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) + 398:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 399:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 400:Drivers/CMSIS/Include/cmsis_gcc.h **** + 401:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, primask_ns" : "=r" (result) :: "memory"); + 402:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 403:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 404:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 405:Drivers/CMSIS/Include/cmsis_gcc.h **** + 406:Drivers/CMSIS/Include/cmsis_gcc.h **** + 407:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 408:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Priority Mask + 409:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Priority Mask Register. + 410:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] priMask Priority Mask + 411:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 412:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) + 413:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 414:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); + 415:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 416:Drivers/CMSIS/Include/cmsis_gcc.h **** + 417:Drivers/CMSIS/Include/cmsis_gcc.h **** + 418:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 419:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 420:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Priority Mask (non-secure) + 421:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the non-secure Priority Mask Register when in secure state. + 422:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] priMask Priority Mask + 423:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 424:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) + 425:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 426:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); + 427:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 428:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 429:Drivers/CMSIS/Include/cmsis_gcc.h **** + 430:Drivers/CMSIS/Include/cmsis_gcc.h **** + 431:Drivers/CMSIS/Include/cmsis_gcc.h **** #if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + 432:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + ARM GAS /tmp/ccLRLOP3.s page 33 + + + 433:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + 434:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 435:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Enable FIQ + 436:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Enables FIQ interrupts by clearing the F-bit in the CPSR. + 437:Drivers/CMSIS/Include/cmsis_gcc.h **** Can only be executed in Privileged modes. + 438:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 439:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __enable_fault_irq(void) + 440:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 441:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("cpsie f" : : : "memory"); + 442:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 443:Drivers/CMSIS/Include/cmsis_gcc.h **** + 444:Drivers/CMSIS/Include/cmsis_gcc.h **** + 445:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 446:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Disable FIQ + 447:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Disables FIQ interrupts by setting the F-bit in the CPSR. + 448:Drivers/CMSIS/Include/cmsis_gcc.h **** Can only be executed in Privileged modes. + 449:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 450:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __disable_fault_irq(void) + 451:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 452:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("cpsid f" : : : "memory"); + 453:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 454:Drivers/CMSIS/Include/cmsis_gcc.h **** + 455:Drivers/CMSIS/Include/cmsis_gcc.h **** + 456:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 457:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Base Priority + 458:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the Base Priority register. + 459:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Base Priority register value + 460:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 461:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) + 462:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 463:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 464:Drivers/CMSIS/Include/cmsis_gcc.h **** + 465:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, basepri" : "=r" (result) ); + 466:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 467:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 468:Drivers/CMSIS/Include/cmsis_gcc.h **** + 469:Drivers/CMSIS/Include/cmsis_gcc.h **** + 470:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 471:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 472:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Base Priority (non-secure) + 473:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the non-secure Base Priority register when in secure state. + 474:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Base Priority register value + 475:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 476:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) + 477:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 478:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 479:Drivers/CMSIS/Include/cmsis_gcc.h **** + 480:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); + 481:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 482:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 483:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 484:Drivers/CMSIS/Include/cmsis_gcc.h **** + 485:Drivers/CMSIS/Include/cmsis_gcc.h **** + 486:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 487:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Base Priority + 488:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Base Priority register. + 489:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] basePri Base Priority value to set + ARM GAS /tmp/ccLRLOP3.s page 34 + + + 490:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 491:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) + 492:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 493:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); + 494:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 495:Drivers/CMSIS/Include/cmsis_gcc.h **** + 496:Drivers/CMSIS/Include/cmsis_gcc.h **** + 497:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 498:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 499:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Base Priority (non-secure) + 500:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the non-secure Base Priority register when in secure state. + 501:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] basePri Base Priority value to set + 502:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 503:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) + 504:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 505:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); + 506:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 507:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 508:Drivers/CMSIS/Include/cmsis_gcc.h **** + 509:Drivers/CMSIS/Include/cmsis_gcc.h **** + 510:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 511:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Base Priority with condition + 512:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Base Priority register only if BASEPRI masking is disable + 513:Drivers/CMSIS/Include/cmsis_gcc.h **** or the new value increases the BASEPRI priority level. + 514:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] basePri Base Priority value to set + 515:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 516:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) + 517:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 518:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); + 519:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 520:Drivers/CMSIS/Include/cmsis_gcc.h **** + 521:Drivers/CMSIS/Include/cmsis_gcc.h **** + 522:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 523:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Fault Mask + 524:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the Fault Mask register. + 525:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Fault Mask register value + 526:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 527:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) + 528:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 529:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 530:Drivers/CMSIS/Include/cmsis_gcc.h **** + 531:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + 532:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 533:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 534:Drivers/CMSIS/Include/cmsis_gcc.h **** + 535:Drivers/CMSIS/Include/cmsis_gcc.h **** + 536:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 537:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 538:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Fault Mask (non-secure) + 539:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the non-secure Fault Mask register when in secure state. + 540:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Fault Mask register value + 541:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 542:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) + 543:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 544:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 545:Drivers/CMSIS/Include/cmsis_gcc.h **** + 546:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); + ARM GAS /tmp/ccLRLOP3.s page 35 + + + 547:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 548:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 549:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 550:Drivers/CMSIS/Include/cmsis_gcc.h **** + 551:Drivers/CMSIS/Include/cmsis_gcc.h **** + 552:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 553:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Fault Mask + 554:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Fault Mask register. + 555:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] faultMask Fault Mask value to set + 556:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 557:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) + 558:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 559:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); + 560:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 561:Drivers/CMSIS/Include/cmsis_gcc.h **** + 562:Drivers/CMSIS/Include/cmsis_gcc.h **** + 563:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 564:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 565:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Fault Mask (non-secure) + 566:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the non-secure Fault Mask register when in secure state. + 567:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] faultMask Fault Mask value to set + 568:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 569:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) + 570:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 571:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); + 572:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 573:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 574:Drivers/CMSIS/Include/cmsis_gcc.h **** + 575:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + 576:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + 577:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + 578:Drivers/CMSIS/Include/cmsis_gcc.h **** + 579:Drivers/CMSIS/Include/cmsis_gcc.h **** + 580:Drivers/CMSIS/Include/cmsis_gcc.h **** #if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + 581:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + 582:Drivers/CMSIS/Include/cmsis_gcc.h **** + 583:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 584:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Process Stack Pointer Limit + 585:Drivers/CMSIS/Include/cmsis_gcc.h **** Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + 586:Drivers/CMSIS/Include/cmsis_gcc.h **** Stack Pointer Limit register hence zero is returned always in non-secure + 587:Drivers/CMSIS/Include/cmsis_gcc.h **** mode. + 588:Drivers/CMSIS/Include/cmsis_gcc.h **** + 589:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). + 590:Drivers/CMSIS/Include/cmsis_gcc.h **** \return PSPLIM Register value + 591:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 592:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) + 593:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 594:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + 595:Drivers/CMSIS/Include/cmsis_gcc.h **** (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + 596:Drivers/CMSIS/Include/cmsis_gcc.h **** // without main extensions, the non-secure PSPLIM is RAZ/WI + 597:Drivers/CMSIS/Include/cmsis_gcc.h **** return 0U; + 598:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 599:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 600:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, psplim" : "=r" (result) ); + 601:Drivers/CMSIS/Include/cmsis_gcc.h **** return result; + 602:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 603:Drivers/CMSIS/Include/cmsis_gcc.h **** } + ARM GAS /tmp/ccLRLOP3.s page 36 + + + 604:Drivers/CMSIS/Include/cmsis_gcc.h **** + 605:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)) + 606:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 607:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Process Stack Pointer Limit (non-secure) + 608:Drivers/CMSIS/Include/cmsis_gcc.h **** Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + 609:Drivers/CMSIS/Include/cmsis_gcc.h **** Stack Pointer Limit register hence zero is returned always. + 610:Drivers/CMSIS/Include/cmsis_gcc.h **** + 611:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in + 612:Drivers/CMSIS/Include/cmsis_gcc.h **** \return PSPLIM Register value + 613:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 614:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) + 615:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 616:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + 617:Drivers/CMSIS/Include/cmsis_gcc.h **** // without main extensions, the non-secure PSPLIM is RAZ/WI + 618:Drivers/CMSIS/Include/cmsis_gcc.h **** return 0U; + 619:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 620:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 621:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); + 622:Drivers/CMSIS/Include/cmsis_gcc.h **** return result; + 623:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 624:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 625:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 626:Drivers/CMSIS/Include/cmsis_gcc.h **** + 627:Drivers/CMSIS/Include/cmsis_gcc.h **** + 628:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 629:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Process Stack Pointer Limit + 630:Drivers/CMSIS/Include/cmsis_gcc.h **** Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + 631:Drivers/CMSIS/Include/cmsis_gcc.h **** Stack Pointer Limit register hence the write is silently ignored in non-secure + 632:Drivers/CMSIS/Include/cmsis_gcc.h **** mode. + 633:Drivers/CMSIS/Include/cmsis_gcc.h **** + 634:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). + 635:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + 636:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 637:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) + 638:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 639:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + 640:Drivers/CMSIS/Include/cmsis_gcc.h **** (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + 641:Drivers/CMSIS/Include/cmsis_gcc.h **** // without main extensions, the non-secure PSPLIM is RAZ/WI + 642:Drivers/CMSIS/Include/cmsis_gcc.h **** (void)ProcStackPtrLimit; + 643:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 644:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); + 645:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 646:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 647:Drivers/CMSIS/Include/cmsis_gcc.h **** + 648:Drivers/CMSIS/Include/cmsis_gcc.h **** + 649:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 650:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 651:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Process Stack Pointer (non-secure) + 652:Drivers/CMSIS/Include/cmsis_gcc.h **** Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + 653:Drivers/CMSIS/Include/cmsis_gcc.h **** Stack Pointer Limit register hence the write is silently ignored. + 654:Drivers/CMSIS/Include/cmsis_gcc.h **** + 655:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in s + 656:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + 657:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 658:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) + 659:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 660:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + ARM GAS /tmp/ccLRLOP3.s page 37 + + + 661:Drivers/CMSIS/Include/cmsis_gcc.h **** // without main extensions, the non-secure PSPLIM is RAZ/WI + 662:Drivers/CMSIS/Include/cmsis_gcc.h **** (void)ProcStackPtrLimit; + 663:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 664:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); + 665:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 666:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 667:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 668:Drivers/CMSIS/Include/cmsis_gcc.h **** + 669:Drivers/CMSIS/Include/cmsis_gcc.h **** + 670:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 671:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Main Stack Pointer Limit + 672:Drivers/CMSIS/Include/cmsis_gcc.h **** Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + 673:Drivers/CMSIS/Include/cmsis_gcc.h **** Stack Pointer Limit register hence zero is returned always in non-secure + 674:Drivers/CMSIS/Include/cmsis_gcc.h **** mode. + 675:Drivers/CMSIS/Include/cmsis_gcc.h **** + 676:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). + 677:Drivers/CMSIS/Include/cmsis_gcc.h **** \return MSPLIM Register value + 678:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 679:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) + 680:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 681:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + 682:Drivers/CMSIS/Include/cmsis_gcc.h **** (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + 683:Drivers/CMSIS/Include/cmsis_gcc.h **** // without main extensions, the non-secure MSPLIM is RAZ/WI + 684:Drivers/CMSIS/Include/cmsis_gcc.h **** return 0U; + 685:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 686:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 687:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, msplim" : "=r" (result) ); + 688:Drivers/CMSIS/Include/cmsis_gcc.h **** return result; + 689:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 690:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 691:Drivers/CMSIS/Include/cmsis_gcc.h **** + 692:Drivers/CMSIS/Include/cmsis_gcc.h **** + 693:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 694:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 695:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Main Stack Pointer Limit (non-secure) + 696:Drivers/CMSIS/Include/cmsis_gcc.h **** Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + 697:Drivers/CMSIS/Include/cmsis_gcc.h **** Stack Pointer Limit register hence zero is returned always. + 698:Drivers/CMSIS/Include/cmsis_gcc.h **** + 699:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in sec + 700:Drivers/CMSIS/Include/cmsis_gcc.h **** \return MSPLIM Register value + 701:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 702:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) + 703:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 704:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + 705:Drivers/CMSIS/Include/cmsis_gcc.h **** // without main extensions, the non-secure MSPLIM is RAZ/WI + 706:Drivers/CMSIS/Include/cmsis_gcc.h **** return 0U; + 707:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 708:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 709:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); + 710:Drivers/CMSIS/Include/cmsis_gcc.h **** return result; + 711:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 712:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 713:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 714:Drivers/CMSIS/Include/cmsis_gcc.h **** + 715:Drivers/CMSIS/Include/cmsis_gcc.h **** + 716:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 717:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Main Stack Pointer Limit + ARM GAS /tmp/ccLRLOP3.s page 38 + + + 718:Drivers/CMSIS/Include/cmsis_gcc.h **** Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + 719:Drivers/CMSIS/Include/cmsis_gcc.h **** Stack Pointer Limit register hence the write is silently ignored in non-secure + 720:Drivers/CMSIS/Include/cmsis_gcc.h **** mode. + 721:Drivers/CMSIS/Include/cmsis_gcc.h **** + 722:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). + 723:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set + 724:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 725:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) + 726:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 727:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + 728:Drivers/CMSIS/Include/cmsis_gcc.h **** (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + 729:Drivers/CMSIS/Include/cmsis_gcc.h **** // without main extensions, the non-secure MSPLIM is RAZ/WI + 730:Drivers/CMSIS/Include/cmsis_gcc.h **** (void)MainStackPtrLimit; + 731:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 732:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); + 733:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 734:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 735:Drivers/CMSIS/Include/cmsis_gcc.h **** + 736:Drivers/CMSIS/Include/cmsis_gcc.h **** + 737:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 738:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 739:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Main Stack Pointer Limit (non-secure) + 740:Drivers/CMSIS/Include/cmsis_gcc.h **** Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + 741:Drivers/CMSIS/Include/cmsis_gcc.h **** Stack Pointer Limit register hence the write is silently ignored. + 742:Drivers/CMSIS/Include/cmsis_gcc.h **** + 743:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secu + 744:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] MainStackPtrLimit Main Stack Pointer value to set + 745:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 746:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) + 747:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 748:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + 749:Drivers/CMSIS/Include/cmsis_gcc.h **** // without main extensions, the non-secure MSPLIM is RAZ/WI + 750:Drivers/CMSIS/Include/cmsis_gcc.h **** (void)MainStackPtrLimit; + 751:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 752:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); + 753:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 754:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 755:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 756:Drivers/CMSIS/Include/cmsis_gcc.h **** + 757:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + 758:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + 759:Drivers/CMSIS/Include/cmsis_gcc.h **** + 760:Drivers/CMSIS/Include/cmsis_gcc.h **** + 761:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 762:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get FPSCR + 763:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the Floating Point Status/Control register. + 764:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Floating Point Status/Control register value + 765:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 766:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_FPSCR(void) + 767:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 768:Drivers/CMSIS/Include/cmsis_gcc.h **** #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + 769:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + 770:Drivers/CMSIS/Include/cmsis_gcc.h **** #if __has_builtin(__builtin_arm_get_fpscr) + 771:Drivers/CMSIS/Include/cmsis_gcc.h **** // Re-enable using built-in when GCC has been fixed + 772:Drivers/CMSIS/Include/cmsis_gcc.h **** // || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) + 773:Drivers/CMSIS/Include/cmsis_gcc.h **** /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ + 774:Drivers/CMSIS/Include/cmsis_gcc.h **** return __builtin_arm_get_fpscr(); + ARM GAS /tmp/ccLRLOP3.s page 39 + + + 775:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 776:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 777:Drivers/CMSIS/Include/cmsis_gcc.h **** + 778:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); + 779:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 780:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 781:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 782:Drivers/CMSIS/Include/cmsis_gcc.h **** return(0U); + 783:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 784:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 785:Drivers/CMSIS/Include/cmsis_gcc.h **** + 786:Drivers/CMSIS/Include/cmsis_gcc.h **** + 787:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 788:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set FPSCR + 789:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Floating Point Status/Control register. + 790:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] fpscr Floating Point Status/Control value to set + 791:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 792:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_FPSCR(uint32_t fpscr) + 793:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 794:Drivers/CMSIS/Include/cmsis_gcc.h **** #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + 795:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + 796:Drivers/CMSIS/Include/cmsis_gcc.h **** #if __has_builtin(__builtin_arm_set_fpscr) + 797:Drivers/CMSIS/Include/cmsis_gcc.h **** // Re-enable using built-in when GCC has been fixed + 798:Drivers/CMSIS/Include/cmsis_gcc.h **** // || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) + 799:Drivers/CMSIS/Include/cmsis_gcc.h **** /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ + 800:Drivers/CMSIS/Include/cmsis_gcc.h **** __builtin_arm_set_fpscr(fpscr); + 801:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 802:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc", "memory"); + 803:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 804:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 805:Drivers/CMSIS/Include/cmsis_gcc.h **** (void)fpscr; + 806:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 807:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 808:Drivers/CMSIS/Include/cmsis_gcc.h **** + 809:Drivers/CMSIS/Include/cmsis_gcc.h **** + 810:Drivers/CMSIS/Include/cmsis_gcc.h **** /*@} end of CMSIS_Core_RegAccFunctions */ + 811:Drivers/CMSIS/Include/cmsis_gcc.h **** + 812:Drivers/CMSIS/Include/cmsis_gcc.h **** + 813:Drivers/CMSIS/Include/cmsis_gcc.h **** /* ########################## Core Instruction Access ######################### */ + 814:Drivers/CMSIS/Include/cmsis_gcc.h **** /** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + 815:Drivers/CMSIS/Include/cmsis_gcc.h **** Access to dedicated instructions + 816:Drivers/CMSIS/Include/cmsis_gcc.h **** @{ + 817:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 818:Drivers/CMSIS/Include/cmsis_gcc.h **** + 819:Drivers/CMSIS/Include/cmsis_gcc.h **** /* Define macros for porting to both thumb1 and thumb2. + 820:Drivers/CMSIS/Include/cmsis_gcc.h **** * For thumb1, use low register (r0-r7), specified by constraint "l" + 821:Drivers/CMSIS/Include/cmsis_gcc.h **** * Otherwise, use general registers, specified by constraint "r" */ + 822:Drivers/CMSIS/Include/cmsis_gcc.h **** #if defined (__thumb__) && !defined (__thumb2__) + 823:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __CMSIS_GCC_OUT_REG(r) "=l" (r) + 824:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __CMSIS_GCC_RW_REG(r) "+l" (r) + 825:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __CMSIS_GCC_USE_REG(r) "l" (r) + 826:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 827:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __CMSIS_GCC_OUT_REG(r) "=r" (r) + 828:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __CMSIS_GCC_RW_REG(r) "+r" (r) + 829:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __CMSIS_GCC_USE_REG(r) "r" (r) + 830:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 831:Drivers/CMSIS/Include/cmsis_gcc.h **** + ARM GAS /tmp/ccLRLOP3.s page 40 + + + 832:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 833:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief No Operation + 834:Drivers/CMSIS/Include/cmsis_gcc.h **** \details No Operation does nothing. This instruction can be used for code alignment purposes. + 835:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 836:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __NOP() __ASM volatile ("nop") + 837:Drivers/CMSIS/Include/cmsis_gcc.h **** + 838:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 839:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Wait For Interrupt + 840:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Wait For Interrupt is a hint instruction that suspends execution until one of a number o + 841:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 842:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __WFI() __ASM volatile ("wfi") + 843:Drivers/CMSIS/Include/cmsis_gcc.h **** + 844:Drivers/CMSIS/Include/cmsis_gcc.h **** + 845:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 846:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Wait For Event + 847:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Wait For Event is a hint instruction that permits the processor to enter + 848:Drivers/CMSIS/Include/cmsis_gcc.h **** a low-power state until one of a number of events occurs. + 849:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 850:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __WFE() __ASM volatile ("wfe") + 851:Drivers/CMSIS/Include/cmsis_gcc.h **** + 852:Drivers/CMSIS/Include/cmsis_gcc.h **** + 853:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 854:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Send Event + 855:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + 856:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 857:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __SEV() __ASM volatile ("sev") + 858:Drivers/CMSIS/Include/cmsis_gcc.h **** + 859:Drivers/CMSIS/Include/cmsis_gcc.h **** + 860:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 861:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Instruction Synchronization Barrier + 862:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Instruction Synchronization Barrier flushes the pipeline in the processor, + 863:Drivers/CMSIS/Include/cmsis_gcc.h **** so that all instructions following the ISB are fetched from cache or memory, + 864:Drivers/CMSIS/Include/cmsis_gcc.h **** after the instruction has been completed. + 865:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 866:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __ISB(void) + 867:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 868:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("isb 0xF":::"memory"); + 869:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 870:Drivers/CMSIS/Include/cmsis_gcc.h **** + 871:Drivers/CMSIS/Include/cmsis_gcc.h **** + 872:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 873:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Data Synchronization Barrier + 874:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Acts as a special kind of Data Memory Barrier. + 875:Drivers/CMSIS/Include/cmsis_gcc.h **** It completes when all explicit memory accesses before this instruction complete. + 876:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 877:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __DSB(void) + 878:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 879:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("dsb 0xF":::"memory"); + 880:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 881:Drivers/CMSIS/Include/cmsis_gcc.h **** + 882:Drivers/CMSIS/Include/cmsis_gcc.h **** + 883:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 884:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Data Memory Barrier + 885:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Ensures the apparent order of the explicit memory operations before + 886:Drivers/CMSIS/Include/cmsis_gcc.h **** and after the instruction, without ensuring their completion. + 887:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 888:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __DMB(void) + ARM GAS /tmp/ccLRLOP3.s page 41 + + + 889:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 890:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("dmb 0xF":::"memory"); + 891:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 892:Drivers/CMSIS/Include/cmsis_gcc.h **** + 893:Drivers/CMSIS/Include/cmsis_gcc.h **** + 894:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 895:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Reverse byte order (32 bit) + 896:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x785 + 897:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] value Value to reverse + 898:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Reversed value + 899:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 900:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __REV(uint32_t value) + 901:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 902:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) + 903:Drivers/CMSIS/Include/cmsis_gcc.h **** return __builtin_bswap32(value); + 904:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 905:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 906:Drivers/CMSIS/Include/cmsis_gcc.h **** + 907:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + 908:Drivers/CMSIS/Include/cmsis_gcc.h **** return result; + 909:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 910:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 911:Drivers/CMSIS/Include/cmsis_gcc.h **** + 912:Drivers/CMSIS/Include/cmsis_gcc.h **** + 913:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 914:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Reverse byte order (16 bit) + 915:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes + 916:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] value Value to reverse + 917:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Reversed value + 918:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 919:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __REV16(uint32_t value) + 920:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 921:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 922:Drivers/CMSIS/Include/cmsis_gcc.h **** + 923:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + 924:Drivers/CMSIS/Include/cmsis_gcc.h **** return result; + 925:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 926:Drivers/CMSIS/Include/cmsis_gcc.h **** + 927:Drivers/CMSIS/Include/cmsis_gcc.h **** + 928:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 929:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Reverse byte order (16 bit) + 930:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For exam + 931:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] value Value to reverse + 932:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Reversed value + 933:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 934:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE int16_t __REVSH(int16_t value) + 935:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 936:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + 937:Drivers/CMSIS/Include/cmsis_gcc.h **** return (int16_t)__builtin_bswap16(value); + 938:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 939:Drivers/CMSIS/Include/cmsis_gcc.h **** int16_t result; + 940:Drivers/CMSIS/Include/cmsis_gcc.h **** + 941:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + 942:Drivers/CMSIS/Include/cmsis_gcc.h **** return result; + 943:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 944:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 945:Drivers/CMSIS/Include/cmsis_gcc.h **** + ARM GAS /tmp/ccLRLOP3.s page 42 + + + 946:Drivers/CMSIS/Include/cmsis_gcc.h **** + 947:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 948:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Rotate Right in unsigned value (32 bit) + 949:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Rotate Right (immediate) provides the value of the contents of a register rotated by a v + 950:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] op1 Value to rotate + 951:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] op2 Number of Bits to rotate + 952:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Rotated value + 953:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 954:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) + 955:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 956:Drivers/CMSIS/Include/cmsis_gcc.h **** op2 %= 32U; + 957:Drivers/CMSIS/Include/cmsis_gcc.h **** if (op2 == 0U) + 958:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 959:Drivers/CMSIS/Include/cmsis_gcc.h **** return op1; + 960:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 961:Drivers/CMSIS/Include/cmsis_gcc.h **** return (op1 >> op2) | (op1 << (32U - op2)); + 962:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 963:Drivers/CMSIS/Include/cmsis_gcc.h **** + 964:Drivers/CMSIS/Include/cmsis_gcc.h **** + 965:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 966:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Breakpoint + 967:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Causes the processor to enter Debug state. + 968:Drivers/CMSIS/Include/cmsis_gcc.h **** Debug tools can use this to investigate system state when the instruction at a particula + 969:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] value is ignored by the processor. + 970:Drivers/CMSIS/Include/cmsis_gcc.h **** If required, a debugger can use it to store additional information about the break + 971:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 972:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __BKPT(value) __ASM volatile ("bkpt "#value) + 973:Drivers/CMSIS/Include/cmsis_gcc.h **** + 974:Drivers/CMSIS/Include/cmsis_gcc.h **** + 975:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 976:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Reverse bit order of value + 977:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Reverses the bit order of the given value. + 978:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] value Value to reverse + 979:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Reversed value + 980:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __RBIT(uint32_t value) + 403 .loc 2 981 31 is_stmt 1 view .LVU96 + 404 .LBB9: + 982:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 405 .loc 2 983 3 view .LVU97 + 984:Drivers/CMSIS/Include/cmsis_gcc.h **** + 985:Drivers/CMSIS/Include/cmsis_gcc.h **** #if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + 986:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + 987:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 406 .loc 2 988 4 view .LVU98 + 407 0008 4FF48073 mov r3, #256 + 408 .syntax unified + 409 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 410 000c 93FAA3F3 rbit r3, r3 + 411 @ 0 "" 2 + 412 .LVL26: + 989:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 990:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */ + 991:Drivers/CMSIS/Include/cmsis_gcc.h **** + 992:Drivers/CMSIS/Include/cmsis_gcc.h **** result = value; /* r will be reversed bits of v; first get LSB of v */ + ARM GAS /tmp/ccLRLOP3.s page 43 + + + 993:Drivers/CMSIS/Include/cmsis_gcc.h **** for (value >>= 1U; value != 0U; value >>= 1U) + 994:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 995:Drivers/CMSIS/Include/cmsis_gcc.h **** result <<= 1U; + 996:Drivers/CMSIS/Include/cmsis_gcc.h **** result |= value & 1U; + 997:Drivers/CMSIS/Include/cmsis_gcc.h **** s--; + 998:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 999:Drivers/CMSIS/Include/cmsis_gcc.h **** result <<= s; /* shift when v's highest bits are zero */ +1000:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif +1001:Drivers/CMSIS/Include/cmsis_gcc.h **** return result; + 413 .loc 2 1001 3 view .LVU99 + 414 .loc 2 1001 3 is_stmt 0 view .LVU100 + 415 .thumb + 416 .syntax unified + 417 .LBE9: + 418 .LBE8: + 419 .loc 1 933 63 view .LVU101 + 420 0010 B3FA83F3 clz r3, r3 + 421 .loc 1 933 60 view .LVU102 + 422 0014 D840 lsrs r0, r0, r3 + 934:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 423 .loc 1 934 1 view .LVU103 + 424 0016 C0B2 uxtb r0, r0 + 425 0018 7047 bx lr + 426 .L33: + 427 001a 00BF .align 2 + 428 .L32: + 429 001c 00200240 .word 1073881088 + 430 .cfi_endproc + 431 .LFE144: + 433 .section .text.HAL_FLASHEx_OBErase,"ax",%progbits + 434 .align 1 + 435 .global HAL_FLASHEx_OBErase + 436 .syntax unified + 437 .thumb + 438 .thumb_func + 440 HAL_FLASHEx_OBErase: + 441 .LFB132: + 314:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** uint8_t rdptmp = OB_RDP_LEVEL_0; + 442 .loc 1 314 1 is_stmt 1 view -0 + 443 .cfi_startproc + 444 @ args = 0, pretend = 0, frame = 0 + 445 @ frame_needed = 0, uses_anonymous_args = 0 + 446 0000 38B5 push {r3, r4, r5, lr} + 447 .cfi_def_cfa_offset 16 + 448 .cfi_offset 3, -16 + 449 .cfi_offset 4, -12 + 450 .cfi_offset 5, -8 + 451 .cfi_offset 14, -4 + 315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** HAL_StatusTypeDef status = HAL_ERROR; + 452 .loc 1 315 3 view .LVU105 + 453 .LVL27: + 316:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 454 .loc 1 316 3 view .LVU106 + 319:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 455 .loc 1 319 3 view .LVU107 + 319:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 456 .loc 1 319 12 is_stmt 0 view .LVU108 + ARM GAS /tmp/ccLRLOP3.s page 44 + + + 457 0002 FFF7FEFF bl FLASH_OB_GetRDP + 458 .LVL28: + 319:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 459 .loc 1 319 10 view .LVU109 + 460 0006 C5B2 uxtb r5, r0 + 461 .LVL29: + 322:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 462 .loc 1 322 3 is_stmt 1 view .LVU110 + 322:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 463 .loc 1 322 12 is_stmt 0 view .LVU111 + 464 0008 4CF25030 movw r0, #50000 + 465 000c FFF7FEFF bl FLASH_WaitForLastOperation + 466 .LVL30: + 324:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 467 .loc 1 324 3 is_stmt 1 view .LVU112 + 324:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 468 .loc 1 324 5 is_stmt 0 view .LVU113 + 469 0010 00B1 cbz r0, .L37 + 470 .LVL31: + 471 .L35: + 347:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 472 .loc 1 347 3 is_stmt 1 view .LVU114 + 348:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 473 .loc 1 348 1 is_stmt 0 view .LVU115 + 474 0012 38BD pop {r3, r4, r5, pc} + 475 .LVL32: + 476 .L37: + 327:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 477 .loc 1 327 5 is_stmt 1 view .LVU116 + 327:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 478 .loc 1 327 22 is_stmt 0 view .LVU117 + 479 0014 0C4B ldr r3, .L38 + 480 0016 0022 movs r2, #0 + 481 0018 DA61 str r2, [r3, #28] + 330:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** SET_BIT(FLASH->CR, FLASH_CR_STRT); + 482 .loc 1 330 5 is_stmt 1 view .LVU118 + 483 001a 0C4C ldr r4, .L38+4 + 484 001c 2369 ldr r3, [r4, #16] + 485 001e 43F02003 orr r3, r3, #32 + 486 0022 2361 str r3, [r4, #16] + 331:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 487 .loc 1 331 5 view .LVU119 + 488 0024 2369 ldr r3, [r4, #16] + 489 0026 43F04003 orr r3, r3, #64 + 490 002a 2361 str r3, [r4, #16] + 334:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 491 .loc 1 334 5 view .LVU120 + 334:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 492 .loc 1 334 14 is_stmt 0 view .LVU121 + 493 002c 4CF25030 movw r0, #50000 + 494 0030 FFF7FEFF bl FLASH_WaitForLastOperation + 495 .LVL33: + 337:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 496 .loc 1 337 5 is_stmt 1 view .LVU122 + 497 0034 2369 ldr r3, [r4, #16] + 498 0036 23F02003 bic r3, r3, #32 + 499 003a 2361 str r3, [r4, #16] + ARM GAS /tmp/ccLRLOP3.s page 45 + + + 339:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 500 .loc 1 339 5 view .LVU123 + 339:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 501 .loc 1 339 7 is_stmt 0 view .LVU124 + 502 003c 0028 cmp r0, #0 + 503 003e E8D1 bne .L35 + 342:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 504 .loc 1 342 7 is_stmt 1 view .LVU125 + 342:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 505 .loc 1 342 16 is_stmt 0 view .LVU126 + 506 0040 2846 mov r0, r5 + 507 .LVL34: + 342:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 508 .loc 1 342 16 view .LVU127 + 509 0042 FFF7FEFF bl FLASH_OB_RDP_LevelConfig + 510 .LVL35: + 342:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 511 .loc 1 342 16 view .LVU128 + 512 0046 E4E7 b .L35 + 513 .L39: + 514 .align 2 + 515 .L38: + 516 0048 00000000 .word pFlash + 517 004c 00200240 .word 1073881088 + 518 .cfi_endproc + 519 .LFE132: + 521 .section .text.FLASH_OB_EnableWRP,"ax",%progbits + 522 .align 1 + 523 .syntax unified + 524 .thumb + 525 .thumb_func + 527 FLASH_OB_EnableWRP: + 528 .LVL36: + 529 .LFB137: + 522:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** HAL_StatusTypeDef status = HAL_OK; + 530 .loc 1 522 1 is_stmt 1 view -0 + 531 .cfi_startproc + 532 @ args = 0, pretend = 0, frame = 0 + 533 @ frame_needed = 0, uses_anonymous_args = 0 + 522:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** HAL_StatusTypeDef status = HAL_OK; + 534 .loc 1 522 1 is_stmt 0 view .LVU130 + 535 0000 F8B5 push {r3, r4, r5, r6, r7, lr} + 536 .cfi_def_cfa_offset 24 + 537 .cfi_offset 3, -24 + 538 .cfi_offset 4, -20 + 539 .cfi_offset 5, -16 + 540 .cfi_offset 6, -12 + 541 .cfi_offset 7, -8 + 542 .cfi_offset 14, -4 + 543 0002 0446 mov r4, r0 + 523:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** uint16_t WRP0_Data = 0xFFFFU; + 544 .loc 1 523 3 is_stmt 1 view .LVU131 + 545 .LVL37: + 524:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #if defined(OB_WRP1_WRP1) + 546 .loc 1 524 3 view .LVU132 + 526:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif /* OB_WRP1_WRP1 */ + 547 .loc 1 526 3 view .LVU133 + ARM GAS /tmp/ccLRLOP3.s page 46 + + + 529:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif /* OB_WRP2_WRP2 */ + 548 .loc 1 529 3 view .LVU134 + 532:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif /* OB_WRP3_WRP3 */ + 549 .loc 1 532 3 view .LVU135 + 536:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 550 .loc 1 536 3 view .LVU136 + 539:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 551 .loc 1 539 3 view .LVU137 + 539:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 552 .loc 1 539 37 is_stmt 0 view .LVU138 + 553 0004 FFF7FEFF bl FLASH_OB_GetWRP + 554 .LVL38: + 539:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 555 .loc 1 539 20 view .LVU139 + 556 0008 20EA0400 bic r0, r0, r4 + 557 .LVL39: + 542:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif /* OB_WRP_PAGES0TO31MASK */ + 558 .loc 1 542 3 is_stmt 1 view .LVU140 + 542:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif /* OB_WRP_PAGES0TO31MASK */ + 559 .loc 1 542 13 is_stmt 0 view .LVU141 + 560 000c C5B2 uxtb r5, r0 + 561 .LVL40: + 546:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif /* OB_WRP_PAGES32TO63MASK */ + 562 .loc 1 546 3 is_stmt 1 view .LVU142 + 546:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif /* OB_WRP_PAGES32TO63MASK */ + 563 .loc 1 546 13 is_stmt 0 view .LVU143 + 564 000e C0F30727 ubfx r7, r0, #8, #8 + 565 .LVL41: + 550:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif /* OB_WRP_PAGES32TO47MASK */ + 566 .loc 1 550 3 is_stmt 1 view .LVU144 + 550:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif /* OB_WRP_PAGES32TO47MASK */ + 567 .loc 1 550 13 is_stmt 0 view .LVU145 + 568 0012 C0F30746 ubfx r6, r0, #16, #8 + 569 .LVL42: + 554:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #elif defined(OB_WRP_PAGES48TO255MASK) + 570 .loc 1 554 3 is_stmt 1 view .LVU146 + 554:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #elif defined(OB_WRP_PAGES48TO255MASK) + 571 .loc 1 554 13 is_stmt 0 view .LVU147 + 572 0016 040E lsrs r4, r0, #24 + 573 .LVL43: + 560:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 574 .loc 1 560 3 is_stmt 1 view .LVU148 + 560:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 575 .loc 1 560 12 is_stmt 0 view .LVU149 + 576 0018 4CF25030 movw r0, #50000 + 577 .LVL44: + 560:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 578 .loc 1 560 12 view .LVU150 + 579 001c FFF7FEFF bl FLASH_WaitForLastOperation + 580 .LVL45: + 562:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 581 .loc 1 562 3 is_stmt 1 view .LVU151 + 562:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 582 .loc 1 562 5 is_stmt 0 view .LVU152 + 583 0020 0346 mov r3, r0 + 584 0022 08B1 cbz r0, .L47 + 585 .LVL46: + ARM GAS /tmp/ccLRLOP3.s page 47 + + + 586 .L41: + 619:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 587 .loc 1 619 3 is_stmt 1 view .LVU153 + 620:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 588 .loc 1 620 1 is_stmt 0 view .LVU154 + 589 0024 1846 mov r0, r3 + 590 0026 F8BD pop {r3, r4, r5, r6, r7, pc} + 591 .LVL47: + 592 .L47: + 565:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 593 .loc 1 565 5 is_stmt 1 view .LVU155 + 565:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 594 .loc 1 565 22 is_stmt 0 view .LVU156 + 595 0028 234B ldr r3, .L52 + 596 002a 0022 movs r2, #0 + 597 002c DA61 str r2, [r3, #28] + 568:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if (status == HAL_OK) + 598 .loc 1 568 5 is_stmt 1 view .LVU157 + 568:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if (status == HAL_OK) + 599 .loc 1 568 14 is_stmt 0 view .LVU158 + 600 002e FFF7FEFF bl HAL_FLASHEx_OBErase + 601 .LVL48: + 569:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 602 .loc 1 569 5 is_stmt 1 view .LVU159 + 569:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 603 .loc 1 569 8 is_stmt 0 view .LVU160 + 604 0032 0346 mov r3, r0 + 605 0034 0028 cmp r0, #0 + 606 0036 F5D1 bne .L41 + 572:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 607 .loc 1 572 7 is_stmt 1 view .LVU161 + 608 0038 2049 ldr r1, .L52+4 + 609 003a 0A69 ldr r2, [r1, #16] + 610 003c 42F01002 orr r2, r2, #16 + 611 0040 0A61 str r2, [r1, #16] + 575:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 612 .loc 1 575 7 view .LVU162 + 575:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 613 .loc 1 575 9 is_stmt 0 view .LVU163 + 614 0042 FF2D cmp r5, #255 + 615 0044 0ED1 bne .L48 + 616 .LVL49: + 617 .L42: + 585:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 618 .loc 1 585 7 is_stmt 1 view .LVU164 + 585:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 619 .loc 1 585 9 is_stmt 0 view .LVU165 + 620 0046 23B9 cbnz r3, .L43 + 585:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 621 .loc 1 585 29 discriminator 1 view .LVU166 + 622 0048 FF2F cmp r7, #255 + 623 004a 15D1 bne .L49 + 624 .LVL50: + 625 .L44: + 595:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 626 .loc 1 595 7 is_stmt 1 view .LVU167 + 595:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + ARM GAS /tmp/ccLRLOP3.s page 48 + + + 627 .loc 1 595 9 is_stmt 0 view .LVU168 + 628 004c 23B9 cbnz r3, .L45 + 595:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 629 .loc 1 595 29 discriminator 1 view .LVU169 + 630 004e FF2E cmp r6, #255 + 631 0050 1CD1 bne .L50 + 632 .LVL51: + 633 .L43: + 605:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 634 .loc 1 605 7 is_stmt 1 view .LVU170 + 605:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 635 .loc 1 605 9 is_stmt 0 view .LVU171 + 636 0052 0BB9 cbnz r3, .L45 + 605:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 637 .loc 1 605 29 discriminator 1 view .LVU172 + 638 0054 FF2C cmp r4, #255 + 639 0056 23D1 bne .L51 + 640 .L45: + 615:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 641 .loc 1 615 7 is_stmt 1 view .LVU173 + 642 0058 1849 ldr r1, .L52+4 + 643 005a 0A69 ldr r2, [r1, #16] + 644 005c 22F01002 bic r2, r2, #16 + 645 0060 0A61 str r2, [r1, #16] + 646 0062 DFE7 b .L41 + 647 .LVL52: + 648 .L48: + 577:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 649 .loc 1 577 9 view .LVU174 + 577:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 650 .loc 1 577 11 is_stmt 0 view .LVU175 + 651 0064 164B ldr r3, .L52+8 + 652 0066 1A89 ldrh r2, [r3, #8] + 577:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 653 .loc 1 577 18 view .LVU176 + 654 0068 1540 ands r5, r5, r2 + 655 .LVL53: + 577:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 656 .loc 1 577 18 view .LVU177 + 657 006a 1D81 strh r5, [r3, #8] @ movhi + 580:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 658 .loc 1 580 9 is_stmt 1 view .LVU178 + 580:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 659 .loc 1 580 18 is_stmt 0 view .LVU179 + 660 006c 4CF25030 movw r0, #50000 + 661 .LVL54: + 580:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 662 .loc 1 580 18 view .LVU180 + 663 0070 FFF7FEFF bl FLASH_WaitForLastOperation + 664 .LVL55: + 665 0074 0346 mov r3, r0 + 666 .LVL56: + 580:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 667 .loc 1 580 18 view .LVU181 + 668 0076 E6E7 b .L42 + 669 .L49: + 587:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + ARM GAS /tmp/ccLRLOP3.s page 49 + + + 670 .loc 1 587 9 is_stmt 1 view .LVU182 + 587:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 671 .loc 1 587 11 is_stmt 0 view .LVU183 + 672 0078 114B ldr r3, .L52+8 + 673 .LVL57: + 587:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 674 .loc 1 587 11 view .LVU184 + 675 007a 5A89 ldrh r2, [r3, #10] + 587:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 676 .loc 1 587 18 view .LVU185 + 677 007c 1740 ands r7, r7, r2 + 678 .LVL58: + 587:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 679 .loc 1 587 18 view .LVU186 + 680 007e 5F81 strh r7, [r3, #10] @ movhi + 590:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 681 .loc 1 590 9 is_stmt 1 view .LVU187 + 590:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 682 .loc 1 590 18 is_stmt 0 view .LVU188 + 683 0080 4CF25030 movw r0, #50000 + 684 0084 FFF7FEFF bl FLASH_WaitForLastOperation + 685 .LVL59: + 686 0088 0346 mov r3, r0 + 687 .LVL60: + 590:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 688 .loc 1 590 18 view .LVU189 + 689 008a DFE7 b .L44 + 690 .L50: + 597:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 691 .loc 1 597 9 is_stmt 1 view .LVU190 + 597:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 692 .loc 1 597 11 is_stmt 0 view .LVU191 + 693 008c 0C4B ldr r3, .L52+8 + 694 .LVL61: + 597:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 695 .loc 1 597 11 view .LVU192 + 696 008e 9A89 ldrh r2, [r3, #12] + 597:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 697 .loc 1 597 18 view .LVU193 + 698 0090 1640 ands r6, r6, r2 + 699 .LVL62: + 597:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 700 .loc 1 597 18 view .LVU194 + 701 0092 9E81 strh r6, [r3, #12] @ movhi + 600:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 702 .loc 1 600 9 is_stmt 1 view .LVU195 + 600:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 703 .loc 1 600 18 is_stmt 0 view .LVU196 + 704 0094 4CF25030 movw r0, #50000 + 705 0098 FFF7FEFF bl FLASH_WaitForLastOperation + 706 .LVL63: + 707 009c 0346 mov r3, r0 + 708 .LVL64: + 600:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 709 .loc 1 600 18 view .LVU197 + 710 009e D8E7 b .L43 + 711 .L51: + ARM GAS /tmp/ccLRLOP3.s page 50 + + + 607:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 712 .loc 1 607 9 is_stmt 1 view .LVU198 + 607:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 713 .loc 1 607 11 is_stmt 0 view .LVU199 + 714 00a0 074B ldr r3, .L52+8 + 715 .LVL65: + 607:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 716 .loc 1 607 11 view .LVU200 + 717 00a2 DA89 ldrh r2, [r3, #14] + 607:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 718 .loc 1 607 18 view .LVU201 + 719 00a4 04EA0200 and r0, r4, r2 + 720 00a8 D881 strh r0, [r3, #14] @ movhi + 610:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 721 .loc 1 610 9 is_stmt 1 view .LVU202 + 610:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 722 .loc 1 610 18 is_stmt 0 view .LVU203 + 723 00aa 4CF25030 movw r0, #50000 + 724 00ae FFF7FEFF bl FLASH_WaitForLastOperation + 725 .LVL66: + 726 00b2 0346 mov r3, r0 + 727 .LVL67: + 610:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 728 .loc 1 610 18 view .LVU204 + 729 00b4 D0E7 b .L45 + 730 .L53: + 731 00b6 00BF .align 2 + 732 .L52: + 733 00b8 00000000 .word pFlash + 734 00bc 00200240 .word 1073881088 + 735 00c0 00F8FF1F .word 536868864 + 736 .cfi_endproc + 737 .LFE137: + 739 .section .text.FLASH_OB_DisableWRP,"ax",%progbits + 740 .align 1 + 741 .syntax unified + 742 .thumb + 743 .thumb_func + 745 FLASH_OB_DisableWRP: + 746 .LVL68: + 747 .LFB138: + 634:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** HAL_StatusTypeDef status = HAL_OK; + 748 .loc 1 634 1 is_stmt 1 view -0 + 749 .cfi_startproc + 750 @ args = 0, pretend = 0, frame = 0 + 751 @ frame_needed = 0, uses_anonymous_args = 0 + 634:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** HAL_StatusTypeDef status = HAL_OK; + 752 .loc 1 634 1 is_stmt 0 view .LVU206 + 753 0000 F8B5 push {r3, r4, r5, r6, r7, lr} + 754 .cfi_def_cfa_offset 24 + 755 .cfi_offset 3, -24 + 756 .cfi_offset 4, -20 + 757 .cfi_offset 5, -16 + 758 .cfi_offset 6, -12 + 759 .cfi_offset 7, -8 + 760 .cfi_offset 14, -4 + 761 0002 0446 mov r4, r0 + ARM GAS /tmp/ccLRLOP3.s page 51 + + + 635:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** uint16_t WRP0_Data = 0xFFFFU; + 762 .loc 1 635 3 is_stmt 1 view .LVU207 + 763 .LVL69: + 636:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #if defined(OB_WRP1_WRP1) + 764 .loc 1 636 3 view .LVU208 + 638:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif /* OB_WRP1_WRP1 */ + 765 .loc 1 638 3 view .LVU209 + 641:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif /* OB_WRP2_WRP2 */ + 766 .loc 1 641 3 view .LVU210 + 644:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif /* OB_WRP3_WRP3 */ + 767 .loc 1 644 3 view .LVU211 + 648:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 768 .loc 1 648 3 view .LVU212 + 651:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 769 .loc 1 651 3 view .LVU213 + 651:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 770 .loc 1 651 23 is_stmt 0 view .LVU214 + 771 0004 FFF7FEFF bl FLASH_OB_GetWRP + 772 .LVL70: + 651:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 773 .loc 1 651 20 view .LVU215 + 774 0008 2043 orrs r0, r0, r4 + 775 .LVL71: + 654:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif /* OB_WRP_PAGES0TO31MASK */ + 776 .loc 1 654 3 is_stmt 1 view .LVU216 + 654:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif /* OB_WRP_PAGES0TO31MASK */ + 777 .loc 1 654 13 is_stmt 0 view .LVU217 + 778 000a C5B2 uxtb r5, r0 + 779 .LVL72: + 658:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif /* OB_WRP_PAGES32TO63MASK */ + 780 .loc 1 658 3 is_stmt 1 view .LVU218 + 658:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif /* OB_WRP_PAGES32TO63MASK */ + 781 .loc 1 658 13 is_stmt 0 view .LVU219 + 782 000c C0F30727 ubfx r7, r0, #8, #8 + 783 .LVL73: + 662:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif /* OB_WRP_PAGES32TO47MASK */ + 784 .loc 1 662 3 is_stmt 1 view .LVU220 + 662:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #endif /* OB_WRP_PAGES32TO47MASK */ + 785 .loc 1 662 13 is_stmt 0 view .LVU221 + 786 0010 C0F30746 ubfx r6, r0, #16, #8 + 787 .LVL74: + 666:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #elif defined(OB_WRP_PAGES48TO255MASK) + 788 .loc 1 666 3 is_stmt 1 view .LVU222 + 666:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** #elif defined(OB_WRP_PAGES48TO255MASK) + 789 .loc 1 666 13 is_stmt 0 view .LVU223 + 790 0014 040E lsrs r4, r0, #24 + 791 .LVL75: + 673:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 792 .loc 1 673 3 is_stmt 1 view .LVU224 + 673:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 793 .loc 1 673 12 is_stmt 0 view .LVU225 + 794 0016 4CF25030 movw r0, #50000 + 795 .LVL76: + 673:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 796 .loc 1 673 12 view .LVU226 + 797 001a FFF7FEFF bl FLASH_WaitForLastOperation + 798 .LVL77: + ARM GAS /tmp/ccLRLOP3.s page 52 + + + 675:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 799 .loc 1 675 3 is_stmt 1 view .LVU227 + 675:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 800 .loc 1 675 5 is_stmt 0 view .LVU228 + 801 001e 0346 mov r3, r0 + 802 0020 08B1 cbz r0, .L61 + 803 .LVL78: + 804 .L55: + 730:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 805 .loc 1 730 3 is_stmt 1 view .LVU229 + 731:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 806 .loc 1 731 1 is_stmt 0 view .LVU230 + 807 0022 1846 mov r0, r3 + 808 0024 F8BD pop {r3, r4, r5, r6, r7, pc} + 809 .LVL79: + 810 .L61: + 678:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 811 .loc 1 678 5 is_stmt 1 view .LVU231 + 678:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 812 .loc 1 678 22 is_stmt 0 view .LVU232 + 813 0026 254B ldr r3, .L66 + 814 0028 0022 movs r2, #0 + 815 002a DA61 str r2, [r3, #28] + 681:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if (status == HAL_OK) + 816 .loc 1 681 5 is_stmt 1 view .LVU233 + 681:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if (status == HAL_OK) + 817 .loc 1 681 14 is_stmt 0 view .LVU234 + 818 002c FFF7FEFF bl HAL_FLASHEx_OBErase + 819 .LVL80: + 682:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 820 .loc 1 682 5 is_stmt 1 view .LVU235 + 682:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 821 .loc 1 682 8 is_stmt 0 view .LVU236 + 822 0030 0346 mov r3, r0 + 823 0032 0028 cmp r0, #0 + 824 0034 F5D1 bne .L55 + 684:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 825 .loc 1 684 7 is_stmt 1 view .LVU237 + 826 0036 2249 ldr r1, .L66+4 + 827 0038 0A69 ldr r2, [r1, #16] + 828 003a 42F01002 orr r2, r2, #16 + 829 003e 0A61 str r2, [r1, #16] + 687:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 830 .loc 1 687 7 view .LVU238 + 687:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 831 .loc 1 687 9 is_stmt 0 view .LVU239 + 832 0040 FF2D cmp r5, #255 + 833 0042 0ED1 bne .L62 + 834 .LVL81: + 835 .L56: + 697:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 836 .loc 1 697 7 is_stmt 1 view .LVU240 + 697:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 837 .loc 1 697 9 is_stmt 0 view .LVU241 + 838 0044 23B9 cbnz r3, .L57 + 697:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 839 .loc 1 697 29 discriminator 1 view .LVU242 + ARM GAS /tmp/ccLRLOP3.s page 53 + + + 840 0046 FF2F cmp r7, #255 + 841 0048 16D1 bne .L63 + 842 .L58: + 707:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 843 .loc 1 707 7 is_stmt 1 view .LVU243 + 707:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 844 .loc 1 707 9 is_stmt 0 view .LVU244 + 845 004a 23B9 cbnz r3, .L59 + 707:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 846 .loc 1 707 29 discriminator 1 view .LVU245 + 847 004c FF2E cmp r6, #255 + 848 004e 1ED1 bne .L64 + 849 .L57: + 717:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 850 .loc 1 717 7 is_stmt 1 view .LVU246 + 717:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 851 .loc 1 717 9 is_stmt 0 view .LVU247 + 852 0050 0BB9 cbnz r3, .L59 + 717:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 853 .loc 1 717 29 discriminator 1 view .LVU248 + 854 0052 FF2C cmp r4, #255 + 855 0054 26D1 bne .L65 + 856 .L59: + 727:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 857 .loc 1 727 7 is_stmt 1 view .LVU249 + 858 0056 1A49 ldr r1, .L66+4 + 859 0058 0A69 ldr r2, [r1, #16] + 860 005a 22F01002 bic r2, r2, #16 + 861 005e 0A61 str r2, [r1, #16] + 862 0060 DFE7 b .L55 + 863 .LVL82: + 864 .L62: + 689:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 865 .loc 1 689 9 view .LVU250 + 689:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 866 .loc 1 689 11 is_stmt 0 view .LVU251 + 867 0062 184A ldr r2, .L66+8 + 868 0064 1389 ldrh r3, [r2, #8] + 869 0066 9BB2 uxth r3, r3 + 689:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 870 .loc 1 689 18 view .LVU252 + 871 0068 2B43 orrs r3, r3, r5 + 872 006a 1381 strh r3, [r2, #8] @ movhi + 692:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 873 .loc 1 692 9 is_stmt 1 view .LVU253 + 692:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 874 .loc 1 692 18 is_stmt 0 view .LVU254 + 875 006c 4CF25030 movw r0, #50000 + 876 .LVL83: + 692:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 877 .loc 1 692 18 view .LVU255 + 878 0070 FFF7FEFF bl FLASH_WaitForLastOperation + 879 .LVL84: + 880 0074 0346 mov r3, r0 + 881 .LVL85: + 692:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 882 .loc 1 692 18 view .LVU256 + ARM GAS /tmp/ccLRLOP3.s page 54 + + + 883 0076 E5E7 b .L56 + 884 .L63: + 699:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 885 .loc 1 699 9 is_stmt 1 view .LVU257 + 699:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 886 .loc 1 699 11 is_stmt 0 view .LVU258 + 887 0078 124A ldr r2, .L66+8 + 888 007a 5389 ldrh r3, [r2, #10] + 889 .LVL86: + 699:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 890 .loc 1 699 11 view .LVU259 + 891 007c 9BB2 uxth r3, r3 + 699:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 892 .loc 1 699 18 view .LVU260 + 893 007e 3B43 orrs r3, r3, r7 + 894 0080 5381 strh r3, [r2, #10] @ movhi + 702:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 895 .loc 1 702 9 is_stmt 1 view .LVU261 + 702:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 896 .loc 1 702 18 is_stmt 0 view .LVU262 + 897 0082 4CF25030 movw r0, #50000 + 898 0086 FFF7FEFF bl FLASH_WaitForLastOperation + 899 .LVL87: + 900 008a 0346 mov r3, r0 + 901 .LVL88: + 702:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 902 .loc 1 702 18 view .LVU263 + 903 008c DDE7 b .L58 + 904 .L64: + 709:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 905 .loc 1 709 9 is_stmt 1 view .LVU264 + 709:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 906 .loc 1 709 11 is_stmt 0 view .LVU265 + 907 008e 0D4A ldr r2, .L66+8 + 908 0090 9389 ldrh r3, [r2, #12] + 909 .LVL89: + 709:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 910 .loc 1 709 11 view .LVU266 + 911 0092 9BB2 uxth r3, r3 + 709:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 912 .loc 1 709 18 view .LVU267 + 913 0094 3343 orrs r3, r3, r6 + 914 0096 9381 strh r3, [r2, #12] @ movhi + 712:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 915 .loc 1 712 9 is_stmt 1 view .LVU268 + 712:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 916 .loc 1 712 18 is_stmt 0 view .LVU269 + 917 0098 4CF25030 movw r0, #50000 + 918 009c FFF7FEFF bl FLASH_WaitForLastOperation + 919 .LVL90: + 920 00a0 0346 mov r3, r0 + 921 .LVL91: + 712:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 922 .loc 1 712 18 view .LVU270 + 923 00a2 D5E7 b .L57 + 924 .L65: + 719:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + ARM GAS /tmp/ccLRLOP3.s page 55 + + + 925 .loc 1 719 9 is_stmt 1 view .LVU271 + 719:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 926 .loc 1 719 11 is_stmt 0 view .LVU272 + 927 00a4 074A ldr r2, .L66+8 + 928 00a6 D389 ldrh r3, [r2, #14] + 929 .LVL92: + 719:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 930 .loc 1 719 11 view .LVU273 + 931 00a8 9BB2 uxth r3, r3 + 719:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 932 .loc 1 719 18 view .LVU274 + 933 00aa 2343 orrs r3, r3, r4 + 934 00ac D381 strh r3, [r2, #14] @ movhi + 722:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 935 .loc 1 722 9 is_stmt 1 view .LVU275 + 722:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 936 .loc 1 722 18 is_stmt 0 view .LVU276 + 937 00ae 4CF25030 movw r0, #50000 + 938 00b2 FFF7FEFF bl FLASH_WaitForLastOperation + 939 .LVL93: + 940 00b6 0346 mov r3, r0 + 941 .LVL94: + 722:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 942 .loc 1 722 18 view .LVU277 + 943 00b8 CDE7 b .L59 + 944 .L67: + 945 00ba 00BF .align 2 + 946 .L66: + 947 00bc 00000000 .word pFlash + 948 00c0 00200240 .word 1073881088 + 949 00c4 00F8FF1F .word 536868864 + 950 .cfi_endproc + 951 .LFE138: + 953 .section .text.HAL_FLASHEx_OBProgram,"ax",%progbits + 954 .align 1 + 955 .global HAL_FLASHEx_OBProgram + 956 .syntax unified + 957 .thumb + 958 .thumb_func + 960 HAL_FLASHEx_OBProgram: + 961 .LVL95: + 962 .LFB133: + 363:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** HAL_StatusTypeDef status = HAL_ERROR; + 963 .loc 1 363 1 is_stmt 1 view -0 + 964 .cfi_startproc + 965 @ args = 0, pretend = 0, frame = 0 + 966 @ frame_needed = 0, uses_anonymous_args = 0 + 364:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 967 .loc 1 364 3 view .LVU279 + 367:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 968 .loc 1 367 3 view .LVU280 + 367:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 969 .loc 1 367 3 view .LVU281 + 970 0000 254B ldr r3, .L86 + 971 0002 1B7E ldrb r3, [r3, #24] @ zero_extendqisi2 + 972 0004 012B cmp r3, #1 + 973 0006 44D0 beq .L76 + ARM GAS /tmp/ccLRLOP3.s page 56 + + + 363:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** HAL_StatusTypeDef status = HAL_ERROR; + 974 .loc 1 363 1 is_stmt 0 discriminator 2 view .LVU282 + 975 0008 10B5 push {r4, lr} + 976 .cfi_def_cfa_offset 8 + 977 .cfi_offset 4, -8 + 978 .cfi_offset 14, -4 + 979 000a 0446 mov r4, r0 + 367:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 980 .loc 1 367 3 is_stmt 1 discriminator 2 view .LVU283 + 981 000c 224B ldr r3, .L86 + 982 000e 0122 movs r2, #1 + 983 0010 1A76 strb r2, [r3, #24] + 367:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 984 .loc 1 367 3 discriminator 2 view .LVU284 + 370:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 985 .loc 1 370 3 discriminator 2 view .LVU285 + 373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 986 .loc 1 373 3 discriminator 2 view .LVU286 + 373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 987 .loc 1 373 14 is_stmt 0 discriminator 2 view .LVU287 + 988 0012 0368 ldr r3, [r0] + 373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 989 .loc 1 373 5 discriminator 2 view .LVU288 + 990 0014 13F0010F tst r3, #1 + 991 0018 0ED0 beq .L77 + 375:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if (pOBInit->WRPState == OB_WRPSTATE_ENABLE) + 992 .loc 1 375 5 is_stmt 1 view .LVU289 + 376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 993 .loc 1 376 5 view .LVU290 + 376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 994 .loc 1 376 16 is_stmt 0 view .LVU291 + 995 001a 4368 ldr r3, [r0, #4] + 376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 996 .loc 1 376 8 view .LVU292 + 997 001c 9342 cmp r3, r2 + 998 001e 07D0 beq .L82 + 384:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 999 .loc 1 384 7 is_stmt 1 view .LVU293 + 384:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 1000 .loc 1 384 16 is_stmt 0 view .LVU294 + 1001 0020 8068 ldr r0, [r0, #8] + 1002 .LVL96: + 384:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 1003 .loc 1 384 16 view .LVU295 + 1004 0022 FFF7FEFF bl FLASH_OB_DisableWRP + 1005 .LVL97: + 1006 .L72: + 386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 1007 .loc 1 386 5 is_stmt 1 view .LVU296 + 386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 1008 .loc 1 386 8 is_stmt 0 view .LVU297 + 1009 0026 40B1 cbz r0, .L70 + 389:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** return status; + 1010 .loc 1 389 7 is_stmt 1 view .LVU298 + 389:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** return status; + 1011 .loc 1 389 7 view .LVU299 + 1012 0028 1B4B ldr r3, .L86 + ARM GAS /tmp/ccLRLOP3.s page 57 + + + 1013 002a 0022 movs r2, #0 + 1014 002c 1A76 strb r2, [r3, #24] + 389:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** return status; + 1015 .loc 1 389 7 view .LVU300 + 390:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 1016 .loc 1 390 7 view .LVU301 + 390:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 1017 .loc 1 390 14 is_stmt 0 view .LVU302 + 1018 002e 13E0 b .L69 + 1019 .LVL98: + 1020 .L82: + 379:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 1021 .loc 1 379 7 is_stmt 1 view .LVU303 + 379:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 1022 .loc 1 379 16 is_stmt 0 view .LVU304 + 1023 0030 8068 ldr r0, [r0, #8] + 1024 .LVL99: + 379:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 1025 .loc 1 379 16 view .LVU305 + 1026 0032 FFF7FEFF bl FLASH_OB_EnableWRP + 1027 .LVL100: + 379:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 1028 .loc 1 379 16 view .LVU306 + 1029 0036 F6E7 b .L72 + 1030 .LVL101: + 1031 .L77: + 364:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1032 .loc 1 364 21 view .LVU307 + 1033 0038 0120 movs r0, #1 + 1034 .LVL102: + 1035 .L70: + 395:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 1036 .loc 1 395 3 is_stmt 1 view .LVU308 + 395:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 1037 .loc 1 395 14 is_stmt 0 view .LVU309 + 1038 003a 2368 ldr r3, [r4] + 395:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 1039 .loc 1 395 5 view .LVU310 + 1040 003c 13F0020F tst r3, #2 + 1041 0040 0BD1 bne .L83 + 1042 .L73: + 407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 1043 .loc 1 407 3 is_stmt 1 view .LVU311 + 407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 1044 .loc 1 407 14 is_stmt 0 view .LVU312 + 1045 0042 2368 ldr r3, [r4] + 407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 1046 .loc 1 407 5 view .LVU313 + 1047 0044 13F0040F tst r3, #4 + 1048 0048 10D1 bne .L84 + 1049 .L74: + 419:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 1050 .loc 1 419 3 is_stmt 1 view .LVU314 + 419:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 1051 .loc 1 419 14 is_stmt 0 view .LVU315 + 1052 004a 2368 ldr r3, [r4] + 419:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + ARM GAS /tmp/ccLRLOP3.s page 58 + + + 1053 .loc 1 419 5 view .LVU316 + 1054 004c 13F0080F tst r3, #8 + 1055 0050 15D1 bne .L85 + 1056 .L75: + 431:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1057 .loc 1 431 3 is_stmt 1 view .LVU317 + 431:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1058 .loc 1 431 3 view .LVU318 + 1059 0052 114B ldr r3, .L86 + 1060 0054 0022 movs r2, #0 + 1061 0056 1A76 strb r2, [r3, #24] + 431:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1062 .loc 1 431 3 view .LVU319 + 433:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 1063 .loc 1 433 3 view .LVU320 + 1064 .L69: + 434:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1065 .loc 1 434 1 is_stmt 0 view .LVU321 + 1066 0058 10BD pop {r4, pc} + 1067 .LVL103: + 1068 .L83: + 397:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if (status != HAL_OK) + 1069 .loc 1 397 5 is_stmt 1 view .LVU322 + 397:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if (status != HAL_OK) + 1070 .loc 1 397 14 is_stmt 0 view .LVU323 + 1071 005a 207B ldrb r0, [r4, #12] @ zero_extendqisi2 + 1072 .LVL104: + 397:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if (status != HAL_OK) + 1073 .loc 1 397 14 view .LVU324 + 1074 005c FFF7FEFF bl FLASH_OB_RDP_LevelConfig + 1075 .LVL105: + 398:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 1076 .loc 1 398 5 is_stmt 1 view .LVU325 + 398:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 1077 .loc 1 398 8 is_stmt 0 view .LVU326 + 1078 0060 0028 cmp r0, #0 + 1079 0062 EED0 beq .L73 + 401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** return status; + 1080 .loc 1 401 7 is_stmt 1 view .LVU327 + 401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** return status; + 1081 .loc 1 401 7 view .LVU328 + 1082 0064 0C4B ldr r3, .L86 + 1083 0066 0022 movs r2, #0 + 1084 0068 1A76 strb r2, [r3, #24] + 401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** return status; + 1085 .loc 1 401 7 view .LVU329 + 402:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 1086 .loc 1 402 7 view .LVU330 + 402:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 1087 .loc 1 402 14 is_stmt 0 view .LVU331 + 1088 006a F5E7 b .L69 + 1089 .L84: + 409:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if (status != HAL_OK) + 1090 .loc 1 409 5 is_stmt 1 view .LVU332 + 409:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if (status != HAL_OK) + 1091 .loc 1 409 14 is_stmt 0 view .LVU333 + 1092 006c 607B ldrb r0, [r4, #13] @ zero_extendqisi2 + ARM GAS /tmp/ccLRLOP3.s page 59 + + + 1093 .LVL106: + 409:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if (status != HAL_OK) + 1094 .loc 1 409 14 view .LVU334 + 1095 006e FFF7FEFF bl FLASH_OB_UserConfig + 1096 .LVL107: + 410:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 1097 .loc 1 410 5 is_stmt 1 view .LVU335 + 410:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 1098 .loc 1 410 8 is_stmt 0 view .LVU336 + 1099 0072 0028 cmp r0, #0 + 1100 0074 E9D0 beq .L74 + 413:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** return status; + 1101 .loc 1 413 7 is_stmt 1 view .LVU337 + 413:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** return status; + 1102 .loc 1 413 7 view .LVU338 + 1103 0076 084B ldr r3, .L86 + 1104 0078 0022 movs r2, #0 + 1105 007a 1A76 strb r2, [r3, #24] + 413:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** return status; + 1106 .loc 1 413 7 view .LVU339 + 414:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 1107 .loc 1 414 7 view .LVU340 + 414:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 1108 .loc 1 414 14 is_stmt 0 view .LVU341 + 1109 007c ECE7 b .L69 + 1110 .L85: + 421:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if (status != HAL_OK) + 1111 .loc 1 421 5 is_stmt 1 view .LVU342 + 421:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if (status != HAL_OK) + 1112 .loc 1 421 14 is_stmt 0 view .LVU343 + 1113 007e 217D ldrb r1, [r4, #20] @ zero_extendqisi2 + 1114 0080 2069 ldr r0, [r4, #16] + 1115 .LVL108: + 421:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** if (status != HAL_OK) + 1116 .loc 1 421 14 view .LVU344 + 1117 0082 FFF7FEFF bl FLASH_OB_ProgramData + 1118 .LVL109: + 422:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 1119 .loc 1 422 5 is_stmt 1 view .LVU345 + 422:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 1120 .loc 1 422 8 is_stmt 0 view .LVU346 + 1121 0086 0028 cmp r0, #0 + 1122 0088 E3D0 beq .L75 + 425:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** return status; + 1123 .loc 1 425 7 is_stmt 1 view .LVU347 + 425:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** return status; + 1124 .loc 1 425 7 view .LVU348 + 1125 008a 034B ldr r3, .L86 + 1126 008c 0022 movs r2, #0 + 1127 008e 1A76 strb r2, [r3, #24] + 425:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** return status; + 1128 .loc 1 425 7 view .LVU349 + 426:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 1129 .loc 1 426 7 view .LVU350 + 426:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 1130 .loc 1 426 14 is_stmt 0 view .LVU351 + 1131 0090 E2E7 b .L69 + ARM GAS /tmp/ccLRLOP3.s page 60 + + + 1132 .LVL110: + 1133 .L76: + 1134 .cfi_def_cfa_offset 0 + 1135 .cfi_restore 4 + 1136 .cfi_restore 14 + 367:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1137 .loc 1 367 3 view .LVU352 + 1138 0092 0220 movs r0, #2 + 1139 .LVL111: + 434:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1140 .loc 1 434 1 view .LVU353 + 1141 0094 7047 bx lr + 1142 .L87: + 1143 0096 00BF .align 2 + 1144 .L86: + 1145 0098 00000000 .word pFlash + 1146 .cfi_endproc + 1147 .LFE133: + 1149 .section .text.HAL_FLASHEx_OBGetConfig,"ax",%progbits + 1150 .align 1 + 1151 .global HAL_FLASHEx_OBGetConfig + 1152 .syntax unified + 1153 .thumb + 1154 .thumb_func + 1156 HAL_FLASHEx_OBGetConfig: + 1157 .LVL112: + 1158 .LFB134: + 444:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** pOBInit->OptionType = OPTIONBYTE_WRP | OPTIONBYTE_RDP | OPTIONBYTE_USER; + 1159 .loc 1 444 1 is_stmt 1 view -0 + 1160 .cfi_startproc + 1161 @ args = 0, pretend = 0, frame = 0 + 1162 @ frame_needed = 0, uses_anonymous_args = 0 + 444:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** pOBInit->OptionType = OPTIONBYTE_WRP | OPTIONBYTE_RDP | OPTIONBYTE_USER; + 1163 .loc 1 444 1 is_stmt 0 view .LVU355 + 1164 0000 10B5 push {r4, lr} + 1165 .cfi_def_cfa_offset 8 + 1166 .cfi_offset 4, -8 + 1167 .cfi_offset 14, -4 + 1168 0002 0446 mov r4, r0 + 445:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1169 .loc 1 445 3 is_stmt 1 view .LVU356 + 445:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1170 .loc 1 445 23 is_stmt 0 view .LVU357 + 1171 0004 0723 movs r3, #7 + 1172 0006 0360 str r3, [r0] + 448:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1173 .loc 1 448 3 is_stmt 1 view .LVU358 + 448:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1174 .loc 1 448 22 is_stmt 0 view .LVU359 + 1175 0008 FFF7FEFF bl FLASH_OB_GetWRP + 1176 .LVL113: + 448:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1177 .loc 1 448 20 view .LVU360 + 1178 000c A060 str r0, [r4, #8] + 451:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1179 .loc 1 451 3 is_stmt 1 view .LVU361 + 451:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + ARM GAS /tmp/ccLRLOP3.s page 61 + + + 1180 .loc 1 451 23 is_stmt 0 view .LVU362 + 1181 000e FFF7FEFF bl FLASH_OB_GetRDP + 1182 .LVL114: + 451:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1183 .loc 1 451 21 view .LVU363 + 1184 0012 2073 strb r0, [r4, #12] + 454:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 1185 .loc 1 454 3 is_stmt 1 view .LVU364 + 454:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 1186 .loc 1 454 25 is_stmt 0 view .LVU365 + 1187 0014 FFF7FEFF bl FLASH_OB_GetUser + 1188 .LVL115: + 454:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 1189 .loc 1 454 23 view .LVU366 + 1190 0018 6073 strb r0, [r4, #13] + 455:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1191 .loc 1 455 1 view .LVU367 + 1192 001a 10BD pop {r4, pc} + 455:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1193 .loc 1 455 1 view .LVU368 + 1194 .cfi_endproc + 1195 .LFE134: + 1197 .section .text.HAL_FLASHEx_OBGetUserData,"ax",%progbits + 1198 .align 1 + 1199 .global HAL_FLASHEx_OBGetUserData + 1200 .syntax unified + 1201 .thumb + 1202 .thumb_func + 1204 HAL_FLASHEx_OBGetUserData: + 1205 .LVL116: + 1206 .LFB135: + 466:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** uint32_t value = 0U; + 1207 .loc 1 466 1 is_stmt 1 view -0 + 1208 .cfi_startproc + 1209 @ args = 0, pretend = 0, frame = 0 + 1210 @ frame_needed = 0, uses_anonymous_args = 0 + 1211 @ link register save eliminated. + 467:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1212 .loc 1 467 3 view .LVU370 + 469:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 1213 .loc 1 469 3 view .LVU371 + 469:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 1214 .loc 1 469 6 is_stmt 0 view .LVU372 + 1215 0000 0D4B ldr r3, .L94 + 1216 0002 9842 cmp r0, r3 + 1217 0004 0BD0 beq .L93 + 477:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 1218 .loc 1 477 5 is_stmt 1 view .LVU373 + 477:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 1219 .loc 1 477 13 is_stmt 0 view .LVU374 + 1220 0006 0D4B ldr r3, .L94+4 + 1221 0008 D869 ldr r0, [r3, #28] + 1222 .LVL117: + 477:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 1223 .loc 1 477 13 view .LVU375 + 1224 000a 00F07F40 and r0, r0, #-16777216 + 1225 .LVL118: + ARM GAS /tmp/ccLRLOP3.s page 62 + + + 1226 .LBB10: + 1227 .LBI10: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 1228 .loc 2 981 31 is_stmt 1 view .LVU376 + 1229 .LBB11: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 1230 .loc 2 983 3 view .LVU377 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 1231 .loc 2 988 4 view .LVU378 + 1232 000e 4FF07F43 mov r3, #-16777216 + 1233 .syntax unified + 1234 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 1235 0012 93FAA3F3 rbit r3, r3 + 1236 @ 0 "" 2 + 1237 .LVL119: + 1238 .loc 2 1001 3 view .LVU379 + 1239 .loc 2 1001 3 is_stmt 0 view .LVU380 + 1240 .thumb + 1241 .syntax unified + 1242 .LBE11: + 1243 .LBE10: + 477:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 1244 .loc 1 477 54 view .LVU381 + 1245 0016 B3FA83F3 clz r3, r3 + 477:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 1246 .loc 1 477 11 view .LVU382 + 1247 001a D840 lsrs r0, r0, r3 + 1248 .LVL120: + 480:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 1249 .loc 1 480 3 is_stmt 1 view .LVU383 + 481:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1250 .loc 1 481 1 is_stmt 0 view .LVU384 + 1251 001c 7047 bx lr + 1252 .LVL121: + 1253 .L93: + 472:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 1254 .loc 1 472 5 is_stmt 1 view .LVU385 + 472:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 1255 .loc 1 472 13 is_stmt 0 view .LVU386 + 1256 001e 074B ldr r3, .L94+4 + 1257 0020 D869 ldr r0, [r3, #28] + 1258 .LVL122: + 472:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 1259 .loc 1 472 13 view .LVU387 + 1260 0022 00F47F00 and r0, r0, #16711680 + 1261 .LVL123: + 1262 .LBB12: + 1263 .LBI12: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 1264 .loc 2 981 31 is_stmt 1 view .LVU388 + 1265 .LBB13: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 1266 .loc 2 983 3 view .LVU389 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 1267 .loc 2 988 4 view .LVU390 + 1268 0026 4FF47F03 mov r3, #16711680 + 1269 .syntax unified + ARM GAS /tmp/ccLRLOP3.s page 63 + + + 1270 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 1271 002a 93FAA3F3 rbit r3, r3 + 1272 @ 0 "" 2 + 1273 .LVL124: + 1274 .loc 2 1001 3 view .LVU391 + 1275 .loc 2 1001 3 is_stmt 0 view .LVU392 + 1276 .thumb + 1277 .syntax unified + 1278 .LBE13: + 1279 .LBE12: + 472:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 1280 .loc 1 472 54 view .LVU393 + 1281 002e B3FA83F3 clz r3, r3 + 472:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 1282 .loc 1 472 11 view .LVU394 + 1283 0032 D840 lsrs r0, r0, r3 + 1284 .LVL125: + 472:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 1285 .loc 1 472 11 view .LVU395 + 1286 0034 7047 bx lr + 1287 .L95: + 1288 0036 00BF .align 2 + 1289 .L94: + 1290 0038 04F8FF1F .word 536868868 + 1291 003c 00200240 .word 1073881088 + 1292 .cfi_endproc + 1293 .LFE135: + 1295 .section .text.FLASH_PageErase,"ax",%progbits + 1296 .align 1 + 1297 .global FLASH_PageErase + 1298 .syntax unified + 1299 .thumb + 1300 .thumb_func + 1302 FLASH_PageErase: + 1303 .LVL126: + 1304 .LFB145: + 935:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 936:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /** + 937:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @} + 938:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** */ + 939:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 940:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /** + 941:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @} + 942:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** */ + 943:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 944:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /** @addtogroup FLASH + 945:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @{ + 946:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** */ + 947:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 948:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /** @addtogroup FLASH_Private_Functions + 949:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @{ + 950:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** */ + 951:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 952:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /** + 953:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @brief Erase the specified FLASH memory page + 954:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @param PageAddress FLASH page to erase + 955:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * The value of this parameter depend on device used within the same series + ARM GAS /tmp/ccLRLOP3.s page 64 + + + 956:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * + 957:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** * @retval None + 958:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** */ + 959:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** void FLASH_PageErase(uint32_t PageAddress) + 960:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 1305 .loc 1 960 1 is_stmt 1 view -0 + 1306 .cfi_startproc + 1307 @ args = 0, pretend = 0, frame = 0 + 1308 @ frame_needed = 0, uses_anonymous_args = 0 + 1309 @ link register save eliminated. + 961:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Clean the error context */ + 962:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** pFlash.ErrorCode = HAL_FLASH_ERROR_NONE; + 1310 .loc 1 962 3 view .LVU397 + 1311 .loc 1 962 20 is_stmt 0 view .LVU398 + 1312 0000 064B ldr r3, .L97 + 1313 0002 0022 movs r2, #0 + 1314 0004 DA61 str r2, [r3, #28] + 963:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 964:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** /* Proceed to erase the page */ + 965:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** SET_BIT(FLASH->CR, FLASH_CR_PER); + 1315 .loc 1 965 5 is_stmt 1 view .LVU399 + 1316 0006 064B ldr r3, .L97+4 + 1317 0008 1A69 ldr r2, [r3, #16] + 1318 000a 42F00202 orr r2, r2, #2 + 1319 000e 1A61 str r2, [r3, #16] + 966:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** WRITE_REG(FLASH->AR, PageAddress); + 1320 .loc 1 966 5 view .LVU400 + 1321 0010 5861 str r0, [r3, #20] + 967:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** SET_BIT(FLASH->CR, FLASH_CR_STRT); + 1322 .loc 1 967 5 view .LVU401 + 1323 0012 1A69 ldr r2, [r3, #16] + 1324 0014 42F04002 orr r2, r2, #64 + 1325 0018 1A61 str r2, [r3, #16] + 968:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 1326 .loc 1 968 1 is_stmt 0 view .LVU402 + 1327 001a 7047 bx lr + 1328 .L98: + 1329 .align 2 + 1330 .L97: + 1331 001c 00000000 .word pFlash + 1332 0020 00200240 .word 1073881088 + 1333 .cfi_endproc + 1334 .LFE145: + 1336 .section .text.HAL_FLASHEx_Erase,"ax",%progbits + 1337 .align 1 + 1338 .global HAL_FLASHEx_Erase + 1339 .syntax unified + 1340 .thumb + 1341 .thumb_func + 1343 HAL_FLASHEx_Erase: + 1344 .LVL127: + 1345 .LFB130: + 160:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** HAL_StatusTypeDef status = HAL_ERROR; + 1346 .loc 1 160 1 is_stmt 1 view -0 + 1347 .cfi_startproc + 1348 @ args = 0, pretend = 0, frame = 0 + 1349 @ frame_needed = 0, uses_anonymous_args = 0 + ARM GAS /tmp/ccLRLOP3.s page 65 + + + 161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** uint32_t address = 0U; + 1350 .loc 1 161 3 view .LVU404 + 162:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1351 .loc 1 162 3 view .LVU405 + 165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1352 .loc 1 165 3 view .LVU406 + 165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1353 .loc 1 165 3 view .LVU407 + 1354 0000 264B ldr r3, .L116 + 1355 0002 1B7E ldrb r3, [r3, #24] @ zero_extendqisi2 + 1356 0004 012B cmp r3, #1 + 1357 0006 45D0 beq .L106 + 160:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** HAL_StatusTypeDef status = HAL_ERROR; + 1358 .loc 1 160 1 is_stmt 0 discriminator 2 view .LVU408 + 1359 0008 70B5 push {r4, r5, r6, lr} + 1360 .cfi_def_cfa_offset 16 + 1361 .cfi_offset 4, -16 + 1362 .cfi_offset 5, -12 + 1363 .cfi_offset 6, -8 + 1364 .cfi_offset 14, -4 + 1365 000a 0546 mov r5, r0 + 1366 000c 0E46 mov r6, r1 + 165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1367 .loc 1 165 3 is_stmt 1 discriminator 2 view .LVU409 + 1368 000e 234B ldr r3, .L116 + 1369 0010 0122 movs r2, #1 + 1370 0012 1A76 strb r2, [r3, #24] + 165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1371 .loc 1 165 3 discriminator 2 view .LVU410 + 168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1372 .loc 1 168 3 discriminator 2 view .LVU411 + 170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 1373 .loc 1 170 3 discriminator 2 view .LVU412 + 170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 1374 .loc 1 170 17 is_stmt 0 discriminator 2 view .LVU413 + 1375 0014 0368 ldr r3, [r0] + 170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 1376 .loc 1 170 6 discriminator 2 view .LVU414 + 1377 0016 9342 cmp r3, r2 + 1378 0018 20D0 beq .L113 + 190:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** assert_param(IS_FLASH_NB_PAGES(pEraseInit->PageAddress, pEraseInit->NbPages)); + 1379 .loc 1 190 5 is_stmt 1 view .LVU415 + 191:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1380 .loc 1 191 5 view .LVU416 + 195:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 1381 .loc 1 195 7 view .LVU417 + 195:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 1382 .loc 1 195 11 is_stmt 0 view .LVU418 + 1383 001a 4CF25030 movw r0, #50000 + 1384 .LVL128: + 195:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 1385 .loc 1 195 11 view .LVU419 + 1386 001e FFF7FEFF bl FLASH_WaitForLastOperation + 1387 .LVL129: + 195:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 1388 .loc 1 195 10 view .LVU420 + 1389 0022 88BB cbnz r0, .L108 + ARM GAS /tmp/ccLRLOP3.s page 66 + + + 198:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1390 .loc 1 198 9 is_stmt 1 view .LVU421 + 198:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1391 .loc 1 198 20 is_stmt 0 view .LVU422 + 1392 0024 4FF0FF33 mov r3, #-1 + 1393 0028 3360 str r3, [r6] + 201:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** address < ((pEraseInit->NbPages * FLASH_PAGE_SIZE) + pEraseInit->PageAddress); + 1394 .loc 1 201 9 is_stmt 1 view .LVU423 + 201:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** address < ((pEraseInit->NbPages * FLASH_PAGE_SIZE) + pEraseInit->PageAddress); + 1395 .loc 1 201 21 is_stmt 0 view .LVU424 + 1396 002a 6C68 ldr r4, [r5, #4] + 1397 .LVL130: + 161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** uint32_t address = 0U; + 1398 .loc 1 161 21 view .LVU425 + 1399 002c 0121 movs r1, #1 + 1400 .LVL131: + 1401 .L103: + 202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** address += FLASH_PAGE_SIZE) + 1402 .loc 1 202 21 is_stmt 1 view .LVU426 + 202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** address += FLASH_PAGE_SIZE) + 1403 .loc 1 202 35 is_stmt 0 view .LVU427 + 1404 002e AA68 ldr r2, [r5, #8] + 202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** address += FLASH_PAGE_SIZE) + 1405 .loc 1 202 76 view .LVU428 + 1406 0030 6B68 ldr r3, [r5, #4] + 202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** address += FLASH_PAGE_SIZE) + 1407 .loc 1 202 64 view .LVU429 + 1408 0032 03EBC223 add r3, r3, r2, lsl #11 + 202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** address += FLASH_PAGE_SIZE) + 1409 .loc 1 202 21 view .LVU430 + 1410 0036 A342 cmp r3, r4 + 1411 0038 27D9 bls .L102 + 205:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1412 .loc 1 205 11 is_stmt 1 view .LVU431 + 1413 003a 2046 mov r0, r4 + 1414 003c FFF7FEFF bl FLASH_PageErase + 1415 .LVL132: + 208:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1416 .loc 1 208 11 view .LVU432 + 208:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1417 .loc 1 208 20 is_stmt 0 view .LVU433 + 1418 0040 4CF25030 movw r0, #50000 + 1419 0044 FFF7FEFF bl FLASH_WaitForLastOperation + 1420 .LVL133: + 211:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1421 .loc 1 211 11 is_stmt 1 view .LVU434 + 1422 0048 154A ldr r2, .L116+4 + 1423 004a 1369 ldr r3, [r2, #16] + 1424 004c 23F00203 bic r3, r3, #2 + 1425 0050 1361 str r3, [r2, #16] + 213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 1426 .loc 1 213 11 view .LVU435 + 213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 1427 .loc 1 213 14 is_stmt 0 view .LVU436 + 1428 0052 0146 mov r1, r0 + 1429 0054 B0B9 cbnz r0, .L114 + 203:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + ARM GAS /tmp/ccLRLOP3.s page 67 + + + 1430 .loc 1 203 21 is_stmt 1 view .LVU437 + 1431 0056 04F50064 add r4, r4, #2048 + 1432 .LVL134: + 203:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 1433 .loc 1 203 21 is_stmt 0 view .LVU438 + 1434 005a E8E7 b .L103 + 1435 .LVL135: + 1436 .L113: + 174:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 1437 .loc 1 174 7 is_stmt 1 view .LVU439 + 174:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 1438 .loc 1 174 11 is_stmt 0 view .LVU440 + 1439 005c 4CF25030 movw r0, #50000 + 1440 .LVL136: + 174:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 1441 .loc 1 174 11 view .LVU441 + 1442 0060 FFF7FEFF bl FLASH_WaitForLastOperation + 1443 .LVL137: + 174:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 1444 .loc 1 174 10 view .LVU442 + 1445 0064 08B1 cbz r0, .L115 + 161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** uint32_t address = 0U; + 1446 .loc 1 161 21 view .LVU443 + 1447 0066 0121 movs r1, #1 + 1448 0068 0FE0 b .L102 + 1449 .L115: + 177:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1450 .loc 1 177 9 is_stmt 1 view .LVU444 + 1451 006a FFF7FEFF bl FLASH_MassErase + 1452 .LVL138: + 180:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1453 .loc 1 180 9 view .LVU445 + 180:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1454 .loc 1 180 18 is_stmt 0 view .LVU446 + 1455 006e 4CF25030 movw r0, #50000 + 1456 0072 FFF7FEFF bl FLASH_WaitForLastOperation + 1457 .LVL139: + 1458 0076 0146 mov r1, r0 + 1459 .LVL140: + 183:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 1460 .loc 1 183 9 is_stmt 1 view .LVU447 + 1461 0078 094A ldr r2, .L116+4 + 1462 007a 1369 ldr r3, [r2, #16] + 1463 007c 23F00403 bic r3, r3, #4 + 1464 0080 1361 str r3, [r2, #16] + 1465 0082 02E0 b .L102 + 1466 .LVL141: + 1467 .L114: + 216:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** break; + 1468 .loc 1 216 13 view .LVU448 + 216:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** break; + 1469 .loc 1 216 24 is_stmt 0 view .LVU449 + 1470 0084 3460 str r4, [r6] + 217:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 1471 .loc 1 217 13 is_stmt 1 view .LVU450 + 1472 0086 00E0 b .L102 + 1473 .LVL142: + ARM GAS /tmp/ccLRLOP3.s page 68 + + + 1474 .L108: + 161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** uint32_t address = 0U; + 1475 .loc 1 161 21 is_stmt 0 view .LVU451 + 1476 0088 0121 movs r1, #1 + 1477 .LVL143: + 1478 .L102: + 224:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1479 .loc 1 224 3 is_stmt 1 view .LVU452 + 224:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1480 .loc 1 224 3 view .LVU453 + 1481 008a 044B ldr r3, .L116 + 1482 008c 0022 movs r2, #0 + 1483 008e 1A76 strb r2, [r3, #24] + 224:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1484 .loc 1 224 3 view .LVU454 + 226:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 1485 .loc 1 226 3 view .LVU455 + 227:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1486 .loc 1 227 1 is_stmt 0 view .LVU456 + 1487 0090 0846 mov r0, r1 + 1488 0092 70BD pop {r4, r5, r6, pc} + 1489 .LVL144: + 1490 .L106: + 1491 .cfi_def_cfa_offset 0 + 1492 .cfi_restore 4 + 1493 .cfi_restore 5 + 1494 .cfi_restore 6 + 1495 .cfi_restore 14 + 165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1496 .loc 1 165 3 view .LVU457 + 1497 0094 0221 movs r1, #2 + 1498 .LVL145: + 227:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1499 .loc 1 227 1 view .LVU458 + 1500 0096 0846 mov r0, r1 + 1501 .LVL146: + 227:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1502 .loc 1 227 1 view .LVU459 + 1503 0098 7047 bx lr + 1504 .L117: + 1505 009a 00BF .align 2 + 1506 .L116: + 1507 009c 00000000 .word pFlash + 1508 00a0 00200240 .word 1073881088 + 1509 .cfi_endproc + 1510 .LFE130: + 1512 .section .text.HAL_FLASHEx_Erase_IT,"ax",%progbits + 1513 .align 1 + 1514 .global HAL_FLASHEx_Erase_IT + 1515 .syntax unified + 1516 .thumb + 1517 .thumb_func + 1519 HAL_FLASHEx_Erase_IT: + 1520 .LVL147: + 1521 .LFB131: + 241:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** HAL_StatusTypeDef status = HAL_OK; + 1522 .loc 1 241 1 is_stmt 1 view -0 + ARM GAS /tmp/ccLRLOP3.s page 69 + + + 1523 .cfi_startproc + 1524 @ args = 0, pretend = 0, frame = 0 + 1525 @ frame_needed = 0, uses_anonymous_args = 0 + 241:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** HAL_StatusTypeDef status = HAL_OK; + 1526 .loc 1 241 1 is_stmt 0 view .LVU461 + 1527 0000 10B5 push {r4, lr} + 1528 .cfi_def_cfa_offset 8 + 1529 .cfi_offset 4, -8 + 1530 .cfi_offset 14, -4 + 242:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1531 .loc 1 242 3 is_stmt 1 view .LVU462 + 1532 .LVL148: + 245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1533 .loc 1 245 3 view .LVU463 + 245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1534 .loc 1 245 3 view .LVU464 + 1535 0002 144B ldr r3, .L125 + 1536 0004 1B7E ldrb r3, [r3, #24] @ zero_extendqisi2 + 1537 0006 012B cmp r3, #1 + 1538 0008 1FD0 beq .L121 + 245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1539 .loc 1 245 3 discriminator 2 view .LVU465 + 1540 000a 124B ldr r3, .L125 + 1541 000c 0122 movs r2, #1 + 1542 000e 1A76 strb r2, [r3, #24] + 245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1543 .loc 1 245 3 discriminator 2 view .LVU466 + 248:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 1544 .loc 1 248 3 discriminator 2 view .LVU467 + 248:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 1545 .loc 1 248 13 is_stmt 0 discriminator 2 view .LVU468 + 1546 0010 1B78 ldrb r3, [r3] @ zero_extendqisi2 + 248:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 1547 .loc 1 248 6 discriminator 2 view .LVU469 + 1548 0012 03F0FF04 and r4, r3, #255 + 1549 0016 D3B9 cbnz r3, .L122 + 254:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1550 .loc 1 254 3 is_stmt 1 view .LVU470 + 257:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1551 .loc 1 257 3 view .LVU471 + 1552 0018 0F4A ldr r2, .L125+4 + 1553 001a 1369 ldr r3, [r2, #16] + 1554 001c 43F4A053 orr r3, r3, #5120 + 1555 0020 1361 str r3, [r2, #16] + 259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 1556 .loc 1 259 3 view .LVU472 + 259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 1557 .loc 1 259 17 is_stmt 0 view .LVU473 + 1558 0022 0368 ldr r3, [r0] + 259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** { + 1559 .loc 1 259 6 view .LVU474 + 1560 0024 012B cmp r3, #1 + 1561 0026 0AD0 beq .L124 + 270:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** assert_param(IS_FLASH_NB_PAGES(pEraseInit->PageAddress, pEraseInit->NbPages)); + 1562 .loc 1 270 5 is_stmt 1 view .LVU475 + 271:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1563 .loc 1 271 5 view .LVU476 + ARM GAS /tmp/ccLRLOP3.s page 70 + + + 273:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** pFlash.DataRemaining = pEraseInit->NbPages; + 1564 .loc 1 273 5 view .LVU477 + 273:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** pFlash.DataRemaining = pEraseInit->NbPages; + 1565 .loc 1 273 29 is_stmt 0 view .LVU478 + 1566 0028 0A4B ldr r3, .L125 + 1567 002a 0122 movs r2, #1 + 1568 002c 1A70 strb r2, [r3] + 274:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** pFlash.Address = pEraseInit->PageAddress; + 1569 .loc 1 274 5 is_stmt 1 view .LVU479 + 274:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** pFlash.Address = pEraseInit->PageAddress; + 1570 .loc 1 274 38 is_stmt 0 view .LVU480 + 1571 002e 8268 ldr r2, [r0, #8] + 274:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** pFlash.Address = pEraseInit->PageAddress; + 1572 .loc 1 274 26 view .LVU481 + 1573 0030 5A60 str r2, [r3, #4] + 275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1574 .loc 1 275 5 is_stmt 1 view .LVU482 + 275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1575 .loc 1 275 32 is_stmt 0 view .LVU483 + 1576 0032 4068 ldr r0, [r0, #4] + 1577 .LVL149: + 275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1578 .loc 1 275 20 view .LVU484 + 1579 0034 9860 str r0, [r3, #8] + 278:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 1580 .loc 1 278 5 is_stmt 1 view .LVU485 + 1581 0036 FFF7FEFF bl FLASH_PageErase + 1582 .LVL150: + 1583 .L119: + 282:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1584 .loc 1 282 1 is_stmt 0 view .LVU486 + 1585 003a 2046 mov r0, r4 + 1586 003c 10BD pop {r4, pc} + 1587 .LVL151: + 1588 .L124: + 262:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** FLASH_MassErase(); + 1589 .loc 1 262 5 is_stmt 1 view .LVU487 + 262:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** FLASH_MassErase(); + 1590 .loc 1 262 29 is_stmt 0 view .LVU488 + 1591 003e 054B ldr r3, .L125 + 1592 0040 0222 movs r2, #2 + 1593 0042 1A70 strb r2, [r3] + 263:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 1594 .loc 1 263 9 is_stmt 1 view .LVU489 + 1595 0044 FFF7FEFF bl FLASH_MassErase + 1596 .LVL152: + 263:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + 1597 .loc 1 263 9 is_stmt 0 view .LVU490 + 1598 0048 F7E7 b .L119 + 1599 .LVL153: + 1600 .L121: + 245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** + 1601 .loc 1 245 3 view .LVU491 + 1602 004a 0224 movs r4, #2 + 1603 004c F5E7 b .L119 + 1604 .L122: + 250:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_flash_ex.c **** } + ARM GAS /tmp/ccLRLOP3.s page 71 + + + 1605 .loc 1 250 12 view .LVU492 + 1606 004e 0124 movs r4, #1 + 1607 0050 F3E7 b .L119 + 1608 .L126: + 1609 0052 00BF .align 2 + 1610 .L125: + 1611 0054 00000000 .word pFlash + 1612 0058 00200240 .word 1073881088 + 1613 .cfi_endproc + 1614 .LFE131: + 1616 .text + 1617 .Letext0: + 1618 .file 3 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 1619 .file 4 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 1620 .file 5 "Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h" + 1621 .file 6 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h" + 1622 .file 7 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h" + 1623 .file 8 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h" + ARM GAS /tmp/ccLRLOP3.s page 72 + + +DEFINED SYMBOLS + *ABS*:0000000000000000 stm32f3xx_hal_flash_ex.c + /tmp/ccLRLOP3.s:21 .text.FLASH_MassErase:0000000000000000 $t + /tmp/ccLRLOP3.s:26 .text.FLASH_MassErase:0000000000000000 FLASH_MassErase + /tmp/ccLRLOP3.s:52 .text.FLASH_MassErase:000000000000001c $d + /tmp/ccLRLOP3.s:58 .text.FLASH_OB_GetWRP:0000000000000000 $t + /tmp/ccLRLOP3.s:63 .text.FLASH_OB_GetWRP:0000000000000000 FLASH_OB_GetWRP + /tmp/ccLRLOP3.s:79 .text.FLASH_OB_GetWRP:0000000000000008 $d + /tmp/ccLRLOP3.s:84 .text.FLASH_OB_GetRDP:0000000000000000 $t + /tmp/ccLRLOP3.s:89 .text.FLASH_OB_GetRDP:0000000000000000 FLASH_OB_GetRDP + /tmp/ccLRLOP3.s:127 .text.FLASH_OB_GetRDP:000000000000001c $d + /tmp/ccLRLOP3.s:132 .text.FLASH_OB_RDP_LevelConfig:0000000000000000 $t + /tmp/ccLRLOP3.s:137 .text.FLASH_OB_RDP_LevelConfig:0000000000000000 FLASH_OB_RDP_LevelConfig + /tmp/ccLRLOP3.s:221 .text.FLASH_OB_RDP_LevelConfig:000000000000005c $d + /tmp/ccLRLOP3.s:228 .text.FLASH_OB_UserConfig:0000000000000000 $t + /tmp/ccLRLOP3.s:233 .text.FLASH_OB_UserConfig:0000000000000000 FLASH_OB_UserConfig + /tmp/ccLRLOP3.s:301 .text.FLASH_OB_UserConfig:000000000000003c $d + /tmp/ccLRLOP3.s:308 .text.FLASH_OB_ProgramData:0000000000000000 $t + /tmp/ccLRLOP3.s:313 .text.FLASH_OB_ProgramData:0000000000000000 FLASH_OB_ProgramData + /tmp/ccLRLOP3.s:375 .text.FLASH_OB_ProgramData:0000000000000038 $d + /tmp/ccLRLOP3.s:381 .text.FLASH_OB_GetUser:0000000000000000 $t + /tmp/ccLRLOP3.s:386 .text.FLASH_OB_GetUser:0000000000000000 FLASH_OB_GetUser + /tmp/ccLRLOP3.s:429 .text.FLASH_OB_GetUser:000000000000001c $d + /tmp/ccLRLOP3.s:434 .text.HAL_FLASHEx_OBErase:0000000000000000 $t + /tmp/ccLRLOP3.s:440 .text.HAL_FLASHEx_OBErase:0000000000000000 HAL_FLASHEx_OBErase + /tmp/ccLRLOP3.s:516 .text.HAL_FLASHEx_OBErase:0000000000000048 $d + /tmp/ccLRLOP3.s:522 .text.FLASH_OB_EnableWRP:0000000000000000 $t + /tmp/ccLRLOP3.s:527 .text.FLASH_OB_EnableWRP:0000000000000000 FLASH_OB_EnableWRP + /tmp/ccLRLOP3.s:733 .text.FLASH_OB_EnableWRP:00000000000000b8 $d + /tmp/ccLRLOP3.s:740 .text.FLASH_OB_DisableWRP:0000000000000000 $t + /tmp/ccLRLOP3.s:745 .text.FLASH_OB_DisableWRP:0000000000000000 FLASH_OB_DisableWRP + /tmp/ccLRLOP3.s:947 .text.FLASH_OB_DisableWRP:00000000000000bc $d + /tmp/ccLRLOP3.s:954 .text.HAL_FLASHEx_OBProgram:0000000000000000 $t + /tmp/ccLRLOP3.s:960 .text.HAL_FLASHEx_OBProgram:0000000000000000 HAL_FLASHEx_OBProgram + /tmp/ccLRLOP3.s:1145 .text.HAL_FLASHEx_OBProgram:0000000000000098 $d + /tmp/ccLRLOP3.s:1150 .text.HAL_FLASHEx_OBGetConfig:0000000000000000 $t + /tmp/ccLRLOP3.s:1156 .text.HAL_FLASHEx_OBGetConfig:0000000000000000 HAL_FLASHEx_OBGetConfig + /tmp/ccLRLOP3.s:1198 .text.HAL_FLASHEx_OBGetUserData:0000000000000000 $t + /tmp/ccLRLOP3.s:1204 .text.HAL_FLASHEx_OBGetUserData:0000000000000000 HAL_FLASHEx_OBGetUserData + /tmp/ccLRLOP3.s:1290 .text.HAL_FLASHEx_OBGetUserData:0000000000000038 $d + /tmp/ccLRLOP3.s:1296 .text.FLASH_PageErase:0000000000000000 $t + /tmp/ccLRLOP3.s:1302 .text.FLASH_PageErase:0000000000000000 FLASH_PageErase + /tmp/ccLRLOP3.s:1331 .text.FLASH_PageErase:000000000000001c $d + /tmp/ccLRLOP3.s:1337 .text.HAL_FLASHEx_Erase:0000000000000000 $t + /tmp/ccLRLOP3.s:1343 .text.HAL_FLASHEx_Erase:0000000000000000 HAL_FLASHEx_Erase + /tmp/ccLRLOP3.s:1507 .text.HAL_FLASHEx_Erase:000000000000009c $d + /tmp/ccLRLOP3.s:1513 .text.HAL_FLASHEx_Erase_IT:0000000000000000 $t + /tmp/ccLRLOP3.s:1519 .text.HAL_FLASHEx_Erase_IT:0000000000000000 HAL_FLASHEx_Erase_IT + /tmp/ccLRLOP3.s:1611 .text.HAL_FLASHEx_Erase_IT:0000000000000054 $d + +UNDEFINED SYMBOLS +pFlash +FLASH_WaitForLastOperation diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_flash_ex.o b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_flash_ex.o new file mode 100644 index 0000000000000000000000000000000000000000..d2ae81ed7f0f706acf933ae412603a42e9abf1d4 GIT binary patch literal 19112 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
    © Copyright (c) 2016 STMicroelectronics. + 95:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * All rights reserved.
    + 96:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * + 97:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * This software component is licensed by ST under BSD 3-Clause license, + 98:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * the "License"; You may not use this file except in compliance with the + 99:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * License. You may obtain a copy of the License at: + 100:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * opensource.org/licenses/BSD-3-Clause + 101:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * + 102:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** ****************************************************************************** + 103:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** */ + 104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 105:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Includes ------------------------------------------------------------------*/ + 106:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** #include "stm32f3xx_hal.h" + 107:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 108:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /** @addtogroup STM32F3xx_HAL_Driver + 109:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @{ + 110:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** */ + 111:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 112:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /** @defgroup GPIO GPIO + 113:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @brief GPIO HAL module driver + 114:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @{ + 115:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** */ + 116:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 117:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /** MISRA C:2012 deviation rule has been granted for following rules: + 118:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * Rule-18.1_d - Medium: Array pointer `GPIOx' is accessed with index [..,..] + 119:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * which may be out of array bounds [..,UNKNOWN] in following APIs: + 120:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * HAL_GPIO_Init + 121:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * HAL_GPIO_DeInit + 122:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** */ + 123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 124:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** #ifdef HAL_GPIO_MODULE_ENABLED + 125:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 126:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Private typedef -----------------------------------------------------------*/ + 127:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Private defines -----------------------------------------------------------*/ + 128:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /** @addtogroup GPIO_Private_Constants + 129:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @{ + 130:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** */ + 131:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** #define GPIO_NUMBER (16U) + 132:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /** + 133:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @} + 134:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** */ + 135:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 136:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Private macros ------------------------------------------------------------*/ + 137:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Private macros ------------------------------------------------------------*/ + 138:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /** @defgroup GPIO_Private_Macros GPIO Private Macros + 139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @{ + 140:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** */ + 141:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /** + 142:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @} + 143:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** */ + ARM GAS /tmp/ccrayVSd.s page 4 + + + 144:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Private variables ---------------------------------------------------------*/ + 145:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Private function prototypes -----------------------------------------------*/ + 146:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Exported functions --------------------------------------------------------*/ + 147:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 148:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /** @defgroup GPIO_Exported_Functions GPIO Exported Functions + 149:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @{ + 150:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** */ + 151:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /** @defgroup GPIO_Exported_Functions_Group1 Initialization/de-initialization functions + 153:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @brief Initialization and Configuration functions + 154:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * + 155:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** @verbatim + 156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** =============================================================================== + 157:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** ##### Initialization and de-initialization functions ##### + 158:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** =============================================================================== + 159:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 160:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** @endverbatim + 161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @{ + 162:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** */ + 163:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 164:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /** + 165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @brief Initialize the GPIOx peripheral according to the specified parameters in the GPIO_Init. + 166:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @param GPIOx where x can be (A..F) to select the GPIO peripheral for STM32F3 family devices + 167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @param GPIO_Init pointer to a GPIO_InitTypeDef structure that contains + 168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * the configuration information for the specified GPIO peripheral. + 169:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @retval None + 170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** */ + 171:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init) + 172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 30 .loc 1 172 1 view -0 + 31 .cfi_startproc + 32 @ args = 0, pretend = 0, frame = 8 + 33 @ frame_needed = 0, uses_anonymous_args = 0 + 34 .loc 1 172 1 is_stmt 0 view .LVU1 + 35 0000 F0B5 push {r4, r5, r6, r7, lr} + 36 .cfi_def_cfa_offset 20 + 37 .cfi_offset 4, -20 + 38 .cfi_offset 5, -16 + 39 .cfi_offset 6, -12 + 40 .cfi_offset 7, -8 + 41 .cfi_offset 14, -4 + 42 0002 83B0 sub sp, sp, #12 + 43 .cfi_def_cfa_offset 32 + 173:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** uint32_t position = 0x00u; + 44 .loc 1 173 3 is_stmt 1 view .LVU2 + 45 .LVL1: + 174:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** uint32_t iocurrent; + 46 .loc 1 174 3 view .LVU3 + 175:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** uint32_t temp; + 47 .loc 1 175 3 view .LVU4 + 176:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 177:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Check the parameters */ + 178:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); + 48 .loc 1 178 3 view .LVU5 + 179:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** assert_param(IS_GPIO_PIN(GPIO_Init->Pin)); + 49 .loc 1 179 3 view .LVU6 + 180:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** assert_param(IS_GPIO_MODE(GPIO_Init->Mode)); + ARM GAS /tmp/ccrayVSd.s page 5 + + + 50 .loc 1 180 3 view .LVU7 + 181:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Configure the port pins */ + 183:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** while (((GPIO_Init->Pin) >> position) != 0x00u) + 51 .loc 1 183 3 view .LVU8 + 173:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** uint32_t iocurrent; + 52 .loc 1 173 12 is_stmt 0 view .LVU9 + 53 0004 0023 movs r3, #0 + 54 .loc 1 183 9 view .LVU10 + 55 0006 62E0 b .L2 + 56 .LVL2: + 57 .L20: + 184:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 185:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Get current io position */ + 186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** iocurrent = (GPIO_Init->Pin) & (1uL << position); + 187:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 188:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** if (iocurrent != 0x00u) + 189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 190:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /*--------------------- GPIO Mode Configuration ------------------------*/ + 191:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* In case of Output or Alternate function mode selection */ + 192:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** if(((GPIO_Init->Mode & GPIO_MODE) == MODE_OUTPUT) || ((GPIO_Init->Mode & GPIO_MODE) == MODE_A + 193:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 194:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Check the Speed parameter */ + 195:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** assert_param(IS_GPIO_SPEED(GPIO_Init->Speed)); + 58 .loc 1 195 9 is_stmt 1 view .LVU11 + 196:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Configure the IO Speed */ + 197:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp = GPIOx->OSPEEDR; + 59 .loc 1 197 9 view .LVU12 + 60 .loc 1 197 14 is_stmt 0 view .LVU13 + 61 0008 8568 ldr r5, [r0, #8] + 62 .LVL3: + 198:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2u)); + 63 .loc 1 198 9 is_stmt 1 view .LVU14 + 64 .loc 1 198 55 is_stmt 0 view .LVU15 + 65 000a 5E00 lsls r6, r3, #1 + 66 .loc 1 198 42 view .LVU16 + 67 000c 0324 movs r4, #3 + 68 000e B440 lsls r4, r4, r6 + 69 .loc 1 198 14 view .LVU17 + 70 0010 25EA0405 bic r5, r5, r4 + 71 .LVL4: + 199:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp |= (GPIO_Init->Speed << (position * 2u)); + 72 .loc 1 199 9 is_stmt 1 view .LVU18 + 73 .loc 1 199 27 is_stmt 0 view .LVU19 + 74 0014 CC68 ldr r4, [r1, #12] + 75 .loc 1 199 35 view .LVU20 + 76 0016 B440 lsls r4, r4, r6 + 77 .loc 1 199 14 view .LVU21 + 78 0018 2C43 orrs r4, r4, r5 + 79 .LVL5: + 200:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** GPIOx->OSPEEDR = temp; + 80 .loc 1 200 9 is_stmt 1 view .LVU22 + 81 .loc 1 200 24 is_stmt 0 view .LVU23 + 82 001a 8460 str r4, [r0, #8] + 201:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Configure the IO Output Type */ + 203:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp = GPIOx->OTYPER; + ARM GAS /tmp/ccrayVSd.s page 6 + + + 83 .loc 1 203 9 is_stmt 1 view .LVU24 + 84 .loc 1 203 14 is_stmt 0 view .LVU25 + 85 001c 4568 ldr r5, [r0, #4] + 86 .LVL6: + 204:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp &= ~(GPIO_OTYPER_OT_0 << position) ; + 87 .loc 1 204 9 is_stmt 1 view .LVU26 + 88 .loc 1 204 14 is_stmt 0 view .LVU27 + 89 001e 25EA0C05 bic r5, r5, ip + 90 .LVL7: + 205:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp |= (((GPIO_Init->Mode & OUTPUT_TYPE) >> OUTPUT_TYPE_Pos) << position); + 91 .loc 1 205 9 is_stmt 1 view .LVU28 + 92 .loc 1 205 29 is_stmt 0 view .LVU29 + 93 0022 4C68 ldr r4, [r1, #4] + 94 .loc 1 205 51 view .LVU30 + 95 0024 C4F30014 ubfx r4, r4, #4, #1 + 96 .loc 1 205 71 view .LVU31 + 97 0028 9C40 lsls r4, r4, r3 + 98 .loc 1 205 14 view .LVU32 + 99 002a 2C43 orrs r4, r4, r5 + 100 .LVL8: + 206:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** GPIOx->OTYPER = temp; + 101 .loc 1 206 9 is_stmt 1 view .LVU33 + 102 .loc 1 206 23 is_stmt 0 view .LVU34 + 103 002c 4460 str r4, [r0, #4] + 104 002e 5FE0 b .L4 + 105 .LVL9: + 106 .L21: + 207:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** } + 208:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 209:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** if((GPIO_Init->Mode & GPIO_MODE) != MODE_ANALOG) + 210:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 211:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Check the Pull parameter */ + 212:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** assert_param(IS_GPIO_PULL(GPIO_Init->Pull)); + 213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 214:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Activate the Pull-up or Pull down resistor for the current IO */ + 215:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp = GPIOx->PUPDR; + 216:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp &= ~(GPIO_PUPDR_PUPDR0 << (position * 2u)); + 217:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp |= ((GPIO_Init->Pull) << (position * 2u)); + 218:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** GPIOx->PUPDR = temp; + 219:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** } + 220:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 221:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /*--------------------- GPIO Mode Configuration ------------------------*/ + 222:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* In case of Alternate function mode selection */ + 223:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** if((GPIO_Init->Mode & GPIO_MODE) == MODE_AF) + 224:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 225:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Check the Alternate function parameters */ + 226:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** assert_param(IS_GPIO_AF_INSTANCE(GPIOx)); + 107 .loc 1 226 9 is_stmt 1 view .LVU35 + 227:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** assert_param(IS_GPIO_AF(GPIO_Init->Alternate)); + 108 .loc 1 227 9 view .LVU36 + 228:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 229:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Configure Alternate function mapped with the current IO */ + 230:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp = GPIOx->AFR[position >> 3u]; + 109 .loc 1 230 9 view .LVU37 + 110 .loc 1 230 36 is_stmt 0 view .LVU38 + 111 0030 DD08 lsrs r5, r3, #3 + 112 .loc 1 230 14 view .LVU39 + ARM GAS /tmp/ccrayVSd.s page 7 + + + 113 0032 0835 adds r5, r5, #8 + 114 0034 50F82540 ldr r4, [r0, r5, lsl #2] + 115 .LVL10: + 231:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp &= ~(0xFu << ((position & 0x07u) * 4u)); + 116 .loc 1 231 9 is_stmt 1 view .LVU40 + 117 .loc 1 231 38 is_stmt 0 view .LVU41 + 118 0038 03F0070C and ip, r3, #7 + 119 .loc 1 231 47 view .LVU42 + 120 003c 4FEA8C0C lsl ip, ip, #2 + 121 .loc 1 231 24 view .LVU43 + 122 0040 4FF00F0E mov lr, #15 + 123 0044 0EFA0CFE lsl lr, lr, ip + 124 .loc 1 231 14 view .LVU44 + 125 0048 24EA0E0E bic lr, r4, lr + 126 .LVL11: + 232:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp |= ((GPIO_Init->Alternate) << ((position & 0x07u) * 4u)); + 127 .loc 1 232 9 is_stmt 1 view .LVU45 + 128 .loc 1 232 28 is_stmt 0 view .LVU46 + 129 004c 0C69 ldr r4, [r1, #16] + 130 .loc 1 232 41 view .LVU47 + 131 004e 04FA0CF4 lsl r4, r4, ip + 132 .loc 1 232 14 view .LVU48 + 133 0052 44EA0E04 orr r4, r4, lr + 134 .LVL12: + 233:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** GPIOx->AFR[position >> 3u] = temp; + 135 .loc 1 233 9 is_stmt 1 view .LVU49 + 136 .loc 1 233 36 is_stmt 0 view .LVU50 + 137 0056 40F82540 str r4, [r0, r5, lsl #2] + 138 005a 60E0 b .L6 + 139 .LVL13: + 140 .L22: + 234:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** } + 235:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 236:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Configure IO Direction mode (Input, Output, Alternate or Analog) */ + 237:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp = GPIOx->MODER; + 238:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp &= ~(GPIO_MODER_MODER0 << (position * 2u)); + 239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp |= ((GPIO_Init->Mode & GPIO_MODE) << (position * 2u)); + 240:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** GPIOx->MODER = temp; + 241:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 242:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /*--------------------- EXTI Mode Configuration ------------------------*/ + 243:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Configure the External Interrupt or event for the current IO */ + 244:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** if((GPIO_Init->Mode & EXTI_MODE) != 0x00u) + 245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 246:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Enable SYSCFG Clock */ + 247:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** __HAL_RCC_SYSCFG_CLK_ENABLE(); + 248:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp = SYSCFG->EXTICR[position >> 2u]; + 250:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp &= ~(0x0FuL << (4u * (position & 0x03u))); + 251:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp |= (GPIO_GET_INDEX(GPIOx) << (4u * (position & 0x03u))); + 141 .loc 1 251 18 view .LVU51 + 142 005c 0424 movs r4, #4 + 143 005e 00E0 b .L7 + 144 .L13: + 145 0060 0024 movs r4, #0 + 146 .L7: + 147 .loc 1 251 40 discriminator 20 view .LVU52 + 148 0062 04FA0EF4 lsl r4, r4, lr + ARM GAS /tmp/ccrayVSd.s page 8 + + + 149 .loc 1 251 14 discriminator 20 view .LVU53 + 150 0066 2C43 orrs r4, r4, r5 + 151 .LVL14: + 252:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** SYSCFG->EXTICR[position >> 2u] = temp; + 152 .loc 1 252 9 is_stmt 1 discriminator 20 view .LVU54 + 153 .loc 1 252 40 is_stmt 0 discriminator 20 view .LVU55 + 154 0068 0CF1020C add ip, ip, #2 + 155 006c 524D ldr r5, .L23 + 156 006e 45F82C40 str r4, [r5, ip, lsl #2] + 253:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 254:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Clear EXTI line configuration */ + 255:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp = EXTI->IMR; + 157 .loc 1 255 9 is_stmt 1 discriminator 20 view .LVU56 + 158 .loc 1 255 14 is_stmt 0 discriminator 20 view .LVU57 + 159 0072 524C ldr r4, .L23+4 + 160 .LVL15: + 161 .loc 1 255 14 discriminator 20 view .LVU58 + 162 0074 2568 ldr r5, [r4] + 163 .LVL16: + 256:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp &= ~(iocurrent); + 164 .loc 1 256 9 is_stmt 1 discriminator 20 view .LVU59 + 165 .loc 1 256 17 is_stmt 0 discriminator 20 view .LVU60 + 166 0076 D443 mvns r4, r2 + 167 .loc 1 256 14 discriminator 20 view .LVU61 + 168 0078 25EA0206 bic r6, r5, r2 + 169 .LVL17: + 257:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** if((GPIO_Init->Mode & EXTI_IT) != 0x00u) + 170 .loc 1 257 9 is_stmt 1 discriminator 20 view .LVU62 + 171 .loc 1 257 11 is_stmt 0 discriminator 20 view .LVU63 + 172 007c 4F68 ldr r7, [r1, #4] + 173 007e 17F4803F tst r7, #65536 + 174 0082 01D0 beq .L8 + 258:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp |= iocurrent; + 175 .loc 1 259 11 is_stmt 1 view .LVU64 + 176 .loc 1 259 16 is_stmt 0 view .LVU65 + 177 0084 42EA0506 orr r6, r2, r5 + 178 .LVL18: + 179 .L8: + 260:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** } + 261:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** EXTI->IMR = temp; + 180 .loc 1 261 9 is_stmt 1 view .LVU66 + 181 .loc 1 261 19 is_stmt 0 view .LVU67 + 182 0088 4C4D ldr r5, .L23+4 + 183 008a 2E60 str r6, [r5] + 262:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 263:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp = EXTI->EMR; + 184 .loc 1 263 9 is_stmt 1 view .LVU68 + 185 .loc 1 263 14 is_stmt 0 view .LVU69 + 186 008c 6D68 ldr r5, [r5, #4] + 187 .LVL19: + 264:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp &= ~(iocurrent); + 188 .loc 1 264 9 is_stmt 1 view .LVU70 + 189 .loc 1 264 14 is_stmt 0 view .LVU71 + 190 008e 04EA0506 and r6, r4, r5 + 191 .LVL20: + 265:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** if((GPIO_Init->Mode & EXTI_EVT) != 0x00u) + ARM GAS /tmp/ccrayVSd.s page 9 + + + 192 .loc 1 265 9 is_stmt 1 view .LVU72 + 193 .loc 1 265 11 is_stmt 0 view .LVU73 + 194 0092 4F68 ldr r7, [r1, #4] + 195 0094 17F4003F tst r7, #131072 + 196 0098 01D0 beq .L9 + 266:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 267:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp |= iocurrent; + 197 .loc 1 267 11 is_stmt 1 view .LVU74 + 198 .loc 1 267 16 is_stmt 0 view .LVU75 + 199 009a 42EA0506 orr r6, r2, r5 + 200 .LVL21: + 201 .L9: + 268:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** } + 269:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** EXTI->EMR = temp; + 202 .loc 1 269 9 is_stmt 1 view .LVU76 + 203 .loc 1 269 19 is_stmt 0 view .LVU77 + 204 009e 474D ldr r5, .L23+4 + 205 00a0 6E60 str r6, [r5, #4] + 270:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 271:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Clear Rising Falling edge configuration */ + 272:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp = EXTI->RTSR; + 206 .loc 1 272 9 is_stmt 1 view .LVU78 + 207 .loc 1 272 14 is_stmt 0 view .LVU79 + 208 00a2 AD68 ldr r5, [r5, #8] + 209 .LVL22: + 273:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp &= ~(iocurrent); + 210 .loc 1 273 9 is_stmt 1 view .LVU80 + 211 .loc 1 273 14 is_stmt 0 view .LVU81 + 212 00a4 04EA0506 and r6, r4, r5 + 213 .LVL23: + 274:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** if((GPIO_Init->Mode & TRIGGER_RISING) != 0x00u) + 214 .loc 1 274 9 is_stmt 1 view .LVU82 + 215 .loc 1 274 11 is_stmt 0 view .LVU83 + 216 00a8 4F68 ldr r7, [r1, #4] + 217 00aa 17F4801F tst r7, #1048576 + 218 00ae 01D0 beq .L10 + 275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp |= iocurrent; + 219 .loc 1 276 11 is_stmt 1 view .LVU84 + 220 .loc 1 276 16 is_stmt 0 view .LVU85 + 221 00b0 42EA0506 orr r6, r2, r5 + 222 .LVL24: + 223 .L10: + 277:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** } + 278:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** EXTI->RTSR = temp; + 224 .loc 1 278 9 is_stmt 1 view .LVU86 + 225 .loc 1 278 20 is_stmt 0 view .LVU87 + 226 00b4 414D ldr r5, .L23+4 + 227 00b6 AE60 str r6, [r5, #8] + 279:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 280:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp = EXTI->FTSR; + 228 .loc 1 280 9 is_stmt 1 view .LVU88 + 229 .loc 1 280 14 is_stmt 0 view .LVU89 + 230 00b8 ED68 ldr r5, [r5, #12] + 231 .LVL25: + 281:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp &= ~(iocurrent); + 232 .loc 1 281 9 is_stmt 1 view .LVU90 + ARM GAS /tmp/ccrayVSd.s page 10 + + + 233 .loc 1 281 14 is_stmt 0 view .LVU91 + 234 00ba 2C40 ands r4, r4, r5 + 235 .LVL26: + 282:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** if((GPIO_Init->Mode & TRIGGER_FALLING) != 0x00u) + 236 .loc 1 282 9 is_stmt 1 view .LVU92 + 237 .loc 1 282 22 is_stmt 0 view .LVU93 + 238 00bc 4E68 ldr r6, [r1, #4] + 239 .loc 1 282 11 view .LVU94 + 240 00be 16F4001F tst r6, #2097152 + 241 00c2 01D0 beq .L11 + 283:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 284:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp |= iocurrent; + 242 .loc 1 284 11 is_stmt 1 view .LVU95 + 243 .loc 1 284 16 is_stmt 0 view .LVU96 + 244 00c4 42EA0504 orr r4, r2, r5 + 245 .LVL27: + 246 .L11: + 285:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** } + 286:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** EXTI->FTSR = temp; + 247 .loc 1 286 9 is_stmt 1 view .LVU97 + 248 .loc 1 286 20 is_stmt 0 view .LVU98 + 249 00c8 3C4A ldr r2, .L23+4 + 250 .LVL28: + 251 .loc 1 286 20 view .LVU99 + 252 00ca D460 str r4, [r2, #12] + 253 .LVL29: + 254 .L3: + 287:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** } + 288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** } + 289:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 290:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** position++; + 255 .loc 1 290 5 is_stmt 1 view .LVU100 + 256 .loc 1 290 13 is_stmt 0 view .LVU101 + 257 00cc 0133 adds r3, r3, #1 + 258 .LVL30: + 259 .L2: + 183:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 260 .loc 1 183 41 is_stmt 1 view .LVU102 + 183:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 261 .loc 1 183 21 is_stmt 0 view .LVU103 + 262 00ce 0A68 ldr r2, [r1] + 183:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 263 .loc 1 183 41 view .LVU104 + 264 00d0 32FA03F4 lsrs r4, r2, r3 + 265 00d4 6ED0 beq .L19 + 186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 266 .loc 1 186 5 is_stmt 1 view .LVU105 + 186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 267 .loc 1 186 41 is_stmt 0 view .LVU106 + 268 00d6 4FF0010C mov ip, #1 + 269 00da 0CFA03FC lsl ip, ip, r3 + 270 .LVL31: + 188:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 271 .loc 1 188 5 is_stmt 1 view .LVU107 + 188:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 272 .loc 1 188 8 is_stmt 0 view .LVU108 + 273 00de 1CEA0202 ands r2, ip, r2 + ARM GAS /tmp/ccrayVSd.s page 11 + + + 274 .LVL32: + 188:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 275 .loc 1 188 8 view .LVU109 + 276 00e2 F3D0 beq .L3 + 192:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 277 .loc 1 192 7 is_stmt 1 view .LVU110 + 192:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 278 .loc 1 192 21 is_stmt 0 view .LVU111 + 279 00e4 4C68 ldr r4, [r1, #4] + 192:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 280 .loc 1 192 28 view .LVU112 + 281 00e6 04F00304 and r4, r4, #3 + 192:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 282 .loc 1 192 57 view .LVU113 + 283 00ea 013C subs r4, r4, #1 + 192:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 284 .loc 1 192 9 view .LVU114 + 285 00ec 012C cmp r4, #1 + 286 00ee 8BD9 bls .L20 + 287 .L4: + 209:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 288 .loc 1 209 7 is_stmt 1 view .LVU115 + 209:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 289 .loc 1 209 20 is_stmt 0 view .LVU116 + 290 00f0 4C68 ldr r4, [r1, #4] + 209:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 291 .loc 1 209 27 view .LVU117 + 292 00f2 04F00304 and r4, r4, #3 + 209:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 293 .loc 1 209 9 view .LVU118 + 294 00f6 032C cmp r4, #3 + 295 00f8 0CD0 beq .L5 + 212:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 296 .loc 1 212 9 is_stmt 1 view .LVU119 + 215:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp &= ~(GPIO_PUPDR_PUPDR0 << (position * 2u)); + 297 .loc 1 215 9 view .LVU120 + 215:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp &= ~(GPIO_PUPDR_PUPDR0 << (position * 2u)); + 298 .loc 1 215 14 is_stmt 0 view .LVU121 + 299 00fa C468 ldr r4, [r0, #12] + 300 .LVL33: + 216:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp |= ((GPIO_Init->Pull) << (position * 2u)); + 301 .loc 1 216 9 is_stmt 1 view .LVU122 + 216:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp |= ((GPIO_Init->Pull) << (position * 2u)); + 302 .loc 1 216 50 is_stmt 0 view .LVU123 + 303 00fc 5D00 lsls r5, r3, #1 + 216:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp |= ((GPIO_Init->Pull) << (position * 2u)); + 304 .loc 1 216 37 view .LVU124 + 305 00fe 4FF0030C mov ip, #3 + 306 0102 0CFA05FC lsl ip, ip, r5 + 216:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp |= ((GPIO_Init->Pull) << (position * 2u)); + 307 .loc 1 216 14 view .LVU125 + 308 0106 24EA0C0C bic ip, r4, ip + 309 .LVL34: + 217:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** GPIOx->PUPDR = temp; + 310 .loc 1 217 9 is_stmt 1 view .LVU126 + 217:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** GPIOx->PUPDR = temp; + 311 .loc 1 217 28 is_stmt 0 view .LVU127 + ARM GAS /tmp/ccrayVSd.s page 12 + + + 312 010a 8C68 ldr r4, [r1, #8] + 217:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** GPIOx->PUPDR = temp; + 313 .loc 1 217 36 view .LVU128 + 314 010c AC40 lsls r4, r4, r5 + 217:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** GPIOx->PUPDR = temp; + 315 .loc 1 217 14 view .LVU129 + 316 010e 44EA0C04 orr r4, r4, ip + 317 .LVL35: + 218:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** } + 318 .loc 1 218 9 is_stmt 1 view .LVU130 + 218:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** } + 319 .loc 1 218 22 is_stmt 0 view .LVU131 + 320 0112 C460 str r4, [r0, #12] + 321 .LVL36: + 322 .L5: + 223:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 323 .loc 1 223 7 is_stmt 1 view .LVU132 + 223:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 324 .loc 1 223 20 is_stmt 0 view .LVU133 + 325 0114 4C68 ldr r4, [r1, #4] + 223:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 326 .loc 1 223 27 view .LVU134 + 327 0116 04F00304 and r4, r4, #3 + 223:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 328 .loc 1 223 9 view .LVU135 + 329 011a 022C cmp r4, #2 + 330 011c 88D0 beq .L21 + 331 .L6: + 237:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp &= ~(GPIO_MODER_MODER0 << (position * 2u)); + 332 .loc 1 237 7 is_stmt 1 view .LVU136 + 237:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp &= ~(GPIO_MODER_MODER0 << (position * 2u)); + 333 .loc 1 237 12 is_stmt 0 view .LVU137 + 334 011e 0468 ldr r4, [r0] + 335 .LVL37: + 238:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp |= ((GPIO_Init->Mode & GPIO_MODE) << (position * 2u)); + 336 .loc 1 238 7 is_stmt 1 view .LVU138 + 238:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp |= ((GPIO_Init->Mode & GPIO_MODE) << (position * 2u)); + 337 .loc 1 238 48 is_stmt 0 view .LVU139 + 338 0120 4FEA430E lsl lr, r3, #1 + 238:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp |= ((GPIO_Init->Mode & GPIO_MODE) << (position * 2u)); + 339 .loc 1 238 35 view .LVU140 + 340 0124 4FF0030C mov ip, #3 + 341 0128 0CFA0EFC lsl ip, ip, lr + 238:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp |= ((GPIO_Init->Mode & GPIO_MODE) << (position * 2u)); + 342 .loc 1 238 12 view .LVU141 + 343 012c 24EA0C0C bic ip, r4, ip + 344 .LVL38: + 239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** GPIOx->MODER = temp; + 345 .loc 1 239 7 is_stmt 1 view .LVU142 + 239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** GPIOx->MODER = temp; + 346 .loc 1 239 26 is_stmt 0 view .LVU143 + 347 0130 4C68 ldr r4, [r1, #4] + 239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** GPIOx->MODER = temp; + 348 .loc 1 239 33 view .LVU144 + 349 0132 04F00304 and r4, r4, #3 + 239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** GPIOx->MODER = temp; + 350 .loc 1 239 46 view .LVU145 + ARM GAS /tmp/ccrayVSd.s page 13 + + + 351 0136 04FA0EF4 lsl r4, r4, lr + 239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** GPIOx->MODER = temp; + 352 .loc 1 239 12 view .LVU146 + 353 013a 44EA0C04 orr r4, r4, ip + 354 .LVL39: + 240:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 355 .loc 1 240 7 is_stmt 1 view .LVU147 + 240:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 356 .loc 1 240 20 is_stmt 0 view .LVU148 + 357 013e 0460 str r4, [r0] + 244:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 358 .loc 1 244 7 is_stmt 1 view .LVU149 + 244:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 359 .loc 1 244 20 is_stmt 0 view .LVU150 + 360 0140 4C68 ldr r4, [r1, #4] + 361 .LVL40: + 244:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 362 .loc 1 244 9 view .LVU151 + 363 0142 14F4403F tst r4, #196608 + 364 0146 C1D0 beq .L3 + 247:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 365 .loc 1 247 9 is_stmt 1 view .LVU152 + 366 .LBB2: + 247:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 367 .loc 1 247 9 view .LVU153 + 247:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 368 .loc 1 247 9 view .LVU154 + 369 0148 1D4C ldr r4, .L23+8 + 370 014a A569 ldr r5, [r4, #24] + 371 014c 45F00105 orr r5, r5, #1 + 372 0150 A561 str r5, [r4, #24] + 373 .LVL41: + 247:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 374 .loc 1 247 9 view .LVU155 + 375 0152 A469 ldr r4, [r4, #24] + 376 0154 04F00104 and r4, r4, #1 + 377 0158 0194 str r4, [sp, #4] + 247:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 378 .loc 1 247 9 view .LVU156 + 379 015a 019C ldr r4, [sp, #4] + 380 .LBE2: + 247:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 381 .loc 1 247 9 view .LVU157 + 249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp &= ~(0x0FuL << (4u * (position & 0x03u))); + 382 .loc 1 249 9 view .LVU158 + 249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp &= ~(0x0FuL << (4u * (position & 0x03u))); + 383 .loc 1 249 40 is_stmt 0 view .LVU159 + 384 015c 4FEA930C lsr ip, r3, #2 + 249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp &= ~(0x0FuL << (4u * (position & 0x03u))); + 385 .loc 1 249 14 view .LVU160 + 386 0160 0CF10205 add r5, ip, #2 + 387 0164 144C ldr r4, .L23 + 388 0166 54F82550 ldr r5, [r4, r5, lsl #2] + 389 .LVL42: + 250:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp |= (GPIO_GET_INDEX(GPIOx) << (4u * (position & 0x03u))); + 390 .loc 1 250 9 is_stmt 1 view .LVU161 + 250:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp |= (GPIO_GET_INDEX(GPIOx) << (4u * (position & 0x03u))); + ARM GAS /tmp/ccrayVSd.s page 14 + + + 391 .loc 1 250 45 is_stmt 0 view .LVU162 + 392 016a 03F0030E and lr, r3, #3 + 250:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp |= (GPIO_GET_INDEX(GPIOx) << (4u * (position & 0x03u))); + 393 .loc 1 250 33 view .LVU163 + 394 016e 4FEA8E0E lsl lr, lr, #2 + 250:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp |= (GPIO_GET_INDEX(GPIOx) << (4u * (position & 0x03u))); + 395 .loc 1 250 26 view .LVU164 + 396 0172 0F24 movs r4, #15 + 397 0174 04FA0EF4 lsl r4, r4, lr + 250:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** temp |= (GPIO_GET_INDEX(GPIOx) << (4u * (position & 0x03u))); + 398 .loc 1 250 14 view .LVU165 + 399 0178 25EA0405 bic r5, r5, r4 + 400 .LVL43: + 251:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** SYSCFG->EXTICR[position >> 2u] = temp; + 401 .loc 1 251 9 is_stmt 1 view .LVU166 + 251:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** SYSCFG->EXTICR[position >> 2u] = temp; + 402 .loc 1 251 18 is_stmt 0 view .LVU167 + 403 017c B0F1904F cmp r0, #1207959552 + 404 0180 3FF46EAF beq .L13 + 251:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** SYSCFG->EXTICR[position >> 2u] = temp; + 405 .loc 1 251 18 discriminator 1 view .LVU168 + 406 0184 0F4C ldr r4, .L23+12 + 407 0186 A042 cmp r0, r4 + 408 0188 0ED0 beq .L14 + 251:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** SYSCFG->EXTICR[position >> 2u] = temp; + 409 .loc 1 251 18 discriminator 3 view .LVU169 + 410 018a 04F58064 add r4, r4, #1024 + 411 018e A042 cmp r0, r4 + 412 0190 0CD0 beq .L15 + 251:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** SYSCFG->EXTICR[position >> 2u] = temp; + 413 .loc 1 251 18 discriminator 5 view .LVU170 + 414 0192 04F58064 add r4, r4, #1024 + 415 0196 A042 cmp r0, r4 + 416 0198 0AD0 beq .L16 + 251:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** SYSCFG->EXTICR[position >> 2u] = temp; + 417 .loc 1 251 18 discriminator 7 view .LVU171 + 418 019a 04F58064 add r4, r4, #1024 + 419 019e A042 cmp r0, r4 + 420 01a0 3FF45CAF beq .L22 + 251:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** SYSCFG->EXTICR[position >> 2u] = temp; + 421 .loc 1 251 18 view .LVU172 + 422 01a4 0524 movs r4, #5 + 423 01a6 5CE7 b .L7 + 424 .L14: + 425 01a8 0124 movs r4, #1 + 426 01aa 5AE7 b .L7 + 427 .L15: + 428 01ac 0224 movs r4, #2 + 429 01ae 58E7 b .L7 + 430 .L16: + 431 01b0 0324 movs r4, #3 + 432 01b2 56E7 b .L7 + 433 .LVL44: + 434 .L19: + 291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** } + 292:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** } + 435 .loc 1 292 1 view .LVU173 + ARM GAS /tmp/ccrayVSd.s page 15 + + + 436 01b4 03B0 add sp, sp, #12 + 437 .cfi_def_cfa_offset 20 + 438 @ sp needed + 439 01b6 F0BD pop {r4, r5, r6, r7, pc} + 440 .L24: + 441 .align 2 + 442 .L23: + 443 01b8 00000140 .word 1073807360 + 444 01bc 00040140 .word 1073808384 + 445 01c0 00100240 .word 1073876992 + 446 01c4 00040048 .word 1207960576 + 447 .cfi_endproc + 448 .LFE130: + 450 .section .text.HAL_GPIO_DeInit,"ax",%progbits + 451 .align 1 + 452 .global HAL_GPIO_DeInit + 453 .syntax unified + 454 .thumb + 455 .thumb_func + 457 HAL_GPIO_DeInit: + 458 .LVL45: + 459 .LFB131: + 293:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /** + 295:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @brief De-initialize the GPIOx peripheral registers to their default reset values. + 296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @param GPIOx where x can be (A..F) to select the GPIO peripheral for STM32F30X device or STM32 + 297:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @param GPIO_Pin specifies the port bit to be written. + 298:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * This parameter can be one of GPIO_PIN_x where x can be (0..15). + 299:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @retval None + 300:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** */ + 301:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) + 302:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 460 .loc 1 302 1 is_stmt 1 view -0 + 461 .cfi_startproc + 462 @ args = 0, pretend = 0, frame = 0 + 463 @ frame_needed = 0, uses_anonymous_args = 0 + 303:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** uint32_t position = 0x00u; + 464 .loc 1 303 3 view .LVU175 + 304:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** uint32_t iocurrent; + 465 .loc 1 304 3 view .LVU176 + 305:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** uint32_t tmp; + 466 .loc 1 305 3 view .LVU177 + 306:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 307:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Check the parameters */ + 308:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); + 467 .loc 1 308 3 view .LVU178 + 309:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** assert_param(IS_GPIO_PIN(GPIO_Pin)); + 468 .loc 1 309 3 view .LVU179 + 310:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 311:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Configure the port pins */ + 312:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** while ((GPIO_Pin >> position) != 0x00u) + 469 .loc 1 312 3 view .LVU180 + 303:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** uint32_t iocurrent; + 470 .loc 1 303 12 is_stmt 0 view .LVU181 + 471 0000 0023 movs r3, #0 + 472 .LVL46: + 473 .loc 1 312 33 is_stmt 1 view .LVU182 + ARM GAS /tmp/ccrayVSd.s page 16 + + + 474 0002 31FA03F2 lsrs r2, r1, r3 + 475 0006 7AD0 beq .L39 + 302:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** uint32_t position = 0x00u; + 476 .loc 1 302 1 is_stmt 0 view .LVU183 + 477 0008 F0B5 push {r4, r5, r6, r7, lr} + 478 .cfi_def_cfa_offset 20 + 479 .cfi_offset 4, -20 + 480 .cfi_offset 5, -16 + 481 .cfi_offset 6, -12 + 482 .cfi_offset 7, -8 + 483 .cfi_offset 14, -4 + 484 000a 2EE0 b .L30 + 485 .LVL47: + 486 .L42: + 313:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 314:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Get current io position */ + 315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** iocurrent = (GPIO_Pin) & (1uL << position); + 316:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** if (iocurrent != 0x00u) + 318:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 319:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /*------------------------- EXTI Mode Configuration --------------------*/ + 320:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Clear the External Interrupt or Event for the current IO */ + 321:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 322:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** tmp = SYSCFG->EXTICR[position >> 2u]; + 323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** tmp &= (0x0FuL << (4u * (position & 0x03u))); + 324:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** if (tmp == (GPIO_GET_INDEX(GPIOx) << (4u * (position & 0x03u)))) + 487 .loc 1 324 19 view .LVU184 + 488 000c 0425 movs r5, #4 + 489 000e 00E0 b .L28 + 490 .L31: + 491 0010 0025 movs r5, #0 + 492 .L28: + 493 .loc 1 324 41 discriminator 20 view .LVU185 + 494 0012 05FA0CF5 lsl r5, r5, ip + 495 .loc 1 324 10 discriminator 20 view .LVU186 + 496 0016 A542 cmp r5, r4 + 497 0018 55D0 beq .L40 + 498 .LVL48: + 499 .L29: + 325:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 326:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Clear EXTI line configuration */ + 327:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** EXTI->IMR &= ~((uint32_t)iocurrent); + 328:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** EXTI->EMR &= ~((uint32_t)iocurrent); + 329:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 330:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Clear Rising Falling edge configuration */ + 331:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** EXTI->RTSR &= ~((uint32_t)iocurrent); + 332:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** EXTI->FTSR &= ~((uint32_t)iocurrent); + 333:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 334:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Configure the External Interrupt or event for the current IO */ + 335:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** tmp = 0x0FuL << (4u * (position & 0x03u)); + 336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** SYSCFG->EXTICR[position >> 2u] &= ~tmp; + 337:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** } + 338:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 339:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /*------------------------- GPIO Mode Configuration --------------------*/ + 340:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Configure IO Direction in Input Floating Mode */ + 341:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** GPIOx->MODER &= ~(GPIO_MODER_MODER0 << (position * 2u)); + 500 .loc 1 341 7 is_stmt 1 view .LVU187 + ARM GAS /tmp/ccrayVSd.s page 17 + + + 501 .loc 1 341 12 is_stmt 0 view .LVU188 + 502 001a 0468 ldr r4, [r0] + 503 .loc 1 341 56 view .LVU189 + 504 001c 5D00 lsls r5, r3, #1 + 505 .loc 1 341 43 view .LVU190 + 506 001e 4FF0030C mov ip, #3 + 507 0022 0CFA05FC lsl ip, ip, r5 + 508 .loc 1 341 20 view .LVU191 + 509 0026 24EA0C04 bic r4, r4, ip + 510 002a 0460 str r4, [r0] + 342:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Configure the default Alternate Function in current IO */ + 344:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** GPIOx->AFR[position >> 3u] &= ~(0xFu << ((uint32_t)(position & 0x07u) * 4u)) ; + 511 .loc 1 344 7 is_stmt 1 view .LVU192 + 512 .loc 1 344 17 is_stmt 0 view .LVU193 + 513 002c 4FEAD30E lsr lr, r3, #3 + 514 0030 0EF1080E add lr, lr, #8 + 515 0034 50F82E40 ldr r4, [r0, lr, lsl #2] + 516 .loc 1 344 48 view .LVU194 + 517 0038 03F00706 and r6, r3, #7 + 518 .loc 1 344 77 view .LVU195 + 519 003c B600 lsls r6, r6, #2 + 520 .loc 1 344 44 view .LVU196 + 521 003e 0F25 movs r5, #15 + 522 0040 B540 lsls r5, r5, r6 + 523 .loc 1 344 34 view .LVU197 + 524 0042 24EA0504 bic r4, r4, r5 + 525 0046 40F82E40 str r4, [r0, lr, lsl #2] + 345:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Deactivate the Pull-up and Pull-down resistor for the current IO */ + 347:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** GPIOx->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << (position * 2u)); + 526 .loc 1 347 7 is_stmt 1 view .LVU198 + 527 .loc 1 347 12 is_stmt 0 view .LVU199 + 528 004a C468 ldr r4, [r0, #12] + 529 .loc 1 347 20 view .LVU200 + 530 004c 24EA0C04 bic r4, r4, ip + 531 0050 C460 str r4, [r0, #12] + 348:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 349:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Configure the default value IO Output Type */ + 350:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** GPIOx->OTYPER &= ~(GPIO_OTYPER_OT_0 << position) ; + 532 .loc 1 350 7 is_stmt 1 view .LVU201 + 533 .loc 1 350 12 is_stmt 0 view .LVU202 + 534 0052 4468 ldr r4, [r0, #4] + 535 .loc 1 350 22 view .LVU203 + 536 0054 24EA0202 bic r2, r4, r2 + 537 .LVL49: + 538 .loc 1 350 22 view .LVU204 + 539 0058 4260 str r2, [r0, #4] + 351:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 352:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Configure the default value for IO Speed */ + 353:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2u)); + 540 .loc 1 353 7 is_stmt 1 view .LVU205 + 541 .loc 1 353 12 is_stmt 0 view .LVU206 + 542 005a 8268 ldr r2, [r0, #8] + 543 .loc 1 353 22 view .LVU207 + 544 005c 22EA0C02 bic r2, r2, ip + 545 0060 8260 str r2, [r0, #8] + ARM GAS /tmp/ccrayVSd.s page 18 + + + 546 .L27: + 354:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** } + 355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 356:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** position++; + 547 .loc 1 356 5 is_stmt 1 view .LVU208 + 548 .loc 1 356 13 is_stmt 0 view .LVU209 + 549 0062 0133 adds r3, r3, #1 + 550 .LVL50: + 312:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 551 .loc 1 312 33 is_stmt 1 view .LVU210 + 552 0064 31FA03F2 lsrs r2, r1, r3 + 553 0068 48D0 beq .L41 + 554 .LVL51: + 555 .L30: + 315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 556 .loc 1 315 5 view .LVU211 + 315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 557 .loc 1 315 35 is_stmt 0 view .LVU212 + 558 006a 0122 movs r2, #1 + 559 006c 9A40 lsls r2, r2, r3 + 560 .LVL52: + 317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 561 .loc 1 317 5 is_stmt 1 view .LVU213 + 317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 562 .loc 1 317 8 is_stmt 0 view .LVU214 + 563 006e 12EA0107 ands r7, r2, r1 + 564 .LVL53: + 317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 565 .loc 1 317 8 view .LVU215 + 566 0072 F6D0 beq .L27 + 322:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** tmp &= (0x0FuL << (4u * (position & 0x03u))); + 567 .loc 1 322 7 is_stmt 1 view .LVU216 + 322:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** tmp &= (0x0FuL << (4u * (position & 0x03u))); + 568 .loc 1 322 37 is_stmt 0 view .LVU217 + 569 0074 4FEA930E lsr lr, r3, #2 + 322:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** tmp &= (0x0FuL << (4u * (position & 0x03u))); + 570 .loc 1 322 11 view .LVU218 + 571 0078 0EF10205 add r5, lr, #2 + 572 007c 204C ldr r4, .L43 + 573 007e 54F82540 ldr r4, [r4, r5, lsl #2] + 574 .LVL54: + 323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** if (tmp == (GPIO_GET_INDEX(GPIOx) << (4u * (position & 0x03u)))) + 575 .loc 1 323 7 is_stmt 1 view .LVU219 + 323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** if (tmp == (GPIO_GET_INDEX(GPIOx) << (4u * (position & 0x03u)))) + 576 .loc 1 323 41 is_stmt 0 view .LVU220 + 577 0082 03F0030C and ip, r3, #3 + 323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** if (tmp == (GPIO_GET_INDEX(GPIOx) << (4u * (position & 0x03u)))) + 578 .loc 1 323 29 view .LVU221 + 579 0086 4FEA8C0C lsl ip, ip, #2 + 323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** if (tmp == (GPIO_GET_INDEX(GPIOx) << (4u * (position & 0x03u)))) + 580 .loc 1 323 22 view .LVU222 + 581 008a 0F25 movs r5, #15 + 582 008c 05FA0CF6 lsl r6, r5, ip + 323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** if (tmp == (GPIO_GET_INDEX(GPIOx) << (4u * (position & 0x03u)))) + 583 .loc 1 323 11 view .LVU223 + 584 0090 3440 ands r4, r4, r6 + 585 .LVL55: + ARM GAS /tmp/ccrayVSd.s page 19 + + + 324:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 586 .loc 1 324 7 is_stmt 1 view .LVU224 + 324:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 587 .loc 1 324 19 is_stmt 0 view .LVU225 + 588 0092 B0F1904F cmp r0, #1207959552 + 589 0096 BBD0 beq .L31 + 324:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 590 .loc 1 324 19 discriminator 1 view .LVU226 + 591 0098 1A4D ldr r5, .L43+4 + 592 009a A842 cmp r0, r5 + 593 009c 0DD0 beq .L32 + 324:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 594 .loc 1 324 19 discriminator 3 view .LVU227 + 595 009e 05F58065 add r5, r5, #1024 + 596 00a2 A842 cmp r0, r5 + 597 00a4 0BD0 beq .L33 + 324:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 598 .loc 1 324 19 discriminator 5 view .LVU228 + 599 00a6 05F58065 add r5, r5, #1024 + 600 00aa A842 cmp r0, r5 + 601 00ac 09D0 beq .L34 + 324:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 602 .loc 1 324 19 discriminator 7 view .LVU229 + 603 00ae 05F58065 add r5, r5, #1024 + 604 00b2 A842 cmp r0, r5 + 605 00b4 AAD0 beq .L42 + 324:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 606 .loc 1 324 19 view .LVU230 + 607 00b6 0525 movs r5, #5 + 608 00b8 ABE7 b .L28 + 609 .L32: + 610 00ba 0125 movs r5, #1 + 611 00bc A9E7 b .L28 + 612 .L33: + 613 00be 0225 movs r5, #2 + 614 00c0 A7E7 b .L28 + 615 .L34: + 616 00c2 0325 movs r5, #3 + 617 00c4 A5E7 b .L28 + 618 .L40: + 327:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** EXTI->EMR &= ~((uint32_t)iocurrent); + 619 .loc 1 327 9 is_stmt 1 view .LVU231 + 327:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** EXTI->EMR &= ~((uint32_t)iocurrent); + 620 .loc 1 327 13 is_stmt 0 view .LVU232 + 621 00c6 104C ldr r4, .L43+8 + 622 .LVL56: + 327:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** EXTI->EMR &= ~((uint32_t)iocurrent); + 623 .loc 1 327 13 view .LVU233 + 624 00c8 2568 ldr r5, [r4] + 327:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** EXTI->EMR &= ~((uint32_t)iocurrent); + 625 .loc 1 327 19 view .LVU234 + 626 00ca 25EA0705 bic r5, r5, r7 + 627 00ce 2560 str r5, [r4] + 328:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 628 .loc 1 328 9 is_stmt 1 view .LVU235 + 328:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 629 .loc 1 328 13 is_stmt 0 view .LVU236 + ARM GAS /tmp/ccrayVSd.s page 20 + + + 630 00d0 6568 ldr r5, [r4, #4] + 328:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 631 .loc 1 328 19 view .LVU237 + 632 00d2 25EA0705 bic r5, r5, r7 + 633 00d6 6560 str r5, [r4, #4] + 331:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** EXTI->FTSR &= ~((uint32_t)iocurrent); + 634 .loc 1 331 9 is_stmt 1 view .LVU238 + 331:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** EXTI->FTSR &= ~((uint32_t)iocurrent); + 635 .loc 1 331 13 is_stmt 0 view .LVU239 + 636 00d8 A568 ldr r5, [r4, #8] + 331:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** EXTI->FTSR &= ~((uint32_t)iocurrent); + 637 .loc 1 331 20 view .LVU240 + 638 00da 25EA0705 bic r5, r5, r7 + 639 00de A560 str r5, [r4, #8] + 332:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 640 .loc 1 332 9 is_stmt 1 view .LVU241 + 332:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 641 .loc 1 332 13 is_stmt 0 view .LVU242 + 642 00e0 E568 ldr r5, [r4, #12] + 332:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 643 .loc 1 332 20 view .LVU243 + 644 00e2 25EA0705 bic r5, r5, r7 + 645 00e6 E560 str r5, [r4, #12] + 335:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** SYSCFG->EXTICR[position >> 2u] &= ~tmp; + 646 .loc 1 335 9 is_stmt 1 view .LVU244 + 647 .LVL57: + 336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** } + 648 .loc 1 336 9 view .LVU245 + 336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** } + 649 .loc 1 336 23 is_stmt 0 view .LVU246 + 650 00e8 054F ldr r7, .L43 + 651 .LVL58: + 336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** } + 652 .loc 1 336 23 view .LVU247 + 653 00ea 0EF10204 add r4, lr, #2 + 654 00ee 57F82450 ldr r5, [r7, r4, lsl #2] + 336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** } + 655 .loc 1 336 40 view .LVU248 + 656 00f2 25EA0605 bic r5, r5, r6 + 657 00f6 47F82450 str r5, [r7, r4, lsl #2] + 658 00fa 8EE7 b .L29 + 659 .LVL59: + 660 .L41: + 357:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** } + 358:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** } + 661 .loc 1 358 1 view .LVU249 + 662 00fc F0BD pop {r4, r5, r6, r7, pc} + 663 .LVL60: + 664 .L39: + 665 .cfi_def_cfa_offset 0 + 666 .cfi_restore 4 + 667 .cfi_restore 5 + 668 .cfi_restore 6 + 669 .cfi_restore 7 + 670 .cfi_restore 14 + 671 .loc 1 358 1 view .LVU250 + 672 00fe 7047 bx lr + ARM GAS /tmp/ccrayVSd.s page 21 + + + 673 .L44: + 674 .align 2 + 675 .L43: + 676 0100 00000140 .word 1073807360 + 677 0104 00040048 .word 1207960576 + 678 0108 00040140 .word 1073808384 + 679 .cfi_endproc + 680 .LFE131: + 682 .section .text.HAL_GPIO_ReadPin,"ax",%progbits + 683 .align 1 + 684 .global HAL_GPIO_ReadPin + 685 .syntax unified + 686 .thumb + 687 .thumb_func + 689 HAL_GPIO_ReadPin: + 690 .LVL61: + 691 .LFB132: + 359:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 360:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /** + 361:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @} + 362:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** */ + 363:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 364:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /** @defgroup GPIO_Exported_Functions_Group2 IO operation functions + 365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @brief GPIO Read, Write, Toggle, Lock and EXTI management functions. + 366:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * + 367:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** @verbatim + 368:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** =============================================================================== + 369:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** ##### IO operation functions ##### + 370:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** =============================================================================== + 371:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 372:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** @endverbatim + 373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @{ + 374:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** */ + 375:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /** + 377:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @brief Read the specified input port pin. + 378:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @param GPIOx where x can be (A..F) to select the GPIO peripheral for STM32F3 family + 379:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @param GPIO_Pin specifies the port bit to read. + 380:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * This parameter can be GPIO_PIN_x where x can be (0..15). + 381:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @retval The input port pin value. + 382:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** */ + 383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) + 384:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 692 .loc 1 384 1 is_stmt 1 view -0 + 693 .cfi_startproc + 694 @ args = 0, pretend = 0, frame = 0 + 695 @ frame_needed = 0, uses_anonymous_args = 0 + 696 @ link register save eliminated. + 385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** GPIO_PinState bitstatus; + 697 .loc 1 385 3 view .LVU252 + 386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 387:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Check the parameters */ + 388:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** assert_param(IS_GPIO_PIN(GPIO_Pin)); + 698 .loc 1 388 3 view .LVU253 + 389:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 390:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** if((GPIOx->IDR & GPIO_Pin) != (uint32_t)GPIO_PIN_RESET) + 699 .loc 1 390 3 view .LVU254 + ARM GAS /tmp/ccrayVSd.s page 22 + + + 700 .loc 1 390 12 is_stmt 0 view .LVU255 + 701 0000 0369 ldr r3, [r0, #16] + 702 .loc 1 390 5 view .LVU256 + 703 0002 1942 tst r1, r3 + 704 0004 01D0 beq .L47 + 391:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 392:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** bitstatus = GPIO_PIN_SET; + 705 .loc 1 392 15 view .LVU257 + 706 0006 0120 movs r0, #1 + 707 .LVL62: + 708 .loc 1 392 15 view .LVU258 + 709 0008 7047 bx lr + 710 .LVL63: + 711 .L47: + 393:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** } + 394:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** else + 395:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 396:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** bitstatus = GPIO_PIN_RESET; + 712 .loc 1 396 15 view .LVU259 + 713 000a 0020 movs r0, #0 + 714 .LVL64: + 397:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** } + 398:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** return bitstatus; + 715 .loc 1 398 3 is_stmt 1 view .LVU260 + 399:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** } + 716 .loc 1 399 1 is_stmt 0 view .LVU261 + 717 000c 7047 bx lr + 718 .cfi_endproc + 719 .LFE132: + 721 .section .text.HAL_GPIO_WritePin,"ax",%progbits + 722 .align 1 + 723 .global HAL_GPIO_WritePin + 724 .syntax unified + 725 .thumb + 726 .thumb_func + 728 HAL_GPIO_WritePin: + 729 .LVL65: + 730 .LFB133: + 400:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /** + 402:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @brief Set or clear the selected data port bit. + 403:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * + 404:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @note This function uses GPIOx_BSRR and GPIOx_BRR registers to allow atomic read/modify + 405:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * accesses. In this way, there is no risk of an IRQ occurring between + 406:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * the read and the modify access. + 407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * + 408:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @param GPIOx where x can be (A..F) to select the GPIO peripheral for STM32F3 family + 409:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @param GPIO_Pin specifies the port bit to be written. + 410:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * This parameter can be one of GPIO_PIN_x where x can be (0..15). + 411:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @param PinState specifies the value to be written to the selected bit. + 412:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * This parameter can be one of the GPIO_PinState enum values: + 413:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @arg GPIO_PIN_RESET: to clear the port pin + 414:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @arg GPIO_PIN_SET: to set the port pin + 415:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @retval None + 416:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** */ + 417:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState) + 418:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + ARM GAS /tmp/ccrayVSd.s page 23 + + + 731 .loc 1 418 1 is_stmt 1 view -0 + 732 .cfi_startproc + 733 @ args = 0, pretend = 0, frame = 0 + 734 @ frame_needed = 0, uses_anonymous_args = 0 + 735 @ link register save eliminated. + 419:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Check the parameters */ + 420:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** assert_param(IS_GPIO_PIN(GPIO_Pin)); + 736 .loc 1 420 3 view .LVU263 + 421:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** assert_param(IS_GPIO_PIN_ACTION(PinState)); + 737 .loc 1 421 3 view .LVU264 + 422:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 423:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** if(PinState != GPIO_PIN_RESET) + 738 .loc 1 423 3 view .LVU265 + 739 .loc 1 423 5 is_stmt 0 view .LVU266 + 740 0000 0AB1 cbz r2, .L49 + 424:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 425:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** GPIOx->BSRR = (uint32_t)GPIO_Pin; + 741 .loc 1 425 5 is_stmt 1 view .LVU267 + 742 .loc 1 425 17 is_stmt 0 view .LVU268 + 743 0002 8161 str r1, [r0, #24] + 744 0004 7047 bx lr + 745 .L49: + 426:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** } + 427:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** else + 428:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 429:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** GPIOx->BRR = (uint32_t)GPIO_Pin; + 746 .loc 1 429 5 is_stmt 1 view .LVU269 + 747 .loc 1 429 16 is_stmt 0 view .LVU270 + 748 0006 8162 str r1, [r0, #40] + 430:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** } + 431:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** } + 749 .loc 1 431 1 view .LVU271 + 750 0008 7047 bx lr + 751 .cfi_endproc + 752 .LFE133: + 754 .section .text.HAL_GPIO_TogglePin,"ax",%progbits + 755 .align 1 + 756 .global HAL_GPIO_TogglePin + 757 .syntax unified + 758 .thumb + 759 .thumb_func + 761 HAL_GPIO_TogglePin: + 762 .LVL66: + 763 .LFB134: + 432:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 433:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /** + 434:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @brief Toggle the specified GPIO pin. + 435:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @param GPIOx where x can be (A..F) to select the GPIO peripheral for STM32F3 family + 436:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @param GPIO_Pin specifies the pin to be toggled. + 437:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @retval None + 438:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** */ + 439:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) + 440:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 764 .loc 1 440 1 is_stmt 1 view -0 + 765 .cfi_startproc + 766 @ args = 0, pretend = 0, frame = 0 + 767 @ frame_needed = 0, uses_anonymous_args = 0 + ARM GAS /tmp/ccrayVSd.s page 24 + + + 768 @ link register save eliminated. + 441:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** uint32_t odr; + 769 .loc 1 441 3 view .LVU273 + 442:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 443:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Check the parameters */ + 444:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** assert_param(IS_GPIO_PIN(GPIO_Pin)); + 770 .loc 1 444 3 view .LVU274 + 445:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 446:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* get current Ouput Data Register value */ + 447:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** odr = GPIOx->ODR; + 771 .loc 1 447 3 view .LVU275 + 772 .loc 1 447 7 is_stmt 0 view .LVU276 + 773 0000 4369 ldr r3, [r0, #20] + 774 .LVL67: + 448:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 449:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Set selected pins that were at low level, and reset ones that were high */ + 450:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** GPIOx->BSRR = ((odr & GPIO_Pin) << GPIO_NUMBER) | (~odr & GPIO_Pin); + 775 .loc 1 450 3 is_stmt 1 view .LVU277 + 776 .loc 1 450 23 is_stmt 0 view .LVU278 + 777 0002 01EA0302 and r2, r1, r3 + 778 .loc 1 450 59 view .LVU279 + 779 0006 21EA0301 bic r1, r1, r3 + 780 .LVL68: + 781 .loc 1 450 51 view .LVU280 + 782 000a 41EA0241 orr r1, r1, r2, lsl #16 + 783 .loc 1 450 15 view .LVU281 + 784 000e 8161 str r1, [r0, #24] + 451:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** } + 785 .loc 1 451 1 view .LVU282 + 786 0010 7047 bx lr + 787 .cfi_endproc + 788 .LFE134: + 790 .section .text.HAL_GPIO_LockPin,"ax",%progbits + 791 .align 1 + 792 .global HAL_GPIO_LockPin + 793 .syntax unified + 794 .thumb + 795 .thumb_func + 797 HAL_GPIO_LockPin: + 798 .LVL69: + 799 .LFB135: + 452:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 453:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /** + 454:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @brief Lock GPIO Pins configuration registers. + 455:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @note The locked registers are GPIOx_MODER, GPIOx_OTYPER, GPIOx_OSPEEDR, + 456:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * GPIOx_PUPDR, GPIOx_AFRL and GPIOx_AFRH. + 457:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @note The configuration of the locked GPIO pins can no longer be modified + 458:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * until the next reset. + 459:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @param GPIOx where x can be (A..F) to select the GPIO peripheral for STM32F3 family + 460:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @param GPIO_Pin specifies the port bits to be locked. + 461:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * This parameter can be any combination of GPIO_Pin_x where x can be (0..15). + 462:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @retval None + 463:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** */ + 464:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) + 465:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 800 .loc 1 465 1 is_stmt 1 view -0 + 801 .cfi_startproc + ARM GAS /tmp/ccrayVSd.s page 25 + + + 802 @ args = 0, pretend = 0, frame = 8 + 803 @ frame_needed = 0, uses_anonymous_args = 0 + 804 @ link register save eliminated. + 805 .loc 1 465 1 is_stmt 0 view .LVU284 + 806 0000 82B0 sub sp, sp, #8 + 807 .cfi_def_cfa_offset 8 + 466:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** __IO uint32_t tmp = GPIO_LCKR_LCKK; + 808 .loc 1 466 3 is_stmt 1 view .LVU285 + 809 .loc 1 466 17 is_stmt 0 view .LVU286 + 810 0002 4FF48033 mov r3, #65536 + 811 0006 0193 str r3, [sp, #4] + 467:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 468:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Check the parameters */ + 469:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** assert_param(IS_GPIO_LOCK_INSTANCE(GPIOx)); + 812 .loc 1 469 3 is_stmt 1 view .LVU287 + 470:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** assert_param(IS_GPIO_PIN(GPIO_Pin)); + 813 .loc 1 470 3 view .LVU288 + 471:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 472:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Apply lock key write sequence */ + 473:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** tmp |= GPIO_Pin; + 814 .loc 1 473 3 view .LVU289 + 815 .loc 1 473 7 is_stmt 0 view .LVU290 + 816 0008 019B ldr r3, [sp, #4] + 817 000a 0B43 orrs r3, r3, r1 + 818 000c 0193 str r3, [sp, #4] + 474:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Set LCKx bit(s): LCKK='1' + LCK[15U-0] */ + 475:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** GPIOx->LCKR = tmp; + 819 .loc 1 475 3 is_stmt 1 view .LVU291 + 820 .loc 1 475 15 is_stmt 0 view .LVU292 + 821 000e 019B ldr r3, [sp, #4] + 822 0010 C361 str r3, [r0, #28] + 476:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Reset LCKx bit(s): LCKK='0' + LCK[15U-0] */ + 477:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** GPIOx->LCKR = GPIO_Pin; + 823 .loc 1 477 3 is_stmt 1 view .LVU293 + 824 .loc 1 477 15 is_stmt 0 view .LVU294 + 825 0012 C161 str r1, [r0, #28] + 478:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Set LCKx bit(s): LCKK='1' + LCK[15U-0] */ + 479:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** GPIOx->LCKR = tmp; + 826 .loc 1 479 3 is_stmt 1 view .LVU295 + 827 .loc 1 479 15 is_stmt 0 view .LVU296 + 828 0014 019B ldr r3, [sp, #4] + 829 0016 C361 str r3, [r0, #28] + 480:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Read LCKK register. This read is mandatory to complete key lock sequence */ + 481:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** tmp = GPIOx->LCKR; + 830 .loc 1 481 3 is_stmt 1 view .LVU297 + 831 .loc 1 481 14 is_stmt 0 view .LVU298 + 832 0018 C369 ldr r3, [r0, #28] + 833 .loc 1 481 7 view .LVU299 + 834 001a 0193 str r3, [sp, #4] + 482:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 483:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* read again in order to confirm lock is active */ + 484:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** if((GPIOx->LCKR & GPIO_LCKR_LCKK) != 0x00u) + 835 .loc 1 484 2 is_stmt 1 view .LVU300 + 836 .loc 1 484 11 is_stmt 0 view .LVU301 + 837 001c C369 ldr r3, [r0, #28] + 838 .loc 1 484 4 view .LVU302 + 839 001e 13F4803F tst r3, #65536 + ARM GAS /tmp/ccrayVSd.s page 26 + + + 840 0022 02D0 beq .L54 + 485:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 486:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** return HAL_OK; + 841 .loc 1 486 12 view .LVU303 + 842 0024 0020 movs r0, #0 + 843 .LVL70: + 844 .L53: + 487:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** } + 488:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** else + 489:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 490:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** return HAL_ERROR; + 491:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** } + 492:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** } + 845 .loc 1 492 1 view .LVU304 + 846 0026 02B0 add sp, sp, #8 + 847 .cfi_remember_state + 848 .cfi_def_cfa_offset 0 + 849 @ sp needed + 850 0028 7047 bx lr + 851 .LVL71: + 852 .L54: + 853 .cfi_restore_state + 490:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** } + 854 .loc 1 490 12 view .LVU305 + 855 002a 0120 movs r0, #1 + 856 .LVL72: + 490:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** } + 857 .loc 1 490 12 view .LVU306 + 858 002c FBE7 b .L53 + 859 .cfi_endproc + 860 .LFE135: + 862 .section .text.HAL_GPIO_EXTI_Callback,"ax",%progbits + 863 .align 1 + 864 .weak HAL_GPIO_EXTI_Callback + 865 .syntax unified + 866 .thumb + 867 .thumb_func + 869 HAL_GPIO_EXTI_Callback: + 870 .LVL73: + 871 .LFB137: + 493:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 494:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /** + 495:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @brief Handle EXTI interrupt request. + 496:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @param GPIO_Pin Specifies the port pin connected to corresponding EXTI line. + 497:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @retval None + 498:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** */ + 499:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin) + 500:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 501:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* EXTI line interrupt detected */ + 502:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != 0x00u) + 503:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 504:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin); + 505:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** HAL_GPIO_EXTI_Callback(GPIO_Pin); + 506:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** } + 507:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** } + 508:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 509:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /** + ARM GAS /tmp/ccrayVSd.s page 27 + + + 510:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @brief EXTI line detection callback. + 511:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @param GPIO_Pin Specifies the port pin connected to corresponding EXTI line. + 512:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** * @retval None + 513:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** */ + 514:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** __weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) + 515:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 872 .loc 1 515 1 is_stmt 1 view -0 + 873 .cfi_startproc + 874 @ args = 0, pretend = 0, frame = 0 + 875 @ frame_needed = 0, uses_anonymous_args = 0 + 876 @ link register save eliminated. + 516:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* Prevent unused argument(s) compilation warning */ + 517:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** UNUSED(GPIO_Pin); + 877 .loc 1 517 3 view .LVU308 + 518:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 519:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* NOTE: This function should not be modified, when the callback is needed, + 520:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** the HAL_GPIO_EXTI_Callback could be implemented in the user file + 521:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** */ + 522:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** } + 878 .loc 1 522 1 is_stmt 0 view .LVU309 + 879 0000 7047 bx lr + 880 .cfi_endproc + 881 .LFE137: + 883 .section .text.HAL_GPIO_EXTI_IRQHandler,"ax",%progbits + 884 .align 1 + 885 .global HAL_GPIO_EXTI_IRQHandler + 886 .syntax unified + 887 .thumb + 888 .thumb_func + 890 HAL_GPIO_EXTI_IRQHandler: + 891 .LVL74: + 892 .LFB136: + 500:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* EXTI line interrupt detected */ + 893 .loc 1 500 1 is_stmt 1 view -0 + 894 .cfi_startproc + 895 @ args = 0, pretend = 0, frame = 0 + 896 @ frame_needed = 0, uses_anonymous_args = 0 + 500:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** /* EXTI line interrupt detected */ + 897 .loc 1 500 1 is_stmt 0 view .LVU311 + 898 0000 08B5 push {r3, lr} + 899 .cfi_def_cfa_offset 8 + 900 .cfi_offset 3, -8 + 901 .cfi_offset 14, -4 + 502:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 902 .loc 1 502 3 is_stmt 1 view .LVU312 + 502:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 903 .loc 1 502 6 is_stmt 0 view .LVU313 + 904 0002 054B ldr r3, .L61 + 905 0004 5B69 ldr r3, [r3, #20] + 502:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** { + 906 .loc 1 502 5 view .LVU314 + 907 0006 0342 tst r3, r0 + 908 0008 00D1 bne .L60 + 909 .LVL75: + 910 .L57: + 507:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 911 .loc 1 507 1 view .LVU315 + ARM GAS /tmp/ccrayVSd.s page 28 + + + 912 000a 08BD pop {r3, pc} + 913 .LVL76: + 914 .L60: + 504:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** HAL_GPIO_EXTI_Callback(GPIO_Pin); + 915 .loc 1 504 5 is_stmt 1 view .LVU316 + 916 000c 024B ldr r3, .L61 + 917 000e 5861 str r0, [r3, #20] + 505:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** } + 918 .loc 1 505 5 view .LVU317 + 919 0010 FFF7FEFF bl HAL_GPIO_EXTI_Callback + 920 .LVL77: + 507:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c **** + 921 .loc 1 507 1 is_stmt 0 view .LVU318 + 922 0014 F9E7 b .L57 + 923 .L62: + 924 0016 00BF .align 2 + 925 .L61: + 926 0018 00040140 .word 1073808384 + 927 .cfi_endproc + 928 .LFE136: + 930 .text + 931 .Letext0: + 932 .file 2 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 933 .file 3 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 934 .file 4 "Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h" + 935 .file 5 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h" + 936 .file 6 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h" + ARM GAS /tmp/ccrayVSd.s page 29 + + +DEFINED SYMBOLS + *ABS*:0000000000000000 stm32f3xx_hal_gpio.c + /tmp/ccrayVSd.s:21 .text.HAL_GPIO_Init:0000000000000000 $t + /tmp/ccrayVSd.s:27 .text.HAL_GPIO_Init:0000000000000000 HAL_GPIO_Init + /tmp/ccrayVSd.s:443 .text.HAL_GPIO_Init:00000000000001b8 $d + /tmp/ccrayVSd.s:451 .text.HAL_GPIO_DeInit:0000000000000000 $t + /tmp/ccrayVSd.s:457 .text.HAL_GPIO_DeInit:0000000000000000 HAL_GPIO_DeInit + /tmp/ccrayVSd.s:676 .text.HAL_GPIO_DeInit:0000000000000100 $d + /tmp/ccrayVSd.s:683 .text.HAL_GPIO_ReadPin:0000000000000000 $t + /tmp/ccrayVSd.s:689 .text.HAL_GPIO_ReadPin:0000000000000000 HAL_GPIO_ReadPin + /tmp/ccrayVSd.s:722 .text.HAL_GPIO_WritePin:0000000000000000 $t + /tmp/ccrayVSd.s:728 .text.HAL_GPIO_WritePin:0000000000000000 HAL_GPIO_WritePin + /tmp/ccrayVSd.s:755 .text.HAL_GPIO_TogglePin:0000000000000000 $t + /tmp/ccrayVSd.s:761 .text.HAL_GPIO_TogglePin:0000000000000000 HAL_GPIO_TogglePin + /tmp/ccrayVSd.s:791 .text.HAL_GPIO_LockPin:0000000000000000 $t + /tmp/ccrayVSd.s:797 .text.HAL_GPIO_LockPin:0000000000000000 HAL_GPIO_LockPin + /tmp/ccrayVSd.s:863 .text.HAL_GPIO_EXTI_Callback:0000000000000000 $t + /tmp/ccrayVSd.s:869 .text.HAL_GPIO_EXTI_Callback:0000000000000000 HAL_GPIO_EXTI_Callback + /tmp/ccrayVSd.s:884 .text.HAL_GPIO_EXTI_IRQHandler:0000000000000000 $t + /tmp/ccrayVSd.s:890 .text.HAL_GPIO_EXTI_IRQHandler:0000000000000000 HAL_GPIO_EXTI_IRQHandler + /tmp/ccrayVSd.s:926 .text.HAL_GPIO_EXTI_IRQHandler:0000000000000018 $d + +NO UNDEFINED SYMBOLS diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_gpio.o b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_gpio.o new file mode 100644 index 0000000000000000000000000000000000000000..818ff3dee0987723a80cae770b5574c98ec3434e GIT binary patch literal 10964 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 bIR=N%WH`$XvDl7s^xC|P-ETWXolX81$=Psz literal 0 HcmV?d00001 diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_i2c.d b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_i2c.d new file mode 100644 index 0000000..dbf507e --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_i2c.d @@ -0,0 +1,58 @@ +build/stm32f3xx_hal_i2c.o: \ + Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h \ + Core/Inc/stm32f3xx_hal_conf.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h \ + Drivers/CMSIS/Include/core_cm4.h Drivers/CMSIS/Include/cmsis_version.h \ + Drivers/CMSIS/Include/cmsis_compiler.h Drivers/CMSIS/Include/cmsis_gcc.h \ + Drivers/CMSIS/Include/mpu_armv7.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h: +Core/Inc/stm32f3xx_hal_conf.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h: +Drivers/CMSIS/Include/core_cm4.h: +Drivers/CMSIS/Include/cmsis_version.h: +Drivers/CMSIS/Include/cmsis_compiler.h: +Drivers/CMSIS/Include/cmsis_gcc.h: +Drivers/CMSIS/Include/mpu_armv7.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h: +Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h: diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_i2c.lst b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_i2c.lst new file mode 100644 index 0000000..0e2e568 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_i2c.lst @@ -0,0 +1,25237 @@ +ARM GAS /tmp/ccE2rRGE.s page 1 + + + 1 .cpu cortex-m4 + 2 .arch armv7e-m + 3 .fpu fpv4-sp-d16 + 4 .eabi_attribute 27, 1 + 5 .eabi_attribute 28, 1 + 6 .eabi_attribute 20, 1 + 7 .eabi_attribute 21, 1 + 8 .eabi_attribute 23, 3 + 9 .eabi_attribute 24, 1 + 10 .eabi_attribute 25, 1 + 11 .eabi_attribute 26, 1 + 12 .eabi_attribute 30, 1 + 13 .eabi_attribute 34, 1 + 14 .eabi_attribute 18, 4 + 15 .file "stm32f3xx_hal_i2c.c" + 16 .text + 17 .Ltext0: + 18 .cfi_sections .debug_frame + 19 .file 1 "Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c" + 20 .section .text.I2C_Flush_TXDR,"ax",%progbits + 21 .align 1 + 22 .syntax unified + 23 .thumb + 24 .thumb_func + 26 I2C_Flush_TXDR: + 27 .LVL0: + 28 .LFB193: + 1:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** + 2:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** ****************************************************************************** + 3:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @file stm32f3xx_hal_i2c.c + 4:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @author MCD Application Team + 5:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief I2C HAL module driver. + 6:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * This file provides firmware functions to manage the following + 7:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * functionalities of the Inter Integrated Circuit (I2C) peripheral: + 8:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * + Initialization and de-initialization functions + 9:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * + IO operation functions + 10:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * + Peripheral State and Errors functions + 11:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * + 12:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** @verbatim + 13:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** ============================================================================== + 14:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** ##### How to use this driver ##### + 15:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** ============================================================================== + 16:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** [..] + 17:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** The I2C HAL driver can be used as follows: + 18:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 19:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (#) Declare a I2C_HandleTypeDef handle structure, for example: + 20:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_HandleTypeDef hi2c; + 21:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 22:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (#)Initialize the I2C low level resources by implementing the HAL_I2C_MspInit() API: + 23:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (##) Enable the I2Cx interface clock + 24:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (##) I2C pins configuration + 25:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+++) Enable the clock for the I2C GPIOs + 26:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+++) Configure I2C pins as alternate function open-drain + 27:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (##) NVIC configuration if you need to use interrupt process + 28:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+++) Configure the I2Cx interrupt priority + 29:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+++) Enable the NVIC I2C IRQ Channel + 30:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (##) DMA Configuration if you need to use DMA process + ARM GAS /tmp/ccE2rRGE.s page 2 + + + 31:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+++) Declare a DMA_HandleTypeDef handle structure for + 32:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** the transmit or receive channel + 33:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+++) Enable the DMAx interface clock using + 34:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+++) Configure the DMA handle parameters + 35:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+++) Configure the DMA Tx or Rx channel + 36:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+++) Associate the initialized DMA handle to the hi2c DMA Tx or Rx handle + 37:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+++) Configure the priority and enable the NVIC for the transfer complete interrupt on + 38:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** the DMA Tx or Rx channel + 39:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 40:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (#) Configure the Communication Clock Timing, Own Address1, Master Addressing mode, Dual Addres + 41:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** Own Address2, Own Address2 Mask, General call and Nostretch mode in the hi2c Init structure + 42:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 43:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (#) Initialize the I2C registers by calling the HAL_I2C_Init(), configures also the low level H + 44:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (GPIO, CLOCK, NVIC...etc) by calling the customized HAL_I2C_MspInit(&hi2c) API. + 45:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 46:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (#) To check if target device is ready for communication, use the function HAL_I2C_IsDeviceRead + 47:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 48:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (#) For I2C IO and IO MEM operations, three operation modes are available within this driver : + 49:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 50:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** *** Polling mode IO operation *** + 51:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** ================================= + 52:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** [..] + 53:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) Transmit in master mode an amount of data in blocking mode using HAL_I2C_Master_Transmit( + 54:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) Receive in master mode an amount of data in blocking mode using HAL_I2C_Master_Receive() + 55:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) Transmit in slave mode an amount of data in blocking mode using HAL_I2C_Slave_Transmit() + 56:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) Receive in slave mode an amount of data in blocking mode using HAL_I2C_Slave_Receive() + 57:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 58:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** *** Polling mode IO MEM operation *** + 59:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** ===================================== + 60:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** [..] + 61:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) Write an amount of data in blocking mode to a specific memory address using HAL_I2C_Mem_W + 62:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) Read an amount of data in blocking mode from a specific memory address using HAL_I2C_Mem_ + 63:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 64:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 65:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** *** Interrupt mode IO operation *** + 66:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** =================================== + 67:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** [..] + 68:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) Transmit in master mode an amount of data in non-blocking mode using HAL_I2C_Master_Trans + 69:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) At transmission end of transfer, HAL_I2C_MasterTxCpltCallback() is executed and users can + 70:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** add their own code by customization of function pointer HAL_I2C_MasterTxCpltCallback() + 71:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) Receive in master mode an amount of data in non-blocking mode using HAL_I2C_Master_Receiv + 72:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) At reception end of transfer, HAL_I2C_MasterRxCpltCallback() is executed and users can + 73:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** add their own code by customization of function pointer HAL_I2C_MasterRxCpltCallback() + 74:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) Transmit in slave mode an amount of data in non-blocking mode using HAL_I2C_Slave_Transmi + 75:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) At transmission end of transfer, HAL_I2C_SlaveTxCpltCallback() is executed and users can + 76:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** add their own code by customization of function pointer HAL_I2C_SlaveTxCpltCallback() + 77:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) Receive in slave mode an amount of data in non-blocking mode using HAL_I2C_Slave_Receive_ + 78:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) At reception end of transfer, HAL_I2C_SlaveRxCpltCallback() is executed and users can + 79:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** add their own code by customization of function pointer HAL_I2C_SlaveRxCpltCallback() + 80:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and users can + 81:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** add their own code by customization of function pointer HAL_I2C_ErrorCallback() + 82:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) Abort a master I2C process communication with Interrupt using HAL_I2C_Master_Abort_IT() + 83:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) End of abort process, HAL_I2C_AbortCpltCallback() is executed and users can + 84:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** add their own code by customization of function pointer HAL_I2C_AbortCpltCallback() + 85:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) Discard a slave I2C process communication using __HAL_I2C_GENERATE_NACK() macro. + 86:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** This action will inform Master to generate a Stop condition to discard the communication + 87:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + ARM GAS /tmp/ccE2rRGE.s page 3 + + + 88:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 89:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** *** Interrupt mode or DMA mode IO sequential operation *** + 90:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** ========================================================== + 91:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** [..] + 92:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (@) These interfaces allow to manage a sequential transfer with a repeated start condition + 93:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** when a direction change during transfer + 94:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** [..] + 95:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) A specific option field manage the different steps of a sequential transfer + 96:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) Option field values are defined through I2C_XFEROPTIONS and are listed below: + 97:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) I2C_FIRST_AND_LAST_FRAME: No sequential usage, functional is same as associated interfac + 98:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** no sequential mode + 99:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) I2C_FIRST_FRAME: Sequential usage, this option allow to manage a sequence with start con + 100:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** and data to transfer without a final stop condition + 101:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) I2C_FIRST_AND_NEXT_FRAME: Sequential usage (Master only), this option allow to manage a + 102:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** start condition, address and data to transfer without a final stop cond + 103:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** an then permit a call the same master sequential interface several time + 104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (like HAL_I2C_Master_Seq_Transmit_IT() then HAL_I2C_Master_Seq_Transmit + 105:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** or HAL_I2C_Master_Seq_Transmit_DMA() then HAL_I2C_Master_Seq_Transmit_D + 106:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) I2C_NEXT_FRAME: Sequential usage, this option allow to manage a sequence with a restart + 107:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** and with new data to transfer if the direction change or manage only th + 108:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** transfer + 109:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if no direction change and without a final stop condition in both cases + 110:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) I2C_LAST_FRAME: Sequential usage, this option allow to manage a sequance with a restart + 111:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** and with new data to transfer if the direction change or manage only th + 112:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** transfer + 113:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if no direction change and with a final stop condition in both cases + 114:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) I2C_LAST_FRAME_NO_STOP: Sequential usage (Master only), this option allow to manage a re + 115:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** after several call of the same master sequential interface several time + 116:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (link with option I2C_FIRST_AND_NEXT_FRAME). + 117:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** Usage can, transfer several bytes one by one using + 118:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_Master_Seq_Transmit_IT + 119:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** or HAL_I2C_Master_Seq_Receive_IT + 120:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** or HAL_I2C_Master_Seq_Transmit_DMA + 121:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** or HAL_I2C_Master_Seq_Receive_DMA + 122:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** with option I2C_FIRST_AND_NEXT_FRAME then I2C_NEXT_FRAME. + 123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** Then usage of this option I2C_LAST_FRAME_NO_STOP at the last Transmit + 124:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** Receive sequence permit to call the opposite interface Receive or Tra + 125:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** without stopping the communication and so generate a restart conditio + 126:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) I2C_OTHER_FRAME: Sequential usage (Master only), this option allow to manage a restart c + 127:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** each call of the same master sequential + 128:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** interface. + 129:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** Usage can, transfer several bytes one by one with a restart with slave + 130:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** each bytes using + 131:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_Master_Seq_Transmit_IT + 132:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** or HAL_I2C_Master_Seq_Receive_IT + 133:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** or HAL_I2C_Master_Seq_Transmit_DMA + 134:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** or HAL_I2C_Master_Seq_Receive_DMA + 135:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** with option I2C_FIRST_FRAME then I2C_OTHER_FRAME. + 136:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** Then usage of this option I2C_OTHER_AND_LAST_FRAME at the last frame to + 137:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** generation of STOP condition. + 138:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) Different sequential I2C interfaces are listed below: + 140:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) Sequential transmit in master I2C mode an amount of data in non-blocking mode using + 141:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_Master_Seq_Transmit_IT() or using HAL_I2C_Master_Seq_Transmit_DMA() + 142:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+++) At transmission end of current frame transfer, HAL_I2C_MasterTxCpltCallback() is execut + 143:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** users can add their own code by customization of function pointer HAL_I2C_MasterTxCpltC + 144:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) Sequential receive in master I2C mode an amount of data in non-blocking mode using + ARM GAS /tmp/ccE2rRGE.s page 4 + + + 145:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_Master_Seq_Receive_IT() or using HAL_I2C_Master_Seq_Receive_DMA() + 146:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+++) At reception end of current frame transfer, HAL_I2C_MasterRxCpltCallback() is executed + 147:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** add their own code by customization of function pointer HAL_I2C_MasterRxCpltCallback() + 148:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) Abort a master IT or DMA I2C process communication with Interrupt using HAL_I2C_Master_A + 149:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+++) End of abort process, HAL_I2C_AbortCpltCallback() is executed and users can + 150:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** add their own code by customization of function pointer HAL_I2C_AbortCpltCallback() + 151:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) Enable/disable the Address listen mode in slave I2C mode using HAL_I2C_EnableListen_IT() + 152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_DisableListen_IT() + 153:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+++) When address slave I2C match, HAL_I2C_AddrCallback() is executed and users can + 154:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** add their own code to check the Address Match Code and the transmission direction reques + 155:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (Write/Read). + 156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+++) At Listen mode end HAL_I2C_ListenCpltCallback() is executed and users can + 157:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** add their own code by customization of function pointer HAL_I2C_ListenCpltCallback() + 158:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) Sequential transmit in slave I2C mode an amount of data in non-blocking mode using + 159:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_Slave_Seq_Transmit_IT() or using HAL_I2C_Slave_Seq_Transmit_DMA() + 160:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+++) At transmission end of current frame transfer, HAL_I2C_SlaveTxCpltCallback() is execute + 161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** users can add their own code by customization of function pointer HAL_I2C_SlaveTxCpltCa + 162:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) Sequential receive in slave I2C mode an amount of data in non-blocking mode using + 163:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_Slave_Seq_Receive_IT() or using HAL_I2C_Slave_Seq_Receive_DMA() + 164:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+++) At reception end of current frame transfer, HAL_I2C_SlaveRxCpltCallback() is executed a + 165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** add their own code by customization of function pointer HAL_I2C_SlaveRxCpltCallback() + 166:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and users can + 167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** add their own code by customization of function pointer HAL_I2C_ErrorCallback() + 168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) Discard a slave I2C process communication using __HAL_I2C_GENERATE_NACK() macro. + 169:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** This action will inform Master to generate a Stop condition to discard the communication + 170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 171:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** *** Interrupt mode IO MEM operation *** + 172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** ======================================= + 173:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** [..] + 174:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) Write an amount of data in non-blocking mode with Interrupt to a specific memory address + 175:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_Mem_Write_IT() + 176:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) At Memory end of write transfer, HAL_I2C_MemTxCpltCallback() is executed and users can + 177:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** add their own code by customization of function pointer HAL_I2C_MemTxCpltCallback() + 178:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) Read an amount of data in non-blocking mode with Interrupt from a specific memory address + 179:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_Mem_Read_IT() + 180:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) At Memory end of read transfer, HAL_I2C_MemRxCpltCallback() is executed and users can + 181:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** add their own code by customization of function pointer HAL_I2C_MemRxCpltCallback() + 182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and users can + 183:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** add their own code by customization of function pointer HAL_I2C_ErrorCallback() + 184:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 185:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** *** DMA mode IO operation *** + 186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** ============================== + 187:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** [..] + 188:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) Transmit in master mode an amount of data in non-blocking mode (DMA) using + 189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_Master_Transmit_DMA() + 190:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) At transmission end of transfer, HAL_I2C_MasterTxCpltCallback() is executed and users can + 191:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** add their own code by customization of function pointer HAL_I2C_MasterTxCpltCallback() + 192:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) Receive in master mode an amount of data in non-blocking mode (DMA) using + 193:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_Master_Receive_DMA() + 194:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) At reception end of transfer, HAL_I2C_MasterRxCpltCallback() is executed and users can + 195:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** add their own code by customization of function pointer HAL_I2C_MasterRxCpltCallback() + 196:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) Transmit in slave mode an amount of data in non-blocking mode (DMA) using + 197:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_Slave_Transmit_DMA() + 198:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) At transmission end of transfer, HAL_I2C_SlaveTxCpltCallback() is executed and users can + 199:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** add their own code by customization of function pointer HAL_I2C_SlaveTxCpltCallback() + 200:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) Receive in slave mode an amount of data in non-blocking mode (DMA) using + 201:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_Slave_Receive_DMA() + ARM GAS /tmp/ccE2rRGE.s page 5 + + + 202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) At reception end of transfer, HAL_I2C_SlaveRxCpltCallback() is executed and users can + 203:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** add their own code by customization of function pointer HAL_I2C_SlaveRxCpltCallback() + 204:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and users can + 205:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** add their own code by customization of function pointer HAL_I2C_ErrorCallback() + 206:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) Abort a master I2C process communication with Interrupt using HAL_I2C_Master_Abort_IT() + 207:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) End of abort process, HAL_I2C_AbortCpltCallback() is executed and users can + 208:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** add their own code by customization of function pointer HAL_I2C_AbortCpltCallback() + 209:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) Discard a slave I2C process communication using __HAL_I2C_GENERATE_NACK() macro. + 210:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** This action will inform Master to generate a Stop condition to discard the communication + 211:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 212:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** *** DMA mode IO MEM operation *** + 213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** ================================= + 214:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** [..] + 215:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) Write an amount of data in non-blocking mode with DMA to a specific memory address using + 216:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_Mem_Write_DMA() + 217:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) At Memory end of write transfer, HAL_I2C_MemTxCpltCallback() is executed and users can + 218:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** add their own code by customization of function pointer HAL_I2C_MemTxCpltCallback() + 219:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) Read an amount of data in non-blocking mode with DMA from a specific memory address using + 220:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_Mem_Read_DMA() + 221:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) At Memory end of read transfer, HAL_I2C_MemRxCpltCallback() is executed and users can + 222:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** add their own code by customization of function pointer HAL_I2C_MemRxCpltCallback() + 223:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) In case of transfer Error, HAL_I2C_ErrorCallback() function is executed and users can + 224:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** add their own code by customization of function pointer HAL_I2C_ErrorCallback() + 225:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 226:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 227:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** *** I2C HAL driver macros list *** + 228:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** ================================== + 229:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** [..] + 230:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** Below the list of most used macros in I2C HAL driver. + 231:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 232:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) __HAL_I2C_ENABLE: Enable the I2C peripheral + 233:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) __HAL_I2C_DISABLE: Disable the I2C peripheral + 234:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) __HAL_I2C_GENERATE_NACK: Generate a Non-Acknowledge I2C peripheral in Slave mode + 235:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) __HAL_I2C_GET_FLAG: Check whether the specified I2C flag is set or not + 236:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) __HAL_I2C_CLEAR_FLAG: Clear the specified I2C pending flag + 237:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) __HAL_I2C_ENABLE_IT: Enable the specified I2C interrupt + 238:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) __HAL_I2C_DISABLE_IT: Disable the specified I2C interrupt + 239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 240:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** *** Callback registration *** + 241:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** ============================================= + 242:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** [..] + 243:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** The compilation flag USE_HAL_I2C_REGISTER_CALLBACKS when set to 1 + 244:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** allows the user to configure dynamically the driver callbacks. + 245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** Use Functions HAL_I2C_RegisterCallback() or HAL_I2C_RegisterAddrCallback() + 246:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** to register an interrupt callback. + 247:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** [..] + 248:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** Function HAL_I2C_RegisterCallback() allows to register following callbacks: + 249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) MasterTxCpltCallback : callback for Master transmission end of transfer. + 250:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) MasterRxCpltCallback : callback for Master reception end of transfer. + 251:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) SlaveTxCpltCallback : callback for Slave transmission end of transfer. + 252:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) SlaveRxCpltCallback : callback for Slave reception end of transfer. + 253:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) ListenCpltCallback : callback for end of listen mode. + 254:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) MemTxCpltCallback : callback for Memory transmission end of transfer. + 255:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) MemRxCpltCallback : callback for Memory reception end of transfer. + 256:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) ErrorCallback : callback for error detection. + 257:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) AbortCpltCallback : callback for abort completion process. + 258:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) MspInitCallback : callback for Msp Init. + ARM GAS /tmp/ccE2rRGE.s page 6 + + + 259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) MspDeInitCallback : callback for Msp DeInit. + 260:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** This function takes as parameters the HAL peripheral handle, the Callback ID + 261:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** and a pointer to the user callback function. + 262:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** [..] + 263:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** For specific callback AddrCallback use dedicated register callbacks : HAL_I2C_RegisterAddrCall + 264:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** [..] + 265:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** Use function HAL_I2C_UnRegisterCallback to reset a callback to the default + 266:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** weak function. + 267:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_UnRegisterCallback takes as parameters the HAL peripheral handle, + 268:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** and the Callback ID. + 269:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** This function allows to reset following callbacks: + 270:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) MasterTxCpltCallback : callback for Master transmission end of transfer. + 271:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) MasterRxCpltCallback : callback for Master reception end of transfer. + 272:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) SlaveTxCpltCallback : callback for Slave transmission end of transfer. + 273:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) SlaveRxCpltCallback : callback for Slave reception end of transfer. + 274:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) ListenCpltCallback : callback for end of listen mode. + 275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) MemTxCpltCallback : callback for Memory transmission end of transfer. + 276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) MemRxCpltCallback : callback for Memory reception end of transfer. + 277:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) ErrorCallback : callback for error detection. + 278:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) AbortCpltCallback : callback for abort completion process. + 279:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) MspInitCallback : callback for Msp Init. + 280:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) MspDeInitCallback : callback for Msp DeInit. + 281:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** [..] + 282:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** For callback AddrCallback use dedicated register callbacks : HAL_I2C_UnRegisterAddrCallback(). + 283:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** [..] + 284:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** By default, after the HAL_I2C_Init() and when the state is HAL_I2C_STATE_RESET + 285:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** all callbacks are set to the corresponding weak functions: + 286:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** examples HAL_I2C_MasterTxCpltCallback(), HAL_I2C_MasterRxCpltCallback(). + 287:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** Exception done for MspInit and MspDeInit functions that are + 288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** reset to the legacy weak functions in the HAL_I2C_Init()/ HAL_I2C_DeInit() only when + 289:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** these callbacks are null (not registered beforehand). + 290:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** If MspInit or MspDeInit are not null, the HAL_I2C_Init()/ HAL_I2C_DeInit() + 291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** keep and use the user MspInit/MspDeInit callbacks (registered beforehand) whatever the state. + 292:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** [..] + 293:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** Callbacks can be registered/unregistered in HAL_I2C_STATE_READY state only. + 294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** Exception done MspInit/MspDeInit functions that can be registered/unregistered + 295:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** in HAL_I2C_STATE_READY or HAL_I2C_STATE_RESET state, + 296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** thus registered (user) MspInit/DeInit callbacks can be used during the Init/DeInit. + 297:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** Then, the user first registers the MspInit/MspDeInit user callbacks + 298:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** using HAL_I2C_RegisterCallback() before calling HAL_I2C_DeInit() + 299:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** or HAL_I2C_Init() function. + 300:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** [..] + 301:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** When the compilation flag USE_HAL_I2C_REGISTER_CALLBACKS is set to 0 or + 302:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** not defined, the callback registration feature is not available and all callbacks + 303:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** are set to the corresponding weak functions. + 304:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 305:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** [..] + 306:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (@) You can refer to the I2C HAL driver header file for more useful macros + 307:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 308:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** @endverbatim + 309:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** ****************************************************************************** + 310:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @attention + 311:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * + 312:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** *

    © Copyright (c) 2016 STMicroelectronics. + 313:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * All rights reserved.

    + 314:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * + 315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * This software component is licensed by ST under BSD 3-Clause license, + ARM GAS /tmp/ccE2rRGE.s page 7 + + + 316:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the "License"; You may not use this file except in compliance with the + 317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * License. You may obtain a copy of the License at: + 318:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * opensource.org/licenses/BSD-3-Clause + 319:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * + 320:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** ****************************************************************************** + 321:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ + 322:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Includes ------------------------------------------------------------------*/ + 324:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #include "stm32f3xx_hal.h" + 325:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 326:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** @addtogroup STM32F3xx_HAL_Driver + 327:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @{ + 328:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ + 329:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 330:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** @defgroup I2C I2C + 331:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief I2C HAL module driver + 332:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @{ + 333:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ + 334:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 335:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #ifdef HAL_I2C_MODULE_ENABLED + 336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 337:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Private typedef -----------------------------------------------------------*/ + 338:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Private define ------------------------------------------------------------*/ + 339:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 340:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** @defgroup I2C_Private_Define I2C Private Define + 341:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @{ + 342:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ + 343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #define TIMING_CLEAR_MASK (0xF0FFFFFFU) /*!< I2C TIMING clear register Mask */ + 344:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #define I2C_TIMEOUT_ADDR (10000U) /*!< 10 s */ + 345:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #define I2C_TIMEOUT_BUSY (25U) /*!< 25 ms */ + 346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #define I2C_TIMEOUT_DIR (25U) /*!< 25 ms */ + 347:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #define I2C_TIMEOUT_RXNE (25U) /*!< 25 ms */ + 348:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #define I2C_TIMEOUT_STOPF (25U) /*!< 25 ms */ + 349:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #define I2C_TIMEOUT_TC (25U) /*!< 25 ms */ + 350:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #define I2C_TIMEOUT_TCR (25U) /*!< 25 ms */ + 351:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #define I2C_TIMEOUT_TXIS (25U) /*!< 25 ms */ + 352:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #define I2C_TIMEOUT_FLAG (25U) /*!< 25 ms */ + 353:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 354:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #define MAX_NBYTE_SIZE 255U + 355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #define SLAVE_ADDR_SHIFT 7U + 356:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #define SLAVE_ADDR_MSK 0x06U + 357:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 358:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Private define for @ref PreviousState usage */ + 359:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #define I2C_STATE_MSK ((uint32_t)((uint32_t)((uint32_t)HAL_I2C_STATE_BUSY_TX | \ + 360:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (uint32_t)HAL_I2C_STATE_BUSY_RX) & \ + 361:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (uint32_t)(~((uint32_t)HAL_I2C_STATE_READY)))) + 362:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /*!< Mask State define, keep only RX and TX bits */ + 363:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #define I2C_STATE_NONE ((uint32_t)(HAL_I2C_MODE_NONE)) + 364:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /*!< Default Value */ + 365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #define I2C_STATE_MASTER_BUSY_TX ((uint32_t)(((uint32_t)HAL_I2C_STATE_BUSY_TX & I2C_STATE_MSK) | \ + 366:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (uint32_t)HAL_I2C_MODE_MASTER)) + 367:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /*!< Master Busy TX, combinaison of State LSB and Mode enum */ + 368:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #define I2C_STATE_MASTER_BUSY_RX ((uint32_t)(((uint32_t)HAL_I2C_STATE_BUSY_RX & I2C_STATE_MSK) | \ + 369:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (uint32_t)HAL_I2C_MODE_MASTER)) + 370:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /*!< Master Busy RX, combinaison of State LSB and Mode enum */ + 371:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #define I2C_STATE_SLAVE_BUSY_TX ((uint32_t)(((uint32_t)HAL_I2C_STATE_BUSY_TX & I2C_STATE_MSK) | \ + 372:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (uint32_t)HAL_I2C_MODE_SLAVE)) + ARM GAS /tmp/ccE2rRGE.s page 8 + + + 373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /*!< Slave Busy TX, combinaison of State LSB and Mode enum */ + 374:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #define I2C_STATE_SLAVE_BUSY_RX ((uint32_t)(((uint32_t)HAL_I2C_STATE_BUSY_RX & I2C_STATE_MSK) | \ + 375:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (uint32_t)HAL_I2C_MODE_SLAVE)) + 376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /*!< Slave Busy RX, combinaison of State LSB and Mode enum */ + 377:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #define I2C_STATE_MEM_BUSY_TX ((uint32_t)(((uint32_t)HAL_I2C_STATE_BUSY_TX & I2C_STATE_MSK) | \ + 378:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (uint32_t)HAL_I2C_MODE_MEM)) + 379:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /*!< Memory Busy TX, combinaison of State LSB and Mode enum */ + 380:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #define I2C_STATE_MEM_BUSY_RX ((uint32_t)(((uint32_t)HAL_I2C_STATE_BUSY_RX & I2C_STATE_MSK) | \ + 381:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (uint32_t)HAL_I2C_MODE_MEM)) + 382:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /*!< Memory Busy RX, combinaison of State LSB and Mode enum */ + 383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 384:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Private define to centralize the enable/disable of Interrupts */ + 386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #define I2C_XFER_TX_IT (uint16_t)(0x0001U) /*!< Bit field can be combinated with + 387:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** @ref I2C_XFER_LISTEN_IT */ + 388:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #define I2C_XFER_RX_IT (uint16_t)(0x0002U) /*!< Bit field can be combinated with + 389:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** @ref I2C_XFER_LISTEN_IT */ + 390:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #define I2C_XFER_LISTEN_IT (uint16_t)(0x8000U) /*!< Bit field can be combinated with @ref I2 + 391:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** and @ref I2C_XFER_RX_IT */ + 392:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 393:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #define I2C_XFER_ERROR_IT (uint16_t)(0x0010U) /*!< Bit definition to manage addition of glo + 394:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** and NACK treatment */ + 395:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #define I2C_XFER_CPLT_IT (uint16_t)(0x0020U) /*!< Bit definition to manage only STOP evene + 396:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #define I2C_XFER_RELOAD_IT (uint16_t)(0x0040U) /*!< Bit definition to manage only Reload of + 397:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 398:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Private define Sequential Transfer Options default/reset value */ + 399:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #define I2C_NO_OPTION_FRAME (0xFFFF0000U) + 400:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** + 401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @} + 402:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ + 403:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 404:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Private macro -------------------------------------------------------------*/ + 405:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Private variables ---------------------------------------------------------*/ + 406:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Private function prototypes -----------------------------------------------*/ + 407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 408:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** @defgroup I2C_Private_Functions I2C Private Functions + 409:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @{ + 410:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ + 411:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Private functions to handle DMA transfer */ + 412:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static void I2C_DMAMasterTransmitCplt(DMA_HandleTypeDef *hdma); + 413:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static void I2C_DMAMasterReceiveCplt(DMA_HandleTypeDef *hdma); + 414:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static void I2C_DMASlaveTransmitCplt(DMA_HandleTypeDef *hdma); + 415:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static void I2C_DMASlaveReceiveCplt(DMA_HandleTypeDef *hdma); + 416:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static void I2C_DMAError(DMA_HandleTypeDef *hdma); + 417:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static void I2C_DMAAbort(DMA_HandleTypeDef *hdma); + 418:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 419:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Private functions to handle IT transfer */ + 420:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static void I2C_ITAddrCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags); + 421:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static void I2C_ITMasterSeqCplt(I2C_HandleTypeDef *hi2c); + 422:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static void I2C_ITSlaveSeqCplt(I2C_HandleTypeDef *hi2c); + 423:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static void I2C_ITMasterCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags); + 424:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static void I2C_ITSlaveCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags); + 425:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static void I2C_ITListenCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags); + 426:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static void I2C_ITError(I2C_HandleTypeDef *hi2c, uint32_t ErrorCode); + 427:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 428:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Private functions to handle IT transfer */ + 429:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static HAL_StatusTypeDef I2C_RequestMemoryWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, + ARM GAS /tmp/ccE2rRGE.s page 9 + + + 430:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint16_t MemAddress, uint16_t MemAddSize, uint32_t + 431:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t Tickstart); + 432:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static HAL_StatusTypeDef I2C_RequestMemoryRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, + 433:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint16_t MemAddress, uint16_t MemAddSize, uint32_t T + 434:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t Tickstart); + 435:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 436:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Private functions for I2C transfer IRQ handler */ + 437:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static HAL_StatusTypeDef I2C_Master_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, + 438:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t ITSources); + 439:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static HAL_StatusTypeDef I2C_Slave_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, + 440:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t ITSources); + 441:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static HAL_StatusTypeDef I2C_Master_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, + 442:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t ITSources); + 443:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static HAL_StatusTypeDef I2C_Slave_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, + 444:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t ITSources); + 445:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 446:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Private functions to handle flags during polling transfer */ + 447:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, FlagSta + 448:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t Timeout, uint32_t Tickstart); + 449:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static HAL_StatusTypeDef I2C_WaitOnTXISFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, + 450:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t Tickstart); + 451:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static HAL_StatusTypeDef I2C_WaitOnRXNEFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, + 452:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t Tickstart); + 453:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static HAL_StatusTypeDef I2C_WaitOnSTOPFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, + 454:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t Tickstart); + 455:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static HAL_StatusTypeDef I2C_IsAcknowledgeFailed(I2C_HandleTypeDef *hi2c, uint32_t Timeout, + 456:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t Tickstart); + 457:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 458:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Private functions to centralize the enable/disable of Interrupts */ + 459:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static void I2C_Enable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest); + 460:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static void I2C_Disable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest); + 461:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 462:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Private function to treat different error callback */ + 463:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static void I2C_TreatErrorCallback(I2C_HandleTypeDef *hi2c); + 464:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 465:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Private function to flush TXDR register */ + 466:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static void I2C_Flush_TXDR(I2C_HandleTypeDef *hi2c); + 467:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 468:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Private function to handle start, restart or stop a transfer */ + 469:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static void I2C_TransferConfig(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t Size, uint32_t + 470:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t Request); + 471:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 472:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Private function to Convert Specific options */ + 473:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static void I2C_ConvertOtherXferOptions(I2C_HandleTypeDef *hi2c); + 474:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** + 475:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @} + 476:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ + 477:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 478:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Exported functions --------------------------------------------------------*/ + 479:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 480:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** @defgroup I2C_Exported_Functions I2C Exported Functions + 481:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @{ + 482:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ + 483:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 484:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** @defgroup I2C_Exported_Functions_Group1 Initialization and de-initialization functions + 485:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Initialization and Configuration functions + 486:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * + ARM GAS /tmp/ccE2rRGE.s page 10 + + + 487:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** @verbatim + 488:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** =============================================================================== + 489:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** ##### Initialization and de-initialization functions ##### + 490:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** =============================================================================== + 491:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** [..] This subsection provides a set of functions allowing to initialize and + 492:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** deinitialize the I2Cx peripheral: + 493:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 494:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) User must Implement HAL_I2C_MspInit() function in which he configures + 495:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** all related peripherals resources (CLOCK, GPIO, DMA, IT and NVIC ). + 496:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 497:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) Call the function HAL_I2C_Init() to configure the selected device with + 498:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** the selected configuration: + 499:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) Clock Timing + 500:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) Own Address 1 + 501:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) Addressing mode (Master, Slave) + 502:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) Dual Addressing mode + 503:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) Own Address 2 + 504:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) Own Address 2 Mask + 505:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) General call mode + 506:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) Nostretch mode + 507:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 508:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (+) Call the function HAL_I2C_DeInit() to restore the default configuration + 509:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** of the selected I2Cx peripheral. + 510:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 511:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** @endverbatim + 512:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @{ + 513:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ + 514:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 515:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** + 516:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Initializes the I2C according to the specified parameters + 517:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * in the I2C_InitTypeDef and initialize the associated handle. + 518:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + 519:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. + 520:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status + 521:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ + 522:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef HAL_I2C_Init(I2C_HandleTypeDef *hi2c) + 523:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 524:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Check the I2C handle allocation */ + 525:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c == NULL) + 526:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 527:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 528:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 529:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 530:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Check the parameters */ + 531:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance)); + 532:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** assert_param(IS_I2C_OWN_ADDRESS1(hi2c->Init.OwnAddress1)); + 533:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** assert_param(IS_I2C_ADDRESSING_MODE(hi2c->Init.AddressingMode)); + 534:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** assert_param(IS_I2C_DUAL_ADDRESS(hi2c->Init.DualAddressMode)); + 535:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** assert_param(IS_I2C_OWN_ADDRESS2(hi2c->Init.OwnAddress2)); + 536:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** assert_param(IS_I2C_OWN_ADDRESS2_MASK(hi2c->Init.OwnAddress2Masks)); + 537:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** assert_param(IS_I2C_GENERAL_CALL(hi2c->Init.GeneralCallMode)); + 538:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** assert_param(IS_I2C_NO_STRETCH(hi2c->Init.NoStretchMode)); + 539:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 540:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_RESET) + 541:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 542:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Allocate lock resource and initialize it */ + 543:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Lock = HAL_UNLOCKED; + ARM GAS /tmp/ccE2rRGE.s page 11 + + + 544:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 545:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) + 546:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Init the I2C Callback settings */ + 547:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->MasterTxCpltCallback = HAL_I2C_MasterTxCpltCallback; /* Legacy weak MasterTxCpltCallback + 548:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->MasterRxCpltCallback = HAL_I2C_MasterRxCpltCallback; /* Legacy weak MasterRxCpltCallback + 549:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->SlaveTxCpltCallback = HAL_I2C_SlaveTxCpltCallback; /* Legacy weak SlaveTxCpltCallback + 550:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->SlaveRxCpltCallback = HAL_I2C_SlaveRxCpltCallback; /* Legacy weak SlaveRxCpltCallback + 551:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ListenCpltCallback = HAL_I2C_ListenCpltCallback; /* Legacy weak ListenCpltCallback + 552:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->MemTxCpltCallback = HAL_I2C_MemTxCpltCallback; /* Legacy weak MemTxCpltCallback + 553:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->MemRxCpltCallback = HAL_I2C_MemRxCpltCallback; /* Legacy weak MemRxCpltCallback + 554:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCallback = HAL_I2C_ErrorCallback; /* Legacy weak ErrorCallback + 555:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->AbortCpltCallback = HAL_I2C_AbortCpltCallback; /* Legacy weak AbortCpltCallback + 556:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->AddrCallback = HAL_I2C_AddrCallback; /* Legacy weak AddrCallback + 557:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 558:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->MspInitCallback == NULL) + 559:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 560:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->MspInitCallback = HAL_I2C_MspInit; /* Legacy weak MspInit */ + 561:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 562:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 563:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Init the low level hardware : GPIO, CLOCK, CORTEX...etc */ + 564:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->MspInitCallback(hi2c); + 565:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #else + 566:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Init the low level hardware : GPIO, CLOCK, CORTEX...etc */ + 567:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_MspInit(hi2c); + 568:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + 569:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 570:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 571:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_BUSY; + 572:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 573:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable the selected I2C peripheral */ + 574:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_DISABLE(hi2c); + 575:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 576:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /*---------------------------- I2Cx TIMINGR Configuration ------------------*/ + 577:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Configure I2Cx: Frequency range */ + 578:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->TIMINGR = hi2c->Init.Timing & TIMING_CLEAR_MASK; + 579:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 580:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /*---------------------------- I2Cx OAR1 Configuration ---------------------*/ + 581:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable Own Address1 before set the Own Address1 configuration */ + 582:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->OAR1 &= ~I2C_OAR1_OA1EN; + 583:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 584:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Configure I2Cx: Own Address1 and ack own address1 mode */ + 585:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_7BIT) + 586:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 587:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->OAR1 = (I2C_OAR1_OA1EN | hi2c->Init.OwnAddress1); + 588:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 589:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else /* I2C_ADDRESSINGMODE_10BIT */ + 590:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 591:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->OAR1 = (I2C_OAR1_OA1EN | I2C_OAR1_OA1MODE | hi2c->Init.OwnAddress1); + 592:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 593:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 594:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /*---------------------------- I2Cx CR2 Configuration ----------------------*/ + 595:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Configure I2Cx: Addressing Master mode */ + 596:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_10BIT) + 597:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 598:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR2 = (I2C_CR2_ADD10); + 599:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 600:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable the AUTOEND by default, and enable NACK (should be disable only during Slave process */ + ARM GAS /tmp/ccE2rRGE.s page 12 + + + 601:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR2 |= (I2C_CR2_AUTOEND | I2C_CR2_NACK); + 602:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 603:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /*---------------------------- I2Cx OAR2 Configuration ---------------------*/ + 604:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable Own Address2 before set the Own Address2 configuration */ + 605:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->OAR2 &= ~I2C_DUALADDRESS_ENABLE; + 606:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 607:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Configure I2Cx: Dual mode and Own Address2 */ + 608:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->OAR2 = (hi2c->Init.DualAddressMode | hi2c->Init.OwnAddress2 | \ + 609:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (hi2c->Init.OwnAddress2Masks << 8)); + 610:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 611:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /*---------------------------- I2Cx CR1 Configuration ----------------------*/ + 612:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Configure I2Cx: Generalcall and NoStretch mode */ + 613:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR1 = (hi2c->Init.GeneralCallMode | hi2c->Init.NoStretchMode); + 614:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 615:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable the selected I2C peripheral */ + 616:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_ENABLE(hi2c); + 617:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 618:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 619:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; + 620:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_NONE; + 621:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 622:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 623:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_OK; + 624:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 625:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 626:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** + 627:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief DeInitialize the I2C peripheral. + 628:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + 629:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. + 630:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status + 631:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ + 632:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef HAL_I2C_DeInit(I2C_HandleTypeDef *hi2c) + 633:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 634:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Check the I2C handle allocation */ + 635:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c == NULL) + 636:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 637:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 638:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 639:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 640:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Check the parameters */ + 641:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance)); + 642:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 643:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_BUSY; + 644:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 645:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable the I2C Peripheral Clock */ + 646:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_DISABLE(hi2c); + 647:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 648:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) + 649:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->MspDeInitCallback == NULL) + 650:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 651:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->MspDeInitCallback = HAL_I2C_MspDeInit; /* Legacy weak MspDeInit */ + 652:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 653:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 654:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ + 655:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->MspDeInitCallback(hi2c); + 656:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #else + 657:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* DeInit the low level hardware: GPIO, CLOCK, NVIC */ + ARM GAS /tmp/ccE2rRGE.s page 13 + + + 658:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_MspDeInit(hi2c); + 659:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + 660:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 661:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 662:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_RESET; + 663:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_NONE; + 664:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 665:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 666:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Release Lock */ + 667:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); + 668:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 669:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_OK; + 670:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 671:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 672:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** + 673:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Initialize the I2C MSP. + 674:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + 675:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. + 676:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval None + 677:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ + 678:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __weak void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c) + 679:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 680:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prevent unused argument(s) compilation warning */ + 681:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** UNUSED(hi2c); + 682:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 683:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* NOTE : This function should not be modified, when the callback is needed, + 684:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** the HAL_I2C_MspInit could be implemented in the user file + 685:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ + 686:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 687:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 688:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** + 689:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief DeInitialize the I2C MSP. + 690:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + 691:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. + 692:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval None + 693:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ + 694:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __weak void HAL_I2C_MspDeInit(I2C_HandleTypeDef *hi2c) + 695:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 696:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prevent unused argument(s) compilation warning */ + 697:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** UNUSED(hi2c); + 698:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 699:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* NOTE : This function should not be modified, when the callback is needed, + 700:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** the HAL_I2C_MspDeInit could be implemented in the user file + 701:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ + 702:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 703:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 704:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) + 705:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** + 706:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Register a User I2C Callback + 707:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * To be used instead of the weak predefined callback + 708:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + 709:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. + 710:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param CallbackID ID of the callback to be registered + 711:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * This parameter can be one of the following values: + 712:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @arg @ref HAL_I2C_MASTER_TX_COMPLETE_CB_ID Master Tx Transfer completed callback ID + 713:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @arg @ref HAL_I2C_MASTER_RX_COMPLETE_CB_ID Master Rx Transfer completed callback ID + 714:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @arg @ref HAL_I2C_SLAVE_TX_COMPLETE_CB_ID Slave Tx Transfer completed callback ID + ARM GAS /tmp/ccE2rRGE.s page 14 + + + 715:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @arg @ref HAL_I2C_SLAVE_RX_COMPLETE_CB_ID Slave Rx Transfer completed callback ID + 716:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @arg @ref HAL_I2C_LISTEN_COMPLETE_CB_ID Listen Complete callback ID + 717:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @arg @ref HAL_I2C_MEM_TX_COMPLETE_CB_ID Memory Tx Transfer callback ID + 718:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @arg @ref HAL_I2C_MEM_RX_COMPLETE_CB_ID Memory Rx Transfer completed callback ID + 719:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @arg @ref HAL_I2C_ERROR_CB_ID Error callback ID + 720:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @arg @ref HAL_I2C_ABORT_CB_ID Abort callback ID + 721:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @arg @ref HAL_I2C_MSPINIT_CB_ID MspInit callback ID + 722:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @arg @ref HAL_I2C_MSPDEINIT_CB_ID MspDeInit callback ID + 723:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param pCallback pointer to the Callback function + 724:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status + 725:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ + 726:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef HAL_I2C_RegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_CallbackIDTypeDef Callb + 727:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** pI2C_CallbackTypeDef pCallback) + 728:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 729:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef status = HAL_OK; + 730:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 731:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (pCallback == NULL) + 732:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 733:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update the error code */ + 734:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; + 735:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 736:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 737:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 738:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process locked */ + 739:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_LOCK(hi2c); + 740:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 741:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (HAL_I2C_STATE_READY == hi2c->State) + 742:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 743:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** switch (CallbackID) + 744:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 745:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** case HAL_I2C_MASTER_TX_COMPLETE_CB_ID : + 746:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->MasterTxCpltCallback = pCallback; + 747:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** break; + 748:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 749:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** case HAL_I2C_MASTER_RX_COMPLETE_CB_ID : + 750:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->MasterRxCpltCallback = pCallback; + 751:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** break; + 752:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 753:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** case HAL_I2C_SLAVE_TX_COMPLETE_CB_ID : + 754:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->SlaveTxCpltCallback = pCallback; + 755:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** break; + 756:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 757:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** case HAL_I2C_SLAVE_RX_COMPLETE_CB_ID : + 758:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->SlaveRxCpltCallback = pCallback; + 759:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** break; + 760:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 761:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** case HAL_I2C_LISTEN_COMPLETE_CB_ID : + 762:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ListenCpltCallback = pCallback; + 763:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** break; + 764:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 765:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** case HAL_I2C_MEM_TX_COMPLETE_CB_ID : + 766:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->MemTxCpltCallback = pCallback; + 767:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** break; + 768:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 769:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** case HAL_I2C_MEM_RX_COMPLETE_CB_ID : + 770:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->MemRxCpltCallback = pCallback; + 771:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** break; + ARM GAS /tmp/ccE2rRGE.s page 15 + + + 772:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 773:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** case HAL_I2C_ERROR_CB_ID : + 774:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCallback = pCallback; + 775:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** break; + 776:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 777:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** case HAL_I2C_ABORT_CB_ID : + 778:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->AbortCpltCallback = pCallback; + 779:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** break; + 780:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 781:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** case HAL_I2C_MSPINIT_CB_ID : + 782:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->MspInitCallback = pCallback; + 783:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** break; + 784:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 785:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** case HAL_I2C_MSPDEINIT_CB_ID : + 786:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->MspDeInitCallback = pCallback; + 787:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** break; + 788:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 789:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** default : + 790:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update the error code */ + 791:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; + 792:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 793:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Return error status */ + 794:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** status = HAL_ERROR; + 795:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** break; + 796:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 797:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 798:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else if (HAL_I2C_STATE_RESET == hi2c->State) + 799:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 800:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** switch (CallbackID) + 801:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 802:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** case HAL_I2C_MSPINIT_CB_ID : + 803:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->MspInitCallback = pCallback; + 804:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** break; + 805:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 806:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** case HAL_I2C_MSPDEINIT_CB_ID : + 807:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->MspDeInitCallback = pCallback; + 808:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** break; + 809:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 810:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** default : + 811:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update the error code */ + 812:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; + 813:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 814:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Return error status */ + 815:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** status = HAL_ERROR; + 816:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** break; + 817:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 818:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 819:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else + 820:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 821:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update the error code */ + 822:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; + 823:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 824:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Return error status */ + 825:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** status = HAL_ERROR; + 826:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 827:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 828:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Release Lock */ + ARM GAS /tmp/ccE2rRGE.s page 16 + + + 829:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); + 830:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return status; + 831:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 832:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 833:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** + 834:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Unregister an I2C Callback + 835:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * I2C callback is redirected to the weak predefined callback + 836:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + 837:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. + 838:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param CallbackID ID of the callback to be unregistered + 839:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * This parameter can be one of the following values: + 840:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * This parameter can be one of the following values: + 841:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @arg @ref HAL_I2C_MASTER_TX_COMPLETE_CB_ID Master Tx Transfer completed callback ID + 842:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @arg @ref HAL_I2C_MASTER_RX_COMPLETE_CB_ID Master Rx Transfer completed callback ID + 843:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @arg @ref HAL_I2C_SLAVE_TX_COMPLETE_CB_ID Slave Tx Transfer completed callback ID + 844:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @arg @ref HAL_I2C_SLAVE_RX_COMPLETE_CB_ID Slave Rx Transfer completed callback ID + 845:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @arg @ref HAL_I2C_LISTEN_COMPLETE_CB_ID Listen Complete callback ID + 846:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @arg @ref HAL_I2C_MEM_TX_COMPLETE_CB_ID Memory Tx Transfer callback ID + 847:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @arg @ref HAL_I2C_MEM_RX_COMPLETE_CB_ID Memory Rx Transfer completed callback ID + 848:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @arg @ref HAL_I2C_ERROR_CB_ID Error callback ID + 849:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @arg @ref HAL_I2C_ABORT_CB_ID Abort callback ID + 850:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @arg @ref HAL_I2C_MSPINIT_CB_ID MspInit callback ID + 851:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @arg @ref HAL_I2C_MSPDEINIT_CB_ID MspDeInit callback ID + 852:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status + 853:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ + 854:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef HAL_I2C_UnRegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_CallbackIDTypeDef Cal + 855:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 856:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef status = HAL_OK; + 857:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 858:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process locked */ + 859:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_LOCK(hi2c); + 860:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 861:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (HAL_I2C_STATE_READY == hi2c->State) + 862:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 863:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** switch (CallbackID) + 864:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 865:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** case HAL_I2C_MASTER_TX_COMPLETE_CB_ID : + 866:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->MasterTxCpltCallback = HAL_I2C_MasterTxCpltCallback; /* Legacy weak MasterTxCpltCallb + 867:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** break; + 868:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 869:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** case HAL_I2C_MASTER_RX_COMPLETE_CB_ID : + 870:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->MasterRxCpltCallback = HAL_I2C_MasterRxCpltCallback; /* Legacy weak MasterRxCpltCallb + 871:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** break; + 872:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 873:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** case HAL_I2C_SLAVE_TX_COMPLETE_CB_ID : + 874:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->SlaveTxCpltCallback = HAL_I2C_SlaveTxCpltCallback; /* Legacy weak SlaveTxCpltCallba + 875:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** break; + 876:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 877:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** case HAL_I2C_SLAVE_RX_COMPLETE_CB_ID : + 878:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->SlaveRxCpltCallback = HAL_I2C_SlaveRxCpltCallback; /* Legacy weak SlaveRxCpltCallba + 879:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** break; + 880:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 881:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** case HAL_I2C_LISTEN_COMPLETE_CB_ID : + 882:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ListenCpltCallback = HAL_I2C_ListenCpltCallback; /* Legacy weak ListenCpltCallbac + 883:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** break; + 884:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 885:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** case HAL_I2C_MEM_TX_COMPLETE_CB_ID : + ARM GAS /tmp/ccE2rRGE.s page 17 + + + 886:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->MemTxCpltCallback = HAL_I2C_MemTxCpltCallback; /* Legacy weak MemTxCpltCallback + 887:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** break; + 888:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 889:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** case HAL_I2C_MEM_RX_COMPLETE_CB_ID : + 890:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->MemRxCpltCallback = HAL_I2C_MemRxCpltCallback; /* Legacy weak MemRxCpltCallback + 891:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** break; + 892:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 893:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** case HAL_I2C_ERROR_CB_ID : + 894:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCallback = HAL_I2C_ErrorCallback; /* Legacy weak ErrorCallback + 895:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** break; + 896:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 897:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** case HAL_I2C_ABORT_CB_ID : + 898:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->AbortCpltCallback = HAL_I2C_AbortCpltCallback; /* Legacy weak AbortCpltCallback + 899:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** break; + 900:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 901:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** case HAL_I2C_MSPINIT_CB_ID : + 902:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->MspInitCallback = HAL_I2C_MspInit; /* Legacy weak MspInit + 903:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** break; + 904:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 905:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** case HAL_I2C_MSPDEINIT_CB_ID : + 906:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->MspDeInitCallback = HAL_I2C_MspDeInit; /* Legacy weak MspDeInit + 907:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** break; + 908:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 909:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** default : + 910:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update the error code */ + 911:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; + 912:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 913:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Return error status */ + 914:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** status = HAL_ERROR; + 915:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** break; + 916:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 917:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 918:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else if (HAL_I2C_STATE_RESET == hi2c->State) + 919:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 920:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** switch (CallbackID) + 921:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 922:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** case HAL_I2C_MSPINIT_CB_ID : + 923:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->MspInitCallback = HAL_I2C_MspInit; /* Legacy weak MspInit + 924:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** break; + 925:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 926:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** case HAL_I2C_MSPDEINIT_CB_ID : + 927:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->MspDeInitCallback = HAL_I2C_MspDeInit; /* Legacy weak MspDeInit + 928:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** break; + 929:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 930:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** default : + 931:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update the error code */ + 932:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; + 933:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 934:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Return error status */ + 935:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** status = HAL_ERROR; + 936:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** break; + 937:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 938:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 939:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else + 940:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 941:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update the error code */ + 942:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; + ARM GAS /tmp/ccE2rRGE.s page 18 + + + 943:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 944:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Return error status */ + 945:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** status = HAL_ERROR; + 946:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 947:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 948:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Release Lock */ + 949:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); + 950:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return status; + 951:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 952:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 953:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** + 954:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Register the Slave Address Match I2C Callback + 955:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * To be used instead of the weak HAL_I2C_AddrCallback() predefined callback + 956:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + 957:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. + 958:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param pCallback pointer to the Address Match Callback function + 959:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status + 960:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ + 961:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef HAL_I2C_RegisterAddrCallback(I2C_HandleTypeDef *hi2c, pI2C_AddrCallbackTypeDef pC + 962:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 963:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef status = HAL_OK; + 964:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 965:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (pCallback == NULL) + 966:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 967:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update the error code */ + 968:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; + 969:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 970:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 971:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 972:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process locked */ + 973:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_LOCK(hi2c); + 974:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 975:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (HAL_I2C_STATE_READY == hi2c->State) + 976:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 977:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->AddrCallback = pCallback; + 978:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 979:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else + 980:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 981:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update the error code */ + 982:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; + 983:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 984:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Return error status */ + 985:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** status = HAL_ERROR; + 986:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 987:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 988:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Release Lock */ + 989:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); + 990:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return status; + 991:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 992:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 993:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** + 994:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief UnRegister the Slave Address Match I2C Callback + 995:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * Info Ready I2C Callback is redirected to the weak HAL_I2C_AddrCallback() predefined cal + 996:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + 997:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. + 998:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status + 999:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ + ARM GAS /tmp/ccE2rRGE.s page 19 + + +1000:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef HAL_I2C_UnRegisterAddrCallback(I2C_HandleTypeDef *hi2c) +1001:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1002:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef status = HAL_OK; +1003:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1004:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process locked */ +1005:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_LOCK(hi2c); +1006:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1007:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (HAL_I2C_STATE_READY == hi2c->State) +1008:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1009:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->AddrCallback = HAL_I2C_AddrCallback; /* Legacy weak AddrCallback */ +1010:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1011:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +1012:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1013:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update the error code */ +1014:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_INVALID_CALLBACK; +1015:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1016:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Return error status */ +1017:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** status = HAL_ERROR; +1018:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1019:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1020:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Release Lock */ +1021:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +1022:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return status; +1023:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1024:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1025:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ +1026:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1027:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +1028:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @} +1029:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +1030:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1031:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** @defgroup I2C_Exported_Functions_Group2 Input and Output operation functions +1032:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Data transfers functions +1033:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * +1034:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** @verbatim +1035:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** =============================================================================== +1036:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** ##### IO operation functions ##### +1037:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** =============================================================================== +1038:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** [..] +1039:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** This subsection provides a set of functions allowing to manage the I2C data +1040:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** transfers. +1041:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1042:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (#) There are two modes of transfer: +1043:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) Blocking mode : The communication is performed in the polling mode. +1044:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** The status of all data processing is returned by the same function +1045:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** after finishing transfer. +1046:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) No-Blocking mode : The communication is performed using Interrupts +1047:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** or DMA. These functions return the status of the transfer startup. +1048:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** The end of the data processing will be indicated through the +1049:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** dedicated I2C IRQ when using Interrupt mode or the DMA IRQ when +1050:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** using DMA mode. +1051:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1052:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (#) Blocking mode functions are : +1053:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) HAL_I2C_Master_Transmit() +1054:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) HAL_I2C_Master_Receive() +1055:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) HAL_I2C_Slave_Transmit() +1056:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) HAL_I2C_Slave_Receive() + ARM GAS /tmp/ccE2rRGE.s page 20 + + +1057:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) HAL_I2C_Mem_Write() +1058:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) HAL_I2C_Mem_Read() +1059:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) HAL_I2C_IsDeviceReady() +1060:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1061:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (#) No-Blocking mode functions with Interrupt are : +1062:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) HAL_I2C_Master_Transmit_IT() +1063:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) HAL_I2C_Master_Receive_IT() +1064:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) HAL_I2C_Slave_Transmit_IT() +1065:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) HAL_I2C_Slave_Receive_IT() +1066:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) HAL_I2C_Mem_Write_IT() +1067:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) HAL_I2C_Mem_Read_IT() +1068:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) HAL_I2C_Master_Seq_Transmit_IT() +1069:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) HAL_I2C_Master_Seq_Receive_IT() +1070:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) HAL_I2C_Slave_Seq_Transmit_IT() +1071:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) HAL_I2C_Slave_Seq_Receive_IT() +1072:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) HAL_I2C_EnableListen_IT() +1073:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) HAL_I2C_DisableListen_IT() +1074:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) HAL_I2C_Master_Abort_IT() +1075:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1076:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (#) No-Blocking mode functions with DMA are : +1077:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) HAL_I2C_Master_Transmit_DMA() +1078:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) HAL_I2C_Master_Receive_DMA() +1079:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) HAL_I2C_Slave_Transmit_DMA() +1080:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) HAL_I2C_Slave_Receive_DMA() +1081:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) HAL_I2C_Mem_Write_DMA() +1082:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) HAL_I2C_Mem_Read_DMA() +1083:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) HAL_I2C_Master_Seq_Transmit_DMA() +1084:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) HAL_I2C_Master_Seq_Receive_DMA() +1085:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) HAL_I2C_Slave_Seq_Transmit_DMA() +1086:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) HAL_I2C_Slave_Seq_Receive_DMA() +1087:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1088:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (#) A set of Transfer Complete Callbacks are provided in non Blocking mode: +1089:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) HAL_I2C_MasterTxCpltCallback() +1090:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) HAL_I2C_MasterRxCpltCallback() +1091:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) HAL_I2C_SlaveTxCpltCallback() +1092:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) HAL_I2C_SlaveRxCpltCallback() +1093:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) HAL_I2C_MemTxCpltCallback() +1094:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) HAL_I2C_MemRxCpltCallback() +1095:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) HAL_I2C_AddrCallback() +1096:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) HAL_I2C_ListenCpltCallback() +1097:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) HAL_I2C_ErrorCallback() +1098:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (++) HAL_I2C_AbortCpltCallback() +1099:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1100:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** @endverbatim +1101:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @{ +1102:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +1103:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +1105:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Transmits in master mode an amount of data in blocking mode. +1106:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +1107:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +1108:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param DevAddress Target device address: The device 7 bits address value +1109:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * in datasheet must be shifted to the left before calling the interface +1110:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param pData Pointer to data buffer +1111:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Size Amount of data to be sent +1112:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Timeout Timeout duration +1113:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status + ARM GAS /tmp/ccE2rRGE.s page 21 + + +1114:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +1115:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pD +1116:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint16_t Size, uint32_t Timeout) +1117:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1118:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tickstart; +1119:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1120:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_READY) +1121:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1122:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Locked */ +1123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_LOCK(hi2c); +1124:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1125:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Init tickstart for timeout management*/ +1126:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** tickstart = HAL_GetTick(); +1127:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1128:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY, tickstart) != HAL_OK +1129:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1130:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +1131:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1132:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1133:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_BUSY_TX; +1134:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MASTER; +1135:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; +1136:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1137:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prepare transfer parameters */ +1138:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->pBuffPtr = pData; +1139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; +1140:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = NULL; +1141:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1142:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Send Slave Address */ +1143:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */ +1144:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferCount > MAX_NBYTE_SIZE) +1145:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1146:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = MAX_NBYTE_SIZE; +1147:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, +1148:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_GENERATE_START_WRITE); +1149:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1150:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +1151:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; +1153:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, +1154:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_GENERATE_START_WRITE); +1155:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1157:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** while (hi2c->XferCount > 0U) +1158:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1159:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Wait until TXIS flag is set */ +1160:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) +1161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1162:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +1163:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1164:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Write data to TXDR */ +1165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->TXDR = *hi2c->pBuffPtr; +1166:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Increment Buffer pointer */ +1168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->pBuffPtr++; +1169:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount--; + ARM GAS /tmp/ccE2rRGE.s page 22 + + +1171:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize--; +1172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1173:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((hi2c->XferCount != 0U) && (hi2c->XferSize == 0U)) +1174:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1175:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Wait until TCR flag is set */ +1176:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, Timeout, tickstart) != HAL_OK) +1177:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1178:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +1179:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1180:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1181:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferCount > MAX_NBYTE_SIZE) +1182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1183:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = MAX_NBYTE_SIZE; +1184:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, +1185:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_NO_STARTSTOP); +1186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1187:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +1188:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; +1190:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, +1191:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_NO_STARTSTOP); +1192:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1193:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1194:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1195:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1196:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */ +1197:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Wait until STOPF flag is set */ +1198:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) +1199:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1200:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +1201:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1203:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear STOP Flag */ +1204:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF); +1205:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1206:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear Configuration Register 2 */ +1207:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_RESET_CR2(hi2c); +1208:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1209:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; +1210:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; +1211:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1212:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +1213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +1214:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1215:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_OK; +1216:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1217:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +1218:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1219:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_BUSY; +1220:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1221:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1222:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1223:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +1224:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Receives in master mode an amount of data in blocking mode. +1225:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +1226:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +1227:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param DevAddress Target device address: The device 7 bits address value + ARM GAS /tmp/ccE2rRGE.s page 23 + + +1228:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * in datasheet must be shifted to the left before calling the interface +1229:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param pData Pointer to data buffer +1230:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Size Amount of data to be sent +1231:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Timeout Timeout duration +1232:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status +1233:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +1234:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pDa +1235:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint16_t Size, uint32_t Timeout) +1236:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1237:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tickstart; +1238:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_READY) +1240:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1241:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Locked */ +1242:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_LOCK(hi2c); +1243:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1244:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Init tickstart for timeout management*/ +1245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** tickstart = HAL_GetTick(); +1246:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1247:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY, tickstart) != HAL_OK +1248:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +1250:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1251:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1252:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_BUSY_RX; +1253:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MASTER; +1254:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; +1255:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1256:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prepare transfer parameters */ +1257:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->pBuffPtr = pData; +1258:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; +1259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = NULL; +1260:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1261:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Send Slave Address */ +1262:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */ +1263:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferCount > MAX_NBYTE_SIZE) +1264:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1265:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = MAX_NBYTE_SIZE; +1266:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, +1267:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_GENERATE_START_READ); +1268:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1269:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +1270:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1271:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; +1272:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, +1273:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_GENERATE_START_READ); +1274:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** while (hi2c->XferCount > 0U) +1277:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1278:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Wait until RXNE flag is set */ +1279:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) +1280:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1281:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +1282:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1283:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1284:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Read data from RXDR */ + ARM GAS /tmp/ccE2rRGE.s page 24 + + +1285:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR; +1286:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1287:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Increment Buffer pointer */ +1288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->pBuffPtr++; +1289:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1290:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize--; +1291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount--; +1292:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1293:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((hi2c->XferCount != 0U) && (hi2c->XferSize == 0U)) +1294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1295:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Wait until TCR flag is set */ +1296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, Timeout, tickstart) != HAL_OK) +1297:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1298:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +1299:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1300:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1301:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferCount > MAX_NBYTE_SIZE) +1302:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1303:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = MAX_NBYTE_SIZE; +1304:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, +1305:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_NO_STARTSTOP); +1306:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1307:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +1308:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1309:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; +1310:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, +1311:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_NO_STARTSTOP); +1312:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1313:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1314:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1316:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */ +1317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Wait until STOPF flag is set */ +1318:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) +1319:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1320:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +1321:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1322:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear STOP Flag */ +1324:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF); +1325:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1326:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear Configuration Register 2 */ +1327:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_RESET_CR2(hi2c); +1328:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1329:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; +1330:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; +1331:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1332:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +1333:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +1334:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1335:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_OK; +1336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1337:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +1338:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1339:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_BUSY; +1340:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1341:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + ARM GAS /tmp/ccE2rRGE.s page 25 + + +1342:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +1344:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Transmits in slave mode an amount of data in blocking mode. +1345:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +1346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +1347:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param pData Pointer to data buffer +1348:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Size Amount of data to be sent +1349:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Timeout Timeout duration +1350:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status +1351:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +1352:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef HAL_I2C_Slave_Transmit(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, +1353:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t Timeout) +1354:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tickstart; +1356:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1357:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_READY) +1358:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1359:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((pData == NULL) || (Size == 0U)) +1360:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1361:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM; +1362:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +1363:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1364:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Locked */ +1365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_LOCK(hi2c); +1366:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1367:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Init tickstart for timeout management*/ +1368:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** tickstart = HAL_GetTick(); +1369:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1370:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_BUSY_TX; +1371:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_SLAVE; +1372:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; +1373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1374:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prepare transfer parameters */ +1375:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->pBuffPtr = pData; +1376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; +1377:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = NULL; +1378:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1379:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable Address Acknowledge */ +1380:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR2 &= ~I2C_CR2_NACK; +1381:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1382:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Wait until ADDR flag is set */ +1383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout, tickstart) != HAL_OK) +1384:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable Address Acknowledge */ +1386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR2 |= I2C_CR2_NACK; +1387:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +1388:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1389:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1390:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear ADDR flag */ +1391:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR); +1392:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1393:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* If 10bit addressing mode is selected */ +1394:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_10BIT) +1395:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1396:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Wait until ADDR flag is set */ +1397:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout, tickstart) != HAL_OK) +1398:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + ARM GAS /tmp/ccE2rRGE.s page 26 + + +1399:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable Address Acknowledge */ +1400:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR2 |= I2C_CR2_NACK; +1401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +1402:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1403:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1404:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear ADDR flag */ +1405:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR); +1406:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1408:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Wait until DIR flag is set Transmitter mode */ +1409:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_DIR, RESET, Timeout, tickstart) != HAL_OK) +1410:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1411:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable Address Acknowledge */ +1412:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR2 |= I2C_CR2_NACK; +1413:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +1414:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1415:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1416:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** while (hi2c->XferCount > 0U) +1417:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1418:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Wait until TXIS flag is set */ +1419:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) +1420:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1421:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable Address Acknowledge */ +1422:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR2 |= I2C_CR2_NACK; +1423:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +1424:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1425:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1426:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Write data to TXDR */ +1427:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->TXDR = *hi2c->pBuffPtr; +1428:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1429:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Increment Buffer pointer */ +1430:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->pBuffPtr++; +1431:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1432:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount--; +1433:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1434:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1435:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Wait until STOP flag is set */ +1436:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) +1437:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1438:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable Address Acknowledge */ +1439:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR2 |= I2C_CR2_NACK; +1440:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1441:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->ErrorCode == HAL_I2C_ERROR_AF) +1442:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1443:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Normal use case for Transmitter mode */ +1444:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* A NACK is generated to confirm the end of transfer */ +1445:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; +1446:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1447:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +1448:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1449:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +1450:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1451:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1452:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1453:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear STOP flag */ +1454:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF); +1455:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + ARM GAS /tmp/ccE2rRGE.s page 27 + + +1456:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Wait until BUSY flag is reset */ +1457:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, Timeout, tickstart) != HAL_OK) +1458:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1459:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable Address Acknowledge */ +1460:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR2 |= I2C_CR2_NACK; +1461:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +1462:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1463:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1464:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable Address Acknowledge */ +1465:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR2 |= I2C_CR2_NACK; +1466:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1467:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; +1468:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; +1469:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1470:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +1471:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +1472:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1473:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_OK; +1474:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1475:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +1476:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1477:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_BUSY; +1478:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1479:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1480:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1481:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +1482:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Receive in slave mode an amount of data in blocking mode +1483:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +1484:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +1485:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param pData Pointer to data buffer +1486:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Size Amount of data to be sent +1487:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Timeout Timeout duration +1488:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status +1489:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +1490:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef HAL_I2C_Slave_Receive(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, +1491:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t Timeout) +1492:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1493:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tickstart; +1494:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1495:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_READY) +1496:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1497:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((pData == NULL) || (Size == 0U)) +1498:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1499:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM; +1500:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +1501:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1502:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Locked */ +1503:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_LOCK(hi2c); +1504:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1505:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Init tickstart for timeout management*/ +1506:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** tickstart = HAL_GetTick(); +1507:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1508:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_BUSY_RX; +1509:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_SLAVE; +1510:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; +1511:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1512:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prepare transfer parameters */ + ARM GAS /tmp/ccE2rRGE.s page 28 + + +1513:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->pBuffPtr = pData; +1514:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; +1515:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = NULL; +1516:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1517:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable Address Acknowledge */ +1518:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR2 &= ~I2C_CR2_NACK; +1519:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1520:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Wait until ADDR flag is set */ +1521:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_ADDR, RESET, Timeout, tickstart) != HAL_OK) +1522:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1523:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable Address Acknowledge */ +1524:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR2 |= I2C_CR2_NACK; +1525:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +1526:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1527:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1528:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear ADDR flag */ +1529:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR); +1530:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1531:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Wait until DIR flag is reset Receiver mode */ +1532:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_DIR, SET, Timeout, tickstart) != HAL_OK) +1533:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1534:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable Address Acknowledge */ +1535:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR2 |= I2C_CR2_NACK; +1536:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +1537:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1538:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1539:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** while (hi2c->XferCount > 0U) +1540:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1541:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Wait until RXNE flag is set */ +1542:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_WaitOnRXNEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) +1543:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1544:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable Address Acknowledge */ +1545:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR2 |= I2C_CR2_NACK; +1546:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1547:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Store Last receive data if any */ +1548:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET) +1549:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1550:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Read data from RXDR */ +1551:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR; +1552:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1553:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Increment Buffer pointer */ +1554:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->pBuffPtr++; +1555:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1556:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount--; +1557:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1558:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1559:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +1560:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1561:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1562:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Read data from RXDR */ +1563:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR; +1564:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1565:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Increment Buffer pointer */ +1566:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->pBuffPtr++; +1567:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1568:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount--; +1569:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + ARM GAS /tmp/ccE2rRGE.s page 29 + + +1570:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1571:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Wait until STOP flag is set */ +1572:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) +1573:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1574:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable Address Acknowledge */ +1575:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR2 |= I2C_CR2_NACK; +1576:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +1577:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1578:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1579:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear STOP flag */ +1580:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF); +1581:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1582:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Wait until BUSY flag is reset */ +1583:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, Timeout, tickstart) != HAL_OK) +1584:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1585:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable Address Acknowledge */ +1586:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR2 |= I2C_CR2_NACK; +1587:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +1588:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1589:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1590:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable Address Acknowledge */ +1591:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR2 |= I2C_CR2_NACK; +1592:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1593:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; +1594:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; +1595:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1596:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +1597:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +1598:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1599:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_OK; +1600:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1601:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +1602:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1603:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_BUSY; +1604:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1605:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1606:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1607:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +1608:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Transmit in master mode an amount of data in non-blocking mode with Interrupt +1609:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +1610:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +1611:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param DevAddress Target device address: The device 7 bits address value +1612:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * in datasheet must be shifted to the left before calling the interface +1613:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param pData Pointer to data buffer +1614:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Size Amount of data to be sent +1615:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status +1616:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +1617:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef HAL_I2C_Master_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t +1618:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint16_t Size) +1619:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1620:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t xfermode; +1621:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1622:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_READY) +1623:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1624:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET) +1625:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1626:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_BUSY; + ARM GAS /tmp/ccE2rRGE.s page 30 + + +1627:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1628:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1629:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Locked */ +1630:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_LOCK(hi2c); +1631:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1632:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_BUSY_TX; +1633:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MASTER; +1634:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; +1635:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1636:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prepare transfer parameters */ +1637:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->pBuffPtr = pData; +1638:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; +1639:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; +1640:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_IT; +1641:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1642:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferCount > MAX_NBYTE_SIZE) +1643:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1644:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = MAX_NBYTE_SIZE; +1645:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_RELOAD_MODE; +1646:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1647:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +1648:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1649:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; +1650:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_AUTOEND_MODE; +1651:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1652:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1653:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Send Slave Address */ +1654:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE */ +1655:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, I2C_GENERATE_START_WRIT +1656:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1657:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +1658:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +1659:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1660:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Note : The I2C interrupts must be enabled after unlocking current process +1661:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** to avoid the risk of I2C interrupt handle execution before current +1662:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** process unlock */ +1663:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1664:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable ERR, TC, STOP, NACK, TXI interrupt */ +1665:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* possible to enable all of these */ +1666:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* I2C_IT_ERRI | I2C_IT_TCI | I2C_IT_STOPI | I2C_IT_NACKI | +1667:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */ +1668:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT); +1669:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1670:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_OK; +1671:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1672:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +1673:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1674:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_BUSY; +1675:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1676:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1677:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1678:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +1679:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Receive in master mode an amount of data in non-blocking mode with Interrupt +1680:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +1681:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +1682:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param DevAddress Target device address: The device 7 bits address value +1683:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * in datasheet must be shifted to the left before calling the interface + ARM GAS /tmp/ccE2rRGE.s page 31 + + +1684:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param pData Pointer to data buffer +1685:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Size Amount of data to be sent +1686:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status +1687:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +1688:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef HAL_I2C_Master_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t * +1689:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint16_t Size) +1690:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1691:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t xfermode; +1692:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1693:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_READY) +1694:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1695:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET) +1696:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1697:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_BUSY; +1698:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1699:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1700:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Locked */ +1701:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_LOCK(hi2c); +1702:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1703:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_BUSY_RX; +1704:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MASTER; +1705:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; +1706:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1707:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prepare transfer parameters */ +1708:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->pBuffPtr = pData; +1709:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; +1710:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; +1711:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_IT; +1712:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1713:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferCount > MAX_NBYTE_SIZE) +1714:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1715:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = MAX_NBYTE_SIZE; +1716:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_RELOAD_MODE; +1717:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1718:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +1719:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1720:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; +1721:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_AUTOEND_MODE; +1722:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1723:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1724:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Send Slave Address */ +1725:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE */ +1726:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, I2C_GENERATE_START_READ +1727:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1728:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +1729:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +1730:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1731:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Note : The I2C interrupts must be enabled after unlocking current process +1732:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** to avoid the risk of I2C interrupt handle execution before current +1733:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** process unlock */ +1734:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1735:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable ERR, TC, STOP, NACK, RXI interrupt */ +1736:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* possible to enable all of these */ +1737:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* I2C_IT_ERRI | I2C_IT_TCI | I2C_IT_STOPI | I2C_IT_NACKI | +1738:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */ +1739:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Enable_IRQ(hi2c, I2C_XFER_RX_IT); +1740:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + ARM GAS /tmp/ccE2rRGE.s page 32 + + +1741:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_OK; +1742:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1743:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +1744:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1745:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_BUSY; +1746:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1747:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1748:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1749:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +1750:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Transmit in slave mode an amount of data in non-blocking mode with Interrupt +1751:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +1752:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +1753:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param pData Pointer to data buffer +1754:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Size Amount of data to be sent +1755:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status +1756:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +1757:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef HAL_I2C_Slave_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size) +1758:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1759:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_READY) +1760:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1761:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Locked */ +1762:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_LOCK(hi2c); +1763:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1764:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_BUSY_TX; +1765:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_SLAVE; +1766:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; +1767:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1768:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable Address Acknowledge */ +1769:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR2 &= ~I2C_CR2_NACK; +1770:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1771:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prepare transfer parameters */ +1772:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->pBuffPtr = pData; +1773:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; +1774:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; +1775:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; +1776:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Slave_ISR_IT; +1777:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1778:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +1779:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +1780:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1781:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Note : The I2C interrupts must be enabled after unlocking current process +1782:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** to avoid the risk of I2C interrupt handle execution before current +1783:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** process unlock */ +1784:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1785:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable ERR, TC, STOP, NACK, TXI interrupt */ +1786:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* possible to enable all of these */ +1787:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* I2C_IT_ERRI | I2C_IT_TCI | I2C_IT_STOPI | I2C_IT_NACKI | +1788:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */ +1789:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT | I2C_XFER_LISTEN_IT); +1790:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1791:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_OK; +1792:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1793:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +1794:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1795:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_BUSY; +1796:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1797:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + ARM GAS /tmp/ccE2rRGE.s page 33 + + +1798:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1799:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +1800:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Receive in slave mode an amount of data in non-blocking mode with Interrupt +1801:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +1802:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +1803:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param pData Pointer to data buffer +1804:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Size Amount of data to be sent +1805:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status +1806:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +1807:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef HAL_I2C_Slave_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size) +1808:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1809:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_READY) +1810:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1811:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Locked */ +1812:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_LOCK(hi2c); +1813:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1814:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_BUSY_RX; +1815:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_SLAVE; +1816:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; +1817:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1818:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable Address Acknowledge */ +1819:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR2 &= ~I2C_CR2_NACK; +1820:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1821:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prepare transfer parameters */ +1822:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->pBuffPtr = pData; +1823:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; +1824:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; +1825:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; +1826:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Slave_ISR_IT; +1827:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1828:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +1829:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +1830:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1831:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Note : The I2C interrupts must be enabled after unlocking current process +1832:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** to avoid the risk of I2C interrupt handle execution before current +1833:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** process unlock */ +1834:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1835:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable ERR, TC, STOP, NACK, RXI interrupt */ +1836:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* possible to enable all of these */ +1837:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* I2C_IT_ERRI | I2C_IT_TCI | I2C_IT_STOPI | I2C_IT_NACKI | +1838:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */ +1839:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Enable_IRQ(hi2c, I2C_XFER_RX_IT | I2C_XFER_LISTEN_IT); +1840:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1841:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_OK; +1842:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1843:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +1844:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1845:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_BUSY; +1846:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1847:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1848:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1849:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +1850:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Transmit in master mode an amount of data in non-blocking mode with DMA +1851:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +1852:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +1853:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param DevAddress Target device address: The device 7 bits address value +1854:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * in datasheet must be shifted to the left before calling the interface + ARM GAS /tmp/ccE2rRGE.s page 34 + + +1855:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param pData Pointer to data buffer +1856:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Size Amount of data to be sent +1857:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status +1858:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +1859:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef HAL_I2C_Master_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t +1860:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint16_t Size) +1861:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1862:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t xfermode; +1863:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef dmaxferstatus; +1864:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1865:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_READY) +1866:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1867:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET) +1868:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1869:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_BUSY; +1870:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1871:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1872:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Locked */ +1873:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_LOCK(hi2c); +1874:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1875:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_BUSY_TX; +1876:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MASTER; +1877:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; +1878:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1879:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prepare transfer parameters */ +1880:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->pBuffPtr = pData; +1881:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; +1882:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; +1883:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_DMA; +1884:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1885:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferCount > MAX_NBYTE_SIZE) +1886:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1887:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = MAX_NBYTE_SIZE; +1888:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_RELOAD_MODE; +1889:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1890:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +1891:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1892:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; +1893:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_AUTOEND_MODE; +1894:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1895:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1896:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferSize > 0U) +1897:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1898:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->hdmatx != NULL) +1899:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1900:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set the I2C DMA transfer complete callback */ +1901:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmatx->XferCpltCallback = I2C_DMAMasterTransmitCplt; +1902:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1903:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set the DMA error callback */ +1904:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmatx->XferErrorCallback = I2C_DMAError; +1905:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1906:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set the unused DMA callbacks to NULL */ +1907:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmatx->XferHalfCpltCallback = NULL; +1908:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmatx->XferAbortCallback = NULL; +1909:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1910:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable the DMA channel */ +1911:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)pData, (uint32_t)&hi2c->Instance-> + ARM GAS /tmp/ccE2rRGE.s page 35 + + +1912:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize); +1913:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1914:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +1915:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1916:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update I2C state */ +1917:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; +1918:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; +1919:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1920:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update I2C error code */ +1921:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; +1922:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1923:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +1924:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +1925:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1926:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +1927:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1928:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1929:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (dmaxferstatus == HAL_OK) +1930:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1931:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Send Slave Address */ +1932:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART +1933:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, I2C_GENERATE_START_ +1934:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1935:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update XferCount value */ +1936:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount -= hi2c->XferSize; +1937:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1938:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +1939:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +1940:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1941:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Note : The I2C interrupts must be enabled after unlocking current process +1942:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** to avoid the risk of I2C interrupt handle execution before current +1943:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** process unlock */ +1944:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable ERR and NACK interrupts */ +1945:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Enable_IRQ(hi2c, I2C_XFER_ERROR_IT); +1946:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1947:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable DMA Request */ +1948:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR1 |= I2C_CR1_TXDMAEN; +1949:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1950:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +1951:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1952:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update I2C state */ +1953:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; +1954:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; +1955:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1956:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update I2C error code */ +1957:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; +1958:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1959:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +1960:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +1961:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1962:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +1963:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1964:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1965:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +1966:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1967:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update Transfer ISR function pointer */ +1968:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_IT; + ARM GAS /tmp/ccE2rRGE.s page 36 + + +1969:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1970:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Send Slave Address */ +1971:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set NBYTES to write and generate START condition */ +1972:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, +1973:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_GENERATE_START_WRITE); +1974:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1975:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +1976:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +1977:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1978:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Note : The I2C interrupts must be enabled after unlocking current process +1979:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** to avoid the risk of I2C interrupt handle execution before current +1980:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** process unlock */ +1981:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable ERR, TC, STOP, NACK, TXI interrupt */ +1982:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* possible to enable all of these */ +1983:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* I2C_IT_ERRI | I2C_IT_TCI | I2C_IT_STOPI | I2C_IT_NACKI | +1984:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */ +1985:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT); +1986:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1987:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1988:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_OK; +1989:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1990:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +1991:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +1992:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_BUSY; +1993:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1994:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +1995:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +1996:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +1997:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Receive in master mode an amount of data in non-blocking mode with DMA +1998:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +1999:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +2000:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param DevAddress Target device address: The device 7 bits address value +2001:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * in datasheet must be shifted to the left before calling the interface +2002:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param pData Pointer to data buffer +2003:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Size Amount of data to be sent +2004:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status +2005:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +2006:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef HAL_I2C_Master_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t +2007:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint16_t Size) +2008:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2009:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t xfermode; +2010:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef dmaxferstatus; +2011:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2012:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_READY) +2013:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2014:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET) +2015:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2016:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_BUSY; +2017:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2018:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2019:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Locked */ +2020:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_LOCK(hi2c); +2021:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2022:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_BUSY_RX; +2023:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MASTER; +2024:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; +2025:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + ARM GAS /tmp/ccE2rRGE.s page 37 + + +2026:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prepare transfer parameters */ +2027:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->pBuffPtr = pData; +2028:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; +2029:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; +2030:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_DMA; +2031:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2032:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferCount > MAX_NBYTE_SIZE) +2033:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2034:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = MAX_NBYTE_SIZE; +2035:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_RELOAD_MODE; +2036:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2037:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +2038:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2039:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; +2040:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_AUTOEND_MODE; +2041:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2042:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2043:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferSize > 0U) +2044:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2045:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->hdmarx != NULL) +2046:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2047:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set the I2C DMA transfer complete callback */ +2048:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmarx->XferCpltCallback = I2C_DMAMasterReceiveCplt; +2049:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2050:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set the DMA error callback */ +2051:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmarx->XferErrorCallback = I2C_DMAError; +2052:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2053:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set the unused DMA callbacks to NULL */ +2054:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmarx->XferHalfCpltCallback = NULL; +2055:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmarx->XferAbortCallback = NULL; +2056:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2057:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable the DMA channel */ +2058:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->RXDR, (uint32_t)p +2059:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize); +2060:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2061:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +2062:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2063:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update I2C state */ +2064:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; +2065:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; +2066:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2067:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update I2C error code */ +2068:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; +2069:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2070:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +2071:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +2072:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2073:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +2074:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2075:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2076:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (dmaxferstatus == HAL_OK) +2077:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2078:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Send Slave Address */ +2079:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set NBYTES to read and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART * +2080:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, I2C_GENERATE_START_ +2081:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2082:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update XferCount value */ + ARM GAS /tmp/ccE2rRGE.s page 38 + + +2083:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount -= hi2c->XferSize; +2084:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2085:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +2086:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +2087:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2088:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Note : The I2C interrupts must be enabled after unlocking current process +2089:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** to avoid the risk of I2C interrupt handle execution before current +2090:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** process unlock */ +2091:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable ERR and NACK interrupts */ +2092:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Enable_IRQ(hi2c, I2C_XFER_ERROR_IT); +2093:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2094:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable DMA Request */ +2095:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR1 |= I2C_CR1_RXDMAEN; +2096:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2097:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +2098:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2099:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update I2C state */ +2100:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; +2101:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; +2102:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2103:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update I2C error code */ +2104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; +2105:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2106:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +2107:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +2108:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2109:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +2110:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2111:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2112:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +2113:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2114:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update Transfer ISR function pointer */ +2115:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_IT; +2116:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2117:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Send Slave Address */ +2118:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set NBYTES to read and generate START condition */ +2119:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, +2120:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_GENERATE_START_READ); +2121:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2122:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +2123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +2124:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2125:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Note : The I2C interrupts must be enabled after unlocking current process +2126:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** to avoid the risk of I2C interrupt handle execution before current +2127:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** process unlock */ +2128:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable ERR, TC, STOP, NACK, TXI interrupt */ +2129:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* possible to enable all of these */ +2130:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* I2C_IT_ERRI | I2C_IT_TCI | I2C_IT_STOPI | I2C_IT_NACKI | +2131:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */ +2132:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT); +2133:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2134:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2135:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_OK; +2136:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2137:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +2138:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_BUSY; + ARM GAS /tmp/ccE2rRGE.s page 39 + + +2140:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2141:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2142:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2143:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +2144:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Transmit in slave mode an amount of data in non-blocking mode with DMA +2145:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +2146:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +2147:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param pData Pointer to data buffer +2148:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Size Amount of data to be sent +2149:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status +2150:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +2151:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef HAL_I2C_Slave_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size +2152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2153:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef dmaxferstatus; +2154:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2155:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_READY) +2156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2157:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((pData == NULL) || (Size == 0U)) +2158:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2159:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM; +2160:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +2161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2162:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Locked */ +2163:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_LOCK(hi2c); +2164:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_BUSY_TX; +2166:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_SLAVE; +2167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; +2168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2169:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prepare transfer parameters */ +2170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->pBuffPtr = pData; +2171:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; +2172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; +2173:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; +2174:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Slave_ISR_DMA; +2175:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2176:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->hdmatx != NULL) +2177:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2178:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set the I2C DMA transfer complete callback */ +2179:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmatx->XferCpltCallback = I2C_DMASlaveTransmitCplt; +2180:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2181:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set the DMA error callback */ +2182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmatx->XferErrorCallback = I2C_DMAError; +2183:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2184:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set the unused DMA callbacks to NULL */ +2185:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmatx->XferHalfCpltCallback = NULL; +2186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmatx->XferAbortCallback = NULL; +2187:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2188:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable the DMA channel */ +2189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)pData, (uint32_t)&hi2c->Instance->TX +2190:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize); +2191:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2192:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +2193:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2194:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update I2C state */ +2195:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_LISTEN; +2196:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + ARM GAS /tmp/ccE2rRGE.s page 40 + + +2197:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2198:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update I2C error code */ +2199:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; +2200:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2201:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +2202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +2203:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2204:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +2205:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2206:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2207:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (dmaxferstatus == HAL_OK) +2208:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2209:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable Address Acknowledge */ +2210:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR2 &= ~I2C_CR2_NACK; +2211:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2212:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +2213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +2214:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2215:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Note : The I2C interrupts must be enabled after unlocking current process +2216:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** to avoid the risk of I2C interrupt handle execution before current +2217:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** process unlock */ +2218:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable ERR, STOP, NACK, ADDR interrupts */ +2219:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Enable_IRQ(hi2c, I2C_XFER_LISTEN_IT); +2220:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2221:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable DMA Request */ +2222:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR1 |= I2C_CR1_TXDMAEN; +2223:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2224:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +2225:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2226:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update I2C state */ +2227:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_LISTEN; +2228:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; +2229:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2230:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update I2C error code */ +2231:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; +2232:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2233:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +2234:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +2235:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2236:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +2237:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2238:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_OK; +2240:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2241:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +2242:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2243:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_BUSY; +2244:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2246:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2247:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +2248:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Receive in slave mode an amount of data in non-blocking mode with DMA +2249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +2250:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +2251:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param pData Pointer to data buffer +2252:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Size Amount of data to be sent +2253:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status + ARM GAS /tmp/ccE2rRGE.s page 41 + + +2254:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +2255:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef HAL_I2C_Slave_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size) +2256:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2257:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef dmaxferstatus; +2258:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_READY) +2260:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2261:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((pData == NULL) || (Size == 0U)) +2262:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2263:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM; +2264:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +2265:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2266:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Locked */ +2267:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_LOCK(hi2c); +2268:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2269:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_BUSY_RX; +2270:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_SLAVE; +2271:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; +2272:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2273:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prepare transfer parameters */ +2274:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->pBuffPtr = pData; +2275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; +2276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; +2277:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; +2278:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Slave_ISR_DMA; +2279:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2280:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->hdmarx != NULL) +2281:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2282:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set the I2C DMA transfer complete callback */ +2283:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmarx->XferCpltCallback = I2C_DMASlaveReceiveCplt; +2284:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2285:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set the DMA error callback */ +2286:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmarx->XferErrorCallback = I2C_DMAError; +2287:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set the unused DMA callbacks to NULL */ +2289:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmarx->XferHalfCpltCallback = NULL; +2290:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmarx->XferAbortCallback = NULL; +2291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2292:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable the DMA channel */ +2293:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->RXDR, (uint32_t)pDa +2294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize); +2295:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +2297:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2298:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update I2C state */ +2299:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_LISTEN; +2300:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; +2301:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2302:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update I2C error code */ +2303:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; +2304:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2305:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +2306:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +2307:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2308:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +2309:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2310:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + ARM GAS /tmp/ccE2rRGE.s page 42 + + +2311:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (dmaxferstatus == HAL_OK) +2312:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2313:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable Address Acknowledge */ +2314:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR2 &= ~I2C_CR2_NACK; +2315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2316:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +2317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +2318:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2319:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Note : The I2C interrupts must be enabled after unlocking current process +2320:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** to avoid the risk of I2C interrupt handle execution before current +2321:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** process unlock */ +2322:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable ERR, STOP, NACK, ADDR interrupts */ +2323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Enable_IRQ(hi2c, I2C_XFER_LISTEN_IT); +2324:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2325:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable DMA Request */ +2326:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR1 |= I2C_CR1_RXDMAEN; +2327:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2328:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +2329:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2330:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update I2C state */ +2331:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_LISTEN; +2332:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; +2333:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2334:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update I2C error code */ +2335:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; +2336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2337:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +2338:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +2339:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2340:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +2341:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2342:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_OK; +2344:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2345:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +2346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2347:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_BUSY; +2348:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2349:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2350:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +2351:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Write an amount of data in blocking mode to a specific memory address +2352:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +2353:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +2354:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param DevAddress Target device address: The device 7 bits address value +2355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * in datasheet must be shifted to the left before calling the interface +2356:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param MemAddress Internal memory address +2357:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param MemAddSize Size of internal memory address +2358:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param pData Pointer to data buffer +2359:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Size Amount of data to be sent +2360:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Timeout Timeout duration +2361:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status +2362:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +2363:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddre +2364:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Ti +2365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2366:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tickstart; +2367:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + ARM GAS /tmp/ccE2rRGE.s page 43 + + +2368:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Check the parameters */ +2369:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); +2370:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2371:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_READY) +2372:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((pData == NULL) || (Size == 0U)) +2374:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2375:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM; +2376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +2377:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2378:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2379:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Locked */ +2380:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_LOCK(hi2c); +2381:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2382:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Init tickstart for timeout management*/ +2383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** tickstart = HAL_GetTick(); +2384:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY, tickstart) != HAL_OK +2386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2387:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +2388:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2389:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2390:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_BUSY_TX; +2391:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MEM; +2392:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; +2393:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2394:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prepare transfer parameters */ +2395:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->pBuffPtr = pData; +2396:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; +2397:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = NULL; +2398:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2399:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Send Slave Address and Memory Address */ +2400:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, Timeout, tickstart) != HAL +2401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2402:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +2403:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +2404:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +2405:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2406:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE */ +2408:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferCount > MAX_NBYTE_SIZE) +2409:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2410:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = MAX_NBYTE_SIZE; +2411:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, I2C_NO_STARTST +2412:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2413:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +2414:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2415:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; +2416:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, I2C_NO_STARTS +2417:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2418:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2419:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** do +2420:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2421:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Wait until TXIS flag is set */ +2422:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) +2423:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2424:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + ARM GAS /tmp/ccE2rRGE.s page 44 + + +2425:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2426:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2427:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Write data to TXDR */ +2428:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->TXDR = *hi2c->pBuffPtr; +2429:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2430:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Increment Buffer pointer */ +2431:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->pBuffPtr++; +2432:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2433:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount--; +2434:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize--; +2435:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2436:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((hi2c->XferCount != 0U) && (hi2c->XferSize == 0U)) +2437:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2438:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Wait until TCR flag is set */ +2439:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, Timeout, tickstart) != HAL_OK) +2440:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2441:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +2442:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2443:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2444:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferCount > MAX_NBYTE_SIZE) +2445:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2446:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = MAX_NBYTE_SIZE; +2447:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, +2448:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_NO_STARTSTOP); +2449:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2450:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +2451:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2452:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; +2453:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, +2454:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_NO_STARTSTOP); +2455:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2456:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2457:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2458:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } while (hi2c->XferCount > 0U); +2459:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2460:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */ +2461:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Wait until STOPF flag is reset */ +2462:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) +2463:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2464:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +2465:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2466:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2467:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear STOP Flag */ +2468:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF); +2469:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2470:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear Configuration Register 2 */ +2471:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_RESET_CR2(hi2c); +2472:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2473:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; +2474:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; +2475:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2476:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +2477:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +2478:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2479:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_OK; +2480:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2481:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else + ARM GAS /tmp/ccE2rRGE.s page 45 + + +2482:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2483:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_BUSY; +2484:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2485:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2486:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2487:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +2488:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Read an amount of data in blocking mode from a specific memory address +2489:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +2490:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +2491:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param DevAddress Target device address: The device 7 bits address value +2492:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * in datasheet must be shifted to the left before calling the interface +2493:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param MemAddress Internal memory address +2494:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param MemAddSize Size of internal memory address +2495:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param pData Pointer to data buffer +2496:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Size Amount of data to be sent +2497:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Timeout Timeout duration +2498:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status +2499:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +2500:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddres +2501:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Tim +2502:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2503:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tickstart; +2504:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2505:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Check the parameters */ +2506:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); +2507:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2508:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_READY) +2509:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2510:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((pData == NULL) || (Size == 0U)) +2511:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2512:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM; +2513:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +2514:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2515:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2516:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Locked */ +2517:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_LOCK(hi2c); +2518:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2519:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Init tickstart for timeout management*/ +2520:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** tickstart = HAL_GetTick(); +2521:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2522:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY, tickstart) != HAL_OK +2523:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2524:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +2525:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2526:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2527:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_BUSY_RX; +2528:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MEM; +2529:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; +2530:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2531:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prepare transfer parameters */ +2532:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->pBuffPtr = pData; +2533:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; +2534:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = NULL; +2535:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2536:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Send Slave Address and Memory Address */ +2537:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, Timeout, tickstart) != HAL_ +2538:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + ARM GAS /tmp/ccE2rRGE.s page 46 + + +2539:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +2540:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +2541:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +2542:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2543:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2544:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Send Slave Address */ +2545:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */ +2546:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferCount > MAX_NBYTE_SIZE) +2547:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2548:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = MAX_NBYTE_SIZE; +2549:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, +2550:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_GENERATE_START_READ); +2551:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2552:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +2553:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2554:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; +2555:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, +2556:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_GENERATE_START_READ); +2557:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2558:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2559:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** do +2560:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2561:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Wait until RXNE flag is set */ +2562:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_RXNE, RESET, Timeout, tickstart) != HAL_OK) +2563:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2564:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +2565:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2566:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2567:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Read data from RXDR */ +2568:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR; +2569:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2570:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Increment Buffer pointer */ +2571:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->pBuffPtr++; +2572:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2573:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize--; +2574:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount--; +2575:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2576:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((hi2c->XferCount != 0U) && (hi2c->XferSize == 0U)) +2577:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2578:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Wait until TCR flag is set */ +2579:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, Timeout, tickstart) != HAL_OK) +2580:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2581:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +2582:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2583:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2584:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferCount > MAX_NBYTE_SIZE) +2585:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2586:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = MAX_NBYTE_SIZE; +2587:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t) hi2c->XferSize, I2C_RELOAD_MODE, +2588:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_NO_STARTSTOP); +2589:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2590:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +2591:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2592:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; +2593:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, +2594:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_NO_STARTSTOP); +2595:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + ARM GAS /tmp/ccE2rRGE.s page 47 + + +2596:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2597:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } while (hi2c->XferCount > 0U); +2598:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2599:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */ +2600:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Wait until STOPF flag is reset */ +2601:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_WaitOnSTOPFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK) +2602:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2603:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +2604:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2605:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2606:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear STOP Flag */ +2607:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF); +2608:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2609:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear Configuration Register 2 */ +2610:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_RESET_CR2(hi2c); +2611:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2612:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; +2613:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; +2614:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2615:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +2616:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +2617:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2618:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_OK; +2619:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2620:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +2621:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2622:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_BUSY; +2623:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2624:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2625:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +2626:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Write an amount of data in non-blocking mode with Interrupt to a specific memory addres +2627:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +2628:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +2629:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param DevAddress Target device address: The device 7 bits address value +2630:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * in datasheet must be shifted to the left before calling the interface +2631:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param MemAddress Internal memory address +2632:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param MemAddSize Size of internal memory address +2633:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param pData Pointer to data buffer +2634:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Size Amount of data to be sent +2635:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status +2636:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +2637:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef HAL_I2C_Mem_Write_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAd +2638:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint16_t MemAddSize, uint8_t *pData, uint16_t Size) +2639:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2640:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tickstart; +2641:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t xfermode; +2642:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2643:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Check the parameters */ +2644:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); +2645:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2646:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_READY) +2647:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2648:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((pData == NULL) || (Size == 0U)) +2649:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2650:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM; +2651:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +2652:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + ARM GAS /tmp/ccE2rRGE.s page 48 + + +2653:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2654:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET) +2655:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2656:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_BUSY; +2657:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2658:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2659:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Locked */ +2660:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_LOCK(hi2c); +2661:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2662:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Init tickstart for timeout management*/ +2663:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** tickstart = HAL_GetTick(); +2664:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2665:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_BUSY_TX; +2666:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MEM; +2667:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; +2668:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2669:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prepare transfer parameters */ +2670:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->pBuffPtr = pData; +2671:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; +2672:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; +2673:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_IT; +2674:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2675:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferCount > MAX_NBYTE_SIZE) +2676:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2677:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = MAX_NBYTE_SIZE; +2678:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_RELOAD_MODE; +2679:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2680:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +2681:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2682:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; +2683:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_AUTOEND_MODE; +2684:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2685:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2686:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Send Slave Address and Memory Address */ +2687:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstar +2688:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** != HAL_OK) +2689:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2690:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +2691:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +2692:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +2693:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2694:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2695:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */ +2696:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, I2C_NO_STARTSTOP); +2697:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2698:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +2699:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +2700:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2701:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Note : The I2C interrupts must be enabled after unlocking current process +2702:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** to avoid the risk of I2C interrupt handle execution before current +2703:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** process unlock */ +2704:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2705:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable ERR, TC, STOP, NACK, TXI interrupt */ +2706:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* possible to enable all of these */ +2707:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* I2C_IT_ERRI | I2C_IT_TCI | I2C_IT_STOPI | I2C_IT_NACKI | +2708:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */ +2709:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT); + ARM GAS /tmp/ccE2rRGE.s page 49 + + +2710:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2711:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_OK; +2712:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2713:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +2714:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2715:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_BUSY; +2716:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2717:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2718:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2719:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +2720:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Read an amount of data in non-blocking mode with Interrupt from a specific memory addre +2721:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +2722:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +2723:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param DevAddress Target device address: The device 7 bits address value +2724:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * in datasheet must be shifted to the left before calling the interface +2725:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param MemAddress Internal memory address +2726:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param MemAddSize Size of internal memory address +2727:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param pData Pointer to data buffer +2728:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Size Amount of data to be sent +2729:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status +2730:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +2731:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef HAL_I2C_Mem_Read_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAdd +2732:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint16_t MemAddSize, uint8_t *pData, uint16_t Size) +2733:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2734:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tickstart; +2735:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t xfermode; +2736:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2737:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Check the parameters */ +2738:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); +2739:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2740:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_READY) +2741:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2742:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((pData == NULL) || (Size == 0U)) +2743:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2744:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM; +2745:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +2746:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2747:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2748:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET) +2749:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2750:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_BUSY; +2751:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2752:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2753:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Locked */ +2754:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_LOCK(hi2c); +2755:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2756:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Init tickstart for timeout management*/ +2757:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** tickstart = HAL_GetTick(); +2758:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2759:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_BUSY_RX; +2760:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MEM; +2761:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; +2762:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2763:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prepare transfer parameters */ +2764:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->pBuffPtr = pData; +2765:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; +2766:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; + ARM GAS /tmp/ccE2rRGE.s page 50 + + +2767:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_IT; +2768:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2769:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferCount > MAX_NBYTE_SIZE) +2770:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2771:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = MAX_NBYTE_SIZE; +2772:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_RELOAD_MODE; +2773:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2774:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +2775:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2776:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; +2777:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_AUTOEND_MODE; +2778:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2779:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2780:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Send Slave Address and Memory Address */ +2781:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart +2782:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2783:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +2784:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +2785:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +2786:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2787:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2788:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */ +2789:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, I2C_GENERATE_START_READ +2790:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2791:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +2792:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +2793:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2794:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Note : The I2C interrupts must be enabled after unlocking current process +2795:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** to avoid the risk of I2C interrupt handle execution before current +2796:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** process unlock */ +2797:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2798:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable ERR, TC, STOP, NACK, RXI interrupt */ +2799:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* possible to enable all of these */ +2800:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* I2C_IT_ERRI | I2C_IT_TCI | I2C_IT_STOPI | I2C_IT_NACKI | +2801:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */ +2802:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Enable_IRQ(hi2c, I2C_XFER_RX_IT); +2803:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2804:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_OK; +2805:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2806:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +2807:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2808:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_BUSY; +2809:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2810:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2811:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +2812:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Write an amount of data in non-blocking mode with DMA to a specific memory address +2813:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +2814:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +2815:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param DevAddress Target device address: The device 7 bits address value +2816:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * in datasheet must be shifted to the left before calling the interface +2817:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param MemAddress Internal memory address +2818:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param MemAddSize Size of internal memory address +2819:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param pData Pointer to data buffer +2820:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Size Amount of data to be sent +2821:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status +2822:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +2823:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef HAL_I2C_Mem_Write_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemA + ARM GAS /tmp/ccE2rRGE.s page 51 + + +2824:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint16_t MemAddSize, uint8_t *pData, uint16_t Size) +2825:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2826:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tickstart; +2827:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t xfermode; +2828:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef dmaxferstatus; +2829:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2830:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Check the parameters */ +2831:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); +2832:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2833:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_READY) +2834:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2835:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((pData == NULL) || (Size == 0U)) +2836:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2837:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM; +2838:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +2839:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2840:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2841:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET) +2842:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2843:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_BUSY; +2844:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2845:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2846:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Locked */ +2847:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_LOCK(hi2c); +2848:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2849:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Init tickstart for timeout management*/ +2850:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** tickstart = HAL_GetTick(); +2851:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2852:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_BUSY_TX; +2853:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MEM; +2854:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; +2855:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2856:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prepare transfer parameters */ +2857:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->pBuffPtr = pData; +2858:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; +2859:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; +2860:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_DMA; +2861:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2862:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferCount > MAX_NBYTE_SIZE) +2863:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2864:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = MAX_NBYTE_SIZE; +2865:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_RELOAD_MODE; +2866:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2867:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +2868:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2869:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; +2870:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_AUTOEND_MODE; +2871:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2872:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2873:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Send Slave Address and Memory Address */ +2874:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_RequestMemoryWrite(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstar +2875:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** != HAL_OK) +2876:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2877:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +2878:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +2879:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +2880:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + ARM GAS /tmp/ccE2rRGE.s page 52 + + +2881:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2882:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2883:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->hdmatx != NULL) +2884:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2885:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set the I2C DMA transfer complete callback */ +2886:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmatx->XferCpltCallback = I2C_DMAMasterTransmitCplt; +2887:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2888:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set the DMA error callback */ +2889:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmatx->XferErrorCallback = I2C_DMAError; +2890:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2891:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set the unused DMA callbacks to NULL */ +2892:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmatx->XferHalfCpltCallback = NULL; +2893:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmatx->XferAbortCallback = NULL; +2894:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2895:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable the DMA channel */ +2896:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)pData, (uint32_t)&hi2c->Instance->TX +2897:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize); +2898:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2899:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +2900:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2901:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update I2C state */ +2902:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; +2903:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; +2904:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2905:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update I2C error code */ +2906:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; +2907:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2908:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +2909:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +2910:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2911:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +2912:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2913:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2914:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (dmaxferstatus == HAL_OK) +2915:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2916:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Send Slave Address */ +2917:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */ +2918:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, I2C_NO_STARTSTOP); +2919:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2920:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update XferCount value */ +2921:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount -= hi2c->XferSize; +2922:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2923:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +2924:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +2925:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2926:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Note : The I2C interrupts must be enabled after unlocking current process +2927:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** to avoid the risk of I2C interrupt handle execution before current +2928:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** process unlock */ +2929:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable ERR and NACK interrupts */ +2930:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Enable_IRQ(hi2c, I2C_XFER_ERROR_IT); +2931:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2932:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable DMA Request */ +2933:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR1 |= I2C_CR1_TXDMAEN; +2934:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2935:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +2936:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2937:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update I2C state */ + ARM GAS /tmp/ccE2rRGE.s page 53 + + +2938:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; +2939:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; +2940:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2941:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update I2C error code */ +2942:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; +2943:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2944:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +2945:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +2946:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2947:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +2948:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2949:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2950:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_OK; +2951:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2952:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +2953:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2954:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_BUSY; +2955:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2956:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2957:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2958:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +2959:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Reads an amount of data in non-blocking mode with DMA from a specific memory address. +2960:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +2961:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +2962:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param DevAddress Target device address: The device 7 bits address value +2963:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * in datasheet must be shifted to the left before calling the interface +2964:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param MemAddress Internal memory address +2965:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param MemAddSize Size of internal memory address +2966:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param pData Pointer to data buffer +2967:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Size Amount of data to be read +2968:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status +2969:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +2970:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef HAL_I2C_Mem_Read_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAd +2971:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint16_t MemAddSize, uint8_t *pData, uint16_t Size) +2972:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2973:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tickstart; +2974:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t xfermode; +2975:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef dmaxferstatus; +2976:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2977:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Check the parameters */ +2978:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** assert_param(IS_I2C_MEMADD_SIZE(MemAddSize)); +2979:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2980:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_READY) +2981:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2982:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((pData == NULL) || (Size == 0U)) +2983:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2984:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM; +2985:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +2986:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2987:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2988:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET) +2989:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +2990:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_BUSY; +2991:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +2992:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2993:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Locked */ +2994:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_LOCK(hi2c); + ARM GAS /tmp/ccE2rRGE.s page 54 + + +2995:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2996:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Init tickstart for timeout management*/ +2997:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** tickstart = HAL_GetTick(); +2998:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +2999:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_BUSY_RX; +3000:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MEM; +3001:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; +3002:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3003:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prepare transfer parameters */ +3004:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->pBuffPtr = pData; +3005:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; +3006:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; +3007:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_DMA; +3008:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3009:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferCount > MAX_NBYTE_SIZE) +3010:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3011:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = MAX_NBYTE_SIZE; +3012:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_RELOAD_MODE; +3013:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3014:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +3015:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3016:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; +3017:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_AUTOEND_MODE; +3018:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3019:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3020:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Send Slave Address and Memory Address */ +3021:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_RequestMemoryRead(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG, tickstart +3022:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3023:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +3024:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +3025:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +3026:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3027:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3028:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->hdmarx != NULL) +3029:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3030:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set the I2C DMA transfer complete callback */ +3031:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmarx->XferCpltCallback = I2C_DMAMasterReceiveCplt; +3032:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3033:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set the DMA error callback */ +3034:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmarx->XferErrorCallback = I2C_DMAError; +3035:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3036:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set the unused DMA callbacks to NULL */ +3037:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmarx->XferHalfCpltCallback = NULL; +3038:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmarx->XferAbortCallback = NULL; +3039:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3040:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable the DMA channel */ +3041:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->RXDR, (uint32_t)pDa +3042:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize); +3043:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3044:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +3045:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3046:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update I2C state */ +3047:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; +3048:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; +3049:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3050:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update I2C error code */ +3051:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; + ARM GAS /tmp/ccE2rRGE.s page 55 + + +3052:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3053:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +3054:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +3055:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3056:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +3057:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3058:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3059:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (dmaxferstatus == HAL_OK) +3060:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3061:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set NBYTES to write and reload if hi2c->XferCount > MAX_NBYTE_SIZE and generate RESTART */ +3062:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, I2C_GENERATE_START_RE +3063:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3064:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update XferCount value */ +3065:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount -= hi2c->XferSize; +3066:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3067:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +3068:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +3069:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3070:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Note : The I2C interrupts must be enabled after unlocking current process +3071:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** to avoid the risk of I2C interrupt handle execution before current +3072:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** process unlock */ +3073:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable ERR and NACK interrupts */ +3074:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Enable_IRQ(hi2c, I2C_XFER_ERROR_IT); +3075:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3076:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable DMA Request */ +3077:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR1 |= I2C_CR1_RXDMAEN; +3078:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3079:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +3080:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3081:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update I2C state */ +3082:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; +3083:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; +3084:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3085:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update I2C error code */ +3086:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; +3087:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3088:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +3089:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +3090:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3091:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +3092:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3093:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3094:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_OK; +3095:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3096:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +3097:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3098:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_BUSY; +3099:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3100:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3101:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3102:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +3103:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Checks if target device is ready for communication. +3104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @note This function is used with Memory devices +3105:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +3106:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +3107:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param DevAddress Target device address: The device 7 bits address value +3108:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * in datasheet must be shifted to the left before calling the interface + ARM GAS /tmp/ccE2rRGE.s page 56 + + +3109:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Trials Number of trials +3110:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Timeout Timeout duration +3111:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status +3112:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +3113:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef HAL_I2C_IsDeviceReady(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Tria +3114:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t Timeout) +3115:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3116:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tickstart; +3117:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3118:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __IO uint32_t I2C_Trials = 0UL; +3119:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3120:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** FlagStatus tmp1; +3121:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** FlagStatus tmp2; +3122:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_READY) +3124:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3125:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) == SET) +3126:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3127:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_BUSY; +3128:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3129:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3130:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Locked */ +3131:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_LOCK(hi2c); +3132:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3133:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_BUSY; +3134:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; +3135:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3136:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** do +3137:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3138:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Generate Start */ +3139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR2 = I2C_GENERATE_START(hi2c->Init.AddressingMode, DevAddress); +3140:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3141:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */ +3142:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Wait until STOPF flag is set or a NACK flag is set*/ +3143:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** tickstart = HAL_GetTick(); +3144:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3145:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF); +3146:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** tmp2 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF); +3147:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3148:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** while ((tmp1 == RESET) && (tmp2 == RESET)) +3149:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3150:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (Timeout != HAL_MAX_DELAY) +3151:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (((HAL_GetTick() - tickstart) > Timeout) || (Timeout == 0U)) +3153:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3154:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update I2C state */ +3155:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; +3156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3157:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update I2C error code */ +3158:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; +3159:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3160:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +3161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +3162:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3163:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +3164:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + ARM GAS /tmp/ccE2rRGE.s page 57 + + +3166:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** tmp1 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF); +3168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** tmp2 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF); +3169:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3171:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Check if the NACKF flag has not been set */ +3172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == RESET) +3173:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3174:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Wait until STOPF flag is reset */ +3175:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_STOPF, RESET, Timeout, tickstart) != HAL_OK) +3176:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3177:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +3178:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3179:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3180:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear STOP Flag */ +3181:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF); +3182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3183:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Device is ready */ +3184:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; +3185:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +3187:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +3188:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_OK; +3190:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3191:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +3192:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3193:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Wait until STOPF flag is reset */ +3194:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_STOPF, RESET, Timeout, tickstart) != HAL_OK) +3195:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3196:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +3197:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3198:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3199:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear NACK Flag */ +3200:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); +3201:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear STOP Flag, auto generated with autoend*/ +3203:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF); +3204:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3205:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3206:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Check if the maximum allowed number of trials has been reached */ +3207:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_Trials == Trials) +3208:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3209:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Generate Stop */ +3210:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR2 |= I2C_CR2_STOP; +3211:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3212:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Wait until STOPF flag is reset */ +3213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_STOPF, RESET, Timeout, tickstart) != HAL_OK) +3214:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3215:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +3216:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3217:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3218:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear STOP Flag */ +3219:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF); +3220:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3221:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3222:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Increment Trials */ + ARM GAS /tmp/ccE2rRGE.s page 58 + + +3223:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Trials++; +3224:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } while (I2C_Trials < Trials); +3225:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3226:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update I2C state */ +3227:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; +3228:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3229:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update I2C error code */ +3230:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; +3231:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3232:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +3233:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +3234:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3235:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +3236:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3237:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +3238:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_BUSY; +3240:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3241:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3242:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3243:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +3244:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Sequential transmit in master I2C mode an amount of data in non-blocking mode with Inte +3245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @note This interface allow to manage repeated start condition when a direction change during +3246:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +3247:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +3248:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param DevAddress Target device address: The device 7 bits address value +3249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * in datasheet must be shifted to the left before calling the interface +3250:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param pData Pointer to data buffer +3251:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Size Amount of data to be sent +3252:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param XferOptions Options of Transfer, value of @ref I2C_XFEROPTIONS +3253:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status +3254:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +3255:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint +3256:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint16_t Size, uint32_t XferOptions) +3257:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3258:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t xfermode; +3259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t xferrequest = I2C_GENERATE_START_WRITE; +3260:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3261:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Check the parameters */ +3262:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); +3263:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3264:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_READY) +3265:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3266:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Locked */ +3267:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_LOCK(hi2c); +3268:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3269:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_BUSY_TX; +3270:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MASTER; +3271:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; +3272:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3273:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prepare transfer parameters */ +3274:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->pBuffPtr = pData; +3275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; +3276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = XferOptions; +3277:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_IT; +3278:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3279:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* If hi2c->XferCount > MAX_NBYTE_SIZE, use reload mode */ + ARM GAS /tmp/ccE2rRGE.s page 59 + + +3280:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferCount > MAX_NBYTE_SIZE) +3281:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3282:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = MAX_NBYTE_SIZE; +3283:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_RELOAD_MODE; +3284:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3285:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +3286:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3287:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; +3288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = hi2c->XferOptions; +3289:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3290:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* If transfer direction not change and there is no request to start another frame, +3292:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** do not generate Restart Condition */ +3293:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Mean Previous state is same as current state */ +3294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((hi2c->PreviousState == I2C_STATE_MASTER_BUSY_TX) && \ +3295:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 0)) +3296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3297:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xferrequest = I2C_NO_STARTSTOP; +3298:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3299:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +3300:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3301:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Convert OTHER_xxx XferOptions if any */ +3302:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_ConvertOtherXferOptions(hi2c); +3303:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3304:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update xfermode accordingly if no reload is necessary */ +3305:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferCount <= MAX_NBYTE_SIZE) +3306:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3307:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = hi2c->XferOptions; +3308:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3309:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3310:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3311:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Send Slave Address and set NBYTES to write */ +3312:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, xferrequest); +3313:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3314:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +3315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +3316:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Note : The I2C interrupts must be enabled after unlocking current process +3318:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** to avoid the risk of I2C interrupt handle execution before current +3319:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** process unlock */ +3320:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT); +3321:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3322:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_OK; +3323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3324:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +3325:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3326:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_BUSY; +3327:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3328:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3329:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3330:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +3331:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Sequential transmit in master I2C mode an amount of data in non-blocking mode with DMA. +3332:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @note This interface allow to manage repeated start condition when a direction change during +3333:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +3334:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +3335:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param DevAddress Target device address: The device 7 bits address value +3336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * in datasheet must be shifted to the left before calling the interface + ARM GAS /tmp/ccE2rRGE.s page 60 + + +3337:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param pData Pointer to data buffer +3338:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Size Amount of data to be sent +3339:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param XferOptions Options of Transfer, value of @ref I2C_XFEROPTIONS +3340:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status +3341:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +3342:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uin +3343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint16_t Size, uint32_t XferOptions) +3344:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3345:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t xfermode; +3346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t xferrequest = I2C_GENERATE_START_WRITE; +3347:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef dmaxferstatus; +3348:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3349:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Check the parameters */ +3350:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); +3351:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3352:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_READY) +3353:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3354:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Locked */ +3355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_LOCK(hi2c); +3356:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3357:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_BUSY_TX; +3358:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MASTER; +3359:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; +3360:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3361:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prepare transfer parameters */ +3362:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->pBuffPtr = pData; +3363:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; +3364:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = XferOptions; +3365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_DMA; +3366:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3367:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* If hi2c->XferCount > MAX_NBYTE_SIZE, use reload mode */ +3368:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferCount > MAX_NBYTE_SIZE) +3369:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3370:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = MAX_NBYTE_SIZE; +3371:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_RELOAD_MODE; +3372:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +3374:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3375:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; +3376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = hi2c->XferOptions; +3377:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3378:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3379:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* If transfer direction not change and there is no request to start another frame, +3380:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** do not generate Restart Condition */ +3381:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Mean Previous state is same as current state */ +3382:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((hi2c->PreviousState == I2C_STATE_MASTER_BUSY_TX) && \ +3383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 0)) +3384:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xferrequest = I2C_NO_STARTSTOP; +3386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3387:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +3388:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3389:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Convert OTHER_xxx XferOptions if any */ +3390:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_ConvertOtherXferOptions(hi2c); +3391:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3392:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update xfermode accordingly if no reload is necessary */ +3393:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferCount <= MAX_NBYTE_SIZE) + ARM GAS /tmp/ccE2rRGE.s page 61 + + +3394:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3395:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = hi2c->XferOptions; +3396:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3397:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3398:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3399:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferSize > 0U) +3400:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->hdmatx != NULL) +3402:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3403:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set the I2C DMA transfer complete callback */ +3404:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmatx->XferCpltCallback = I2C_DMAMasterTransmitCplt; +3405:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3406:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set the DMA error callback */ +3407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmatx->XferErrorCallback = I2C_DMAError; +3408:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3409:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set the unused DMA callbacks to NULL */ +3410:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmatx->XferHalfCpltCallback = NULL; +3411:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmatx->XferAbortCallback = NULL; +3412:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3413:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable the DMA channel */ +3414:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)pData, (uint32_t)&hi2c->Instance-> +3415:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize); +3416:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3417:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +3418:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3419:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update I2C state */ +3420:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; +3421:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; +3422:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3423:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update I2C error code */ +3424:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; +3425:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3426:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +3427:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +3428:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3429:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +3430:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3431:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3432:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (dmaxferstatus == HAL_OK) +3433:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3434:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Send Slave Address and set NBYTES to write */ +3435:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, xferrequest); +3436:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3437:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update XferCount value */ +3438:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount -= hi2c->XferSize; +3439:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3440:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +3441:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +3442:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3443:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Note : The I2C interrupts must be enabled after unlocking current process +3444:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** to avoid the risk of I2C interrupt handle execution before current +3445:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** process unlock */ +3446:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable ERR and NACK interrupts */ +3447:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Enable_IRQ(hi2c, I2C_XFER_ERROR_IT); +3448:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3449:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable DMA Request */ +3450:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR1 |= I2C_CR1_TXDMAEN; + ARM GAS /tmp/ccE2rRGE.s page 62 + + +3451:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3452:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +3453:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3454:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update I2C state */ +3455:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; +3456:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; +3457:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3458:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update I2C error code */ +3459:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; +3460:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3461:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +3462:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +3463:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3464:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +3465:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3466:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3467:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +3468:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3469:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update Transfer ISR function pointer */ +3470:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_IT; +3471:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3472:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Send Slave Address */ +3473:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set NBYTES to write and generate START condition */ +3474:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, +3475:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_GENERATE_START_WRITE); +3476:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3477:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +3478:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +3479:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3480:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Note : The I2C interrupts must be enabled after unlocking current process +3481:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** to avoid the risk of I2C interrupt handle execution before current +3482:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** process unlock */ +3483:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable ERR, TC, STOP, NACK, TXI interrupt */ +3484:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* possible to enable all of these */ +3485:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* I2C_IT_ERRI | I2C_IT_TCI | I2C_IT_STOPI | I2C_IT_NACKI | +3486:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */ +3487:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT); +3488:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3489:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3490:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_OK; +3491:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3492:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +3493:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3494:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_BUSY; +3495:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3496:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3497:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3498:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +3499:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Sequential receive in master I2C mode an amount of data in non-blocking mode with Inter +3500:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @note This interface allow to manage repeated start condition when a direction change during +3501:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +3502:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +3503:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param DevAddress Target device address: The device 7 bits address value +3504:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * in datasheet must be shifted to the left before calling the interface +3505:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param pData Pointer to data buffer +3506:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Size Amount of data to be sent +3507:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param XferOptions Options of Transfer, value of @ref I2C_XFEROPTIONS + ARM GAS /tmp/ccE2rRGE.s page 63 + + +3508:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status +3509:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +3510:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8 +3511:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint16_t Size, uint32_t XferOptions) +3512:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3513:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t xfermode; +3514:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t xferrequest = I2C_GENERATE_START_READ; +3515:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3516:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Check the parameters */ +3517:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); +3518:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3519:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_READY) +3520:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3521:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Locked */ +3522:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_LOCK(hi2c); +3523:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3524:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_BUSY_RX; +3525:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MASTER; +3526:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; +3527:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3528:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prepare transfer parameters */ +3529:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->pBuffPtr = pData; +3530:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; +3531:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = XferOptions; +3532:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_IT; +3533:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3534:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* If hi2c->XferCount > MAX_NBYTE_SIZE, use reload mode */ +3535:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferCount > MAX_NBYTE_SIZE) +3536:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3537:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = MAX_NBYTE_SIZE; +3538:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_RELOAD_MODE; +3539:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3540:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +3541:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3542:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; +3543:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = hi2c->XferOptions; +3544:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3545:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3546:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* If transfer direction not change and there is no request to start another frame, +3547:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** do not generate Restart Condition */ +3548:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Mean Previous state is same as current state */ +3549:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((hi2c->PreviousState == I2C_STATE_MASTER_BUSY_RX) && \ +3550:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 0)) +3551:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3552:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xferrequest = I2C_NO_STARTSTOP; +3553:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3554:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +3555:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3556:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Convert OTHER_xxx XferOptions if any */ +3557:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_ConvertOtherXferOptions(hi2c); +3558:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3559:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update xfermode accordingly if no reload is necessary */ +3560:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferCount <= MAX_NBYTE_SIZE) +3561:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3562:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = hi2c->XferOptions; +3563:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3564:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + ARM GAS /tmp/ccE2rRGE.s page 64 + + +3565:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3566:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Send Slave Address and set NBYTES to read */ +3567:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, xferrequest); +3568:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3569:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +3570:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +3571:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3572:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Note : The I2C interrupts must be enabled after unlocking current process +3573:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** to avoid the risk of I2C interrupt handle execution before current +3574:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** process unlock */ +3575:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Enable_IRQ(hi2c, I2C_XFER_RX_IT); +3576:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3577:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_OK; +3578:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3579:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +3580:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3581:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_BUSY; +3582:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3583:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3584:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3585:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +3586:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Sequential receive in master I2C mode an amount of data in non-blocking mode with DMA +3587:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @note This interface allow to manage repeated start condition when a direction change during +3588:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +3589:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +3590:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param DevAddress Target device address: The device 7 bits address value +3591:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * in datasheet must be shifted to the left before calling the interface +3592:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param pData Pointer to data buffer +3593:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Size Amount of data to be sent +3594:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param XferOptions Options of Transfer, value of @ref I2C_XFEROPTIONS +3595:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status +3596:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +3597:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint +3598:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint16_t Size, uint32_t XferOptions) +3599:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3600:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t xfermode; +3601:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t xferrequest = I2C_GENERATE_START_READ; +3602:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef dmaxferstatus; +3603:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3604:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Check the parameters */ +3605:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); +3606:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3607:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_READY) +3608:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3609:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Locked */ +3610:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_LOCK(hi2c); +3611:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3612:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_BUSY_RX; +3613:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MASTER; +3614:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; +3615:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3616:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prepare transfer parameters */ +3617:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->pBuffPtr = pData; +3618:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; +3619:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = XferOptions; +3620:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_DMA; +3621:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + ARM GAS /tmp/ccE2rRGE.s page 65 + + +3622:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* If hi2c->XferCount > MAX_NBYTE_SIZE, use reload mode */ +3623:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferCount > MAX_NBYTE_SIZE) +3624:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3625:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = MAX_NBYTE_SIZE; +3626:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_RELOAD_MODE; +3627:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3628:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +3629:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3630:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; +3631:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = hi2c->XferOptions; +3632:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3633:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3634:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* If transfer direction not change and there is no request to start another frame, +3635:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** do not generate Restart Condition */ +3636:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Mean Previous state is same as current state */ +3637:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((hi2c->PreviousState == I2C_STATE_MASTER_BUSY_RX) && \ +3638:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 0)) +3639:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3640:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xferrequest = I2C_NO_STARTSTOP; +3641:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3642:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +3643:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3644:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Convert OTHER_xxx XferOptions if any */ +3645:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_ConvertOtherXferOptions(hi2c); +3646:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3647:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update xfermode accordingly if no reload is necessary */ +3648:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferCount <= MAX_NBYTE_SIZE) +3649:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3650:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = hi2c->XferOptions; +3651:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3652:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3653:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3654:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferSize > 0U) +3655:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3656:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->hdmarx != NULL) +3657:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3658:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set the I2C DMA transfer complete callback */ +3659:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmarx->XferCpltCallback = I2C_DMAMasterReceiveCplt; +3660:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3661:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set the DMA error callback */ +3662:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmarx->XferErrorCallback = I2C_DMAError; +3663:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3664:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set the unused DMA callbacks to NULL */ +3665:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmarx->XferHalfCpltCallback = NULL; +3666:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmarx->XferAbortCallback = NULL; +3667:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3668:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable the DMA channel */ +3669:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->RXDR, (uint32_t)p +3670:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize); +3671:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3672:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +3673:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3674:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update I2C state */ +3675:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; +3676:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; +3677:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3678:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update I2C error code */ + ARM GAS /tmp/ccE2rRGE.s page 66 + + +3679:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; +3680:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3681:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +3682:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +3683:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3684:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +3685:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3686:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3687:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (dmaxferstatus == HAL_OK) +3688:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3689:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Send Slave Address and set NBYTES to read */ +3690:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, xfermode, xferrequest); +3691:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3692:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update XferCount value */ +3693:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount -= hi2c->XferSize; +3694:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3695:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +3696:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +3697:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3698:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Note : The I2C interrupts must be enabled after unlocking current process +3699:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** to avoid the risk of I2C interrupt handle execution before current +3700:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** process unlock */ +3701:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable ERR and NACK interrupts */ +3702:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Enable_IRQ(hi2c, I2C_XFER_ERROR_IT); +3703:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3704:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable DMA Request */ +3705:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR1 |= I2C_CR1_RXDMAEN; +3706:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3707:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +3708:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3709:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update I2C state */ +3710:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; +3711:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; +3712:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3713:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update I2C error code */ +3714:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; +3715:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3716:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +3717:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +3718:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3719:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +3720:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3721:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3722:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +3723:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3724:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update Transfer ISR function pointer */ +3725:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_IT; +3726:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3727:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Send Slave Address */ +3728:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set NBYTES to read and generate START condition */ +3729:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, +3730:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_GENERATE_START_READ); +3731:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3732:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +3733:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +3734:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3735:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Note : The I2C interrupts must be enabled after unlocking current process + ARM GAS /tmp/ccE2rRGE.s page 67 + + +3736:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** to avoid the risk of I2C interrupt handle execution before current +3737:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** process unlock */ +3738:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable ERR, TC, STOP, NACK, TXI interrupt */ +3739:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* possible to enable all of these */ +3740:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* I2C_IT_ERRI | I2C_IT_TCI | I2C_IT_STOPI | I2C_IT_NACKI | +3741:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI */ +3742:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT); +3743:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3744:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3745:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_OK; +3746:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3747:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +3748:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3749:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_BUSY; +3750:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3751:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3752:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3753:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +3754:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Sequential transmit in slave/device I2C mode an amount of data in non-blocking mode wit +3755:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @note This interface allow to manage repeated start condition when a direction change during +3756:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +3757:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +3758:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param pData Pointer to data buffer +3759:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Size Amount of data to be sent +3760:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param XferOptions Options of Transfer, value of @ref I2C_XFEROPTIONS +3761:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status +3762:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +3763:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t S +3764:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t XferOptions) +3765:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3766:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Check the parameters */ +3767:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); +3768:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3769:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN) +3770:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3771:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((pData == NULL) || (Size == 0U)) +3772:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3773:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM; +3774:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +3775:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3776:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3777:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable Interrupts, to prevent preemption during treatment in case of multicall */ +3778:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT | I2C_XFER_TX_IT); +3779:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3780:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Locked */ +3781:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_LOCK(hi2c); +3782:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3783:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* I2C cannot manage full duplex exchange so disable previous IT enabled if any */ +3784:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* and then toggle the HAL slave RX state to TX state */ +3785:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_BUSY_RX_LISTEN) +3786:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3787:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable associated Interrupts */ +3788:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Disable_IRQ(hi2c, I2C_XFER_RX_IT); +3789:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3790:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Abort DMA Xfer if any */ +3791:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((hi2c->Instance->CR1 & I2C_CR1_RXDMAEN) == I2C_CR1_RXDMAEN) +3792:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + ARM GAS /tmp/ccE2rRGE.s page 68 + + +3793:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR1 &= ~I2C_CR1_RXDMAEN; +3794:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3795:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->hdmarx != NULL) +3796:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3797:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set the I2C DMA Abort callback : +3798:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */ +3799:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmarx->XferAbortCallback = I2C_DMAAbort; +3800:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3801:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Abort DMA RX */ +3802:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (HAL_DMA_Abort_IT(hi2c->hdmarx) != HAL_OK) +3803:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3804:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call Directly XferAbortCallback function in case of error */ +3805:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmarx->XferAbortCallback(hi2c->hdmarx); +3806:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3807:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3808:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3809:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3810:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3811:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_BUSY_TX_LISTEN; +3812:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_SLAVE; +3813:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; +3814:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3815:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable Address Acknowledge */ +3816:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR2 &= ~I2C_CR2_NACK; +3817:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3818:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prepare transfer parameters */ +3819:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->pBuffPtr = pData; +3820:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; +3821:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; +3822:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = XferOptions; +3823:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Slave_ISR_IT; +3824:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3825:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_GET_DIR(hi2c) == I2C_DIRECTION_RECEIVE) +3826:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3827:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear ADDR flag after prepare the transfer parameters */ +3828:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* This action will generate an acknowledge to the Master */ +3829:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR); +3830:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3831:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3832:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +3833:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +3834:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3835:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Note : The I2C interrupts must be enabled after unlocking current process +3836:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** to avoid the risk of I2C interrupt handle execution before current +3837:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** process unlock */ +3838:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* REnable ADDR interrupt */ +3839:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT | I2C_XFER_LISTEN_IT); +3840:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3841:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_OK; +3842:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3843:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +3844:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3845:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +3846:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3847:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3848:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3849:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** + ARM GAS /tmp/ccE2rRGE.s page 69 + + +3850:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Sequential transmit in slave/device I2C mode an amount of data in non-blocking mode wit +3851:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @note This interface allow to manage repeated start condition when a direction change during +3852:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +3853:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +3854:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param pData Pointer to data buffer +3855:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Size Amount of data to be sent +3856:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param XferOptions Options of Transfer, value of @ref I2C_XFEROPTIONS +3857:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status +3858:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +3859:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t +3860:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t XferOptions) +3861:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3862:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef dmaxferstatus; +3863:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3864:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Check the parameters */ +3865:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); +3866:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3867:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN) +3868:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3869:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((pData == NULL) || (Size == 0U)) +3870:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3871:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM; +3872:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +3873:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3874:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3875:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Locked */ +3876:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_LOCK(hi2c); +3877:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3878:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable Interrupts, to prevent preemption during treatment in case of multicall */ +3879:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT | I2C_XFER_TX_IT); +3880:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3881:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* I2C cannot manage full duplex exchange so disable previous IT enabled if any */ +3882:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* and then toggle the HAL slave RX state to TX state */ +3883:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_BUSY_RX_LISTEN) +3884:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3885:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable associated Interrupts */ +3886:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Disable_IRQ(hi2c, I2C_XFER_RX_IT); +3887:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3888:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((hi2c->Instance->CR1 & I2C_CR1_RXDMAEN) == I2C_CR1_RXDMAEN) +3889:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3890:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Abort DMA Xfer if any */ +3891:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->hdmarx != NULL) +3892:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3893:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR1 &= ~I2C_CR1_RXDMAEN; +3894:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3895:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set the I2C DMA Abort callback : +3896:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */ +3897:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmarx->XferAbortCallback = I2C_DMAAbort; +3898:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3899:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Abort DMA RX */ +3900:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (HAL_DMA_Abort_IT(hi2c->hdmarx) != HAL_OK) +3901:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3902:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call Directly XferAbortCallback function in case of error */ +3903:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmarx->XferAbortCallback(hi2c->hdmarx); +3904:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3905:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3906:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + ARM GAS /tmp/ccE2rRGE.s page 70 + + +3907:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3908:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else if (hi2c->State == HAL_I2C_STATE_BUSY_TX_LISTEN) +3909:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3910:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((hi2c->Instance->CR1 & I2C_CR1_TXDMAEN) == I2C_CR1_TXDMAEN) +3911:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3912:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR1 &= ~I2C_CR1_TXDMAEN; +3913:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3914:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Abort DMA Xfer if any */ +3915:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->hdmatx != NULL) +3916:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3917:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set the I2C DMA Abort callback : +3918:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */ +3919:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmatx->XferAbortCallback = I2C_DMAAbort; +3920:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3921:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Abort DMA TX */ +3922:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (HAL_DMA_Abort_IT(hi2c->hdmatx) != HAL_OK) +3923:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3924:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call Directly XferAbortCallback function in case of error */ +3925:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmatx->XferAbortCallback(hi2c->hdmatx); +3926:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3927:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3928:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3929:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3930:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +3931:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3932:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Nothing to do */ +3933:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3934:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3935:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_BUSY_TX_LISTEN; +3936:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_SLAVE; +3937:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; +3938:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3939:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable Address Acknowledge */ +3940:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR2 &= ~I2C_CR2_NACK; +3941:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3942:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prepare transfer parameters */ +3943:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->pBuffPtr = pData; +3944:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; +3945:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; +3946:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = XferOptions; +3947:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Slave_ISR_DMA; +3948:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3949:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->hdmatx != NULL) +3950:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3951:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set the I2C DMA transfer complete callback */ +3952:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmatx->XferCpltCallback = I2C_DMASlaveTransmitCplt; +3953:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3954:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set the DMA error callback */ +3955:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmatx->XferErrorCallback = I2C_DMAError; +3956:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3957:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set the unused DMA callbacks to NULL */ +3958:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmatx->XferHalfCpltCallback = NULL; +3959:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmatx->XferAbortCallback = NULL; +3960:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3961:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable the DMA channel */ +3962:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)pData, (uint32_t)&hi2c->Instance->TX +3963:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize); + ARM GAS /tmp/ccE2rRGE.s page 71 + + +3964:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3965:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +3966:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3967:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update I2C state */ +3968:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_LISTEN; +3969:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; +3970:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3971:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update I2C error code */ +3972:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; +3973:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3974:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +3975:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +3976:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3977:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +3978:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3979:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3980:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (dmaxferstatus == HAL_OK) +3981:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3982:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update XferCount value */ +3983:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount -= hi2c->XferSize; +3984:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3985:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Reset XferSize */ +3986:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = 0; +3987:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +3988:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +3989:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +3990:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update I2C state */ +3991:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_LISTEN; +3992:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; +3993:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3994:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update I2C error code */ +3995:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; +3996:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +3997:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +3998:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +3999:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4000:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +4001:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4002:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4003:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_GET_DIR(hi2c) == I2C_DIRECTION_RECEIVE) +4004:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4005:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear ADDR flag after prepare the transfer parameters */ +4006:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* This action will generate an acknowledge to the Master */ +4007:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR); +4008:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4009:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4010:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +4011:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +4012:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4013:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Note : The I2C interrupts must be enabled after unlocking current process +4014:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** to avoid the risk of I2C interrupt handle execution before current +4015:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** process unlock */ +4016:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable ERR, STOP, NACK, ADDR interrupts */ +4017:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Enable_IRQ(hi2c, I2C_XFER_LISTEN_IT); +4018:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4019:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable DMA Request */ +4020:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR1 |= I2C_CR1_TXDMAEN; + ARM GAS /tmp/ccE2rRGE.s page 72 + + +4021:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4022:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_OK; +4023:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4024:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +4025:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4026:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +4027:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4028:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4029:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4030:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +4031:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Sequential receive in slave/device I2C mode an amount of data in non-blocking mode with +4032:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @note This interface allow to manage repeated start condition when a direction change during +4033:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +4034:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +4035:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param pData Pointer to data buffer +4036:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Size Amount of data to be sent +4037:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param XferOptions Options of Transfer, value of @ref I2C_XFEROPTIONS +4038:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status +4039:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +4040:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Si +4041:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t XferOptions) +4042:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4043:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Check the parameters */ +4044:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); +4045:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4046:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN) +4047:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4048:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((pData == NULL) || (Size == 0U)) +4049:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4050:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM; +4051:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +4052:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4053:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4054:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable Interrupts, to prevent preemption during treatment in case of multicall */ +4055:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT | I2C_XFER_RX_IT); +4056:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4057:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Locked */ +4058:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_LOCK(hi2c); +4059:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4060:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* I2C cannot manage full duplex exchange so disable previous IT enabled if any */ +4061:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* and then toggle the HAL slave TX state to RX state */ +4062:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_BUSY_TX_LISTEN) +4063:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4064:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable associated Interrupts */ +4065:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Disable_IRQ(hi2c, I2C_XFER_TX_IT); +4066:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4067:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((hi2c->Instance->CR1 & I2C_CR1_TXDMAEN) == I2C_CR1_TXDMAEN) +4068:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4069:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR1 &= ~I2C_CR1_TXDMAEN; +4070:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4071:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Abort DMA Xfer if any */ +4072:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->hdmatx != NULL) +4073:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4074:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set the I2C DMA Abort callback : +4075:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */ +4076:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmatx->XferAbortCallback = I2C_DMAAbort; +4077:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + ARM GAS /tmp/ccE2rRGE.s page 73 + + +4078:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Abort DMA TX */ +4079:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (HAL_DMA_Abort_IT(hi2c->hdmatx) != HAL_OK) +4080:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4081:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call Directly XferAbortCallback function in case of error */ +4082:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmatx->XferAbortCallback(hi2c->hdmatx); +4083:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4084:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4085:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4086:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4087:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4088:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_BUSY_RX_LISTEN; +4089:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_SLAVE; +4090:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; +4091:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4092:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable Address Acknowledge */ +4093:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR2 &= ~I2C_CR2_NACK; +4094:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4095:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prepare transfer parameters */ +4096:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->pBuffPtr = pData; +4097:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; +4098:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; +4099:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = XferOptions; +4100:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Slave_ISR_IT; +4101:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4102:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_GET_DIR(hi2c) == I2C_DIRECTION_TRANSMIT) +4103:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear ADDR flag after prepare the transfer parameters */ +4105:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* This action will generate an acknowledge to the Master */ +4106:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR); +4107:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4108:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4109:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +4110:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +4111:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4112:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Note : The I2C interrupts must be enabled after unlocking current process +4113:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** to avoid the risk of I2C interrupt handle execution before current +4114:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** process unlock */ +4115:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* REnable ADDR interrupt */ +4116:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Enable_IRQ(hi2c, I2C_XFER_RX_IT | I2C_XFER_LISTEN_IT); +4117:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4118:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_OK; +4119:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4120:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +4121:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4122:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +4123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4124:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4125:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4126:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +4127:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Sequential receive in slave/device I2C mode an amount of data in non-blocking mode with +4128:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @note This interface allow to manage repeated start condition when a direction change during +4129:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +4130:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +4131:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param pData Pointer to data buffer +4132:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Size Amount of data to be sent +4133:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param XferOptions Options of Transfer, value of @ref I2C_XFEROPTIONS +4134:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status + ARM GAS /tmp/ccE2rRGE.s page 74 + + +4135:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +4136:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t S +4137:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t XferOptions) +4138:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef dmaxferstatus; +4140:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4141:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Check the parameters */ +4142:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** assert_param(IS_I2C_TRANSFER_OPTIONS_REQUEST(XferOptions)); +4143:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4144:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN) +4145:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4146:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((pData == NULL) || (Size == 0U)) +4147:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4148:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_INVALID_PARAM; +4149:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +4150:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4151:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable Interrupts, to prevent preemption during treatment in case of multicall */ +4153:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT | I2C_XFER_RX_IT); +4154:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4155:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Locked */ +4156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_LOCK(hi2c); +4157:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4158:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* I2C cannot manage full duplex exchange so disable previous IT enabled if any */ +4159:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* and then toggle the HAL slave TX state to RX state */ +4160:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_BUSY_TX_LISTEN) +4161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4162:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable associated Interrupts */ +4163:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Disable_IRQ(hi2c, I2C_XFER_TX_IT); +4164:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((hi2c->Instance->CR1 & I2C_CR1_TXDMAEN) == I2C_CR1_TXDMAEN) +4166:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Abort DMA Xfer if any */ +4168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->hdmatx != NULL) +4169:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR1 &= ~I2C_CR1_TXDMAEN; +4171:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set the I2C DMA Abort callback : +4173:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */ +4174:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmatx->XferAbortCallback = I2C_DMAAbort; +4175:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4176:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Abort DMA TX */ +4177:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (HAL_DMA_Abort_IT(hi2c->hdmatx) != HAL_OK) +4178:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4179:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call Directly XferAbortCallback function in case of error */ +4180:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmatx->XferAbortCallback(hi2c->hdmatx); +4181:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4183:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4184:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4185:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else if (hi2c->State == HAL_I2C_STATE_BUSY_RX_LISTEN) +4186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4187:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((hi2c->Instance->CR1 & I2C_CR1_RXDMAEN) == I2C_CR1_RXDMAEN) +4188:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR1 &= ~I2C_CR1_RXDMAEN; +4190:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4191:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Abort DMA Xfer if any */ + ARM GAS /tmp/ccE2rRGE.s page 75 + + +4192:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->hdmarx != NULL) +4193:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4194:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set the I2C DMA Abort callback : +4195:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */ +4196:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmarx->XferAbortCallback = I2C_DMAAbort; +4197:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4198:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Abort DMA RX */ +4199:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (HAL_DMA_Abort_IT(hi2c->hdmarx) != HAL_OK) +4200:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4201:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call Directly XferAbortCallback function in case of error */ +4202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmarx->XferAbortCallback(hi2c->hdmarx); +4203:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4204:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4205:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4206:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4207:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +4208:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4209:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Nothing to do */ +4210:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4211:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4212:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_BUSY_RX_LISTEN; +4213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_SLAVE; +4214:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; +4215:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4216:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable Address Acknowledge */ +4217:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR2 &= ~I2C_CR2_NACK; +4218:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4219:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prepare transfer parameters */ +4220:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->pBuffPtr = pData; +4221:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; +4222:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; +4223:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = XferOptions; +4224:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Slave_ISR_DMA; +4225:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4226:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->hdmarx != NULL) +4227:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4228:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set the I2C DMA transfer complete callback */ +4229:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmarx->XferCpltCallback = I2C_DMASlaveReceiveCplt; +4230:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4231:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set the DMA error callback */ +4232:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmarx->XferErrorCallback = I2C_DMAError; +4233:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4234:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set the unused DMA callbacks to NULL */ +4235:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmarx->XferHalfCpltCallback = NULL; +4236:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmarx->XferAbortCallback = NULL; +4237:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4238:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable the DMA channel */ +4239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** dmaxferstatus = HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->RXDR, +4240:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (uint32_t)pData, hi2c->XferSize); +4241:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4242:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +4243:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4244:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update I2C state */ +4245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_LISTEN; +4246:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; +4247:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4248:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update I2C error code */ + ARM GAS /tmp/ccE2rRGE.s page 76 + + +4249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_DMA_PARAM; +4250:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4251:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +4252:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +4253:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4254:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +4255:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4256:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4257:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (dmaxferstatus == HAL_OK) +4258:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update XferCount value */ +4260:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount -= hi2c->XferSize; +4261:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4262:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Reset XferSize */ +4263:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = 0; +4264:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4265:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +4266:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4267:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update I2C state */ +4268:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_LISTEN; +4269:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; +4270:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4271:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update I2C error code */ +4272:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_DMA; +4273:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4274:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +4275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +4276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4277:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +4278:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4279:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4280:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_GET_DIR(hi2c) == I2C_DIRECTION_TRANSMIT) +4281:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4282:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear ADDR flag after prepare the transfer parameters */ +4283:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* This action will generate an acknowledge to the Master */ +4284:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR); +4285:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4286:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4287:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +4288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +4289:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4290:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Note : The I2C interrupts must be enabled after unlocking current process +4291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** to avoid the risk of I2C interrupt handle execution before current +4292:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** process unlock */ +4293:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* REnable ADDR interrupt */ +4294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Enable_IRQ(hi2c, I2C_XFER_RX_IT | I2C_XFER_LISTEN_IT); +4295:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable DMA Request */ +4297:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR1 |= I2C_CR1_RXDMAEN; +4298:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4299:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_OK; +4300:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4301:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +4302:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4303:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +4304:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4305:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + ARM GAS /tmp/ccE2rRGE.s page 77 + + +4306:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4307:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +4308:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Enable the Address listen mode with Interrupt. +4309:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +4310:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +4311:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status +4312:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +4313:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef HAL_I2C_EnableListen_IT(I2C_HandleTypeDef *hi2c) +4314:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_READY) +4316:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_LISTEN; +4318:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Slave_ISR_IT; +4319:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4320:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable the Address Match interrupt */ +4321:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Enable_IRQ(hi2c, I2C_XFER_LISTEN_IT); +4322:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_OK; +4324:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4325:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +4326:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4327:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_BUSY; +4328:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4329:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4330:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4331:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +4332:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Disable the Address listen mode with Interrupt. +4333:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +4334:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C +4335:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status +4336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +4337:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef HAL_I2C_DisableListen_IT(I2C_HandleTypeDef *hi2c) +4338:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4339:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Declaration of tmp to prevent undefined behavior of volatile usage */ +4340:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tmp; +4341:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4342:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable Address listen mode only if a transfer is not ongoing */ +4343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_LISTEN) +4344:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4345:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** tmp = (uint32_t)(hi2c->State) & I2C_STATE_MSK; +4346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = tmp | (uint32_t)(hi2c->Mode); +4347:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; +4348:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; +4349:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = NULL; +4350:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4351:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable the Address Match interrupt */ +4352:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT); +4353:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4354:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_OK; +4355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4356:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +4357:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4358:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_BUSY; +4359:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4360:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4361:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4362:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** + ARM GAS /tmp/ccE2rRGE.s page 78 + + +4363:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Abort a master I2C IT or DMA process communication with Interrupt. +4364:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +4365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +4366:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param DevAddress Target device address: The device 7 bits address value +4367:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * in datasheet must be shifted to the left before calling the interface +4368:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status +4369:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +4370:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef HAL_I2C_Master_Abort_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress) +4371:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4372:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->Mode == HAL_I2C_MODE_MASTER) +4373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4374:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Locked */ +4375:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_LOCK(hi2c); +4376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4377:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable Interrupts and Store Previous state */ +4378:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_BUSY_TX) +4379:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4380:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Disable_IRQ(hi2c, I2C_XFER_TX_IT); +4381:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_MASTER_BUSY_TX; +4382:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else if (hi2c->State == HAL_I2C_STATE_BUSY_RX) +4384:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Disable_IRQ(hi2c, I2C_XFER_RX_IT); +4386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_MASTER_BUSY_RX; +4387:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4388:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +4389:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4390:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Do nothing */ +4391:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4392:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4393:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set State at HAL_I2C_STATE_ABORT */ +4394:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_ABORT; +4395:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4396:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set NBYTES to 1 to generate a dummy read on I2C peripheral */ +4397:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set AUTOEND mode, this will generate a NACK then STOP condition to abort the current transfe +4398:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, 1, I2C_AUTOEND_MODE, I2C_GENERATE_STOP); +4399:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4400:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +4401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +4402:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4403:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Note : The I2C interrupts must be enabled after unlocking current process +4404:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** to avoid the risk of I2C interrupt handle execution before current +4405:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** process unlock */ +4406:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Enable_IRQ(hi2c, I2C_XFER_CPLT_IT); +4407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4408:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_OK; +4409:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4410:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +4411:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4412:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Wrong usage of abort function */ +4413:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* This function should be used only in case of abort monitored by master device */ +4414:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +4415:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4416:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4417:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4418:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +4419:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @} + ARM GAS /tmp/ccE2rRGE.s page 79 + + +4420:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +4421:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4422:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** @defgroup I2C_IRQ_Handler_and_Callbacks IRQ Handler and Callbacks +4423:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @{ +4424:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +4425:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4426:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +4427:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief This function handles I2C event interrupt request. +4428:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +4429:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +4430:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval None +4431:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +4432:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** void HAL_I2C_EV_IRQHandler(I2C_HandleTypeDef *hi2c) +4433:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4434:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Get current IT Flags and IT sources value */ +4435:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t itflags = READ_REG(hi2c->Instance->ISR); +4436:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t itsources = READ_REG(hi2c->Instance->CR1); +4437:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4438:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* I2C events treatment -------------------------------------*/ +4439:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferISR != NULL) +4440:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4441:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR(hi2c, itflags, itsources); +4442:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4443:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4444:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4445:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +4446:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief This function handles I2C error interrupt request. +4447:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +4448:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +4449:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval None +4450:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +4451:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** void HAL_I2C_ER_IRQHandler(I2C_HandleTypeDef *hi2c) +4452:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4453:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t itflags = READ_REG(hi2c->Instance->ISR); +4454:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t itsources = READ_REG(hi2c->Instance->CR1); +4455:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tmperror; +4456:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4457:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* I2C Bus error interrupt occurred ------------------------------------*/ +4458:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((I2C_CHECK_FLAG(itflags, I2C_FLAG_BERR) != RESET) && \ +4459:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERRI) != RESET)) +4460:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4461:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_BERR; +4462:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4463:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear BERR flag */ +4464:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_BERR); +4465:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4466:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4467:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* I2C Over-Run/Under-Run interrupt occurred ----------------------------------------*/ +4468:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((I2C_CHECK_FLAG(itflags, I2C_FLAG_OVR) != RESET) && \ +4469:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERRI) != RESET)) +4470:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4471:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_OVR; +4472:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4473:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear OVR flag */ +4474:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_OVR); +4475:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4476:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + ARM GAS /tmp/ccE2rRGE.s page 80 + + +4477:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* I2C Arbitration Loss error interrupt occurred -------------------------------------*/ +4478:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((I2C_CHECK_FLAG(itflags, I2C_FLAG_ARLO) != RESET) && \ +4479:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERRI) != RESET)) +4480:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4481:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_ARLO; +4482:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4483:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear ARLO flag */ +4484:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ARLO); +4485:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4486:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4487:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Store current volatile hi2c->ErrorCode, misra rule */ +4488:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** tmperror = hi2c->ErrorCode; +4489:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4490:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call the Error Callback in case of Error detected */ +4491:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((tmperror & (HAL_I2C_ERROR_BERR | HAL_I2C_ERROR_OVR | HAL_I2C_ERROR_ARLO)) != HAL_I2C_ERROR_ +4492:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4493:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_ITError(hi2c, tmperror); +4494:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4495:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4496:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4497:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +4498:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Master Tx Transfer completed callback. +4499:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +4500:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +4501:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval None +4502:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +4503:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __weak void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c) +4504:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4505:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prevent unused argument(s) compilation warning */ +4506:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** UNUSED(hi2c); +4507:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4508:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* NOTE : This function should not be modified, when the callback is needed, +4509:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** the HAL_I2C_MasterTxCpltCallback could be implemented in the user file +4510:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +4511:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4512:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4513:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +4514:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Master Rx Transfer completed callback. +4515:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +4516:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +4517:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval None +4518:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +4519:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __weak void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c) +4520:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4521:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prevent unused argument(s) compilation warning */ +4522:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** UNUSED(hi2c); +4523:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4524:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* NOTE : This function should not be modified, when the callback is needed, +4525:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** the HAL_I2C_MasterRxCpltCallback could be implemented in the user file +4526:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +4527:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4528:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4529:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** @brief Slave Tx Transfer completed callback. +4530:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +4531:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +4532:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval None +4533:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ + ARM GAS /tmp/ccE2rRGE.s page 81 + + +4534:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __weak void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c) +4535:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4536:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prevent unused argument(s) compilation warning */ +4537:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** UNUSED(hi2c); +4538:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4539:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* NOTE : This function should not be modified, when the callback is needed, +4540:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** the HAL_I2C_SlaveTxCpltCallback could be implemented in the user file +4541:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +4542:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4543:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4544:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +4545:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Slave Rx Transfer completed callback. +4546:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +4547:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +4548:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval None +4549:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +4550:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __weak void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c) +4551:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4552:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prevent unused argument(s) compilation warning */ +4553:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** UNUSED(hi2c); +4554:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4555:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* NOTE : This function should not be modified, when the callback is needed, +4556:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** the HAL_I2C_SlaveRxCpltCallback could be implemented in the user file +4557:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +4558:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4559:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4560:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +4561:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Slave Address Match callback. +4562:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +4563:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +4564:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param TransferDirection Master request Transfer Direction (Write/Read), value of @ref I2C_XFE +4565:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param AddrMatchCode Address Match Code +4566:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval None +4567:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +4568:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __weak void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrM +4569:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4570:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prevent unused argument(s) compilation warning */ +4571:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** UNUSED(hi2c); +4572:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** UNUSED(TransferDirection); +4573:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** UNUSED(AddrMatchCode); +4574:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4575:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* NOTE : This function should not be modified, when the callback is needed, +4576:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** the HAL_I2C_AddrCallback() could be implemented in the user file +4577:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +4578:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4579:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4580:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +4581:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Listen Complete callback. +4582:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +4583:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +4584:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval None +4585:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +4586:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __weak void HAL_I2C_ListenCpltCallback(I2C_HandleTypeDef *hi2c) +4587:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4588:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prevent unused argument(s) compilation warning */ +4589:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** UNUSED(hi2c); +4590:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + ARM GAS /tmp/ccE2rRGE.s page 82 + + +4591:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* NOTE : This function should not be modified, when the callback is needed, +4592:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** the HAL_I2C_ListenCpltCallback() could be implemented in the user file +4593:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +4594:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4595:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4596:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +4597:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Memory Tx Transfer completed callback. +4598:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +4599:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +4600:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval None +4601:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +4602:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __weak void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c) +4603:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4604:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prevent unused argument(s) compilation warning */ +4605:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** UNUSED(hi2c); +4606:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4607:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* NOTE : This function should not be modified, when the callback is needed, +4608:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** the HAL_I2C_MemTxCpltCallback could be implemented in the user file +4609:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +4610:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4611:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4612:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +4613:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Memory Rx Transfer completed callback. +4614:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +4615:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +4616:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval None +4617:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +4618:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __weak void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c) +4619:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4620:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prevent unused argument(s) compilation warning */ +4621:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** UNUSED(hi2c); +4622:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4623:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* NOTE : This function should not be modified, when the callback is needed, +4624:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** the HAL_I2C_MemRxCpltCallback could be implemented in the user file +4625:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +4626:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4627:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4628:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +4629:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief I2C error callback. +4630:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +4631:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +4632:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval None +4633:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +4634:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __weak void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c) +4635:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4636:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prevent unused argument(s) compilation warning */ +4637:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** UNUSED(hi2c); +4638:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4639:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* NOTE : This function should not be modified, when the callback is needed, +4640:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** the HAL_I2C_ErrorCallback could be implemented in the user file +4641:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +4642:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4643:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4644:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +4645:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief I2C abort callback. +4646:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +4647:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. + ARM GAS /tmp/ccE2rRGE.s page 83 + + +4648:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval None +4649:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +4650:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __weak void HAL_I2C_AbortCpltCallback(I2C_HandleTypeDef *hi2c) +4651:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4652:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prevent unused argument(s) compilation warning */ +4653:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** UNUSED(hi2c); +4654:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4655:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* NOTE : This function should not be modified, when the callback is needed, +4656:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** the HAL_I2C_AbortCpltCallback could be implemented in the user file +4657:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +4658:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4659:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4660:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +4661:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @} +4662:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +4663:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4664:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** @defgroup I2C_Exported_Functions_Group3 Peripheral State, Mode and Error functions +4665:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Peripheral State, Mode and Error functions +4666:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * +4667:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** @verbatim +4668:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** =============================================================================== +4669:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** ##### Peripheral State, Mode and Error functions ##### +4670:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** =============================================================================== +4671:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** [..] +4672:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** This subsection permit to get in run-time the status of the peripheral +4673:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** and the data flow. +4674:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4675:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** @endverbatim +4676:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @{ +4677:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +4678:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4679:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +4680:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Return the I2C handle state. +4681:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +4682:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +4683:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL state +4684:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +4685:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_StateTypeDef HAL_I2C_GetState(I2C_HandleTypeDef *hi2c) +4686:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4687:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Return I2C handle state */ +4688:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return hi2c->State; +4689:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4690:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4691:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +4692:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Returns the I2C Master, Slave, Memory or no mode. +4693:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +4694:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for I2C module +4695:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL mode +4696:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +4697:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_ModeTypeDef HAL_I2C_GetMode(I2C_HandleTypeDef *hi2c) +4698:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4699:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return hi2c->Mode; +4700:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4701:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4702:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +4703:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Return the I2C error code. +4704:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + ARM GAS /tmp/ccE2rRGE.s page 84 + + +4705:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +4706:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval I2C Error Code +4707:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +4708:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t HAL_I2C_GetError(I2C_HandleTypeDef *hi2c) +4709:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4710:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return hi2c->ErrorCode; +4711:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4712:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4713:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +4714:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @} +4715:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +4716:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4717:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +4718:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @} +4719:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +4720:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4721:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** @addtogroup I2C_Private_Functions +4722:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @{ +4723:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +4724:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4725:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +4726:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Interrupt Sub-Routine which handle the Interrupt Flags Master Mode with Interrupt. +4727:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +4728:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +4729:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param ITFlags Interrupt flags to handle. +4730:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param ITSources Interrupt sources enabled. +4731:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status +4732:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +4733:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static HAL_StatusTypeDef I2C_Master_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, +4734:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t ITSources) +4735:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4736:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint16_t devaddress; +4737:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tmpITFlags = ITFlags; +4738:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4739:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Locked */ +4740:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_LOCK(hi2c); +4741:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4742:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_AF) != RESET) && \ +4743:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET)) +4744:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4745:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear NACK Flag */ +4746:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); +4747:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4748:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set corresponding Error Code */ +4749:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* No need to generate STOP, it is automatically done */ +4750:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Error callback will be send during stop flag treatment */ +4751:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_AF; +4752:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4753:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Flush TX register */ +4754:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Flush_TXDR(hi2c); +4755:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4756:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_RXNE) != RESET) && \ +4757:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_RXI) != RESET)) +4758:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4759:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Remove RXNE flag on temporary variable as read done */ +4760:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** tmpITFlags &= ~I2C_FLAG_RXNE; +4761:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + ARM GAS /tmp/ccE2rRGE.s page 85 + + +4762:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Read data from RXDR */ +4763:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR; +4764:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4765:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Increment Buffer pointer */ +4766:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->pBuffPtr++; +4767:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4768:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize--; +4769:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount--; +4770:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4771:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_TXIS) != RESET) && \ +4772:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TXI) != RESET)) +4773:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4774:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Write data to TXDR */ +4775:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->TXDR = *hi2c->pBuffPtr; +4776:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4777:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Increment Buffer pointer */ +4778:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->pBuffPtr++; +4779:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4780:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize--; +4781:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount--; +4782:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4783:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_TCR) != RESET) && \ +4784:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TCI) != RESET)) +4785:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4786:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((hi2c->XferCount != 0U) && (hi2c->XferSize == 0U)) +4787:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4788:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** devaddress = (uint16_t)(hi2c->Instance->CR2 & I2C_CR2_SADD); +4789:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4790:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferCount > MAX_NBYTE_SIZE) +4791:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4792:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = MAX_NBYTE_SIZE; +4793:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, devaddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, I2C_NO_START +4794:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4795:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +4796:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4797:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; +4798:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferOptions != I2C_NO_OPTION_FRAME) +4799:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4800:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, devaddress, (uint8_t)hi2c->XferSize, +4801:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions, I2C_NO_STARTSTOP); +4802:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4803:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +4804:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4805:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, devaddress, (uint8_t)hi2c->XferSize, +4806:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_AUTOEND_MODE, I2C_NO_STARTSTOP); +4807:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4808:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4809:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4810:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +4811:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4812:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call TxCpltCallback() if no stop mode is set */ +4813:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_GET_STOP_MODE(hi2c) != I2C_AUTOEND_MODE) +4814:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4815:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call I2C Master Sequential complete process */ +4816:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_ITMasterSeqCplt(hi2c); +4817:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4818:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else + ARM GAS /tmp/ccE2rRGE.s page 86 + + +4819:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4820:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Wrong size Status regarding TCR flag event */ +4821:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call the corresponding callback to inform upper layer of End of Transfer */ +4822:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_ITError(hi2c, HAL_I2C_ERROR_SIZE); +4823:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4824:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4825:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4826:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_TC) != RESET) && \ +4827:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TCI) != RESET)) +4828:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4829:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferCount == 0U) +4830:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4831:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_GET_STOP_MODE(hi2c) != I2C_AUTOEND_MODE) +4832:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4833:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Generate a stop condition in case of no transfer option */ +4834:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferOptions == I2C_NO_OPTION_FRAME) +4835:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4836:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Generate Stop */ +4837:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR2 |= I2C_CR2_STOP; +4838:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4839:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +4840:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4841:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call I2C Master Sequential complete process */ +4842:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_ITMasterSeqCplt(hi2c); +4843:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4844:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4845:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4846:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +4847:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4848:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Wrong size Status regarding TC flag event */ +4849:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call the corresponding callback to inform upper layer of End of Transfer */ +4850:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_ITError(hi2c, HAL_I2C_ERROR_SIZE); +4851:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4852:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4853:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +4854:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4855:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Nothing to do */ +4856:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4857:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4858:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_STOPF) != RESET) && \ +4859:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) +4860:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4861:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call I2C Master complete process */ +4862:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_ITMasterCplt(hi2c, tmpITFlags); +4863:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4864:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4865:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +4866:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +4867:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4868:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_OK; +4869:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4870:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4871:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +4872:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Interrupt Sub-Routine which handle the Interrupt Flags Slave Mode with Interrupt. +4873:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +4874:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +4875:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param ITFlags Interrupt flags to handle. + ARM GAS /tmp/ccE2rRGE.s page 87 + + +4876:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param ITSources Interrupt sources enabled. +4877:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status +4878:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +4879:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static HAL_StatusTypeDef I2C_Slave_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, +4880:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t ITSources) +4881:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4882:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tmpoptions = hi2c->XferOptions; +4883:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tmpITFlags = ITFlags; +4884:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4885:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process locked */ +4886:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_LOCK(hi2c); +4887:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4888:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Check if STOPF is set */ +4889:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_STOPF) != RESET) && \ +4890:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) +4891:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4892:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call I2C Slave complete process */ +4893:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_ITSlaveCplt(hi2c, tmpITFlags); +4894:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4895:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4896:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_AF) != RESET) && \ +4897:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET)) +4898:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4899:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Check that I2C transfer finished */ +4900:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* if yes, normal use case, a NACK is sent by the MASTER when Transfer is finished */ +4901:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Mean XferCount == 0*/ +4902:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* So clear Flag NACKF only */ +4903:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferCount == 0U) +4904:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4905:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((hi2c->State == HAL_I2C_STATE_LISTEN) && (tmpoptions == I2C_FIRST_AND_LAST_FRAME)) +4906:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Same action must be done for (tmpoptions == I2C_LAST_FRAME) which removed for +4907:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** Warning[Pa134]: left and right operands are identical */ +4908:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4909:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call I2C Listen complete process */ +4910:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_ITListenCplt(hi2c, tmpITFlags); +4911:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4912:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else if ((hi2c->State == HAL_I2C_STATE_BUSY_TX_LISTEN) && (tmpoptions != I2C_NO_OPTION_FRAME) +4913:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4914:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear NACK Flag */ +4915:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); +4916:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4917:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Flush TX register */ +4918:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Flush_TXDR(hi2c); +4919:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4920:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Last Byte is Transmitted */ +4921:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call I2C Slave Sequential complete process */ +4922:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_ITSlaveSeqCplt(hi2c); +4923:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4924:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +4925:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4926:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear NACK Flag */ +4927:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); +4928:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4929:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4930:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +4931:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4932:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* if no, error use case, a Non-Acknowledge of last Data is generated by the MASTER*/ + ARM GAS /tmp/ccE2rRGE.s page 88 + + +4933:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear NACK Flag */ +4934:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); +4935:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4936:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set ErrorCode corresponding to a Non-Acknowledge */ +4937:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_AF; +4938:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4939:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((tmpoptions == I2C_FIRST_FRAME) || (tmpoptions == I2C_NEXT_FRAME)) +4940:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4941:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call the corresponding callback to inform upper layer of End of Transfer */ +4942:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_ITError(hi2c, hi2c->ErrorCode); +4943:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4944:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4945:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4946:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_RXNE) != RESET) && \ +4947:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_RXI) != RESET)) +4948:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4949:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferCount > 0U) +4950:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4951:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Read data from RXDR */ +4952:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR; +4953:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4954:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Increment Buffer pointer */ +4955:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->pBuffPtr++; +4956:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4957:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize--; +4958:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount--; +4959:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4960:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4961:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((hi2c->XferCount == 0U) && \ +4962:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (tmpoptions != I2C_NO_OPTION_FRAME)) +4963:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4964:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call I2C Slave Sequential complete process */ +4965:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_ITSlaveSeqCplt(hi2c); +4966:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4967:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4968:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_ADDR) != RESET) && \ +4969:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_ADDRI) != RESET)) +4970:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4971:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_ITAddrCplt(hi2c, tmpITFlags); +4972:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4973:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_TXIS) != RESET) && \ +4974:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TXI) != RESET)) +4975:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4976:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Write data to TXDR only if XferCount not reach "0" */ +4977:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* A TXIS flag can be set, during STOP treatment */ +4978:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Check if all Data have already been sent */ +4979:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* If it is the case, this last write in TXDR is not sent, correspond to a dummy TXIS event */ +4980:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferCount > 0U) +4981:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4982:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Write data to TXDR */ +4983:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->TXDR = *hi2c->pBuffPtr; +4984:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4985:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Increment Buffer pointer */ +4986:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->pBuffPtr++; +4987:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +4988:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount--; +4989:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize--; + ARM GAS /tmp/ccE2rRGE.s page 89 + + +4990:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4991:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +4992:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4993:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((tmpoptions == I2C_NEXT_FRAME) || (tmpoptions == I2C_FIRST_FRAME)) +4994:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +4995:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Last Byte is Transmitted */ +4996:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call I2C Slave Sequential complete process */ +4997:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_ITSlaveSeqCplt(hi2c); +4998:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +4999:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5000:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5001:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +5002:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5003:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Nothing to do */ +5004:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5005:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5006:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +5007:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +5008:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5009:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_OK; +5010:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5011:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5012:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +5013:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Interrupt Sub-Routine which handle the Interrupt Flags Master Mode with DMA. +5014:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +5015:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +5016:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param ITFlags Interrupt flags to handle. +5017:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param ITSources Interrupt sources enabled. +5018:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status +5019:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +5020:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static HAL_StatusTypeDef I2C_Master_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, +5021:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t ITSources) +5022:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5023:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint16_t devaddress; +5024:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t xfermode; +5025:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5026:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Locked */ +5027:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_LOCK(hi2c); +5028:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5029:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_AF) != RESET) && \ +5030:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET)) +5031:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5032:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear NACK Flag */ +5033:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); +5034:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5035:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set corresponding Error Code */ +5036:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_AF; +5037:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5038:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* No need to generate STOP, it is automatically done */ +5039:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* But enable STOP interrupt, to treat it */ +5040:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Error callback will be send during stop flag treatment */ +5041:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Enable_IRQ(hi2c, I2C_XFER_CPLT_IT); +5042:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5043:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Flush TX register */ +5044:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Flush_TXDR(hi2c); +5045:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5046:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_TCR) != RESET) && \ + ARM GAS /tmp/ccE2rRGE.s page 90 + + +5047:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TCI) != RESET)) +5048:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5049:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable TC interrupt */ +5050:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_DISABLE_IT(hi2c, I2C_IT_TCI); +5051:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5052:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferCount != 0U) +5053:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5054:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Recover Slave address */ +5055:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** devaddress = (uint16_t)(hi2c->Instance->CR2 & I2C_CR2_SADD); +5056:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5057:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prepare the new XferSize to transfer */ +5058:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferCount > MAX_NBYTE_SIZE) +5059:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5060:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = MAX_NBYTE_SIZE; +5061:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_RELOAD_MODE; +5062:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5063:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +5064:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5065:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; +5066:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferOptions != I2C_NO_OPTION_FRAME) +5067:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5068:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = hi2c->XferOptions; +5069:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5070:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +5071:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5072:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_AUTOEND_MODE; +5073:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5074:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5075:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5076:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set the new XferSize in Nbytes register */ +5077:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, devaddress, (uint8_t)hi2c->XferSize, xfermode, I2C_NO_STARTSTOP); +5078:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5079:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update XferCount value */ +5080:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount -= hi2c->XferSize; +5081:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5082:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable DMA Request */ +5083:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_BUSY_RX) +5084:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5085:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR1 |= I2C_CR1_RXDMAEN; +5086:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5087:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +5088:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5089:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR1 |= I2C_CR1_TXDMAEN; +5090:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5091:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5092:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +5093:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5094:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call TxCpltCallback() if no stop mode is set */ +5095:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_GET_STOP_MODE(hi2c) != I2C_AUTOEND_MODE) +5096:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5097:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call I2C Master Sequential complete process */ +5098:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_ITMasterSeqCplt(hi2c); +5099:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5100:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +5101:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5102:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Wrong size Status regarding TCR flag event */ +5103:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call the corresponding callback to inform upper layer of End of Transfer */ + ARM GAS /tmp/ccE2rRGE.s page 91 + + +5104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_ITError(hi2c, HAL_I2C_ERROR_SIZE); +5105:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5106:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5107:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5108:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_TC) != RESET) && \ +5109:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TCI) != RESET)) +5110:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5111:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferCount == 0U) +5112:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5113:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_GET_STOP_MODE(hi2c) != I2C_AUTOEND_MODE) +5114:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5115:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Generate a stop condition in case of no transfer option */ +5116:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferOptions == I2C_NO_OPTION_FRAME) +5117:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5118:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Generate Stop */ +5119:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR2 |= I2C_CR2_STOP; +5120:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5121:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +5122:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call I2C Master Sequential complete process */ +5124:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_ITMasterSeqCplt(hi2c); +5125:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5126:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5127:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5128:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +5129:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5130:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Wrong size Status regarding TC flag event */ +5131:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call the corresponding callback to inform upper layer of End of Transfer */ +5132:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_ITError(hi2c, HAL_I2C_ERROR_SIZE); +5133:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5134:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5135:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_STOPF) != RESET) && \ +5136:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) +5137:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5138:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call I2C Master complete process */ +5139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_ITMasterCplt(hi2c, ITFlags); +5140:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5141:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +5142:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5143:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Nothing to do */ +5144:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5145:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5146:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +5147:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +5148:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5149:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_OK; +5150:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5151:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +5153:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Interrupt Sub-Routine which handle the Interrupt Flags Slave Mode with DMA. +5154:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +5155:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +5156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param ITFlags Interrupt flags to handle. +5157:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param ITSources Interrupt sources enabled. +5158:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status +5159:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +5160:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static HAL_StatusTypeDef I2C_Slave_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, + ARM GAS /tmp/ccE2rRGE.s page 92 + + +5161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t ITSources) +5162:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5163:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tmpoptions = hi2c->XferOptions; +5164:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t treatdmanack = 0U; +5165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_StateTypeDef tmpstate; +5166:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process locked */ +5168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_LOCK(hi2c); +5169:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Check if STOPF is set */ +5171:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_STOPF) != RESET) && \ +5172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) +5173:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5174:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call I2C Slave complete process */ +5175:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_ITSlaveCplt(hi2c, ITFlags); +5176:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5177:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5178:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_AF) != RESET) && \ +5179:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET)) +5180:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5181:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Check that I2C transfer finished */ +5182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* if yes, normal use case, a NACK is sent by the MASTER when Transfer is finished */ +5183:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Mean XferCount == 0 */ +5184:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* So clear Flag NACKF only */ +5185:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((I2C_CHECK_IT_SOURCE(ITSources, I2C_CR1_TXDMAEN) != RESET) || +5186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_CR1_RXDMAEN) != RESET)) +5187:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5188:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Split check of hdmarx, for MISRA compliance */ +5189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->hdmarx != NULL) +5190:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5191:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_CHECK_IT_SOURCE(ITSources, I2C_CR1_RXDMAEN) != RESET) +5192:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5193:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (__HAL_DMA_GET_COUNTER(hi2c->hdmarx) == 0U) +5194:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5195:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** treatdmanack = 1U; +5196:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5197:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5198:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5199:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5200:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Split check of hdmatx, for MISRA compliance */ +5201:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->hdmatx != NULL) +5202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5203:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_CHECK_IT_SOURCE(ITSources, I2C_CR1_TXDMAEN) != RESET) +5204:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5205:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (__HAL_DMA_GET_COUNTER(hi2c->hdmatx) == 0U) +5206:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5207:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** treatdmanack = 1U; +5208:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5209:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5210:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5211:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5212:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (treatdmanack == 1U) +5213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5214:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((hi2c->State == HAL_I2C_STATE_LISTEN) && (tmpoptions == I2C_FIRST_AND_LAST_FRAME)) +5215:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Same action must be done for (tmpoptions == I2C_LAST_FRAME) which removed for +5216:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** Warning[Pa134]: left and right operands are identical */ +5217:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + ARM GAS /tmp/ccE2rRGE.s page 93 + + +5218:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call I2C Listen complete process */ +5219:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_ITListenCplt(hi2c, ITFlags); +5220:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5221:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else if ((hi2c->State == HAL_I2C_STATE_BUSY_TX_LISTEN) && (tmpoptions != I2C_NO_OPTION_FRAM +5222:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5223:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear NACK Flag */ +5224:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); +5225:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5226:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Flush TX register */ +5227:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Flush_TXDR(hi2c); +5228:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5229:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Last Byte is Transmitted */ +5230:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call I2C Slave Sequential complete process */ +5231:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_ITSlaveSeqCplt(hi2c); +5232:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5233:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +5234:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5235:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear NACK Flag */ +5236:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); +5237:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5238:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +5240:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5241:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* if no, error use case, a Non-Acknowledge of last Data is generated by the MASTER*/ +5242:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear NACK Flag */ +5243:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); +5244:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set ErrorCode corresponding to a Non-Acknowledge */ +5246:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_AF; +5247:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5248:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Store current hi2c->State, solve MISRA2012-Rule-13.5 */ +5249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** tmpstate = hi2c->State; +5250:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5251:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((tmpoptions == I2C_FIRST_FRAME) || (tmpoptions == I2C_NEXT_FRAME)) +5252:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5253:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((tmpstate == HAL_I2C_STATE_BUSY_TX) || (tmpstate == HAL_I2C_STATE_BUSY_TX_LISTEN)) +5254:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5255:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_TX; +5256:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5257:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else if ((tmpstate == HAL_I2C_STATE_BUSY_RX) || (tmpstate == HAL_I2C_STATE_BUSY_RX_LISTEN +5258:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_RX; +5260:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5261:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +5262:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5263:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Do nothing */ +5264:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5265:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5266:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call the corresponding callback to inform upper layer of End of Transfer */ +5267:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_ITError(hi2c, hi2c->ErrorCode); +5268:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5269:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5270:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5271:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +5272:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5273:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Only Clear NACK Flag, no DMA treatment is pending */ +5274:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); + ARM GAS /tmp/ccE2rRGE.s page 94 + + +5275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5277:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_ADDR) != RESET) && \ +5278:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_ADDRI) != RESET)) +5279:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5280:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_ITAddrCplt(hi2c, ITFlags); +5281:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5282:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +5283:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5284:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Nothing to do */ +5285:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5286:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5287:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +5288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +5289:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5290:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_OK; +5291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5292:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5293:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +5294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Master sends target device address followed by internal memory address for write reques +5295:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +5296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +5297:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param DevAddress Target device address: The device 7 bits address value +5298:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * in datasheet must be shifted to the left before calling the interface +5299:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param MemAddress Internal memory address +5300:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param MemAddSize Size of internal memory address +5301:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Timeout Timeout duration +5302:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Tickstart Tick start value +5303:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status +5304:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +5305:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static HAL_StatusTypeDef I2C_RequestMemoryWrite(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, +5306:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint16_t MemAddress, uint16_t MemAddSize, uint32_t +5307:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t Tickstart) +5308:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5309:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)MemAddSize, I2C_RELOAD_MODE, I2C_GENERATE_START_WRI +5310:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5311:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Wait until TXIS flag is set */ +5312:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK) +5313:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5314:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +5315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5316:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* If Memory address size is 8Bit */ +5318:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (MemAddSize == I2C_MEMADD_SIZE_8BIT) +5319:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5320:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Send Memory Address */ +5321:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->TXDR = I2C_MEM_ADD_LSB(MemAddress); +5322:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* If Memory address size is 16Bit */ +5324:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +5325:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5326:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Send MSB of Memory Address */ +5327:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->TXDR = I2C_MEM_ADD_MSB(MemAddress); +5328:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5329:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Wait until TXIS flag is set */ +5330:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK) +5331:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + ARM GAS /tmp/ccE2rRGE.s page 95 + + +5332:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +5333:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5334:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5335:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Send LSB of Memory Address */ +5336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->TXDR = I2C_MEM_ADD_LSB(MemAddress); +5337:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5338:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5339:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Wait until TCR flag is set */ +5340:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TCR, RESET, Timeout, Tickstart) != HAL_OK) +5341:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5342:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +5343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5344:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5345:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_OK; +5346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5347:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5348:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +5349:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Master sends target device address followed by internal memory address for read request +5350:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +5351:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +5352:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param DevAddress Target device address: The device 7 bits address value +5353:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * in datasheet must be shifted to the left before calling the interface +5354:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param MemAddress Internal memory address +5355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param MemAddSize Size of internal memory address +5356:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Timeout Timeout duration +5357:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Tickstart Tick start value +5358:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status +5359:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +5360:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static HAL_StatusTypeDef I2C_RequestMemoryRead(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, +5361:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint16_t MemAddress, uint16_t MemAddSize, uint32_t T +5362:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t Tickstart) +5363:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5364:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)MemAddSize, I2C_SOFTEND_MODE, I2C_GENERATE_START_WR +5365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5366:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Wait until TXIS flag is set */ +5367:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK) +5368:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5369:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +5370:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5371:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5372:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* If Memory address size is 8Bit */ +5373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (MemAddSize == I2C_MEMADD_SIZE_8BIT) +5374:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5375:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Send Memory Address */ +5376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->TXDR = I2C_MEM_ADD_LSB(MemAddress); +5377:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5378:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* If Memory address size is 16Bit */ +5379:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +5380:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5381:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Send MSB of Memory Address */ +5382:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->TXDR = I2C_MEM_ADD_MSB(MemAddress); +5383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5384:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Wait until TXIS flag is set */ +5385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, Tickstart) != HAL_OK) +5386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5387:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +5388:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + ARM GAS /tmp/ccE2rRGE.s page 96 + + +5389:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5390:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Send LSB of Memory Address */ +5391:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->TXDR = I2C_MEM_ADD_LSB(MemAddress); +5392:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5393:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5394:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Wait until TC flag is set */ +5395:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_TC, RESET, Timeout, Tickstart) != HAL_OK) +5396:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5397:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +5398:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5399:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5400:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_OK; +5401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5402:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5403:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +5404:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief I2C Address complete process callback. +5405:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c I2C handle. +5406:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param ITFlags Interrupt flags to handle. +5407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval None +5408:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +5409:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static void I2C_ITAddrCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags) +5410:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5411:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint8_t transferdirection; +5412:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint16_t slaveaddrcode; +5413:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint16_t ownadd1code; +5414:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint16_t ownadd2code; +5415:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5416:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prevent unused argument(s) compilation warning */ +5417:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** UNUSED(ITFlags); +5418:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5419:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* In case of Listen state, need to inform upper layer of address match code event */ +5420:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) == (uint32_t)HAL_I2C_STATE_LISTEN) +5421:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5422:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** transferdirection = I2C_GET_DIR(hi2c); +5423:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** slaveaddrcode = I2C_GET_ADDR_MATCH(hi2c); +5424:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** ownadd1code = I2C_GET_OWN_ADDRESS1(hi2c); +5425:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** ownadd2code = I2C_GET_OWN_ADDRESS2(hi2c); +5426:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5427:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* If 10bits addressing mode is selected */ +5428:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->Init.AddressingMode == I2C_ADDRESSINGMODE_10BIT) +5429:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5430:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((slaveaddrcode & SLAVE_ADDR_MSK) == ((ownadd1code >> SLAVE_ADDR_SHIFT) & SLAVE_ADDR_MSK)) +5431:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5432:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** slaveaddrcode = ownadd1code; +5433:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->AddrEventCount++; +5434:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->AddrEventCount == 2U) +5435:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5436:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Reset Address Event counter */ +5437:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->AddrEventCount = 0U; +5438:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5439:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear ADDR flag */ +5440:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR); +5441:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5442:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +5443:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +5444:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5445:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call Slave Addr callback */ + ARM GAS /tmp/ccE2rRGE.s page 97 + + +5446:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) +5447:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->AddrCallback(hi2c, transferdirection, slaveaddrcode); +5448:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #else +5449:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_AddrCallback(hi2c, transferdirection, slaveaddrcode); +5450:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ +5451:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5452:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5453:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +5454:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5455:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** slaveaddrcode = ownadd2code; +5456:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5457:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable ADDR Interrupts */ +5458:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT); +5459:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5460:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +5461:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +5462:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5463:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call Slave Addr callback */ +5464:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) +5465:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->AddrCallback(hi2c, transferdirection, slaveaddrcode); +5466:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #else +5467:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_AddrCallback(hi2c, transferdirection, slaveaddrcode); +5468:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ +5469:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5470:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5471:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* else 7 bits addressing mode is selected */ +5472:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +5473:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5474:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable ADDR Interrupts */ +5475:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT); +5476:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5477:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +5478:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +5479:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5480:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call Slave Addr callback */ +5481:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) +5482:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->AddrCallback(hi2c, transferdirection, slaveaddrcode); +5483:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #else +5484:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_AddrCallback(hi2c, transferdirection, slaveaddrcode); +5485:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ +5486:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5487:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5488:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Else clear address flag only */ +5489:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +5490:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5491:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear ADDR flag */ +5492:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR); +5493:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5494:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +5495:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +5496:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5497:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5498:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5499:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +5500:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief I2C Master sequential complete process. +5501:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c I2C handle. +5502:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval None + ARM GAS /tmp/ccE2rRGE.s page 98 + + +5503:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +5504:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static void I2C_ITMasterSeqCplt(I2C_HandleTypeDef *hi2c) +5505:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5506:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Reset I2C handle mode */ +5507:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; +5508:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5509:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* No Generate Stop, to permit restart mode */ +5510:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* The stop will be done at the end of transfer, when I2C_AUTOEND_MODE enable */ +5511:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_BUSY_TX) +5512:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5513:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; +5514:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_MASTER_BUSY_TX; +5515:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = NULL; +5516:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5517:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable Interrupts */ +5518:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Disable_IRQ(hi2c, I2C_XFER_TX_IT); +5519:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5520:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +5521:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +5522:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5523:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call the corresponding callback to inform upper layer of End of Transfer */ +5524:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) +5525:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->MasterTxCpltCallback(hi2c); +5526:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #else +5527:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_MasterTxCpltCallback(hi2c); +5528:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ +5529:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5530:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* hi2c->State == HAL_I2C_STATE_BUSY_RX */ +5531:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +5532:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5533:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; +5534:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_MASTER_BUSY_RX; +5535:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = NULL; +5536:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5537:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable Interrupts */ +5538:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Disable_IRQ(hi2c, I2C_XFER_RX_IT); +5539:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5540:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +5541:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +5542:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5543:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call the corresponding callback to inform upper layer of End of Transfer */ +5544:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) +5545:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->MasterRxCpltCallback(hi2c); +5546:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #else +5547:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_MasterRxCpltCallback(hi2c); +5548:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ +5549:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5550:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5551:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5552:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +5553:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief I2C Slave sequential complete process. +5554:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c I2C handle. +5555:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval None +5556:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +5557:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static void I2C_ITSlaveSeqCplt(I2C_HandleTypeDef *hi2c) +5558:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5559:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tmpcr1value = READ_REG(hi2c->Instance->CR1); + ARM GAS /tmp/ccE2rRGE.s page 99 + + +5560:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5561:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Reset I2C handle mode */ +5562:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; +5563:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5564:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* If a DMA is ongoing, Update handle size context */ +5565:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_CHECK_IT_SOURCE(tmpcr1value, I2C_CR1_TXDMAEN) != RESET) +5566:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5567:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable DMA Request */ +5568:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR1 &= ~I2C_CR1_TXDMAEN; +5569:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5570:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else if (I2C_CHECK_IT_SOURCE(tmpcr1value, I2C_CR1_RXDMAEN) != RESET) +5571:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5572:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable DMA Request */ +5573:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR1 &= ~I2C_CR1_RXDMAEN; +5574:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5575:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +5576:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5577:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Do nothing */ +5578:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5579:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5580:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_BUSY_TX_LISTEN) +5581:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5582:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Remove HAL_I2C_STATE_SLAVE_BUSY_TX, keep only HAL_I2C_STATE_LISTEN */ +5583:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_LISTEN; +5584:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_TX; +5585:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5586:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable Interrupts */ +5587:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Disable_IRQ(hi2c, I2C_XFER_TX_IT); +5588:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5589:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +5590:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +5591:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5592:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call the corresponding callback to inform upper layer of End of Transfer */ +5593:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) +5594:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->SlaveTxCpltCallback(hi2c); +5595:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #else +5596:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_SlaveTxCpltCallback(hi2c); +5597:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ +5598:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5599:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5600:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else if (hi2c->State == HAL_I2C_STATE_BUSY_RX_LISTEN) +5601:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5602:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Remove HAL_I2C_STATE_SLAVE_BUSY_RX, keep only HAL_I2C_STATE_LISTEN */ +5603:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_LISTEN; +5604:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_RX; +5605:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5606:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable Interrupts */ +5607:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Disable_IRQ(hi2c, I2C_XFER_RX_IT); +5608:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5609:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +5610:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +5611:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5612:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call the corresponding callback to inform upper layer of End of Transfer */ +5613:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) +5614:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->SlaveRxCpltCallback(hi2c); +5615:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #else +5616:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_SlaveRxCpltCallback(hi2c); + ARM GAS /tmp/ccE2rRGE.s page 100 + + +5617:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ +5618:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5619:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +5620:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5621:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Nothing to do */ +5622:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5623:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5624:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5625:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +5626:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief I2C Master complete process. +5627:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c I2C handle. +5628:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param ITFlags Interrupt flags to handle. +5629:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval None +5630:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +5631:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static void I2C_ITMasterCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags) +5632:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5633:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tmperror; +5634:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tmpITFlags = ITFlags; +5635:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __IO uint32_t tmpreg; +5636:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5637:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear STOP Flag */ +5638:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF); +5639:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5640:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable Interrupts and Store Previous state */ +5641:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_BUSY_TX) +5642:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5643:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Disable_IRQ(hi2c, I2C_XFER_TX_IT); +5644:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_MASTER_BUSY_TX; +5645:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5646:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else if (hi2c->State == HAL_I2C_STATE_BUSY_RX) +5647:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5648:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Disable_IRQ(hi2c, I2C_XFER_RX_IT); +5649:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_MASTER_BUSY_RX; +5650:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5651:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +5652:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5653:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Do nothing */ +5654:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5655:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5656:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear Configuration Register 2 */ +5657:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_RESET_CR2(hi2c); +5658:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5659:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Reset handle parameters */ +5660:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = NULL; +5661:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; +5662:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5663:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_AF) != RESET) +5664:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5665:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear NACK Flag */ +5666:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); +5667:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5668:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set acknowledge error code */ +5669:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_AF; +5670:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5671:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5672:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Fetch Last receive data if any */ +5673:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((hi2c->State == HAL_I2C_STATE_ABORT) && (I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_RXNE) != RESET)) + ARM GAS /tmp/ccE2rRGE.s page 101 + + +5674:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5675:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Read data from RXDR */ +5676:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** tmpreg = (uint8_t)hi2c->Instance->RXDR; +5677:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** UNUSED(tmpreg); +5678:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5679:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5680:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Flush TX register */ +5681:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Flush_TXDR(hi2c); +5682:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5683:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Store current volatile hi2c->ErrorCode, misra rule */ +5684:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** tmperror = hi2c->ErrorCode; +5685:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5686:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call the corresponding callback to inform upper layer of End of Transfer */ +5687:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((hi2c->State == HAL_I2C_STATE_ABORT) || (tmperror != HAL_I2C_ERROR_NONE)) +5688:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5689:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call the corresponding callback to inform upper layer of End of Transfer */ +5690:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_ITError(hi2c, hi2c->ErrorCode); +5691:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5692:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* hi2c->State == HAL_I2C_STATE_BUSY_TX */ +5693:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else if (hi2c->State == HAL_I2C_STATE_BUSY_TX) +5694:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5695:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; +5696:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_NONE; +5697:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5698:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->Mode == HAL_I2C_MODE_MEM) +5699:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5700:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; +5701:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5702:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +5703:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +5704:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5705:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call the corresponding callback to inform upper layer of End of Transfer */ +5706:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) +5707:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->MemTxCpltCallback(hi2c); +5708:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #else +5709:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_MemTxCpltCallback(hi2c); +5710:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ +5711:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5712:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +5713:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5714:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; +5715:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5716:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +5717:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +5718:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5719:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call the corresponding callback to inform upper layer of End of Transfer */ +5720:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) +5721:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->MasterTxCpltCallback(hi2c); +5722:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #else +5723:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_MasterTxCpltCallback(hi2c); +5724:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ +5725:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5726:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5727:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* hi2c->State == HAL_I2C_STATE_BUSY_RX */ +5728:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else if (hi2c->State == HAL_I2C_STATE_BUSY_RX) +5729:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5730:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; + ARM GAS /tmp/ccE2rRGE.s page 102 + + +5731:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_NONE; +5732:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5733:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->Mode == HAL_I2C_MODE_MEM) +5734:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5735:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; +5736:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5737:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +5738:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +5739:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5740:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call the corresponding callback to inform upper layer of End of Transfer */ +5741:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) +5742:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->MemRxCpltCallback(hi2c); +5743:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #else +5744:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_MemRxCpltCallback(hi2c); +5745:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ +5746:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5747:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +5748:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5749:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; +5750:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5751:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +5752:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +5753:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5754:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call the corresponding callback to inform upper layer of End of Transfer */ +5755:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) +5756:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->MasterRxCpltCallback(hi2c); +5757:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #else +5758:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_MasterRxCpltCallback(hi2c); +5759:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ +5760:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5761:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5762:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +5763:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5764:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Nothing to do */ +5765:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5766:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5767:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5768:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +5769:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief I2C Slave complete process. +5770:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c I2C handle. +5771:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param ITFlags Interrupt flags to handle. +5772:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval None +5773:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +5774:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static void I2C_ITSlaveCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags) +5775:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5776:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tmpcr1value = READ_REG(hi2c->Instance->CR1); +5777:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tmpITFlags = ITFlags; +5778:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_StateTypeDef tmpstate = hi2c->State; +5779:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5780:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear STOP Flag */ +5781:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF); +5782:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5783:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable Interrupts and Store Previous state */ +5784:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((tmpstate == HAL_I2C_STATE_BUSY_TX) || (tmpstate == HAL_I2C_STATE_BUSY_TX_LISTEN)) +5785:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5786:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT | I2C_XFER_TX_IT); +5787:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_TX; + ARM GAS /tmp/ccE2rRGE.s page 103 + + +5788:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5789:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else if ((tmpstate == HAL_I2C_STATE_BUSY_RX) || (tmpstate == HAL_I2C_STATE_BUSY_RX_LISTEN)) +5790:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5791:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT | I2C_XFER_RX_IT); +5792:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_RX; +5793:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5794:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +5795:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5796:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Do nothing */ +5797:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5798:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5799:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable Address Acknowledge */ +5800:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR2 |= I2C_CR2_NACK; +5801:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5802:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear Configuration Register 2 */ +5803:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_RESET_CR2(hi2c); +5804:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5805:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Flush TX register */ +5806:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Flush_TXDR(hi2c); +5807:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5808:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* If a DMA is ongoing, Update handle size context */ +5809:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_CHECK_IT_SOURCE(tmpcr1value, I2C_CR1_TXDMAEN) != RESET) +5810:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5811:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable DMA Request */ +5812:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR1 &= ~I2C_CR1_TXDMAEN; +5813:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5814:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->hdmatx != NULL) +5815:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5816:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = (uint16_t)__HAL_DMA_GET_COUNTER(hi2c->hdmatx); +5817:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5818:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5819:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else if (I2C_CHECK_IT_SOURCE(tmpcr1value, I2C_CR1_RXDMAEN) != RESET) +5820:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5821:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable DMA Request */ +5822:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR1 &= ~I2C_CR1_RXDMAEN; +5823:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5824:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->hdmarx != NULL) +5825:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5826:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = (uint16_t)__HAL_DMA_GET_COUNTER(hi2c->hdmarx); +5827:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5828:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5829:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +5830:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5831:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Do nothing */ +5832:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5833:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5834:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Store Last receive data if any */ +5835:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_RXNE) != RESET) +5836:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5837:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Remove RXNE flag on temporary variable as read done */ +5838:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** tmpITFlags &= ~I2C_FLAG_RXNE; +5839:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5840:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Read data from RXDR */ +5841:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR; +5842:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5843:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Increment Buffer pointer */ +5844:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->pBuffPtr++; + ARM GAS /tmp/ccE2rRGE.s page 104 + + +5845:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5846:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((hi2c->XferSize > 0U)) +5847:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5848:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize--; +5849:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount--; +5850:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5851:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5852:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5853:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* All data are not transferred, so set error code accordingly */ +5854:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferCount != 0U) +5855:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5856:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set ErrorCode corresponding to a Non-Acknowledge */ +5857:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_AF; +5858:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5859:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5860:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; +5861:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = NULL; +5862:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5863:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->ErrorCode != HAL_I2C_ERROR_NONE) +5864:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5865:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call the corresponding callback to inform upper layer of End of Transfer */ +5866:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_ITError(hi2c, hi2c->ErrorCode); +5867:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5868:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call the Listen Complete callback, to inform upper layer of the end of Listen usecase */ +5869:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_LISTEN) +5870:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5871:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call I2C Listen complete process */ +5872:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_ITListenCplt(hi2c, tmpITFlags); +5873:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5874:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5875:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else if (hi2c->XferOptions != I2C_NO_OPTION_FRAME) +5876:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5877:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call the Sequential Complete callback, to inform upper layer of the end of Transfer */ +5878:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_ITSlaveSeqCplt(hi2c); +5879:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5880:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; +5881:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; +5882:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_NONE; +5883:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5884:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +5885:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +5886:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5887:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call the Listen Complete callback, to inform upper layer of the end of Listen usecase */ +5888:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) +5889:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ListenCpltCallback(hi2c); +5890:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #else +5891:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_ListenCpltCallback(hi2c); +5892:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ +5893:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5894:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call the corresponding callback to inform upper layer of End of Transfer */ +5895:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else if (hi2c->State == HAL_I2C_STATE_BUSY_RX) +5896:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5897:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; +5898:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_NONE; +5899:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5900:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +5901:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); + ARM GAS /tmp/ccE2rRGE.s page 105 + + +5902:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5903:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call the corresponding callback to inform upper layer of End of Transfer */ +5904:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) +5905:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->SlaveRxCpltCallback(hi2c); +5906:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #else +5907:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_SlaveRxCpltCallback(hi2c); +5908:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ +5909:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5910:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +5911:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5912:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; +5913:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_NONE; +5914:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5915:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +5916:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +5917:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5918:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call the corresponding callback to inform upper layer of End of Transfer */ +5919:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) +5920:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->SlaveTxCpltCallback(hi2c); +5921:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #else +5922:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_SlaveTxCpltCallback(hi2c); +5923:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ +5924:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5925:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5926:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5927:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +5928:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief I2C Listen complete process. +5929:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c I2C handle. +5930:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param ITFlags Interrupt flags to handle. +5931:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval None +5932:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +5933:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static void I2C_ITListenCplt(I2C_HandleTypeDef *hi2c, uint32_t ITFlags) +5934:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5935:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Reset handle parameters */ +5936:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; +5937:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_NONE; +5938:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; +5939:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; +5940:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = NULL; +5941:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5942:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Store Last receive data if any */ +5943:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_CHECK_FLAG(ITFlags, I2C_FLAG_RXNE) != RESET) +5944:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5945:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Read data from RXDR */ +5946:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR; +5947:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5948:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Increment Buffer pointer */ +5949:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->pBuffPtr++; +5950:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5951:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((hi2c->XferSize > 0U)) +5952:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5953:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize--; +5954:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount--; +5955:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5956:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set ErrorCode corresponding to a Non-Acknowledge */ +5957:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_AF; +5958:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + ARM GAS /tmp/ccE2rRGE.s page 106 + + +5959:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5960:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5961:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable all Interrupts*/ +5962:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT | I2C_XFER_RX_IT | I2C_XFER_TX_IT); +5963:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5964:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear NACK Flag */ +5965:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); +5966:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5967:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +5968:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +5969:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5970:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call the Listen Complete callback, to inform upper layer of the end of Listen usecase */ +5971:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) +5972:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ListenCpltCallback(hi2c); +5973:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #else +5974:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_ListenCpltCallback(hi2c); +5975:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ +5976:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +5977:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5978:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +5979:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief I2C interrupts error process. +5980:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c I2C handle. +5981:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param ErrorCode Error code to handle. +5982:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval None +5983:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +5984:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static void I2C_ITError(I2C_HandleTypeDef *hi2c, uint32_t ErrorCode) +5985:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +5986:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_StateTypeDef tmpstate = hi2c->State; +5987:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tmppreviousstate; +5988:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5989:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Reset handle parameters */ +5990:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; +5991:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; +5992:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = 0U; +5993:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5994:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set new error code */ +5995:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= ErrorCode; +5996:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +5997:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable Interrupts */ +5998:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((tmpstate == HAL_I2C_STATE_LISTEN) || +5999:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (tmpstate == HAL_I2C_STATE_BUSY_TX_LISTEN) || +6000:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (tmpstate == HAL_I2C_STATE_BUSY_RX_LISTEN)) +6001:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6002:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable all interrupts, except interrupts related to LISTEN state */ +6003:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Disable_IRQ(hi2c, I2C_XFER_RX_IT | I2C_XFER_TX_IT); +6004:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6005:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* keep HAL_I2C_STATE_LISTEN if set */ +6006:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_LISTEN; +6007:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Slave_ISR_IT; +6008:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6009:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +6010:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6011:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable all interrupts */ +6012:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Disable_IRQ(hi2c, I2C_XFER_LISTEN_IT | I2C_XFER_RX_IT | I2C_XFER_TX_IT); +6013:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6014:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* If state is an abort treatment on going, don't change state */ +6015:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* This change will be do later */ + ARM GAS /tmp/ccE2rRGE.s page 107 + + +6016:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State != HAL_I2C_STATE_ABORT) +6017:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6018:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set HAL_I2C_STATE_READY */ +6019:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; +6020:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6021:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = NULL; +6022:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6023:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6024:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Abort DMA TX transfer if any */ +6025:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** tmppreviousstate = hi2c->PreviousState; +6026:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((hi2c->hdmatx != NULL) && ((tmppreviousstate == I2C_STATE_MASTER_BUSY_TX) || \ +6027:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (tmppreviousstate == I2C_STATE_SLAVE_BUSY_TX))) +6028:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6029:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((hi2c->Instance->CR1 & I2C_CR1_TXDMAEN) == I2C_CR1_TXDMAEN) +6030:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6031:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR1 &= ~I2C_CR1_TXDMAEN; +6032:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6033:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6034:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (HAL_DMA_GetState(hi2c->hdmatx) != HAL_DMA_STATE_READY) +6035:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6036:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set the I2C DMA Abort callback : +6037:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */ +6038:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmatx->XferAbortCallback = I2C_DMAAbort; +6039:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6040:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +6041:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +6042:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6043:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Abort DMA TX */ +6044:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (HAL_DMA_Abort_IT(hi2c->hdmatx) != HAL_OK) +6045:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6046:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call Directly XferAbortCallback function in case of error */ +6047:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmatx->XferAbortCallback(hi2c->hdmatx); +6048:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6049:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6050:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +6051:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6052:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TreatErrorCallback(hi2c); +6053:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6054:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6055:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Abort DMA RX transfer if any */ +6056:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else if ((hi2c->hdmarx != NULL) && ((tmppreviousstate == I2C_STATE_MASTER_BUSY_RX) || \ +6057:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (tmppreviousstate == I2C_STATE_SLAVE_BUSY_RX))) +6058:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6059:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((hi2c->Instance->CR1 & I2C_CR1_RXDMAEN) == I2C_CR1_RXDMAEN) +6060:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6061:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR1 &= ~I2C_CR1_RXDMAEN; +6062:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6063:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6064:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (HAL_DMA_GetState(hi2c->hdmarx) != HAL_DMA_STATE_READY) +6065:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6066:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set the I2C DMA Abort callback : +6067:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** will lead to call HAL_I2C_ErrorCallback() at end of DMA abort procedure */ +6068:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmarx->XferAbortCallback = I2C_DMAAbort; +6069:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6070:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +6071:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +6072:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + ARM GAS /tmp/ccE2rRGE.s page 108 + + +6073:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Abort DMA RX */ +6074:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (HAL_DMA_Abort_IT(hi2c->hdmarx) != HAL_OK) +6075:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6076:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call Directly hi2c->hdmarx->XferAbortCallback function in case of error */ +6077:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmarx->XferAbortCallback(hi2c->hdmarx); +6078:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6079:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6080:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +6081:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6082:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TreatErrorCallback(hi2c); +6083:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6084:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6085:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +6086:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6087:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TreatErrorCallback(hi2c); +6088:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6089:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6090:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6091:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +6092:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief I2C Error callback treatment. +6093:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c I2C handle. +6094:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval None +6095:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +6096:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static void I2C_TreatErrorCallback(I2C_HandleTypeDef *hi2c) +6097:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6098:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_ABORT) +6099:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6100:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; +6101:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_NONE; +6102:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6103:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +6104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +6105:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6106:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call the corresponding callback to inform upper layer of End of Transfer */ +6107:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) +6108:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->AbortCpltCallback(hi2c); +6109:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #else +6110:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_AbortCpltCallback(hi2c); +6111:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ +6112:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6113:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +6114:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6115:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_NONE; +6116:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6117:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +6118:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +6119:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6120:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call the corresponding callback to inform upper layer of End of Transfer */ +6121:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1) +6122:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCallback(hi2c); +6123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #else +6124:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_ErrorCallback(hi2c); +6125:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ +6126:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6127:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6128:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6129:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** + ARM GAS /tmp/ccE2rRGE.s page 109 + + +6130:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief I2C Tx data register flush process. +6131:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c I2C handle. +6132:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval None +6133:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +6134:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static void I2C_Flush_TXDR(I2C_HandleTypeDef *hi2c) +6135:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 29 .loc 1 6135 1 view -0 + 30 .cfi_startproc + 31 @ args = 0, pretend = 0, frame = 0 + 32 @ frame_needed = 0, uses_anonymous_args = 0 + 33 @ link register save eliminated. +6136:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* If a pending TXIS flag is set */ +6137:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Write a dummy data in TXDR to clear it */ +6138:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXIS) != RESET) + 34 .loc 1 6138 3 view .LVU1 + 35 .loc 1 6138 7 is_stmt 0 view .LVU2 + 36 0000 0368 ldr r3, [r0] + 37 0002 9A69 ldr r2, [r3, #24] + 38 .loc 1 6138 6 view .LVU3 + 39 0004 12F0020F tst r2, #2 + 40 0008 01D0 beq .L2 +6139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6140:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->TXDR = 0x00U; + 41 .loc 1 6140 5 is_stmt 1 view .LVU4 + 42 .loc 1 6140 26 is_stmt 0 view .LVU5 + 43 000a 0022 movs r2, #0 + 44 000c 9A62 str r2, [r3, #40] + 45 .L2: +6141:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6142:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6143:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Flush TX register if not empty */ +6144:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXE) == RESET) + 46 .loc 1 6144 3 is_stmt 1 view .LVU6 + 47 .loc 1 6144 7 is_stmt 0 view .LVU7 + 48 000e 0368 ldr r3, [r0] + 49 0010 9A69 ldr r2, [r3, #24] + 50 .loc 1 6144 6 view .LVU8 + 51 0012 12F0010F tst r2, #1 + 52 0016 03D1 bne .L1 +6145:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6146:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_TXE); + 53 .loc 1 6146 5 is_stmt 1 view .LVU9 + 54 0018 9A69 ldr r2, [r3, #24] + 55 001a 42F00102 orr r2, r2, #1 + 56 001e 9A61 str r2, [r3, #24] + 57 .L1: +6147:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6148:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 58 .loc 1 6148 1 is_stmt 0 view .LVU10 + 59 0020 7047 bx lr + 60 .cfi_endproc + 61 .LFE193: + 63 .section .text.I2C_TransferConfig,"ax",%progbits + 64 .align 1 + 65 .syntax unified + 66 .thumb + 67 .thumb_func + ARM GAS /tmp/ccE2rRGE.s page 110 + + + 69 I2C_TransferConfig: + 70 .LVL1: + 71 .LFB205: +6149:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6150:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +6151:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief DMA I2C master transmit process complete callback. +6152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hdma DMA handle +6153:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval None +6154:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +6155:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static void I2C_DMAMasterTransmitCplt(DMA_HandleTypeDef *hdma) +6156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6157:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Derogation MISRAC2012-Rule-11.5 */ +6158:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_HandleTypeDef *hi2c = (I2C_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); +6159:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6160:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable DMA Request */ +6161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR1 &= ~I2C_CR1_TXDMAEN; +6162:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6163:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* If last transfer, enable STOP interrupt */ +6164:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferCount == 0U) +6165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6166:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable STOP interrupt */ +6167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Enable_IRQ(hi2c, I2C_XFER_CPLT_IT); +6168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6169:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* else prepare a new DMA transfer and enable TCReload interrupt */ +6170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +6171:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update Buffer pointer */ +6173:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->pBuffPtr += hi2c->XferSize; +6174:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6175:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set the XferSize to transfer */ +6176:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferCount > MAX_NBYTE_SIZE) +6177:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6178:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = MAX_NBYTE_SIZE; +6179:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6180:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +6181:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; +6183:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6184:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6185:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable the DMA channel */ +6186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (HAL_DMA_Start_IT(hi2c->hdmatx, (uint32_t)hi2c->pBuffPtr, (uint32_t)&hi2c->Instance->TXDR, +6187:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize) != HAL_OK) +6188:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call the corresponding callback to inform upper layer of End of Transfer */ +6190:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_ITError(hi2c, HAL_I2C_ERROR_DMA); +6191:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6192:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +6193:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6194:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable TC interrupts */ +6195:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Enable_IRQ(hi2c, I2C_XFER_RELOAD_IT); +6196:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6197:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6198:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6199:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6200:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +6201:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief DMA I2C slave transmit process complete callback. +6202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hdma DMA handle + ARM GAS /tmp/ccE2rRGE.s page 111 + + +6203:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval None +6204:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +6205:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static void I2C_DMASlaveTransmitCplt(DMA_HandleTypeDef *hdma) +6206:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6207:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Derogation MISRAC2012-Rule-11.5 */ +6208:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_HandleTypeDef *hi2c = (I2C_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); +6209:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tmpoptions = hi2c->XferOptions; +6210:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6211:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((tmpoptions == I2C_NEXT_FRAME) || (tmpoptions == I2C_FIRST_FRAME)) +6212:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable DMA Request */ +6214:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR1 &= ~I2C_CR1_TXDMAEN; +6215:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6216:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Last Byte is Transmitted */ +6217:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call I2C Slave Sequential complete process */ +6218:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_ITSlaveSeqCplt(hi2c); +6219:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6220:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +6221:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6222:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* No specific action, Master fully manage the generation of STOP condition */ +6223:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Mean that this generation can arrive at any time, at the end or during DMA process */ +6224:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* So STOP condition should be manage through Interrupt treatment */ +6225:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6226:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6227:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6228:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +6229:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief DMA I2C master receive process complete callback. +6230:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hdma DMA handle +6231:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval None +6232:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +6233:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static void I2C_DMAMasterReceiveCplt(DMA_HandleTypeDef *hdma) +6234:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6235:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Derogation MISRAC2012-Rule-11.5 */ +6236:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_HandleTypeDef *hi2c = (I2C_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); +6237:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6238:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable DMA Request */ +6239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR1 &= ~I2C_CR1_RXDMAEN; +6240:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6241:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* If last transfer, enable STOP interrupt */ +6242:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferCount == 0U) +6243:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6244:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable STOP interrupt */ +6245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Enable_IRQ(hi2c, I2C_XFER_CPLT_IT); +6246:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6247:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* else prepare a new DMA transfer and enable TCReload interrupt */ +6248:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +6249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6250:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Update Buffer pointer */ +6251:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->pBuffPtr += hi2c->XferSize; +6252:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6253:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Set the XferSize to transfer */ +6254:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferCount > MAX_NBYTE_SIZE) +6255:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6256:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = MAX_NBYTE_SIZE; +6257:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6258:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +6259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + ARM GAS /tmp/ccE2rRGE.s page 112 + + +6260:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; +6261:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6262:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6263:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable the DMA channel */ +6264:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (HAL_DMA_Start_IT(hi2c->hdmarx, (uint32_t)&hi2c->Instance->RXDR, (uint32_t)hi2c->pBuffPtr, +6265:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize) != HAL_OK) +6266:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6267:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call the corresponding callback to inform upper layer of End of Transfer */ +6268:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_ITError(hi2c, HAL_I2C_ERROR_DMA); +6269:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6270:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +6271:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6272:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable TC interrupts */ +6273:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Enable_IRQ(hi2c, I2C_XFER_RELOAD_IT); +6274:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6277:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6278:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +6279:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief DMA I2C slave receive process complete callback. +6280:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hdma DMA handle +6281:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval None +6282:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +6283:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static void I2C_DMASlaveReceiveCplt(DMA_HandleTypeDef *hdma) +6284:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6285:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Derogation MISRAC2012-Rule-11.5 */ +6286:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_HandleTypeDef *hi2c = (I2C_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); +6287:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tmpoptions = hi2c->XferOptions; +6288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6289:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((__HAL_DMA_GET_COUNTER(hi2c->hdmarx) == 0U) && \ +6290:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (tmpoptions != I2C_NO_OPTION_FRAME)) +6291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6292:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable DMA Request */ +6293:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR1 &= ~I2C_CR1_RXDMAEN; +6294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6295:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call I2C Slave Sequential complete process */ +6296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_ITSlaveSeqCplt(hi2c); +6297:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6298:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +6299:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6300:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* No specific action, Master fully manage the generation of STOP condition */ +6301:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Mean that this generation can arrive at any time, at the end or during DMA process */ +6302:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* So STOP condition should be manage through Interrupt treatment */ +6303:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6304:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6305:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6306:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +6307:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief DMA I2C communication error callback. +6308:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hdma DMA handle +6309:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval None +6310:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +6311:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static void I2C_DMAError(DMA_HandleTypeDef *hdma) +6312:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6313:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Derogation MISRAC2012-Rule-11.5 */ +6314:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_HandleTypeDef *hi2c = (I2C_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); +6315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6316:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable Acknowledge */ + ARM GAS /tmp/ccE2rRGE.s page 113 + + +6317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR2 |= I2C_CR2_NACK; +6318:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6319:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Call the corresponding callback to inform upper layer of End of Transfer */ +6320:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_ITError(hi2c, HAL_I2C_ERROR_DMA); +6321:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6322:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +6324:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief DMA I2C communication abort callback +6325:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * (To be called at end of DMA Abort procedure). +6326:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hdma DMA handle. +6327:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval None +6328:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +6329:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static void I2C_DMAAbort(DMA_HandleTypeDef *hdma) +6330:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6331:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Derogation MISRAC2012-Rule-11.5 */ +6332:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_HandleTypeDef *hi2c = (I2C_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); +6333:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6334:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Reset AbortCpltCallback */ +6335:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->hdmatx != NULL) +6336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6337:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmatx->XferAbortCallback = NULL; +6338:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6339:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->hdmarx != NULL) +6340:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6341:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmarx->XferAbortCallback = NULL; +6342:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6344:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TreatErrorCallback(hi2c); +6345:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6347:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +6348:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief This function handles I2C Communication Timeout. +6349:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +6350:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +6351:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Flag Specifies the I2C flag to check. +6352:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Status The new Flag status (SET or RESET). +6353:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Timeout Timeout duration +6354:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Tickstart Tick start value +6355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status +6356:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +6357:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Flag, FlagSta +6358:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t Timeout, uint32_t Tickstart) +6359:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6360:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** while (__HAL_I2C_GET_FLAG(hi2c, Flag) == Status) +6361:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6362:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Check for the Timeout */ +6363:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (Timeout != HAL_MAX_DELAY) +6364:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) +6366:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6367:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; +6368:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; +6369:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; +6370:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6371:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +6372:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +6373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + ARM GAS /tmp/ccE2rRGE.s page 114 + + +6374:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6375:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6377:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_OK; +6378:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6379:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6380:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +6381:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief This function handles I2C Communication Timeout for specific usage of TXIS flag. +6382:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +6383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +6384:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Timeout Timeout duration +6385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Tickstart Tick start value +6386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status +6387:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +6388:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static HAL_StatusTypeDef I2C_WaitOnTXISFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, +6389:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t Tickstart) +6390:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6391:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXIS) == RESET) +6392:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6393:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Check if a NACK is detected */ +6394:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_IsAcknowledgeFailed(hi2c, Timeout, Tickstart) != HAL_OK) +6395:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6396:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +6397:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6398:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6399:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Check for the Timeout */ +6400:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (Timeout != HAL_MAX_DELAY) +6401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6402:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) +6403:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6404:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; +6405:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; +6406:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; +6407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6408:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +6409:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +6410:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6411:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +6412:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6413:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6414:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6415:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_OK; +6416:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6417:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6418:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +6419:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief This function handles I2C Communication Timeout for specific usage of STOP flag. +6420:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +6421:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +6422:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Timeout Timeout duration +6423:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Tickstart Tick start value +6424:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status +6425:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +6426:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static HAL_StatusTypeDef I2C_WaitOnSTOPFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, +6427:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t Tickstart) +6428:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6429:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == RESET) +6430:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + ARM GAS /tmp/ccE2rRGE.s page 115 + + +6431:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Check if a NACK is detected */ +6432:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_IsAcknowledgeFailed(hi2c, Timeout, Tickstart) != HAL_OK) +6433:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6434:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +6435:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6436:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6437:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Check for the Timeout */ +6438:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) +6439:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6440:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; +6441:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; +6442:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; +6443:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6444:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +6445:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +6446:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6447:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +6448:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6449:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6450:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_OK; +6451:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6452:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6453:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +6454:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief This function handles I2C Communication Timeout for specific usage of RXNE flag. +6455:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +6456:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +6457:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Timeout Timeout duration +6458:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Tickstart Tick start value +6459:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status +6460:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +6461:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static HAL_StatusTypeDef I2C_WaitOnRXNEFlagUntilTimeout(I2C_HandleTypeDef *hi2c, uint32_t Timeout, +6462:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t Tickstart) +6463:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6464:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == RESET) +6465:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6466:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Check if a NACK is detected */ +6467:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_IsAcknowledgeFailed(hi2c, Timeout, Tickstart) != HAL_OK) +6468:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6469:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +6470:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6471:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6472:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Check if a STOPF is detected */ +6473:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == SET) +6474:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6475:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Check if an RXNE is pending */ +6476:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Store Last receive data if any */ +6477:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == SET) && (hi2c->XferSize > 0U)) +6478:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6479:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Return HAL_OK */ +6480:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* The Reading of data from RXDR will be done in caller function */ +6481:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_OK; +6482:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6483:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +6484:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6485:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear STOP Flag */ +6486:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF); +6487:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + ARM GAS /tmp/ccE2rRGE.s page 116 + + +6488:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear Configuration Register 2 */ +6489:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_RESET_CR2(hi2c); +6490:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6491:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; +6492:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; +6493:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; +6494:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6495:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +6496:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +6497:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6498:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +6499:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6500:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6501:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6502:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Check for the Timeout */ +6503:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) +6504:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6505:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; +6506:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; +6507:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6508:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +6509:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +6510:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6511:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +6512:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6513:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6514:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_OK; +6515:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6516:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6517:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +6518:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief This function handles Acknowledge failed detection during an I2C Communication. +6519:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +6520:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +6521:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Timeout Timeout duration +6522:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Tickstart Tick start value +6523:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval HAL status +6524:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +6525:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static HAL_StatusTypeDef I2C_IsAcknowledgeFailed(I2C_HandleTypeDef *hi2c, uint32_t Timeout, uint32_ +6526:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6527:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == SET) +6528:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6529:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* In case of Soft End condition, generate the STOP condition */ +6530:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (I2C_GET_STOP_MODE(hi2c) != I2C_AUTOEND_MODE) +6531:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6532:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Generate Stop */ +6533:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Instance->CR2 |= I2C_CR2_STOP; +6534:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6535:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Wait until STOP Flag is reset */ +6536:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* AutoEnd should be initiate after AF */ +6537:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == RESET) +6538:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6539:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Check for the Timeout */ +6540:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (Timeout != HAL_MAX_DELAY) +6541:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6542:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U)) +6543:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6544:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_TIMEOUT; + ARM GAS /tmp/ccE2rRGE.s page 117 + + +6545:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; +6546:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; +6547:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6548:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +6549:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +6550:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6551:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +6552:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6553:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6554:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6555:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6556:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear NACKF Flag */ +6557:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF); +6558:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6559:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear STOP Flag */ +6560:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF); +6561:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6562:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Flush TX register */ +6563:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_Flush_TXDR(hi2c); +6564:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6565:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Clear Configuration Register 2 */ +6566:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_RESET_CR2(hi2c); +6567:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6568:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode |= HAL_I2C_ERROR_AF; +6569:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; +6570:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; +6571:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6572:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Process Unlocked */ +6573:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_UNLOCK(hi2c); +6574:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6575:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; +6576:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6577:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_OK; +6578:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6579:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6580:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +6581:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Handles I2Cx communication when starting transfer or during transfer (TC or TCR flag ar +6582:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c I2C handle. +6583:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param DevAddress Specifies the slave address to be programmed. +6584:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Size Specifies the number of bytes to be programmed. +6585:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * This parameter must be a value between 0 and 255. +6586:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Mode New state of the I2C START condition generation. +6587:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * This parameter can be one of the following values: +6588:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @arg @ref I2C_RELOAD_MODE Enable Reload mode . +6589:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @arg @ref I2C_AUTOEND_MODE Enable Automatic end mode. +6590:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @arg @ref I2C_SOFTEND_MODE Enable Software end mode. +6591:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param Request New state of the I2C START condition generation. +6592:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * This parameter can be one of the following values: +6593:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @arg @ref I2C_NO_STARTSTOP Don't Generate stop and start condition. +6594:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @arg @ref I2C_GENERATE_STOP Generate stop condition (Size should be set to 0). +6595:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @arg @ref I2C_GENERATE_START_READ Generate Restart for read request. +6596:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @arg @ref I2C_GENERATE_START_WRITE Generate Restart for write request. +6597:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval None +6598:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +6599:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static void I2C_TransferConfig(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t Size, uint32_t +6600:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t Request) +6601:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + ARM GAS /tmp/ccE2rRGE.s page 118 + + + 72 .loc 1 6601 1 is_stmt 1 view -0 + 73 .cfi_startproc + 74 @ args = 4, pretend = 0, frame = 0 + 75 @ frame_needed = 0, uses_anonymous_args = 0 + 76 @ link register save eliminated. + 77 .loc 1 6601 1 is_stmt 0 view .LVU12 + 78 0000 30B4 push {r4, r5} + 79 .cfi_def_cfa_offset 8 + 80 .cfi_offset 4, -8 + 81 .cfi_offset 5, -4 + 82 0002 029D ldr r5, [sp, #8] +6602:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Check the parameters */ +6603:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance)); + 83 .loc 1 6603 3 is_stmt 1 view .LVU13 +6604:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** assert_param(IS_TRANSFER_MODE(Mode)); + 84 .loc 1 6604 3 view .LVU14 +6605:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** assert_param(IS_TRANSFER_REQUEST(Request)); + 85 .loc 1 6605 3 view .LVU15 +6606:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6607:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* update CR2 register */ +6608:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** MODIFY_REG(hi2c->Instance->CR2, + 86 .loc 1 6608 3 view .LVU16 + 87 0004 0468 ldr r4, [r0] + 88 0006 6068 ldr r0, [r4, #4] + 89 .LVL2: + 90 .loc 1 6608 3 is_stmt 0 view .LVU17 + 91 0008 4FEA555C lsr ip, r5, #21 + 92 000c 0CF4806C and ip, ip, #1024 + 93 0010 4CF07F7C orr ip, ip, #66846720 + 94 0014 4CF4583C orr ip, ip, #221184 + 95 0018 4CF47F7C orr ip, ip, #1020 + 96 001c 4CF0030C orr ip, ip, #3 + 97 0020 20EA0C00 bic r0, r0, ip + 98 0024 C1F30901 ubfx r1, r1, #0, #10 + 99 .LVL3: + 100 .loc 1 6608 3 view .LVU18 + 101 0028 41EA0241 orr r1, r1, r2, lsl #16 + 102 002c 1943 orrs r1, r1, r3 + 103 002e 2943 orrs r1, r1, r5 + 104 0030 0843 orrs r0, r0, r1 + 105 0032 6060 str r0, [r4, #4] +6609:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** ((I2C_CR2_SADD | I2C_CR2_NBYTES | I2C_CR2_RELOAD | I2C_CR2_AUTOEND | \ +6610:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CR2_RD_WRN & (uint32_t)(Request >> (31U - I2C_CR2_RD_WRN_Pos))) | \ +6611:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_CR2_START | I2C_CR2_STOP)), \ +6612:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (uint32_t)(((uint32_t)DevAddress & I2C_CR2_SADD) | \ +6613:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (((uint32_t)Size << I2C_CR2_NBYTES_Pos) & I2C_CR2_NBYTES) | \ +6614:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (uint32_t)Mode | (uint32_t)Request)); +6615:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 106 .loc 1 6615 1 view .LVU19 + 107 0034 30BC pop {r4, r5} + 108 .cfi_restore 5 + 109 .cfi_restore 4 + 110 .cfi_def_cfa_offset 0 + 111 .LVL4: + 112 .loc 1 6615 1 view .LVU20 + 113 0036 7047 bx lr + 114 .cfi_endproc + ARM GAS /tmp/ccE2rRGE.s page 119 + + + 115 .LFE205: + 117 .section .text.I2C_Enable_IRQ,"ax",%progbits + 118 .align 1 + 119 .syntax unified + 120 .thumb + 121 .thumb_func + 123 I2C_Enable_IRQ: + 124 .LVL5: + 125 .LFB206: +6616:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6617:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +6618:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Manage the enabling of Interrupts. +6619:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +6620:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +6621:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param InterruptRequest Value of @ref I2C_Interrupt_configuration_definition. +6622:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval None +6623:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +6624:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static void I2C_Enable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest) +6625:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 126 .loc 1 6625 1 is_stmt 1 view -0 + 127 .cfi_startproc + 128 @ args = 0, pretend = 0, frame = 0 + 129 @ frame_needed = 0, uses_anonymous_args = 0 + 130 @ link register save eliminated. +6626:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tmpisr = 0U; + 131 .loc 1 6626 3 view .LVU22 +6627:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6628:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((hi2c->XferISR == I2C_Master_ISR_DMA) || \ + 132 .loc 1 6628 3 view .LVU23 + 133 .loc 1 6628 12 is_stmt 0 view .LVU24 + 134 0000 436B ldr r3, [r0, #52] + 135 .loc 1 6628 6 view .LVU25 + 136 0002 1A4A ldr r2, .L20 + 137 0004 9342 cmp r3, r2 + 138 0006 15D0 beq .L7 + 139 .loc 1 6628 45 discriminator 1 view .LVU26 + 140 0008 194A ldr r2, .L20+4 + 141 000a 9342 cmp r3, r2 + 142 000c 12D0 beq .L7 +6629:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (hi2c->XferISR == I2C_Slave_ISR_DMA)) +6630:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6631:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((InterruptRequest & I2C_XFER_LISTEN_IT) == I2C_XFER_LISTEN_IT) +6632:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6633:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable ERR, STOP, NACK and ADDR interrupts */ +6634:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** tmpisr |= I2C_IT_ADDRI | I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_ERRI; +6635:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6636:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6637:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (InterruptRequest == I2C_XFER_ERROR_IT) +6638:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6639:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable ERR and NACK interrupts */ +6640:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** tmpisr |= I2C_IT_ERRI | I2C_IT_NACKI; +6641:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6642:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6643:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (InterruptRequest == I2C_XFER_CPLT_IT) +6644:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6645:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable STOP interrupts */ +6646:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** tmpisr |= (I2C_IT_STOPI | I2C_IT_TCI); + ARM GAS /tmp/ccE2rRGE.s page 120 + + +6647:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6648:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6649:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (InterruptRequest == I2C_XFER_RELOAD_IT) +6650:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6651:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable TC interrupts */ +6652:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** tmpisr |= I2C_IT_TCI; +6653:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6654:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6655:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +6656:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6657:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((InterruptRequest & I2C_XFER_LISTEN_IT) == I2C_XFER_LISTEN_IT) + 143 .loc 1 6657 5 is_stmt 1 view .LVU27 + 144 .loc 1 6657 8 is_stmt 0 view .LVU28 + 145 000e 11F4004F tst r1, #32768 + 146 0012 28D1 bne .L17 +6626:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 147 .loc 1 6626 12 view .LVU29 + 148 0014 0023 movs r3, #0 + 149 .L12: + 150 .LVL6: +6658:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6659:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable ERR, STOP, NACK, and ADDR interrupts */ +6660:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** tmpisr |= I2C_IT_ADDRI | I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_ERRI; +6661:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6662:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6663:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((InterruptRequest & I2C_XFER_TX_IT) == I2C_XFER_TX_IT) + 151 .loc 1 6663 5 is_stmt 1 view .LVU30 + 152 .loc 1 6663 8 is_stmt 0 view .LVU31 + 153 0016 11F0010F tst r1, #1 + 154 001a 01D0 beq .L13 +6664:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6665:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable ERR, TC, STOP, NACK and RXI interrupts */ +6666:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** tmpisr |= I2C_IT_ERRI | I2C_IT_TCI | I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_TXI; + 155 .loc 1 6666 7 is_stmt 1 view .LVU32 + 156 .loc 1 6666 14 is_stmt 0 view .LVU33 + 157 001c 43F0F203 orr r3, r3, #242 + 158 .LVL7: + 159 .L13: +6667:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6668:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6669:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((InterruptRequest & I2C_XFER_RX_IT) == I2C_XFER_RX_IT) + 160 .loc 1 6669 5 is_stmt 1 view .LVU34 + 161 .loc 1 6669 8 is_stmt 0 view .LVU35 + 162 0020 11F0020F tst r1, #2 + 163 0024 01D0 beq .L14 +6670:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6671:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable ERR, TC, STOP, NACK and TXI interrupts */ +6672:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** tmpisr |= I2C_IT_ERRI | I2C_IT_TCI | I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_RXI; + 164 .loc 1 6672 7 is_stmt 1 view .LVU36 + 165 .loc 1 6672 14 is_stmt 0 view .LVU37 + 166 0026 43F0F403 orr r3, r3, #244 + 167 .LVL8: + 168 .L14: +6673:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6674:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6675:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (InterruptRequest == I2C_XFER_CPLT_IT) + 169 .loc 1 6675 5 is_stmt 1 view .LVU38 + ARM GAS /tmp/ccE2rRGE.s page 121 + + + 170 .loc 1 6675 8 is_stmt 0 view .LVU39 + 171 002a 2029 cmp r1, #32 + 172 002c 0ED1 bne .L11 +6676:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6677:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable STOP interrupts */ +6678:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** tmpisr |= I2C_IT_STOPI; + 173 .loc 1 6678 7 is_stmt 1 view .LVU40 + 174 .loc 1 6678 14 is_stmt 0 view .LVU41 + 175 002e 43F02003 orr r3, r3, #32 + 176 .LVL9: + 177 .loc 1 6678 14 view .LVU42 + 178 0032 0BE0 b .L11 + 179 .LVL10: + 180 .L7: +6631:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 181 .loc 1 6631 5 is_stmt 1 view .LVU43 +6631:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 182 .loc 1 6631 8 is_stmt 0 view .LVU44 + 183 0034 11F4004F tst r1, #32768 + 184 0038 03D1 bne .L15 +6637:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 185 .loc 1 6637 5 is_stmt 1 view .LVU45 +6637:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 186 .loc 1 6637 8 is_stmt 0 view .LVU46 + 187 003a 1029 cmp r1, #16 + 188 003c 0BD0 beq .L16 +6626:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 189 .loc 1 6626 12 view .LVU47 + 190 003e 0023 movs r3, #0 + 191 0040 00E0 b .L9 + 192 .L15: +6634:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 193 .loc 1 6634 14 view .LVU48 + 194 0042 B823 movs r3, #184 + 195 .L9: + 196 .LVL11: +6643:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 197 .loc 1 6643 5 is_stmt 1 view .LVU49 +6643:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 198 .loc 1 6643 8 is_stmt 0 view .LVU50 + 199 0044 2029 cmp r1, #32 + 200 0046 08D0 beq .L18 + 201 .L10: +6649:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 202 .loc 1 6649 5 is_stmt 1 view .LVU51 +6649:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 203 .loc 1 6649 8 is_stmt 0 view .LVU52 + 204 0048 4029 cmp r1, #64 + 205 004a 09D0 beq .L19 + 206 .L11: +6679:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6680:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6681:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6682:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable interrupts only at the end */ +6683:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* to avoid the risk of I2C interrupt handle execution before */ +6684:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* all interrupts requested done */ +6685:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_ENABLE_IT(hi2c, tmpisr); + ARM GAS /tmp/ccE2rRGE.s page 122 + + + 207 .loc 1 6685 3 is_stmt 1 view .LVU53 + 208 004c 0168 ldr r1, [r0] + 209 .LVL12: + 210 .loc 1 6685 3 is_stmt 0 view .LVU54 + 211 004e 0A68 ldr r2, [r1] + 212 0050 1343 orrs r3, r3, r2 + 213 .LVL13: + 214 .loc 1 6685 3 view .LVU55 + 215 0052 0B60 str r3, [r1] +6686:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 216 .loc 1 6686 1 view .LVU56 + 217 0054 7047 bx lr + 218 .LVL14: + 219 .L16: +6640:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 220 .loc 1 6640 14 view .LVU57 + 221 0056 9023 movs r3, #144 + 222 0058 F4E7 b .L9 + 223 .LVL15: + 224 .L18: +6646:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 225 .loc 1 6646 7 is_stmt 1 view .LVU58 +6646:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 226 .loc 1 6646 14 is_stmt 0 view .LVU59 + 227 005a 43F06003 orr r3, r3, #96 + 228 .LVL16: +6646:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 229 .loc 1 6646 14 view .LVU60 + 230 005e F3E7 b .L10 + 231 .L19: +6652:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 232 .loc 1 6652 7 is_stmt 1 view .LVU61 +6652:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 233 .loc 1 6652 14 is_stmt 0 view .LVU62 + 234 0060 43F04003 orr r3, r3, #64 + 235 .LVL17: +6652:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 236 .loc 1 6652 14 view .LVU63 + 237 0064 F2E7 b .L11 + 238 .LVL18: + 239 .L17: +6660:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 240 .loc 1 6660 14 view .LVU64 + 241 0066 B823 movs r3, #184 + 242 0068 D5E7 b .L12 + 243 .L21: + 244 006a 00BF .align 2 + 245 .L20: + 246 006c 00000000 .word I2C_Master_ISR_DMA + 247 0070 00000000 .word I2C_Slave_ISR_DMA + 248 .cfi_endproc + 249 .LFE206: + 251 .section .text.I2C_Disable_IRQ,"ax",%progbits + 252 .align 1 + 253 .syntax unified + 254 .thumb + 255 .thumb_func + ARM GAS /tmp/ccE2rRGE.s page 123 + + + 257 I2C_Disable_IRQ: + 258 .LVL19: + 259 .LFB207: +6687:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6688:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +6689:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Manage the disabling of Interrupts. +6690:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains +6691:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * the configuration information for the specified I2C. +6692:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param InterruptRequest Value of @ref I2C_Interrupt_configuration_definition. +6693:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval None +6694:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +6695:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static void I2C_Disable_IRQ(I2C_HandleTypeDef *hi2c, uint16_t InterruptRequest) +6696:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 260 .loc 1 6696 1 is_stmt 1 view -0 + 261 .cfi_startproc + 262 @ args = 0, pretend = 0, frame = 0 + 263 @ frame_needed = 0, uses_anonymous_args = 0 + 264 @ link register save eliminated. +6697:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tmpisr = 0U; + 265 .loc 1 6697 3 view .LVU66 +6698:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6699:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((InterruptRequest & I2C_XFER_TX_IT) == I2C_XFER_TX_IT) + 266 .loc 1 6699 3 view .LVU67 + 267 .loc 1 6699 6 is_stmt 0 view .LVU68 + 268 0000 11F0010F tst r1, #1 + 269 0004 09D0 beq .L29 +6700:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6701:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable TC and TXI interrupts */ +6702:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** tmpisr |= I2C_IT_TCI | I2C_IT_TXI; + 270 .loc 1 6702 5 is_stmt 1 view .LVU69 + 271 .LVL20: +6703:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6704:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) != (uint32_t)HAL_I2C_STATE_LISTEN) + 272 .loc 1 6704 5 view .LVU70 + 273 .loc 1 6704 24 is_stmt 0 view .LVU71 + 274 0006 90F84130 ldrb r3, [r0, #65] @ zero_extendqisi2 + 275 .loc 1 6704 8 view .LVU72 + 276 000a 03F02803 and r3, r3, #40 + 277 000e 282B cmp r3, #40 + 278 0010 01D0 beq .L32 +6705:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6706:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable NACK and STOP interrupts */ +6707:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** tmpisr |= I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_ERRI; + 279 .loc 1 6707 14 view .LVU73 + 280 0012 F223 movs r3, #242 + 281 0014 02E0 b .L23 + 282 .L32: +6702:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 283 .loc 1 6702 12 view .LVU74 + 284 0016 4223 movs r3, #66 + 285 0018 00E0 b .L23 + 286 .LVL21: + 287 .L29: +6697:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 288 .loc 1 6697 12 view .LVU75 + 289 001a 0023 movs r3, #0 + 290 .LVL22: + ARM GAS /tmp/ccE2rRGE.s page 124 + + + 291 .L23: +6708:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6709:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6710:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6711:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((InterruptRequest & I2C_XFER_RX_IT) == I2C_XFER_RX_IT) + 292 .loc 1 6711 3 is_stmt 1 view .LVU76 + 293 .loc 1 6711 6 is_stmt 0 view .LVU77 + 294 001c 11F0020F tst r1, #2 + 295 0020 09D0 beq .L24 +6712:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6713:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable TC and RXI interrupts */ +6714:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** tmpisr |= I2C_IT_TCI | I2C_IT_RXI; + 296 .loc 1 6714 5 is_stmt 1 view .LVU78 + 297 .loc 1 6714 12 is_stmt 0 view .LVU79 + 298 0022 43F0440C orr ip, r3, #68 + 299 .LVL23: +6715:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6716:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (((uint32_t)hi2c->State & (uint32_t)HAL_I2C_STATE_LISTEN) != (uint32_t)HAL_I2C_STATE_LISTEN) + 300 .loc 1 6716 5 is_stmt 1 view .LVU80 + 301 .loc 1 6716 24 is_stmt 0 view .LVU81 + 302 0026 90F84120 ldrb r2, [r0, #65] @ zero_extendqisi2 + 303 .loc 1 6716 8 view .LVU82 + 304 002a 02F02802 and r2, r2, #40 + 305 002e 282A cmp r2, #40 + 306 0030 10D0 beq .L31 +6717:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6718:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable NACK and STOP interrupts */ +6719:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** tmpisr |= I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_ERRI; + 307 .loc 1 6719 7 is_stmt 1 view .LVU83 + 308 .loc 1 6719 14 is_stmt 0 view .LVU84 + 309 0032 43F0F403 orr r3, r3, #244 + 310 .LVL24: + 311 .L24: +6720:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6721:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6722:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6723:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((InterruptRequest & I2C_XFER_LISTEN_IT) == I2C_XFER_LISTEN_IT) + 312 .loc 1 6723 3 is_stmt 1 view .LVU85 + 313 .loc 1 6723 6 is_stmt 0 view .LVU86 + 314 0036 11F4004F tst r1, #32768 + 315 003a 0DD1 bne .L33 + 316 .L25: +6724:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6725:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable ADDR, NACK and STOP interrupts */ +6726:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** tmpisr |= I2C_IT_ADDRI | I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_ERRI; +6727:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6728:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6729:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (InterruptRequest == I2C_XFER_ERROR_IT) + 317 .loc 1 6729 3 is_stmt 1 view .LVU87 + 318 .loc 1 6729 6 is_stmt 0 view .LVU88 + 319 003c 1029 cmp r1, #16 + 320 003e 0ED0 beq .L34 + 321 .L26: +6730:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6731:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable ERR and NACK interrupts */ +6732:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** tmpisr |= I2C_IT_ERRI | I2C_IT_NACKI; +6733:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + ARM GAS /tmp/ccE2rRGE.s page 125 + + +6734:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6735:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (InterruptRequest == I2C_XFER_CPLT_IT) + 322 .loc 1 6735 3 is_stmt 1 view .LVU89 + 323 .loc 1 6735 6 is_stmt 0 view .LVU90 + 324 0040 2029 cmp r1, #32 + 325 0042 0FD0 beq .L35 + 326 .L27: +6736:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6737:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable STOP interrupts */ +6738:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** tmpisr |= I2C_IT_STOPI; +6739:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6740:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6741:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (InterruptRequest == I2C_XFER_RELOAD_IT) + 327 .loc 1 6741 3 is_stmt 1 view .LVU91 + 328 .loc 1 6741 6 is_stmt 0 view .LVU92 + 329 0044 4029 cmp r1, #64 + 330 0046 10D0 beq .L36 + 331 .L28: +6742:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6743:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Enable TC interrupts */ +6744:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** tmpisr |= I2C_IT_TCI; +6745:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6746:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6747:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Disable interrupts only at the end */ +6748:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* to avoid a breaking situation like at "t" time */ +6749:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* all disable interrupts request are not done */ +6750:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __HAL_I2C_DISABLE_IT(hi2c, tmpisr); + 332 .loc 1 6750 3 is_stmt 1 view .LVU93 + 333 0048 0168 ldr r1, [r0] + 334 .LVL25: + 335 .loc 1 6750 3 is_stmt 0 view .LVU94 + 336 004a 0A68 ldr r2, [r1] + 337 004c 22EA0303 bic r3, r2, r3 + 338 .LVL26: + 339 .loc 1 6750 3 view .LVU95 + 340 0050 0B60 str r3, [r1] +6751:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 341 .loc 1 6751 1 view .LVU96 + 342 0052 7047 bx lr + 343 .LVL27: + 344 .L31: +6714:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 345 .loc 1 6714 12 view .LVU97 + 346 0054 6346 mov r3, ip + 347 0056 EEE7 b .L24 + 348 .LVL28: + 349 .L33: +6726:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 350 .loc 1 6726 5 is_stmt 1 view .LVU98 +6726:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 351 .loc 1 6726 12 is_stmt 0 view .LVU99 + 352 0058 43F0B803 orr r3, r3, #184 + 353 .LVL29: +6726:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 354 .loc 1 6726 12 view .LVU100 + 355 005c EEE7 b .L25 + 356 .L34: + ARM GAS /tmp/ccE2rRGE.s page 126 + + +6732:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 357 .loc 1 6732 5 is_stmt 1 view .LVU101 +6732:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 358 .loc 1 6732 12 is_stmt 0 view .LVU102 + 359 005e 43F09003 orr r3, r3, #144 + 360 .LVL30: +6732:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 361 .loc 1 6732 12 view .LVU103 + 362 0062 EDE7 b .L26 + 363 .L35: +6738:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 364 .loc 1 6738 5 is_stmt 1 view .LVU104 +6738:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 365 .loc 1 6738 12 is_stmt 0 view .LVU105 + 366 0064 43F02003 orr r3, r3, #32 + 367 .LVL31: +6738:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 368 .loc 1 6738 12 view .LVU106 + 369 0068 ECE7 b .L27 + 370 .L36: +6744:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 371 .loc 1 6744 5 is_stmt 1 view .LVU107 +6744:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 372 .loc 1 6744 12 is_stmt 0 view .LVU108 + 373 006a 43F04003 orr r3, r3, #64 + 374 .LVL32: +6744:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 375 .loc 1 6744 12 view .LVU109 + 376 006e EBE7 b .L28 + 377 .cfi_endproc + 378 .LFE207: + 380 .section .text.I2C_ConvertOtherXferOptions,"ax",%progbits + 381 .align 1 + 382 .syntax unified + 383 .thumb + 384 .thumb_func + 386 I2C_ConvertOtherXferOptions: + 387 .LVL33: + 388 .LFB208: +6752:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** +6753:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** +6754:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @brief Convert I2Cx OTHER_xxx XferOptions to functional XferOptions. +6755:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @param hi2c I2C handle. +6756:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** * @retval None +6757:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** */ +6758:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** static void I2C_ConvertOtherXferOptions(I2C_HandleTypeDef *hi2c) +6759:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 389 .loc 1 6759 1 is_stmt 1 view -0 + 390 .cfi_startproc + 391 @ args = 0, pretend = 0, frame = 0 + 392 @ frame_needed = 0, uses_anonymous_args = 0 + 393 @ link register save eliminated. +6760:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* if user set XferOptions to I2C_OTHER_FRAME */ +6761:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* it request implicitly to generate a restart condition */ +6762:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* set XferOptions to I2C_FIRST_FRAME */ +6763:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferOptions == I2C_OTHER_FRAME) + 394 .loc 1 6763 3 view .LVU111 + ARM GAS /tmp/ccE2rRGE.s page 127 + + + 395 .loc 1 6763 11 is_stmt 0 view .LVU112 + 396 0000 C36A ldr r3, [r0, #44] + 397 .loc 1 6763 6 view .LVU113 + 398 0002 AA2B cmp r3, #170 + 399 0004 04D0 beq .L40 +6764:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6765:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_FIRST_FRAME; +6766:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6767:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* else if user set XferOptions to I2C_OTHER_AND_LAST_FRAME */ +6768:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* it request implicitly to generate a restart condition */ +6769:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* then generate a stop condition at the end of transfer */ +6770:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* set XferOptions to I2C_FIRST_AND_LAST_FRAME */ +6771:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else if (hi2c->XferOptions == I2C_OTHER_AND_LAST_FRAME) + 400 .loc 1 6771 8 is_stmt 1 view .LVU114 + 401 .loc 1 6771 16 is_stmt 0 view .LVU115 + 402 0006 C36A ldr r3, [r0, #44] + 403 .loc 1 6771 11 view .LVU116 + 404 0008 B3F52A4F cmp r3, #43520 + 405 000c 03D0 beq .L41 + 406 .L37: +6772:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6773:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_FIRST_AND_LAST_FRAME; +6774:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6775:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** else +6776:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { +6777:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Nothing to do */ +6778:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } +6779:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 407 .loc 1 6779 1 view .LVU117 + 408 000e 7047 bx lr + 409 .L40: +6765:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 410 .loc 1 6765 5 is_stmt 1 view .LVU118 +6765:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 411 .loc 1 6765 23 is_stmt 0 view .LVU119 + 412 0010 0023 movs r3, #0 + 413 0012 C362 str r3, [r0, #44] + 414 0014 7047 bx lr + 415 .L41: +6773:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 416 .loc 1 6773 5 is_stmt 1 view .LVU120 +6773:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 417 .loc 1 6773 23 is_stmt 0 view .LVU121 + 418 0016 4FF00073 mov r3, #33554432 + 419 001a C362 str r3, [r0, #44] +6778:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 420 .loc 1 6778 3 is_stmt 1 view .LVU122 + 421 .loc 1 6779 1 is_stmt 0 view .LVU123 + 422 001c F7E7 b .L37 + 423 .cfi_endproc + 424 .LFE208: + 426 .section .text.I2C_IsAcknowledgeFailed,"ax",%progbits + 427 .align 1 + 428 .syntax unified + 429 .thumb + 430 .thumb_func + 432 I2C_IsAcknowledgeFailed: + ARM GAS /tmp/ccE2rRGE.s page 128 + + + 433 .LVL34: + 434 .LFB204: +6526:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == SET) + 435 .loc 1 6526 1 is_stmt 1 view -0 + 436 .cfi_startproc + 437 @ args = 0, pretend = 0, frame = 0 + 438 @ frame_needed = 0, uses_anonymous_args = 0 +6526:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == SET) + 439 .loc 1 6526 1 is_stmt 0 view .LVU125 + 440 0000 F8B5 push {r3, r4, r5, r6, r7, lr} + 441 .cfi_def_cfa_offset 24 + 442 .cfi_offset 3, -24 + 443 .cfi_offset 4, -20 + 444 .cfi_offset 5, -16 + 445 .cfi_offset 6, -12 + 446 .cfi_offset 7, -8 + 447 .cfi_offset 14, -4 + 448 0002 0E46 mov r6, r1 +6527:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 449 .loc 1 6527 3 is_stmt 1 view .LVU126 +6527:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 450 .loc 1 6527 7 is_stmt 0 view .LVU127 + 451 0004 0368 ldr r3, [r0] + 452 0006 9969 ldr r1, [r3, #24] + 453 .LVL35: +6527:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 454 .loc 1 6527 6 view .LVU128 + 455 0008 11F0100F tst r1, #16 + 456 000c 46D0 beq .L49 + 457 000e 0546 mov r5, r0 + 458 0010 1746 mov r7, r2 +6530:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 459 .loc 1 6530 5 is_stmt 1 view .LVU129 +6530:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 460 .loc 1 6530 9 is_stmt 0 view .LVU130 + 461 0012 5A68 ldr r2, [r3, #4] + 462 .LVL36: +6530:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 463 .loc 1 6530 8 view .LVU131 + 464 0014 12F0007F tst r2, #33554432 + 465 0018 03D1 bne .L45 +6533:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 466 .loc 1 6533 7 is_stmt 1 view .LVU132 +6533:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 467 .loc 1 6533 21 is_stmt 0 view .LVU133 + 468 001a 5A68 ldr r2, [r3, #4] +6533:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 469 .loc 1 6533 27 view .LVU134 + 470 001c 42F48042 orr r2, r2, #16384 + 471 0020 5A60 str r2, [r3, #4] + 472 .LVL37: + 473 .L45: +6537:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 474 .loc 1 6537 53 is_stmt 1 view .LVU135 +6537:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 475 .loc 1 6537 12 is_stmt 0 view .LVU136 + 476 0022 2B68 ldr r3, [r5] + ARM GAS /tmp/ccE2rRGE.s page 129 + + + 477 0024 9C69 ldr r4, [r3, #24] +6537:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 478 .loc 1 6537 53 view .LVU137 + 479 0026 14F0200F tst r4, #32 + 480 002a 17D1 bne .L51 +6540:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 481 .loc 1 6540 7 is_stmt 1 view .LVU138 +6540:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 482 .loc 1 6540 10 is_stmt 0 view .LVU139 + 483 002c B6F1FF3F cmp r6, #-1 + 484 0030 F7D0 beq .L45 +6542:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 485 .loc 1 6542 9 is_stmt 1 view .LVU140 +6542:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 486 .loc 1 6542 15 is_stmt 0 view .LVU141 + 487 0032 FFF7FEFF bl HAL_GetTick + 488 .LVL38: +6542:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 489 .loc 1 6542 29 view .LVU142 + 490 0036 C01B subs r0, r0, r7 +6542:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 491 .loc 1 6542 12 view .LVU143 + 492 0038 B042 cmp r0, r6 + 493 003a 01D8 bhi .L46 +6542:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 494 .loc 1 6542 53 discriminator 1 view .LVU144 + 495 003c 002E cmp r6, #0 + 496 003e F0D1 bne .L45 + 497 .L46: +6544:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; + 498 .loc 1 6544 11 is_stmt 1 view .LVU145 +6544:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; + 499 .loc 1 6544 15 is_stmt 0 view .LVU146 + 500 0040 6B6C ldr r3, [r5, #68] +6544:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; + 501 .loc 1 6544 27 view .LVU147 + 502 0042 43F02003 orr r3, r3, #32 + 503 0046 6B64 str r3, [r5, #68] +6545:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 504 .loc 1 6545 11 is_stmt 1 view .LVU148 +6545:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 505 .loc 1 6545 23 is_stmt 0 view .LVU149 + 506 0048 2023 movs r3, #32 + 507 004a 85F84130 strb r3, [r5, #65] +6546:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 508 .loc 1 6546 11 is_stmt 1 view .LVU150 +6546:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 509 .loc 1 6546 22 is_stmt 0 view .LVU151 + 510 004e 0023 movs r3, #0 + 511 0050 85F84230 strb r3, [r5, #66] +6549:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 512 .loc 1 6549 11 is_stmt 1 view .LVU152 +6549:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 513 .loc 1 6549 11 view .LVU153 + 514 0054 85F84030 strb r3, [r5, #64] +6549:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 515 .loc 1 6549 11 view .LVU154 + ARM GAS /tmp/ccE2rRGE.s page 130 + + +6551:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 516 .loc 1 6551 11 view .LVU155 +6551:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 517 .loc 1 6551 18 is_stmt 0 view .LVU156 + 518 0058 0120 movs r0, #1 + 519 005a 20E0 b .L43 + 520 .L51: +6557:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 521 .loc 1 6557 5 is_stmt 1 view .LVU157 + 522 005c 1022 movs r2, #16 + 523 005e DA61 str r2, [r3, #28] +6560:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 524 .loc 1 6560 5 view .LVU158 + 525 0060 2B68 ldr r3, [r5] + 526 0062 2024 movs r4, #32 + 527 0064 DC61 str r4, [r3, #28] +6563:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 528 .loc 1 6563 5 view .LVU159 + 529 0066 2846 mov r0, r5 + 530 0068 FFF7FEFF bl I2C_Flush_TXDR + 531 .LVL39: +6566:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 532 .loc 1 6566 5 view .LVU160 + 533 006c 2A68 ldr r2, [r5] + 534 006e 5368 ldr r3, [r2, #4] + 535 0070 23F0FF73 bic r3, r3, #33423360 + 536 0074 23F48B33 bic r3, r3, #71168 + 537 0078 23F4FF73 bic r3, r3, #510 + 538 007c 23F00103 bic r3, r3, #1 + 539 0080 5360 str r3, [r2, #4] +6568:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; + 540 .loc 1 6568 5 view .LVU161 +6568:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; + 541 .loc 1 6568 9 is_stmt 0 view .LVU162 + 542 0082 6B6C ldr r3, [r5, #68] +6568:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; + 543 .loc 1 6568 21 view .LVU163 + 544 0084 43F00403 orr r3, r3, #4 + 545 0088 6B64 str r3, [r5, #68] +6569:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 546 .loc 1 6569 5 is_stmt 1 view .LVU164 +6569:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 547 .loc 1 6569 17 is_stmt 0 view .LVU165 + 548 008a 85F84140 strb r4, [r5, #65] +6570:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 549 .loc 1 6570 5 is_stmt 1 view .LVU166 +6570:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 550 .loc 1 6570 16 is_stmt 0 view .LVU167 + 551 008e 0023 movs r3, #0 + 552 0090 85F84230 strb r3, [r5, #66] +6573:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 553 .loc 1 6573 5 is_stmt 1 view .LVU168 +6573:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 554 .loc 1 6573 5 view .LVU169 + 555 0094 85F84030 strb r3, [r5, #64] +6573:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 556 .loc 1 6573 5 view .LVU170 + ARM GAS /tmp/ccE2rRGE.s page 131 + + +6575:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 557 .loc 1 6575 5 view .LVU171 +6575:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 558 .loc 1 6575 12 is_stmt 0 view .LVU172 + 559 0098 0120 movs r0, #1 + 560 009a 00E0 b .L43 + 561 .LVL40: + 562 .L49: +6577:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 563 .loc 1 6577 10 view .LVU173 + 564 009c 0020 movs r0, #0 + 565 .LVL41: + 566 .L43: +6578:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 567 .loc 1 6578 1 view .LVU174 + 568 009e F8BD pop {r3, r4, r5, r6, r7, pc} +6578:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 569 .loc 1 6578 1 view .LVU175 + 570 .cfi_endproc + 571 .LFE204: + 573 .section .text.I2C_WaitOnTXISFlagUntilTimeout,"ax",%progbits + 574 .align 1 + 575 .syntax unified + 576 .thumb + 577 .thumb_func + 579 I2C_WaitOnTXISFlagUntilTimeout: + 580 .LVL42: + 581 .LFB201: +6390:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXIS) == RESET) + 582 .loc 1 6390 1 is_stmt 1 view -0 + 583 .cfi_startproc + 584 @ args = 0, pretend = 0, frame = 0 + 585 @ frame_needed = 0, uses_anonymous_args = 0 +6390:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXIS) == RESET) + 586 .loc 1 6390 1 is_stmt 0 view .LVU177 + 587 0000 70B5 push {r4, r5, r6, lr} + 588 .cfi_def_cfa_offset 16 + 589 .cfi_offset 4, -16 + 590 .cfi_offset 5, -12 + 591 .cfi_offset 6, -8 + 592 .cfi_offset 14, -4 + 593 0002 0446 mov r4, r0 + 594 0004 0D46 mov r5, r1 + 595 0006 1646 mov r6, r2 +6391:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 596 .loc 1 6391 3 is_stmt 1 view .LVU178 + 597 .LVL43: + 598 .L55: +6391:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 599 .loc 1 6391 50 view .LVU179 +6391:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 600 .loc 1 6391 10 is_stmt 0 view .LVU180 + 601 0008 2368 ldr r3, [r4] + 602 000a 9B69 ldr r3, [r3, #24] +6391:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 603 .loc 1 6391 50 view .LVU181 + 604 000c 13F0020F tst r3, #2 + ARM GAS /tmp/ccE2rRGE.s page 132 + + + 605 0010 1DD1 bne .L60 +6394:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 606 .loc 1 6394 5 is_stmt 1 view .LVU182 +6394:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 607 .loc 1 6394 9 is_stmt 0 view .LVU183 + 608 0012 3246 mov r2, r6 + 609 0014 2946 mov r1, r5 + 610 0016 2046 mov r0, r4 + 611 0018 FFF7FEFF bl I2C_IsAcknowledgeFailed + 612 .LVL44: +6394:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 613 .loc 1 6394 8 view .LVU184 + 614 001c C8B9 cbnz r0, .L58 +6400:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 615 .loc 1 6400 5 is_stmt 1 view .LVU185 +6400:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 616 .loc 1 6400 8 is_stmt 0 view .LVU186 + 617 001e B5F1FF3F cmp r5, #-1 + 618 0022 F1D0 beq .L55 +6402:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 619 .loc 1 6402 7 is_stmt 1 view .LVU187 +6402:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 620 .loc 1 6402 13 is_stmt 0 view .LVU188 + 621 0024 FFF7FEFF bl HAL_GetTick + 622 .LVL45: +6402:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 623 .loc 1 6402 27 view .LVU189 + 624 0028 801B subs r0, r0, r6 +6402:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 625 .loc 1 6402 10 view .LVU190 + 626 002a A842 cmp r0, r5 + 627 002c 01D8 bhi .L56 +6402:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 628 .loc 1 6402 51 discriminator 1 view .LVU191 + 629 002e 002D cmp r5, #0 + 630 0030 EAD1 bne .L55 + 631 .L56: +6404:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; + 632 .loc 1 6404 9 is_stmt 1 view .LVU192 +6404:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; + 633 .loc 1 6404 13 is_stmt 0 view .LVU193 + 634 0032 636C ldr r3, [r4, #68] +6404:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; + 635 .loc 1 6404 25 view .LVU194 + 636 0034 43F02003 orr r3, r3, #32 + 637 0038 6364 str r3, [r4, #68] +6405:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 638 .loc 1 6405 9 is_stmt 1 view .LVU195 +6405:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 639 .loc 1 6405 21 is_stmt 0 view .LVU196 + 640 003a 2023 movs r3, #32 + 641 003c 84F84130 strb r3, [r4, #65] +6406:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 642 .loc 1 6406 9 is_stmt 1 view .LVU197 +6406:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 643 .loc 1 6406 20 is_stmt 0 view .LVU198 + 644 0040 0023 movs r3, #0 + ARM GAS /tmp/ccE2rRGE.s page 133 + + + 645 0042 84F84230 strb r3, [r4, #66] +6409:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 646 .loc 1 6409 9 is_stmt 1 view .LVU199 +6409:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 647 .loc 1 6409 9 view .LVU200 + 648 0046 84F84030 strb r3, [r4, #64] +6409:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 649 .loc 1 6409 9 view .LVU201 +6411:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 650 .loc 1 6411 9 view .LVU202 +6411:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 651 .loc 1 6411 16 is_stmt 0 view .LVU203 + 652 004a 0120 movs r0, #1 + 653 004c 00E0 b .L54 + 654 .L60: +6415:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 655 .loc 1 6415 10 view .LVU204 + 656 004e 0020 movs r0, #0 + 657 .L54: +6416:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 658 .loc 1 6416 1 view .LVU205 + 659 0050 70BD pop {r4, r5, r6, pc} + 660 .LVL46: + 661 .L58: +6396:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 662 .loc 1 6396 14 view .LVU206 + 663 0052 0120 movs r0, #1 + 664 0054 FCE7 b .L54 + 665 .cfi_endproc + 666 .LFE201: + 668 .section .text.I2C_WaitOnFlagUntilTimeout,"ax",%progbits + 669 .align 1 + 670 .syntax unified + 671 .thumb + 672 .thumb_func + 674 I2C_WaitOnFlagUntilTimeout: + 675 .LVL47: + 676 .LFB200: +6359:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** while (__HAL_I2C_GET_FLAG(hi2c, Flag) == Status) + 677 .loc 1 6359 1 is_stmt 1 view -0 + 678 .cfi_startproc + 679 @ args = 4, pretend = 0, frame = 0 + 680 @ frame_needed = 0, uses_anonymous_args = 0 +6359:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** while (__HAL_I2C_GET_FLAG(hi2c, Flag) == Status) + 681 .loc 1 6359 1 is_stmt 0 view .LVU208 + 682 0000 2DE9F041 push {r4, r5, r6, r7, r8, lr} + 683 .cfi_def_cfa_offset 24 + 684 .cfi_offset 4, -24 + 685 .cfi_offset 5, -20 + 686 .cfi_offset 6, -16 + 687 .cfi_offset 7, -12 + 688 .cfi_offset 8, -8 + 689 .cfi_offset 14, -4 + 690 0004 0646 mov r6, r0 + 691 0006 8846 mov r8, r1 + 692 0008 1746 mov r7, r2 + 693 000a 1D46 mov r5, r3 + ARM GAS /tmp/ccE2rRGE.s page 134 + + +6360:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 694 .loc 1 6360 3 is_stmt 1 view .LVU209 + 695 .LVL48: + 696 .L63: +6360:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 697 .loc 1 6360 41 view .LVU210 +6360:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 698 .loc 1 6360 10 is_stmt 0 view .LVU211 + 699 000c 3468 ldr r4, [r6] + 700 000e A469 ldr r4, [r4, #24] + 701 0010 38EA0404 bics r4, r8, r4 + 702 0014 0CBF ite eq + 703 0016 0124 moveq r4, #1 + 704 0018 0024 movne r4, #0 +6360:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 705 .loc 1 6360 41 view .LVU212 + 706 001a BC42 cmp r4, r7 + 707 001c 18D1 bne .L68 +6363:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 708 .loc 1 6363 5 is_stmt 1 view .LVU213 +6363:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 709 .loc 1 6363 8 is_stmt 0 view .LVU214 + 710 001e B5F1FF3F cmp r5, #-1 + 711 0022 F3D0 beq .L63 +6365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 712 .loc 1 6365 7 is_stmt 1 view .LVU215 +6365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 713 .loc 1 6365 13 is_stmt 0 view .LVU216 + 714 0024 FFF7FEFF bl HAL_GetTick + 715 .LVL49: +6365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 716 .loc 1 6365 27 view .LVU217 + 717 0028 069B ldr r3, [sp, #24] + 718 002a C01A subs r0, r0, r3 +6365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 719 .loc 1 6365 10 view .LVU218 + 720 002c A842 cmp r0, r5 + 721 002e 01D8 bhi .L64 +6365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 722 .loc 1 6365 51 discriminator 1 view .LVU219 + 723 0030 002D cmp r5, #0 + 724 0032 EBD1 bne .L63 + 725 .L64: +6367:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; + 726 .loc 1 6367 9 is_stmt 1 view .LVU220 +6367:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; + 727 .loc 1 6367 13 is_stmt 0 view .LVU221 + 728 0034 736C ldr r3, [r6, #68] +6367:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; + 729 .loc 1 6367 25 view .LVU222 + 730 0036 43F02003 orr r3, r3, #32 + 731 003a 7364 str r3, [r6, #68] +6368:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 732 .loc 1 6368 9 is_stmt 1 view .LVU223 +6368:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 733 .loc 1 6368 21 is_stmt 0 view .LVU224 + 734 003c 2023 movs r3, #32 + ARM GAS /tmp/ccE2rRGE.s page 135 + + + 735 003e 86F84130 strb r3, [r6, #65] +6369:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 736 .loc 1 6369 9 is_stmt 1 view .LVU225 +6369:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 737 .loc 1 6369 20 is_stmt 0 view .LVU226 + 738 0042 0023 movs r3, #0 + 739 0044 86F84230 strb r3, [r6, #66] +6372:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 740 .loc 1 6372 9 is_stmt 1 view .LVU227 +6372:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 741 .loc 1 6372 9 view .LVU228 + 742 0048 86F84030 strb r3, [r6, #64] +6372:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 743 .loc 1 6372 9 view .LVU229 +6373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 744 .loc 1 6373 9 view .LVU230 +6373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 745 .loc 1 6373 16 is_stmt 0 view .LVU231 + 746 004c 0120 movs r0, #1 + 747 004e 00E0 b .L65 + 748 .L68: +6377:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 749 .loc 1 6377 10 view .LVU232 + 750 0050 0020 movs r0, #0 + 751 .L65: +6378:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 752 .loc 1 6378 1 view .LVU233 + 753 0052 BDE8F081 pop {r4, r5, r6, r7, r8, pc} +6378:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 754 .loc 1 6378 1 view .LVU234 + 755 .cfi_endproc + 756 .LFE200: + 758 .section .text.I2C_RequestMemoryWrite,"ax",%progbits + 759 .align 1 + 760 .syntax unified + 761 .thumb + 762 .thumb_func + 764 I2C_RequestMemoryWrite: + 765 .LVL50: + 766 .LFB183: +5308:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)MemAddSize, I2C_RELOAD_MODE, I2C_GENERATE_START_WRI + 767 .loc 1 5308 1 is_stmt 1 view -0 + 768 .cfi_startproc + 769 @ args = 8, pretend = 0, frame = 0 + 770 @ frame_needed = 0, uses_anonymous_args = 0 +5308:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)MemAddSize, I2C_RELOAD_MODE, I2C_GENERATE_START_WRI + 771 .loc 1 5308 1 is_stmt 0 view .LVU236 + 772 0000 2DE9F041 push {r4, r5, r6, r7, r8, lr} + 773 .cfi_def_cfa_offset 24 + 774 .cfi_offset 4, -24 + 775 .cfi_offset 5, -20 + 776 .cfi_offset 6, -16 + 777 .cfi_offset 7, -12 + 778 .cfi_offset 8, -8 + 779 .cfi_offset 14, -4 + 780 0004 82B0 sub sp, sp, #8 + 781 .cfi_def_cfa_offset 32 + ARM GAS /tmp/ccE2rRGE.s page 136 + + + 782 0006 0446 mov r4, r0 + 783 0008 9046 mov r8, r2 + 784 000a 1D46 mov r5, r3 + 785 000c 089E ldr r6, [sp, #32] + 786 000e 099F ldr r7, [sp, #36] +5309:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 787 .loc 1 5309 3 is_stmt 1 view .LVU237 + 788 0010 194B ldr r3, .L78 + 789 .LVL51: +5309:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 790 .loc 1 5309 3 is_stmt 0 view .LVU238 + 791 0012 0093 str r3, [sp] + 792 0014 4FF08073 mov r3, #16777216 + 793 0018 EAB2 uxtb r2, r5 + 794 .LVL52: +5309:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 795 .loc 1 5309 3 view .LVU239 + 796 001a FFF7FEFF bl I2C_TransferConfig + 797 .LVL53: +5312:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 798 .loc 1 5312 3 is_stmt 1 view .LVU240 +5312:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 799 .loc 1 5312 7 is_stmt 0 view .LVU241 + 800 001e 3A46 mov r2, r7 + 801 0020 3146 mov r1, r6 + 802 0022 2046 mov r0, r4 + 803 0024 FFF7FEFF bl I2C_WaitOnTXISFlagUntilTimeout + 804 .LVL54: +5312:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 805 .loc 1 5312 6 view .LVU242 + 806 0028 F8B9 cbnz r0, .L73 +5318:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 807 .loc 1 5318 3 is_stmt 1 view .LVU243 +5318:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 808 .loc 1 5318 6 is_stmt 0 view .LVU244 + 809 002a 012D cmp r5, #1 + 810 002c 0ED1 bne .L71 +5321:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 811 .loc 1 5321 5 is_stmt 1 view .LVU245 +5321:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 812 .loc 1 5321 9 is_stmt 0 view .LVU246 + 813 002e 2368 ldr r3, [r4] +5321:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 814 .loc 1 5321 28 view .LVU247 + 815 0030 5FFA88F2 uxtb r2, r8 +5321:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 816 .loc 1 5321 26 view .LVU248 + 817 0034 9A62 str r2, [r3, #40] + 818 .L72: +5340:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 819 .loc 1 5340 3 is_stmt 1 view .LVU249 +5340:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 820 .loc 1 5340 7 is_stmt 0 view .LVU250 + 821 0036 0097 str r7, [sp] + 822 0038 3346 mov r3, r6 + 823 003a 0022 movs r2, #0 + 824 003c 8021 movs r1, #128 + ARM GAS /tmp/ccE2rRGE.s page 137 + + + 825 003e 2046 mov r0, r4 + 826 0040 FFF7FEFF bl I2C_WaitOnFlagUntilTimeout + 827 .LVL55: +5340:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 828 .loc 1 5340 6 view .LVU251 + 829 0044 A8B9 cbnz r0, .L77 + 830 .L70: +5346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 831 .loc 1 5346 1 view .LVU252 + 832 0046 02B0 add sp, sp, #8 + 833 .cfi_remember_state + 834 .cfi_def_cfa_offset 24 + 835 @ sp needed + 836 0048 BDE8F081 pop {r4, r5, r6, r7, r8, pc} + 837 .LVL56: + 838 .L71: + 839 .cfi_restore_state +5327:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 840 .loc 1 5327 5 is_stmt 1 view .LVU253 +5327:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 841 .loc 1 5327 9 is_stmt 0 view .LVU254 + 842 004c 2368 ldr r3, [r4] +5327:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 843 .loc 1 5327 28 view .LVU255 + 844 004e 4FEA1822 lsr r2, r8, #8 +5327:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 845 .loc 1 5327 26 view .LVU256 + 846 0052 9A62 str r2, [r3, #40] +5330:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 847 .loc 1 5330 5 is_stmt 1 view .LVU257 +5330:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 848 .loc 1 5330 9 is_stmt 0 view .LVU258 + 849 0054 3A46 mov r2, r7 + 850 0056 3146 mov r1, r6 + 851 0058 2046 mov r0, r4 + 852 005a FFF7FEFF bl I2C_WaitOnTXISFlagUntilTimeout + 853 .LVL57: +5330:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 854 .loc 1 5330 8 view .LVU259 + 855 005e 30B9 cbnz r0, .L74 +5336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 856 .loc 1 5336 5 is_stmt 1 view .LVU260 +5336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 857 .loc 1 5336 9 is_stmt 0 view .LVU261 + 858 0060 2368 ldr r3, [r4] +5336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 859 .loc 1 5336 28 view .LVU262 + 860 0062 5FFA88F2 uxtb r2, r8 +5336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 861 .loc 1 5336 26 view .LVU263 + 862 0066 9A62 str r2, [r3, #40] + 863 0068 E5E7 b .L72 + 864 .L73: +5314:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 865 .loc 1 5314 12 view .LVU264 + 866 006a 0120 movs r0, #1 + 867 006c EBE7 b .L70 + ARM GAS /tmp/ccE2rRGE.s page 138 + + + 868 .L74: +5332:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 869 .loc 1 5332 14 view .LVU265 + 870 006e 0120 movs r0, #1 + 871 0070 E9E7 b .L70 + 872 .L77: +5342:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 873 .loc 1 5342 12 view .LVU266 + 874 0072 0120 movs r0, #1 + 875 0074 E7E7 b .L70 + 876 .L79: + 877 0076 00BF .align 2 + 878 .L78: + 879 0078 00200080 .word -2147475456 + 880 .cfi_endproc + 881 .LFE183: + 883 .section .text.I2C_RequestMemoryRead,"ax",%progbits + 884 .align 1 + 885 .syntax unified + 886 .thumb + 887 .thumb_func + 889 I2C_RequestMemoryRead: + 890 .LVL58: + 891 .LFB184: +5363:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)MemAddSize, I2C_SOFTEND_MODE, I2C_GENERATE_START_WR + 892 .loc 1 5363 1 is_stmt 1 view -0 + 893 .cfi_startproc + 894 @ args = 8, pretend = 0, frame = 0 + 895 @ frame_needed = 0, uses_anonymous_args = 0 +5363:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)MemAddSize, I2C_SOFTEND_MODE, I2C_GENERATE_START_WR + 896 .loc 1 5363 1 is_stmt 0 view .LVU268 + 897 0000 2DE9F041 push {r4, r5, r6, r7, r8, lr} + 898 .cfi_def_cfa_offset 24 + 899 .cfi_offset 4, -24 + 900 .cfi_offset 5, -20 + 901 .cfi_offset 6, -16 + 902 .cfi_offset 7, -12 + 903 .cfi_offset 8, -8 + 904 .cfi_offset 14, -4 + 905 0004 82B0 sub sp, sp, #8 + 906 .cfi_def_cfa_offset 32 + 907 0006 0446 mov r4, r0 + 908 0008 9046 mov r8, r2 + 909 000a 1D46 mov r5, r3 + 910 000c 089E ldr r6, [sp, #32] + 911 000e 099F ldr r7, [sp, #36] +5364:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 912 .loc 1 5364 3 is_stmt 1 view .LVU269 + 913 0010 184B ldr r3, .L89 + 914 .LVL59: +5364:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 915 .loc 1 5364 3 is_stmt 0 view .LVU270 + 916 0012 0093 str r3, [sp] + 917 0014 0023 movs r3, #0 + 918 0016 EAB2 uxtb r2, r5 + 919 .LVL60: +5364:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + ARM GAS /tmp/ccE2rRGE.s page 139 + + + 920 .loc 1 5364 3 view .LVU271 + 921 0018 FFF7FEFF bl I2C_TransferConfig + 922 .LVL61: +5367:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 923 .loc 1 5367 3 is_stmt 1 view .LVU272 +5367:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 924 .loc 1 5367 7 is_stmt 0 view .LVU273 + 925 001c 3A46 mov r2, r7 + 926 001e 3146 mov r1, r6 + 927 0020 2046 mov r0, r4 + 928 0022 FFF7FEFF bl I2C_WaitOnTXISFlagUntilTimeout + 929 .LVL62: +5367:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 930 .loc 1 5367 6 view .LVU274 + 931 0026 F8B9 cbnz r0, .L84 +5373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 932 .loc 1 5373 3 is_stmt 1 view .LVU275 +5373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 933 .loc 1 5373 6 is_stmt 0 view .LVU276 + 934 0028 012D cmp r5, #1 + 935 002a 0ED1 bne .L82 +5376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 936 .loc 1 5376 5 is_stmt 1 view .LVU277 +5376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 937 .loc 1 5376 9 is_stmt 0 view .LVU278 + 938 002c 2368 ldr r3, [r4] +5376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 939 .loc 1 5376 28 view .LVU279 + 940 002e 5FFA88F2 uxtb r2, r8 +5376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 941 .loc 1 5376 26 view .LVU280 + 942 0032 9A62 str r2, [r3, #40] + 943 .L83: +5395:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 944 .loc 1 5395 3 is_stmt 1 view .LVU281 +5395:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 945 .loc 1 5395 7 is_stmt 0 view .LVU282 + 946 0034 0097 str r7, [sp] + 947 0036 3346 mov r3, r6 + 948 0038 0022 movs r2, #0 + 949 003a 4021 movs r1, #64 + 950 003c 2046 mov r0, r4 + 951 003e FFF7FEFF bl I2C_WaitOnFlagUntilTimeout + 952 .LVL63: +5395:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 953 .loc 1 5395 6 view .LVU283 + 954 0042 A8B9 cbnz r0, .L88 + 955 .L81: +5401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 956 .loc 1 5401 1 view .LVU284 + 957 0044 02B0 add sp, sp, #8 + 958 .cfi_remember_state + 959 .cfi_def_cfa_offset 24 + 960 @ sp needed + 961 0046 BDE8F081 pop {r4, r5, r6, r7, r8, pc} + 962 .LVL64: + 963 .L82: + ARM GAS /tmp/ccE2rRGE.s page 140 + + + 964 .cfi_restore_state +5382:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 965 .loc 1 5382 5 is_stmt 1 view .LVU285 +5382:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 966 .loc 1 5382 9 is_stmt 0 view .LVU286 + 967 004a 2368 ldr r3, [r4] +5382:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 968 .loc 1 5382 28 view .LVU287 + 969 004c 4FEA1822 lsr r2, r8, #8 +5382:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 970 .loc 1 5382 26 view .LVU288 + 971 0050 9A62 str r2, [r3, #40] +5385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 972 .loc 1 5385 5 is_stmt 1 view .LVU289 +5385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 973 .loc 1 5385 9 is_stmt 0 view .LVU290 + 974 0052 3A46 mov r2, r7 + 975 0054 3146 mov r1, r6 + 976 0056 2046 mov r0, r4 + 977 0058 FFF7FEFF bl I2C_WaitOnTXISFlagUntilTimeout + 978 .LVL65: +5385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 979 .loc 1 5385 8 view .LVU291 + 980 005c 30B9 cbnz r0, .L85 +5391:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 981 .loc 1 5391 5 is_stmt 1 view .LVU292 +5391:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 982 .loc 1 5391 9 is_stmt 0 view .LVU293 + 983 005e 2368 ldr r3, [r4] +5391:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 984 .loc 1 5391 28 view .LVU294 + 985 0060 5FFA88F2 uxtb r2, r8 +5391:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 986 .loc 1 5391 26 view .LVU295 + 987 0064 9A62 str r2, [r3, #40] + 988 0066 E5E7 b .L83 + 989 .L84: +5369:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 990 .loc 1 5369 12 view .LVU296 + 991 0068 0120 movs r0, #1 + 992 006a EBE7 b .L81 + 993 .L85: +5387:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 994 .loc 1 5387 14 view .LVU297 + 995 006c 0120 movs r0, #1 + 996 006e E9E7 b .L81 + 997 .L88: +5397:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 998 .loc 1 5397 12 view .LVU298 + 999 0070 0120 movs r0, #1 + 1000 0072 E7E7 b .L81 + 1001 .L90: + 1002 .align 2 + 1003 .L89: + 1004 0074 00200080 .word -2147475456 + 1005 .cfi_endproc + 1006 .LFE184: + ARM GAS /tmp/ccE2rRGE.s page 141 + + + 1008 .section .text.I2C_WaitOnSTOPFlagUntilTimeout,"ax",%progbits + 1009 .align 1 + 1010 .syntax unified + 1011 .thumb + 1012 .thumb_func + 1014 I2C_WaitOnSTOPFlagUntilTimeout: + 1015 .LVL66: + 1016 .LFB202: +6428:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == RESET) + 1017 .loc 1 6428 1 is_stmt 1 view -0 + 1018 .cfi_startproc + 1019 @ args = 0, pretend = 0, frame = 0 + 1020 @ frame_needed = 0, uses_anonymous_args = 0 +6428:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == RESET) + 1021 .loc 1 6428 1 is_stmt 0 view .LVU300 + 1022 0000 70B5 push {r4, r5, r6, lr} + 1023 .cfi_def_cfa_offset 16 + 1024 .cfi_offset 4, -16 + 1025 .cfi_offset 5, -12 + 1026 .cfi_offset 6, -8 + 1027 .cfi_offset 14, -4 + 1028 0002 0546 mov r5, r0 + 1029 0004 0C46 mov r4, r1 + 1030 0006 1646 mov r6, r2 +6429:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1031 .loc 1 6429 3 is_stmt 1 view .LVU301 + 1032 .LVL67: + 1033 .L92: +6429:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1034 .loc 1 6429 51 view .LVU302 +6429:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1035 .loc 1 6429 10 is_stmt 0 view .LVU303 + 1036 0008 2B68 ldr r3, [r5] + 1037 000a 9B69 ldr r3, [r3, #24] +6429:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1038 .loc 1 6429 51 view .LVU304 + 1039 000c 13F0200F tst r3, #32 + 1040 0010 1AD1 bne .L98 +6432:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1041 .loc 1 6432 5 is_stmt 1 view .LVU305 +6432:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1042 .loc 1 6432 9 is_stmt 0 view .LVU306 + 1043 0012 3246 mov r2, r6 + 1044 0014 2146 mov r1, r4 + 1045 0016 2846 mov r0, r5 + 1046 0018 FFF7FEFF bl I2C_IsAcknowledgeFailed + 1047 .LVL68: +6432:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1048 .loc 1 6432 8 view .LVU307 + 1049 001c B0B9 cbnz r0, .L96 +6438:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1050 .loc 1 6438 5 is_stmt 1 view .LVU308 +6438:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1051 .loc 1 6438 11 is_stmt 0 view .LVU309 + 1052 001e FFF7FEFF bl HAL_GetTick + 1053 .LVL69: +6438:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + ARM GAS /tmp/ccE2rRGE.s page 142 + + + 1054 .loc 1 6438 25 view .LVU310 + 1055 0022 801B subs r0, r0, r6 +6438:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1056 .loc 1 6438 8 view .LVU311 + 1057 0024 A042 cmp r0, r4 + 1058 0026 01D8 bhi .L94 +6438:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1059 .loc 1 6438 49 discriminator 1 view .LVU312 + 1060 0028 002C cmp r4, #0 + 1061 002a EDD1 bne .L92 + 1062 .L94: +6440:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; + 1063 .loc 1 6440 7 is_stmt 1 view .LVU313 +6440:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; + 1064 .loc 1 6440 11 is_stmt 0 view .LVU314 + 1065 002c 6B6C ldr r3, [r5, #68] +6440:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; + 1066 .loc 1 6440 23 view .LVU315 + 1067 002e 43F02003 orr r3, r3, #32 + 1068 0032 6B64 str r3, [r5, #68] +6441:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 1069 .loc 1 6441 7 is_stmt 1 view .LVU316 +6441:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 1070 .loc 1 6441 19 is_stmt 0 view .LVU317 + 1071 0034 2023 movs r3, #32 + 1072 0036 85F84130 strb r3, [r5, #65] +6442:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1073 .loc 1 6442 7 is_stmt 1 view .LVU318 +6442:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1074 .loc 1 6442 18 is_stmt 0 view .LVU319 + 1075 003a 0023 movs r3, #0 + 1076 003c 85F84230 strb r3, [r5, #66] +6445:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1077 .loc 1 6445 7 is_stmt 1 view .LVU320 +6445:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1078 .loc 1 6445 7 view .LVU321 + 1079 0040 85F84030 strb r3, [r5, #64] +6445:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1080 .loc 1 6445 7 view .LVU322 +6447:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 1081 .loc 1 6447 7 view .LVU323 +6447:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 1082 .loc 1 6447 14 is_stmt 0 view .LVU324 + 1083 0044 0120 movs r0, #1 + 1084 .L93: +6451:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1085 .loc 1 6451 1 view .LVU325 + 1086 0046 70BD pop {r4, r5, r6, pc} + 1087 .LVL70: + 1088 .L98: +6450:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 1089 .loc 1 6450 10 view .LVU326 + 1090 0048 0020 movs r0, #0 + 1091 004a FCE7 b .L93 + 1092 .L96: +6434:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 1093 .loc 1 6434 14 view .LVU327 + ARM GAS /tmp/ccE2rRGE.s page 143 + + + 1094 004c 0120 movs r0, #1 + 1095 004e FAE7 b .L93 + 1096 .cfi_endproc + 1097 .LFE202: + 1099 .section .text.I2C_WaitOnRXNEFlagUntilTimeout,"ax",%progbits + 1100 .align 1 + 1101 .syntax unified + 1102 .thumb + 1103 .thumb_func + 1105 I2C_WaitOnRXNEFlagUntilTimeout: + 1106 .LVL71: + 1107 .LFB203: +6463:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == RESET) + 1108 .loc 1 6463 1 is_stmt 1 view -0 + 1109 .cfi_startproc + 1110 @ args = 0, pretend = 0, frame = 0 + 1111 @ frame_needed = 0, uses_anonymous_args = 0 +6463:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_RXNE) == RESET) + 1112 .loc 1 6463 1 is_stmt 0 view .LVU329 + 1113 0000 70B5 push {r4, r5, r6, lr} + 1114 .cfi_def_cfa_offset 16 + 1115 .cfi_offset 4, -16 + 1116 .cfi_offset 5, -12 + 1117 .cfi_offset 6, -8 + 1118 .cfi_offset 14, -4 + 1119 0002 0446 mov r4, r0 + 1120 0004 0D46 mov r5, r1 + 1121 0006 1646 mov r6, r2 +6464:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1122 .loc 1 6464 3 is_stmt 1 view .LVU330 + 1123 .LVL72: + 1124 .L100: +6464:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1125 .loc 1 6464 50 view .LVU331 +6464:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1126 .loc 1 6464 10 is_stmt 0 view .LVU332 + 1127 0008 2368 ldr r3, [r4] + 1128 000a 9B69 ldr r3, [r3, #24] +6464:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1129 .loc 1 6464 50 view .LVU333 + 1130 000c 13F0040F tst r3, #4 + 1131 0010 3ED1 bne .L108 +6467:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1132 .loc 1 6467 5 is_stmt 1 view .LVU334 +6467:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1133 .loc 1 6467 9 is_stmt 0 view .LVU335 + 1134 0012 3246 mov r2, r6 + 1135 0014 2946 mov r1, r5 + 1136 0016 2046 mov r0, r4 + 1137 0018 FFF7FEFF bl I2C_IsAcknowledgeFailed + 1138 .LVL73: +6467:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1139 .loc 1 6467 8 view .LVU336 + 1140 001c 0146 mov r1, r0 + 1141 001e 0028 cmp r0, #0 + 1142 0020 38D1 bne .L106 +6473:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + ARM GAS /tmp/ccE2rRGE.s page 144 + + + 1143 .loc 1 6473 5 is_stmt 1 view .LVU337 +6473:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1144 .loc 1 6473 9 is_stmt 0 view .LVU338 + 1145 0022 2368 ldr r3, [r4] + 1146 0024 9A69 ldr r2, [r3, #24] +6473:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1147 .loc 1 6473 8 view .LVU339 + 1148 0026 12F0200F tst r2, #32 + 1149 002a 13D1 bne .L109 +6503:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1150 .loc 1 6503 5 is_stmt 1 view .LVU340 +6503:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1151 .loc 1 6503 11 is_stmt 0 view .LVU341 + 1152 002c FFF7FEFF bl HAL_GetTick + 1153 .LVL74: +6503:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1154 .loc 1 6503 25 view .LVU342 + 1155 0030 801B subs r0, r0, r6 +6503:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1156 .loc 1 6503 8 view .LVU343 + 1157 0032 A842 cmp r0, r5 + 1158 0034 01D8 bhi .L104 +6503:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1159 .loc 1 6503 49 discriminator 1 view .LVU344 + 1160 0036 002D cmp r5, #0 + 1161 0038 E6D1 bne .L100 + 1162 .L104: +6505:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; + 1163 .loc 1 6505 7 is_stmt 1 view .LVU345 +6505:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; + 1164 .loc 1 6505 11 is_stmt 0 view .LVU346 + 1165 003a 636C ldr r3, [r4, #68] +6505:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; + 1166 .loc 1 6505 23 view .LVU347 + 1167 003c 43F02003 orr r3, r3, #32 + 1168 0040 6364 str r3, [r4, #68] +6506:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1169 .loc 1 6506 7 is_stmt 1 view .LVU348 +6506:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1170 .loc 1 6506 19 is_stmt 0 view .LVU349 + 1171 0042 2023 movs r3, #32 + 1172 0044 84F84130 strb r3, [r4, #65] +6509:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1173 .loc 1 6509 7 is_stmt 1 view .LVU350 +6509:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1174 .loc 1 6509 7 view .LVU351 + 1175 0048 0023 movs r3, #0 + 1176 004a 84F84030 strb r3, [r4, #64] +6509:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1177 .loc 1 6509 7 view .LVU352 +6511:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 1178 .loc 1 6511 7 view .LVU353 +6511:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 1179 .loc 1 6511 14 is_stmt 0 view .LVU354 + 1180 004e 0121 movs r1, #1 + 1181 .L101: +6515:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + ARM GAS /tmp/ccE2rRGE.s page 145 + + + 1182 .loc 1 6515 1 view .LVU355 + 1183 0050 0846 mov r0, r1 + 1184 0052 70BD pop {r4, r5, r6, pc} + 1185 .LVL75: + 1186 .L109: +6477:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1187 .loc 1 6477 7 is_stmt 1 view .LVU356 +6477:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1188 .loc 1 6477 12 is_stmt 0 view .LVU357 + 1189 0054 9A69 ldr r2, [r3, #24] +6477:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1190 .loc 1 6477 10 view .LVU358 + 1191 0056 12F0040F tst r2, #4 + 1192 005a 02D0 beq .L103 +6477:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1193 .loc 1 6477 68 discriminator 1 view .LVU359 + 1194 005c 228D ldrh r2, [r4, #40] +6477:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1195 .loc 1 6477 60 discriminator 1 view .LVU360 + 1196 005e 002A cmp r2, #0 + 1197 0060 F6D1 bne .L101 + 1198 .L103: +6486:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1199 .loc 1 6486 9 is_stmt 1 view .LVU361 + 1200 0062 2022 movs r2, #32 + 1201 0064 DA61 str r2, [r3, #28] +6489:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1202 .loc 1 6489 9 view .LVU362 + 1203 0066 2168 ldr r1, [r4] + 1204 0068 4B68 ldr r3, [r1, #4] + 1205 006a 23F0FF73 bic r3, r3, #33423360 + 1206 006e 23F48B33 bic r3, r3, #71168 + 1207 0072 23F4FF73 bic r3, r3, #510 + 1208 0076 23F00103 bic r3, r3, #1 + 1209 007a 4B60 str r3, [r1, #4] +6491:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; + 1210 .loc 1 6491 9 view .LVU363 +6491:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; + 1211 .loc 1 6491 25 is_stmt 0 view .LVU364 + 1212 007c 0023 movs r3, #0 + 1213 007e 6364 str r3, [r4, #68] +6492:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 1214 .loc 1 6492 9 is_stmt 1 view .LVU365 +6492:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 1215 .loc 1 6492 21 is_stmt 0 view .LVU366 + 1216 0080 84F84120 strb r2, [r4, #65] +6493:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1217 .loc 1 6493 9 is_stmt 1 view .LVU367 +6493:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1218 .loc 1 6493 20 is_stmt 0 view .LVU368 + 1219 0084 84F84230 strb r3, [r4, #66] +6496:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1220 .loc 1 6496 9 is_stmt 1 view .LVU369 +6496:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1221 .loc 1 6496 9 view .LVU370 + 1222 0088 84F84030 strb r3, [r4, #64] +6496:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + ARM GAS /tmp/ccE2rRGE.s page 146 + + + 1223 .loc 1 6496 9 view .LVU371 +6498:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 1224 .loc 1 6498 9 view .LVU372 +6498:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 1225 .loc 1 6498 16 is_stmt 0 view .LVU373 + 1226 008c 0121 movs r1, #1 + 1227 008e DFE7 b .L101 + 1228 .L108: +6514:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 1229 .loc 1 6514 10 view .LVU374 + 1230 0090 0021 movs r1, #0 + 1231 0092 DDE7 b .L101 + 1232 .L106: +6469:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 1233 .loc 1 6469 14 view .LVU375 + 1234 0094 0121 movs r1, #1 + 1235 0096 DBE7 b .L101 + 1236 .cfi_endproc + 1237 .LFE203: + 1239 .section .text.HAL_I2C_MspInit,"ax",%progbits + 1240 .align 1 + 1241 .weak HAL_I2C_MspInit + 1242 .syntax unified + 1243 .thumb + 1244 .thumb_func + 1246 HAL_I2C_MspInit: + 1247 .LVL76: + 1248 .LFB132: + 679:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prevent unused argument(s) compilation warning */ + 1249 .loc 1 679 1 is_stmt 1 view -0 + 1250 .cfi_startproc + 1251 @ args = 0, pretend = 0, frame = 0 + 1252 @ frame_needed = 0, uses_anonymous_args = 0 + 1253 @ link register save eliminated. + 681:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1254 .loc 1 681 3 view .LVU377 + 686:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1255 .loc 1 686 1 is_stmt 0 view .LVU378 + 1256 0000 7047 bx lr + 1257 .cfi_endproc + 1258 .LFE132: + 1260 .section .text.HAL_I2C_Init,"ax",%progbits + 1261 .align 1 + 1262 .global HAL_I2C_Init + 1263 .syntax unified + 1264 .thumb + 1265 .thumb_func + 1267 HAL_I2C_Init: + 1268 .LVL77: + 1269 .LFB130: + 523:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Check the I2C handle allocation */ + 1270 .loc 1 523 1 is_stmt 1 view -0 + 1271 .cfi_startproc + 1272 @ args = 0, pretend = 0, frame = 0 + 1273 @ frame_needed = 0, uses_anonymous_args = 0 + 525:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1274 .loc 1 525 3 view .LVU380 + ARM GAS /tmp/ccE2rRGE.s page 147 + + + 525:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1275 .loc 1 525 6 is_stmt 0 view .LVU381 + 1276 0000 0028 cmp r0, #0 + 1277 0002 59D0 beq .L117 + 523:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Check the I2C handle allocation */ + 1278 .loc 1 523 1 view .LVU382 + 1279 0004 10B5 push {r4, lr} + 1280 .cfi_def_cfa_offset 8 + 1281 .cfi_offset 4, -8 + 1282 .cfi_offset 14, -4 + 1283 0006 0446 mov r4, r0 + 531:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** assert_param(IS_I2C_OWN_ADDRESS1(hi2c->Init.OwnAddress1)); + 1284 .loc 1 531 3 is_stmt 1 view .LVU383 + 532:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** assert_param(IS_I2C_ADDRESSING_MODE(hi2c->Init.AddressingMode)); + 1285 .loc 1 532 3 view .LVU384 + 533:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** assert_param(IS_I2C_DUAL_ADDRESS(hi2c->Init.DualAddressMode)); + 1286 .loc 1 533 3 view .LVU385 + 534:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** assert_param(IS_I2C_OWN_ADDRESS2(hi2c->Init.OwnAddress2)); + 1287 .loc 1 534 3 view .LVU386 + 535:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** assert_param(IS_I2C_OWN_ADDRESS2_MASK(hi2c->Init.OwnAddress2Masks)); + 1288 .loc 1 535 3 view .LVU387 + 536:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** assert_param(IS_I2C_GENERAL_CALL(hi2c->Init.GeneralCallMode)); + 1289 .loc 1 536 3 view .LVU388 + 537:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** assert_param(IS_I2C_NO_STRETCH(hi2c->Init.NoStretchMode)); + 1290 .loc 1 537 3 view .LVU389 + 538:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1291 .loc 1 538 3 view .LVU390 + 540:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1292 .loc 1 540 3 view .LVU391 + 540:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1293 .loc 1 540 11 is_stmt 0 view .LVU392 + 1294 0008 90F84130 ldrb r3, [r0, #65] @ zero_extendqisi2 + 540:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1295 .loc 1 540 6 view .LVU393 + 1296 000c 002B cmp r3, #0 + 1297 000e 43D0 beq .L122 + 1298 .LVL78: + 1299 .L113: + 571:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1300 .loc 1 571 3 is_stmt 1 view .LVU394 + 571:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1301 .loc 1 571 15 is_stmt 0 view .LVU395 + 1302 0010 2423 movs r3, #36 + 1303 0012 84F84130 strb r3, [r4, #65] + 574:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1304 .loc 1 574 3 is_stmt 1 view .LVU396 + 1305 0016 2268 ldr r2, [r4] + 1306 0018 1368 ldr r3, [r2] + 1307 001a 23F00103 bic r3, r3, #1 + 1308 001e 1360 str r3, [r2] + 578:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1309 .loc 1 578 3 view .LVU397 + 578:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1310 .loc 1 578 39 is_stmt 0 view .LVU398 + 1311 0020 6368 ldr r3, [r4, #4] + 578:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1312 .loc 1 578 7 view .LVU399 + ARM GAS /tmp/ccE2rRGE.s page 148 + + + 1313 0022 2268 ldr r2, [r4] + 578:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1314 .loc 1 578 47 view .LVU400 + 1315 0024 23F07063 bic r3, r3, #251658240 + 578:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1316 .loc 1 578 27 view .LVU401 + 1317 0028 1361 str r3, [r2, #16] + 582:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1318 .loc 1 582 3 is_stmt 1 view .LVU402 + 582:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1319 .loc 1 582 7 is_stmt 0 view .LVU403 + 1320 002a 2268 ldr r2, [r4] + 582:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1321 .loc 1 582 17 view .LVU404 + 1322 002c 9368 ldr r3, [r2, #8] + 582:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1323 .loc 1 582 24 view .LVU405 + 1324 002e 23F40043 bic r3, r3, #32768 + 1325 0032 9360 str r3, [r2, #8] + 585:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1326 .loc 1 585 3 is_stmt 1 view .LVU406 + 585:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1327 .loc 1 585 17 is_stmt 0 view .LVU407 + 1328 0034 E368 ldr r3, [r4, #12] + 585:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1329 .loc 1 585 6 view .LVU408 + 1330 0036 012B cmp r3, #1 + 1331 0038 33D0 beq .L123 + 591:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 1332 .loc 1 591 5 is_stmt 1 view .LVU409 + 591:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 1333 .loc 1 591 75 is_stmt 0 view .LVU410 + 1334 003a A368 ldr r3, [r4, #8] + 591:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 1335 .loc 1 591 9 view .LVU411 + 1336 003c 2268 ldr r2, [r4] + 591:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 1337 .loc 1 591 63 view .LVU412 + 1338 003e 43F40443 orr r3, r3, #33792 + 591:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 1339 .loc 1 591 26 view .LVU413 + 1340 0042 9360 str r3, [r2, #8] + 1341 .L115: + 596:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1342 .loc 1 596 3 is_stmt 1 view .LVU414 + 596:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1343 .loc 1 596 17 is_stmt 0 view .LVU415 + 1344 0044 E368 ldr r3, [r4, #12] + 596:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1345 .loc 1 596 6 view .LVU416 + 1346 0046 022B cmp r3, #2 + 1347 0048 31D0 beq .L124 + 1348 .L116: + 601:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1349 .loc 1 601 3 is_stmt 1 view .LVU417 + 601:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1350 .loc 1 601 7 is_stmt 0 view .LVU418 + ARM GAS /tmp/ccE2rRGE.s page 149 + + + 1351 004a 2268 ldr r2, [r4] + 601:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1352 .loc 1 601 17 view .LVU419 + 1353 004c 5368 ldr r3, [r2, #4] + 601:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1354 .loc 1 601 23 view .LVU420 + 1355 004e 43F00073 orr r3, r3, #33554432 + 1356 0052 43F40043 orr r3, r3, #32768 + 1357 0056 5360 str r3, [r2, #4] + 605:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1358 .loc 1 605 3 is_stmt 1 view .LVU421 + 605:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1359 .loc 1 605 7 is_stmt 0 view .LVU422 + 1360 0058 2268 ldr r2, [r4] + 605:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1361 .loc 1 605 17 view .LVU423 + 1362 005a D368 ldr r3, [r2, #12] + 605:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1363 .loc 1 605 24 view .LVU424 + 1364 005c 23F40043 bic r3, r3, #32768 + 1365 0060 D360 str r3, [r2, #12] + 608:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (hi2c->Init.OwnAddress2Masks << 8)); + 1366 .loc 1 608 3 is_stmt 1 view .LVU425 + 608:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (hi2c->Init.OwnAddress2Masks << 8)); + 1367 .loc 1 608 37 is_stmt 0 view .LVU426 + 1368 0062 2369 ldr r3, [r4, #16] + 608:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (hi2c->Init.OwnAddress2Masks << 8)); + 1369 .loc 1 608 66 view .LVU427 + 1370 0064 6269 ldr r2, [r4, #20] + 608:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (hi2c->Init.OwnAddress2Masks << 8)); + 1371 .loc 1 608 54 view .LVU428 + 1372 0066 1343 orrs r3, r3, r2 + 609:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1373 .loc 1 609 38 view .LVU429 + 1374 0068 A169 ldr r1, [r4, #24] + 608:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (hi2c->Init.OwnAddress2Masks << 8)); + 1375 .loc 1 608 7 view .LVU430 + 1376 006a 2268 ldr r2, [r4] + 608:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (hi2c->Init.OwnAddress2Masks << 8)); + 1377 .loc 1 608 79 view .LVU431 + 1378 006c 43EA0123 orr r3, r3, r1, lsl #8 + 608:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (hi2c->Init.OwnAddress2Masks << 8)); + 1379 .loc 1 608 24 view .LVU432 + 1380 0070 D360 str r3, [r2, #12] + 613:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1381 .loc 1 613 3 is_stmt 1 view .LVU433 + 613:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1382 .loc 1 613 36 is_stmt 0 view .LVU434 + 1383 0072 E369 ldr r3, [r4, #28] + 613:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1384 .loc 1 613 65 view .LVU435 + 1385 0074 216A ldr r1, [r4, #32] + 613:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1386 .loc 1 613 7 view .LVU436 + 1387 0076 2268 ldr r2, [r4] + 613:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1388 .loc 1 613 53 view .LVU437 + ARM GAS /tmp/ccE2rRGE.s page 150 + + + 1389 0078 0B43 orrs r3, r3, r1 + 613:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1390 .loc 1 613 23 view .LVU438 + 1391 007a 1360 str r3, [r2] + 616:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1392 .loc 1 616 3 is_stmt 1 view .LVU439 + 1393 007c 2268 ldr r2, [r4] + 1394 007e 1368 ldr r3, [r2] + 1395 0080 43F00103 orr r3, r3, #1 + 1396 0084 1360 str r3, [r2] + 618:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; + 1397 .loc 1 618 3 view .LVU440 + 618:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; + 1398 .loc 1 618 19 is_stmt 0 view .LVU441 + 1399 0086 0020 movs r0, #0 + 1400 0088 6064 str r0, [r4, #68] + 619:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_NONE; + 1401 .loc 1 619 3 is_stmt 1 view .LVU442 + 619:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_NONE; + 1402 .loc 1 619 15 is_stmt 0 view .LVU443 + 1403 008a 2023 movs r3, #32 + 1404 008c 84F84130 strb r3, [r4, #65] + 620:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 1405 .loc 1 620 3 is_stmt 1 view .LVU444 + 620:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 1406 .loc 1 620 23 is_stmt 0 view .LVU445 + 1407 0090 2063 str r0, [r4, #48] + 621:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1408 .loc 1 621 3 is_stmt 1 view .LVU446 + 621:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1409 .loc 1 621 14 is_stmt 0 view .LVU447 + 1410 0092 84F84200 strb r0, [r4, #66] + 623:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 1411 .loc 1 623 3 is_stmt 1 view .LVU448 + 624:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1412 .loc 1 624 1 is_stmt 0 view .LVU449 + 1413 0096 10BD pop {r4, pc} + 1414 .LVL79: + 1415 .L122: + 543:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1416 .loc 1 543 5 is_stmt 1 view .LVU450 + 543:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1417 .loc 1 543 16 is_stmt 0 view .LVU451 + 1418 0098 80F84030 strb r3, [r0, #64] + 567:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + 1419 .loc 1 567 5 is_stmt 1 view .LVU452 + 1420 009c FFF7FEFF bl HAL_I2C_MspInit + 1421 .LVL80: + 567:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + 1422 .loc 1 567 5 is_stmt 0 view .LVU453 + 1423 00a0 B6E7 b .L113 + 1424 .L123: + 587:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 1425 .loc 1 587 5 is_stmt 1 view .LVU454 + 587:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 1426 .loc 1 587 56 is_stmt 0 view .LVU455 + 1427 00a2 A368 ldr r3, [r4, #8] + ARM GAS /tmp/ccE2rRGE.s page 151 + + + 587:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 1428 .loc 1 587 9 view .LVU456 + 1429 00a4 2268 ldr r2, [r4] + 587:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 1430 .loc 1 587 44 view .LVU457 + 1431 00a6 43F40043 orr r3, r3, #32768 + 587:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 1432 .loc 1 587 26 view .LVU458 + 1433 00aa 9360 str r3, [r2, #8] + 1434 00ac CAE7 b .L115 + 1435 .L124: + 598:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 1436 .loc 1 598 5 is_stmt 1 view .LVU459 + 598:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 1437 .loc 1 598 9 is_stmt 0 view .LVU460 + 1438 00ae 2368 ldr r3, [r4] + 598:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 1439 .loc 1 598 25 view .LVU461 + 1440 00b0 4FF40062 mov r2, #2048 + 1441 00b4 5A60 str r2, [r3, #4] + 1442 00b6 C8E7 b .L116 + 1443 .LVL81: + 1444 .L117: + 1445 .cfi_def_cfa_offset 0 + 1446 .cfi_restore 4 + 1447 .cfi_restore 14 + 527:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 1448 .loc 1 527 12 view .LVU462 + 1449 00b8 0120 movs r0, #1 + 1450 .LVL82: + 624:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1451 .loc 1 624 1 view .LVU463 + 1452 00ba 7047 bx lr + 1453 .cfi_endproc + 1454 .LFE130: + 1456 .section .text.HAL_I2C_MspDeInit,"ax",%progbits + 1457 .align 1 + 1458 .weak HAL_I2C_MspDeInit + 1459 .syntax unified + 1460 .thumb + 1461 .thumb_func + 1463 HAL_I2C_MspDeInit: + 1464 .LVL83: + 1465 .LFB133: + 695:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prevent unused argument(s) compilation warning */ + 1466 .loc 1 695 1 is_stmt 1 view -0 + 1467 .cfi_startproc + 1468 @ args = 0, pretend = 0, frame = 0 + 1469 @ frame_needed = 0, uses_anonymous_args = 0 + 1470 @ link register save eliminated. + 697:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1471 .loc 1 697 3 view .LVU465 + 702:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1472 .loc 1 702 1 is_stmt 0 view .LVU466 + 1473 0000 7047 bx lr + 1474 .cfi_endproc + 1475 .LFE133: + ARM GAS /tmp/ccE2rRGE.s page 152 + + + 1477 .section .text.HAL_I2C_DeInit,"ax",%progbits + 1478 .align 1 + 1479 .global HAL_I2C_DeInit + 1480 .syntax unified + 1481 .thumb + 1482 .thumb_func + 1484 HAL_I2C_DeInit: + 1485 .LVL84: + 1486 .LFB131: + 633:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Check the I2C handle allocation */ + 1487 .loc 1 633 1 is_stmt 1 view -0 + 1488 .cfi_startproc + 1489 @ args = 0, pretend = 0, frame = 0 + 1490 @ frame_needed = 0, uses_anonymous_args = 0 + 635:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1491 .loc 1 635 3 view .LVU468 + 635:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1492 .loc 1 635 6 is_stmt 0 view .LVU469 + 1493 0000 A8B1 cbz r0, .L128 + 633:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Check the I2C handle allocation */ + 1494 .loc 1 633 1 view .LVU470 + 1495 0002 10B5 push {r4, lr} + 1496 .cfi_def_cfa_offset 8 + 1497 .cfi_offset 4, -8 + 1498 .cfi_offset 14, -4 + 1499 0004 0446 mov r4, r0 + 641:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1500 .loc 1 641 3 is_stmt 1 view .LVU471 + 643:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1501 .loc 1 643 3 view .LVU472 + 643:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1502 .loc 1 643 15 is_stmt 0 view .LVU473 + 1503 0006 2423 movs r3, #36 + 1504 0008 80F84130 strb r3, [r0, #65] + 646:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1505 .loc 1 646 3 is_stmt 1 view .LVU474 + 1506 000c 0268 ldr r2, [r0] + 1507 000e 1368 ldr r3, [r2] + 1508 0010 23F00103 bic r3, r3, #1 + 1509 0014 1360 str r3, [r2] + 658:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + 1510 .loc 1 658 3 view .LVU475 + 1511 0016 FFF7FEFF bl HAL_I2C_MspDeInit + 1512 .LVL85: + 661:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_RESET; + 1513 .loc 1 661 3 view .LVU476 + 661:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_RESET; + 1514 .loc 1 661 19 is_stmt 0 view .LVU477 + 1515 001a 0020 movs r0, #0 + 1516 001c 6064 str r0, [r4, #68] + 662:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_NONE; + 1517 .loc 1 662 3 is_stmt 1 view .LVU478 + 662:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_NONE; + 1518 .loc 1 662 15 is_stmt 0 view .LVU479 + 1519 001e 84F84100 strb r0, [r4, #65] + 663:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 1520 .loc 1 663 3 is_stmt 1 view .LVU480 + ARM GAS /tmp/ccE2rRGE.s page 153 + + + 663:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 1521 .loc 1 663 23 is_stmt 0 view .LVU481 + 1522 0022 2063 str r0, [r4, #48] + 664:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1523 .loc 1 664 3 is_stmt 1 view .LVU482 + 664:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1524 .loc 1 664 14 is_stmt 0 view .LVU483 + 1525 0024 84F84200 strb r0, [r4, #66] + 667:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1526 .loc 1 667 3 is_stmt 1 view .LVU484 + 667:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1527 .loc 1 667 3 view .LVU485 + 1528 0028 84F84000 strb r0, [r4, #64] + 667:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1529 .loc 1 667 3 view .LVU486 + 669:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 1530 .loc 1 669 3 view .LVU487 + 670:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1531 .loc 1 670 1 is_stmt 0 view .LVU488 + 1532 002c 10BD pop {r4, pc} + 1533 .LVL86: + 1534 .L128: + 1535 .cfi_def_cfa_offset 0 + 1536 .cfi_restore 4 + 1537 .cfi_restore 14 + 637:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 1538 .loc 1 637 12 view .LVU489 + 1539 002e 0120 movs r0, #1 + 1540 .LVL87: + 670:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1541 .loc 1 670 1 view .LVU490 + 1542 0030 7047 bx lr + 1543 .cfi_endproc + 1544 .LFE131: + 1546 .section .text.HAL_I2C_Master_Transmit,"ax",%progbits + 1547 .align 1 + 1548 .global HAL_I2C_Master_Transmit + 1549 .syntax unified + 1550 .thumb + 1551 .thumb_func + 1553 HAL_I2C_Master_Transmit: + 1554 .LVL88: + 1555 .LFB134: +1117:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tickstart; + 1556 .loc 1 1117 1 is_stmt 1 view -0 + 1557 .cfi_startproc + 1558 @ args = 4, pretend = 0, frame = 0 + 1559 @ frame_needed = 0, uses_anonymous_args = 0 +1117:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tickstart; + 1560 .loc 1 1117 1 is_stmt 0 view .LVU492 + 1561 0000 2DE9F047 push {r4, r5, r6, r7, r8, r9, r10, lr} + 1562 .cfi_def_cfa_offset 32 + 1563 .cfi_offset 4, -32 + 1564 .cfi_offset 5, -28 + 1565 .cfi_offset 6, -24 + 1566 .cfi_offset 7, -20 + 1567 .cfi_offset 8, -16 + ARM GAS /tmp/ccE2rRGE.s page 154 + + + 1568 .cfi_offset 9, -12 + 1569 .cfi_offset 10, -8 + 1570 .cfi_offset 14, -4 + 1571 0004 82B0 sub sp, sp, #8 + 1572 .cfi_def_cfa_offset 40 + 1573 0006 0F46 mov r7, r1 + 1574 0008 0A9E ldr r6, [sp, #40] +1118:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1575 .loc 1 1118 3 is_stmt 1 view .LVU493 +1120:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1576 .loc 1 1120 3 view .LVU494 +1120:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1577 .loc 1 1120 11 is_stmt 0 view .LVU495 + 1578 000a 90F84110 ldrb r1, [r0, #65] @ zero_extendqisi2 + 1579 .LVL89: +1120:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1580 .loc 1 1120 11 view .LVU496 + 1581 000e C9B2 uxtb r1, r1 +1120:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1582 .loc 1 1120 6 view .LVU497 + 1583 0010 2029 cmp r1, #32 + 1584 0012 40F0A380 bne .L141 + 1585 0016 0446 mov r4, r0 + 1586 0018 9046 mov r8, r2 + 1587 001a 9946 mov r9, r3 +1123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1588 .loc 1 1123 5 is_stmt 1 view .LVU498 +1123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1589 .loc 1 1123 5 view .LVU499 + 1590 001c 90F84030 ldrb r3, [r0, #64] @ zero_extendqisi2 + 1591 .LVL90: +1123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1592 .loc 1 1123 5 is_stmt 0 view .LVU500 + 1593 0020 012B cmp r3, #1 + 1594 0022 00F09F80 beq .L142 +1123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1595 .loc 1 1123 5 is_stmt 1 discriminator 2 view .LVU501 + 1596 0026 4FF0010A mov r10, #1 + 1597 002a 80F840A0 strb r10, [r0, #64] +1123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1598 .loc 1 1123 5 discriminator 2 view .LVU502 +1126:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1599 .loc 1 1126 5 discriminator 2 view .LVU503 +1126:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1600 .loc 1 1126 17 is_stmt 0 discriminator 2 view .LVU504 + 1601 002e FFF7FEFF bl HAL_GetTick + 1602 .LVL91: +1126:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1603 .loc 1 1126 17 discriminator 2 view .LVU505 + 1604 0032 0546 mov r5, r0 + 1605 .LVL92: +1128:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1606 .loc 1 1128 5 is_stmt 1 discriminator 2 view .LVU506 +1128:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1607 .loc 1 1128 9 is_stmt 0 discriminator 2 view .LVU507 + 1608 0034 0090 str r0, [sp] + 1609 0036 1923 movs r3, #25 + ARM GAS /tmp/ccE2rRGE.s page 155 + + + 1610 0038 5246 mov r2, r10 + 1611 003a 4FF40041 mov r1, #32768 + 1612 003e 2046 mov r0, r4 + 1613 .LVL93: +1128:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1614 .loc 1 1128 9 discriminator 2 view .LVU508 + 1615 0040 FFF7FEFF bl I2C_WaitOnFlagUntilTimeout + 1616 .LVL94: +1128:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1617 .loc 1 1128 8 discriminator 2 view .LVU509 + 1618 0044 0028 cmp r0, #0 + 1619 0046 40F08F80 bne .L143 +1133:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MASTER; + 1620 .loc 1 1133 5 is_stmt 1 view .LVU510 +1133:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MASTER; + 1621 .loc 1 1133 21 is_stmt 0 view .LVU511 + 1622 004a 2123 movs r3, #33 + 1623 004c 84F84130 strb r3, [r4, #65] +1134:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 1624 .loc 1 1134 5 is_stmt 1 view .LVU512 +1134:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 1625 .loc 1 1134 21 is_stmt 0 view .LVU513 + 1626 0050 1023 movs r3, #16 + 1627 0052 84F84230 strb r3, [r4, #66] +1135:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1628 .loc 1 1135 5 is_stmt 1 view .LVU514 +1135:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1629 .loc 1 1135 21 is_stmt 0 view .LVU515 + 1630 0056 0023 movs r3, #0 + 1631 0058 6364 str r3, [r4, #68] +1138:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 1632 .loc 1 1138 5 is_stmt 1 view .LVU516 +1138:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 1633 .loc 1 1138 21 is_stmt 0 view .LVU517 + 1634 005a C4F82480 str r8, [r4, #36] +1139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = NULL; + 1635 .loc 1 1139 5 is_stmt 1 view .LVU518 +1139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = NULL; + 1636 .loc 1 1139 21 is_stmt 0 view .LVU519 + 1637 005e A4F82A90 strh r9, [r4, #42] @ movhi +1140:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1638 .loc 1 1140 5 is_stmt 1 view .LVU520 +1140:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1639 .loc 1 1140 21 is_stmt 0 view .LVU521 + 1640 0062 6363 str r3, [r4, #52] +1144:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1641 .loc 1 1144 5 is_stmt 1 view .LVU522 +1144:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1642 .loc 1 1144 13 is_stmt 0 view .LVU523 + 1643 0064 638D ldrh r3, [r4, #42] + 1644 0066 9BB2 uxth r3, r3 +1144:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1645 .loc 1 1144 8 view .LVU524 + 1646 0068 FF2B cmp r3, #255 + 1647 006a 0AD9 bls .L135 +1146:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, + 1648 .loc 1 1146 7 is_stmt 1 view .LVU525 + ARM GAS /tmp/ccE2rRGE.s page 156 + + +1146:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, + 1649 .loc 1 1146 22 is_stmt 0 view .LVU526 + 1650 006c FF22 movs r2, #255 + 1651 006e 2285 strh r2, [r4, #40] @ movhi +1147:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_GENERATE_START_WRITE); + 1652 .loc 1 1147 7 is_stmt 1 view .LVU527 + 1653 0070 414B ldr r3, .L149 + 1654 0072 0093 str r3, [sp] + 1655 0074 4FF08073 mov r3, #16777216 + 1656 0078 3946 mov r1, r7 + 1657 007a 2046 mov r0, r4 + 1658 007c FFF7FEFF bl I2C_TransferConfig + 1659 .LVL95: + 1660 0080 18E0 b .L137 + 1661 .L135: +1152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, + 1662 .loc 1 1152 7 view .LVU528 +1152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, + 1663 .loc 1 1152 28 is_stmt 0 view .LVU529 + 1664 0082 628D ldrh r2, [r4, #42] + 1665 0084 92B2 uxth r2, r2 +1152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, + 1666 .loc 1 1152 22 view .LVU530 + 1667 0086 2285 strh r2, [r4, #40] @ movhi +1153:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_GENERATE_START_WRITE); + 1668 .loc 1 1153 7 is_stmt 1 view .LVU531 + 1669 0088 3B4B ldr r3, .L149 + 1670 008a 0093 str r3, [sp] + 1671 008c 4FF00073 mov r3, #33554432 + 1672 0090 D2B2 uxtb r2, r2 + 1673 0092 3946 mov r1, r7 + 1674 0094 2046 mov r0, r4 + 1675 0096 FFF7FEFF bl I2C_TransferConfig + 1676 .LVL96: + 1677 009a 0BE0 b .L137 + 1678 .L139: +1189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, + 1679 .loc 1 1189 11 view .LVU532 +1189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, + 1680 .loc 1 1189 32 is_stmt 0 view .LVU533 + 1681 009c 628D ldrh r2, [r4, #42] + 1682 009e 92B2 uxth r2, r2 +1189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, + 1683 .loc 1 1189 26 view .LVU534 + 1684 00a0 2285 strh r2, [r4, #40] @ movhi +1190:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_NO_STARTSTOP); + 1685 .loc 1 1190 11 is_stmt 1 view .LVU535 + 1686 00a2 0023 movs r3, #0 + 1687 00a4 0093 str r3, [sp] + 1688 00a6 4FF00073 mov r3, #33554432 + 1689 00aa D2B2 uxtb r2, r2 + 1690 00ac 3946 mov r1, r7 + 1691 00ae 2046 mov r0, r4 + 1692 00b0 FFF7FEFF bl I2C_TransferConfig + 1693 .LVL97: + 1694 .L137: +1157:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + ARM GAS /tmp/ccE2rRGE.s page 157 + + + 1695 .loc 1 1157 28 view .LVU536 +1157:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1696 .loc 1 1157 16 is_stmt 0 view .LVU537 + 1697 00b4 638D ldrh r3, [r4, #42] + 1698 00b6 9BB2 uxth r3, r3 +1157:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1699 .loc 1 1157 28 view .LVU538 + 1700 00b8 002B cmp r3, #0 + 1701 00ba 33D0 beq .L148 +1160:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1702 .loc 1 1160 7 is_stmt 1 view .LVU539 +1160:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1703 .loc 1 1160 11 is_stmt 0 view .LVU540 + 1704 00bc 2A46 mov r2, r5 + 1705 00be 3146 mov r1, r6 + 1706 00c0 2046 mov r0, r4 + 1707 00c2 FFF7FEFF bl I2C_WaitOnTXISFlagUntilTimeout + 1708 .LVL98: +1160:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1709 .loc 1 1160 10 view .LVU541 + 1710 00c6 0028 cmp r0, #0 + 1711 00c8 50D1 bne .L144 +1165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1712 .loc 1 1165 7 is_stmt 1 view .LVU542 +1165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1713 .loc 1 1165 35 is_stmt 0 view .LVU543 + 1714 00ca 626A ldr r2, [r4, #36] +1165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1715 .loc 1 1165 11 view .LVU544 + 1716 00cc 2368 ldr r3, [r4] +1165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1717 .loc 1 1165 30 view .LVU545 + 1718 00ce 1278 ldrb r2, [r2] @ zero_extendqisi2 +1165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1719 .loc 1 1165 28 view .LVU546 + 1720 00d0 9A62 str r2, [r3, #40] +1168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1721 .loc 1 1168 7 is_stmt 1 view .LVU547 +1168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1722 .loc 1 1168 11 is_stmt 0 view .LVU548 + 1723 00d2 636A ldr r3, [r4, #36] +1168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1724 .loc 1 1168 21 view .LVU549 + 1725 00d4 0133 adds r3, r3, #1 + 1726 00d6 6362 str r3, [r4, #36] +1170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize--; + 1727 .loc 1 1170 7 is_stmt 1 view .LVU550 +1170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize--; + 1728 .loc 1 1170 11 is_stmt 0 view .LVU551 + 1729 00d8 638D ldrh r3, [r4, #42] + 1730 00da 9BB2 uxth r3, r3 +1170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize--; + 1731 .loc 1 1170 22 view .LVU552 + 1732 00dc 013B subs r3, r3, #1 + 1733 00de 9BB2 uxth r3, r3 + 1734 00e0 6385 strh r3, [r4, #42] @ movhi +1171:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + ARM GAS /tmp/ccE2rRGE.s page 158 + + + 1735 .loc 1 1171 7 is_stmt 1 view .LVU553 +1171:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1736 .loc 1 1171 11 is_stmt 0 view .LVU554 + 1737 00e2 238D ldrh r3, [r4, #40] +1171:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1738 .loc 1 1171 21 view .LVU555 + 1739 00e4 013B subs r3, r3, #1 + 1740 00e6 9BB2 uxth r3, r3 + 1741 00e8 2385 strh r3, [r4, #40] @ movhi +1173:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1742 .loc 1 1173 7 is_stmt 1 view .LVU556 +1173:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1743 .loc 1 1173 16 is_stmt 0 view .LVU557 + 1744 00ea 628D ldrh r2, [r4, #42] + 1745 00ec 92B2 uxth r2, r2 +1173:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1746 .loc 1 1173 10 view .LVU558 + 1747 00ee 002A cmp r2, #0 + 1748 00f0 E0D0 beq .L137 +1173:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1749 .loc 1 1173 35 discriminator 1 view .LVU559 + 1750 00f2 002B cmp r3, #0 + 1751 00f4 DED1 bne .L137 +1176:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1752 .loc 1 1176 9 is_stmt 1 view .LVU560 +1176:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1753 .loc 1 1176 13 is_stmt 0 view .LVU561 + 1754 00f6 0095 str r5, [sp] + 1755 00f8 3346 mov r3, r6 + 1756 00fa 0022 movs r2, #0 + 1757 00fc 8021 movs r1, #128 + 1758 00fe 2046 mov r0, r4 + 1759 0100 FFF7FEFF bl I2C_WaitOnFlagUntilTimeout + 1760 .LVL99: +1176:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1761 .loc 1 1176 12 view .LVU562 + 1762 0104 A0BB cbnz r0, .L145 +1181:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1763 .loc 1 1181 9 is_stmt 1 view .LVU563 +1181:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1764 .loc 1 1181 17 is_stmt 0 view .LVU564 + 1765 0106 638D ldrh r3, [r4, #42] + 1766 0108 9BB2 uxth r3, r3 +1181:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1767 .loc 1 1181 12 view .LVU565 + 1768 010a FF2B cmp r3, #255 + 1769 010c C6D9 bls .L139 +1183:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, + 1770 .loc 1 1183 11 is_stmt 1 view .LVU566 +1183:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, + 1771 .loc 1 1183 26 is_stmt 0 view .LVU567 + 1772 010e FF22 movs r2, #255 + 1773 0110 2285 strh r2, [r4, #40] @ movhi +1184:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_NO_STARTSTOP); + 1774 .loc 1 1184 11 is_stmt 1 view .LVU568 + 1775 0112 0023 movs r3, #0 + 1776 0114 0093 str r3, [sp] + ARM GAS /tmp/ccE2rRGE.s page 159 + + + 1777 0116 4FF08073 mov r3, #16777216 + 1778 011a 3946 mov r1, r7 + 1779 011c 2046 mov r0, r4 + 1780 011e FFF7FEFF bl I2C_TransferConfig + 1781 .LVL100: + 1782 0122 C7E7 b .L137 + 1783 .L148: +1198:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1784 .loc 1 1198 5 view .LVU569 +1198:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1785 .loc 1 1198 9 is_stmt 0 view .LVU570 + 1786 0124 2A46 mov r2, r5 + 1787 0126 3146 mov r1, r6 + 1788 0128 2046 mov r0, r4 + 1789 012a FFF7FEFF bl I2C_WaitOnSTOPFlagUntilTimeout + 1790 .LVL101: +1198:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1791 .loc 1 1198 8 view .LVU571 + 1792 012e 08BB cbnz r0, .L146 +1204:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1793 .loc 1 1204 5 is_stmt 1 view .LVU572 + 1794 0130 2368 ldr r3, [r4] + 1795 0132 2022 movs r2, #32 + 1796 0134 DA61 str r2, [r3, #28] +1207:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1797 .loc 1 1207 5 view .LVU573 + 1798 0136 2168 ldr r1, [r4] + 1799 0138 4B68 ldr r3, [r1, #4] + 1800 013a 23F0FF73 bic r3, r3, #33423360 + 1801 013e 23F48B33 bic r3, r3, #71168 + 1802 0142 23F4FF73 bic r3, r3, #510 + 1803 0146 23F00103 bic r3, r3, #1 + 1804 014a 4B60 str r3, [r1, #4] +1209:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 1805 .loc 1 1209 5 view .LVU574 +1209:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 1806 .loc 1 1209 17 is_stmt 0 view .LVU575 + 1807 014c 84F84120 strb r2, [r4, #65] +1210:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1808 .loc 1 1210 5 is_stmt 1 view .LVU576 +1210:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1809 .loc 1 1210 17 is_stmt 0 view .LVU577 + 1810 0150 0023 movs r3, #0 + 1811 0152 84F84230 strb r3, [r4, #66] +1213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1812 .loc 1 1213 5 is_stmt 1 view .LVU578 +1213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1813 .loc 1 1213 5 view .LVU579 + 1814 0156 84F84030 strb r3, [r4, #64] +1213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1815 .loc 1 1213 5 view .LVU580 +1215:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 1816 .loc 1 1215 5 view .LVU581 +1215:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 1817 .loc 1 1215 12 is_stmt 0 view .LVU582 + 1818 015a 00E0 b .L134 + 1819 .LVL102: + ARM GAS /tmp/ccE2rRGE.s page 160 + + + 1820 .L141: +1219:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 1821 .loc 1 1219 12 view .LVU583 + 1822 015c 0220 movs r0, #2 + 1823 .LVL103: + 1824 .L134: +1221:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1825 .loc 1 1221 1 view .LVU584 + 1826 015e 02B0 add sp, sp, #8 + 1827 .cfi_remember_state + 1828 .cfi_def_cfa_offset 32 + 1829 @ sp needed + 1830 0160 BDE8F087 pop {r4, r5, r6, r7, r8, r9, r10, pc} + 1831 .LVL104: + 1832 .L142: + 1833 .cfi_restore_state +1123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1834 .loc 1 1123 5 view .LVU585 + 1835 0164 0220 movs r0, #2 + 1836 .LVL105: +1123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1837 .loc 1 1123 5 view .LVU586 + 1838 0166 FAE7 b .L134 + 1839 .LVL106: + 1840 .L143: +1130:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 1841 .loc 1 1130 14 view .LVU587 + 1842 0168 0120 movs r0, #1 + 1843 016a F8E7 b .L134 + 1844 .L144: +1162:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 1845 .loc 1 1162 16 view .LVU588 + 1846 016c 0120 movs r0, #1 + 1847 016e F6E7 b .L134 + 1848 .L145: +1178:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 1849 .loc 1 1178 18 view .LVU589 + 1850 0170 0120 movs r0, #1 + 1851 0172 F4E7 b .L134 + 1852 .L146: +1200:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 1853 .loc 1 1200 14 view .LVU590 + 1854 0174 0120 movs r0, #1 + 1855 0176 F2E7 b .L134 + 1856 .L150: + 1857 .align 2 + 1858 .L149: + 1859 0178 00200080 .word -2147475456 + 1860 .cfi_endproc + 1861 .LFE134: + 1863 .section .text.HAL_I2C_Master_Receive,"ax",%progbits + 1864 .align 1 + 1865 .global HAL_I2C_Master_Receive + 1866 .syntax unified + 1867 .thumb + 1868 .thumb_func + 1870 HAL_I2C_Master_Receive: + ARM GAS /tmp/ccE2rRGE.s page 161 + + + 1871 .LVL107: + 1872 .LFB135: +1236:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tickstart; + 1873 .loc 1 1236 1 is_stmt 1 view -0 + 1874 .cfi_startproc + 1875 @ args = 4, pretend = 0, frame = 0 + 1876 @ frame_needed = 0, uses_anonymous_args = 0 +1236:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tickstart; + 1877 .loc 1 1236 1 is_stmt 0 view .LVU592 + 1878 0000 2DE9F047 push {r4, r5, r6, r7, r8, r9, r10, lr} + 1879 .cfi_def_cfa_offset 32 + 1880 .cfi_offset 4, -32 + 1881 .cfi_offset 5, -28 + 1882 .cfi_offset 6, -24 + 1883 .cfi_offset 7, -20 + 1884 .cfi_offset 8, -16 + 1885 .cfi_offset 9, -12 + 1886 .cfi_offset 10, -8 + 1887 .cfi_offset 14, -4 + 1888 0004 82B0 sub sp, sp, #8 + 1889 .cfi_def_cfa_offset 40 + 1890 0006 0F46 mov r7, r1 + 1891 0008 0A9E ldr r6, [sp, #40] +1237:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1892 .loc 1 1237 3 is_stmt 1 view .LVU593 +1239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1893 .loc 1 1239 3 view .LVU594 +1239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1894 .loc 1 1239 11 is_stmt 0 view .LVU595 + 1895 000a 90F84110 ldrb r1, [r0, #65] @ zero_extendqisi2 + 1896 .LVL108: +1239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1897 .loc 1 1239 11 view .LVU596 + 1898 000e C9B2 uxtb r1, r1 +1239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1899 .loc 1 1239 6 view .LVU597 + 1900 0010 2029 cmp r1, #32 + 1901 0012 40F0A280 bne .L159 + 1902 0016 0446 mov r4, r0 + 1903 0018 9046 mov r8, r2 + 1904 001a 9946 mov r9, r3 +1242:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1905 .loc 1 1242 5 is_stmt 1 view .LVU598 +1242:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1906 .loc 1 1242 5 view .LVU599 + 1907 001c 90F84030 ldrb r3, [r0, #64] @ zero_extendqisi2 + 1908 .LVL109: +1242:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1909 .loc 1 1242 5 is_stmt 0 view .LVU600 + 1910 0020 012B cmp r3, #1 + 1911 0022 00F09E80 beq .L160 +1242:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1912 .loc 1 1242 5 is_stmt 1 discriminator 2 view .LVU601 + 1913 0026 4FF0010A mov r10, #1 + 1914 002a 80F840A0 strb r10, [r0, #64] +1242:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1915 .loc 1 1242 5 discriminator 2 view .LVU602 + ARM GAS /tmp/ccE2rRGE.s page 162 + + +1245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1916 .loc 1 1245 5 discriminator 2 view .LVU603 +1245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1917 .loc 1 1245 17 is_stmt 0 discriminator 2 view .LVU604 + 1918 002e FFF7FEFF bl HAL_GetTick + 1919 .LVL110: +1245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1920 .loc 1 1245 17 discriminator 2 view .LVU605 + 1921 0032 0546 mov r5, r0 + 1922 .LVL111: +1247:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1923 .loc 1 1247 5 is_stmt 1 discriminator 2 view .LVU606 +1247:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1924 .loc 1 1247 9 is_stmt 0 discriminator 2 view .LVU607 + 1925 0034 0090 str r0, [sp] + 1926 0036 1923 movs r3, #25 + 1927 0038 5246 mov r2, r10 + 1928 003a 4FF40041 mov r1, #32768 + 1929 003e 2046 mov r0, r4 + 1930 .LVL112: +1247:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1931 .loc 1 1247 9 discriminator 2 view .LVU608 + 1932 0040 FFF7FEFF bl I2C_WaitOnFlagUntilTimeout + 1933 .LVL113: +1247:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1934 .loc 1 1247 8 discriminator 2 view .LVU609 + 1935 0044 0028 cmp r0, #0 + 1936 0046 40F08E80 bne .L161 +1252:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MASTER; + 1937 .loc 1 1252 5 is_stmt 1 view .LVU610 +1252:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MASTER; + 1938 .loc 1 1252 21 is_stmt 0 view .LVU611 + 1939 004a 2223 movs r3, #34 + 1940 004c 84F84130 strb r3, [r4, #65] +1253:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 1941 .loc 1 1253 5 is_stmt 1 view .LVU612 +1253:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 1942 .loc 1 1253 21 is_stmt 0 view .LVU613 + 1943 0050 1023 movs r3, #16 + 1944 0052 84F84230 strb r3, [r4, #66] +1254:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1945 .loc 1 1254 5 is_stmt 1 view .LVU614 +1254:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1946 .loc 1 1254 21 is_stmt 0 view .LVU615 + 1947 0056 0023 movs r3, #0 + 1948 0058 6364 str r3, [r4, #68] +1257:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 1949 .loc 1 1257 5 is_stmt 1 view .LVU616 +1257:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 1950 .loc 1 1257 21 is_stmt 0 view .LVU617 + 1951 005a C4F82480 str r8, [r4, #36] +1258:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = NULL; + 1952 .loc 1 1258 5 is_stmt 1 view .LVU618 +1258:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = NULL; + 1953 .loc 1 1258 21 is_stmt 0 view .LVU619 + 1954 005e A4F82A90 strh r9, [r4, #42] @ movhi +1259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + ARM GAS /tmp/ccE2rRGE.s page 163 + + + 1955 .loc 1 1259 5 is_stmt 1 view .LVU620 +1259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 1956 .loc 1 1259 21 is_stmt 0 view .LVU621 + 1957 0062 6363 str r3, [r4, #52] +1263:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1958 .loc 1 1263 5 is_stmt 1 view .LVU622 +1263:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1959 .loc 1 1263 13 is_stmt 0 view .LVU623 + 1960 0064 638D ldrh r3, [r4, #42] + 1961 0066 9BB2 uxth r3, r3 +1263:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 1962 .loc 1 1263 8 view .LVU624 + 1963 0068 FF2B cmp r3, #255 + 1964 006a 0AD9 bls .L153 +1265:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, + 1965 .loc 1 1265 7 is_stmt 1 view .LVU625 +1265:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, + 1966 .loc 1 1265 22 is_stmt 0 view .LVU626 + 1967 006c FF22 movs r2, #255 + 1968 006e 2285 strh r2, [r4, #40] @ movhi +1266:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_GENERATE_START_READ); + 1969 .loc 1 1266 7 is_stmt 1 view .LVU627 + 1970 0070 414B ldr r3, .L167 + 1971 0072 0093 str r3, [sp] + 1972 0074 4FF08073 mov r3, #16777216 + 1973 0078 3946 mov r1, r7 + 1974 007a 2046 mov r0, r4 + 1975 007c FFF7FEFF bl I2C_TransferConfig + 1976 .LVL114: + 1977 0080 18E0 b .L155 + 1978 .L153: +1271:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, + 1979 .loc 1 1271 7 view .LVU628 +1271:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, + 1980 .loc 1 1271 28 is_stmt 0 view .LVU629 + 1981 0082 628D ldrh r2, [r4, #42] + 1982 0084 92B2 uxth r2, r2 +1271:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, + 1983 .loc 1 1271 22 view .LVU630 + 1984 0086 2285 strh r2, [r4, #40] @ movhi +1272:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_GENERATE_START_READ); + 1985 .loc 1 1272 7 is_stmt 1 view .LVU631 + 1986 0088 3B4B ldr r3, .L167 + 1987 008a 0093 str r3, [sp] + 1988 008c 4FF00073 mov r3, #33554432 + 1989 0090 D2B2 uxtb r2, r2 + 1990 0092 3946 mov r1, r7 + 1991 0094 2046 mov r0, r4 + 1992 0096 FFF7FEFF bl I2C_TransferConfig + 1993 .LVL115: + 1994 009a 0BE0 b .L155 + 1995 .L157: +1309:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, + 1996 .loc 1 1309 11 view .LVU632 +1309:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, + 1997 .loc 1 1309 32 is_stmt 0 view .LVU633 + 1998 009c 628D ldrh r2, [r4, #42] + ARM GAS /tmp/ccE2rRGE.s page 164 + + + 1999 009e 92B2 uxth r2, r2 +1309:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, + 2000 .loc 1 1309 26 view .LVU634 + 2001 00a0 2285 strh r2, [r4, #40] @ movhi +1310:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_NO_STARTSTOP); + 2002 .loc 1 1310 11 is_stmt 1 view .LVU635 + 2003 00a2 0023 movs r3, #0 + 2004 00a4 0093 str r3, [sp] + 2005 00a6 4FF00073 mov r3, #33554432 + 2006 00aa D2B2 uxtb r2, r2 + 2007 00ac 3946 mov r1, r7 + 2008 00ae 2046 mov r0, r4 + 2009 00b0 FFF7FEFF bl I2C_TransferConfig + 2010 .LVL116: + 2011 .L155: +1276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2012 .loc 1 1276 28 view .LVU636 +1276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2013 .loc 1 1276 16 is_stmt 0 view .LVU637 + 2014 00b4 638D ldrh r3, [r4, #42] + 2015 00b6 9BB2 uxth r3, r3 +1276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2016 .loc 1 1276 28 view .LVU638 + 2017 00b8 002B cmp r3, #0 + 2018 00ba 32D0 beq .L166 +1279:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2019 .loc 1 1279 7 is_stmt 1 view .LVU639 +1279:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2020 .loc 1 1279 11 is_stmt 0 view .LVU640 + 2021 00bc 2A46 mov r2, r5 + 2022 00be 3146 mov r1, r6 + 2023 00c0 2046 mov r0, r4 + 2024 00c2 FFF7FEFF bl I2C_WaitOnRXNEFlagUntilTimeout + 2025 .LVL117: +1279:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2026 .loc 1 1279 10 view .LVU641 + 2027 00c6 0028 cmp r0, #0 + 2028 00c8 4FD1 bne .L162 +1285:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2029 .loc 1 1285 7 is_stmt 1 view .LVU642 +1285:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2030 .loc 1 1285 38 is_stmt 0 view .LVU643 + 2031 00ca 2368 ldr r3, [r4] +1285:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2032 .loc 1 1285 48 view .LVU644 + 2033 00cc 5A6A ldr r2, [r3, #36] +1285:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2034 .loc 1 1285 12 view .LVU645 + 2035 00ce 636A ldr r3, [r4, #36] +1285:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2036 .loc 1 1285 23 view .LVU646 + 2037 00d0 1A70 strb r2, [r3] +1288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2038 .loc 1 1288 7 is_stmt 1 view .LVU647 +1288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2039 .loc 1 1288 11 is_stmt 0 view .LVU648 + 2040 00d2 636A ldr r3, [r4, #36] + ARM GAS /tmp/ccE2rRGE.s page 165 + + +1288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2041 .loc 1 1288 21 view .LVU649 + 2042 00d4 0133 adds r3, r3, #1 + 2043 00d6 6362 str r3, [r4, #36] +1290:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount--; + 2044 .loc 1 1290 7 is_stmt 1 view .LVU650 +1290:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount--; + 2045 .loc 1 1290 11 is_stmt 0 view .LVU651 + 2046 00d8 228D ldrh r2, [r4, #40] +1290:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount--; + 2047 .loc 1 1290 21 view .LVU652 + 2048 00da 013A subs r2, r2, #1 + 2049 00dc 92B2 uxth r2, r2 + 2050 00de 2285 strh r2, [r4, #40] @ movhi +1291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2051 .loc 1 1291 7 is_stmt 1 view .LVU653 +1291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2052 .loc 1 1291 11 is_stmt 0 view .LVU654 + 2053 00e0 638D ldrh r3, [r4, #42] + 2054 00e2 9BB2 uxth r3, r3 +1291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2055 .loc 1 1291 22 view .LVU655 + 2056 00e4 013B subs r3, r3, #1 + 2057 00e6 9BB2 uxth r3, r3 + 2058 00e8 6385 strh r3, [r4, #42] @ movhi +1293:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2059 .loc 1 1293 7 is_stmt 1 view .LVU656 +1293:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2060 .loc 1 1293 16 is_stmt 0 view .LVU657 + 2061 00ea 638D ldrh r3, [r4, #42] + 2062 00ec 9BB2 uxth r3, r3 +1293:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2063 .loc 1 1293 10 view .LVU658 + 2064 00ee 002B cmp r3, #0 + 2065 00f0 E0D0 beq .L155 +1293:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2066 .loc 1 1293 35 discriminator 1 view .LVU659 + 2067 00f2 002A cmp r2, #0 + 2068 00f4 DED1 bne .L155 +1296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2069 .loc 1 1296 9 is_stmt 1 view .LVU660 +1296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2070 .loc 1 1296 13 is_stmt 0 view .LVU661 + 2071 00f6 0095 str r5, [sp] + 2072 00f8 3346 mov r3, r6 + 2073 00fa 8021 movs r1, #128 + 2074 00fc 2046 mov r0, r4 + 2075 00fe FFF7FEFF bl I2C_WaitOnFlagUntilTimeout + 2076 .LVL118: +1296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2077 .loc 1 1296 12 view .LVU662 + 2078 0102 A0BB cbnz r0, .L163 +1301:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2079 .loc 1 1301 9 is_stmt 1 view .LVU663 +1301:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2080 .loc 1 1301 17 is_stmt 0 view .LVU664 + 2081 0104 638D ldrh r3, [r4, #42] + ARM GAS /tmp/ccE2rRGE.s page 166 + + + 2082 0106 9BB2 uxth r3, r3 +1301:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2083 .loc 1 1301 12 view .LVU665 + 2084 0108 FF2B cmp r3, #255 + 2085 010a C7D9 bls .L157 +1303:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, + 2086 .loc 1 1303 11 is_stmt 1 view .LVU666 +1303:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, + 2087 .loc 1 1303 26 is_stmt 0 view .LVU667 + 2088 010c FF22 movs r2, #255 + 2089 010e 2285 strh r2, [r4, #40] @ movhi +1304:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_NO_STARTSTOP); + 2090 .loc 1 1304 11 is_stmt 1 view .LVU668 + 2091 0110 0023 movs r3, #0 + 2092 0112 0093 str r3, [sp] + 2093 0114 4FF08073 mov r3, #16777216 + 2094 0118 3946 mov r1, r7 + 2095 011a 2046 mov r0, r4 + 2096 011c FFF7FEFF bl I2C_TransferConfig + 2097 .LVL119: + 2098 0120 C8E7 b .L155 + 2099 .L166: +1318:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2100 .loc 1 1318 5 view .LVU669 +1318:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2101 .loc 1 1318 9 is_stmt 0 view .LVU670 + 2102 0122 2A46 mov r2, r5 + 2103 0124 3146 mov r1, r6 + 2104 0126 2046 mov r0, r4 + 2105 0128 FFF7FEFF bl I2C_WaitOnSTOPFlagUntilTimeout + 2106 .LVL120: +1318:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2107 .loc 1 1318 8 view .LVU671 + 2108 012c 08BB cbnz r0, .L164 +1324:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2109 .loc 1 1324 5 is_stmt 1 view .LVU672 + 2110 012e 2368 ldr r3, [r4] + 2111 0130 2022 movs r2, #32 + 2112 0132 DA61 str r2, [r3, #28] +1327:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2113 .loc 1 1327 5 view .LVU673 + 2114 0134 2168 ldr r1, [r4] + 2115 0136 4B68 ldr r3, [r1, #4] + 2116 0138 23F0FF73 bic r3, r3, #33423360 + 2117 013c 23F48B33 bic r3, r3, #71168 + 2118 0140 23F4FF73 bic r3, r3, #510 + 2119 0144 23F00103 bic r3, r3, #1 + 2120 0148 4B60 str r3, [r1, #4] +1329:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 2121 .loc 1 1329 5 view .LVU674 +1329:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 2122 .loc 1 1329 17 is_stmt 0 view .LVU675 + 2123 014a 84F84120 strb r2, [r4, #65] +1330:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2124 .loc 1 1330 5 is_stmt 1 view .LVU676 +1330:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2125 .loc 1 1330 17 is_stmt 0 view .LVU677 + ARM GAS /tmp/ccE2rRGE.s page 167 + + + 2126 014e 0023 movs r3, #0 + 2127 0150 84F84230 strb r3, [r4, #66] +1333:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2128 .loc 1 1333 5 is_stmt 1 view .LVU678 +1333:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2129 .loc 1 1333 5 view .LVU679 + 2130 0154 84F84030 strb r3, [r4, #64] +1333:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2131 .loc 1 1333 5 view .LVU680 +1335:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2132 .loc 1 1335 5 view .LVU681 +1335:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2133 .loc 1 1335 12 is_stmt 0 view .LVU682 + 2134 0158 00E0 b .L152 + 2135 .LVL121: + 2136 .L159: +1339:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2137 .loc 1 1339 12 view .LVU683 + 2138 015a 0220 movs r0, #2 + 2139 .LVL122: + 2140 .L152: +1341:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2141 .loc 1 1341 1 view .LVU684 + 2142 015c 02B0 add sp, sp, #8 + 2143 .cfi_remember_state + 2144 .cfi_def_cfa_offset 32 + 2145 @ sp needed + 2146 015e BDE8F087 pop {r4, r5, r6, r7, r8, r9, r10, pc} + 2147 .LVL123: + 2148 .L160: + 2149 .cfi_restore_state +1242:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2150 .loc 1 1242 5 view .LVU685 + 2151 0162 0220 movs r0, #2 + 2152 .LVL124: +1242:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2153 .loc 1 1242 5 view .LVU686 + 2154 0164 FAE7 b .L152 + 2155 .LVL125: + 2156 .L161: +1249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2157 .loc 1 1249 14 view .LVU687 + 2158 0166 0120 movs r0, #1 + 2159 0168 F8E7 b .L152 + 2160 .L162: +1281:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2161 .loc 1 1281 16 view .LVU688 + 2162 016a 0120 movs r0, #1 + 2163 016c F6E7 b .L152 + 2164 .L163: +1298:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2165 .loc 1 1298 18 view .LVU689 + 2166 016e 0120 movs r0, #1 + 2167 0170 F4E7 b .L152 + 2168 .L164: +1320:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2169 .loc 1 1320 14 view .LVU690 + ARM GAS /tmp/ccE2rRGE.s page 168 + + + 2170 0172 0120 movs r0, #1 + 2171 0174 F2E7 b .L152 + 2172 .L168: + 2173 0176 00BF .align 2 + 2174 .L167: + 2175 0178 00240080 .word -2147474432 + 2176 .cfi_endproc + 2177 .LFE135: + 2179 .section .text.HAL_I2C_Slave_Transmit,"ax",%progbits + 2180 .align 1 + 2181 .global HAL_I2C_Slave_Transmit + 2182 .syntax unified + 2183 .thumb + 2184 .thumb_func + 2186 HAL_I2C_Slave_Transmit: + 2187 .LVL126: + 2188 .LFB136: +1354:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tickstart; + 2189 .loc 1 1354 1 is_stmt 1 view -0 + 2190 .cfi_startproc + 2191 @ args = 0, pretend = 0, frame = 0 + 2192 @ frame_needed = 0, uses_anonymous_args = 0 +1354:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tickstart; + 2193 .loc 1 1354 1 is_stmt 0 view .LVU692 + 2194 0000 2DE9F041 push {r4, r5, r6, r7, r8, lr} + 2195 .cfi_def_cfa_offset 24 + 2196 .cfi_offset 4, -24 + 2197 .cfi_offset 5, -20 + 2198 .cfi_offset 6, -16 + 2199 .cfi_offset 7, -12 + 2200 .cfi_offset 8, -8 + 2201 .cfi_offset 14, -4 + 2202 0004 82B0 sub sp, sp, #8 + 2203 .cfi_def_cfa_offset 32 + 2204 0006 1D46 mov r5, r3 +1355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2205 .loc 1 1355 3 is_stmt 1 view .LVU693 +1357:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2206 .loc 1 1357 3 view .LVU694 +1357:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2207 .loc 1 1357 11 is_stmt 0 view .LVU695 + 2208 0008 90F84130 ldrb r3, [r0, #65] @ zero_extendqisi2 + 2209 .LVL127: +1357:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2210 .loc 1 1357 11 view .LVU696 + 2211 000c DBB2 uxtb r3, r3 +1357:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2212 .loc 1 1357 6 view .LVU697 + 2213 000e 202B cmp r3, #32 + 2214 0010 40F0B680 bne .L181 + 2215 0014 0446 mov r4, r0 + 2216 0016 0F46 mov r7, r1 + 2217 0018 9046 mov r8, r2 +1359:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2218 .loc 1 1359 5 is_stmt 1 view .LVU698 +1359:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2219 .loc 1 1359 8 is_stmt 0 view .LVU699 + ARM GAS /tmp/ccE2rRGE.s page 169 + + + 2220 001a 0029 cmp r1, #0 + 2221 001c 52D0 beq .L171 +1359:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2222 .loc 1 1359 25 discriminator 1 view .LVU700 + 2223 001e 002A cmp r2, #0 + 2224 0020 50D0 beq .L171 +1365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2225 .loc 1 1365 5 is_stmt 1 view .LVU701 +1365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2226 .loc 1 1365 5 view .LVU702 + 2227 0022 90F84030 ldrb r3, [r0, #64] @ zero_extendqisi2 + 2228 0026 012B cmp r3, #1 + 2229 0028 00F0AE80 beq .L182 +1365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2230 .loc 1 1365 5 discriminator 2 view .LVU703 + 2231 002c 0123 movs r3, #1 + 2232 002e 80F84030 strb r3, [r0, #64] +1365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2233 .loc 1 1365 5 discriminator 2 view .LVU704 +1368:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2234 .loc 1 1368 5 discriminator 2 view .LVU705 +1368:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2235 .loc 1 1368 17 is_stmt 0 discriminator 2 view .LVU706 + 2236 0032 FFF7FEFF bl HAL_GetTick + 2237 .LVL128: +1368:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2238 .loc 1 1368 17 discriminator 2 view .LVU707 + 2239 0036 0646 mov r6, r0 + 2240 .LVL129: +1370:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_SLAVE; + 2241 .loc 1 1370 5 is_stmt 1 discriminator 2 view .LVU708 +1370:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_SLAVE; + 2242 .loc 1 1370 21 is_stmt 0 discriminator 2 view .LVU709 + 2243 0038 2123 movs r3, #33 + 2244 003a 84F84130 strb r3, [r4, #65] +1371:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 2245 .loc 1 1371 5 is_stmt 1 discriminator 2 view .LVU710 +1371:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 2246 .loc 1 1371 21 is_stmt 0 discriminator 2 view .LVU711 + 2247 003e 2023 movs r3, #32 + 2248 0040 84F84230 strb r3, [r4, #66] +1372:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2249 .loc 1 1372 5 is_stmt 1 discriminator 2 view .LVU712 +1372:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2250 .loc 1 1372 21 is_stmt 0 discriminator 2 view .LVU713 + 2251 0044 0022 movs r2, #0 + 2252 0046 6264 str r2, [r4, #68] +1375:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 2253 .loc 1 1375 5 is_stmt 1 discriminator 2 view .LVU714 +1375:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 2254 .loc 1 1375 21 is_stmt 0 discriminator 2 view .LVU715 + 2255 0048 6762 str r7, [r4, #36] +1376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = NULL; + 2256 .loc 1 1376 5 is_stmt 1 discriminator 2 view .LVU716 +1376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = NULL; + 2257 .loc 1 1376 21 is_stmt 0 discriminator 2 view .LVU717 + 2258 004a A4F82A80 strh r8, [r4, #42] @ movhi + ARM GAS /tmp/ccE2rRGE.s page 170 + + +1377:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2259 .loc 1 1377 5 is_stmt 1 discriminator 2 view .LVU718 +1377:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2260 .loc 1 1377 21 is_stmt 0 discriminator 2 view .LVU719 + 2261 004e 6263 str r2, [r4, #52] +1380:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2262 .loc 1 1380 5 is_stmt 1 discriminator 2 view .LVU720 +1380:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2263 .loc 1 1380 9 is_stmt 0 discriminator 2 view .LVU721 + 2264 0050 2168 ldr r1, [r4] +1380:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2265 .loc 1 1380 19 discriminator 2 view .LVU722 + 2266 0052 4B68 ldr r3, [r1, #4] +1380:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2267 .loc 1 1380 25 discriminator 2 view .LVU723 + 2268 0054 23F40043 bic r3, r3, #32768 + 2269 0058 4B60 str r3, [r1, #4] +1383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2270 .loc 1 1383 5 is_stmt 1 discriminator 2 view .LVU724 +1383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2271 .loc 1 1383 9 is_stmt 0 discriminator 2 view .LVU725 + 2272 005a 0090 str r0, [sp] + 2273 005c 2B46 mov r3, r5 + 2274 005e 0821 movs r1, #8 + 2275 0060 2046 mov r0, r4 + 2276 .LVL130: +1383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2277 .loc 1 1383 9 discriminator 2 view .LVU726 + 2278 0062 FFF7FEFF bl I2C_WaitOnFlagUntilTimeout + 2279 .LVL131: +1383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2280 .loc 1 1383 8 discriminator 2 view .LVU727 + 2281 0066 0028 cmp r0, #0 + 2282 0068 31D1 bne .L185 +1391:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2283 .loc 1 1391 5 is_stmt 1 view .LVU728 + 2284 006a 2368 ldr r3, [r4] + 2285 006c 0822 movs r2, #8 + 2286 006e DA61 str r2, [r3, #28] +1394:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2287 .loc 1 1394 5 view .LVU729 +1394:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2288 .loc 1 1394 19 is_stmt 0 view .LVU730 + 2289 0070 E368 ldr r3, [r4, #12] +1394:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2290 .loc 1 1394 8 view .LVU731 + 2291 0072 022B cmp r3, #2 + 2292 0074 32D0 beq .L186 + 2293 .L174: +1409:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2294 .loc 1 1409 5 is_stmt 1 view .LVU732 +1409:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2295 .loc 1 1409 9 is_stmt 0 view .LVU733 + 2296 0076 0096 str r6, [sp] + 2297 0078 2B46 mov r3, r5 + 2298 007a 0022 movs r2, #0 + 2299 007c 4FF48031 mov r1, #65536 + ARM GAS /tmp/ccE2rRGE.s page 171 + + + 2300 0080 2046 mov r0, r4 + 2301 0082 FFF7FEFF bl I2C_WaitOnFlagUntilTimeout + 2302 .LVL132: +1409:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2303 .loc 1 1409 8 view .LVU734 + 2304 0086 0028 cmp r0, #0 + 2305 0088 3BD1 bne .L187 + 2306 .L176: +1416:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2307 .loc 1 1416 28 is_stmt 1 view .LVU735 +1416:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2308 .loc 1 1416 16 is_stmt 0 view .LVU736 + 2309 008a 638D ldrh r3, [r4, #42] + 2310 008c 9BB2 uxth r3, r3 +1416:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2311 .loc 1 1416 28 view .LVU737 + 2312 008e 002B cmp r3, #0 + 2313 0090 45D0 beq .L188 +1419:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2314 .loc 1 1419 7 is_stmt 1 view .LVU738 +1419:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2315 .loc 1 1419 11 is_stmt 0 view .LVU739 + 2316 0092 3246 mov r2, r6 + 2317 0094 2946 mov r1, r5 + 2318 0096 2046 mov r0, r4 + 2319 0098 FFF7FEFF bl I2C_WaitOnTXISFlagUntilTimeout + 2320 .LVL133: +1419:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2321 .loc 1 1419 10 view .LVU740 + 2322 009c 0028 cmp r0, #0 + 2323 009e 37D1 bne .L189 +1427:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2324 .loc 1 1427 7 is_stmt 1 view .LVU741 +1427:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2325 .loc 1 1427 35 is_stmt 0 view .LVU742 + 2326 00a0 626A ldr r2, [r4, #36] +1427:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2327 .loc 1 1427 11 view .LVU743 + 2328 00a2 2368 ldr r3, [r4] +1427:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2329 .loc 1 1427 30 view .LVU744 + 2330 00a4 1278 ldrb r2, [r2] @ zero_extendqisi2 +1427:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2331 .loc 1 1427 28 view .LVU745 + 2332 00a6 9A62 str r2, [r3, #40] +1430:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2333 .loc 1 1430 7 is_stmt 1 view .LVU746 +1430:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2334 .loc 1 1430 11 is_stmt 0 view .LVU747 + 2335 00a8 636A ldr r3, [r4, #36] +1430:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2336 .loc 1 1430 21 view .LVU748 + 2337 00aa 0133 adds r3, r3, #1 + 2338 00ac 6362 str r3, [r4, #36] +1432:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2339 .loc 1 1432 7 is_stmt 1 view .LVU749 +1432:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + ARM GAS /tmp/ccE2rRGE.s page 172 + + + 2340 .loc 1 1432 11 is_stmt 0 view .LVU750 + 2341 00ae B4F82AC0 ldrh ip, [r4, #42] + 2342 00b2 1FFA8CFC uxth ip, ip +1432:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2343 .loc 1 1432 22 view .LVU751 + 2344 00b6 0CF1FF3C add ip, ip, #-1 + 2345 00ba 1FFA8CFC uxth ip, ip + 2346 00be A4F82AC0 strh ip, [r4, #42] @ movhi + 2347 00c2 E2E7 b .L176 + 2348 .LVL134: + 2349 .L171: +1361:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 2350 .loc 1 1361 7 is_stmt 1 view .LVU752 +1361:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 2351 .loc 1 1361 23 is_stmt 0 view .LVU753 + 2352 00c4 4FF40073 mov r3, #512 + 2353 00c8 6364 str r3, [r4, #68] +1362:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2354 .loc 1 1362 7 is_stmt 1 view .LVU754 +1362:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2355 .loc 1 1362 15 is_stmt 0 view .LVU755 + 2356 00ca 0120 movs r0, #1 + 2357 .LVL135: +1362:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2358 .loc 1 1362 15 view .LVU756 + 2359 00cc 59E0 b .L170 + 2360 .LVL136: + 2361 .L185: +1386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 2362 .loc 1 1386 7 is_stmt 1 view .LVU757 +1386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 2363 .loc 1 1386 11 is_stmt 0 view .LVU758 + 2364 00ce 2268 ldr r2, [r4] +1386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 2365 .loc 1 1386 21 view .LVU759 + 2366 00d0 5368 ldr r3, [r2, #4] +1386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 2367 .loc 1 1386 27 view .LVU760 + 2368 00d2 43F40043 orr r3, r3, #32768 + 2369 00d6 5360 str r3, [r2, #4] +1387:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2370 .loc 1 1387 7 is_stmt 1 view .LVU761 +1387:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2371 .loc 1 1387 14 is_stmt 0 view .LVU762 + 2372 00d8 0120 movs r0, #1 + 2373 00da 52E0 b .L170 + 2374 .L186: +1397:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2375 .loc 1 1397 7 is_stmt 1 view .LVU763 +1397:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2376 .loc 1 1397 11 is_stmt 0 view .LVU764 + 2377 00dc 0096 str r6, [sp] + 2378 00de 2B46 mov r3, r5 + 2379 00e0 0022 movs r2, #0 + 2380 00e2 0821 movs r1, #8 + 2381 00e4 2046 mov r0, r4 + 2382 00e6 FFF7FEFF bl I2C_WaitOnFlagUntilTimeout + ARM GAS /tmp/ccE2rRGE.s page 173 + + + 2383 .LVL137: +1397:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2384 .loc 1 1397 10 view .LVU765 + 2385 00ea 18B9 cbnz r0, .L190 +1405:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2386 .loc 1 1405 7 is_stmt 1 view .LVU766 + 2387 00ec 2368 ldr r3, [r4] + 2388 00ee 0822 movs r2, #8 + 2389 00f0 DA61 str r2, [r3, #28] + 2390 00f2 C0E7 b .L174 + 2391 .L190: +1400:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 2392 .loc 1 1400 9 view .LVU767 +1400:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 2393 .loc 1 1400 13 is_stmt 0 view .LVU768 + 2394 00f4 2268 ldr r2, [r4] +1400:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 2395 .loc 1 1400 23 view .LVU769 + 2396 00f6 5368 ldr r3, [r2, #4] +1400:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 2397 .loc 1 1400 29 view .LVU770 + 2398 00f8 43F40043 orr r3, r3, #32768 + 2399 00fc 5360 str r3, [r2, #4] +1401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2400 .loc 1 1401 9 is_stmt 1 view .LVU771 +1401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2401 .loc 1 1401 16 is_stmt 0 view .LVU772 + 2402 00fe 0120 movs r0, #1 + 2403 0100 3FE0 b .L170 + 2404 .L187: +1412:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 2405 .loc 1 1412 7 is_stmt 1 view .LVU773 +1412:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 2406 .loc 1 1412 11 is_stmt 0 view .LVU774 + 2407 0102 2268 ldr r2, [r4] +1412:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 2408 .loc 1 1412 21 view .LVU775 + 2409 0104 5368 ldr r3, [r2, #4] +1412:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 2410 .loc 1 1412 27 view .LVU776 + 2411 0106 43F40043 orr r3, r3, #32768 + 2412 010a 5360 str r3, [r2, #4] +1413:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2413 .loc 1 1413 7 is_stmt 1 view .LVU777 +1413:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2414 .loc 1 1413 14 is_stmt 0 view .LVU778 + 2415 010c 0120 movs r0, #1 + 2416 010e 38E0 b .L170 + 2417 .L189: +1422:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 2418 .loc 1 1422 9 is_stmt 1 view .LVU779 +1422:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 2419 .loc 1 1422 13 is_stmt 0 view .LVU780 + 2420 0110 2268 ldr r2, [r4] +1422:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 2421 .loc 1 1422 23 view .LVU781 + 2422 0112 5368 ldr r3, [r2, #4] + ARM GAS /tmp/ccE2rRGE.s page 174 + + +1422:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 2423 .loc 1 1422 29 view .LVU782 + 2424 0114 43F40043 orr r3, r3, #32768 + 2425 0118 5360 str r3, [r2, #4] +1423:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2426 .loc 1 1423 9 is_stmt 1 view .LVU783 +1423:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2427 .loc 1 1423 16 is_stmt 0 view .LVU784 + 2428 011a 0120 movs r0, #1 + 2429 011c 31E0 b .L170 + 2430 .L188: +1436:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2431 .loc 1 1436 5 is_stmt 1 view .LVU785 +1436:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2432 .loc 1 1436 9 is_stmt 0 view .LVU786 + 2433 011e 3246 mov r2, r6 + 2434 0120 2946 mov r1, r5 + 2435 0122 2046 mov r0, r4 + 2436 0124 FFF7FEFF bl I2C_WaitOnSTOPFlagUntilTimeout + 2437 .LVL138: +1436:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2438 .loc 1 1436 8 view .LVU787 + 2439 0128 48B1 cbz r0, .L179 +1439:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2440 .loc 1 1439 7 is_stmt 1 view .LVU788 +1439:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2441 .loc 1 1439 11 is_stmt 0 view .LVU789 + 2442 012a 2268 ldr r2, [r4] +1439:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2443 .loc 1 1439 21 view .LVU790 + 2444 012c 5368 ldr r3, [r2, #4] +1439:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2445 .loc 1 1439 27 view .LVU791 + 2446 012e 43F40043 orr r3, r3, #32768 + 2447 0132 5360 str r3, [r2, #4] +1441:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2448 .loc 1 1441 7 is_stmt 1 view .LVU792 +1441:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2449 .loc 1 1441 15 is_stmt 0 view .LVU793 + 2450 0134 636C ldr r3, [r4, #68] +1441:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2451 .loc 1 1441 10 view .LVU794 + 2452 0136 042B cmp r3, #4 + 2453 0138 28D1 bne .L183 +1445:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2454 .loc 1 1445 9 is_stmt 1 view .LVU795 +1445:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2455 .loc 1 1445 25 is_stmt 0 view .LVU796 + 2456 013a 0023 movs r3, #0 + 2457 013c 6364 str r3, [r4, #68] + 2458 .L179: +1454:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2459 .loc 1 1454 5 is_stmt 1 view .LVU797 + 2460 013e 2368 ldr r3, [r4] + 2461 0140 2022 movs r2, #32 + 2462 0142 DA61 str r2, [r3, #28] +1457:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + ARM GAS /tmp/ccE2rRGE.s page 175 + + + 2463 .loc 1 1457 5 view .LVU798 +1457:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2464 .loc 1 1457 9 is_stmt 0 view .LVU799 + 2465 0144 0096 str r6, [sp] + 2466 0146 2B46 mov r3, r5 + 2467 0148 0122 movs r2, #1 + 2468 014a 4FF40041 mov r1, #32768 + 2469 014e 2046 mov r0, r4 + 2470 0150 FFF7FEFF bl I2C_WaitOnFlagUntilTimeout + 2471 .LVL139: +1457:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2472 .loc 1 1457 8 view .LVU800 + 2473 0154 30B1 cbz r0, .L180 +1460:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 2474 .loc 1 1460 7 is_stmt 1 view .LVU801 +1460:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 2475 .loc 1 1460 11 is_stmt 0 view .LVU802 + 2476 0156 2268 ldr r2, [r4] +1460:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 2477 .loc 1 1460 21 view .LVU803 + 2478 0158 5368 ldr r3, [r2, #4] +1460:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 2479 .loc 1 1460 27 view .LVU804 + 2480 015a 43F40043 orr r3, r3, #32768 + 2481 015e 5360 str r3, [r2, #4] +1461:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2482 .loc 1 1461 7 is_stmt 1 view .LVU805 +1461:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2483 .loc 1 1461 14 is_stmt 0 view .LVU806 + 2484 0160 0120 movs r0, #1 + 2485 0162 0EE0 b .L170 + 2486 .L180: +1465:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2487 .loc 1 1465 5 is_stmt 1 view .LVU807 +1465:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2488 .loc 1 1465 9 is_stmt 0 view .LVU808 + 2489 0164 2268 ldr r2, [r4] +1465:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2490 .loc 1 1465 19 view .LVU809 + 2491 0166 5368 ldr r3, [r2, #4] +1465:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2492 .loc 1 1465 25 view .LVU810 + 2493 0168 43F40043 orr r3, r3, #32768 + 2494 016c 5360 str r3, [r2, #4] +1467:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 2495 .loc 1 1467 5 is_stmt 1 view .LVU811 +1467:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 2496 .loc 1 1467 17 is_stmt 0 view .LVU812 + 2497 016e 2023 movs r3, #32 + 2498 0170 84F84130 strb r3, [r4, #65] +1468:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2499 .loc 1 1468 5 is_stmt 1 view .LVU813 +1468:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2500 .loc 1 1468 17 is_stmt 0 view .LVU814 + 2501 0174 0023 movs r3, #0 + 2502 0176 84F84230 strb r3, [r4, #66] +1471:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + ARM GAS /tmp/ccE2rRGE.s page 176 + + + 2503 .loc 1 1471 5 is_stmt 1 view .LVU815 +1471:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2504 .loc 1 1471 5 view .LVU816 + 2505 017a 84F84030 strb r3, [r4, #64] +1471:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2506 .loc 1 1471 5 view .LVU817 +1473:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2507 .loc 1 1473 5 view .LVU818 +1473:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2508 .loc 1 1473 12 is_stmt 0 view .LVU819 + 2509 017e 00E0 b .L170 + 2510 .LVL140: + 2511 .L181: +1477:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2512 .loc 1 1477 12 view .LVU820 + 2513 0180 0220 movs r0, #2 + 2514 .LVL141: + 2515 .L170: +1479:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2516 .loc 1 1479 1 view .LVU821 + 2517 0182 02B0 add sp, sp, #8 + 2518 .cfi_remember_state + 2519 .cfi_def_cfa_offset 24 + 2520 @ sp needed + 2521 0184 BDE8F081 pop {r4, r5, r6, r7, r8, pc} + 2522 .LVL142: + 2523 .L182: + 2524 .cfi_restore_state +1365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2525 .loc 1 1365 5 view .LVU822 + 2526 0188 0220 movs r0, #2 + 2527 .LVL143: +1365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2528 .loc 1 1365 5 view .LVU823 + 2529 018a FAE7 b .L170 + 2530 .LVL144: + 2531 .L183: +1449:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2532 .loc 1 1449 16 view .LVU824 + 2533 018c 0120 movs r0, #1 + 2534 018e F8E7 b .L170 + 2535 .cfi_endproc + 2536 .LFE136: + 2538 .section .text.HAL_I2C_Slave_Receive,"ax",%progbits + 2539 .align 1 + 2540 .global HAL_I2C_Slave_Receive + 2541 .syntax unified + 2542 .thumb + 2543 .thumb_func + 2545 HAL_I2C_Slave_Receive: + 2546 .LVL145: + 2547 .LFB137: +1492:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tickstart; + 2548 .loc 1 1492 1 is_stmt 1 view -0 + 2549 .cfi_startproc + 2550 @ args = 0, pretend = 0, frame = 0 + 2551 @ frame_needed = 0, uses_anonymous_args = 0 + ARM GAS /tmp/ccE2rRGE.s page 177 + + +1492:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tickstart; + 2552 .loc 1 1492 1 is_stmt 0 view .LVU826 + 2553 0000 2DE9F041 push {r4, r5, r6, r7, r8, lr} + 2554 .cfi_def_cfa_offset 24 + 2555 .cfi_offset 4, -24 + 2556 .cfi_offset 5, -20 + 2557 .cfi_offset 6, -16 + 2558 .cfi_offset 7, -12 + 2559 .cfi_offset 8, -8 + 2560 .cfi_offset 14, -4 + 2561 0004 82B0 sub sp, sp, #8 + 2562 .cfi_def_cfa_offset 32 + 2563 0006 1D46 mov r5, r3 +1493:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2564 .loc 1 1493 3 is_stmt 1 view .LVU827 +1495:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2565 .loc 1 1495 3 view .LVU828 +1495:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2566 .loc 1 1495 11 is_stmt 0 view .LVU829 + 2567 0008 90F84130 ldrb r3, [r0, #65] @ zero_extendqisi2 + 2568 .LVL146: +1495:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2569 .loc 1 1495 11 view .LVU830 + 2570 000c DBB2 uxtb r3, r3 +1495:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2571 .loc 1 1495 6 view .LVU831 + 2572 000e 202B cmp r3, #32 + 2573 0010 40F0A780 bne .L202 + 2574 0014 0446 mov r4, r0 + 2575 0016 0E46 mov r6, r1 + 2576 0018 9046 mov r8, r2 +1497:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2577 .loc 1 1497 5 is_stmt 1 view .LVU832 +1497:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2578 .loc 1 1497 8 is_stmt 0 view .LVU833 + 2579 001a 51B3 cbz r1, .L193 +1497:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2580 .loc 1 1497 25 discriminator 1 view .LVU834 + 2581 001c 4AB3 cbz r2, .L193 +1503:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2582 .loc 1 1503 5 is_stmt 1 view .LVU835 +1503:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2583 .loc 1 1503 5 view .LVU836 + 2584 001e 90F84030 ldrb r3, [r0, #64] @ zero_extendqisi2 + 2585 0022 012B cmp r3, #1 + 2586 0024 00F0A180 beq .L203 +1503:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2587 .loc 1 1503 5 discriminator 2 view .LVU837 + 2588 0028 0123 movs r3, #1 + 2589 002a 80F84030 strb r3, [r0, #64] +1503:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2590 .loc 1 1503 5 discriminator 2 view .LVU838 +1506:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2591 .loc 1 1506 5 discriminator 2 view .LVU839 +1506:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2592 .loc 1 1506 17 is_stmt 0 discriminator 2 view .LVU840 + 2593 002e FFF7FEFF bl HAL_GetTick + ARM GAS /tmp/ccE2rRGE.s page 178 + + + 2594 .LVL147: +1506:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2595 .loc 1 1506 17 discriminator 2 view .LVU841 + 2596 0032 0746 mov r7, r0 + 2597 .LVL148: +1508:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_SLAVE; + 2598 .loc 1 1508 5 is_stmt 1 discriminator 2 view .LVU842 +1508:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_SLAVE; + 2599 .loc 1 1508 21 is_stmt 0 discriminator 2 view .LVU843 + 2600 0034 2223 movs r3, #34 + 2601 0036 84F84130 strb r3, [r4, #65] +1509:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 2602 .loc 1 1509 5 is_stmt 1 discriminator 2 view .LVU844 +1509:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 2603 .loc 1 1509 21 is_stmt 0 discriminator 2 view .LVU845 + 2604 003a 2023 movs r3, #32 + 2605 003c 84F84230 strb r3, [r4, #66] +1510:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2606 .loc 1 1510 5 is_stmt 1 discriminator 2 view .LVU846 +1510:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2607 .loc 1 1510 21 is_stmt 0 discriminator 2 view .LVU847 + 2608 0040 0022 movs r2, #0 + 2609 0042 6264 str r2, [r4, #68] +1513:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 2610 .loc 1 1513 5 is_stmt 1 discriminator 2 view .LVU848 +1513:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 2611 .loc 1 1513 21 is_stmt 0 discriminator 2 view .LVU849 + 2612 0044 6662 str r6, [r4, #36] +1514:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = NULL; + 2613 .loc 1 1514 5 is_stmt 1 discriminator 2 view .LVU850 +1514:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = NULL; + 2614 .loc 1 1514 21 is_stmt 0 discriminator 2 view .LVU851 + 2615 0046 A4F82A80 strh r8, [r4, #42] @ movhi +1515:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2616 .loc 1 1515 5 is_stmt 1 discriminator 2 view .LVU852 +1515:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2617 .loc 1 1515 21 is_stmt 0 discriminator 2 view .LVU853 + 2618 004a 6263 str r2, [r4, #52] +1518:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2619 .loc 1 1518 5 is_stmt 1 discriminator 2 view .LVU854 +1518:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2620 .loc 1 1518 9 is_stmt 0 discriminator 2 view .LVU855 + 2621 004c 2168 ldr r1, [r4] +1518:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2622 .loc 1 1518 19 discriminator 2 view .LVU856 + 2623 004e 4B68 ldr r3, [r1, #4] +1518:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2624 .loc 1 1518 25 discriminator 2 view .LVU857 + 2625 0050 23F40043 bic r3, r3, #32768 + 2626 0054 4B60 str r3, [r1, #4] +1521:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2627 .loc 1 1521 5 is_stmt 1 discriminator 2 view .LVU858 +1521:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2628 .loc 1 1521 9 is_stmt 0 discriminator 2 view .LVU859 + 2629 0056 0090 str r0, [sp] + 2630 0058 2B46 mov r3, r5 + 2631 005a 0821 movs r1, #8 + ARM GAS /tmp/ccE2rRGE.s page 179 + + + 2632 005c 2046 mov r0, r4 + 2633 .LVL149: +1521:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2634 .loc 1 1521 9 discriminator 2 view .LVU860 + 2635 005e FFF7FEFF bl I2C_WaitOnFlagUntilTimeout + 2636 .LVL150: +1521:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2637 .loc 1 1521 8 discriminator 2 view .LVU861 + 2638 0062 58B1 cbz r0, .L195 +1524:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 2639 .loc 1 1524 7 is_stmt 1 view .LVU862 +1524:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 2640 .loc 1 1524 11 is_stmt 0 view .LVU863 + 2641 0064 2268 ldr r2, [r4] +1524:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 2642 .loc 1 1524 21 view .LVU864 + 2643 0066 5368 ldr r3, [r2, #4] +1524:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 2644 .loc 1 1524 27 view .LVU865 + 2645 0068 43F40043 orr r3, r3, #32768 + 2646 006c 5360 str r3, [r2, #4] +1525:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2647 .loc 1 1525 7 is_stmt 1 view .LVU866 +1525:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2648 .loc 1 1525 14 is_stmt 0 view .LVU867 + 2649 006e 0120 movs r0, #1 + 2650 0070 78E0 b .L192 + 2651 .LVL151: + 2652 .L193: +1499:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 2653 .loc 1 1499 7 is_stmt 1 view .LVU868 +1499:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 2654 .loc 1 1499 23 is_stmt 0 view .LVU869 + 2655 0072 4FF40073 mov r3, #512 + 2656 0076 6364 str r3, [r4, #68] +1500:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2657 .loc 1 1500 7 is_stmt 1 view .LVU870 +1500:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2658 .loc 1 1500 15 is_stmt 0 view .LVU871 + 2659 0078 0120 movs r0, #1 + 2660 .LVL152: +1500:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2661 .loc 1 1500 15 view .LVU872 + 2662 007a 73E0 b .L192 + 2663 .LVL153: + 2664 .L195: +1529:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2665 .loc 1 1529 5 is_stmt 1 view .LVU873 + 2666 007c 2368 ldr r3, [r4] + 2667 007e 0822 movs r2, #8 + 2668 0080 DA61 str r2, [r3, #28] +1532:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2669 .loc 1 1532 5 view .LVU874 +1532:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2670 .loc 1 1532 9 is_stmt 0 view .LVU875 + 2671 0082 0097 str r7, [sp] + 2672 0084 2B46 mov r3, r5 + ARM GAS /tmp/ccE2rRGE.s page 180 + + + 2673 0086 0122 movs r2, #1 + 2674 0088 4FF48031 mov r1, #65536 + 2675 008c 2046 mov r0, r4 + 2676 008e FFF7FEFF bl I2C_WaitOnFlagUntilTimeout + 2677 .LVL154: +1532:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2678 .loc 1 1532 8 view .LVU876 + 2679 0092 B8B1 cbz r0, .L196 +1535:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 2680 .loc 1 1535 7 is_stmt 1 view .LVU877 +1535:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 2681 .loc 1 1535 11 is_stmt 0 view .LVU878 + 2682 0094 2268 ldr r2, [r4] +1535:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 2683 .loc 1 1535 21 view .LVU879 + 2684 0096 5368 ldr r3, [r2, #4] +1535:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 2685 .loc 1 1535 27 view .LVU880 + 2686 0098 43F40043 orr r3, r3, #32768 + 2687 009c 5360 str r3, [r2, #4] +1536:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2688 .loc 1 1536 7 is_stmt 1 view .LVU881 +1536:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2689 .loc 1 1536 14 is_stmt 0 view .LVU882 + 2690 009e 0120 movs r0, #1 + 2691 00a0 60E0 b .L192 + 2692 .L197: +1563:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2693 .loc 1 1563 7 is_stmt 1 view .LVU883 +1563:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2694 .loc 1 1563 38 is_stmt 0 view .LVU884 + 2695 00a2 2368 ldr r3, [r4] +1563:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2696 .loc 1 1563 48 view .LVU885 + 2697 00a4 5A6A ldr r2, [r3, #36] +1563:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2698 .loc 1 1563 12 view .LVU886 + 2699 00a6 636A ldr r3, [r4, #36] +1563:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2700 .loc 1 1563 23 view .LVU887 + 2701 00a8 1A70 strb r2, [r3] +1566:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2702 .loc 1 1566 7 is_stmt 1 view .LVU888 +1566:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2703 .loc 1 1566 11 is_stmt 0 view .LVU889 + 2704 00aa 636A ldr r3, [r4, #36] +1566:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2705 .loc 1 1566 21 view .LVU890 + 2706 00ac 0133 adds r3, r3, #1 + 2707 00ae 6362 str r3, [r4, #36] +1568:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2708 .loc 1 1568 7 is_stmt 1 view .LVU891 +1568:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2709 .loc 1 1568 11 is_stmt 0 view .LVU892 + 2710 00b0 B4F82AC0 ldrh ip, [r4, #42] + 2711 00b4 1FFA8CFC uxth ip, ip +1568:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + ARM GAS /tmp/ccE2rRGE.s page 181 + + + 2712 .loc 1 1568 22 view .LVU893 + 2713 00b8 0CF1FF3C add ip, ip, #-1 + 2714 00bc 1FFA8CFC uxth ip, ip + 2715 00c0 A4F82AC0 strh ip, [r4, #42] @ movhi + 2716 .L196: +1539:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2717 .loc 1 1539 28 is_stmt 1 view .LVU894 +1539:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2718 .loc 1 1539 16 is_stmt 0 view .LVU895 + 2719 00c4 638D ldrh r3, [r4, #42] + 2720 00c6 9BB2 uxth r3, r3 +1539:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2721 .loc 1 1539 28 view .LVU896 + 2722 00c8 EBB1 cbz r3, .L205 +1542:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2723 .loc 1 1542 7 is_stmt 1 view .LVU897 +1542:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2724 .loc 1 1542 11 is_stmt 0 view .LVU898 + 2725 00ca 3A46 mov r2, r7 + 2726 00cc 2946 mov r1, r5 + 2727 00ce 2046 mov r0, r4 + 2728 00d0 FFF7FEFF bl I2C_WaitOnRXNEFlagUntilTimeout + 2729 .LVL155: +1542:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2730 .loc 1 1542 10 view .LVU899 + 2731 00d4 0028 cmp r0, #0 + 2732 00d6 E4D0 beq .L197 +1545:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2733 .loc 1 1545 9 is_stmt 1 view .LVU900 +1545:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2734 .loc 1 1545 13 is_stmt 0 view .LVU901 + 2735 00d8 2268 ldr r2, [r4] +1545:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2736 .loc 1 1545 23 view .LVU902 + 2737 00da 5368 ldr r3, [r2, #4] +1545:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2738 .loc 1 1545 29 view .LVU903 + 2739 00dc 43F40043 orr r3, r3, #32768 + 2740 00e0 5360 str r3, [r2, #4] +1548:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2741 .loc 1 1548 9 is_stmt 1 view .LVU904 +1548:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2742 .loc 1 1548 13 is_stmt 0 view .LVU905 + 2743 00e2 2368 ldr r3, [r4] + 2744 00e4 9A69 ldr r2, [r3, #24] +1548:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2745 .loc 1 1548 12 view .LVU906 + 2746 00e6 12F0040F tst r2, #4 + 2747 00ea 0AD0 beq .L198 +1551:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2748 .loc 1 1551 11 is_stmt 1 view .LVU907 +1551:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2749 .loc 1 1551 52 is_stmt 0 view .LVU908 + 2750 00ec 5A6A ldr r2, [r3, #36] +1551:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2751 .loc 1 1551 16 view .LVU909 + 2752 00ee 636A ldr r3, [r4, #36] + ARM GAS /tmp/ccE2rRGE.s page 182 + + +1551:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2753 .loc 1 1551 27 view .LVU910 + 2754 00f0 1A70 strb r2, [r3] +1554:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2755 .loc 1 1554 11 is_stmt 1 view .LVU911 +1554:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2756 .loc 1 1554 15 is_stmt 0 view .LVU912 + 2757 00f2 636A ldr r3, [r4, #36] +1554:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2758 .loc 1 1554 25 view .LVU913 + 2759 00f4 0133 adds r3, r3, #1 + 2760 00f6 6362 str r3, [r4, #36] +1556:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2761 .loc 1 1556 11 is_stmt 1 view .LVU914 +1556:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2762 .loc 1 1556 15 is_stmt 0 view .LVU915 + 2763 00f8 638D ldrh r3, [r4, #42] + 2764 00fa 9BB2 uxth r3, r3 +1556:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2765 .loc 1 1556 26 view .LVU916 + 2766 00fc 013B subs r3, r3, #1 + 2767 00fe 9BB2 uxth r3, r3 + 2768 0100 6385 strh r3, [r4, #42] @ movhi + 2769 .L198: +1559:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2770 .loc 1 1559 9 is_stmt 1 view .LVU917 +1559:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2771 .loc 1 1559 16 is_stmt 0 view .LVU918 + 2772 0102 0120 movs r0, #1 + 2773 0104 2EE0 b .L192 + 2774 .L205: +1572:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2775 .loc 1 1572 5 is_stmt 1 view .LVU919 +1572:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2776 .loc 1 1572 9 is_stmt 0 view .LVU920 + 2777 0106 3A46 mov r2, r7 + 2778 0108 2946 mov r1, r5 + 2779 010a 2046 mov r0, r4 + 2780 010c FFF7FEFF bl I2C_WaitOnSTOPFlagUntilTimeout + 2781 .LVL156: +1572:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2782 .loc 1 1572 8 view .LVU921 + 2783 0110 30B1 cbz r0, .L200 +1575:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 2784 .loc 1 1575 7 is_stmt 1 view .LVU922 +1575:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 2785 .loc 1 1575 11 is_stmt 0 view .LVU923 + 2786 0112 2268 ldr r2, [r4] +1575:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 2787 .loc 1 1575 21 view .LVU924 + 2788 0114 5368 ldr r3, [r2, #4] +1575:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 2789 .loc 1 1575 27 view .LVU925 + 2790 0116 43F40043 orr r3, r3, #32768 + 2791 011a 5360 str r3, [r2, #4] +1576:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2792 .loc 1 1576 7 is_stmt 1 view .LVU926 + ARM GAS /tmp/ccE2rRGE.s page 183 + + +1576:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2793 .loc 1 1576 14 is_stmt 0 view .LVU927 + 2794 011c 0120 movs r0, #1 + 2795 011e 21E0 b .L192 + 2796 .L200: +1580:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2797 .loc 1 1580 5 is_stmt 1 view .LVU928 + 2798 0120 2368 ldr r3, [r4] + 2799 0122 2022 movs r2, #32 + 2800 0124 DA61 str r2, [r3, #28] +1583:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2801 .loc 1 1583 5 view .LVU929 +1583:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2802 .loc 1 1583 9 is_stmt 0 view .LVU930 + 2803 0126 0097 str r7, [sp] + 2804 0128 2B46 mov r3, r5 + 2805 012a 0122 movs r2, #1 + 2806 012c 4FF40041 mov r1, #32768 + 2807 0130 2046 mov r0, r4 + 2808 0132 FFF7FEFF bl I2C_WaitOnFlagUntilTimeout + 2809 .LVL157: +1583:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2810 .loc 1 1583 8 view .LVU931 + 2811 0136 30B1 cbz r0, .L201 +1586:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 2812 .loc 1 1586 7 is_stmt 1 view .LVU932 +1586:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 2813 .loc 1 1586 11 is_stmt 0 view .LVU933 + 2814 0138 2268 ldr r2, [r4] +1586:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 2815 .loc 1 1586 21 view .LVU934 + 2816 013a 5368 ldr r3, [r2, #4] +1586:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 2817 .loc 1 1586 27 view .LVU935 + 2818 013c 43F40043 orr r3, r3, #32768 + 2819 0140 5360 str r3, [r2, #4] +1587:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2820 .loc 1 1587 7 is_stmt 1 view .LVU936 +1587:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2821 .loc 1 1587 14 is_stmt 0 view .LVU937 + 2822 0142 0120 movs r0, #1 + 2823 0144 0EE0 b .L192 + 2824 .L201: +1591:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2825 .loc 1 1591 5 is_stmt 1 view .LVU938 +1591:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2826 .loc 1 1591 9 is_stmt 0 view .LVU939 + 2827 0146 2268 ldr r2, [r4] +1591:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2828 .loc 1 1591 19 view .LVU940 + 2829 0148 5368 ldr r3, [r2, #4] +1591:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2830 .loc 1 1591 25 view .LVU941 + 2831 014a 43F40043 orr r3, r3, #32768 + 2832 014e 5360 str r3, [r2, #4] +1593:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 2833 .loc 1 1593 5 is_stmt 1 view .LVU942 + ARM GAS /tmp/ccE2rRGE.s page 184 + + +1593:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 2834 .loc 1 1593 17 is_stmt 0 view .LVU943 + 2835 0150 2023 movs r3, #32 + 2836 0152 84F84130 strb r3, [r4, #65] +1594:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2837 .loc 1 1594 5 is_stmt 1 view .LVU944 +1594:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2838 .loc 1 1594 17 is_stmt 0 view .LVU945 + 2839 0156 0023 movs r3, #0 + 2840 0158 84F84230 strb r3, [r4, #66] +1597:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2841 .loc 1 1597 5 is_stmt 1 view .LVU946 +1597:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2842 .loc 1 1597 5 view .LVU947 + 2843 015c 84F84030 strb r3, [r4, #64] +1597:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2844 .loc 1 1597 5 view .LVU948 +1599:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2845 .loc 1 1599 5 view .LVU949 +1599:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2846 .loc 1 1599 12 is_stmt 0 view .LVU950 + 2847 0160 00E0 b .L192 + 2848 .LVL158: + 2849 .L202: +1603:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2850 .loc 1 1603 12 view .LVU951 + 2851 0162 0220 movs r0, #2 + 2852 .LVL159: + 2853 .L192: +1605:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2854 .loc 1 1605 1 view .LVU952 + 2855 0164 02B0 add sp, sp, #8 + 2856 .cfi_remember_state + 2857 .cfi_def_cfa_offset 24 + 2858 @ sp needed + 2859 0166 BDE8F081 pop {r4, r5, r6, r7, r8, pc} + 2860 .LVL160: + 2861 .L203: + 2862 .cfi_restore_state +1503:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2863 .loc 1 1503 5 view .LVU953 + 2864 016a 0220 movs r0, #2 + 2865 .LVL161: +1503:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2866 .loc 1 1503 5 view .LVU954 + 2867 016c FAE7 b .L192 + 2868 .cfi_endproc + 2869 .LFE137: + 2871 .section .text.HAL_I2C_Master_Transmit_IT,"ax",%progbits + 2872 .align 1 + 2873 .global HAL_I2C_Master_Transmit_IT + 2874 .syntax unified + 2875 .thumb + 2876 .thumb_func + 2878 HAL_I2C_Master_Transmit_IT: + 2879 .LVL162: + 2880 .LFB138: + ARM GAS /tmp/ccE2rRGE.s page 185 + + +1619:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t xfermode; + 2881 .loc 1 1619 1 is_stmt 1 view -0 + 2882 .cfi_startproc + 2883 @ args = 0, pretend = 0, frame = 0 + 2884 @ frame_needed = 0, uses_anonymous_args = 0 +1619:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t xfermode; + 2885 .loc 1 1619 1 is_stmt 0 view .LVU956 + 2886 0000 30B5 push {r4, r5, lr} + 2887 .cfi_def_cfa_offset 12 + 2888 .cfi_offset 4, -12 + 2889 .cfi_offset 5, -8 + 2890 .cfi_offset 14, -4 + 2891 0002 83B0 sub sp, sp, #12 + 2892 .cfi_def_cfa_offset 24 + 2893 0004 0446 mov r4, r0 +1620:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2894 .loc 1 1620 3 is_stmt 1 view .LVU957 +1622:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2895 .loc 1 1622 3 view .LVU958 +1622:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2896 .loc 1 1622 11 is_stmt 0 view .LVU959 + 2897 0006 90F84100 ldrb r0, [r0, #65] @ zero_extendqisi2 + 2898 .LVL163: +1622:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2899 .loc 1 1622 11 view .LVU960 + 2900 000a C0B2 uxtb r0, r0 +1622:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2901 .loc 1 1622 6 view .LVU961 + 2902 000c 2028 cmp r0, #32 + 2903 000e 37D1 bne .L210 +1624:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2904 .loc 1 1624 5 is_stmt 1 view .LVU962 +1624:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2905 .loc 1 1624 9 is_stmt 0 view .LVU963 + 2906 0010 2068 ldr r0, [r4] + 2907 0012 8069 ldr r0, [r0, #24] +1624:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2908 .loc 1 1624 8 view .LVU964 + 2909 0014 10F4004F tst r0, #32768 + 2910 0018 34D1 bne .L211 +1630:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2911 .loc 1 1630 5 is_stmt 1 view .LVU965 +1630:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2912 .loc 1 1630 5 view .LVU966 + 2913 001a 94F84000 ldrb r0, [r4, #64] @ zero_extendqisi2 + 2914 001e 0128 cmp r0, #1 + 2915 0020 32D0 beq .L212 +1630:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2916 .loc 1 1630 5 discriminator 2 view .LVU967 + 2917 0022 0120 movs r0, #1 + 2918 0024 84F84000 strb r0, [r4, #64] +1630:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2919 .loc 1 1630 5 discriminator 2 view .LVU968 +1632:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MASTER; + 2920 .loc 1 1632 5 discriminator 2 view .LVU969 +1632:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MASTER; + 2921 .loc 1 1632 23 is_stmt 0 discriminator 2 view .LVU970 + ARM GAS /tmp/ccE2rRGE.s page 186 + + + 2922 0028 2120 movs r0, #33 + 2923 002a 84F84100 strb r0, [r4, #65] +1633:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 2924 .loc 1 1633 5 is_stmt 1 discriminator 2 view .LVU971 +1633:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 2925 .loc 1 1633 23 is_stmt 0 discriminator 2 view .LVU972 + 2926 002e 1020 movs r0, #16 + 2927 0030 84F84200 strb r0, [r4, #66] +1634:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2928 .loc 1 1634 5 is_stmt 1 discriminator 2 view .LVU973 +1634:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2929 .loc 1 1634 23 is_stmt 0 discriminator 2 view .LVU974 + 2930 0034 0020 movs r0, #0 + 2931 0036 6064 str r0, [r4, #68] +1637:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 2932 .loc 1 1637 5 is_stmt 1 discriminator 2 view .LVU975 +1637:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 2933 .loc 1 1637 23 is_stmt 0 discriminator 2 view .LVU976 + 2934 0038 6262 str r2, [r4, #36] +1638:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; + 2935 .loc 1 1638 5 is_stmt 1 discriminator 2 view .LVU977 +1638:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; + 2936 .loc 1 1638 23 is_stmt 0 discriminator 2 view .LVU978 + 2937 003a 6385 strh r3, [r4, #42] @ movhi +1639:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_IT; + 2938 .loc 1 1639 5 is_stmt 1 discriminator 2 view .LVU979 +1639:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_IT; + 2939 .loc 1 1639 23 is_stmt 0 discriminator 2 view .LVU980 + 2940 003c 134B ldr r3, .L214 + 2941 .LVL164: +1639:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_IT; + 2942 .loc 1 1639 23 discriminator 2 view .LVU981 + 2943 003e E362 str r3, [r4, #44] + 2944 .LVL165: +1640:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2945 .loc 1 1640 5 is_stmt 1 discriminator 2 view .LVU982 +1640:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2946 .loc 1 1640 23 is_stmt 0 discriminator 2 view .LVU983 + 2947 0040 134B ldr r3, .L214+4 + 2948 0042 6363 str r3, [r4, #52] +1642:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2949 .loc 1 1642 5 is_stmt 1 discriminator 2 view .LVU984 +1642:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2950 .loc 1 1642 13 is_stmt 0 discriminator 2 view .LVU985 + 2951 0044 638D ldrh r3, [r4, #42] + 2952 0046 9BB2 uxth r3, r3 +1642:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 2953 .loc 1 1642 8 discriminator 2 view .LVU986 + 2954 0048 FF2B cmp r3, #255 + 2955 004a 14D9 bls .L208 +1644:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_RELOAD_MODE; + 2956 .loc 1 1644 7 is_stmt 1 view .LVU987 +1644:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_RELOAD_MODE; + 2957 .loc 1 1644 22 is_stmt 0 view .LVU988 + 2958 004c FF23 movs r3, #255 + 2959 004e 2385 strh r3, [r4, #40] @ movhi +1645:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + ARM GAS /tmp/ccE2rRGE.s page 187 + + + 2960 .loc 1 1645 7 is_stmt 1 view .LVU989 + 2961 .LVL166: +1645:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2962 .loc 1 1645 16 is_stmt 0 view .LVU990 + 2963 0050 4FF08073 mov r3, #16777216 + 2964 .LVL167: + 2965 .L209: +1655:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2966 .loc 1 1655 5 is_stmt 1 view .LVU991 + 2967 0054 0F4A ldr r2, .L214+8 + 2968 .LVL168: +1655:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2969 .loc 1 1655 5 is_stmt 0 view .LVU992 + 2970 0056 0092 str r2, [sp] + 2971 .LVL169: +1655:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2972 .loc 1 1655 5 view .LVU993 + 2973 0058 94F82820 ldrb r2, [r4, #40] @ zero_extendqisi2 + 2974 005c 2046 mov r0, r4 + 2975 005e FFF7FEFF bl I2C_TransferConfig + 2976 .LVL170: +1658:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2977 .loc 1 1658 5 is_stmt 1 view .LVU994 +1658:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2978 .loc 1 1658 5 view .LVU995 + 2979 0062 0025 movs r5, #0 + 2980 0064 84F84050 strb r5, [r4, #64] +1658:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2981 .loc 1 1658 5 view .LVU996 +1668:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2982 .loc 1 1668 5 view .LVU997 + 2983 0068 0121 movs r1, #1 + 2984 006a 2046 mov r0, r4 + 2985 006c FFF7FEFF bl I2C_Enable_IRQ + 2986 .LVL171: +1670:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2987 .loc 1 1670 5 view .LVU998 +1670:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 2988 .loc 1 1670 12 is_stmt 0 view .LVU999 + 2989 0070 2846 mov r0, r5 + 2990 .LVL172: + 2991 .L207: +1676:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 2992 .loc 1 1676 1 view .LVU1000 + 2993 0072 03B0 add sp, sp, #12 + 2994 .cfi_remember_state + 2995 .cfi_def_cfa_offset 12 + 2996 @ sp needed + 2997 0074 30BD pop {r4, r5, pc} + 2998 .LVL173: + 2999 .L208: + 3000 .cfi_restore_state +1649:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_AUTOEND_MODE; + 3001 .loc 1 1649 7 is_stmt 1 view .LVU1001 +1649:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_AUTOEND_MODE; + 3002 .loc 1 1649 28 is_stmt 0 view .LVU1002 + 3003 0076 638D ldrh r3, [r4, #42] + ARM GAS /tmp/ccE2rRGE.s page 188 + + +1649:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_AUTOEND_MODE; + 3004 .loc 1 1649 22 view .LVU1003 + 3005 0078 2385 strh r3, [r4, #40] @ movhi +1650:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3006 .loc 1 1650 7 is_stmt 1 view .LVU1004 + 3007 .LVL174: +1650:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3008 .loc 1 1650 16 is_stmt 0 view .LVU1005 + 3009 007a 4FF00073 mov r3, #33554432 + 3010 007e E9E7 b .L209 + 3011 .LVL175: + 3012 .L210: +1674:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3013 .loc 1 1674 12 view .LVU1006 + 3014 0080 0220 movs r0, #2 + 3015 0082 F6E7 b .L207 + 3016 .L211: +1626:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3017 .loc 1 1626 14 view .LVU1007 + 3018 0084 0220 movs r0, #2 + 3019 0086 F4E7 b .L207 + 3020 .L212: +1630:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3021 .loc 1 1630 5 view .LVU1008 + 3022 0088 0220 movs r0, #2 + 3023 008a F2E7 b .L207 + 3024 .L215: + 3025 .align 2 + 3026 .L214: + 3027 008c 0000FFFF .word -65536 + 3028 0090 00000000 .word I2C_Master_ISR_IT + 3029 0094 00200080 .word -2147475456 + 3030 .cfi_endproc + 3031 .LFE138: + 3033 .section .text.HAL_I2C_Master_Receive_IT,"ax",%progbits + 3034 .align 1 + 3035 .global HAL_I2C_Master_Receive_IT + 3036 .syntax unified + 3037 .thumb + 3038 .thumb_func + 3040 HAL_I2C_Master_Receive_IT: + 3041 .LVL176: + 3042 .LFB139: +1690:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t xfermode; + 3043 .loc 1 1690 1 is_stmt 1 view -0 + 3044 .cfi_startproc + 3045 @ args = 0, pretend = 0, frame = 0 + 3046 @ frame_needed = 0, uses_anonymous_args = 0 +1690:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t xfermode; + 3047 .loc 1 1690 1 is_stmt 0 view .LVU1010 + 3048 0000 30B5 push {r4, r5, lr} + 3049 .cfi_def_cfa_offset 12 + 3050 .cfi_offset 4, -12 + 3051 .cfi_offset 5, -8 + 3052 .cfi_offset 14, -4 + 3053 0002 83B0 sub sp, sp, #12 + 3054 .cfi_def_cfa_offset 24 + ARM GAS /tmp/ccE2rRGE.s page 189 + + + 3055 0004 0446 mov r4, r0 +1691:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3056 .loc 1 1691 3 is_stmt 1 view .LVU1011 +1693:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3057 .loc 1 1693 3 view .LVU1012 +1693:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3058 .loc 1 1693 11 is_stmt 0 view .LVU1013 + 3059 0006 90F84100 ldrb r0, [r0, #65] @ zero_extendqisi2 + 3060 .LVL177: +1693:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3061 .loc 1 1693 11 view .LVU1014 + 3062 000a C0B2 uxtb r0, r0 +1693:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3063 .loc 1 1693 6 view .LVU1015 + 3064 000c 2028 cmp r0, #32 + 3065 000e 37D1 bne .L220 +1695:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3066 .loc 1 1695 5 is_stmt 1 view .LVU1016 +1695:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3067 .loc 1 1695 9 is_stmt 0 view .LVU1017 + 3068 0010 2068 ldr r0, [r4] + 3069 0012 8069 ldr r0, [r0, #24] +1695:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3070 .loc 1 1695 8 view .LVU1018 + 3071 0014 10F4004F tst r0, #32768 + 3072 0018 34D1 bne .L221 +1701:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3073 .loc 1 1701 5 is_stmt 1 view .LVU1019 +1701:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3074 .loc 1 1701 5 view .LVU1020 + 3075 001a 94F84000 ldrb r0, [r4, #64] @ zero_extendqisi2 + 3076 001e 0128 cmp r0, #1 + 3077 0020 32D0 beq .L222 +1701:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3078 .loc 1 1701 5 discriminator 2 view .LVU1021 + 3079 0022 0120 movs r0, #1 + 3080 0024 84F84000 strb r0, [r4, #64] +1701:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3081 .loc 1 1701 5 discriminator 2 view .LVU1022 +1703:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MASTER; + 3082 .loc 1 1703 5 discriminator 2 view .LVU1023 +1703:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MASTER; + 3083 .loc 1 1703 23 is_stmt 0 discriminator 2 view .LVU1024 + 3084 0028 2220 movs r0, #34 + 3085 002a 84F84100 strb r0, [r4, #65] +1704:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 3086 .loc 1 1704 5 is_stmt 1 discriminator 2 view .LVU1025 +1704:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 3087 .loc 1 1704 23 is_stmt 0 discriminator 2 view .LVU1026 + 3088 002e 1020 movs r0, #16 + 3089 0030 84F84200 strb r0, [r4, #66] +1705:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3090 .loc 1 1705 5 is_stmt 1 discriminator 2 view .LVU1027 +1705:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3091 .loc 1 1705 23 is_stmt 0 discriminator 2 view .LVU1028 + 3092 0034 0020 movs r0, #0 + 3093 0036 6064 str r0, [r4, #68] + ARM GAS /tmp/ccE2rRGE.s page 190 + + +1708:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 3094 .loc 1 1708 5 is_stmt 1 discriminator 2 view .LVU1029 +1708:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 3095 .loc 1 1708 23 is_stmt 0 discriminator 2 view .LVU1030 + 3096 0038 6262 str r2, [r4, #36] +1709:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; + 3097 .loc 1 1709 5 is_stmt 1 discriminator 2 view .LVU1031 +1709:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; + 3098 .loc 1 1709 23 is_stmt 0 discriminator 2 view .LVU1032 + 3099 003a 6385 strh r3, [r4, #42] @ movhi +1710:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_IT; + 3100 .loc 1 1710 5 is_stmt 1 discriminator 2 view .LVU1033 +1710:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_IT; + 3101 .loc 1 1710 23 is_stmt 0 discriminator 2 view .LVU1034 + 3102 003c 134B ldr r3, .L224 + 3103 .LVL178: +1710:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_IT; + 3104 .loc 1 1710 23 discriminator 2 view .LVU1035 + 3105 003e E362 str r3, [r4, #44] + 3106 .LVL179: +1711:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3107 .loc 1 1711 5 is_stmt 1 discriminator 2 view .LVU1036 +1711:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3108 .loc 1 1711 23 is_stmt 0 discriminator 2 view .LVU1037 + 3109 0040 134B ldr r3, .L224+4 + 3110 0042 6363 str r3, [r4, #52] +1713:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3111 .loc 1 1713 5 is_stmt 1 discriminator 2 view .LVU1038 +1713:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3112 .loc 1 1713 13 is_stmt 0 discriminator 2 view .LVU1039 + 3113 0044 638D ldrh r3, [r4, #42] + 3114 0046 9BB2 uxth r3, r3 +1713:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3115 .loc 1 1713 8 discriminator 2 view .LVU1040 + 3116 0048 FF2B cmp r3, #255 + 3117 004a 14D9 bls .L218 +1715:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_RELOAD_MODE; + 3118 .loc 1 1715 7 is_stmt 1 view .LVU1041 +1715:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_RELOAD_MODE; + 3119 .loc 1 1715 22 is_stmt 0 view .LVU1042 + 3120 004c FF23 movs r3, #255 + 3121 004e 2385 strh r3, [r4, #40] @ movhi +1716:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3122 .loc 1 1716 7 is_stmt 1 view .LVU1043 + 3123 .LVL180: +1716:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3124 .loc 1 1716 16 is_stmt 0 view .LVU1044 + 3125 0050 4FF08073 mov r3, #16777216 + 3126 .LVL181: + 3127 .L219: +1726:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3128 .loc 1 1726 5 is_stmt 1 view .LVU1045 + 3129 0054 0F4A ldr r2, .L224+8 + 3130 .LVL182: +1726:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3131 .loc 1 1726 5 is_stmt 0 view .LVU1046 + 3132 0056 0092 str r2, [sp] + ARM GAS /tmp/ccE2rRGE.s page 191 + + + 3133 .LVL183: +1726:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3134 .loc 1 1726 5 view .LVU1047 + 3135 0058 94F82820 ldrb r2, [r4, #40] @ zero_extendqisi2 + 3136 005c 2046 mov r0, r4 + 3137 005e FFF7FEFF bl I2C_TransferConfig + 3138 .LVL184: +1729:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3139 .loc 1 1729 5 is_stmt 1 view .LVU1048 +1729:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3140 .loc 1 1729 5 view .LVU1049 + 3141 0062 0025 movs r5, #0 + 3142 0064 84F84050 strb r5, [r4, #64] +1729:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3143 .loc 1 1729 5 view .LVU1050 +1739:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3144 .loc 1 1739 5 view .LVU1051 + 3145 0068 0221 movs r1, #2 + 3146 006a 2046 mov r0, r4 + 3147 006c FFF7FEFF bl I2C_Enable_IRQ + 3148 .LVL185: +1741:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3149 .loc 1 1741 5 view .LVU1052 +1741:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3150 .loc 1 1741 12 is_stmt 0 view .LVU1053 + 3151 0070 2846 mov r0, r5 + 3152 .LVL186: + 3153 .L217: +1747:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3154 .loc 1 1747 1 view .LVU1054 + 3155 0072 03B0 add sp, sp, #12 + 3156 .cfi_remember_state + 3157 .cfi_def_cfa_offset 12 + 3158 @ sp needed + 3159 0074 30BD pop {r4, r5, pc} + 3160 .LVL187: + 3161 .L218: + 3162 .cfi_restore_state +1720:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_AUTOEND_MODE; + 3163 .loc 1 1720 7 is_stmt 1 view .LVU1055 +1720:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_AUTOEND_MODE; + 3164 .loc 1 1720 28 is_stmt 0 view .LVU1056 + 3165 0076 638D ldrh r3, [r4, #42] +1720:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_AUTOEND_MODE; + 3166 .loc 1 1720 22 view .LVU1057 + 3167 0078 2385 strh r3, [r4, #40] @ movhi +1721:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3168 .loc 1 1721 7 is_stmt 1 view .LVU1058 + 3169 .LVL188: +1721:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3170 .loc 1 1721 16 is_stmt 0 view .LVU1059 + 3171 007a 4FF00073 mov r3, #33554432 + 3172 007e E9E7 b .L219 + 3173 .LVL189: + 3174 .L220: +1745:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3175 .loc 1 1745 12 view .LVU1060 + ARM GAS /tmp/ccE2rRGE.s page 192 + + + 3176 0080 0220 movs r0, #2 + 3177 0082 F6E7 b .L217 + 3178 .L221: +1697:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3179 .loc 1 1697 14 view .LVU1061 + 3180 0084 0220 movs r0, #2 + 3181 0086 F4E7 b .L217 + 3182 .L222: +1701:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3183 .loc 1 1701 5 view .LVU1062 + 3184 0088 0220 movs r0, #2 + 3185 008a F2E7 b .L217 + 3186 .L225: + 3187 .align 2 + 3188 .L224: + 3189 008c 0000FFFF .word -65536 + 3190 0090 00000000 .word I2C_Master_ISR_IT + 3191 0094 00240080 .word -2147474432 + 3192 .cfi_endproc + 3193 .LFE139: + 3195 .section .text.HAL_I2C_Slave_Transmit_IT,"ax",%progbits + 3196 .align 1 + 3197 .global HAL_I2C_Slave_Transmit_IT + 3198 .syntax unified + 3199 .thumb + 3200 .thumb_func + 3202 HAL_I2C_Slave_Transmit_IT: + 3203 .LVL190: + 3204 .LFB140: +1758:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_READY) + 3205 .loc 1 1758 1 is_stmt 1 view -0 + 3206 .cfi_startproc + 3207 @ args = 0, pretend = 0, frame = 0 + 3208 @ frame_needed = 0, uses_anonymous_args = 0 +1758:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_READY) + 3209 .loc 1 1758 1 is_stmt 0 view .LVU1064 + 3210 0000 38B5 push {r3, r4, r5, lr} + 3211 .cfi_def_cfa_offset 16 + 3212 .cfi_offset 3, -16 + 3213 .cfi_offset 4, -12 + 3214 .cfi_offset 5, -8 + 3215 .cfi_offset 14, -4 +1759:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3216 .loc 1 1759 3 is_stmt 1 view .LVU1065 +1759:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3217 .loc 1 1759 11 is_stmt 0 view .LVU1066 + 3218 0002 90F84130 ldrb r3, [r0, #65] @ zero_extendqisi2 + 3219 0006 DBB2 uxtb r3, r3 +1759:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3220 .loc 1 1759 6 view .LVU1067 + 3221 0008 202B cmp r3, #32 + 3222 000a 23D1 bne .L228 +1762:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3223 .loc 1 1762 5 is_stmt 1 view .LVU1068 +1762:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3224 .loc 1 1762 5 view .LVU1069 + 3225 000c 90F84030 ldrb r3, [r0, #64] @ zero_extendqisi2 + ARM GAS /tmp/ccE2rRGE.s page 193 + + + 3226 0010 012B cmp r3, #1 + 3227 0012 21D0 beq .L229 +1762:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3228 .loc 1 1762 5 discriminator 2 view .LVU1070 + 3229 0014 0123 movs r3, #1 + 3230 0016 80F84030 strb r3, [r0, #64] +1762:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3231 .loc 1 1762 5 discriminator 2 view .LVU1071 +1764:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_SLAVE; + 3232 .loc 1 1764 5 discriminator 2 view .LVU1072 +1764:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_SLAVE; + 3233 .loc 1 1764 23 is_stmt 0 discriminator 2 view .LVU1073 + 3234 001a 2123 movs r3, #33 + 3235 001c 80F84130 strb r3, [r0, #65] +1765:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 3236 .loc 1 1765 5 is_stmt 1 discriminator 2 view .LVU1074 +1765:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 3237 .loc 1 1765 23 is_stmt 0 discriminator 2 view .LVU1075 + 3238 0020 2023 movs r3, #32 + 3239 0022 80F84230 strb r3, [r0, #66] +1766:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3240 .loc 1 1766 5 is_stmt 1 discriminator 2 view .LVU1076 +1766:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3241 .loc 1 1766 23 is_stmt 0 discriminator 2 view .LVU1077 + 3242 0026 0024 movs r4, #0 + 3243 0028 4464 str r4, [r0, #68] +1769:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3244 .loc 1 1769 5 is_stmt 1 discriminator 2 view .LVU1078 +1769:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3245 .loc 1 1769 9 is_stmt 0 discriminator 2 view .LVU1079 + 3246 002a 0568 ldr r5, [r0] +1769:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3247 .loc 1 1769 19 discriminator 2 view .LVU1080 + 3248 002c 6B68 ldr r3, [r5, #4] +1769:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3249 .loc 1 1769 25 discriminator 2 view .LVU1081 + 3250 002e 23F40043 bic r3, r3, #32768 + 3251 0032 6B60 str r3, [r5, #4] +1772:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 3252 .loc 1 1772 5 is_stmt 1 discriminator 2 view .LVU1082 +1772:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 3253 .loc 1 1772 23 is_stmt 0 discriminator 2 view .LVU1083 + 3254 0034 4162 str r1, [r0, #36] +1773:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; + 3255 .loc 1 1773 5 is_stmt 1 discriminator 2 view .LVU1084 +1773:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; + 3256 .loc 1 1773 23 is_stmt 0 discriminator 2 view .LVU1085 + 3257 0036 4285 strh r2, [r0, #42] @ movhi +1774:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; + 3258 .loc 1 1774 5 is_stmt 1 discriminator 2 view .LVU1086 +1774:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; + 3259 .loc 1 1774 29 is_stmt 0 discriminator 2 view .LVU1087 + 3260 0038 438D ldrh r3, [r0, #42] +1774:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; + 3261 .loc 1 1774 23 discriminator 2 view .LVU1088 + 3262 003a 0385 strh r3, [r0, #40] @ movhi +1775:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Slave_ISR_IT; + ARM GAS /tmp/ccE2rRGE.s page 194 + + + 3263 .loc 1 1775 5 is_stmt 1 discriminator 2 view .LVU1089 +1775:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Slave_ISR_IT; + 3264 .loc 1 1775 23 is_stmt 0 discriminator 2 view .LVU1090 + 3265 003c 074B ldr r3, .L231 + 3266 003e C362 str r3, [r0, #44] +1776:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3267 .loc 1 1776 5 is_stmt 1 discriminator 2 view .LVU1091 +1776:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3268 .loc 1 1776 23 is_stmt 0 discriminator 2 view .LVU1092 + 3269 0040 074B ldr r3, .L231+4 + 3270 0042 4363 str r3, [r0, #52] +1779:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3271 .loc 1 1779 5 is_stmt 1 discriminator 2 view .LVU1093 +1779:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3272 .loc 1 1779 5 discriminator 2 view .LVU1094 + 3273 0044 80F84040 strb r4, [r0, #64] +1779:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3274 .loc 1 1779 5 discriminator 2 view .LVU1095 +1789:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3275 .loc 1 1789 5 discriminator 2 view .LVU1096 + 3276 0048 48F20101 movw r1, #32769 + 3277 .LVL191: +1789:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3278 .loc 1 1789 5 is_stmt 0 discriminator 2 view .LVU1097 + 3279 004c FFF7FEFF bl I2C_Enable_IRQ + 3280 .LVL192: +1791:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3281 .loc 1 1791 5 is_stmt 1 discriminator 2 view .LVU1098 +1791:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3282 .loc 1 1791 12 is_stmt 0 discriminator 2 view .LVU1099 + 3283 0050 2046 mov r0, r4 + 3284 .L227: +1797:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3285 .loc 1 1797 1 view .LVU1100 + 3286 0052 38BD pop {r3, r4, r5, pc} + 3287 .LVL193: + 3288 .L228: +1795:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3289 .loc 1 1795 12 view .LVU1101 + 3290 0054 0220 movs r0, #2 + 3291 .LVL194: +1795:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3292 .loc 1 1795 12 view .LVU1102 + 3293 0056 FCE7 b .L227 + 3294 .LVL195: + 3295 .L229: +1762:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3296 .loc 1 1762 5 view .LVU1103 + 3297 0058 0220 movs r0, #2 + 3298 .LVL196: +1762:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3299 .loc 1 1762 5 view .LVU1104 + 3300 005a FAE7 b .L227 + 3301 .L232: + 3302 .align 2 + 3303 .L231: + 3304 005c 0000FFFF .word -65536 + ARM GAS /tmp/ccE2rRGE.s page 195 + + + 3305 0060 00000000 .word I2C_Slave_ISR_IT + 3306 .cfi_endproc + 3307 .LFE140: + 3309 .section .text.HAL_I2C_Slave_Receive_IT,"ax",%progbits + 3310 .align 1 + 3311 .global HAL_I2C_Slave_Receive_IT + 3312 .syntax unified + 3313 .thumb + 3314 .thumb_func + 3316 HAL_I2C_Slave_Receive_IT: + 3317 .LVL197: + 3318 .LFB141: +1808:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_READY) + 3319 .loc 1 1808 1 is_stmt 1 view -0 + 3320 .cfi_startproc + 3321 @ args = 0, pretend = 0, frame = 0 + 3322 @ frame_needed = 0, uses_anonymous_args = 0 +1808:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_READY) + 3323 .loc 1 1808 1 is_stmt 0 view .LVU1106 + 3324 0000 38B5 push {r3, r4, r5, lr} + 3325 .cfi_def_cfa_offset 16 + 3326 .cfi_offset 3, -16 + 3327 .cfi_offset 4, -12 + 3328 .cfi_offset 5, -8 + 3329 .cfi_offset 14, -4 +1809:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3330 .loc 1 1809 3 is_stmt 1 view .LVU1107 +1809:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3331 .loc 1 1809 11 is_stmt 0 view .LVU1108 + 3332 0002 90F84130 ldrb r3, [r0, #65] @ zero_extendqisi2 + 3333 0006 DBB2 uxtb r3, r3 +1809:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3334 .loc 1 1809 6 view .LVU1109 + 3335 0008 202B cmp r3, #32 + 3336 000a 23D1 bne .L235 +1812:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3337 .loc 1 1812 5 is_stmt 1 view .LVU1110 +1812:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3338 .loc 1 1812 5 view .LVU1111 + 3339 000c 90F84030 ldrb r3, [r0, #64] @ zero_extendqisi2 + 3340 0010 012B cmp r3, #1 + 3341 0012 21D0 beq .L236 +1812:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3342 .loc 1 1812 5 discriminator 2 view .LVU1112 + 3343 0014 0123 movs r3, #1 + 3344 0016 80F84030 strb r3, [r0, #64] +1812:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3345 .loc 1 1812 5 discriminator 2 view .LVU1113 +1814:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_SLAVE; + 3346 .loc 1 1814 5 discriminator 2 view .LVU1114 +1814:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_SLAVE; + 3347 .loc 1 1814 23 is_stmt 0 discriminator 2 view .LVU1115 + 3348 001a 2223 movs r3, #34 + 3349 001c 80F84130 strb r3, [r0, #65] +1815:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 3350 .loc 1 1815 5 is_stmt 1 discriminator 2 view .LVU1116 +1815:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + ARM GAS /tmp/ccE2rRGE.s page 196 + + + 3351 .loc 1 1815 23 is_stmt 0 discriminator 2 view .LVU1117 + 3352 0020 2023 movs r3, #32 + 3353 0022 80F84230 strb r3, [r0, #66] +1816:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3354 .loc 1 1816 5 is_stmt 1 discriminator 2 view .LVU1118 +1816:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3355 .loc 1 1816 23 is_stmt 0 discriminator 2 view .LVU1119 + 3356 0026 0024 movs r4, #0 + 3357 0028 4464 str r4, [r0, #68] +1819:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3358 .loc 1 1819 5 is_stmt 1 discriminator 2 view .LVU1120 +1819:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3359 .loc 1 1819 9 is_stmt 0 discriminator 2 view .LVU1121 + 3360 002a 0568 ldr r5, [r0] +1819:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3361 .loc 1 1819 19 discriminator 2 view .LVU1122 + 3362 002c 6B68 ldr r3, [r5, #4] +1819:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3363 .loc 1 1819 25 discriminator 2 view .LVU1123 + 3364 002e 23F40043 bic r3, r3, #32768 + 3365 0032 6B60 str r3, [r5, #4] +1822:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 3366 .loc 1 1822 5 is_stmt 1 discriminator 2 view .LVU1124 +1822:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 3367 .loc 1 1822 23 is_stmt 0 discriminator 2 view .LVU1125 + 3368 0034 4162 str r1, [r0, #36] +1823:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; + 3369 .loc 1 1823 5 is_stmt 1 discriminator 2 view .LVU1126 +1823:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; + 3370 .loc 1 1823 23 is_stmt 0 discriminator 2 view .LVU1127 + 3371 0036 4285 strh r2, [r0, #42] @ movhi +1824:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; + 3372 .loc 1 1824 5 is_stmt 1 discriminator 2 view .LVU1128 +1824:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; + 3373 .loc 1 1824 29 is_stmt 0 discriminator 2 view .LVU1129 + 3374 0038 438D ldrh r3, [r0, #42] +1824:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; + 3375 .loc 1 1824 23 discriminator 2 view .LVU1130 + 3376 003a 0385 strh r3, [r0, #40] @ movhi +1825:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Slave_ISR_IT; + 3377 .loc 1 1825 5 is_stmt 1 discriminator 2 view .LVU1131 +1825:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Slave_ISR_IT; + 3378 .loc 1 1825 23 is_stmt 0 discriminator 2 view .LVU1132 + 3379 003c 074B ldr r3, .L238 + 3380 003e C362 str r3, [r0, #44] +1826:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3381 .loc 1 1826 5 is_stmt 1 discriminator 2 view .LVU1133 +1826:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3382 .loc 1 1826 23 is_stmt 0 discriminator 2 view .LVU1134 + 3383 0040 074B ldr r3, .L238+4 + 3384 0042 4363 str r3, [r0, #52] +1829:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3385 .loc 1 1829 5 is_stmt 1 discriminator 2 view .LVU1135 +1829:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3386 .loc 1 1829 5 discriminator 2 view .LVU1136 + 3387 0044 80F84040 strb r4, [r0, #64] +1829:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + ARM GAS /tmp/ccE2rRGE.s page 197 + + + 3388 .loc 1 1829 5 discriminator 2 view .LVU1137 +1839:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3389 .loc 1 1839 5 discriminator 2 view .LVU1138 + 3390 0048 48F20201 movw r1, #32770 + 3391 .LVL198: +1839:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3392 .loc 1 1839 5 is_stmt 0 discriminator 2 view .LVU1139 + 3393 004c FFF7FEFF bl I2C_Enable_IRQ + 3394 .LVL199: +1841:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3395 .loc 1 1841 5 is_stmt 1 discriminator 2 view .LVU1140 +1841:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3396 .loc 1 1841 12 is_stmt 0 discriminator 2 view .LVU1141 + 3397 0050 2046 mov r0, r4 + 3398 .L234: +1847:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3399 .loc 1 1847 1 view .LVU1142 + 3400 0052 38BD pop {r3, r4, r5, pc} + 3401 .LVL200: + 3402 .L235: +1845:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3403 .loc 1 1845 12 view .LVU1143 + 3404 0054 0220 movs r0, #2 + 3405 .LVL201: +1845:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3406 .loc 1 1845 12 view .LVU1144 + 3407 0056 FCE7 b .L234 + 3408 .LVL202: + 3409 .L236: +1812:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3410 .loc 1 1812 5 view .LVU1145 + 3411 0058 0220 movs r0, #2 + 3412 .LVL203: +1812:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3413 .loc 1 1812 5 view .LVU1146 + 3414 005a FAE7 b .L234 + 3415 .L239: + 3416 .align 2 + 3417 .L238: + 3418 005c 0000FFFF .word -65536 + 3419 0060 00000000 .word I2C_Slave_ISR_IT + 3420 .cfi_endproc + 3421 .LFE141: + 3423 .section .text.HAL_I2C_Master_Transmit_DMA,"ax",%progbits + 3424 .align 1 + 3425 .global HAL_I2C_Master_Transmit_DMA + 3426 .syntax unified + 3427 .thumb + 3428 .thumb_func + 3430 HAL_I2C_Master_Transmit_DMA: + 3431 .LVL204: + 3432 .LFB142: +1861:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t xfermode; + 3433 .loc 1 1861 1 is_stmt 1 view -0 + 3434 .cfi_startproc + 3435 @ args = 0, pretend = 0, frame = 0 + 3436 @ frame_needed = 0, uses_anonymous_args = 0 + ARM GAS /tmp/ccE2rRGE.s page 198 + + +1861:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t xfermode; + 3437 .loc 1 1861 1 is_stmt 0 view .LVU1148 + 3438 0000 70B5 push {r4, r5, r6, lr} + 3439 .cfi_def_cfa_offset 16 + 3440 .cfi_offset 4, -16 + 3441 .cfi_offset 5, -12 + 3442 .cfi_offset 6, -8 + 3443 .cfi_offset 14, -4 + 3444 0002 82B0 sub sp, sp, #8 + 3445 .cfi_def_cfa_offset 24 + 3446 0004 0446 mov r4, r0 +1862:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef dmaxferstatus; + 3447 .loc 1 1862 3 is_stmt 1 view .LVU1149 +1863:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3448 .loc 1 1863 3 view .LVU1150 +1865:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3449 .loc 1 1865 3 view .LVU1151 +1865:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3450 .loc 1 1865 11 is_stmt 0 view .LVU1152 + 3451 0006 90F84100 ldrb r0, [r0, #65] @ zero_extendqisi2 + 3452 .LVL205: +1865:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3453 .loc 1 1865 11 view .LVU1153 + 3454 000a C0B2 uxtb r0, r0 +1865:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3455 .loc 1 1865 6 view .LVU1154 + 3456 000c 2028 cmp r0, #32 + 3457 000e 40F08D80 bne .L249 + 3458 0012 0D46 mov r5, r1 + 3459 0014 1146 mov r1, r2 + 3460 .LVL206: +1867:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3461 .loc 1 1867 5 is_stmt 1 view .LVU1155 +1867:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3462 .loc 1 1867 9 is_stmt 0 view .LVU1156 + 3463 0016 2268 ldr r2, [r4] + 3464 .LVL207: +1867:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3465 .loc 1 1867 9 view .LVU1157 + 3466 0018 9269 ldr r2, [r2, #24] +1867:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3467 .loc 1 1867 8 view .LVU1158 + 3468 001a 12F4004F tst r2, #32768 + 3469 001e 40F08880 bne .L250 +1873:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3470 .loc 1 1873 5 is_stmt 1 view .LVU1159 +1873:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3471 .loc 1 1873 5 view .LVU1160 + 3472 0022 94F84020 ldrb r2, [r4, #64] @ zero_extendqisi2 + 3473 0026 012A cmp r2, #1 + 3474 0028 00F08580 beq .L251 +1873:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3475 .loc 1 1873 5 discriminator 2 view .LVU1161 + 3476 002c 0122 movs r2, #1 + 3477 002e 84F84020 strb r2, [r4, #64] +1873:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3478 .loc 1 1873 5 discriminator 2 view .LVU1162 + ARM GAS /tmp/ccE2rRGE.s page 199 + + +1875:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MASTER; + 3479 .loc 1 1875 5 discriminator 2 view .LVU1163 +1875:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MASTER; + 3480 .loc 1 1875 23 is_stmt 0 discriminator 2 view .LVU1164 + 3481 0032 2122 movs r2, #33 + 3482 0034 84F84120 strb r2, [r4, #65] +1876:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 3483 .loc 1 1876 5 is_stmt 1 discriminator 2 view .LVU1165 +1876:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 3484 .loc 1 1876 23 is_stmt 0 discriminator 2 view .LVU1166 + 3485 0038 1022 movs r2, #16 + 3486 003a 84F84220 strb r2, [r4, #66] +1877:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3487 .loc 1 1877 5 is_stmt 1 discriminator 2 view .LVU1167 +1877:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3488 .loc 1 1877 23 is_stmt 0 discriminator 2 view .LVU1168 + 3489 003e 0022 movs r2, #0 + 3490 0040 6264 str r2, [r4, #68] +1880:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 3491 .loc 1 1880 5 is_stmt 1 discriminator 2 view .LVU1169 +1880:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 3492 .loc 1 1880 23 is_stmt 0 discriminator 2 view .LVU1170 + 3493 0042 6162 str r1, [r4, #36] +1881:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; + 3494 .loc 1 1881 5 is_stmt 1 discriminator 2 view .LVU1171 +1881:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; + 3495 .loc 1 1881 23 is_stmt 0 discriminator 2 view .LVU1172 + 3496 0044 6385 strh r3, [r4, #42] @ movhi +1882:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_DMA; + 3497 .loc 1 1882 5 is_stmt 1 discriminator 2 view .LVU1173 +1882:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_DMA; + 3498 .loc 1 1882 23 is_stmt 0 discriminator 2 view .LVU1174 + 3499 0046 3D4B ldr r3, .L255 + 3500 .LVL208: +1882:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_DMA; + 3501 .loc 1 1882 23 discriminator 2 view .LVU1175 + 3502 0048 E362 str r3, [r4, #44] + 3503 .LVL209: +1883:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3504 .loc 1 1883 5 is_stmt 1 discriminator 2 view .LVU1176 +1883:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3505 .loc 1 1883 23 is_stmt 0 discriminator 2 view .LVU1177 + 3506 004a 3D4B ldr r3, .L255+4 + 3507 004c 6363 str r3, [r4, #52] +1885:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3508 .loc 1 1885 5 is_stmt 1 discriminator 2 view .LVU1178 +1885:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3509 .loc 1 1885 13 is_stmt 0 discriminator 2 view .LVU1179 + 3510 004e 638D ldrh r3, [r4, #42] + 3511 0050 9BB2 uxth r3, r3 +1885:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3512 .loc 1 1885 8 discriminator 2 view .LVU1180 + 3513 0052 FF2B cmp r3, #255 + 3514 0054 27D9 bls .L242 +1887:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_RELOAD_MODE; + 3515 .loc 1 1887 7 is_stmt 1 view .LVU1181 +1887:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_RELOAD_MODE; + ARM GAS /tmp/ccE2rRGE.s page 200 + + + 3516 .loc 1 1887 22 is_stmt 0 view .LVU1182 + 3517 0056 FF23 movs r3, #255 + 3518 0058 2385 strh r3, [r4, #40] @ movhi +1888:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3519 .loc 1 1888 7 is_stmt 1 view .LVU1183 + 3520 .LVL210: +1888:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3521 .loc 1 1888 16 is_stmt 0 view .LVU1184 + 3522 005a 4FF08076 mov r6, #16777216 + 3523 .LVL211: + 3524 .L243: +1896:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3525 .loc 1 1896 5 is_stmt 1 view .LVU1185 +1896:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3526 .loc 1 1896 13 is_stmt 0 view .LVU1186 + 3527 005e 228D ldrh r2, [r4, #40] +1896:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3528 .loc 1 1896 8 view .LVU1187 + 3529 0060 002A cmp r2, #0 + 3530 0062 4FD0 beq .L244 +1898:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3531 .loc 1 1898 7 is_stmt 1 view .LVU1188 +1898:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3532 .loc 1 1898 15 is_stmt 0 view .LVU1189 + 3533 0064 A36B ldr r3, [r4, #56] +1898:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3534 .loc 1 1898 10 view .LVU1190 + 3535 0066 1BB3 cbz r3, .L245 +1901:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3536 .loc 1 1901 9 is_stmt 1 view .LVU1191 +1901:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3537 .loc 1 1901 40 is_stmt 0 view .LVU1192 + 3538 0068 364A ldr r2, .L255+8 + 3539 006a 9A62 str r2, [r3, #40] +1904:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3540 .loc 1 1904 9 is_stmt 1 view .LVU1193 +1904:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3541 .loc 1 1904 13 is_stmt 0 view .LVU1194 + 3542 006c A36B ldr r3, [r4, #56] +1904:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3543 .loc 1 1904 41 view .LVU1195 + 3544 006e 364A ldr r2, .L255+12 + 3545 0070 1A63 str r2, [r3, #48] +1907:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmatx->XferAbortCallback = NULL; + 3546 .loc 1 1907 9 is_stmt 1 view .LVU1196 +1907:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmatx->XferAbortCallback = NULL; + 3547 .loc 1 1907 13 is_stmt 0 view .LVU1197 + 3548 0072 A26B ldr r2, [r4, #56] +1907:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmatx->XferAbortCallback = NULL; + 3549 .loc 1 1907 44 view .LVU1198 + 3550 0074 0023 movs r3, #0 + 3551 0076 D362 str r3, [r2, #44] +1908:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3552 .loc 1 1908 9 is_stmt 1 view .LVU1199 +1908:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3553 .loc 1 1908 13 is_stmt 0 view .LVU1200 + 3554 0078 A26B ldr r2, [r4, #56] + ARM GAS /tmp/ccE2rRGE.s page 201 + + +1908:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3555 .loc 1 1908 41 view .LVU1201 + 3556 007a 5363 str r3, [r2, #52] +1911:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize); + 3557 .loc 1 1911 9 is_stmt 1 view .LVU1202 +1911:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize); + 3558 .loc 1 1911 88 is_stmt 0 view .LVU1203 + 3559 007c 2268 ldr r2, [r4] +1911:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize); + 3560 .loc 1 1911 25 view .LVU1204 + 3561 007e 238D ldrh r3, [r4, #40] + 3562 0080 2832 adds r2, r2, #40 + 3563 0082 A06B ldr r0, [r4, #56] + 3564 0084 FFF7FEFF bl HAL_DMA_Start_IT + 3565 .LVL212: +1929:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3566 .loc 1 1929 7 is_stmt 1 view .LVU1205 +1929:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3567 .loc 1 1929 10 is_stmt 0 view .LVU1206 + 3568 0088 00B3 cbz r0, .L254 +1953:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 3569 .loc 1 1953 9 is_stmt 1 view .LVU1207 +1953:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 3570 .loc 1 1953 25 is_stmt 0 view .LVU1208 + 3571 008a 2023 movs r3, #32 + 3572 008c 84F84130 strb r3, [r4, #65] +1954:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3573 .loc 1 1954 9 is_stmt 1 view .LVU1209 +1954:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3574 .loc 1 1954 25 is_stmt 0 view .LVU1210 + 3575 0090 0022 movs r2, #0 + 3576 0092 84F84220 strb r2, [r4, #66] +1957:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3577 .loc 1 1957 9 is_stmt 1 view .LVU1211 +1957:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3578 .loc 1 1957 13 is_stmt 0 view .LVU1212 + 3579 0096 636C ldr r3, [r4, #68] +1957:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3580 .loc 1 1957 25 view .LVU1213 + 3581 0098 43F01003 orr r3, r3, #16 + 3582 009c 6364 str r3, [r4, #68] +1960:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3583 .loc 1 1960 9 is_stmt 1 view .LVU1214 +1960:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3584 .loc 1 1960 9 view .LVU1215 + 3585 009e 84F84020 strb r2, [r4, #64] +1960:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3586 .loc 1 1960 9 view .LVU1216 +1962:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3587 .loc 1 1962 9 view .LVU1217 +1962:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3588 .loc 1 1962 16 is_stmt 0 view .LVU1218 + 3589 00a2 0120 movs r0, #1 + 3590 .LVL213: +1962:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3591 .loc 1 1962 16 view .LVU1219 + 3592 00a4 43E0 b .L241 + ARM GAS /tmp/ccE2rRGE.s page 202 + + + 3593 .LVL214: + 3594 .L242: +1892:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_AUTOEND_MODE; + 3595 .loc 1 1892 7 is_stmt 1 view .LVU1220 +1892:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_AUTOEND_MODE; + 3596 .loc 1 1892 28 is_stmt 0 view .LVU1221 + 3597 00a6 638D ldrh r3, [r4, #42] +1892:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_AUTOEND_MODE; + 3598 .loc 1 1892 22 view .LVU1222 + 3599 00a8 2385 strh r3, [r4, #40] @ movhi +1893:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3600 .loc 1 1893 7 is_stmt 1 view .LVU1223 + 3601 .LVL215: +1893:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3602 .loc 1 1893 16 is_stmt 0 view .LVU1224 + 3603 00aa 4FF00076 mov r6, #33554432 + 3604 00ae D6E7 b .L243 + 3605 .LVL216: + 3606 .L245: +1917:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 3607 .loc 1 1917 9 is_stmt 1 view .LVU1225 +1917:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 3608 .loc 1 1917 25 is_stmt 0 view .LVU1226 + 3609 00b0 2023 movs r3, #32 + 3610 00b2 84F84130 strb r3, [r4, #65] +1918:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3611 .loc 1 1918 9 is_stmt 1 view .LVU1227 +1918:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3612 .loc 1 1918 25 is_stmt 0 view .LVU1228 + 3613 00b6 0022 movs r2, #0 + 3614 00b8 84F84220 strb r2, [r4, #66] +1921:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3615 .loc 1 1921 9 is_stmt 1 view .LVU1229 +1921:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3616 .loc 1 1921 13 is_stmt 0 view .LVU1230 + 3617 00bc 636C ldr r3, [r4, #68] +1921:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3618 .loc 1 1921 25 view .LVU1231 + 3619 00be 43F08003 orr r3, r3, #128 + 3620 00c2 6364 str r3, [r4, #68] +1924:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3621 .loc 1 1924 9 is_stmt 1 view .LVU1232 +1924:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3622 .loc 1 1924 9 view .LVU1233 + 3623 00c4 84F84020 strb r2, [r4, #64] +1924:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3624 .loc 1 1924 9 view .LVU1234 +1926:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3625 .loc 1 1926 9 view .LVU1235 +1926:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3626 .loc 1 1926 16 is_stmt 0 view .LVU1236 + 3627 00c8 0120 movs r0, #1 + 3628 00ca 30E0 b .L241 + 3629 .LVL217: + 3630 .L254: +1933:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3631 .loc 1 1933 9 is_stmt 1 view .LVU1237 + ARM GAS /tmp/ccE2rRGE.s page 203 + + + 3632 00cc 1F4B ldr r3, .L255+16 + 3633 00ce 0093 str r3, [sp] + 3634 00d0 3346 mov r3, r6 + 3635 00d2 94F82820 ldrb r2, [r4, #40] @ zero_extendqisi2 + 3636 00d6 2946 mov r1, r5 + 3637 00d8 2046 mov r0, r4 + 3638 .LVL218: +1933:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3639 .loc 1 1933 9 is_stmt 0 view .LVU1238 + 3640 00da FFF7FEFF bl I2C_TransferConfig + 3641 .LVL219: +1936:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3642 .loc 1 1936 9 is_stmt 1 view .LVU1239 +1936:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3643 .loc 1 1936 13 is_stmt 0 view .LVU1240 + 3644 00de 638D ldrh r3, [r4, #42] + 3645 00e0 9BB2 uxth r3, r3 +1936:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3646 .loc 1 1936 32 view .LVU1241 + 3647 00e2 228D ldrh r2, [r4, #40] +1936:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3648 .loc 1 1936 25 view .LVU1242 + 3649 00e4 9B1A subs r3, r3, r2 + 3650 00e6 9BB2 uxth r3, r3 + 3651 00e8 6385 strh r3, [r4, #42] @ movhi +1939:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3652 .loc 1 1939 9 is_stmt 1 view .LVU1243 +1939:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3653 .loc 1 1939 9 view .LVU1244 + 3654 00ea 0023 movs r3, #0 + 3655 00ec 84F84030 strb r3, [r4, #64] +1939:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3656 .loc 1 1939 9 view .LVU1245 +1945:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3657 .loc 1 1945 9 view .LVU1246 + 3658 00f0 1021 movs r1, #16 + 3659 00f2 2046 mov r0, r4 + 3660 00f4 FFF7FEFF bl I2C_Enable_IRQ + 3661 .LVL220: +1948:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3662 .loc 1 1948 9 view .LVU1247 +1948:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3663 .loc 1 1948 13 is_stmt 0 view .LVU1248 + 3664 00f8 2268 ldr r2, [r4] +1948:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3665 .loc 1 1948 23 view .LVU1249 + 3666 00fa 1368 ldr r3, [r2] +1948:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3667 .loc 1 1948 29 view .LVU1250 + 3668 00fc 43F48043 orr r3, r3, #16384 + 3669 0100 1360 str r3, [r2] + 3670 0102 11E0 b .L248 + 3671 .LVL221: + 3672 .L244: +1968:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3673 .loc 1 1968 7 is_stmt 1 view .LVU1251 +1968:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + ARM GAS /tmp/ccE2rRGE.s page 204 + + + 3674 .loc 1 1968 21 is_stmt 0 view .LVU1252 + 3675 0104 124B ldr r3, .L255+20 + 3676 0106 6363 str r3, [r4, #52] +1972:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_GENERATE_START_WRITE); + 3677 .loc 1 1972 7 is_stmt 1 view .LVU1253 + 3678 0108 104B ldr r3, .L255+16 + 3679 010a 0093 str r3, [sp] + 3680 010c 4FF00073 mov r3, #33554432 + 3681 0110 D2B2 uxtb r2, r2 + 3682 0112 2946 mov r1, r5 + 3683 .LVL222: +1972:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_GENERATE_START_WRITE); + 3684 .loc 1 1972 7 is_stmt 0 view .LVU1254 + 3685 0114 2046 mov r0, r4 + 3686 0116 FFF7FEFF bl I2C_TransferConfig + 3687 .LVL223: +1976:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3688 .loc 1 1976 7 is_stmt 1 view .LVU1255 +1976:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3689 .loc 1 1976 7 view .LVU1256 + 3690 011a 0023 movs r3, #0 + 3691 011c 84F84030 strb r3, [r4, #64] +1976:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3692 .loc 1 1976 7 view .LVU1257 +1985:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3693 .loc 1 1985 7 view .LVU1258 + 3694 0120 0121 movs r1, #1 + 3695 0122 2046 mov r0, r4 + 3696 0124 FFF7FEFF bl I2C_Enable_IRQ + 3697 .LVL224: + 3698 .L248: +1988:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3699 .loc 1 1988 5 view .LVU1259 +1988:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3700 .loc 1 1988 12 is_stmt 0 view .LVU1260 + 3701 0128 0020 movs r0, #0 + 3702 012a 00E0 b .L241 + 3703 .LVL225: + 3704 .L249: +1992:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3705 .loc 1 1992 12 view .LVU1261 + 3706 012c 0220 movs r0, #2 + 3707 .LVL226: + 3708 .L241: +1994:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3709 .loc 1 1994 1 view .LVU1262 + 3710 012e 02B0 add sp, sp, #8 + 3711 .cfi_remember_state + 3712 .cfi_def_cfa_offset 16 + 3713 @ sp needed + 3714 0130 70BD pop {r4, r5, r6, pc} + 3715 .LVL227: + 3716 .L250: + 3717 .cfi_restore_state +1869:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3718 .loc 1 1869 14 view .LVU1263 + 3719 0132 0220 movs r0, #2 + ARM GAS /tmp/ccE2rRGE.s page 205 + + + 3720 0134 FBE7 b .L241 + 3721 .L251: +1873:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3722 .loc 1 1873 5 view .LVU1264 + 3723 0136 0220 movs r0, #2 + 3724 0138 F9E7 b .L241 + 3725 .L256: + 3726 013a 00BF .align 2 + 3727 .L255: + 3728 013c 0000FFFF .word -65536 + 3729 0140 00000000 .word I2C_Master_ISR_DMA + 3730 0144 00000000 .word I2C_DMAMasterTransmitCplt + 3731 0148 00000000 .word I2C_DMAError + 3732 014c 00200080 .word -2147475456 + 3733 0150 00000000 .word I2C_Master_ISR_IT + 3734 .cfi_endproc + 3735 .LFE142: + 3737 .section .text.HAL_I2C_Master_Receive_DMA,"ax",%progbits + 3738 .align 1 + 3739 .global HAL_I2C_Master_Receive_DMA + 3740 .syntax unified + 3741 .thumb + 3742 .thumb_func + 3744 HAL_I2C_Master_Receive_DMA: + 3745 .LVL228: + 3746 .LFB143: +2008:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t xfermode; + 3747 .loc 1 2008 1 is_stmt 1 view -0 + 3748 .cfi_startproc + 3749 @ args = 0, pretend = 0, frame = 0 + 3750 @ frame_needed = 0, uses_anonymous_args = 0 +2008:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t xfermode; + 3751 .loc 1 2008 1 is_stmt 0 view .LVU1266 + 3752 0000 70B5 push {r4, r5, r6, lr} + 3753 .cfi_def_cfa_offset 16 + 3754 .cfi_offset 4, -16 + 3755 .cfi_offset 5, -12 + 3756 .cfi_offset 6, -8 + 3757 .cfi_offset 14, -4 + 3758 0002 82B0 sub sp, sp, #8 + 3759 .cfi_def_cfa_offset 24 + 3760 0004 0446 mov r4, r0 +2009:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef dmaxferstatus; + 3761 .loc 1 2009 3 is_stmt 1 view .LVU1267 +2010:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3762 .loc 1 2010 3 view .LVU1268 +2012:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3763 .loc 1 2012 3 view .LVU1269 +2012:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3764 .loc 1 2012 11 is_stmt 0 view .LVU1270 + 3765 0006 90F84100 ldrb r0, [r0, #65] @ zero_extendqisi2 + 3766 .LVL229: +2012:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3767 .loc 1 2012 11 view .LVU1271 + 3768 000a C0B2 uxtb r0, r0 +2012:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3769 .loc 1 2012 6 view .LVU1272 + ARM GAS /tmp/ccE2rRGE.s page 206 + + + 3770 000c 2028 cmp r0, #32 + 3771 000e 40F08C80 bne .L266 + 3772 0012 0D46 mov r5, r1 +2014:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3773 .loc 1 2014 5 is_stmt 1 view .LVU1273 +2014:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3774 .loc 1 2014 9 is_stmt 0 view .LVU1274 + 3775 0014 2168 ldr r1, [r4] + 3776 .LVL230: +2014:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3777 .loc 1 2014 9 view .LVU1275 + 3778 0016 8969 ldr r1, [r1, #24] +2014:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3779 .loc 1 2014 8 view .LVU1276 + 3780 0018 11F4004F tst r1, #32768 + 3781 001c 40F08880 bne .L267 +2020:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3782 .loc 1 2020 5 is_stmt 1 view .LVU1277 +2020:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3783 .loc 1 2020 5 view .LVU1278 + 3784 0020 94F84010 ldrb r1, [r4, #64] @ zero_extendqisi2 + 3785 0024 0129 cmp r1, #1 + 3786 0026 00F08580 beq .L268 +2020:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3787 .loc 1 2020 5 discriminator 2 view .LVU1279 + 3788 002a 0121 movs r1, #1 + 3789 002c 84F84010 strb r1, [r4, #64] +2020:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3790 .loc 1 2020 5 discriminator 2 view .LVU1280 +2022:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MASTER; + 3791 .loc 1 2022 5 discriminator 2 view .LVU1281 +2022:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MASTER; + 3792 .loc 1 2022 23 is_stmt 0 discriminator 2 view .LVU1282 + 3793 0030 2221 movs r1, #34 + 3794 0032 84F84110 strb r1, [r4, #65] +2023:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 3795 .loc 1 2023 5 is_stmt 1 discriminator 2 view .LVU1283 +2023:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 3796 .loc 1 2023 23 is_stmt 0 discriminator 2 view .LVU1284 + 3797 0036 1021 movs r1, #16 + 3798 0038 84F84210 strb r1, [r4, #66] +2024:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3799 .loc 1 2024 5 is_stmt 1 discriminator 2 view .LVU1285 +2024:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3800 .loc 1 2024 23 is_stmt 0 discriminator 2 view .LVU1286 + 3801 003c 0021 movs r1, #0 + 3802 003e 6164 str r1, [r4, #68] +2027:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 3803 .loc 1 2027 5 is_stmt 1 discriminator 2 view .LVU1287 +2027:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 3804 .loc 1 2027 23 is_stmt 0 discriminator 2 view .LVU1288 + 3805 0040 6262 str r2, [r4, #36] +2028:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; + 3806 .loc 1 2028 5 is_stmt 1 discriminator 2 view .LVU1289 +2028:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; + 3807 .loc 1 2028 23 is_stmt 0 discriminator 2 view .LVU1290 + 3808 0042 6385 strh r3, [r4, #42] @ movhi + ARM GAS /tmp/ccE2rRGE.s page 207 + + +2029:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_DMA; + 3809 .loc 1 2029 5 is_stmt 1 discriminator 2 view .LVU1291 +2029:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_DMA; + 3810 .loc 1 2029 23 is_stmt 0 discriminator 2 view .LVU1292 + 3811 0044 3C4B ldr r3, .L272 + 3812 .LVL231: +2029:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_DMA; + 3813 .loc 1 2029 23 discriminator 2 view .LVU1293 + 3814 0046 E362 str r3, [r4, #44] + 3815 .LVL232: +2030:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3816 .loc 1 2030 5 is_stmt 1 discriminator 2 view .LVU1294 +2030:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3817 .loc 1 2030 23 is_stmt 0 discriminator 2 view .LVU1295 + 3818 0048 3C4B ldr r3, .L272+4 + 3819 004a 6363 str r3, [r4, #52] +2032:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3820 .loc 1 2032 5 is_stmt 1 discriminator 2 view .LVU1296 +2032:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3821 .loc 1 2032 13 is_stmt 0 discriminator 2 view .LVU1297 + 3822 004c 638D ldrh r3, [r4, #42] + 3823 004e 9BB2 uxth r3, r3 +2032:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3824 .loc 1 2032 8 discriminator 2 view .LVU1298 + 3825 0050 FF2B cmp r3, #255 + 3826 0052 27D9 bls .L259 +2034:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_RELOAD_MODE; + 3827 .loc 1 2034 7 is_stmt 1 view .LVU1299 +2034:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_RELOAD_MODE; + 3828 .loc 1 2034 22 is_stmt 0 view .LVU1300 + 3829 0054 FF23 movs r3, #255 + 3830 0056 2385 strh r3, [r4, #40] @ movhi +2035:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3831 .loc 1 2035 7 is_stmt 1 view .LVU1301 + 3832 .LVL233: +2035:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3833 .loc 1 2035 16 is_stmt 0 view .LVU1302 + 3834 0058 4FF08076 mov r6, #16777216 + 3835 .LVL234: + 3836 .L260: +2043:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3837 .loc 1 2043 5 is_stmt 1 view .LVU1303 +2043:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3838 .loc 1 2043 13 is_stmt 0 view .LVU1304 + 3839 005c 218D ldrh r1, [r4, #40] +2043:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3840 .loc 1 2043 8 view .LVU1305 + 3841 005e 0029 cmp r1, #0 + 3842 0060 4FD0 beq .L261 +2045:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3843 .loc 1 2045 7 is_stmt 1 view .LVU1306 +2045:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3844 .loc 1 2045 15 is_stmt 0 view .LVU1307 + 3845 0062 E36B ldr r3, [r4, #60] +2045:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3846 .loc 1 2045 10 view .LVU1308 + 3847 0064 1BB3 cbz r3, .L262 + ARM GAS /tmp/ccE2rRGE.s page 208 + + +2048:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3848 .loc 1 2048 9 is_stmt 1 view .LVU1309 +2048:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3849 .loc 1 2048 40 is_stmt 0 view .LVU1310 + 3850 0066 3649 ldr r1, .L272+8 + 3851 0068 9962 str r1, [r3, #40] +2051:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3852 .loc 1 2051 9 is_stmt 1 view .LVU1311 +2051:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3853 .loc 1 2051 13 is_stmt 0 view .LVU1312 + 3854 006a E36B ldr r3, [r4, #60] +2051:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3855 .loc 1 2051 41 view .LVU1313 + 3856 006c 3549 ldr r1, .L272+12 + 3857 006e 1963 str r1, [r3, #48] +2054:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmarx->XferAbortCallback = NULL; + 3858 .loc 1 2054 9 is_stmt 1 view .LVU1314 +2054:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmarx->XferAbortCallback = NULL; + 3859 .loc 1 2054 13 is_stmt 0 view .LVU1315 + 3860 0070 E16B ldr r1, [r4, #60] +2054:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmarx->XferAbortCallback = NULL; + 3861 .loc 1 2054 44 view .LVU1316 + 3862 0072 0023 movs r3, #0 + 3863 0074 CB62 str r3, [r1, #44] +2055:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3864 .loc 1 2055 9 is_stmt 1 view .LVU1317 +2055:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3865 .loc 1 2055 13 is_stmt 0 view .LVU1318 + 3866 0076 E16B ldr r1, [r4, #60] +2055:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3867 .loc 1 2055 41 view .LVU1319 + 3868 0078 4B63 str r3, [r1, #52] +2058:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize); + 3869 .loc 1 2058 9 is_stmt 1 view .LVU1320 +2058:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize); + 3870 .loc 1 2058 71 is_stmt 0 view .LVU1321 + 3871 007a 2168 ldr r1, [r4] +2058:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize); + 3872 .loc 1 2058 25 view .LVU1322 + 3873 007c 238D ldrh r3, [r4, #40] + 3874 007e 2431 adds r1, r1, #36 + 3875 0080 E06B ldr r0, [r4, #60] + 3876 0082 FFF7FEFF bl HAL_DMA_Start_IT + 3877 .LVL235: +2076:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3878 .loc 1 2076 7 is_stmt 1 view .LVU1323 +2076:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 3879 .loc 1 2076 10 is_stmt 0 view .LVU1324 + 3880 0086 00B3 cbz r0, .L271 +2100:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 3881 .loc 1 2100 9 is_stmt 1 view .LVU1325 +2100:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 3882 .loc 1 2100 25 is_stmt 0 view .LVU1326 + 3883 0088 2023 movs r3, #32 + 3884 008a 84F84130 strb r3, [r4, #65] +2101:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3885 .loc 1 2101 9 is_stmt 1 view .LVU1327 + ARM GAS /tmp/ccE2rRGE.s page 209 + + +2101:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3886 .loc 1 2101 25 is_stmt 0 view .LVU1328 + 3887 008e 0022 movs r2, #0 + 3888 0090 84F84220 strb r2, [r4, #66] +2104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3889 .loc 1 2104 9 is_stmt 1 view .LVU1329 +2104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3890 .loc 1 2104 13 is_stmt 0 view .LVU1330 + 3891 0094 636C ldr r3, [r4, #68] +2104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3892 .loc 1 2104 25 view .LVU1331 + 3893 0096 43F01003 orr r3, r3, #16 + 3894 009a 6364 str r3, [r4, #68] +2107:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3895 .loc 1 2107 9 is_stmt 1 view .LVU1332 +2107:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3896 .loc 1 2107 9 view .LVU1333 + 3897 009c 84F84020 strb r2, [r4, #64] +2107:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3898 .loc 1 2107 9 view .LVU1334 +2109:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3899 .loc 1 2109 9 view .LVU1335 +2109:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3900 .loc 1 2109 16 is_stmt 0 view .LVU1336 + 3901 00a0 0120 movs r0, #1 + 3902 .LVL236: +2109:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3903 .loc 1 2109 16 view .LVU1337 + 3904 00a2 43E0 b .L258 + 3905 .LVL237: + 3906 .L259: +2039:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_AUTOEND_MODE; + 3907 .loc 1 2039 7 is_stmt 1 view .LVU1338 +2039:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_AUTOEND_MODE; + 3908 .loc 1 2039 28 is_stmt 0 view .LVU1339 + 3909 00a4 638D ldrh r3, [r4, #42] +2039:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_AUTOEND_MODE; + 3910 .loc 1 2039 22 view .LVU1340 + 3911 00a6 2385 strh r3, [r4, #40] @ movhi +2040:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3912 .loc 1 2040 7 is_stmt 1 view .LVU1341 + 3913 .LVL238: +2040:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3914 .loc 1 2040 16 is_stmt 0 view .LVU1342 + 3915 00a8 4FF00076 mov r6, #33554432 + 3916 00ac D6E7 b .L260 + 3917 .LVL239: + 3918 .L262: +2064:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 3919 .loc 1 2064 9 is_stmt 1 view .LVU1343 +2064:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 3920 .loc 1 2064 25 is_stmt 0 view .LVU1344 + 3921 00ae 2023 movs r3, #32 + 3922 00b0 84F84130 strb r3, [r4, #65] +2065:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3923 .loc 1 2065 9 is_stmt 1 view .LVU1345 +2065:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + ARM GAS /tmp/ccE2rRGE.s page 210 + + + 3924 .loc 1 2065 25 is_stmt 0 view .LVU1346 + 3925 00b4 0022 movs r2, #0 + 3926 .LVL240: +2065:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3927 .loc 1 2065 25 view .LVU1347 + 3928 00b6 84F84220 strb r2, [r4, #66] +2068:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3929 .loc 1 2068 9 is_stmt 1 view .LVU1348 +2068:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3930 .loc 1 2068 13 is_stmt 0 view .LVU1349 + 3931 00ba 636C ldr r3, [r4, #68] +2068:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3932 .loc 1 2068 25 view .LVU1350 + 3933 00bc 43F08003 orr r3, r3, #128 + 3934 00c0 6364 str r3, [r4, #68] +2071:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3935 .loc 1 2071 9 is_stmt 1 view .LVU1351 +2071:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3936 .loc 1 2071 9 view .LVU1352 + 3937 00c2 84F84020 strb r2, [r4, #64] +2071:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3938 .loc 1 2071 9 view .LVU1353 +2073:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3939 .loc 1 2073 9 view .LVU1354 +2073:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3940 .loc 1 2073 16 is_stmt 0 view .LVU1355 + 3941 00c6 0120 movs r0, #1 + 3942 00c8 30E0 b .L258 + 3943 .LVL241: + 3944 .L271: +2080:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3945 .loc 1 2080 9 is_stmt 1 view .LVU1356 + 3946 00ca 1F4B ldr r3, .L272+16 + 3947 00cc 0093 str r3, [sp] + 3948 00ce 3346 mov r3, r6 + 3949 00d0 94F82820 ldrb r2, [r4, #40] @ zero_extendqisi2 + 3950 00d4 2946 mov r1, r5 + 3951 00d6 2046 mov r0, r4 + 3952 .LVL242: +2080:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3953 .loc 1 2080 9 is_stmt 0 view .LVU1357 + 3954 00d8 FFF7FEFF bl I2C_TransferConfig + 3955 .LVL243: +2083:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3956 .loc 1 2083 9 is_stmt 1 view .LVU1358 +2083:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3957 .loc 1 2083 13 is_stmt 0 view .LVU1359 + 3958 00dc 638D ldrh r3, [r4, #42] + 3959 00de 9BB2 uxth r3, r3 +2083:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3960 .loc 1 2083 32 view .LVU1360 + 3961 00e0 228D ldrh r2, [r4, #40] +2083:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3962 .loc 1 2083 25 view .LVU1361 + 3963 00e2 9B1A subs r3, r3, r2 + 3964 00e4 9BB2 uxth r3, r3 + 3965 00e6 6385 strh r3, [r4, #42] @ movhi + ARM GAS /tmp/ccE2rRGE.s page 211 + + +2086:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3966 .loc 1 2086 9 is_stmt 1 view .LVU1362 +2086:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3967 .loc 1 2086 9 view .LVU1363 + 3968 00e8 0023 movs r3, #0 + 3969 00ea 84F84030 strb r3, [r4, #64] +2086:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3970 .loc 1 2086 9 view .LVU1364 +2092:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3971 .loc 1 2092 9 view .LVU1365 + 3972 00ee 1021 movs r1, #16 + 3973 00f0 2046 mov r0, r4 + 3974 00f2 FFF7FEFF bl I2C_Enable_IRQ + 3975 .LVL244: +2095:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3976 .loc 1 2095 9 view .LVU1366 +2095:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3977 .loc 1 2095 13 is_stmt 0 view .LVU1367 + 3978 00f6 2268 ldr r2, [r4] +2095:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3979 .loc 1 2095 23 view .LVU1368 + 3980 00f8 1368 ldr r3, [r2] +2095:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 3981 .loc 1 2095 29 view .LVU1369 + 3982 00fa 43F40043 orr r3, r3, #32768 + 3983 00fe 1360 str r3, [r2] + 3984 0100 11E0 b .L265 + 3985 .LVL245: + 3986 .L261: +2115:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3987 .loc 1 2115 7 is_stmt 1 view .LVU1370 +2115:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 3988 .loc 1 2115 21 is_stmt 0 view .LVU1371 + 3989 0102 124B ldr r3, .L272+20 + 3990 0104 6363 str r3, [r4, #52] +2119:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_GENERATE_START_READ); + 3991 .loc 1 2119 7 is_stmt 1 view .LVU1372 + 3992 0106 104B ldr r3, .L272+16 + 3993 0108 0093 str r3, [sp] + 3994 010a 4FF00073 mov r3, #33554432 + 3995 010e CAB2 uxtb r2, r1 + 3996 .LVL246: +2119:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_GENERATE_START_READ); + 3997 .loc 1 2119 7 is_stmt 0 view .LVU1373 + 3998 0110 2946 mov r1, r5 + 3999 0112 2046 mov r0, r4 + 4000 0114 FFF7FEFF bl I2C_TransferConfig + 4001 .LVL247: +2123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4002 .loc 1 2123 7 is_stmt 1 view .LVU1374 +2123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4003 .loc 1 2123 7 view .LVU1375 + 4004 0118 0023 movs r3, #0 + 4005 011a 84F84030 strb r3, [r4, #64] +2123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4006 .loc 1 2123 7 view .LVU1376 +2132:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + ARM GAS /tmp/ccE2rRGE.s page 212 + + + 4007 .loc 1 2132 7 view .LVU1377 + 4008 011e 0121 movs r1, #1 + 4009 0120 2046 mov r0, r4 + 4010 0122 FFF7FEFF bl I2C_Enable_IRQ + 4011 .LVL248: + 4012 .L265: +2135:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4013 .loc 1 2135 5 view .LVU1378 +2135:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4014 .loc 1 2135 12 is_stmt 0 view .LVU1379 + 4015 0126 0020 movs r0, #0 + 4016 0128 00E0 b .L258 + 4017 .LVL249: + 4018 .L266: +2139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4019 .loc 1 2139 12 view .LVU1380 + 4020 012a 0220 movs r0, #2 + 4021 .LVL250: + 4022 .L258: +2141:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4023 .loc 1 2141 1 view .LVU1381 + 4024 012c 02B0 add sp, sp, #8 + 4025 .cfi_remember_state + 4026 .cfi_def_cfa_offset 16 + 4027 @ sp needed + 4028 012e 70BD pop {r4, r5, r6, pc} + 4029 .LVL251: + 4030 .L267: + 4031 .cfi_restore_state +2016:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4032 .loc 1 2016 14 view .LVU1382 + 4033 0130 0220 movs r0, #2 + 4034 0132 FBE7 b .L258 + 4035 .L268: +2020:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4036 .loc 1 2020 5 view .LVU1383 + 4037 0134 0220 movs r0, #2 + 4038 0136 F9E7 b .L258 + 4039 .L273: + 4040 .align 2 + 4041 .L272: + 4042 0138 0000FFFF .word -65536 + 4043 013c 00000000 .word I2C_Master_ISR_DMA + 4044 0140 00000000 .word I2C_DMAMasterReceiveCplt + 4045 0144 00000000 .word I2C_DMAError + 4046 0148 00240080 .word -2147474432 + 4047 014c 00000000 .word I2C_Master_ISR_IT + 4048 .cfi_endproc + 4049 .LFE143: + 4051 .section .text.HAL_I2C_Slave_Transmit_DMA,"ax",%progbits + 4052 .align 1 + 4053 .global HAL_I2C_Slave_Transmit_DMA + 4054 .syntax unified + 4055 .thumb + 4056 .thumb_func + 4058 HAL_I2C_Slave_Transmit_DMA: + 4059 .LVL252: + ARM GAS /tmp/ccE2rRGE.s page 213 + + + 4060 .LFB144: +2152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef dmaxferstatus; + 4061 .loc 1 2152 1 is_stmt 1 view -0 + 4062 .cfi_startproc + 4063 @ args = 0, pretend = 0, frame = 0 + 4064 @ frame_needed = 0, uses_anonymous_args = 0 +2152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef dmaxferstatus; + 4065 .loc 1 2152 1 is_stmt 0 view .LVU1385 + 4066 0000 38B5 push {r3, r4, r5, lr} + 4067 .cfi_def_cfa_offset 16 + 4068 .cfi_offset 3, -16 + 4069 .cfi_offset 4, -12 + 4070 .cfi_offset 5, -8 + 4071 .cfi_offset 14, -4 +2153:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4072 .loc 1 2153 3 is_stmt 1 view .LVU1386 +2155:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4073 .loc 1 2155 3 view .LVU1387 +2155:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4074 .loc 1 2155 11 is_stmt 0 view .LVU1388 + 4075 0002 90F84130 ldrb r3, [r0, #65] @ zero_extendqisi2 + 4076 0006 DBB2 uxtb r3, r3 +2155:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4077 .loc 1 2155 6 view .LVU1389 + 4078 0008 202B cmp r3, #32 + 4079 000a 63D1 bne .L281 + 4080 000c 0446 mov r4, r0 +2157:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4081 .loc 1 2157 5 is_stmt 1 view .LVU1390 +2157:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4082 .loc 1 2157 8 is_stmt 0 view .LVU1391 + 4083 000e 0029 cmp r1, #0 + 4084 0010 3AD0 beq .L276 +2157:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4085 .loc 1 2157 25 discriminator 1 view .LVU1392 + 4086 0012 002A cmp r2, #0 + 4087 0014 38D0 beq .L276 +2163:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4088 .loc 1 2163 5 is_stmt 1 view .LVU1393 +2163:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4089 .loc 1 2163 5 view .LVU1394 + 4090 0016 90F84030 ldrb r3, [r0, #64] @ zero_extendqisi2 + 4091 001a 012B cmp r3, #1 + 4092 001c 5DD0 beq .L282 +2163:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4093 .loc 1 2163 5 discriminator 2 view .LVU1395 + 4094 001e 0123 movs r3, #1 + 4095 0020 80F84030 strb r3, [r0, #64] +2163:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4096 .loc 1 2163 5 discriminator 2 view .LVU1396 +2165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_SLAVE; + 4097 .loc 1 2165 5 discriminator 2 view .LVU1397 +2165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_SLAVE; + 4098 .loc 1 2165 23 is_stmt 0 discriminator 2 view .LVU1398 + 4099 0024 2123 movs r3, #33 + 4100 0026 80F84130 strb r3, [r0, #65] +2166:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + ARM GAS /tmp/ccE2rRGE.s page 214 + + + 4101 .loc 1 2166 5 is_stmt 1 discriminator 2 view .LVU1399 +2166:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 4102 .loc 1 2166 23 is_stmt 0 discriminator 2 view .LVU1400 + 4103 002a 2023 movs r3, #32 + 4104 002c 80F84230 strb r3, [r0, #66] +2167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4105 .loc 1 2167 5 is_stmt 1 discriminator 2 view .LVU1401 +2167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4106 .loc 1 2167 23 is_stmt 0 discriminator 2 view .LVU1402 + 4107 0030 0023 movs r3, #0 + 4108 0032 4364 str r3, [r0, #68] +2170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 4109 .loc 1 2170 5 is_stmt 1 discriminator 2 view .LVU1403 +2170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 4110 .loc 1 2170 23 is_stmt 0 discriminator 2 view .LVU1404 + 4111 0034 4162 str r1, [r0, #36] +2171:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; + 4112 .loc 1 2171 5 is_stmt 1 discriminator 2 view .LVU1405 +2171:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; + 4113 .loc 1 2171 23 is_stmt 0 discriminator 2 view .LVU1406 + 4114 0036 4285 strh r2, [r0, #42] @ movhi +2172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; + 4115 .loc 1 2172 5 is_stmt 1 discriminator 2 view .LVU1407 +2172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; + 4116 .loc 1 2172 29 is_stmt 0 discriminator 2 view .LVU1408 + 4117 0038 438D ldrh r3, [r0, #42] +2172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; + 4118 .loc 1 2172 23 discriminator 2 view .LVU1409 + 4119 003a 0385 strh r3, [r0, #40] @ movhi +2173:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Slave_ISR_DMA; + 4120 .loc 1 2173 5 is_stmt 1 discriminator 2 view .LVU1410 +2173:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Slave_ISR_DMA; + 4121 .loc 1 2173 23 is_stmt 0 discriminator 2 view .LVU1411 + 4122 003c 284B ldr r3, .L286 + 4123 003e C362 str r3, [r0, #44] +2174:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4124 .loc 1 2174 5 is_stmt 1 discriminator 2 view .LVU1412 +2174:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4125 .loc 1 2174 23 is_stmt 0 discriminator 2 view .LVU1413 + 4126 0040 284B ldr r3, .L286+4 + 4127 0042 4363 str r3, [r0, #52] +2176:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4128 .loc 1 2176 5 is_stmt 1 discriminator 2 view .LVU1414 +2176:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4129 .loc 1 2176 13 is_stmt 0 discriminator 2 view .LVU1415 + 4130 0044 836B ldr r3, [r0, #56] +2176:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4131 .loc 1 2176 8 discriminator 2 view .LVU1416 + 4132 0046 23B3 cbz r3, .L278 +2179:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4133 .loc 1 2179 7 is_stmt 1 view .LVU1417 +2179:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4134 .loc 1 2179 38 is_stmt 0 view .LVU1418 + 4135 0048 274A ldr r2, .L286+8 + 4136 .LVL253: +2179:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4137 .loc 1 2179 38 view .LVU1419 + ARM GAS /tmp/ccE2rRGE.s page 215 + + + 4138 004a 9A62 str r2, [r3, #40] +2182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4139 .loc 1 2182 7 is_stmt 1 view .LVU1420 +2182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4140 .loc 1 2182 11 is_stmt 0 view .LVU1421 + 4141 004c 836B ldr r3, [r0, #56] +2182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4142 .loc 1 2182 39 view .LVU1422 + 4143 004e 274A ldr r2, .L286+12 + 4144 0050 1A63 str r2, [r3, #48] +2185:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmatx->XferAbortCallback = NULL; + 4145 .loc 1 2185 7 is_stmt 1 view .LVU1423 +2185:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmatx->XferAbortCallback = NULL; + 4146 .loc 1 2185 11 is_stmt 0 view .LVU1424 + 4147 0052 826B ldr r2, [r0, #56] +2185:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmatx->XferAbortCallback = NULL; + 4148 .loc 1 2185 42 view .LVU1425 + 4149 0054 0023 movs r3, #0 + 4150 0056 D362 str r3, [r2, #44] +2186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4151 .loc 1 2186 7 is_stmt 1 view .LVU1426 +2186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4152 .loc 1 2186 11 is_stmt 0 view .LVU1427 + 4153 0058 826B ldr r2, [r0, #56] +2186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4154 .loc 1 2186 39 view .LVU1428 + 4155 005a 5363 str r3, [r2, #52] +2189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize); + 4156 .loc 1 2189 7 is_stmt 1 view .LVU1429 +2189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize); + 4157 .loc 1 2189 86 is_stmt 0 view .LVU1430 + 4158 005c 0268 ldr r2, [r0] +2189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize); + 4159 .loc 1 2189 23 view .LVU1431 + 4160 005e 038D ldrh r3, [r0, #40] + 4161 0060 2832 adds r2, r2, #40 + 4162 0062 806B ldr r0, [r0, #56] + 4163 .LVL254: +2189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize); + 4164 .loc 1 2189 23 view .LVU1432 + 4165 0064 FFF7FEFF bl HAL_DMA_Start_IT + 4166 .LVL255: +2207:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4167 .loc 1 2207 5 is_stmt 1 view .LVU1433 +2207:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4168 .loc 1 2207 8 is_stmt 0 view .LVU1434 + 4169 0068 0546 mov r5, r0 + 4170 006a 00B3 cbz r0, .L285 +2227:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 4171 .loc 1 2227 7 is_stmt 1 view .LVU1435 +2227:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 4172 .loc 1 2227 23 is_stmt 0 view .LVU1436 + 4173 006c 2823 movs r3, #40 + 4174 006e 84F84130 strb r3, [r4, #65] +2228:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4175 .loc 1 2228 7 is_stmt 1 view .LVU1437 +2228:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + ARM GAS /tmp/ccE2rRGE.s page 216 + + + 4176 .loc 1 2228 23 is_stmt 0 view .LVU1438 + 4177 0072 0022 movs r2, #0 + 4178 0074 84F84220 strb r2, [r4, #66] +2231:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4179 .loc 1 2231 7 is_stmt 1 view .LVU1439 +2231:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4180 .loc 1 2231 11 is_stmt 0 view .LVU1440 + 4181 0078 636C ldr r3, [r4, #68] +2231:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4182 .loc 1 2231 23 view .LVU1441 + 4183 007a 43F01003 orr r3, r3, #16 + 4184 007e 6364 str r3, [r4, #68] +2234:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4185 .loc 1 2234 7 is_stmt 1 view .LVU1442 +2234:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4186 .loc 1 2234 7 view .LVU1443 + 4187 0080 84F84020 strb r2, [r4, #64] +2234:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4188 .loc 1 2234 7 view .LVU1444 +2236:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4189 .loc 1 2236 7 view .LVU1445 +2236:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4190 .loc 1 2236 14 is_stmt 0 view .LVU1446 + 4191 0084 0125 movs r5, #1 + 4192 0086 26E0 b .L275 + 4193 .LVL256: + 4194 .L276: +2159:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 4195 .loc 1 2159 7 is_stmt 1 view .LVU1447 +2159:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 4196 .loc 1 2159 23 is_stmt 0 view .LVU1448 + 4197 0088 4FF40073 mov r3, #512 + 4198 008c 6364 str r3, [r4, #68] +2160:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4199 .loc 1 2160 7 is_stmt 1 view .LVU1449 +2160:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4200 .loc 1 2160 15 is_stmt 0 view .LVU1450 + 4201 008e 0125 movs r5, #1 + 4202 0090 21E0 b .L275 + 4203 .L278: +2195:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 4204 .loc 1 2195 7 is_stmt 1 view .LVU1451 +2195:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 4205 .loc 1 2195 23 is_stmt 0 view .LVU1452 + 4206 0092 2823 movs r3, #40 + 4207 0094 80F84130 strb r3, [r0, #65] +2196:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4208 .loc 1 2196 7 is_stmt 1 view .LVU1453 +2196:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4209 .loc 1 2196 23 is_stmt 0 view .LVU1454 + 4210 0098 0022 movs r2, #0 + 4211 .LVL257: +2196:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4212 .loc 1 2196 23 view .LVU1455 + 4213 009a 80F84220 strb r2, [r0, #66] +2199:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4214 .loc 1 2199 7 is_stmt 1 view .LVU1456 + ARM GAS /tmp/ccE2rRGE.s page 217 + + +2199:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4215 .loc 1 2199 11 is_stmt 0 view .LVU1457 + 4216 009e 436C ldr r3, [r0, #68] +2199:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4217 .loc 1 2199 23 view .LVU1458 + 4218 00a0 43F08003 orr r3, r3, #128 + 4219 00a4 4364 str r3, [r0, #68] +2202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4220 .loc 1 2202 7 is_stmt 1 view .LVU1459 +2202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4221 .loc 1 2202 7 view .LVU1460 + 4222 00a6 80F84020 strb r2, [r0, #64] +2202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4223 .loc 1 2202 7 view .LVU1461 +2204:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4224 .loc 1 2204 7 view .LVU1462 +2204:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4225 .loc 1 2204 14 is_stmt 0 view .LVU1463 + 4226 00aa 0125 movs r5, #1 + 4227 00ac 13E0 b .L275 + 4228 .LVL258: + 4229 .L285: +2210:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4230 .loc 1 2210 7 is_stmt 1 view .LVU1464 +2210:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4231 .loc 1 2210 11 is_stmt 0 view .LVU1465 + 4232 00ae 2268 ldr r2, [r4] +2210:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4233 .loc 1 2210 21 view .LVU1466 + 4234 00b0 5368 ldr r3, [r2, #4] +2210:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4235 .loc 1 2210 27 view .LVU1467 + 4236 00b2 23F40043 bic r3, r3, #32768 + 4237 00b6 5360 str r3, [r2, #4] +2213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4238 .loc 1 2213 7 is_stmt 1 view .LVU1468 +2213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4239 .loc 1 2213 7 view .LVU1469 + 4240 00b8 0023 movs r3, #0 + 4241 00ba 84F84030 strb r3, [r4, #64] +2213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4242 .loc 1 2213 7 view .LVU1470 +2219:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4243 .loc 1 2219 7 view .LVU1471 + 4244 00be 4FF40041 mov r1, #32768 + 4245 00c2 2046 mov r0, r4 + 4246 .LVL259: +2219:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4247 .loc 1 2219 7 is_stmt 0 view .LVU1472 + 4248 00c4 FFF7FEFF bl I2C_Enable_IRQ + 4249 .LVL260: +2222:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4250 .loc 1 2222 7 is_stmt 1 view .LVU1473 +2222:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4251 .loc 1 2222 11 is_stmt 0 view .LVU1474 + 4252 00c8 2268 ldr r2, [r4] +2222:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + ARM GAS /tmp/ccE2rRGE.s page 218 + + + 4253 .loc 1 2222 21 view .LVU1475 + 4254 00ca 1368 ldr r3, [r2] +2222:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4255 .loc 1 2222 27 view .LVU1476 + 4256 00cc 43F48043 orr r3, r3, #16384 + 4257 00d0 1360 str r3, [r2] +2239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4258 .loc 1 2239 5 is_stmt 1 view .LVU1477 +2239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4259 .loc 1 2239 12 is_stmt 0 view .LVU1478 + 4260 00d2 00E0 b .L275 + 4261 .LVL261: + 4262 .L281: +2243:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4263 .loc 1 2243 12 view .LVU1479 + 4264 00d4 0225 movs r5, #2 + 4265 .LVL262: + 4266 .L275: +2245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4267 .loc 1 2245 1 view .LVU1480 + 4268 00d6 2846 mov r0, r5 + 4269 00d8 38BD pop {r3, r4, r5, pc} + 4270 .LVL263: + 4271 .L282: +2163:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4272 .loc 1 2163 5 view .LVU1481 + 4273 00da 0225 movs r5, #2 + 4274 00dc FBE7 b .L275 + 4275 .L287: + 4276 00de 00BF .align 2 + 4277 .L286: + 4278 00e0 0000FFFF .word -65536 + 4279 00e4 00000000 .word I2C_Slave_ISR_DMA + 4280 00e8 00000000 .word I2C_DMASlaveTransmitCplt + 4281 00ec 00000000 .word I2C_DMAError + 4282 .cfi_endproc + 4283 .LFE144: + 4285 .section .text.HAL_I2C_Slave_Receive_DMA,"ax",%progbits + 4286 .align 1 + 4287 .global HAL_I2C_Slave_Receive_DMA + 4288 .syntax unified + 4289 .thumb + 4290 .thumb_func + 4292 HAL_I2C_Slave_Receive_DMA: + 4293 .LVL264: + 4294 .LFB145: +2256:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef dmaxferstatus; + 4295 .loc 1 2256 1 is_stmt 1 view -0 + 4296 .cfi_startproc + 4297 @ args = 0, pretend = 0, frame = 0 + 4298 @ frame_needed = 0, uses_anonymous_args = 0 +2256:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef dmaxferstatus; + 4299 .loc 1 2256 1 is_stmt 0 view .LVU1483 + 4300 0000 38B5 push {r3, r4, r5, lr} + 4301 .cfi_def_cfa_offset 16 + 4302 .cfi_offset 3, -16 + 4303 .cfi_offset 4, -12 + ARM GAS /tmp/ccE2rRGE.s page 219 + + + 4304 .cfi_offset 5, -8 + 4305 .cfi_offset 14, -4 +2257:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4306 .loc 1 2257 3 is_stmt 1 view .LVU1484 +2259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4307 .loc 1 2259 3 view .LVU1485 +2259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4308 .loc 1 2259 11 is_stmt 0 view .LVU1486 + 4309 0002 90F84130 ldrb r3, [r0, #65] @ zero_extendqisi2 + 4310 0006 DBB2 uxtb r3, r3 +2259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4311 .loc 1 2259 6 view .LVU1487 + 4312 0008 202B cmp r3, #32 + 4313 000a 65D1 bne .L295 + 4314 000c 0446 mov r4, r0 +2261:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4315 .loc 1 2261 5 is_stmt 1 view .LVU1488 +2261:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4316 .loc 1 2261 8 is_stmt 0 view .LVU1489 + 4317 000e 0029 cmp r1, #0 + 4318 0010 3CD0 beq .L290 +2261:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4319 .loc 1 2261 25 discriminator 1 view .LVU1490 + 4320 0012 002A cmp r2, #0 + 4321 0014 3AD0 beq .L290 +2267:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4322 .loc 1 2267 5 is_stmt 1 view .LVU1491 +2267:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4323 .loc 1 2267 5 view .LVU1492 + 4324 0016 90F84030 ldrb r3, [r0, #64] @ zero_extendqisi2 + 4325 001a 012B cmp r3, #1 + 4326 001c 5FD0 beq .L296 +2267:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4327 .loc 1 2267 5 discriminator 2 view .LVU1493 + 4328 001e 0123 movs r3, #1 + 4329 0020 80F84030 strb r3, [r0, #64] +2267:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4330 .loc 1 2267 5 discriminator 2 view .LVU1494 +2269:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_SLAVE; + 4331 .loc 1 2269 5 discriminator 2 view .LVU1495 +2269:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_SLAVE; + 4332 .loc 1 2269 23 is_stmt 0 discriminator 2 view .LVU1496 + 4333 0024 2223 movs r3, #34 + 4334 0026 80F84130 strb r3, [r0, #65] +2270:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 4335 .loc 1 2270 5 is_stmt 1 discriminator 2 view .LVU1497 +2270:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 4336 .loc 1 2270 23 is_stmt 0 discriminator 2 view .LVU1498 + 4337 002a 2023 movs r3, #32 + 4338 002c 80F84230 strb r3, [r0, #66] +2271:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4339 .loc 1 2271 5 is_stmt 1 discriminator 2 view .LVU1499 +2271:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4340 .loc 1 2271 23 is_stmt 0 discriminator 2 view .LVU1500 + 4341 0030 0023 movs r3, #0 + 4342 0032 4364 str r3, [r0, #68] +2274:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + ARM GAS /tmp/ccE2rRGE.s page 220 + + + 4343 .loc 1 2274 5 is_stmt 1 discriminator 2 view .LVU1501 +2274:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 4344 .loc 1 2274 23 is_stmt 0 discriminator 2 view .LVU1502 + 4345 0034 4162 str r1, [r0, #36] +2275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; + 4346 .loc 1 2275 5 is_stmt 1 discriminator 2 view .LVU1503 +2275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; + 4347 .loc 1 2275 23 is_stmt 0 discriminator 2 view .LVU1504 + 4348 0036 4285 strh r2, [r0, #42] @ movhi +2276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; + 4349 .loc 1 2276 5 is_stmt 1 discriminator 2 view .LVU1505 +2276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; + 4350 .loc 1 2276 29 is_stmt 0 discriminator 2 view .LVU1506 + 4351 0038 438D ldrh r3, [r0, #42] +2276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; + 4352 .loc 1 2276 23 discriminator 2 view .LVU1507 + 4353 003a 0385 strh r3, [r0, #40] @ movhi +2277:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Slave_ISR_DMA; + 4354 .loc 1 2277 5 is_stmt 1 discriminator 2 view .LVU1508 +2277:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Slave_ISR_DMA; + 4355 .loc 1 2277 23 is_stmt 0 discriminator 2 view .LVU1509 + 4356 003c 294B ldr r3, .L300 + 4357 003e C362 str r3, [r0, #44] +2278:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4358 .loc 1 2278 5 is_stmt 1 discriminator 2 view .LVU1510 +2278:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4359 .loc 1 2278 23 is_stmt 0 discriminator 2 view .LVU1511 + 4360 0040 294B ldr r3, .L300+4 + 4361 0042 4363 str r3, [r0, #52] +2280:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4362 .loc 1 2280 5 is_stmt 1 discriminator 2 view .LVU1512 +2280:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4363 .loc 1 2280 13 is_stmt 0 discriminator 2 view .LVU1513 + 4364 0044 C36B ldr r3, [r0, #60] +2280:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4365 .loc 1 2280 8 discriminator 2 view .LVU1514 + 4366 0046 33B3 cbz r3, .L292 +2283:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4367 .loc 1 2283 7 is_stmt 1 view .LVU1515 +2283:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4368 .loc 1 2283 38 is_stmt 0 view .LVU1516 + 4369 0048 284A ldr r2, .L300+8 + 4370 .LVL265: +2283:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4371 .loc 1 2283 38 view .LVU1517 + 4372 004a 9A62 str r2, [r3, #40] +2286:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4373 .loc 1 2286 7 is_stmt 1 view .LVU1518 +2286:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4374 .loc 1 2286 11 is_stmt 0 view .LVU1519 + 4375 004c C36B ldr r3, [r0, #60] +2286:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4376 .loc 1 2286 39 view .LVU1520 + 4377 004e 284A ldr r2, .L300+12 + 4378 0050 1A63 str r2, [r3, #48] +2289:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmarx->XferAbortCallback = NULL; + 4379 .loc 1 2289 7 is_stmt 1 view .LVU1521 + ARM GAS /tmp/ccE2rRGE.s page 221 + + +2289:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmarx->XferAbortCallback = NULL; + 4380 .loc 1 2289 11 is_stmt 0 view .LVU1522 + 4381 0052 C26B ldr r2, [r0, #60] +2289:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmarx->XferAbortCallback = NULL; + 4382 .loc 1 2289 42 view .LVU1523 + 4383 0054 0023 movs r3, #0 + 4384 0056 D362 str r3, [r2, #44] +2290:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4385 .loc 1 2290 7 is_stmt 1 view .LVU1524 +2290:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4386 .loc 1 2290 11 is_stmt 0 view .LVU1525 + 4387 0058 C26B ldr r2, [r0, #60] +2290:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4388 .loc 1 2290 39 view .LVU1526 + 4389 005a 5363 str r3, [r2, #52] +2293:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize); + 4390 .loc 1 2293 7 is_stmt 1 view .LVU1527 +2293:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize); + 4391 .loc 1 2293 69 is_stmt 0 view .LVU1528 + 4392 005c 0068 ldr r0, [r0] + 4393 .LVL266: +2293:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize); + 4394 .loc 1 2293 23 view .LVU1529 + 4395 005e 238D ldrh r3, [r4, #40] + 4396 0060 0A46 mov r2, r1 + 4397 0062 00F12401 add r1, r0, #36 + 4398 .LVL267: +2293:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize); + 4399 .loc 1 2293 23 view .LVU1530 + 4400 0066 E06B ldr r0, [r4, #60] + 4401 0068 FFF7FEFF bl HAL_DMA_Start_IT + 4402 .LVL268: +2311:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4403 .loc 1 2311 5 is_stmt 1 view .LVU1531 +2311:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4404 .loc 1 2311 8 is_stmt 0 view .LVU1532 + 4405 006c 0546 mov r5, r0 + 4406 006e 00B3 cbz r0, .L299 +2331:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 4407 .loc 1 2331 7 is_stmt 1 view .LVU1533 +2331:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 4408 .loc 1 2331 23 is_stmt 0 view .LVU1534 + 4409 0070 2823 movs r3, #40 + 4410 0072 84F84130 strb r3, [r4, #65] +2332:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4411 .loc 1 2332 7 is_stmt 1 view .LVU1535 +2332:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4412 .loc 1 2332 23 is_stmt 0 view .LVU1536 + 4413 0076 0022 movs r2, #0 + 4414 0078 84F84220 strb r2, [r4, #66] +2335:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4415 .loc 1 2335 7 is_stmt 1 view .LVU1537 +2335:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4416 .loc 1 2335 11 is_stmt 0 view .LVU1538 + 4417 007c 636C ldr r3, [r4, #68] +2335:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4418 .loc 1 2335 23 view .LVU1539 + ARM GAS /tmp/ccE2rRGE.s page 222 + + + 4419 007e 43F01003 orr r3, r3, #16 + 4420 0082 6364 str r3, [r4, #68] +2338:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4421 .loc 1 2338 7 is_stmt 1 view .LVU1540 +2338:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4422 .loc 1 2338 7 view .LVU1541 + 4423 0084 84F84020 strb r2, [r4, #64] +2338:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4424 .loc 1 2338 7 view .LVU1542 +2340:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4425 .loc 1 2340 7 view .LVU1543 +2340:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4426 .loc 1 2340 14 is_stmt 0 view .LVU1544 + 4427 0088 0125 movs r5, #1 + 4428 008a 26E0 b .L289 + 4429 .LVL269: + 4430 .L290: +2263:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 4431 .loc 1 2263 7 is_stmt 1 view .LVU1545 +2263:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 4432 .loc 1 2263 23 is_stmt 0 view .LVU1546 + 4433 008c 4FF40073 mov r3, #512 + 4434 0090 6364 str r3, [r4, #68] +2264:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4435 .loc 1 2264 7 is_stmt 1 view .LVU1547 +2264:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4436 .loc 1 2264 15 is_stmt 0 view .LVU1548 + 4437 0092 0125 movs r5, #1 + 4438 0094 21E0 b .L289 + 4439 .L292: +2299:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 4440 .loc 1 2299 7 is_stmt 1 view .LVU1549 +2299:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 4441 .loc 1 2299 23 is_stmt 0 view .LVU1550 + 4442 0096 2823 movs r3, #40 + 4443 0098 80F84130 strb r3, [r0, #65] +2300:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4444 .loc 1 2300 7 is_stmt 1 view .LVU1551 +2300:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4445 .loc 1 2300 23 is_stmt 0 view .LVU1552 + 4446 009c 0022 movs r2, #0 + 4447 .LVL270: +2300:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4448 .loc 1 2300 23 view .LVU1553 + 4449 009e 80F84220 strb r2, [r0, #66] +2303:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4450 .loc 1 2303 7 is_stmt 1 view .LVU1554 +2303:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4451 .loc 1 2303 11 is_stmt 0 view .LVU1555 + 4452 00a2 436C ldr r3, [r0, #68] +2303:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4453 .loc 1 2303 23 view .LVU1556 + 4454 00a4 43F08003 orr r3, r3, #128 + 4455 00a8 4364 str r3, [r0, #68] +2306:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4456 .loc 1 2306 7 is_stmt 1 view .LVU1557 +2306:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + ARM GAS /tmp/ccE2rRGE.s page 223 + + + 4457 .loc 1 2306 7 view .LVU1558 + 4458 00aa 80F84020 strb r2, [r0, #64] +2306:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4459 .loc 1 2306 7 view .LVU1559 +2308:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4460 .loc 1 2308 7 view .LVU1560 +2308:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4461 .loc 1 2308 14 is_stmt 0 view .LVU1561 + 4462 00ae 0125 movs r5, #1 + 4463 00b0 13E0 b .L289 + 4464 .LVL271: + 4465 .L299: +2314:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4466 .loc 1 2314 7 is_stmt 1 view .LVU1562 +2314:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4467 .loc 1 2314 11 is_stmt 0 view .LVU1563 + 4468 00b2 2268 ldr r2, [r4] +2314:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4469 .loc 1 2314 21 view .LVU1564 + 4470 00b4 5368 ldr r3, [r2, #4] +2314:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4471 .loc 1 2314 27 view .LVU1565 + 4472 00b6 23F40043 bic r3, r3, #32768 + 4473 00ba 5360 str r3, [r2, #4] +2317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4474 .loc 1 2317 7 is_stmt 1 view .LVU1566 +2317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4475 .loc 1 2317 7 view .LVU1567 + 4476 00bc 0023 movs r3, #0 + 4477 00be 84F84030 strb r3, [r4, #64] +2317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4478 .loc 1 2317 7 view .LVU1568 +2323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4479 .loc 1 2323 7 view .LVU1569 + 4480 00c2 4FF40041 mov r1, #32768 + 4481 00c6 2046 mov r0, r4 + 4482 .LVL272: +2323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4483 .loc 1 2323 7 is_stmt 0 view .LVU1570 + 4484 00c8 FFF7FEFF bl I2C_Enable_IRQ + 4485 .LVL273: +2326:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4486 .loc 1 2326 7 is_stmt 1 view .LVU1571 +2326:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4487 .loc 1 2326 11 is_stmt 0 view .LVU1572 + 4488 00cc 2268 ldr r2, [r4] +2326:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4489 .loc 1 2326 21 view .LVU1573 + 4490 00ce 1368 ldr r3, [r2] +2326:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4491 .loc 1 2326 27 view .LVU1574 + 4492 00d0 43F40043 orr r3, r3, #32768 + 4493 00d4 1360 str r3, [r2] +2343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4494 .loc 1 2343 5 is_stmt 1 view .LVU1575 +2343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4495 .loc 1 2343 12 is_stmt 0 view .LVU1576 + ARM GAS /tmp/ccE2rRGE.s page 224 + + + 4496 00d6 00E0 b .L289 + 4497 .LVL274: + 4498 .L295: +2347:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4499 .loc 1 2347 12 view .LVU1577 + 4500 00d8 0225 movs r5, #2 + 4501 .LVL275: + 4502 .L289: +2349:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** + 4503 .loc 1 2349 1 view .LVU1578 + 4504 00da 2846 mov r0, r5 + 4505 00dc 38BD pop {r3, r4, r5, pc} + 4506 .LVL276: + 4507 .L296: +2267:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4508 .loc 1 2267 5 view .LVU1579 + 4509 00de 0225 movs r5, #2 + 4510 00e0 FBE7 b .L289 + 4511 .L301: + 4512 00e2 00BF .align 2 + 4513 .L300: + 4514 00e4 0000FFFF .word -65536 + 4515 00e8 00000000 .word I2C_Slave_ISR_DMA + 4516 00ec 00000000 .word I2C_DMASlaveReceiveCplt + 4517 00f0 00000000 .word I2C_DMAError + 4518 .cfi_endproc + 4519 .LFE145: + 4521 .section .text.HAL_I2C_Mem_Write,"ax",%progbits + 4522 .align 1 + 4523 .global HAL_I2C_Mem_Write + 4524 .syntax unified + 4525 .thumb + 4526 .thumb_func + 4528 HAL_I2C_Mem_Write: + 4529 .LVL277: + 4530 .LFB146: +2365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tickstart; + 4531 .loc 1 2365 1 is_stmt 1 view -0 + 4532 .cfi_startproc + 4533 @ args = 12, pretend = 0, frame = 0 + 4534 @ frame_needed = 0, uses_anonymous_args = 0 +2365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tickstart; + 4535 .loc 1 2365 1 is_stmt 0 view .LVU1581 + 4536 0000 2DE9F04F push {r4, r5, r6, r7, r8, r9, r10, fp, lr} + 4537 .cfi_def_cfa_offset 36 + 4538 .cfi_offset 4, -36 + 4539 .cfi_offset 5, -32 + 4540 .cfi_offset 6, -28 + 4541 .cfi_offset 7, -24 + 4542 .cfi_offset 8, -20 + 4543 .cfi_offset 9, -16 + 4544 .cfi_offset 10, -12 + 4545 .cfi_offset 11, -8 + 4546 .cfi_offset 14, -4 + 4547 0004 83B0 sub sp, sp, #12 + 4548 .cfi_def_cfa_offset 48 + 4549 0006 0E46 mov r6, r1 + ARM GAS /tmp/ccE2rRGE.s page 225 + + + 4550 0008 BDF834A0 ldrh r10, [sp, #52] + 4551 000c 0E9D ldr r5, [sp, #56] +2366:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4552 .loc 1 2366 3 is_stmt 1 view .LVU1582 +2369:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4553 .loc 1 2369 3 view .LVU1583 +2371:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4554 .loc 1 2371 3 view .LVU1584 +2371:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4555 .loc 1 2371 11 is_stmt 0 view .LVU1585 + 4556 000e 90F84110 ldrb r1, [r0, #65] @ zero_extendqisi2 + 4557 .LVL278: +2371:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4558 .loc 1 2371 11 view .LVU1586 + 4559 0012 C9B2 uxtb r1, r1 +2371:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4560 .loc 1 2371 6 view .LVU1587 + 4561 0014 2029 cmp r1, #32 + 4562 0016 40F0BB80 bne .L312 + 4563 001a 0446 mov r4, r0 + 4564 001c 9046 mov r8, r2 + 4565 001e 9946 mov r9, r3 +2373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4566 .loc 1 2373 5 is_stmt 1 view .LVU1588 +2373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4567 .loc 1 2373 8 is_stmt 0 view .LVU1589 + 4568 0020 0C9B ldr r3, [sp, #48] + 4569 .LVL279: +2373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4570 .loc 1 2373 8 view .LVU1590 + 4571 0022 CBB1 cbz r3, .L304 +2373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4572 .loc 1 2373 25 discriminator 1 view .LVU1591 + 4573 0024 BAF1000F cmp r10, #0 + 4574 0028 16D0 beq .L304 +2380:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4575 .loc 1 2380 5 is_stmt 1 view .LVU1592 +2380:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4576 .loc 1 2380 5 view .LVU1593 + 4577 002a 90F84030 ldrb r3, [r0, #64] @ zero_extendqisi2 + 4578 002e 012B cmp r3, #1 + 4579 0030 00F0B280 beq .L313 +2380:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4580 .loc 1 2380 5 discriminator 2 view .LVU1594 + 4581 0034 4FF0010B mov fp, #1 + 4582 0038 80F840B0 strb fp, [r0, #64] +2380:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4583 .loc 1 2380 5 discriminator 2 view .LVU1595 +2383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4584 .loc 1 2383 5 discriminator 2 view .LVU1596 +2383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4585 .loc 1 2383 17 is_stmt 0 discriminator 2 view .LVU1597 + 4586 003c FFF7FEFF bl HAL_GetTick + 4587 .LVL280: +2383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4588 .loc 1 2383 17 discriminator 2 view .LVU1598 + 4589 0040 0746 mov r7, r0 + ARM GAS /tmp/ccE2rRGE.s page 226 + + + 4590 .LVL281: +2385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4591 .loc 1 2385 5 is_stmt 1 discriminator 2 view .LVU1599 +2385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4592 .loc 1 2385 9 is_stmt 0 discriminator 2 view .LVU1600 + 4593 0042 0090 str r0, [sp] + 4594 0044 1923 movs r3, #25 + 4595 0046 5A46 mov r2, fp + 4596 0048 4FF40041 mov r1, #32768 + 4597 004c 2046 mov r0, r4 + 4598 .LVL282: +2385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4599 .loc 1 2385 9 discriminator 2 view .LVU1601 + 4600 004e FFF7FEFF bl I2C_WaitOnFlagUntilTimeout + 4601 .LVL283: +2385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4602 .loc 1 2385 8 discriminator 2 view .LVU1602 + 4603 0052 30B1 cbz r0, .L319 +2387:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4604 .loc 1 2387 14 view .LVU1603 + 4605 0054 0120 movs r0, #1 + 4606 0056 9CE0 b .L303 + 4607 .LVL284: + 4608 .L304: +2375:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 4609 .loc 1 2375 7 is_stmt 1 view .LVU1604 +2375:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 4610 .loc 1 2375 23 is_stmt 0 view .LVU1605 + 4611 0058 4FF40073 mov r3, #512 + 4612 005c 6364 str r3, [r4, #68] +2376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4613 .loc 1 2376 7 is_stmt 1 view .LVU1606 +2376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4614 .loc 1 2376 15 is_stmt 0 view .LVU1607 + 4615 005e 0120 movs r0, #1 + 4616 .LVL285: +2376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4617 .loc 1 2376 15 view .LVU1608 + 4618 0060 97E0 b .L303 + 4619 .LVL286: + 4620 .L319: +2390:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MEM; + 4621 .loc 1 2390 5 is_stmt 1 view .LVU1609 +2390:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MEM; + 4622 .loc 1 2390 21 is_stmt 0 view .LVU1610 + 4623 0062 2123 movs r3, #33 + 4624 0064 84F84130 strb r3, [r4, #65] +2391:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 4625 .loc 1 2391 5 is_stmt 1 view .LVU1611 +2391:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 4626 .loc 1 2391 21 is_stmt 0 view .LVU1612 + 4627 0068 4023 movs r3, #64 + 4628 006a 84F84230 strb r3, [r4, #66] +2392:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4629 .loc 1 2392 5 is_stmt 1 view .LVU1613 +2392:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4630 .loc 1 2392 21 is_stmt 0 view .LVU1614 + ARM GAS /tmp/ccE2rRGE.s page 227 + + + 4631 006e 0023 movs r3, #0 + 4632 0070 6364 str r3, [r4, #68] +2395:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 4633 .loc 1 2395 5 is_stmt 1 view .LVU1615 +2395:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 4634 .loc 1 2395 21 is_stmt 0 view .LVU1616 + 4635 0072 0C9A ldr r2, [sp, #48] + 4636 0074 6262 str r2, [r4, #36] +2396:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = NULL; + 4637 .loc 1 2396 5 is_stmt 1 view .LVU1617 +2396:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = NULL; + 4638 .loc 1 2396 21 is_stmt 0 view .LVU1618 + 4639 0076 A4F82AA0 strh r10, [r4, #42] @ movhi +2397:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4640 .loc 1 2397 5 is_stmt 1 view .LVU1619 +2397:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4641 .loc 1 2397 21 is_stmt 0 view .LVU1620 + 4642 007a 6363 str r3, [r4, #52] +2400:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4643 .loc 1 2400 5 is_stmt 1 view .LVU1621 +2400:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4644 .loc 1 2400 9 is_stmt 0 view .LVU1622 + 4645 007c 0197 str r7, [sp, #4] + 4646 007e 0095 str r5, [sp] + 4647 0080 4B46 mov r3, r9 + 4648 0082 4246 mov r2, r8 + 4649 0084 3146 mov r1, r6 + 4650 0086 2046 mov r0, r4 + 4651 0088 FFF7FEFF bl I2C_RequestMemoryWrite + 4652 .LVL287: +2400:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4653 .loc 1 2400 8 view .LVU1623 + 4654 008c 70B9 cbnz r0, .L320 +2408:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4655 .loc 1 2408 5 is_stmt 1 view .LVU1624 +2408:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4656 .loc 1 2408 13 is_stmt 0 view .LVU1625 + 4657 008e 638D ldrh r3, [r4, #42] + 4658 0090 9BB2 uxth r3, r3 +2408:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4659 .loc 1 2408 8 view .LVU1626 + 4660 0092 FF2B cmp r3, #255 + 4661 0094 0FD9 bls .L307 +2410:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, I2C_NO_STARTST + 4662 .loc 1 2410 7 is_stmt 1 view .LVU1627 +2410:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, I2C_NO_STARTST + 4663 .loc 1 2410 22 is_stmt 0 view .LVU1628 + 4664 0096 FF22 movs r2, #255 + 4665 0098 2285 strh r2, [r4, #40] @ movhi +2411:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4666 .loc 1 2411 7 is_stmt 1 view .LVU1629 + 4667 009a 0023 movs r3, #0 + 4668 009c 0093 str r3, [sp] + 4669 009e 4FF08073 mov r3, #16777216 + 4670 00a2 3146 mov r1, r6 + 4671 00a4 2046 mov r0, r4 + 4672 00a6 FFF7FEFF bl I2C_TransferConfig + ARM GAS /tmp/ccE2rRGE.s page 228 + + + 4673 .LVL288: + 4674 00aa 21E0 b .L311 + 4675 .L320: +2403:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 4676 .loc 1 2403 7 view .LVU1630 +2403:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 4677 .loc 1 2403 7 view .LVU1631 + 4678 00ac 0023 movs r3, #0 + 4679 00ae 84F84030 strb r3, [r4, #64] +2403:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 4680 .loc 1 2403 7 view .LVU1632 +2404:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4681 .loc 1 2404 7 view .LVU1633 +2404:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4682 .loc 1 2404 14 is_stmt 0 view .LVU1634 + 4683 00b2 5846 mov r0, fp + 4684 00b4 6DE0 b .L303 + 4685 .L307: +2415:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, I2C_NO_STARTS + 4686 .loc 1 2415 7 is_stmt 1 view .LVU1635 +2415:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, I2C_NO_STARTS + 4687 .loc 1 2415 28 is_stmt 0 view .LVU1636 + 4688 00b6 628D ldrh r2, [r4, #42] + 4689 00b8 92B2 uxth r2, r2 +2415:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, I2C_NO_STARTS + 4690 .loc 1 2415 22 view .LVU1637 + 4691 00ba 2285 strh r2, [r4, #40] @ movhi +2416:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4692 .loc 1 2416 7 is_stmt 1 view .LVU1638 + 4693 00bc 0023 movs r3, #0 + 4694 00be 0093 str r3, [sp] + 4695 00c0 4FF00073 mov r3, #33554432 + 4696 00c4 D2B2 uxtb r2, r2 + 4697 00c6 3146 mov r1, r6 + 4698 00c8 2046 mov r0, r4 + 4699 00ca FFF7FEFF bl I2C_TransferConfig + 4700 .LVL289: + 4701 00ce 0FE0 b .L311 + 4702 .L310: +2452:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, + 4703 .loc 1 2452 11 view .LVU1639 +2452:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, + 4704 .loc 1 2452 32 is_stmt 0 view .LVU1640 + 4705 00d0 628D ldrh r2, [r4, #42] + 4706 00d2 92B2 uxth r2, r2 +2452:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, + 4707 .loc 1 2452 26 view .LVU1641 + 4708 00d4 2285 strh r2, [r4, #40] @ movhi +2453:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_NO_STARTSTOP); + 4709 .loc 1 2453 11 is_stmt 1 view .LVU1642 + 4710 00d6 0023 movs r3, #0 + 4711 00d8 0093 str r3, [sp] + 4712 00da 4FF00073 mov r3, #33554432 + 4713 00de D2B2 uxtb r2, r2 + 4714 00e0 3146 mov r1, r6 + 4715 00e2 2046 mov r0, r4 + 4716 00e4 FFF7FEFF bl I2C_TransferConfig + ARM GAS /tmp/ccE2rRGE.s page 229 + + + 4717 .LVL290: + 4718 .L309: +2458:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4719 .loc 1 2458 30 view .LVU1643 +2458:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4720 .loc 1 2458 18 is_stmt 0 view .LVU1644 + 4721 00e8 638D ldrh r3, [r4, #42] + 4722 00ea 9BB2 uxth r3, r3 +2458:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4723 .loc 1 2458 30 view .LVU1645 + 4724 00ec 002B cmp r3, #0 + 4725 00ee 33D0 beq .L321 + 4726 .L311: +2419:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4727 .loc 1 2419 5 is_stmt 1 view .LVU1646 +2422:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4728 .loc 1 2422 7 view .LVU1647 +2422:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4729 .loc 1 2422 11 is_stmt 0 view .LVU1648 + 4730 00f0 3A46 mov r2, r7 + 4731 00f2 2946 mov r1, r5 + 4732 00f4 2046 mov r0, r4 + 4733 00f6 FFF7FEFF bl I2C_WaitOnTXISFlagUntilTimeout + 4734 .LVL291: +2422:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4735 .loc 1 2422 10 view .LVU1649 + 4736 00fa 0028 cmp r0, #0 + 4737 00fc 4ED1 bne .L315 +2428:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4738 .loc 1 2428 7 is_stmt 1 view .LVU1650 +2428:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4739 .loc 1 2428 35 is_stmt 0 view .LVU1651 + 4740 00fe 626A ldr r2, [r4, #36] +2428:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4741 .loc 1 2428 11 view .LVU1652 + 4742 0100 2368 ldr r3, [r4] +2428:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4743 .loc 1 2428 30 view .LVU1653 + 4744 0102 1278 ldrb r2, [r2] @ zero_extendqisi2 +2428:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4745 .loc 1 2428 28 view .LVU1654 + 4746 0104 9A62 str r2, [r3, #40] +2431:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4747 .loc 1 2431 7 is_stmt 1 view .LVU1655 +2431:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4748 .loc 1 2431 11 is_stmt 0 view .LVU1656 + 4749 0106 636A ldr r3, [r4, #36] +2431:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4750 .loc 1 2431 21 view .LVU1657 + 4751 0108 0133 adds r3, r3, #1 + 4752 010a 6362 str r3, [r4, #36] +2433:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize--; + 4753 .loc 1 2433 7 is_stmt 1 view .LVU1658 +2433:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize--; + 4754 .loc 1 2433 11 is_stmt 0 view .LVU1659 + 4755 010c 638D ldrh r3, [r4, #42] + 4756 010e 9BB2 uxth r3, r3 + ARM GAS /tmp/ccE2rRGE.s page 230 + + +2433:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize--; + 4757 .loc 1 2433 22 view .LVU1660 + 4758 0110 013B subs r3, r3, #1 + 4759 0112 9BB2 uxth r3, r3 + 4760 0114 6385 strh r3, [r4, #42] @ movhi +2434:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4761 .loc 1 2434 7 is_stmt 1 view .LVU1661 +2434:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4762 .loc 1 2434 11 is_stmt 0 view .LVU1662 + 4763 0116 238D ldrh r3, [r4, #40] +2434:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4764 .loc 1 2434 21 view .LVU1663 + 4765 0118 013B subs r3, r3, #1 + 4766 011a 9BB2 uxth r3, r3 + 4767 011c 2385 strh r3, [r4, #40] @ movhi +2436:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4768 .loc 1 2436 7 is_stmt 1 view .LVU1664 +2436:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4769 .loc 1 2436 16 is_stmt 0 view .LVU1665 + 4770 011e 628D ldrh r2, [r4, #42] + 4771 0120 92B2 uxth r2, r2 +2436:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4772 .loc 1 2436 10 view .LVU1666 + 4773 0122 002A cmp r2, #0 + 4774 0124 E0D0 beq .L309 +2436:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4775 .loc 1 2436 35 discriminator 1 view .LVU1667 + 4776 0126 002B cmp r3, #0 + 4777 0128 DED1 bne .L309 +2439:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4778 .loc 1 2439 9 is_stmt 1 view .LVU1668 +2439:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4779 .loc 1 2439 13 is_stmt 0 view .LVU1669 + 4780 012a 0097 str r7, [sp] + 4781 012c 2B46 mov r3, r5 + 4782 012e 0022 movs r2, #0 + 4783 0130 8021 movs r1, #128 + 4784 0132 2046 mov r0, r4 + 4785 0134 FFF7FEFF bl I2C_WaitOnFlagUntilTimeout + 4786 .LVL292: +2439:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4787 .loc 1 2439 12 view .LVU1670 + 4788 0138 90BB cbnz r0, .L316 +2444:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4789 .loc 1 2444 9 is_stmt 1 view .LVU1671 +2444:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4790 .loc 1 2444 17 is_stmt 0 view .LVU1672 + 4791 013a 638D ldrh r3, [r4, #42] + 4792 013c 9BB2 uxth r3, r3 +2444:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4793 .loc 1 2444 12 view .LVU1673 + 4794 013e FF2B cmp r3, #255 + 4795 0140 C6D9 bls .L310 +2446:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, + 4796 .loc 1 2446 11 is_stmt 1 view .LVU1674 +2446:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, + 4797 .loc 1 2446 26 is_stmt 0 view .LVU1675 + ARM GAS /tmp/ccE2rRGE.s page 231 + + + 4798 0142 FF22 movs r2, #255 + 4799 0144 2285 strh r2, [r4, #40] @ movhi +2447:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_NO_STARTSTOP); + 4800 .loc 1 2447 11 is_stmt 1 view .LVU1676 + 4801 0146 0023 movs r3, #0 + 4802 0148 0093 str r3, [sp] + 4803 014a 4FF08073 mov r3, #16777216 + 4804 014e 3146 mov r1, r6 + 4805 0150 2046 mov r0, r4 + 4806 0152 FFF7FEFF bl I2C_TransferConfig + 4807 .LVL293: + 4808 0156 C7E7 b .L309 + 4809 .L321: +2462:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4810 .loc 1 2462 5 view .LVU1677 +2462:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4811 .loc 1 2462 9 is_stmt 0 view .LVU1678 + 4812 0158 3A46 mov r2, r7 + 4813 015a 2946 mov r1, r5 + 4814 015c 2046 mov r0, r4 + 4815 015e FFF7FEFF bl I2C_WaitOnSTOPFlagUntilTimeout + 4816 .LVL294: +2462:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4817 .loc 1 2462 8 view .LVU1679 + 4818 0162 F8B9 cbnz r0, .L317 +2468:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4819 .loc 1 2468 5 is_stmt 1 view .LVU1680 + 4820 0164 2368 ldr r3, [r4] + 4821 0166 2022 movs r2, #32 + 4822 0168 DA61 str r2, [r3, #28] +2471:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4823 .loc 1 2471 5 view .LVU1681 + 4824 016a 2168 ldr r1, [r4] + 4825 016c 4B68 ldr r3, [r1, #4] + 4826 016e 23F0FF73 bic r3, r3, #33423360 + 4827 0172 23F48B33 bic r3, r3, #71168 + 4828 0176 23F4FF73 bic r3, r3, #510 + 4829 017a 23F00103 bic r3, r3, #1 + 4830 017e 4B60 str r3, [r1, #4] +2473:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 4831 .loc 1 2473 5 view .LVU1682 +2473:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 4832 .loc 1 2473 17 is_stmt 0 view .LVU1683 + 4833 0180 84F84120 strb r2, [r4, #65] +2474:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4834 .loc 1 2474 5 is_stmt 1 view .LVU1684 +2474:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4835 .loc 1 2474 17 is_stmt 0 view .LVU1685 + 4836 0184 0023 movs r3, #0 + 4837 0186 84F84230 strb r3, [r4, #66] +2477:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4838 .loc 1 2477 5 is_stmt 1 view .LVU1686 +2477:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4839 .loc 1 2477 5 view .LVU1687 + 4840 018a 84F84030 strb r3, [r4, #64] +2477:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4841 .loc 1 2477 5 view .LVU1688 + ARM GAS /tmp/ccE2rRGE.s page 232 + + +2479:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4842 .loc 1 2479 5 view .LVU1689 +2479:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4843 .loc 1 2479 12 is_stmt 0 view .LVU1690 + 4844 018e 00E0 b .L303 + 4845 .LVL295: + 4846 .L312: +2483:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4847 .loc 1 2483 12 view .LVU1691 + 4848 0190 0220 movs r0, #2 + 4849 .LVL296: + 4850 .L303: +2485:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4851 .loc 1 2485 1 view .LVU1692 + 4852 0192 03B0 add sp, sp, #12 + 4853 .cfi_remember_state + 4854 .cfi_def_cfa_offset 36 + 4855 @ sp needed + 4856 0194 BDE8F08F pop {r4, r5, r6, r7, r8, r9, r10, fp, pc} + 4857 .LVL297: + 4858 .L313: + 4859 .cfi_restore_state +2380:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4860 .loc 1 2380 5 view .LVU1693 + 4861 0198 0220 movs r0, #2 + 4862 .LVL298: +2380:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4863 .loc 1 2380 5 view .LVU1694 + 4864 019a FAE7 b .L303 + 4865 .LVL299: + 4866 .L315: +2424:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4867 .loc 1 2424 16 view .LVU1695 + 4868 019c 0120 movs r0, #1 + 4869 019e F8E7 b .L303 + 4870 .L316: +2441:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4871 .loc 1 2441 18 view .LVU1696 + 4872 01a0 0120 movs r0, #1 + 4873 01a2 F6E7 b .L303 + 4874 .L317: +2464:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4875 .loc 1 2464 14 view .LVU1697 + 4876 01a4 0120 movs r0, #1 + 4877 01a6 F4E7 b .L303 + 4878 .cfi_endproc + 4879 .LFE146: + 4881 .section .text.HAL_I2C_Mem_Read,"ax",%progbits + 4882 .align 1 + 4883 .global HAL_I2C_Mem_Read + 4884 .syntax unified + 4885 .thumb + 4886 .thumb_func + 4888 HAL_I2C_Mem_Read: + 4889 .LVL300: + 4890 .LFB147: +2502:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tickstart; + ARM GAS /tmp/ccE2rRGE.s page 233 + + + 4891 .loc 1 2502 1 is_stmt 1 view -0 + 4892 .cfi_startproc + 4893 @ args = 12, pretend = 0, frame = 0 + 4894 @ frame_needed = 0, uses_anonymous_args = 0 +2502:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tickstart; + 4895 .loc 1 2502 1 is_stmt 0 view .LVU1699 + 4896 0000 2DE9F04F push {r4, r5, r6, r7, r8, r9, r10, fp, lr} + 4897 .cfi_def_cfa_offset 36 + 4898 .cfi_offset 4, -36 + 4899 .cfi_offset 5, -32 + 4900 .cfi_offset 6, -28 + 4901 .cfi_offset 7, -24 + 4902 .cfi_offset 8, -20 + 4903 .cfi_offset 9, -16 + 4904 .cfi_offset 10, -12 + 4905 .cfi_offset 11, -8 + 4906 .cfi_offset 14, -4 + 4907 0004 83B0 sub sp, sp, #12 + 4908 .cfi_def_cfa_offset 48 + 4909 0006 0E46 mov r6, r1 + 4910 0008 BDF834A0 ldrh r10, [sp, #52] + 4911 000c 0E9D ldr r5, [sp, #56] +2503:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4912 .loc 1 2503 3 is_stmt 1 view .LVU1700 +2506:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4913 .loc 1 2506 3 view .LVU1701 +2508:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4914 .loc 1 2508 3 view .LVU1702 +2508:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4915 .loc 1 2508 11 is_stmt 0 view .LVU1703 + 4916 000e 90F84110 ldrb r1, [r0, #65] @ zero_extendqisi2 + 4917 .LVL301: +2508:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4918 .loc 1 2508 11 view .LVU1704 + 4919 0012 C9B2 uxtb r1, r1 +2508:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4920 .loc 1 2508 6 view .LVU1705 + 4921 0014 2029 cmp r1, #32 + 4922 0016 40F0BC80 bne .L332 + 4923 001a 0446 mov r4, r0 + 4924 001c 9046 mov r8, r2 + 4925 001e 9946 mov r9, r3 +2510:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4926 .loc 1 2510 5 is_stmt 1 view .LVU1706 +2510:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4927 .loc 1 2510 8 is_stmt 0 view .LVU1707 + 4928 0020 0C9B ldr r3, [sp, #48] + 4929 .LVL302: +2510:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4930 .loc 1 2510 8 view .LVU1708 + 4931 0022 CBB1 cbz r3, .L324 +2510:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4932 .loc 1 2510 25 discriminator 1 view .LVU1709 + 4933 0024 BAF1000F cmp r10, #0 + 4934 0028 16D0 beq .L324 +2517:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4935 .loc 1 2517 5 is_stmt 1 view .LVU1710 + ARM GAS /tmp/ccE2rRGE.s page 234 + + +2517:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4936 .loc 1 2517 5 view .LVU1711 + 4937 002a 90F84030 ldrb r3, [r0, #64] @ zero_extendqisi2 + 4938 002e 012B cmp r3, #1 + 4939 0030 00F0B380 beq .L333 +2517:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4940 .loc 1 2517 5 discriminator 2 view .LVU1712 + 4941 0034 4FF0010B mov fp, #1 + 4942 0038 80F840B0 strb fp, [r0, #64] +2517:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4943 .loc 1 2517 5 discriminator 2 view .LVU1713 +2520:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4944 .loc 1 2520 5 discriminator 2 view .LVU1714 +2520:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4945 .loc 1 2520 17 is_stmt 0 discriminator 2 view .LVU1715 + 4946 003c FFF7FEFF bl HAL_GetTick + 4947 .LVL303: +2520:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4948 .loc 1 2520 17 discriminator 2 view .LVU1716 + 4949 0040 0746 mov r7, r0 + 4950 .LVL304: +2522:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4951 .loc 1 2522 5 is_stmt 1 discriminator 2 view .LVU1717 +2522:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4952 .loc 1 2522 9 is_stmt 0 discriminator 2 view .LVU1718 + 4953 0042 0090 str r0, [sp] + 4954 0044 1923 movs r3, #25 + 4955 0046 5A46 mov r2, fp + 4956 0048 4FF40041 mov r1, #32768 + 4957 004c 2046 mov r0, r4 + 4958 .LVL305: +2522:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4959 .loc 1 2522 9 discriminator 2 view .LVU1719 + 4960 004e FFF7FEFF bl I2C_WaitOnFlagUntilTimeout + 4961 .LVL306: +2522:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 4962 .loc 1 2522 8 discriminator 2 view .LVU1720 + 4963 0052 30B1 cbz r0, .L339 +2524:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4964 .loc 1 2524 14 view .LVU1721 + 4965 0054 0120 movs r0, #1 + 4966 0056 9DE0 b .L323 + 4967 .LVL307: + 4968 .L324: +2512:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 4969 .loc 1 2512 7 is_stmt 1 view .LVU1722 +2512:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 4970 .loc 1 2512 23 is_stmt 0 view .LVU1723 + 4971 0058 4FF40073 mov r3, #512 + 4972 005c 6364 str r3, [r4, #68] +2513:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4973 .loc 1 2513 7 is_stmt 1 view .LVU1724 +2513:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 4974 .loc 1 2513 15 is_stmt 0 view .LVU1725 + 4975 005e 0120 movs r0, #1 + 4976 .LVL308: +2513:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + ARM GAS /tmp/ccE2rRGE.s page 235 + + + 4977 .loc 1 2513 15 view .LVU1726 + 4978 0060 98E0 b .L323 + 4979 .LVL309: + 4980 .L339: +2527:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MEM; + 4981 .loc 1 2527 5 is_stmt 1 view .LVU1727 +2527:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MEM; + 4982 .loc 1 2527 21 is_stmt 0 view .LVU1728 + 4983 0062 2223 movs r3, #34 + 4984 0064 84F84130 strb r3, [r4, #65] +2528:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 4985 .loc 1 2528 5 is_stmt 1 view .LVU1729 +2528:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 4986 .loc 1 2528 21 is_stmt 0 view .LVU1730 + 4987 0068 4023 movs r3, #64 + 4988 006a 84F84230 strb r3, [r4, #66] +2529:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4989 .loc 1 2529 5 is_stmt 1 view .LVU1731 +2529:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 4990 .loc 1 2529 21 is_stmt 0 view .LVU1732 + 4991 006e 0023 movs r3, #0 + 4992 0070 6364 str r3, [r4, #68] +2532:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 4993 .loc 1 2532 5 is_stmt 1 view .LVU1733 +2532:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 4994 .loc 1 2532 21 is_stmt 0 view .LVU1734 + 4995 0072 0C9A ldr r2, [sp, #48] + 4996 0074 6262 str r2, [r4, #36] +2533:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = NULL; + 4997 .loc 1 2533 5 is_stmt 1 view .LVU1735 +2533:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = NULL; + 4998 .loc 1 2533 21 is_stmt 0 view .LVU1736 + 4999 0076 A4F82AA0 strh r10, [r4, #42] @ movhi +2534:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5000 .loc 1 2534 5 is_stmt 1 view .LVU1737 +2534:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5001 .loc 1 2534 21 is_stmt 0 view .LVU1738 + 5002 007a 6363 str r3, [r4, #52] +2537:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5003 .loc 1 2537 5 is_stmt 1 view .LVU1739 +2537:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5004 .loc 1 2537 9 is_stmt 0 view .LVU1740 + 5005 007c 0197 str r7, [sp, #4] + 5006 007e 0095 str r5, [sp] + 5007 0080 4B46 mov r3, r9 + 5008 0082 4246 mov r2, r8 + 5009 0084 3146 mov r1, r6 + 5010 0086 2046 mov r0, r4 + 5011 0088 FFF7FEFF bl I2C_RequestMemoryRead + 5012 .LVL310: +2537:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5013 .loc 1 2537 8 view .LVU1741 + 5014 008c 70B9 cbnz r0, .L340 +2546:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5015 .loc 1 2546 5 is_stmt 1 view .LVU1742 +2546:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5016 .loc 1 2546 13 is_stmt 0 view .LVU1743 + ARM GAS /tmp/ccE2rRGE.s page 236 + + + 5017 008e 638D ldrh r3, [r4, #42] + 5018 0090 9BB2 uxth r3, r3 +2546:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5019 .loc 1 2546 8 view .LVU1744 + 5020 0092 FF2B cmp r3, #255 + 5021 0094 0FD9 bls .L327 +2548:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, + 5022 .loc 1 2548 7 is_stmt 1 view .LVU1745 +2548:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, + 5023 .loc 1 2548 22 is_stmt 0 view .LVU1746 + 5024 0096 FF22 movs r2, #255 + 5025 0098 2285 strh r2, [r4, #40] @ movhi +2549:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_GENERATE_START_READ); + 5026 .loc 1 2549 7 is_stmt 1 view .LVU1747 + 5027 009a 444B ldr r3, .L342 + 5028 009c 0093 str r3, [sp] + 5029 009e 4FF08073 mov r3, #16777216 + 5030 00a2 3146 mov r1, r6 + 5031 00a4 2046 mov r0, r4 + 5032 00a6 FFF7FEFF bl I2C_TransferConfig + 5033 .LVL311: + 5034 00aa 21E0 b .L331 + 5035 .L340: +2540:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 5036 .loc 1 2540 7 view .LVU1748 +2540:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 5037 .loc 1 2540 7 view .LVU1749 + 5038 00ac 0023 movs r3, #0 + 5039 00ae 84F84030 strb r3, [r4, #64] +2540:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 5040 .loc 1 2540 7 view .LVU1750 +2541:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5041 .loc 1 2541 7 view .LVU1751 +2541:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5042 .loc 1 2541 14 is_stmt 0 view .LVU1752 + 5043 00b2 5846 mov r0, fp + 5044 00b4 6EE0 b .L323 + 5045 .L327: +2554:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, + 5046 .loc 1 2554 7 is_stmt 1 view .LVU1753 +2554:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, + 5047 .loc 1 2554 28 is_stmt 0 view .LVU1754 + 5048 00b6 628D ldrh r2, [r4, #42] + 5049 00b8 92B2 uxth r2, r2 +2554:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, + 5050 .loc 1 2554 22 view .LVU1755 + 5051 00ba 2285 strh r2, [r4, #40] @ movhi +2555:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_GENERATE_START_READ); + 5052 .loc 1 2555 7 is_stmt 1 view .LVU1756 + 5053 00bc 3B4B ldr r3, .L342 + 5054 00be 0093 str r3, [sp] + 5055 00c0 4FF00073 mov r3, #33554432 + 5056 00c4 D2B2 uxtb r2, r2 + 5057 00c6 3146 mov r1, r6 + 5058 00c8 2046 mov r0, r4 + 5059 00ca FFF7FEFF bl I2C_TransferConfig + 5060 .LVL312: + ARM GAS /tmp/ccE2rRGE.s page 237 + + + 5061 00ce 0FE0 b .L331 + 5062 .L330: +2592:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, + 5063 .loc 1 2592 11 view .LVU1757 +2592:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, + 5064 .loc 1 2592 32 is_stmt 0 view .LVU1758 + 5065 00d0 628D ldrh r2, [r4, #42] + 5066 00d2 92B2 uxth r2, r2 +2592:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t)hi2c->XferSize, I2C_AUTOEND_MODE, + 5067 .loc 1 2592 26 view .LVU1759 + 5068 00d4 2285 strh r2, [r4, #40] @ movhi +2593:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_NO_STARTSTOP); + 5069 .loc 1 2593 11 is_stmt 1 view .LVU1760 + 5070 00d6 0023 movs r3, #0 + 5071 00d8 0093 str r3, [sp] + 5072 00da 4FF00073 mov r3, #33554432 + 5073 00de D2B2 uxtb r2, r2 + 5074 00e0 3146 mov r1, r6 + 5075 00e2 2046 mov r0, r4 + 5076 00e4 FFF7FEFF bl I2C_TransferConfig + 5077 .LVL313: + 5078 .L329: +2597:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5079 .loc 1 2597 30 view .LVU1761 +2597:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5080 .loc 1 2597 18 is_stmt 0 view .LVU1762 + 5081 00e8 638D ldrh r3, [r4, #42] + 5082 00ea 9BB2 uxth r3, r3 +2597:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5083 .loc 1 2597 30 view .LVU1763 + 5084 00ec 002B cmp r3, #0 + 5085 00ee 34D0 beq .L341 + 5086 .L331: +2559:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5087 .loc 1 2559 5 is_stmt 1 view .LVU1764 +2562:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5088 .loc 1 2562 7 view .LVU1765 +2562:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5089 .loc 1 2562 11 is_stmt 0 view .LVU1766 + 5090 00f0 0097 str r7, [sp] + 5091 00f2 2B46 mov r3, r5 + 5092 00f4 0022 movs r2, #0 + 5093 00f6 0421 movs r1, #4 + 5094 00f8 2046 mov r0, r4 + 5095 00fa FFF7FEFF bl I2C_WaitOnFlagUntilTimeout + 5096 .LVL314: +2562:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5097 .loc 1 2562 10 view .LVU1767 + 5098 00fe 0028 cmp r0, #0 + 5099 0100 4DD1 bne .L335 +2568:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5100 .loc 1 2568 7 is_stmt 1 view .LVU1768 +2568:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5101 .loc 1 2568 38 is_stmt 0 view .LVU1769 + 5102 0102 2368 ldr r3, [r4] +2568:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5103 .loc 1 2568 48 view .LVU1770 + ARM GAS /tmp/ccE2rRGE.s page 238 + + + 5104 0104 5A6A ldr r2, [r3, #36] +2568:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5105 .loc 1 2568 12 view .LVU1771 + 5106 0106 636A ldr r3, [r4, #36] +2568:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5107 .loc 1 2568 23 view .LVU1772 + 5108 0108 1A70 strb r2, [r3] +2571:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5109 .loc 1 2571 7 is_stmt 1 view .LVU1773 +2571:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5110 .loc 1 2571 11 is_stmt 0 view .LVU1774 + 5111 010a 636A ldr r3, [r4, #36] +2571:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5112 .loc 1 2571 21 view .LVU1775 + 5113 010c 0133 adds r3, r3, #1 + 5114 010e 6362 str r3, [r4, #36] +2573:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount--; + 5115 .loc 1 2573 7 is_stmt 1 view .LVU1776 +2573:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount--; + 5116 .loc 1 2573 11 is_stmt 0 view .LVU1777 + 5117 0110 228D ldrh r2, [r4, #40] +2573:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount--; + 5118 .loc 1 2573 21 view .LVU1778 + 5119 0112 013A subs r2, r2, #1 + 5120 0114 92B2 uxth r2, r2 + 5121 0116 2285 strh r2, [r4, #40] @ movhi +2574:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5122 .loc 1 2574 7 is_stmt 1 view .LVU1779 +2574:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5123 .loc 1 2574 11 is_stmt 0 view .LVU1780 + 5124 0118 638D ldrh r3, [r4, #42] + 5125 011a 9BB2 uxth r3, r3 +2574:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5126 .loc 1 2574 22 view .LVU1781 + 5127 011c 013B subs r3, r3, #1 + 5128 011e 9BB2 uxth r3, r3 + 5129 0120 6385 strh r3, [r4, #42] @ movhi +2576:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5130 .loc 1 2576 7 is_stmt 1 view .LVU1782 +2576:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5131 .loc 1 2576 16 is_stmt 0 view .LVU1783 + 5132 0122 638D ldrh r3, [r4, #42] + 5133 0124 9BB2 uxth r3, r3 +2576:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5134 .loc 1 2576 10 view .LVU1784 + 5135 0126 002B cmp r3, #0 + 5136 0128 DED0 beq .L329 +2576:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5137 .loc 1 2576 35 discriminator 1 view .LVU1785 + 5138 012a 002A cmp r2, #0 + 5139 012c DCD1 bne .L329 +2579:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5140 .loc 1 2579 9 is_stmt 1 view .LVU1786 +2579:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5141 .loc 1 2579 13 is_stmt 0 view .LVU1787 + 5142 012e 0097 str r7, [sp] + 5143 0130 2B46 mov r3, r5 + ARM GAS /tmp/ccE2rRGE.s page 239 + + + 5144 0132 8021 movs r1, #128 + 5145 0134 2046 mov r0, r4 + 5146 0136 FFF7FEFF bl I2C_WaitOnFlagUntilTimeout + 5147 .LVL315: +2579:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5148 .loc 1 2579 12 view .LVU1788 + 5149 013a 90BB cbnz r0, .L336 +2584:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5150 .loc 1 2584 9 is_stmt 1 view .LVU1789 +2584:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5151 .loc 1 2584 17 is_stmt 0 view .LVU1790 + 5152 013c 638D ldrh r3, [r4, #42] + 5153 013e 9BB2 uxth r3, r3 +2584:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5154 .loc 1 2584 12 view .LVU1791 + 5155 0140 FF2B cmp r3, #255 + 5156 0142 C5D9 bls .L330 +2586:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t) hi2c->XferSize, I2C_RELOAD_MODE, + 5157 .loc 1 2586 11 is_stmt 1 view .LVU1792 +2586:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, DevAddress, (uint8_t) hi2c->XferSize, I2C_RELOAD_MODE, + 5158 .loc 1 2586 26 is_stmt 0 view .LVU1793 + 5159 0144 FF22 movs r2, #255 + 5160 0146 2285 strh r2, [r4, #40] @ movhi +2587:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_NO_STARTSTOP); + 5161 .loc 1 2587 11 is_stmt 1 view .LVU1794 + 5162 0148 0023 movs r3, #0 + 5163 014a 0093 str r3, [sp] + 5164 014c 4FF08073 mov r3, #16777216 + 5165 0150 3146 mov r1, r6 + 5166 0152 2046 mov r0, r4 + 5167 0154 FFF7FEFF bl I2C_TransferConfig + 5168 .LVL316: + 5169 0158 C6E7 b .L329 + 5170 .L341: +2601:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5171 .loc 1 2601 5 view .LVU1795 +2601:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5172 .loc 1 2601 9 is_stmt 0 view .LVU1796 + 5173 015a 3A46 mov r2, r7 + 5174 015c 2946 mov r1, r5 + 5175 015e 2046 mov r0, r4 + 5176 0160 FFF7FEFF bl I2C_WaitOnSTOPFlagUntilTimeout + 5177 .LVL317: +2601:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5178 .loc 1 2601 8 view .LVU1797 + 5179 0164 F8B9 cbnz r0, .L337 +2607:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5180 .loc 1 2607 5 is_stmt 1 view .LVU1798 + 5181 0166 2368 ldr r3, [r4] + 5182 0168 2022 movs r2, #32 + 5183 016a DA61 str r2, [r3, #28] +2610:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5184 .loc 1 2610 5 view .LVU1799 + 5185 016c 2168 ldr r1, [r4] + 5186 016e 4B68 ldr r3, [r1, #4] + 5187 0170 23F0FF73 bic r3, r3, #33423360 + 5188 0174 23F48B33 bic r3, r3, #71168 + ARM GAS /tmp/ccE2rRGE.s page 240 + + + 5189 0178 23F4FF73 bic r3, r3, #510 + 5190 017c 23F00103 bic r3, r3, #1 + 5191 0180 4B60 str r3, [r1, #4] +2612:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 5192 .loc 1 2612 5 view .LVU1800 +2612:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 5193 .loc 1 2612 17 is_stmt 0 view .LVU1801 + 5194 0182 84F84120 strb r2, [r4, #65] +2613:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5195 .loc 1 2613 5 is_stmt 1 view .LVU1802 +2613:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5196 .loc 1 2613 17 is_stmt 0 view .LVU1803 + 5197 0186 0023 movs r3, #0 + 5198 0188 84F84230 strb r3, [r4, #66] +2616:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5199 .loc 1 2616 5 is_stmt 1 view .LVU1804 +2616:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5200 .loc 1 2616 5 view .LVU1805 + 5201 018c 84F84030 strb r3, [r4, #64] +2616:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5202 .loc 1 2616 5 view .LVU1806 +2618:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5203 .loc 1 2618 5 view .LVU1807 +2618:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5204 .loc 1 2618 12 is_stmt 0 view .LVU1808 + 5205 0190 00E0 b .L323 + 5206 .LVL318: + 5207 .L332: +2622:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5208 .loc 1 2622 12 view .LVU1809 + 5209 0192 0220 movs r0, #2 + 5210 .LVL319: + 5211 .L323: +2624:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** + 5212 .loc 1 2624 1 view .LVU1810 + 5213 0194 03B0 add sp, sp, #12 + 5214 .cfi_remember_state + 5215 .cfi_def_cfa_offset 36 + 5216 @ sp needed + 5217 0196 BDE8F08F pop {r4, r5, r6, r7, r8, r9, r10, fp, pc} + 5218 .LVL320: + 5219 .L333: + 5220 .cfi_restore_state +2517:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5221 .loc 1 2517 5 view .LVU1811 + 5222 019a 0220 movs r0, #2 + 5223 .LVL321: +2517:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5224 .loc 1 2517 5 view .LVU1812 + 5225 019c FAE7 b .L323 + 5226 .LVL322: + 5227 .L335: +2564:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5228 .loc 1 2564 16 view .LVU1813 + 5229 019e 0120 movs r0, #1 + 5230 01a0 F8E7 b .L323 + 5231 .L336: + ARM GAS /tmp/ccE2rRGE.s page 241 + + +2581:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5232 .loc 1 2581 18 view .LVU1814 + 5233 01a2 0120 movs r0, #1 + 5234 01a4 F6E7 b .L323 + 5235 .L337: +2603:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5236 .loc 1 2603 14 view .LVU1815 + 5237 01a6 0120 movs r0, #1 + 5238 01a8 F4E7 b .L323 + 5239 .L343: + 5240 01aa 00BF .align 2 + 5241 .L342: + 5242 01ac 00240080 .word -2147474432 + 5243 .cfi_endproc + 5244 .LFE147: + 5246 .section .text.HAL_I2C_Mem_Write_IT,"ax",%progbits + 5247 .align 1 + 5248 .global HAL_I2C_Mem_Write_IT + 5249 .syntax unified + 5250 .thumb + 5251 .thumb_func + 5253 HAL_I2C_Mem_Write_IT: + 5254 .LVL323: + 5255 .LFB148: +2639:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tickstart; + 5256 .loc 1 2639 1 is_stmt 1 view -0 + 5257 .cfi_startproc + 5258 @ args = 8, pretend = 0, frame = 0 + 5259 @ frame_needed = 0, uses_anonymous_args = 0 +2639:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tickstart; + 5260 .loc 1 2639 1 is_stmt 0 view .LVU1817 + 5261 0000 2DE9F041 push {r4, r5, r6, r7, r8, lr} + 5262 .cfi_def_cfa_offset 24 + 5263 .cfi_offset 4, -24 + 5264 .cfi_offset 5, -20 + 5265 .cfi_offset 6, -16 + 5266 .cfi_offset 7, -12 + 5267 .cfi_offset 8, -8 + 5268 .cfi_offset 14, -4 + 5269 0004 82B0 sub sp, sp, #8 + 5270 .cfi_def_cfa_offset 32 + 5271 0006 0446 mov r4, r0 + 5272 0008 BDF82480 ldrh r8, [sp, #36] +2640:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t xfermode; + 5273 .loc 1 2640 3 is_stmt 1 view .LVU1818 +2641:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5274 .loc 1 2641 3 view .LVU1819 +2644:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5275 .loc 1 2644 3 view .LVU1820 +2646:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5276 .loc 1 2646 3 view .LVU1821 +2646:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5277 .loc 1 2646 11 is_stmt 0 view .LVU1822 + 5278 000c 90F84100 ldrb r0, [r0, #65] @ zero_extendqisi2 + 5279 .LVL324: +2646:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5280 .loc 1 2646 11 view .LVU1823 + ARM GAS /tmp/ccE2rRGE.s page 242 + + + 5281 0010 C0B2 uxtb r0, r0 +2646:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5282 .loc 1 2646 6 view .LVU1824 + 5283 0012 2028 cmp r0, #32 + 5284 0014 58D1 bne .L351 + 5285 0016 0D46 mov r5, r1 + 5286 0018 1746 mov r7, r2 + 5287 001a 1E46 mov r6, r3 +2648:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5288 .loc 1 2648 5 is_stmt 1 view .LVU1825 +2648:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5289 .loc 1 2648 8 is_stmt 0 view .LVU1826 + 5290 001c 089B ldr r3, [sp, #32] + 5291 .LVL325: +2648:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5292 .loc 1 2648 8 view .LVU1827 + 5293 001e 002B cmp r3, #0 + 5294 0020 38D0 beq .L346 +2648:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5295 .loc 1 2648 25 discriminator 1 view .LVU1828 + 5296 0022 B8F1000F cmp r8, #0 + 5297 0026 35D0 beq .L346 +2654:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5298 .loc 1 2654 5 is_stmt 1 view .LVU1829 +2654:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5299 .loc 1 2654 9 is_stmt 0 view .LVU1830 + 5300 0028 2368 ldr r3, [r4] + 5301 002a 9B69 ldr r3, [r3, #24] +2654:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5302 .loc 1 2654 8 view .LVU1831 + 5303 002c 13F4004F tst r3, #32768 + 5304 0030 4FD1 bne .L352 +2660:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5305 .loc 1 2660 5 is_stmt 1 view .LVU1832 +2660:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5306 .loc 1 2660 5 view .LVU1833 + 5307 0032 94F84030 ldrb r3, [r4, #64] @ zero_extendqisi2 + 5308 0036 012B cmp r3, #1 + 5309 0038 4DD0 beq .L353 +2660:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5310 .loc 1 2660 5 discriminator 2 view .LVU1834 + 5311 003a 0123 movs r3, #1 + 5312 003c 84F84030 strb r3, [r4, #64] +2660:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5313 .loc 1 2660 5 discriminator 2 view .LVU1835 +2663:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5314 .loc 1 2663 5 discriminator 2 view .LVU1836 +2663:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5315 .loc 1 2663 17 is_stmt 0 discriminator 2 view .LVU1837 + 5316 0040 FFF7FEFF bl HAL_GetTick + 5317 .LVL326: +2665:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MEM; + 5318 .loc 1 2665 5 is_stmt 1 discriminator 2 view .LVU1838 +2665:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MEM; + 5319 .loc 1 2665 23 is_stmt 0 discriminator 2 view .LVU1839 + 5320 0044 2123 movs r3, #33 + 5321 0046 84F84130 strb r3, [r4, #65] + ARM GAS /tmp/ccE2rRGE.s page 243 + + +2666:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 5322 .loc 1 2666 5 is_stmt 1 discriminator 2 view .LVU1840 +2666:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 5323 .loc 1 2666 23 is_stmt 0 discriminator 2 view .LVU1841 + 5324 004a 4023 movs r3, #64 + 5325 004c 84F84230 strb r3, [r4, #66] +2667:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5326 .loc 1 2667 5 is_stmt 1 discriminator 2 view .LVU1842 +2667:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5327 .loc 1 2667 23 is_stmt 0 discriminator 2 view .LVU1843 + 5328 0050 0023 movs r3, #0 + 5329 0052 6364 str r3, [r4, #68] +2670:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 5330 .loc 1 2670 5 is_stmt 1 discriminator 2 view .LVU1844 +2670:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 5331 .loc 1 2670 23 is_stmt 0 discriminator 2 view .LVU1845 + 5332 0054 089B ldr r3, [sp, #32] + 5333 0056 6362 str r3, [r4, #36] +2671:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; + 5334 .loc 1 2671 5 is_stmt 1 discriminator 2 view .LVU1846 +2671:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; + 5335 .loc 1 2671 23 is_stmt 0 discriminator 2 view .LVU1847 + 5336 0058 A4F82A80 strh r8, [r4, #42] @ movhi +2672:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_IT; + 5337 .loc 1 2672 5 is_stmt 1 discriminator 2 view .LVU1848 +2672:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_IT; + 5338 .loc 1 2672 23 is_stmt 0 discriminator 2 view .LVU1849 + 5339 005c 1F4B ldr r3, .L355 + 5340 005e E362 str r3, [r4, #44] +2673:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5341 .loc 1 2673 5 is_stmt 1 discriminator 2 view .LVU1850 +2673:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5342 .loc 1 2673 23 is_stmt 0 discriminator 2 view .LVU1851 + 5343 0060 1F4B ldr r3, .L355+4 + 5344 0062 6363 str r3, [r4, #52] +2675:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5345 .loc 1 2675 5 is_stmt 1 discriminator 2 view .LVU1852 +2675:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5346 .loc 1 2675 13 is_stmt 0 discriminator 2 view .LVU1853 + 5347 0064 638D ldrh r3, [r4, #42] + 5348 0066 9BB2 uxth r3, r3 +2675:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5349 .loc 1 2675 8 discriminator 2 view .LVU1854 + 5350 0068 FF2B cmp r3, #255 + 5351 006a 18D9 bls .L348 +2677:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_RELOAD_MODE; + 5352 .loc 1 2677 7 is_stmt 1 view .LVU1855 +2677:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_RELOAD_MODE; + 5353 .loc 1 2677 22 is_stmt 0 view .LVU1856 + 5354 006c FF23 movs r3, #255 + 5355 006e 2385 strh r3, [r4, #40] @ movhi +2678:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5356 .loc 1 2678 7 is_stmt 1 view .LVU1857 + 5357 .LVL327: +2678:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5358 .loc 1 2678 16 is_stmt 0 view .LVU1858 + 5359 0070 4FF08078 mov r8, #16777216 + ARM GAS /tmp/ccE2rRGE.s page 244 + + + 5360 .LVL328: + 5361 .L349: +2687:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** != HAL_OK) + 5362 .loc 1 2687 5 is_stmt 1 view .LVU1859 +2687:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** != HAL_OK) + 5363 .loc 1 2687 9 is_stmt 0 view .LVU1860 + 5364 0074 0190 str r0, [sp, #4] + 5365 0076 1923 movs r3, #25 + 5366 0078 0093 str r3, [sp] + 5367 007a 3346 mov r3, r6 + 5368 007c 3A46 mov r2, r7 + 5369 007e 2946 mov r1, r5 + 5370 0080 2046 mov r0, r4 + 5371 .LVL329: +2687:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** != HAL_OK) + 5372 .loc 1 2687 9 view .LVU1861 + 5373 0082 FFF7FEFF bl I2C_RequestMemoryWrite + 5374 .LVL330: +2687:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** != HAL_OK) + 5375 .loc 1 2687 8 view .LVU1862 + 5376 0086 0646 mov r6, r0 + 5377 0088 70B1 cbz r0, .L350 +2691:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 5378 .loc 1 2691 7 is_stmt 1 view .LVU1863 +2691:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 5379 .loc 1 2691 7 view .LVU1864 + 5380 008a 0023 movs r3, #0 + 5381 008c 84F84030 strb r3, [r4, #64] +2691:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 5382 .loc 1 2691 7 view .LVU1865 +2692:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5383 .loc 1 2692 7 view .LVU1866 +2692:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5384 .loc 1 2692 14 is_stmt 0 view .LVU1867 + 5385 0090 0126 movs r6, #1 + 5386 0092 1AE0 b .L345 + 5387 .LVL331: + 5388 .L346: +2650:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 5389 .loc 1 2650 7 is_stmt 1 view .LVU1868 +2650:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 5390 .loc 1 2650 23 is_stmt 0 view .LVU1869 + 5391 0094 4FF40073 mov r3, #512 + 5392 0098 6364 str r3, [r4, #68] +2651:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5393 .loc 1 2651 7 is_stmt 1 view .LVU1870 +2651:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5394 .loc 1 2651 15 is_stmt 0 view .LVU1871 + 5395 009a 0126 movs r6, #1 + 5396 009c 15E0 b .L345 + 5397 .LVL332: + 5398 .L348: +2682:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_AUTOEND_MODE; + 5399 .loc 1 2682 7 is_stmt 1 view .LVU1872 +2682:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_AUTOEND_MODE; + 5400 .loc 1 2682 28 is_stmt 0 view .LVU1873 + 5401 009e 638D ldrh r3, [r4, #42] + ARM GAS /tmp/ccE2rRGE.s page 245 + + +2682:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_AUTOEND_MODE; + 5402 .loc 1 2682 22 view .LVU1874 + 5403 00a0 2385 strh r3, [r4, #40] @ movhi +2683:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5404 .loc 1 2683 7 is_stmt 1 view .LVU1875 + 5405 .LVL333: +2683:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5406 .loc 1 2683 16 is_stmt 0 view .LVU1876 + 5407 00a2 4FF00078 mov r8, #33554432 + 5408 00a6 E5E7 b .L349 + 5409 .LVL334: + 5410 .L350: +2696:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5411 .loc 1 2696 5 is_stmt 1 view .LVU1877 + 5412 00a8 0027 movs r7, #0 + 5413 00aa 0097 str r7, [sp] + 5414 00ac 4346 mov r3, r8 + 5415 00ae 94F82820 ldrb r2, [r4, #40] @ zero_extendqisi2 + 5416 00b2 2946 mov r1, r5 + 5417 00b4 2046 mov r0, r4 + 5418 00b6 FFF7FEFF bl I2C_TransferConfig + 5419 .LVL335: +2699:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5420 .loc 1 2699 5 view .LVU1878 +2699:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5421 .loc 1 2699 5 view .LVU1879 + 5422 00ba 84F84070 strb r7, [r4, #64] +2699:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5423 .loc 1 2699 5 view .LVU1880 +2709:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5424 .loc 1 2709 5 view .LVU1881 + 5425 00be 0121 movs r1, #1 + 5426 00c0 2046 mov r0, r4 + 5427 00c2 FFF7FEFF bl I2C_Enable_IRQ + 5428 .LVL336: +2711:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5429 .loc 1 2711 5 view .LVU1882 +2711:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5430 .loc 1 2711 12 is_stmt 0 view .LVU1883 + 5431 00c6 00E0 b .L345 + 5432 .LVL337: + 5433 .L351: +2715:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5434 .loc 1 2715 12 view .LVU1884 + 5435 00c8 0226 movs r6, #2 + 5436 .LVL338: + 5437 .L345: +2717:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5438 .loc 1 2717 1 view .LVU1885 + 5439 00ca 3046 mov r0, r6 + 5440 00cc 02B0 add sp, sp, #8 + 5441 .cfi_remember_state + 5442 .cfi_def_cfa_offset 24 + 5443 @ sp needed + 5444 00ce BDE8F081 pop {r4, r5, r6, r7, r8, pc} + 5445 .LVL339: + 5446 .L352: + ARM GAS /tmp/ccE2rRGE.s page 246 + + + 5447 .cfi_restore_state +2656:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5448 .loc 1 2656 14 view .LVU1886 + 5449 00d2 0226 movs r6, #2 + 5450 00d4 F9E7 b .L345 + 5451 .L353: +2660:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5452 .loc 1 2660 5 view .LVU1887 + 5453 00d6 0226 movs r6, #2 + 5454 00d8 F7E7 b .L345 + 5455 .L356: + 5456 00da 00BF .align 2 + 5457 .L355: + 5458 00dc 0000FFFF .word -65536 + 5459 00e0 00000000 .word I2C_Master_ISR_IT + 5460 .cfi_endproc + 5461 .LFE148: + 5463 .section .text.HAL_I2C_Mem_Read_IT,"ax",%progbits + 5464 .align 1 + 5465 .global HAL_I2C_Mem_Read_IT + 5466 .syntax unified + 5467 .thumb + 5468 .thumb_func + 5470 HAL_I2C_Mem_Read_IT: + 5471 .LVL340: + 5472 .LFB149: +2733:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tickstart; + 5473 .loc 1 2733 1 is_stmt 1 view -0 + 5474 .cfi_startproc + 5475 @ args = 8, pretend = 0, frame = 0 + 5476 @ frame_needed = 0, uses_anonymous_args = 0 +2733:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tickstart; + 5477 .loc 1 2733 1 is_stmt 0 view .LVU1889 + 5478 0000 2DE9F041 push {r4, r5, r6, r7, r8, lr} + 5479 .cfi_def_cfa_offset 24 + 5480 .cfi_offset 4, -24 + 5481 .cfi_offset 5, -20 + 5482 .cfi_offset 6, -16 + 5483 .cfi_offset 7, -12 + 5484 .cfi_offset 8, -8 + 5485 .cfi_offset 14, -4 + 5486 0004 82B0 sub sp, sp, #8 + 5487 .cfi_def_cfa_offset 32 + 5488 0006 0446 mov r4, r0 + 5489 0008 BDF82480 ldrh r8, [sp, #36] +2734:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t xfermode; + 5490 .loc 1 2734 3 is_stmt 1 view .LVU1890 +2735:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5491 .loc 1 2735 3 view .LVU1891 +2738:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5492 .loc 1 2738 3 view .LVU1892 +2740:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5493 .loc 1 2740 3 view .LVU1893 +2740:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5494 .loc 1 2740 11 is_stmt 0 view .LVU1894 + 5495 000c 90F84100 ldrb r0, [r0, #65] @ zero_extendqisi2 + 5496 .LVL341: + ARM GAS /tmp/ccE2rRGE.s page 247 + + +2740:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5497 .loc 1 2740 11 view .LVU1895 + 5498 0010 C0B2 uxtb r0, r0 +2740:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5499 .loc 1 2740 6 view .LVU1896 + 5500 0012 2028 cmp r0, #32 + 5501 0014 59D1 bne .L364 + 5502 0016 0D46 mov r5, r1 + 5503 0018 1746 mov r7, r2 + 5504 001a 1E46 mov r6, r3 +2742:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5505 .loc 1 2742 5 is_stmt 1 view .LVU1897 +2742:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5506 .loc 1 2742 8 is_stmt 0 view .LVU1898 + 5507 001c 089B ldr r3, [sp, #32] + 5508 .LVL342: +2742:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5509 .loc 1 2742 8 view .LVU1899 + 5510 001e 002B cmp r3, #0 + 5511 0020 38D0 beq .L359 +2742:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5512 .loc 1 2742 25 discriminator 1 view .LVU1900 + 5513 0022 B8F1000F cmp r8, #0 + 5514 0026 35D0 beq .L359 +2748:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5515 .loc 1 2748 5 is_stmt 1 view .LVU1901 +2748:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5516 .loc 1 2748 9 is_stmt 0 view .LVU1902 + 5517 0028 2368 ldr r3, [r4] + 5518 002a 9B69 ldr r3, [r3, #24] +2748:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5519 .loc 1 2748 8 view .LVU1903 + 5520 002c 13F4004F tst r3, #32768 + 5521 0030 50D1 bne .L365 +2754:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5522 .loc 1 2754 5 is_stmt 1 view .LVU1904 +2754:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5523 .loc 1 2754 5 view .LVU1905 + 5524 0032 94F84030 ldrb r3, [r4, #64] @ zero_extendqisi2 + 5525 0036 012B cmp r3, #1 + 5526 0038 4ED0 beq .L366 +2754:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5527 .loc 1 2754 5 discriminator 2 view .LVU1906 + 5528 003a 0123 movs r3, #1 + 5529 003c 84F84030 strb r3, [r4, #64] +2754:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5530 .loc 1 2754 5 discriminator 2 view .LVU1907 +2757:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5531 .loc 1 2757 5 discriminator 2 view .LVU1908 +2757:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5532 .loc 1 2757 17 is_stmt 0 discriminator 2 view .LVU1909 + 5533 0040 FFF7FEFF bl HAL_GetTick + 5534 .LVL343: +2759:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MEM; + 5535 .loc 1 2759 5 is_stmt 1 discriminator 2 view .LVU1910 +2759:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MEM; + 5536 .loc 1 2759 23 is_stmt 0 discriminator 2 view .LVU1911 + ARM GAS /tmp/ccE2rRGE.s page 248 + + + 5537 0044 2223 movs r3, #34 + 5538 0046 84F84130 strb r3, [r4, #65] +2760:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 5539 .loc 1 2760 5 is_stmt 1 discriminator 2 view .LVU1912 +2760:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 5540 .loc 1 2760 23 is_stmt 0 discriminator 2 view .LVU1913 + 5541 004a 4023 movs r3, #64 + 5542 004c 84F84230 strb r3, [r4, #66] +2761:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5543 .loc 1 2761 5 is_stmt 1 discriminator 2 view .LVU1914 +2761:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5544 .loc 1 2761 23 is_stmt 0 discriminator 2 view .LVU1915 + 5545 0050 0023 movs r3, #0 + 5546 0052 6364 str r3, [r4, #68] +2764:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 5547 .loc 1 2764 5 is_stmt 1 discriminator 2 view .LVU1916 +2764:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 5548 .loc 1 2764 23 is_stmt 0 discriminator 2 view .LVU1917 + 5549 0054 089B ldr r3, [sp, #32] + 5550 0056 6362 str r3, [r4, #36] +2765:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; + 5551 .loc 1 2765 5 is_stmt 1 discriminator 2 view .LVU1918 +2765:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; + 5552 .loc 1 2765 23 is_stmt 0 discriminator 2 view .LVU1919 + 5553 0058 A4F82A80 strh r8, [r4, #42] @ movhi +2766:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_IT; + 5554 .loc 1 2766 5 is_stmt 1 discriminator 2 view .LVU1920 +2766:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_IT; + 5555 .loc 1 2766 23 is_stmt 0 discriminator 2 view .LVU1921 + 5556 005c 1F4B ldr r3, .L368 + 5557 005e E362 str r3, [r4, #44] +2767:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5558 .loc 1 2767 5 is_stmt 1 discriminator 2 view .LVU1922 +2767:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5559 .loc 1 2767 23 is_stmt 0 discriminator 2 view .LVU1923 + 5560 0060 1F4B ldr r3, .L368+4 + 5561 0062 6363 str r3, [r4, #52] +2769:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5562 .loc 1 2769 5 is_stmt 1 discriminator 2 view .LVU1924 +2769:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5563 .loc 1 2769 13 is_stmt 0 discriminator 2 view .LVU1925 + 5564 0064 638D ldrh r3, [r4, #42] + 5565 0066 9BB2 uxth r3, r3 +2769:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5566 .loc 1 2769 8 discriminator 2 view .LVU1926 + 5567 0068 FF2B cmp r3, #255 + 5568 006a 18D9 bls .L361 +2771:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_RELOAD_MODE; + 5569 .loc 1 2771 7 is_stmt 1 view .LVU1927 +2771:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_RELOAD_MODE; + 5570 .loc 1 2771 22 is_stmt 0 view .LVU1928 + 5571 006c FF23 movs r3, #255 + 5572 006e 2385 strh r3, [r4, #40] @ movhi +2772:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5573 .loc 1 2772 7 is_stmt 1 view .LVU1929 + 5574 .LVL344: +2772:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + ARM GAS /tmp/ccE2rRGE.s page 249 + + + 5575 .loc 1 2772 16 is_stmt 0 view .LVU1930 + 5576 0070 4FF08078 mov r8, #16777216 + 5577 .LVL345: + 5578 .L362: +2781:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5579 .loc 1 2781 5 is_stmt 1 view .LVU1931 +2781:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5580 .loc 1 2781 9 is_stmt 0 view .LVU1932 + 5581 0074 0190 str r0, [sp, #4] + 5582 0076 1923 movs r3, #25 + 5583 0078 0093 str r3, [sp] + 5584 007a 3346 mov r3, r6 + 5585 007c 3A46 mov r2, r7 + 5586 007e 2946 mov r1, r5 + 5587 0080 2046 mov r0, r4 + 5588 .LVL346: +2781:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5589 .loc 1 2781 9 view .LVU1933 + 5590 0082 FFF7FEFF bl I2C_RequestMemoryRead + 5591 .LVL347: +2781:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5592 .loc 1 2781 8 view .LVU1934 + 5593 0086 0646 mov r6, r0 + 5594 0088 70B1 cbz r0, .L363 +2784:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 5595 .loc 1 2784 7 is_stmt 1 view .LVU1935 +2784:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 5596 .loc 1 2784 7 view .LVU1936 + 5597 008a 0023 movs r3, #0 + 5598 008c 84F84030 strb r3, [r4, #64] +2784:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 5599 .loc 1 2784 7 view .LVU1937 +2785:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5600 .loc 1 2785 7 view .LVU1938 +2785:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5601 .loc 1 2785 14 is_stmt 0 view .LVU1939 + 5602 0090 0126 movs r6, #1 + 5603 0092 1BE0 b .L358 + 5604 .LVL348: + 5605 .L359: +2744:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 5606 .loc 1 2744 7 is_stmt 1 view .LVU1940 +2744:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 5607 .loc 1 2744 23 is_stmt 0 view .LVU1941 + 5608 0094 4FF40073 mov r3, #512 + 5609 0098 6364 str r3, [r4, #68] +2745:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5610 .loc 1 2745 7 is_stmt 1 view .LVU1942 +2745:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5611 .loc 1 2745 15 is_stmt 0 view .LVU1943 + 5612 009a 0126 movs r6, #1 + 5613 009c 16E0 b .L358 + 5614 .LVL349: + 5615 .L361: +2776:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_AUTOEND_MODE; + 5616 .loc 1 2776 7 is_stmt 1 view .LVU1944 +2776:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_AUTOEND_MODE; + ARM GAS /tmp/ccE2rRGE.s page 250 + + + 5617 .loc 1 2776 28 is_stmt 0 view .LVU1945 + 5618 009e 638D ldrh r3, [r4, #42] +2776:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_AUTOEND_MODE; + 5619 .loc 1 2776 22 view .LVU1946 + 5620 00a0 2385 strh r3, [r4, #40] @ movhi +2777:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5621 .loc 1 2777 7 is_stmt 1 view .LVU1947 + 5622 .LVL350: +2777:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5623 .loc 1 2777 16 is_stmt 0 view .LVU1948 + 5624 00a2 4FF00078 mov r8, #33554432 + 5625 00a6 E5E7 b .L362 + 5626 .LVL351: + 5627 .L363: +2789:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5628 .loc 1 2789 5 is_stmt 1 view .LVU1949 + 5629 00a8 0E4B ldr r3, .L368+8 + 5630 00aa 0093 str r3, [sp] + 5631 00ac 4346 mov r3, r8 + 5632 00ae 94F82820 ldrb r2, [r4, #40] @ zero_extendqisi2 + 5633 00b2 2946 mov r1, r5 + 5634 00b4 2046 mov r0, r4 + 5635 00b6 FFF7FEFF bl I2C_TransferConfig + 5636 .LVL352: +2792:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5637 .loc 1 2792 5 view .LVU1950 +2792:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5638 .loc 1 2792 5 view .LVU1951 + 5639 00ba 0023 movs r3, #0 + 5640 00bc 84F84030 strb r3, [r4, #64] +2792:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5641 .loc 1 2792 5 view .LVU1952 +2802:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5642 .loc 1 2802 5 view .LVU1953 + 5643 00c0 0221 movs r1, #2 + 5644 00c2 2046 mov r0, r4 + 5645 00c4 FFF7FEFF bl I2C_Enable_IRQ + 5646 .LVL353: +2804:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5647 .loc 1 2804 5 view .LVU1954 +2804:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5648 .loc 1 2804 12 is_stmt 0 view .LVU1955 + 5649 00c8 00E0 b .L358 + 5650 .LVL354: + 5651 .L364: +2808:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5652 .loc 1 2808 12 view .LVU1956 + 5653 00ca 0226 movs r6, #2 + 5654 .LVL355: + 5655 .L358: +2810:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /** + 5656 .loc 1 2810 1 view .LVU1957 + 5657 00cc 3046 mov r0, r6 + 5658 00ce 02B0 add sp, sp, #8 + 5659 .cfi_remember_state + 5660 .cfi_def_cfa_offset 24 + 5661 @ sp needed + ARM GAS /tmp/ccE2rRGE.s page 251 + + + 5662 00d0 BDE8F081 pop {r4, r5, r6, r7, r8, pc} + 5663 .LVL356: + 5664 .L365: + 5665 .cfi_restore_state +2750:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5666 .loc 1 2750 14 view .LVU1958 + 5667 00d4 0226 movs r6, #2 + 5668 00d6 F9E7 b .L358 + 5669 .L366: +2754:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5670 .loc 1 2754 5 view .LVU1959 + 5671 00d8 0226 movs r6, #2 + 5672 00da F7E7 b .L358 + 5673 .L369: + 5674 .align 2 + 5675 .L368: + 5676 00dc 0000FFFF .word -65536 + 5677 00e0 00000000 .word I2C_Master_ISR_IT + 5678 00e4 00240080 .word -2147474432 + 5679 .cfi_endproc + 5680 .LFE149: + 5682 .section .text.HAL_I2C_Mem_Write_DMA,"ax",%progbits + 5683 .align 1 + 5684 .global HAL_I2C_Mem_Write_DMA + 5685 .syntax unified + 5686 .thumb + 5687 .thumb_func + 5689 HAL_I2C_Mem_Write_DMA: + 5690 .LVL357: + 5691 .LFB150: +2825:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tickstart; + 5692 .loc 1 2825 1 is_stmt 1 view -0 + 5693 .cfi_startproc + 5694 @ args = 8, pretend = 0, frame = 0 + 5695 @ frame_needed = 0, uses_anonymous_args = 0 +2825:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tickstart; + 5696 .loc 1 2825 1 is_stmt 0 view .LVU1961 + 5697 0000 2DE9F041 push {r4, r5, r6, r7, r8, lr} + 5698 .cfi_def_cfa_offset 24 + 5699 .cfi_offset 4, -24 + 5700 .cfi_offset 5, -20 + 5701 .cfi_offset 6, -16 + 5702 .cfi_offset 7, -12 + 5703 .cfi_offset 8, -8 + 5704 .cfi_offset 14, -4 + 5705 0004 82B0 sub sp, sp, #8 + 5706 .cfi_def_cfa_offset 32 + 5707 0006 0446 mov r4, r0 + 5708 0008 BDF82480 ldrh r8, [sp, #36] +2826:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t xfermode; + 5709 .loc 1 2826 3 is_stmt 1 view .LVU1962 +2827:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef dmaxferstatus; + 5710 .loc 1 2827 3 view .LVU1963 +2828:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5711 .loc 1 2828 3 view .LVU1964 +2831:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5712 .loc 1 2831 3 view .LVU1965 + ARM GAS /tmp/ccE2rRGE.s page 252 + + +2833:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5713 .loc 1 2833 3 view .LVU1966 +2833:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5714 .loc 1 2833 11 is_stmt 0 view .LVU1967 + 5715 000c 90F84100 ldrb r0, [r0, #65] @ zero_extendqisi2 + 5716 .LVL358: +2833:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5717 .loc 1 2833 11 view .LVU1968 + 5718 0010 C0B2 uxtb r0, r0 +2833:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5719 .loc 1 2833 6 view .LVU1969 + 5720 0012 2028 cmp r0, #32 + 5721 0014 40F09880 bne .L380 + 5722 0018 0D46 mov r5, r1 + 5723 001a 1746 mov r7, r2 + 5724 001c 1E46 mov r6, r3 +2835:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5725 .loc 1 2835 5 is_stmt 1 view .LVU1970 +2835:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5726 .loc 1 2835 8 is_stmt 0 view .LVU1971 + 5727 001e 089B ldr r3, [sp, #32] + 5728 .LVL359: +2835:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5729 .loc 1 2835 8 view .LVU1972 + 5730 0020 002B cmp r3, #0 + 5731 0022 59D0 beq .L372 +2835:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5732 .loc 1 2835 25 discriminator 1 view .LVU1973 + 5733 0024 B8F1000F cmp r8, #0 + 5734 0028 56D0 beq .L372 +2841:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5735 .loc 1 2841 5 is_stmt 1 view .LVU1974 +2841:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5736 .loc 1 2841 9 is_stmt 0 view .LVU1975 + 5737 002a 2368 ldr r3, [r4] + 5738 002c 9B69 ldr r3, [r3, #24] +2841:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5739 .loc 1 2841 8 view .LVU1976 + 5740 002e 13F4004F tst r3, #32768 + 5741 0032 40F08E80 bne .L381 +2847:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5742 .loc 1 2847 5 is_stmt 1 view .LVU1977 +2847:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5743 .loc 1 2847 5 view .LVU1978 + 5744 0036 94F84030 ldrb r3, [r4, #64] @ zero_extendqisi2 + 5745 003a 012B cmp r3, #1 + 5746 003c 00F08B80 beq .L382 +2847:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5747 .loc 1 2847 5 discriminator 2 view .LVU1979 + 5748 0040 0123 movs r3, #1 + 5749 0042 84F84030 strb r3, [r4, #64] +2847:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5750 .loc 1 2847 5 discriminator 2 view .LVU1980 +2850:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5751 .loc 1 2850 5 discriminator 2 view .LVU1981 +2850:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5752 .loc 1 2850 17 is_stmt 0 discriminator 2 view .LVU1982 + ARM GAS /tmp/ccE2rRGE.s page 253 + + + 5753 0046 FFF7FEFF bl HAL_GetTick + 5754 .LVL360: +2852:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MEM; + 5755 .loc 1 2852 5 is_stmt 1 discriminator 2 view .LVU1983 +2852:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MEM; + 5756 .loc 1 2852 23 is_stmt 0 discriminator 2 view .LVU1984 + 5757 004a 2123 movs r3, #33 + 5758 004c 84F84130 strb r3, [r4, #65] +2853:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 5759 .loc 1 2853 5 is_stmt 1 discriminator 2 view .LVU1985 +2853:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 5760 .loc 1 2853 23 is_stmt 0 discriminator 2 view .LVU1986 + 5761 0050 4023 movs r3, #64 + 5762 0052 84F84230 strb r3, [r4, #66] +2854:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5763 .loc 1 2854 5 is_stmt 1 discriminator 2 view .LVU1987 +2854:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5764 .loc 1 2854 23 is_stmt 0 discriminator 2 view .LVU1988 + 5765 0056 0023 movs r3, #0 + 5766 0058 6364 str r3, [r4, #68] +2857:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 5767 .loc 1 2857 5 is_stmt 1 discriminator 2 view .LVU1989 +2857:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 5768 .loc 1 2857 23 is_stmt 0 discriminator 2 view .LVU1990 + 5769 005a 089B ldr r3, [sp, #32] + 5770 005c 6362 str r3, [r4, #36] +2858:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; + 5771 .loc 1 2858 5 is_stmt 1 discriminator 2 view .LVU1991 +2858:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; + 5772 .loc 1 2858 23 is_stmt 0 discriminator 2 view .LVU1992 + 5773 005e A4F82A80 strh r8, [r4, #42] @ movhi +2859:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_DMA; + 5774 .loc 1 2859 5 is_stmt 1 discriminator 2 view .LVU1993 +2859:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_DMA; + 5775 .loc 1 2859 23 is_stmt 0 discriminator 2 view .LVU1994 + 5776 0062 3E4B ldr r3, .L387 + 5777 0064 E362 str r3, [r4, #44] +2860:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5778 .loc 1 2860 5 is_stmt 1 discriminator 2 view .LVU1995 +2860:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5779 .loc 1 2860 23 is_stmt 0 discriminator 2 view .LVU1996 + 5780 0066 3E4B ldr r3, .L387+4 + 5781 0068 6363 str r3, [r4, #52] +2862:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5782 .loc 1 2862 5 is_stmt 1 discriminator 2 view .LVU1997 +2862:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5783 .loc 1 2862 13 is_stmt 0 discriminator 2 view .LVU1998 + 5784 006a 638D ldrh r3, [r4, #42] + 5785 006c 9BB2 uxth r3, r3 +2862:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5786 .loc 1 2862 8 discriminator 2 view .LVU1999 + 5787 006e FF2B cmp r3, #255 + 5788 0070 37D9 bls .L374 +2864:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_RELOAD_MODE; + 5789 .loc 1 2864 7 is_stmt 1 view .LVU2000 +2864:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_RELOAD_MODE; + 5790 .loc 1 2864 22 is_stmt 0 view .LVU2001 + ARM GAS /tmp/ccE2rRGE.s page 254 + + + 5791 0072 FF23 movs r3, #255 + 5792 0074 2385 strh r3, [r4, #40] @ movhi +2865:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5793 .loc 1 2865 7 is_stmt 1 view .LVU2002 + 5794 .LVL361: +2865:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5795 .loc 1 2865 16 is_stmt 0 view .LVU2003 + 5796 0076 4FF08078 mov r8, #16777216 + 5797 .LVL362: + 5798 .L375: +2874:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** != HAL_OK) + 5799 .loc 1 2874 5 is_stmt 1 view .LVU2004 +2874:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** != HAL_OK) + 5800 .loc 1 2874 9 is_stmt 0 view .LVU2005 + 5801 007a 0190 str r0, [sp, #4] + 5802 007c 1923 movs r3, #25 + 5803 007e 0093 str r3, [sp] + 5804 0080 3346 mov r3, r6 + 5805 0082 3A46 mov r2, r7 + 5806 0084 2946 mov r1, r5 + 5807 0086 2046 mov r0, r4 + 5808 .LVL363: +2874:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** != HAL_OK) + 5809 .loc 1 2874 9 view .LVU2006 + 5810 0088 FFF7FEFF bl I2C_RequestMemoryWrite + 5811 .LVL364: +2874:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** != HAL_OK) + 5812 .loc 1 2874 8 view .LVU2007 + 5813 008c 0028 cmp r0, #0 + 5814 008e 2DD1 bne .L385 +2883:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5815 .loc 1 2883 5 is_stmt 1 view .LVU2008 +2883:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5816 .loc 1 2883 13 is_stmt 0 view .LVU2009 + 5817 0090 A36B ldr r3, [r4, #56] +2883:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5818 .loc 1 2883 8 view .LVU2010 + 5819 0092 002B cmp r3, #0 + 5820 0094 2FD0 beq .L377 +2886:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5821 .loc 1 2886 7 is_stmt 1 view .LVU2011 +2886:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5822 .loc 1 2886 38 is_stmt 0 view .LVU2012 + 5823 0096 334A ldr r2, .L387+8 + 5824 0098 9A62 str r2, [r3, #40] +2889:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5825 .loc 1 2889 7 is_stmt 1 view .LVU2013 +2889:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5826 .loc 1 2889 11 is_stmt 0 view .LVU2014 + 5827 009a A36B ldr r3, [r4, #56] +2889:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5828 .loc 1 2889 39 view .LVU2015 + 5829 009c 324A ldr r2, .L387+12 + 5830 009e 1A63 str r2, [r3, #48] +2892:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmatx->XferAbortCallback = NULL; + 5831 .loc 1 2892 7 is_stmt 1 view .LVU2016 +2892:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmatx->XferAbortCallback = NULL; + ARM GAS /tmp/ccE2rRGE.s page 255 + + + 5832 .loc 1 2892 11 is_stmt 0 view .LVU2017 + 5833 00a0 A26B ldr r2, [r4, #56] +2892:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmatx->XferAbortCallback = NULL; + 5834 .loc 1 2892 42 view .LVU2018 + 5835 00a2 0023 movs r3, #0 + 5836 00a4 D362 str r3, [r2, #44] +2893:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5837 .loc 1 2893 7 is_stmt 1 view .LVU2019 +2893:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5838 .loc 1 2893 11 is_stmt 0 view .LVU2020 + 5839 00a6 A26B ldr r2, [r4, #56] +2893:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5840 .loc 1 2893 39 view .LVU2021 + 5841 00a8 5363 str r3, [r2, #52] +2896:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize); + 5842 .loc 1 2896 7 is_stmt 1 view .LVU2022 +2896:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize); + 5843 .loc 1 2896 86 is_stmt 0 view .LVU2023 + 5844 00aa 2268 ldr r2, [r4] +2896:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize); + 5845 .loc 1 2896 23 view .LVU2024 + 5846 00ac 238D ldrh r3, [r4, #40] + 5847 00ae 2832 adds r2, r2, #40 + 5848 00b0 0899 ldr r1, [sp, #32] + 5849 00b2 A06B ldr r0, [r4, #56] + 5850 00b4 FFF7FEFF bl HAL_DMA_Start_IT + 5851 .LVL365: +2914:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5852 .loc 1 2914 5 is_stmt 1 view .LVU2025 +2914:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 5853 .loc 1 2914 8 is_stmt 0 view .LVU2026 + 5854 00b8 0646 mov r6, r0 + 5855 00ba 50B3 cbz r0, .L386 +2938:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 5856 .loc 1 2938 7 is_stmt 1 view .LVU2027 +2938:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 5857 .loc 1 2938 23 is_stmt 0 view .LVU2028 + 5858 00bc 2023 movs r3, #32 + 5859 00be 84F84130 strb r3, [r4, #65] +2939:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5860 .loc 1 2939 7 is_stmt 1 view .LVU2029 +2939:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5861 .loc 1 2939 23 is_stmt 0 view .LVU2030 + 5862 00c2 0022 movs r2, #0 + 5863 00c4 84F84220 strb r2, [r4, #66] +2942:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5864 .loc 1 2942 7 is_stmt 1 view .LVU2031 +2942:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5865 .loc 1 2942 11 is_stmt 0 view .LVU2032 + 5866 00c8 636C ldr r3, [r4, #68] +2942:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5867 .loc 1 2942 23 view .LVU2033 + 5868 00ca 43F01003 orr r3, r3, #16 + 5869 00ce 6364 str r3, [r4, #68] +2945:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5870 .loc 1 2945 7 is_stmt 1 view .LVU2034 +2945:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + ARM GAS /tmp/ccE2rRGE.s page 256 + + + 5871 .loc 1 2945 7 view .LVU2035 + 5872 00d0 84F84020 strb r2, [r4, #64] +2945:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5873 .loc 1 2945 7 view .LVU2036 +2947:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5874 .loc 1 2947 7 view .LVU2037 +2947:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5875 .loc 1 2947 14 is_stmt 0 view .LVU2038 + 5876 00d4 0126 movs r6, #1 + 5877 00d6 38E0 b .L371 + 5878 .LVL366: + 5879 .L372: +2837:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 5880 .loc 1 2837 7 is_stmt 1 view .LVU2039 +2837:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 5881 .loc 1 2837 23 is_stmt 0 view .LVU2040 + 5882 00d8 4FF40073 mov r3, #512 + 5883 00dc 6364 str r3, [r4, #68] +2838:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5884 .loc 1 2838 7 is_stmt 1 view .LVU2041 +2838:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5885 .loc 1 2838 15 is_stmt 0 view .LVU2042 + 5886 00de 0126 movs r6, #1 + 5887 00e0 33E0 b .L371 + 5888 .LVL367: + 5889 .L374: +2869:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_AUTOEND_MODE; + 5890 .loc 1 2869 7 is_stmt 1 view .LVU2043 +2869:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_AUTOEND_MODE; + 5891 .loc 1 2869 28 is_stmt 0 view .LVU2044 + 5892 00e2 638D ldrh r3, [r4, #42] +2869:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_AUTOEND_MODE; + 5893 .loc 1 2869 22 view .LVU2045 + 5894 00e4 2385 strh r3, [r4, #40] @ movhi +2870:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5895 .loc 1 2870 7 is_stmt 1 view .LVU2046 + 5896 .LVL368: +2870:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5897 .loc 1 2870 16 is_stmt 0 view .LVU2047 + 5898 00e6 4FF00078 mov r8, #33554432 + 5899 00ea C6E7 b .L375 + 5900 .LVL369: + 5901 .L385: +2878:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 5902 .loc 1 2878 7 is_stmt 1 view .LVU2048 +2878:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 5903 .loc 1 2878 7 view .LVU2049 + 5904 00ec 0023 movs r3, #0 + 5905 00ee 84F84030 strb r3, [r4, #64] +2878:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 5906 .loc 1 2878 7 view .LVU2050 +2879:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5907 .loc 1 2879 7 view .LVU2051 +2879:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5908 .loc 1 2879 14 is_stmt 0 view .LVU2052 + 5909 00f2 0126 movs r6, #1 + 5910 00f4 29E0 b .L371 + ARM GAS /tmp/ccE2rRGE.s page 257 + + + 5911 .L377: +2902:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 5912 .loc 1 2902 7 is_stmt 1 view .LVU2053 +2902:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 5913 .loc 1 2902 23 is_stmt 0 view .LVU2054 + 5914 00f6 2023 movs r3, #32 + 5915 00f8 84F84130 strb r3, [r4, #65] +2903:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5916 .loc 1 2903 7 is_stmt 1 view .LVU2055 +2903:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5917 .loc 1 2903 23 is_stmt 0 view .LVU2056 + 5918 00fc 0022 movs r2, #0 + 5919 00fe 84F84220 strb r2, [r4, #66] +2906:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5920 .loc 1 2906 7 is_stmt 1 view .LVU2057 +2906:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5921 .loc 1 2906 11 is_stmt 0 view .LVU2058 + 5922 0102 636C ldr r3, [r4, #68] +2906:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5923 .loc 1 2906 23 view .LVU2059 + 5924 0104 43F08003 orr r3, r3, #128 + 5925 0108 6364 str r3, [r4, #68] +2909:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5926 .loc 1 2909 7 is_stmt 1 view .LVU2060 +2909:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5927 .loc 1 2909 7 view .LVU2061 + 5928 010a 84F84020 strb r2, [r4, #64] +2909:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5929 .loc 1 2909 7 view .LVU2062 +2911:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5930 .loc 1 2911 7 view .LVU2063 +2911:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5931 .loc 1 2911 14 is_stmt 0 view .LVU2064 + 5932 010e 0126 movs r6, #1 + 5933 0110 1BE0 b .L371 + 5934 .LVL370: + 5935 .L386: +2918:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5936 .loc 1 2918 7 is_stmt 1 view .LVU2065 + 5937 0112 0027 movs r7, #0 + 5938 0114 0097 str r7, [sp] + 5939 0116 4346 mov r3, r8 + 5940 0118 94F82820 ldrb r2, [r4, #40] @ zero_extendqisi2 + 5941 011c 2946 mov r1, r5 + 5942 011e 2046 mov r0, r4 + 5943 .LVL371: +2918:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5944 .loc 1 2918 7 is_stmt 0 view .LVU2066 + 5945 0120 FFF7FEFF bl I2C_TransferConfig + 5946 .LVL372: +2921:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5947 .loc 1 2921 7 is_stmt 1 view .LVU2067 +2921:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5948 .loc 1 2921 11 is_stmt 0 view .LVU2068 + 5949 0124 638D ldrh r3, [r4, #42] + 5950 0126 9BB2 uxth r3, r3 +2921:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + ARM GAS /tmp/ccE2rRGE.s page 258 + + + 5951 .loc 1 2921 30 view .LVU2069 + 5952 0128 228D ldrh r2, [r4, #40] +2921:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5953 .loc 1 2921 23 view .LVU2070 + 5954 012a 9B1A subs r3, r3, r2 + 5955 012c 9BB2 uxth r3, r3 + 5956 012e 6385 strh r3, [r4, #42] @ movhi +2924:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5957 .loc 1 2924 7 is_stmt 1 view .LVU2071 +2924:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5958 .loc 1 2924 7 view .LVU2072 + 5959 0130 84F84070 strb r7, [r4, #64] +2924:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5960 .loc 1 2924 7 view .LVU2073 +2930:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5961 .loc 1 2930 7 view .LVU2074 + 5962 0134 1021 movs r1, #16 + 5963 0136 2046 mov r0, r4 + 5964 0138 FFF7FEFF bl I2C_Enable_IRQ + 5965 .LVL373: +2933:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5966 .loc 1 2933 7 view .LVU2075 +2933:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5967 .loc 1 2933 11 is_stmt 0 view .LVU2076 + 5968 013c 2268 ldr r2, [r4] +2933:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5969 .loc 1 2933 21 view .LVU2077 + 5970 013e 1368 ldr r3, [r2] +2933:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5971 .loc 1 2933 27 view .LVU2078 + 5972 0140 43F48043 orr r3, r3, #16384 + 5973 0144 1360 str r3, [r2] +2950:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5974 .loc 1 2950 5 is_stmt 1 view .LVU2079 +2950:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5975 .loc 1 2950 12 is_stmt 0 view .LVU2080 + 5976 0146 00E0 b .L371 + 5977 .LVL374: + 5978 .L380: +2954:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5979 .loc 1 2954 12 view .LVU2081 + 5980 0148 0226 movs r6, #2 + 5981 .LVL375: + 5982 .L371: +2956:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5983 .loc 1 2956 1 view .LVU2082 + 5984 014a 3046 mov r0, r6 + 5985 014c 02B0 add sp, sp, #8 + 5986 .cfi_remember_state + 5987 .cfi_def_cfa_offset 24 + 5988 @ sp needed + 5989 014e BDE8F081 pop {r4, r5, r6, r7, r8, pc} + 5990 .LVL376: + 5991 .L381: + 5992 .cfi_restore_state +2843:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 5993 .loc 1 2843 14 view .LVU2083 + ARM GAS /tmp/ccE2rRGE.s page 259 + + + 5994 0152 0226 movs r6, #2 + 5995 0154 F9E7 b .L371 + 5996 .L382: +2847:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 5997 .loc 1 2847 5 view .LVU2084 + 5998 0156 0226 movs r6, #2 + 5999 0158 F7E7 b .L371 + 6000 .L388: + 6001 015a 00BF .align 2 + 6002 .L387: + 6003 015c 0000FFFF .word -65536 + 6004 0160 00000000 .word I2C_Master_ISR_DMA + 6005 0164 00000000 .word I2C_DMAMasterTransmitCplt + 6006 0168 00000000 .word I2C_DMAError + 6007 .cfi_endproc + 6008 .LFE150: + 6010 .section .text.HAL_I2C_Mem_Read_DMA,"ax",%progbits + 6011 .align 1 + 6012 .global HAL_I2C_Mem_Read_DMA + 6013 .syntax unified + 6014 .thumb + 6015 .thumb_func + 6017 HAL_I2C_Mem_Read_DMA: + 6018 .LVL377: + 6019 .LFB151: +2972:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tickstart; + 6020 .loc 1 2972 1 is_stmt 1 view -0 + 6021 .cfi_startproc + 6022 @ args = 8, pretend = 0, frame = 0 + 6023 @ frame_needed = 0, uses_anonymous_args = 0 +2972:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tickstart; + 6024 .loc 1 2972 1 is_stmt 0 view .LVU2086 + 6025 0000 2DE9F041 push {r4, r5, r6, r7, r8, lr} + 6026 .cfi_def_cfa_offset 24 + 6027 .cfi_offset 4, -24 + 6028 .cfi_offset 5, -20 + 6029 .cfi_offset 6, -16 + 6030 .cfi_offset 7, -12 + 6031 .cfi_offset 8, -8 + 6032 .cfi_offset 14, -4 + 6033 0004 82B0 sub sp, sp, #8 + 6034 .cfi_def_cfa_offset 32 + 6035 0006 0446 mov r4, r0 + 6036 0008 BDF82480 ldrh r8, [sp, #36] +2973:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t xfermode; + 6037 .loc 1 2973 3 is_stmt 1 view .LVU2087 +2974:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef dmaxferstatus; + 6038 .loc 1 2974 3 view .LVU2088 +2975:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6039 .loc 1 2975 3 view .LVU2089 +2978:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6040 .loc 1 2978 3 view .LVU2090 +2980:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6041 .loc 1 2980 3 view .LVU2091 +2980:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6042 .loc 1 2980 11 is_stmt 0 view .LVU2092 + 6043 000c 90F84100 ldrb r0, [r0, #65] @ zero_extendqisi2 + ARM GAS /tmp/ccE2rRGE.s page 260 + + + 6044 .LVL378: +2980:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6045 .loc 1 2980 11 view .LVU2093 + 6046 0010 C0B2 uxtb r0, r0 +2980:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6047 .loc 1 2980 6 view .LVU2094 + 6048 0012 2028 cmp r0, #32 + 6049 0014 40F09980 bne .L399 + 6050 0018 0D46 mov r5, r1 + 6051 001a 1746 mov r7, r2 + 6052 001c 1E46 mov r6, r3 +2982:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6053 .loc 1 2982 5 is_stmt 1 view .LVU2095 +2982:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6054 .loc 1 2982 8 is_stmt 0 view .LVU2096 + 6055 001e 089B ldr r3, [sp, #32] + 6056 .LVL379: +2982:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6057 .loc 1 2982 8 view .LVU2097 + 6058 0020 002B cmp r3, #0 + 6059 0022 59D0 beq .L391 +2982:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6060 .loc 1 2982 25 discriminator 1 view .LVU2098 + 6061 0024 B8F1000F cmp r8, #0 + 6062 0028 56D0 beq .L391 +2988:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6063 .loc 1 2988 5 is_stmt 1 view .LVU2099 +2988:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6064 .loc 1 2988 9 is_stmt 0 view .LVU2100 + 6065 002a 2368 ldr r3, [r4] + 6066 002c 9B69 ldr r3, [r3, #24] +2988:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6067 .loc 1 2988 8 view .LVU2101 + 6068 002e 13F4004F tst r3, #32768 + 6069 0032 40F08F80 bne .L400 +2994:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6070 .loc 1 2994 5 is_stmt 1 view .LVU2102 +2994:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6071 .loc 1 2994 5 view .LVU2103 + 6072 0036 94F84030 ldrb r3, [r4, #64] @ zero_extendqisi2 + 6073 003a 012B cmp r3, #1 + 6074 003c 00F08C80 beq .L401 +2994:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6075 .loc 1 2994 5 discriminator 2 view .LVU2104 + 6076 0040 0123 movs r3, #1 + 6077 0042 84F84030 strb r3, [r4, #64] +2994:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6078 .loc 1 2994 5 discriminator 2 view .LVU2105 +2997:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6079 .loc 1 2997 5 discriminator 2 view .LVU2106 +2997:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6080 .loc 1 2997 17 is_stmt 0 discriminator 2 view .LVU2107 + 6081 0046 FFF7FEFF bl HAL_GetTick + 6082 .LVL380: +2999:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MEM; + 6083 .loc 1 2999 5 is_stmt 1 discriminator 2 view .LVU2108 +2999:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MEM; + ARM GAS /tmp/ccE2rRGE.s page 261 + + + 6084 .loc 1 2999 23 is_stmt 0 discriminator 2 view .LVU2109 + 6085 004a 2223 movs r3, #34 + 6086 004c 84F84130 strb r3, [r4, #65] +3000:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 6087 .loc 1 3000 5 is_stmt 1 discriminator 2 view .LVU2110 +3000:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 6088 .loc 1 3000 23 is_stmt 0 discriminator 2 view .LVU2111 + 6089 0050 4023 movs r3, #64 + 6090 0052 84F84230 strb r3, [r4, #66] +3001:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6091 .loc 1 3001 5 is_stmt 1 discriminator 2 view .LVU2112 +3001:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6092 .loc 1 3001 23 is_stmt 0 discriminator 2 view .LVU2113 + 6093 0056 0023 movs r3, #0 + 6094 0058 6364 str r3, [r4, #68] +3004:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 6095 .loc 1 3004 5 is_stmt 1 discriminator 2 view .LVU2114 +3004:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 6096 .loc 1 3004 23 is_stmt 0 discriminator 2 view .LVU2115 + 6097 005a 089B ldr r3, [sp, #32] + 6098 005c 6362 str r3, [r4, #36] +3005:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; + 6099 .loc 1 3005 5 is_stmt 1 discriminator 2 view .LVU2116 +3005:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; + 6100 .loc 1 3005 23 is_stmt 0 discriminator 2 view .LVU2117 + 6101 005e A4F82A80 strh r8, [r4, #42] @ movhi +3006:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_DMA; + 6102 .loc 1 3006 5 is_stmt 1 discriminator 2 view .LVU2118 +3006:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_DMA; + 6103 .loc 1 3006 23 is_stmt 0 discriminator 2 view .LVU2119 + 6104 0062 3E4B ldr r3, .L406 + 6105 0064 E362 str r3, [r4, #44] +3007:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6106 .loc 1 3007 5 is_stmt 1 discriminator 2 view .LVU2120 +3007:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6107 .loc 1 3007 23 is_stmt 0 discriminator 2 view .LVU2121 + 6108 0066 3E4B ldr r3, .L406+4 + 6109 0068 6363 str r3, [r4, #52] +3009:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6110 .loc 1 3009 5 is_stmt 1 discriminator 2 view .LVU2122 +3009:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6111 .loc 1 3009 13 is_stmt 0 discriminator 2 view .LVU2123 + 6112 006a 638D ldrh r3, [r4, #42] + 6113 006c 9BB2 uxth r3, r3 +3009:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6114 .loc 1 3009 8 discriminator 2 view .LVU2124 + 6115 006e FF2B cmp r3, #255 + 6116 0070 37D9 bls .L393 +3011:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_RELOAD_MODE; + 6117 .loc 1 3011 7 is_stmt 1 view .LVU2125 +3011:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_RELOAD_MODE; + 6118 .loc 1 3011 22 is_stmt 0 view .LVU2126 + 6119 0072 FF23 movs r3, #255 + 6120 0074 2385 strh r3, [r4, #40] @ movhi +3012:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6121 .loc 1 3012 7 is_stmt 1 view .LVU2127 + 6122 .LVL381: + ARM GAS /tmp/ccE2rRGE.s page 262 + + +3012:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6123 .loc 1 3012 16 is_stmt 0 view .LVU2128 + 6124 0076 4FF08078 mov r8, #16777216 + 6125 .LVL382: + 6126 .L394: +3021:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6127 .loc 1 3021 5 is_stmt 1 view .LVU2129 +3021:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6128 .loc 1 3021 9 is_stmt 0 view .LVU2130 + 6129 007a 0190 str r0, [sp, #4] + 6130 007c 1923 movs r3, #25 + 6131 007e 0093 str r3, [sp] + 6132 0080 3346 mov r3, r6 + 6133 0082 3A46 mov r2, r7 + 6134 0084 2946 mov r1, r5 + 6135 0086 2046 mov r0, r4 + 6136 .LVL383: +3021:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6137 .loc 1 3021 9 view .LVU2131 + 6138 0088 FFF7FEFF bl I2C_RequestMemoryRead + 6139 .LVL384: +3021:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6140 .loc 1 3021 8 view .LVU2132 + 6141 008c 0028 cmp r0, #0 + 6142 008e 2DD1 bne .L404 +3028:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6143 .loc 1 3028 5 is_stmt 1 view .LVU2133 +3028:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6144 .loc 1 3028 13 is_stmt 0 view .LVU2134 + 6145 0090 E36B ldr r3, [r4, #60] +3028:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6146 .loc 1 3028 8 view .LVU2135 + 6147 0092 002B cmp r3, #0 + 6148 0094 2FD0 beq .L396 +3031:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6149 .loc 1 3031 7 is_stmt 1 view .LVU2136 +3031:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6150 .loc 1 3031 38 is_stmt 0 view .LVU2137 + 6151 0096 334A ldr r2, .L406+8 + 6152 0098 9A62 str r2, [r3, #40] +3034:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6153 .loc 1 3034 7 is_stmt 1 view .LVU2138 +3034:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6154 .loc 1 3034 11 is_stmt 0 view .LVU2139 + 6155 009a E36B ldr r3, [r4, #60] +3034:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6156 .loc 1 3034 39 view .LVU2140 + 6157 009c 324A ldr r2, .L406+12 + 6158 009e 1A63 str r2, [r3, #48] +3037:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmarx->XferAbortCallback = NULL; + 6159 .loc 1 3037 7 is_stmt 1 view .LVU2141 +3037:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmarx->XferAbortCallback = NULL; + 6160 .loc 1 3037 11 is_stmt 0 view .LVU2142 + 6161 00a0 E26B ldr r2, [r4, #60] +3037:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmarx->XferAbortCallback = NULL; + 6162 .loc 1 3037 42 view .LVU2143 + 6163 00a2 0023 movs r3, #0 + ARM GAS /tmp/ccE2rRGE.s page 263 + + + 6164 00a4 D362 str r3, [r2, #44] +3038:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6165 .loc 1 3038 7 is_stmt 1 view .LVU2144 +3038:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6166 .loc 1 3038 11 is_stmt 0 view .LVU2145 + 6167 00a6 E26B ldr r2, [r4, #60] +3038:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6168 .loc 1 3038 39 view .LVU2146 + 6169 00a8 5363 str r3, [r2, #52] +3041:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize); + 6170 .loc 1 3041 7 is_stmt 1 view .LVU2147 +3041:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize); + 6171 .loc 1 3041 69 is_stmt 0 view .LVU2148 + 6172 00aa 2168 ldr r1, [r4] +3041:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize); + 6173 .loc 1 3041 23 view .LVU2149 + 6174 00ac 238D ldrh r3, [r4, #40] + 6175 00ae 089A ldr r2, [sp, #32] + 6176 00b0 2431 adds r1, r1, #36 + 6177 00b2 E06B ldr r0, [r4, #60] + 6178 00b4 FFF7FEFF bl HAL_DMA_Start_IT + 6179 .LVL385: +3059:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6180 .loc 1 3059 5 is_stmt 1 view .LVU2150 +3059:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6181 .loc 1 3059 8 is_stmt 0 view .LVU2151 + 6182 00b8 0646 mov r6, r0 + 6183 00ba 50B3 cbz r0, .L405 +3082:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 6184 .loc 1 3082 7 is_stmt 1 view .LVU2152 +3082:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 6185 .loc 1 3082 23 is_stmt 0 view .LVU2153 + 6186 00bc 2023 movs r3, #32 + 6187 00be 84F84130 strb r3, [r4, #65] +3083:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6188 .loc 1 3083 7 is_stmt 1 view .LVU2154 +3083:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6189 .loc 1 3083 23 is_stmt 0 view .LVU2155 + 6190 00c2 0022 movs r2, #0 + 6191 00c4 84F84220 strb r2, [r4, #66] +3086:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6192 .loc 1 3086 7 is_stmt 1 view .LVU2156 +3086:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6193 .loc 1 3086 11 is_stmt 0 view .LVU2157 + 6194 00c8 636C ldr r3, [r4, #68] +3086:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6195 .loc 1 3086 23 view .LVU2158 + 6196 00ca 43F01003 orr r3, r3, #16 + 6197 00ce 6364 str r3, [r4, #68] +3089:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6198 .loc 1 3089 7 is_stmt 1 view .LVU2159 +3089:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6199 .loc 1 3089 7 view .LVU2160 + 6200 00d0 84F84020 strb r2, [r4, #64] +3089:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6201 .loc 1 3089 7 view .LVU2161 +3091:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + ARM GAS /tmp/ccE2rRGE.s page 264 + + + 6202 .loc 1 3091 7 view .LVU2162 +3091:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6203 .loc 1 3091 14 is_stmt 0 view .LVU2163 + 6204 00d4 0126 movs r6, #1 + 6205 00d6 39E0 b .L390 + 6206 .LVL386: + 6207 .L391: +2984:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 6208 .loc 1 2984 7 is_stmt 1 view .LVU2164 +2984:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 6209 .loc 1 2984 23 is_stmt 0 view .LVU2165 + 6210 00d8 4FF40073 mov r3, #512 + 6211 00dc 6364 str r3, [r4, #68] +2985:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6212 .loc 1 2985 7 is_stmt 1 view .LVU2166 +2985:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6213 .loc 1 2985 15 is_stmt 0 view .LVU2167 + 6214 00de 0126 movs r6, #1 + 6215 00e0 34E0 b .L390 + 6216 .LVL387: + 6217 .L393: +3016:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_AUTOEND_MODE; + 6218 .loc 1 3016 7 is_stmt 1 view .LVU2168 +3016:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_AUTOEND_MODE; + 6219 .loc 1 3016 28 is_stmt 0 view .LVU2169 + 6220 00e2 638D ldrh r3, [r4, #42] +3016:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_AUTOEND_MODE; + 6221 .loc 1 3016 22 view .LVU2170 + 6222 00e4 2385 strh r3, [r4, #40] @ movhi +3017:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6223 .loc 1 3017 7 is_stmt 1 view .LVU2171 + 6224 .LVL388: +3017:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6225 .loc 1 3017 16 is_stmt 0 view .LVU2172 + 6226 00e6 4FF00078 mov r8, #33554432 + 6227 00ea C6E7 b .L394 + 6228 .LVL389: + 6229 .L404: +3024:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 6230 .loc 1 3024 7 is_stmt 1 view .LVU2173 +3024:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 6231 .loc 1 3024 7 view .LVU2174 + 6232 00ec 0023 movs r3, #0 + 6233 00ee 84F84030 strb r3, [r4, #64] +3024:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 6234 .loc 1 3024 7 view .LVU2175 +3025:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6235 .loc 1 3025 7 view .LVU2176 +3025:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6236 .loc 1 3025 14 is_stmt 0 view .LVU2177 + 6237 00f2 0126 movs r6, #1 + 6238 00f4 2AE0 b .L390 + 6239 .L396: +3047:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 6240 .loc 1 3047 7 is_stmt 1 view .LVU2178 +3047:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 6241 .loc 1 3047 23 is_stmt 0 view .LVU2179 + ARM GAS /tmp/ccE2rRGE.s page 265 + + + 6242 00f6 2023 movs r3, #32 + 6243 00f8 84F84130 strb r3, [r4, #65] +3048:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6244 .loc 1 3048 7 is_stmt 1 view .LVU2180 +3048:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6245 .loc 1 3048 23 is_stmt 0 view .LVU2181 + 6246 00fc 0022 movs r2, #0 + 6247 00fe 84F84220 strb r2, [r4, #66] +3051:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6248 .loc 1 3051 7 is_stmt 1 view .LVU2182 +3051:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6249 .loc 1 3051 11 is_stmt 0 view .LVU2183 + 6250 0102 636C ldr r3, [r4, #68] +3051:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6251 .loc 1 3051 23 view .LVU2184 + 6252 0104 43F08003 orr r3, r3, #128 + 6253 0108 6364 str r3, [r4, #68] +3054:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6254 .loc 1 3054 7 is_stmt 1 view .LVU2185 +3054:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6255 .loc 1 3054 7 view .LVU2186 + 6256 010a 84F84020 strb r2, [r4, #64] +3054:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6257 .loc 1 3054 7 view .LVU2187 +3056:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6258 .loc 1 3056 7 view .LVU2188 +3056:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6259 .loc 1 3056 14 is_stmt 0 view .LVU2189 + 6260 010e 0126 movs r6, #1 + 6261 0110 1CE0 b .L390 + 6262 .LVL390: + 6263 .L405: +3062:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6264 .loc 1 3062 7 is_stmt 1 view .LVU2190 + 6265 0112 164B ldr r3, .L406+16 + 6266 0114 0093 str r3, [sp] + 6267 0116 4346 mov r3, r8 + 6268 0118 94F82820 ldrb r2, [r4, #40] @ zero_extendqisi2 + 6269 011c 2946 mov r1, r5 + 6270 011e 2046 mov r0, r4 + 6271 .LVL391: +3062:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6272 .loc 1 3062 7 is_stmt 0 view .LVU2191 + 6273 0120 FFF7FEFF bl I2C_TransferConfig + 6274 .LVL392: +3065:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6275 .loc 1 3065 7 is_stmt 1 view .LVU2192 +3065:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6276 .loc 1 3065 11 is_stmt 0 view .LVU2193 + 6277 0124 638D ldrh r3, [r4, #42] + 6278 0126 9BB2 uxth r3, r3 +3065:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6279 .loc 1 3065 30 view .LVU2194 + 6280 0128 228D ldrh r2, [r4, #40] +3065:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6281 .loc 1 3065 23 view .LVU2195 + 6282 012a 9B1A subs r3, r3, r2 + ARM GAS /tmp/ccE2rRGE.s page 266 + + + 6283 012c 9BB2 uxth r3, r3 + 6284 012e 6385 strh r3, [r4, #42] @ movhi +3068:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6285 .loc 1 3068 7 is_stmt 1 view .LVU2196 +3068:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6286 .loc 1 3068 7 view .LVU2197 + 6287 0130 0023 movs r3, #0 + 6288 0132 84F84030 strb r3, [r4, #64] +3068:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6289 .loc 1 3068 7 view .LVU2198 +3074:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6290 .loc 1 3074 7 view .LVU2199 + 6291 0136 1021 movs r1, #16 + 6292 0138 2046 mov r0, r4 + 6293 013a FFF7FEFF bl I2C_Enable_IRQ + 6294 .LVL393: +3077:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6295 .loc 1 3077 7 view .LVU2200 +3077:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6296 .loc 1 3077 11 is_stmt 0 view .LVU2201 + 6297 013e 2268 ldr r2, [r4] +3077:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6298 .loc 1 3077 21 view .LVU2202 + 6299 0140 1368 ldr r3, [r2] +3077:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6300 .loc 1 3077 27 view .LVU2203 + 6301 0142 43F40043 orr r3, r3, #32768 + 6302 0146 1360 str r3, [r2] +3094:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6303 .loc 1 3094 5 is_stmt 1 view .LVU2204 +3094:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6304 .loc 1 3094 12 is_stmt 0 view .LVU2205 + 6305 0148 00E0 b .L390 + 6306 .LVL394: + 6307 .L399: +3098:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6308 .loc 1 3098 12 view .LVU2206 + 6309 014a 0226 movs r6, #2 + 6310 .LVL395: + 6311 .L390: +3100:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6312 .loc 1 3100 1 view .LVU2207 + 6313 014c 3046 mov r0, r6 + 6314 014e 02B0 add sp, sp, #8 + 6315 .cfi_remember_state + 6316 .cfi_def_cfa_offset 24 + 6317 @ sp needed + 6318 0150 BDE8F081 pop {r4, r5, r6, r7, r8, pc} + 6319 .LVL396: + 6320 .L400: + 6321 .cfi_restore_state +2990:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6322 .loc 1 2990 14 view .LVU2208 + 6323 0154 0226 movs r6, #2 + 6324 0156 F9E7 b .L390 + 6325 .L401: +2994:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + ARM GAS /tmp/ccE2rRGE.s page 267 + + + 6326 .loc 1 2994 5 view .LVU2209 + 6327 0158 0226 movs r6, #2 + 6328 015a F7E7 b .L390 + 6329 .L407: + 6330 .align 2 + 6331 .L406: + 6332 015c 0000FFFF .word -65536 + 6333 0160 00000000 .word I2C_Master_ISR_DMA + 6334 0164 00000000 .word I2C_DMAMasterReceiveCplt + 6335 0168 00000000 .word I2C_DMAError + 6336 016c 00240080 .word -2147474432 + 6337 .cfi_endproc + 6338 .LFE151: + 6340 .section .text.HAL_I2C_IsDeviceReady,"ax",%progbits + 6341 .align 1 + 6342 .global HAL_I2C_IsDeviceReady + 6343 .syntax unified + 6344 .thumb + 6345 .thumb_func + 6347 HAL_I2C_IsDeviceReady: + 6348 .LVL397: + 6349 .LFB152: +3115:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tickstart; + 6350 .loc 1 3115 1 is_stmt 1 view -0 + 6351 .cfi_startproc + 6352 @ args = 0, pretend = 0, frame = 8 + 6353 @ frame_needed = 0, uses_anonymous_args = 0 +3115:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tickstart; + 6354 .loc 1 3115 1 is_stmt 0 view .LVU2211 + 6355 0000 2DE9F043 push {r4, r5, r6, r7, r8, r9, lr} + 6356 .cfi_def_cfa_offset 28 + 6357 .cfi_offset 4, -28 + 6358 .cfi_offset 5, -24 + 6359 .cfi_offset 6, -20 + 6360 .cfi_offset 7, -16 + 6361 .cfi_offset 8, -12 + 6362 .cfi_offset 9, -8 + 6363 .cfi_offset 14, -4 + 6364 0004 85B0 sub sp, sp, #20 + 6365 .cfi_def_cfa_offset 48 + 6366 0006 1D46 mov r5, r3 +3116:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6367 .loc 1 3116 3 is_stmt 1 view .LVU2212 +3118:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6368 .loc 1 3118 3 view .LVU2213 +3118:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6369 .loc 1 3118 17 is_stmt 0 view .LVU2214 + 6370 0008 0023 movs r3, #0 + 6371 .LVL398: +3118:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6372 .loc 1 3118 17 view .LVU2215 + 6373 000a 0393 str r3, [sp, #12] +3120:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** FlagStatus tmp2; + 6374 .loc 1 3120 3 is_stmt 1 view .LVU2216 +3121:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6375 .loc 1 3121 3 view .LVU2217 +3123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + ARM GAS /tmp/ccE2rRGE.s page 268 + + + 6376 .loc 1 3123 3 view .LVU2218 +3123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6377 .loc 1 3123 11 is_stmt 0 view .LVU2219 + 6378 000c 90F84130 ldrb r3, [r0, #65] @ zero_extendqisi2 + 6379 0010 DBB2 uxtb r3, r3 +3123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6380 .loc 1 3123 6 view .LVU2220 + 6381 0012 202B cmp r3, #32 + 6382 0014 40F09E80 bne .L420 + 6383 0018 0646 mov r6, r0 + 6384 001a 8946 mov r9, r1 + 6385 001c 9046 mov r8, r2 +3125:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6386 .loc 1 3125 5 is_stmt 1 view .LVU2221 +3125:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6387 .loc 1 3125 9 is_stmt 0 view .LVU2222 + 6388 001e 0368 ldr r3, [r0] + 6389 0020 9B69 ldr r3, [r3, #24] +3125:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6390 .loc 1 3125 8 view .LVU2223 + 6391 0022 13F4004F tst r3, #32768 + 6392 0026 40F09780 bne .L421 +3131:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6393 .loc 1 3131 5 is_stmt 1 view .LVU2224 +3131:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6394 .loc 1 3131 5 view .LVU2225 + 6395 002a 90F84030 ldrb r3, [r0, #64] @ zero_extendqisi2 + 6396 002e 012B cmp r3, #1 + 6397 0030 00F09480 beq .L422 +3131:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6398 .loc 1 3131 5 discriminator 2 view .LVU2226 + 6399 0034 0123 movs r3, #1 + 6400 0036 80F84030 strb r3, [r0, #64] +3131:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6401 .loc 1 3131 5 discriminator 2 view .LVU2227 +3133:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 6402 .loc 1 3133 5 discriminator 2 view .LVU2228 +3133:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 6403 .loc 1 3133 17 is_stmt 0 discriminator 2 view .LVU2229 + 6404 003a 2423 movs r3, #36 + 6405 003c 80F84130 strb r3, [r0, #65] +3134:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6406 .loc 1 3134 5 is_stmt 1 discriminator 2 view .LVU2230 +3134:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6407 .loc 1 3134 21 is_stmt 0 discriminator 2 view .LVU2231 + 6408 0040 0023 movs r3, #0 + 6409 0042 4364 str r3, [r0, #68] + 6410 0044 44E0 b .L419 + 6411 .LVL399: + 6412 .L430: +3139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6413 .loc 1 3139 29 discriminator 1 view .LVU2232 + 6414 0046 C9F30903 ubfx r3, r9, #0, #10 + 6415 004a 43F00073 orr r3, r3, #33554432 + 6416 004e 43F40053 orr r3, r3, #8192 + 6417 0052 44E0 b .L411 + 6418 .LVL400: + ARM GAS /tmp/ccE2rRGE.s page 269 + + + 6419 .L413: +3167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** tmp2 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF); + 6420 .loc 1 3167 9 is_stmt 1 view .LVU2233 +3167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** tmp2 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF); + 6421 .loc 1 3167 16 is_stmt 0 view .LVU2234 + 6422 0054 3368 ldr r3, [r6] + 6423 0056 9C69 ldr r4, [r3, #24] + 6424 .LVL401: +3167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** tmp2 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF); + 6425 .loc 1 3167 16 view .LVU2235 + 6426 0058 C4F34014 ubfx r4, r4, #5, #1 + 6427 .LVL402: +3168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6428 .loc 1 3168 9 is_stmt 1 view .LVU2236 +3168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6429 .loc 1 3168 16 is_stmt 0 view .LVU2237 + 6430 005c 9B69 ldr r3, [r3, #24] + 6431 005e C3F30013 ubfx r3, r3, #4, #1 + 6432 .LVL403: + 6433 .L412: +3148:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6434 .loc 1 3148 30 is_stmt 1 view .LVU2238 + 6435 0062 C4B9 cbnz r4, .L415 +3148:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6436 .loc 1 3148 30 is_stmt 0 discriminator 1 view .LVU2239 + 6437 0064 BBB9 cbnz r3, .L415 +3150:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6438 .loc 1 3150 9 is_stmt 1 view .LVU2240 +3150:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6439 .loc 1 3150 12 is_stmt 0 view .LVU2241 + 6440 0066 B5F1FF3F cmp r5, #-1 + 6441 006a F3D0 beq .L413 +3152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6442 .loc 1 3152 11 is_stmt 1 view .LVU2242 +3152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6443 .loc 1 3152 17 is_stmt 0 view .LVU2243 + 6444 006c FFF7FEFF bl HAL_GetTick + 6445 .LVL404: +3152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6446 .loc 1 3152 31 view .LVU2244 + 6447 0070 C01B subs r0, r0, r7 +3152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6448 .loc 1 3152 14 view .LVU2245 + 6449 0072 A842 cmp r0, r5 + 6450 0074 01D8 bhi .L414 +3152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6451 .loc 1 3152 55 discriminator 1 view .LVU2246 + 6452 0076 002D cmp r5, #0 + 6453 0078 ECD1 bne .L413 + 6454 .L414: +3155:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6455 .loc 1 3155 13 is_stmt 1 view .LVU2247 +3155:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6456 .loc 1 3155 25 is_stmt 0 view .LVU2248 + 6457 007a 2023 movs r3, #32 + 6458 007c 86F84130 strb r3, [r6, #65] +3158:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + ARM GAS /tmp/ccE2rRGE.s page 270 + + + 6459 .loc 1 3158 13 is_stmt 1 view .LVU2249 +3158:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6460 .loc 1 3158 17 is_stmt 0 view .LVU2250 + 6461 0080 736C ldr r3, [r6, #68] +3158:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6462 .loc 1 3158 29 view .LVU2251 + 6463 0082 43F02003 orr r3, r3, #32 + 6464 0086 7364 str r3, [r6, #68] +3161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6465 .loc 1 3161 13 is_stmt 1 view .LVU2252 +3161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6466 .loc 1 3161 13 view .LVU2253 + 6467 0088 0023 movs r3, #0 + 6468 008a 86F84030 strb r3, [r6, #64] +3161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6469 .loc 1 3161 13 view .LVU2254 +3163:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6470 .loc 1 3163 13 view .LVU2255 +3163:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6471 .loc 1 3163 20 is_stmt 0 view .LVU2256 + 6472 008e 0120 movs r0, #1 + 6473 .LVL405: + 6474 .L409: +3241:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6475 .loc 1 3241 1 view .LVU2257 + 6476 0090 05B0 add sp, sp, #20 + 6477 .cfi_remember_state + 6478 .cfi_def_cfa_offset 28 + 6479 @ sp needed + 6480 0092 BDE8F083 pop {r4, r5, r6, r7, r8, r9, pc} + 6481 .LVL406: + 6482 .L415: + 6483 .cfi_restore_state +3172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6484 .loc 1 3172 7 is_stmt 1 view .LVU2258 +3172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6485 .loc 1 3172 11 is_stmt 0 view .LVU2259 + 6486 0096 3368 ldr r3, [r6] + 6487 .LVL407: +3172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6488 .loc 1 3172 11 view .LVU2260 + 6489 0098 9B69 ldr r3, [r3, #24] +3172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6490 .loc 1 3172 10 view .LVU2261 + 6491 009a 13F0100F tst r3, #16 + 6492 009e 2BD0 beq .L427 +3194:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6493 .loc 1 3194 9 is_stmt 1 view .LVU2262 +3194:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6494 .loc 1 3194 13 is_stmt 0 view .LVU2263 + 6495 00a0 0097 str r7, [sp] + 6496 00a2 2B46 mov r3, r5 + 6497 00a4 0022 movs r2, #0 + 6498 00a6 2021 movs r1, #32 + 6499 00a8 3046 mov r0, r6 + 6500 00aa FFF7FEFF bl I2C_WaitOnFlagUntilTimeout + 6501 .LVL408: + ARM GAS /tmp/ccE2rRGE.s page 271 + + +3194:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6502 .loc 1 3194 12 view .LVU2264 + 6503 00ae 0028 cmp r0, #0 + 6504 00b0 58D1 bne .L424 +3200:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6505 .loc 1 3200 9 is_stmt 1 view .LVU2265 + 6506 00b2 3368 ldr r3, [r6] + 6507 00b4 1022 movs r2, #16 + 6508 00b6 DA61 str r2, [r3, #28] +3203:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6509 .loc 1 3203 9 view .LVU2266 + 6510 00b8 3368 ldr r3, [r6] + 6511 00ba 2022 movs r2, #32 + 6512 00bc DA61 str r2, [r3, #28] +3207:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6513 .loc 1 3207 7 view .LVU2267 +3207:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6514 .loc 1 3207 22 is_stmt 0 view .LVU2268 + 6515 00be 039B ldr r3, [sp, #12] +3207:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6516 .loc 1 3207 10 view .LVU2269 + 6517 00c0 4345 cmp r3, r8 + 6518 00c2 2AD0 beq .L428 + 6519 .L418: +3223:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } while (I2C_Trials < Trials); + 6520 .loc 1 3223 7 is_stmt 1 view .LVU2270 +3223:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } while (I2C_Trials < Trials); + 6521 .loc 1 3223 17 is_stmt 0 view .LVU2271 + 6522 00c4 039B ldr r3, [sp, #12] + 6523 00c6 0133 adds r3, r3, #1 + 6524 00c8 0393 str r3, [sp, #12] +3224:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6525 .loc 1 3224 25 is_stmt 1 view .LVU2272 + 6526 00ca 039B ldr r3, [sp, #12] + 6527 00cc 4345 cmp r3, r8 + 6528 00ce 35D2 bcs .L429 + 6529 .LVL409: + 6530 .L419: +3136:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6531 .loc 1 3136 5 view .LVU2273 +3139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6532 .loc 1 3139 7 view .LVU2274 +3139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6533 .loc 1 3139 29 is_stmt 0 view .LVU2275 + 6534 00d0 F368 ldr r3, [r6, #12] + 6535 00d2 012B cmp r3, #1 + 6536 00d4 B7D0 beq .L430 +3139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6537 .loc 1 3139 29 discriminator 2 view .LVU2276 + 6538 00d6 C9F30903 ubfx r3, r9, #0, #10 + 6539 00da 43F42053 orr r3, r3, #10240 + 6540 .L411: +3139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6541 .loc 1 3139 11 discriminator 4 view .LVU2277 + 6542 00de 3268 ldr r2, [r6] +3139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6543 .loc 1 3139 27 discriminator 4 view .LVU2278 + ARM GAS /tmp/ccE2rRGE.s page 272 + + + 6544 00e0 5360 str r3, [r2, #4] +3143:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6545 .loc 1 3143 7 is_stmt 1 discriminator 4 view .LVU2279 +3143:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6546 .loc 1 3143 19 is_stmt 0 discriminator 4 view .LVU2280 + 6547 00e2 FFF7FEFF bl HAL_GetTick + 6548 .LVL410: + 6549 00e6 0746 mov r7, r0 + 6550 .LVL411: +3145:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** tmp2 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF); + 6551 .loc 1 3145 7 is_stmt 1 discriminator 4 view .LVU2281 +3145:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** tmp2 = __HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF); + 6552 .loc 1 3145 14 is_stmt 0 discriminator 4 view .LVU2282 + 6553 00e8 3368 ldr r3, [r6] + 6554 00ea 9C69 ldr r4, [r3, #24] + 6555 00ec C4F34014 ubfx r4, r4, #5, #1 + 6556 .LVL412: +3146:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6557 .loc 1 3146 7 is_stmt 1 discriminator 4 view .LVU2283 +3146:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6558 .loc 1 3146 14 is_stmt 0 discriminator 4 view .LVU2284 + 6559 00f0 9B69 ldr r3, [r3, #24] + 6560 00f2 C3F30013 ubfx r3, r3, #4, #1 + 6561 .LVL413: +3148:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6562 .loc 1 3148 7 is_stmt 1 discriminator 4 view .LVU2285 +3148:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6563 .loc 1 3148 13 is_stmt 0 discriminator 4 view .LVU2286 + 6564 00f6 B4E7 b .L412 + 6565 .LVL414: + 6566 .L427: +3175:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6567 .loc 1 3175 9 is_stmt 1 view .LVU2287 +3175:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6568 .loc 1 3175 13 is_stmt 0 view .LVU2288 + 6569 00f8 0097 str r7, [sp] + 6570 00fa 2B46 mov r3, r5 + 6571 00fc 0022 movs r2, #0 + 6572 00fe 2021 movs r1, #32 + 6573 0100 3046 mov r0, r6 + 6574 0102 FFF7FEFF bl I2C_WaitOnFlagUntilTimeout + 6575 .LVL415: +3175:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6576 .loc 1 3175 12 view .LVU2289 + 6577 0106 58BB cbnz r0, .L423 +3181:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6578 .loc 1 3181 9 is_stmt 1 view .LVU2290 + 6579 0108 3268 ldr r2, [r6] + 6580 010a 2023 movs r3, #32 + 6581 010c D361 str r3, [r2, #28] +3184:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6582 .loc 1 3184 9 view .LVU2291 +3184:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6583 .loc 1 3184 21 is_stmt 0 view .LVU2292 + 6584 010e 86F84130 strb r3, [r6, #65] +3187:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6585 .loc 1 3187 9 is_stmt 1 view .LVU2293 + ARM GAS /tmp/ccE2rRGE.s page 273 + + +3187:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6586 .loc 1 3187 9 view .LVU2294 + 6587 0112 0023 movs r3, #0 + 6588 0114 86F84030 strb r3, [r6, #64] +3187:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6589 .loc 1 3187 9 view .LVU2295 +3189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6590 .loc 1 3189 9 view .LVU2296 +3189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6591 .loc 1 3189 16 is_stmt 0 view .LVU2297 + 6592 0118 BAE7 b .L409 + 6593 .L428: +3210:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6594 .loc 1 3210 9 is_stmt 1 view .LVU2298 +3210:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6595 .loc 1 3210 13 is_stmt 0 view .LVU2299 + 6596 011a 3268 ldr r2, [r6] +3210:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6597 .loc 1 3210 23 view .LVU2300 + 6598 011c 5368 ldr r3, [r2, #4] +3210:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6599 .loc 1 3210 29 view .LVU2301 + 6600 011e 43F48043 orr r3, r3, #16384 + 6601 0122 5360 str r3, [r2, #4] +3213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6602 .loc 1 3213 9 is_stmt 1 view .LVU2302 +3213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6603 .loc 1 3213 13 is_stmt 0 view .LVU2303 + 6604 0124 0097 str r7, [sp] + 6605 0126 2B46 mov r3, r5 + 6606 0128 0022 movs r2, #0 + 6607 012a 2021 movs r1, #32 + 6608 012c 3046 mov r0, r6 + 6609 012e FFF7FEFF bl I2C_WaitOnFlagUntilTimeout + 6610 .LVL416: +3213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6611 .loc 1 3213 12 view .LVU2304 + 6612 0132 C8B9 cbnz r0, .L425 +3219:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6613 .loc 1 3219 9 is_stmt 1 view .LVU2305 + 6614 0134 3368 ldr r3, [r6] + 6615 0136 2022 movs r2, #32 + 6616 0138 DA61 str r2, [r3, #28] + 6617 013a C3E7 b .L418 + 6618 .L429: +3227:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6619 .loc 1 3227 5 view .LVU2306 +3227:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6620 .loc 1 3227 17 is_stmt 0 view .LVU2307 + 6621 013c 2023 movs r3, #32 + 6622 013e 86F84130 strb r3, [r6, #65] +3230:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6623 .loc 1 3230 5 is_stmt 1 view .LVU2308 +3230:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6624 .loc 1 3230 9 is_stmt 0 view .LVU2309 + 6625 0142 736C ldr r3, [r6, #68] +3230:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + ARM GAS /tmp/ccE2rRGE.s page 274 + + + 6626 .loc 1 3230 21 view .LVU2310 + 6627 0144 43F02003 orr r3, r3, #32 + 6628 0148 7364 str r3, [r6, #68] +3233:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6629 .loc 1 3233 5 is_stmt 1 view .LVU2311 +3233:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6630 .loc 1 3233 5 view .LVU2312 + 6631 014a 0023 movs r3, #0 + 6632 014c 86F84030 strb r3, [r6, #64] +3233:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6633 .loc 1 3233 5 view .LVU2313 +3235:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6634 .loc 1 3235 5 view .LVU2314 +3235:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6635 .loc 1 3235 12 is_stmt 0 view .LVU2315 + 6636 0150 0120 movs r0, #1 + 6637 0152 9DE7 b .L409 + 6638 .LVL417: + 6639 .L420: +3239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6640 .loc 1 3239 12 view .LVU2316 + 6641 0154 0220 movs r0, #2 + 6642 .LVL418: +3239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6643 .loc 1 3239 12 view .LVU2317 + 6644 0156 9BE7 b .L409 + 6645 .LVL419: + 6646 .L421: +3127:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6647 .loc 1 3127 14 view .LVU2318 + 6648 0158 0220 movs r0, #2 + 6649 .LVL420: +3127:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6650 .loc 1 3127 14 view .LVU2319 + 6651 015a 99E7 b .L409 + 6652 .LVL421: + 6653 .L422: +3131:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6654 .loc 1 3131 5 view .LVU2320 + 6655 015c 0220 movs r0, #2 + 6656 .LVL422: +3131:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6657 .loc 1 3131 5 view .LVU2321 + 6658 015e 97E7 b .L409 + 6659 .LVL423: + 6660 .L423: +3177:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6661 .loc 1 3177 18 view .LVU2322 + 6662 0160 0120 movs r0, #1 + 6663 0162 95E7 b .L409 + 6664 .L424: +3196:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6665 .loc 1 3196 18 view .LVU2323 + 6666 0164 0120 movs r0, #1 + 6667 0166 93E7 b .L409 + 6668 .L425: +3215:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + ARM GAS /tmp/ccE2rRGE.s page 275 + + + 6669 .loc 1 3215 18 view .LVU2324 + 6670 0168 0120 movs r0, #1 + 6671 016a 91E7 b .L409 + 6672 .cfi_endproc + 6673 .LFE152: + 6675 .section .text.HAL_I2C_Master_Seq_Transmit_IT,"ax",%progbits + 6676 .align 1 + 6677 .global HAL_I2C_Master_Seq_Transmit_IT + 6678 .syntax unified + 6679 .thumb + 6680 .thumb_func + 6682 HAL_I2C_Master_Seq_Transmit_IT: + 6683 .LVL424: + 6684 .LFB153: +3257:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t xfermode; + 6685 .loc 1 3257 1 is_stmt 1 view -0 + 6686 .cfi_startproc + 6687 @ args = 4, pretend = 0, frame = 0 + 6688 @ frame_needed = 0, uses_anonymous_args = 0 +3257:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t xfermode; + 6689 .loc 1 3257 1 is_stmt 0 view .LVU2326 + 6690 0000 70B5 push {r4, r5, r6, lr} + 6691 .cfi_def_cfa_offset 16 + 6692 .cfi_offset 4, -16 + 6693 .cfi_offset 5, -12 + 6694 .cfi_offset 6, -8 + 6695 .cfi_offset 14, -4 + 6696 0002 82B0 sub sp, sp, #8 + 6697 .cfi_def_cfa_offset 24 + 6698 0004 0446 mov r4, r0 +3258:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t xferrequest = I2C_GENERATE_START_WRITE; + 6699 .loc 1 3258 3 is_stmt 1 view .LVU2327 +3259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6700 .loc 1 3259 3 view .LVU2328 + 6701 .LVL425: +3262:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6702 .loc 1 3262 3 view .LVU2329 +3264:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6703 .loc 1 3264 3 view .LVU2330 +3264:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6704 .loc 1 3264 11 is_stmt 0 view .LVU2331 + 6705 0006 90F84100 ldrb r0, [r0, #65] @ zero_extendqisi2 + 6706 .LVL426: +3264:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6707 .loc 1 3264 11 view .LVU2332 + 6708 000a C0B2 uxtb r0, r0 +3264:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6709 .loc 1 3264 6 view .LVU2333 + 6710 000c 2028 cmp r0, #32 + 6711 000e 49D1 bne .L437 + 6712 0010 0D46 mov r5, r1 +3267:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6713 .loc 1 3267 5 is_stmt 1 view .LVU2334 +3267:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6714 .loc 1 3267 5 view .LVU2335 + 6715 0012 94F84010 ldrb r1, [r4, #64] @ zero_extendqisi2 + 6716 .LVL427: + ARM GAS /tmp/ccE2rRGE.s page 276 + + +3267:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6717 .loc 1 3267 5 is_stmt 0 view .LVU2336 + 6718 0016 0129 cmp r1, #1 + 6719 0018 46D0 beq .L438 +3267:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6720 .loc 1 3267 5 is_stmt 1 discriminator 2 view .LVU2337 + 6721 001a 0121 movs r1, #1 + 6722 001c 84F84010 strb r1, [r4, #64] +3267:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6723 .loc 1 3267 5 discriminator 2 view .LVU2338 +3269:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MASTER; + 6724 .loc 1 3269 5 discriminator 2 view .LVU2339 +3269:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MASTER; + 6725 .loc 1 3269 21 is_stmt 0 discriminator 2 view .LVU2340 + 6726 0020 2121 movs r1, #33 + 6727 0022 84F84110 strb r1, [r4, #65] +3270:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 6728 .loc 1 3270 5 is_stmt 1 discriminator 2 view .LVU2341 +3270:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 6729 .loc 1 3270 21 is_stmt 0 discriminator 2 view .LVU2342 + 6730 0026 1021 movs r1, #16 + 6731 0028 84F84210 strb r1, [r4, #66] +3271:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6732 .loc 1 3271 5 is_stmt 1 discriminator 2 view .LVU2343 +3271:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6733 .loc 1 3271 21 is_stmt 0 discriminator 2 view .LVU2344 + 6734 002c 0021 movs r1, #0 + 6735 002e 6164 str r1, [r4, #68] +3274:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 6736 .loc 1 3274 5 is_stmt 1 discriminator 2 view .LVU2345 +3274:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 6737 .loc 1 3274 23 is_stmt 0 discriminator 2 view .LVU2346 + 6738 0030 6262 str r2, [r4, #36] +3275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = XferOptions; + 6739 .loc 1 3275 5 is_stmt 1 discriminator 2 view .LVU2347 +3275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = XferOptions; + 6740 .loc 1 3275 23 is_stmt 0 discriminator 2 view .LVU2348 + 6741 0032 6385 strh r3, [r4, #42] @ movhi +3276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_IT; + 6742 .loc 1 3276 5 is_stmt 1 discriminator 2 view .LVU2349 +3276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_IT; + 6743 .loc 1 3276 23 is_stmt 0 discriminator 2 view .LVU2350 + 6744 0034 069B ldr r3, [sp, #24] + 6745 .LVL428: +3276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_IT; + 6746 .loc 1 3276 23 discriminator 2 view .LVU2351 + 6747 0036 E362 str r3, [r4, #44] + 6748 .LVL429: +3277:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6749 .loc 1 3277 5 is_stmt 1 discriminator 2 view .LVU2352 +3277:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6750 .loc 1 3277 23 is_stmt 0 discriminator 2 view .LVU2353 + 6751 0038 1C4B ldr r3, .L442 + 6752 003a 6363 str r3, [r4, #52] +3280:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6753 .loc 1 3280 5 is_stmt 1 discriminator 2 view .LVU2354 +3280:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + ARM GAS /tmp/ccE2rRGE.s page 277 + + + 6754 .loc 1 3280 13 is_stmt 0 discriminator 2 view .LVU2355 + 6755 003c 638D ldrh r3, [r4, #42] + 6756 003e 9BB2 uxth r3, r3 +3280:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6757 .loc 1 3280 8 discriminator 2 view .LVU2356 + 6758 0040 FF2B cmp r3, #255 + 6759 0042 0ED9 bls .L433 +3282:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_RELOAD_MODE; + 6760 .loc 1 3282 7 is_stmt 1 view .LVU2357 +3282:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_RELOAD_MODE; + 6761 .loc 1 3282 22 is_stmt 0 view .LVU2358 + 6762 0044 FF23 movs r3, #255 + 6763 0046 2385 strh r3, [r4, #40] @ movhi +3283:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6764 .loc 1 3283 7 is_stmt 1 view .LVU2359 + 6765 .LVL430: +3283:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6766 .loc 1 3283 16 is_stmt 0 view .LVU2360 + 6767 0048 4FF08076 mov r6, #16777216 + 6768 .LVL431: + 6769 .L434: +3294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 0)) + 6770 .loc 1 3294 5 is_stmt 1 view .LVU2361 +3294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 0)) + 6771 .loc 1 3294 14 is_stmt 0 view .LVU2362 + 6772 004c 236B ldr r3, [r4, #48] +3294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 0)) + 6773 .loc 1 3294 8 view .LVU2363 + 6774 004e 112B cmp r3, #17 + 6775 0050 0BD1 bne .L435 +3295:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6776 .loc 1 3295 10 view .LVU2364 + 6777 0052 069B ldr r3, [sp, #24] + 6778 0054 AA2B cmp r3, #170 + 6779 0056 08D0 beq .L435 +3295:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6780 .loc 1 3295 10 discriminator 2 view .LVU2365 + 6781 0058 B3F52A4F cmp r3, #43520 + 6782 005c 05D0 beq .L435 +3297:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6783 .loc 1 3297 19 view .LVU2366 + 6784 005e 0023 movs r3, #0 + 6785 0060 0CE0 b .L436 + 6786 .LVL432: + 6787 .L433: +3287:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = hi2c->XferOptions; + 6788 .loc 1 3287 7 is_stmt 1 view .LVU2367 +3287:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = hi2c->XferOptions; + 6789 .loc 1 3287 28 is_stmt 0 view .LVU2368 + 6790 0062 638D ldrh r3, [r4, #42] +3287:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = hi2c->XferOptions; + 6791 .loc 1 3287 22 view .LVU2369 + 6792 0064 2385 strh r3, [r4, #40] @ movhi +3288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6793 .loc 1 3288 7 is_stmt 1 view .LVU2370 +3288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6794 .loc 1 3288 16 is_stmt 0 view .LVU2371 + ARM GAS /tmp/ccE2rRGE.s page 278 + + + 6795 0066 E66A ldr r6, [r4, #44] + 6796 .LVL433: +3288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6797 .loc 1 3288 16 view .LVU2372 + 6798 0068 F0E7 b .L434 + 6799 .L435: +3302:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6800 .loc 1 3302 7 is_stmt 1 view .LVU2373 + 6801 006a 2046 mov r0, r4 + 6802 006c FFF7FEFF bl I2C_ConvertOtherXferOptions + 6803 .LVL434: +3305:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6804 .loc 1 3305 7 view .LVU2374 +3305:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6805 .loc 1 3305 15 is_stmt 0 view .LVU2375 + 6806 0070 638D ldrh r3, [r4, #42] + 6807 0072 9BB2 uxth r3, r3 +3305:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6808 .loc 1 3305 10 view .LVU2376 + 6809 0074 FF2B cmp r3, #255 + 6810 0076 13D8 bhi .L440 +3307:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6811 .loc 1 3307 9 is_stmt 1 view .LVU2377 +3307:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6812 .loc 1 3307 18 is_stmt 0 view .LVU2378 + 6813 0078 E66A ldr r6, [r4, #44] + 6814 .LVL435: +3259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6815 .loc 1 3259 12 view .LVU2379 + 6816 007a 0D4B ldr r3, .L442+4 + 6817 .L436: + 6818 .LVL436: +3312:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6819 .loc 1 3312 5 is_stmt 1 view .LVU2380 + 6820 007c 0093 str r3, [sp] + 6821 007e 3346 mov r3, r6 + 6822 .LVL437: +3312:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6823 .loc 1 3312 5 is_stmt 0 view .LVU2381 + 6824 0080 94F82820 ldrb r2, [r4, #40] @ zero_extendqisi2 + 6825 0084 2946 mov r1, r5 + 6826 0086 2046 mov r0, r4 + 6827 0088 FFF7FEFF bl I2C_TransferConfig + 6828 .LVL438: +3315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6829 .loc 1 3315 5 is_stmt 1 view .LVU2382 +3315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6830 .loc 1 3315 5 view .LVU2383 + 6831 008c 0025 movs r5, #0 + 6832 008e 84F84050 strb r5, [r4, #64] +3315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6833 .loc 1 3315 5 view .LVU2384 +3320:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6834 .loc 1 3320 5 view .LVU2385 + 6835 0092 0121 movs r1, #1 + 6836 0094 2046 mov r0, r4 + 6837 0096 FFF7FEFF bl I2C_Enable_IRQ + ARM GAS /tmp/ccE2rRGE.s page 279 + + + 6838 .LVL439: +3322:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6839 .loc 1 3322 5 view .LVU2386 +3322:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6840 .loc 1 3322 12 is_stmt 0 view .LVU2387 + 6841 009a 2846 mov r0, r5 + 6842 .LVL440: + 6843 .L432: +3328:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6844 .loc 1 3328 1 view .LVU2388 + 6845 009c 02B0 add sp, sp, #8 + 6846 .cfi_remember_state + 6847 .cfi_def_cfa_offset 16 + 6848 @ sp needed + 6849 009e 70BD pop {r4, r5, r6, pc} + 6850 .LVL441: + 6851 .L440: + 6852 .cfi_restore_state +3259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6853 .loc 1 3259 12 view .LVU2389 + 6854 00a0 034B ldr r3, .L442+4 + 6855 00a2 EBE7 b .L436 + 6856 .LVL442: + 6857 .L437: +3326:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6858 .loc 1 3326 12 view .LVU2390 + 6859 00a4 0220 movs r0, #2 + 6860 00a6 F9E7 b .L432 + 6861 .LVL443: + 6862 .L438: +3267:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6863 .loc 1 3267 5 view .LVU2391 + 6864 00a8 0220 movs r0, #2 + 6865 00aa F7E7 b .L432 + 6866 .L443: + 6867 .align 2 + 6868 .L442: + 6869 00ac 00000000 .word I2C_Master_ISR_IT + 6870 00b0 00200080 .word -2147475456 + 6871 .cfi_endproc + 6872 .LFE153: + 6874 .section .text.HAL_I2C_Master_Seq_Transmit_DMA,"ax",%progbits + 6875 .align 1 + 6876 .global HAL_I2C_Master_Seq_Transmit_DMA + 6877 .syntax unified + 6878 .thumb + 6879 .thumb_func + 6881 HAL_I2C_Master_Seq_Transmit_DMA: + 6882 .LVL444: + 6883 .LFB154: +3344:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t xfermode; + 6884 .loc 1 3344 1 is_stmt 1 view -0 + 6885 .cfi_startproc + 6886 @ args = 4, pretend = 0, frame = 0 + 6887 @ frame_needed = 0, uses_anonymous_args = 0 +3344:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t xfermode; + 6888 .loc 1 3344 1 is_stmt 0 view .LVU2393 + ARM GAS /tmp/ccE2rRGE.s page 280 + + + 6889 0000 2DE9F041 push {r4, r5, r6, r7, r8, lr} + 6890 .cfi_def_cfa_offset 24 + 6891 .cfi_offset 4, -24 + 6892 .cfi_offset 5, -20 + 6893 .cfi_offset 6, -16 + 6894 .cfi_offset 7, -12 + 6895 .cfi_offset 8, -8 + 6896 .cfi_offset 14, -4 + 6897 0004 82B0 sub sp, sp, #8 + 6898 .cfi_def_cfa_offset 32 + 6899 0006 0446 mov r4, r0 + 6900 0008 1546 mov r5, r2 + 6901 000a 089A ldr r2, [sp, #32] + 6902 .LVL445: +3345:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t xferrequest = I2C_GENERATE_START_WRITE; + 6903 .loc 1 3345 3 is_stmt 1 view .LVU2394 +3346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef dmaxferstatus; + 6904 .loc 1 3346 3 view .LVU2395 +3347:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6905 .loc 1 3347 3 view .LVU2396 +3350:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6906 .loc 1 3350 3 view .LVU2397 +3352:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6907 .loc 1 3352 3 view .LVU2398 +3352:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6908 .loc 1 3352 11 is_stmt 0 view .LVU2399 + 6909 000c 90F84100 ldrb r0, [r0, #65] @ zero_extendqisi2 + 6910 .LVL446: +3352:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6911 .loc 1 3352 11 view .LVU2400 + 6912 0010 C0B2 uxtb r0, r0 +3352:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6913 .loc 1 3352 6 view .LVU2401 + 6914 0012 2028 cmp r0, #32 + 6915 0014 40F09D80 bne .L455 + 6916 0018 0E46 mov r6, r1 +3355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6917 .loc 1 3355 5 is_stmt 1 view .LVU2402 +3355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6918 .loc 1 3355 5 view .LVU2403 + 6919 001a 94F84010 ldrb r1, [r4, #64] @ zero_extendqisi2 + 6920 .LVL447: +3355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6921 .loc 1 3355 5 is_stmt 0 view .LVU2404 + 6922 001e 0129 cmp r1, #1 + 6923 0020 00F09B80 beq .L456 +3355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6924 .loc 1 3355 5 is_stmt 1 discriminator 2 view .LVU2405 + 6925 0024 0121 movs r1, #1 + 6926 0026 84F84010 strb r1, [r4, #64] +3355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6927 .loc 1 3355 5 discriminator 2 view .LVU2406 +3357:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MASTER; + 6928 .loc 1 3357 5 discriminator 2 view .LVU2407 +3357:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MASTER; + 6929 .loc 1 3357 21 is_stmt 0 discriminator 2 view .LVU2408 + 6930 002a 2121 movs r1, #33 + ARM GAS /tmp/ccE2rRGE.s page 281 + + + 6931 002c 84F84110 strb r1, [r4, #65] +3358:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 6932 .loc 1 3358 5 is_stmt 1 discriminator 2 view .LVU2409 +3358:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 6933 .loc 1 3358 21 is_stmt 0 discriminator 2 view .LVU2410 + 6934 0030 1021 movs r1, #16 + 6935 0032 84F84210 strb r1, [r4, #66] +3359:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6936 .loc 1 3359 5 is_stmt 1 discriminator 2 view .LVU2411 +3359:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6937 .loc 1 3359 21 is_stmt 0 discriminator 2 view .LVU2412 + 6938 0036 0021 movs r1, #0 + 6939 0038 6164 str r1, [r4, #68] +3362:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 6940 .loc 1 3362 5 is_stmt 1 discriminator 2 view .LVU2413 +3362:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 6941 .loc 1 3362 23 is_stmt 0 discriminator 2 view .LVU2414 + 6942 003a 6562 str r5, [r4, #36] +3363:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = XferOptions; + 6943 .loc 1 3363 5 is_stmt 1 discriminator 2 view .LVU2415 +3363:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = XferOptions; + 6944 .loc 1 3363 23 is_stmt 0 discriminator 2 view .LVU2416 + 6945 003c 6385 strh r3, [r4, #42] @ movhi +3364:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_DMA; + 6946 .loc 1 3364 5 is_stmt 1 discriminator 2 view .LVU2417 +3364:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_DMA; + 6947 .loc 1 3364 23 is_stmt 0 discriminator 2 view .LVU2418 + 6948 003e E262 str r2, [r4, #44] +3365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6949 .loc 1 3365 5 is_stmt 1 discriminator 2 view .LVU2419 +3365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6950 .loc 1 3365 23 is_stmt 0 discriminator 2 view .LVU2420 + 6951 0040 474B ldr r3, .L462 + 6952 .LVL448: +3365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 6953 .loc 1 3365 23 discriminator 2 view .LVU2421 + 6954 0042 6363 str r3, [r4, #52] +3368:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6955 .loc 1 3368 5 is_stmt 1 discriminator 2 view .LVU2422 +3368:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6956 .loc 1 3368 13 is_stmt 0 discriminator 2 view .LVU2423 + 6957 0044 638D ldrh r3, [r4, #42] + 6958 0046 9BB2 uxth r3, r3 +3368:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6959 .loc 1 3368 8 discriminator 2 view .LVU2424 + 6960 0048 FF2B cmp r3, #255 + 6961 004a 0ED9 bls .L446 +3370:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_RELOAD_MODE; + 6962 .loc 1 3370 7 is_stmt 1 view .LVU2425 +3370:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_RELOAD_MODE; + 6963 .loc 1 3370 22 is_stmt 0 view .LVU2426 + 6964 004c FF23 movs r3, #255 + 6965 004e 2385 strh r3, [r4, #40] @ movhi +3371:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6966 .loc 1 3371 7 is_stmt 1 view .LVU2427 + 6967 .LVL449: +3371:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + ARM GAS /tmp/ccE2rRGE.s page 282 + + + 6968 .loc 1 3371 16 is_stmt 0 view .LVU2428 + 6969 0050 4FF08077 mov r7, #16777216 + 6970 .LVL450: + 6971 .L447: +3382:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 0)) + 6972 .loc 1 3382 5 is_stmt 1 view .LVU2429 +3382:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 0)) + 6973 .loc 1 3382 14 is_stmt 0 view .LVU2430 + 6974 0054 236B ldr r3, [r4, #48] +3382:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 0)) + 6975 .loc 1 3382 8 view .LVU2431 + 6976 0056 112B cmp r3, #17 + 6977 0058 0BD1 bne .L448 +3383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6978 .loc 1 3383 10 view .LVU2432 + 6979 005a AA2A cmp r2, #170 + 6980 005c 09D0 beq .L448 +3383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 6981 .loc 1 3383 10 discriminator 2 view .LVU2433 + 6982 005e B2F52A4F cmp r2, #43520 + 6983 0062 06D0 beq .L448 +3385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6984 .loc 1 3385 19 view .LVU2434 + 6985 0064 4FF00008 mov r8, #0 + 6986 0068 0DE0 b .L449 + 6987 .LVL451: + 6988 .L446: +3375:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = hi2c->XferOptions; + 6989 .loc 1 3375 7 is_stmt 1 view .LVU2435 +3375:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = hi2c->XferOptions; + 6990 .loc 1 3375 28 is_stmt 0 view .LVU2436 + 6991 006a 638D ldrh r3, [r4, #42] +3375:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = hi2c->XferOptions; + 6992 .loc 1 3375 22 view .LVU2437 + 6993 006c 2385 strh r3, [r4, #40] @ movhi +3376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6994 .loc 1 3376 7 is_stmt 1 view .LVU2438 +3376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6995 .loc 1 3376 16 is_stmt 0 view .LVU2439 + 6996 006e E76A ldr r7, [r4, #44] + 6997 .LVL452: +3376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 6998 .loc 1 3376 16 view .LVU2440 + 6999 0070 F0E7 b .L447 + 7000 .L448: +3390:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7001 .loc 1 3390 7 is_stmt 1 view .LVU2441 + 7002 0072 2046 mov r0, r4 + 7003 0074 FFF7FEFF bl I2C_ConvertOtherXferOptions + 7004 .LVL453: +3393:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7005 .loc 1 3393 7 view .LVU2442 +3393:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7006 .loc 1 3393 15 is_stmt 0 view .LVU2443 + 7007 0078 638D ldrh r3, [r4, #42] + 7008 007a 9BB2 uxth r3, r3 +3393:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + ARM GAS /tmp/ccE2rRGE.s page 283 + + + 7009 .loc 1 3393 10 view .LVU2444 + 7010 007c FF2B cmp r3, #255 + 7011 007e 27D8 bhi .L458 +3395:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7012 .loc 1 3395 9 is_stmt 1 view .LVU2445 +3395:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7013 .loc 1 3395 18 is_stmt 0 view .LVU2446 + 7014 0080 E76A ldr r7, [r4, #44] + 7015 .LVL454: +3346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef dmaxferstatus; + 7016 .loc 1 3346 12 view .LVU2447 + 7017 0082 DFF8EC80 ldr r8, .L462+16 + 7018 .L449: + 7019 .LVL455: +3399:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7020 .loc 1 3399 5 is_stmt 1 view .LVU2448 +3399:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7021 .loc 1 3399 13 is_stmt 0 view .LVU2449 + 7022 0086 228D ldrh r2, [r4, #40] +3399:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7023 .loc 1 3399 8 view .LVU2450 + 7024 0088 002A cmp r2, #0 + 7025 008a 4ED0 beq .L450 +3401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7026 .loc 1 3401 7 is_stmt 1 view .LVU2451 +3401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7027 .loc 1 3401 15 is_stmt 0 view .LVU2452 + 7028 008c A36B ldr r3, [r4, #56] +3401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7029 .loc 1 3401 10 view .LVU2453 + 7030 008e 13B3 cbz r3, .L451 +3404:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7031 .loc 1 3404 9 is_stmt 1 view .LVU2454 +3404:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7032 .loc 1 3404 40 is_stmt 0 view .LVU2455 + 7033 0090 344A ldr r2, .L462+4 + 7034 0092 9A62 str r2, [r3, #40] +3407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7035 .loc 1 3407 9 is_stmt 1 view .LVU2456 +3407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7036 .loc 1 3407 13 is_stmt 0 view .LVU2457 + 7037 0094 A36B ldr r3, [r4, #56] +3407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7038 .loc 1 3407 41 view .LVU2458 + 7039 0096 344A ldr r2, .L462+8 + 7040 0098 1A63 str r2, [r3, #48] +3410:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmatx->XferAbortCallback = NULL; + 7041 .loc 1 3410 9 is_stmt 1 view .LVU2459 +3410:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmatx->XferAbortCallback = NULL; + 7042 .loc 1 3410 13 is_stmt 0 view .LVU2460 + 7043 009a A26B ldr r2, [r4, #56] +3410:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmatx->XferAbortCallback = NULL; + 7044 .loc 1 3410 44 view .LVU2461 + 7045 009c 0023 movs r3, #0 + 7046 009e D362 str r3, [r2, #44] +3411:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7047 .loc 1 3411 9 is_stmt 1 view .LVU2462 + ARM GAS /tmp/ccE2rRGE.s page 284 + + +3411:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7048 .loc 1 3411 13 is_stmt 0 view .LVU2463 + 7049 00a0 A26B ldr r2, [r4, #56] +3411:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7050 .loc 1 3411 41 view .LVU2464 + 7051 00a2 5363 str r3, [r2, #52] +3414:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize); + 7052 .loc 1 3414 9 is_stmt 1 view .LVU2465 +3414:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize); + 7053 .loc 1 3414 88 is_stmt 0 view .LVU2466 + 7054 00a4 2268 ldr r2, [r4] +3414:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize); + 7055 .loc 1 3414 25 view .LVU2467 + 7056 00a6 238D ldrh r3, [r4, #40] + 7057 00a8 2832 adds r2, r2, #40 + 7058 00aa 2946 mov r1, r5 + 7059 00ac A06B ldr r0, [r4, #56] + 7060 00ae FFF7FEFF bl HAL_DMA_Start_IT + 7061 .LVL456: +3432:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7062 .loc 1 3432 7 is_stmt 1 view .LVU2468 +3432:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7063 .loc 1 3432 10 is_stmt 0 view .LVU2469 + 7064 00b2 F0B1 cbz r0, .L461 +3455:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 7065 .loc 1 3455 9 is_stmt 1 view .LVU2470 +3455:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 7066 .loc 1 3455 25 is_stmt 0 view .LVU2471 + 7067 00b4 2023 movs r3, #32 + 7068 00b6 84F84130 strb r3, [r4, #65] +3456:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7069 .loc 1 3456 9 is_stmt 1 view .LVU2472 +3456:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7070 .loc 1 3456 25 is_stmt 0 view .LVU2473 + 7071 00ba 0022 movs r2, #0 + 7072 00bc 84F84220 strb r2, [r4, #66] +3459:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7073 .loc 1 3459 9 is_stmt 1 view .LVU2474 +3459:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7074 .loc 1 3459 13 is_stmt 0 view .LVU2475 + 7075 00c0 636C ldr r3, [r4, #68] +3459:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7076 .loc 1 3459 25 view .LVU2476 + 7077 00c2 43F01003 orr r3, r3, #16 + 7078 00c6 6364 str r3, [r4, #68] +3462:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7079 .loc 1 3462 9 is_stmt 1 view .LVU2477 +3462:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7080 .loc 1 3462 9 view .LVU2478 + 7081 00c8 84F84020 strb r2, [r4, #64] +3462:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7082 .loc 1 3462 9 view .LVU2479 +3464:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7083 .loc 1 3464 9 view .LVU2480 +3464:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7084 .loc 1 3464 16 is_stmt 0 view .LVU2481 + 7085 00cc 0120 movs r0, #1 + ARM GAS /tmp/ccE2rRGE.s page 285 + + + 7086 .LVL457: +3464:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7087 .loc 1 3464 16 view .LVU2482 + 7088 00ce 41E0 b .L445 + 7089 .LVL458: + 7090 .L458: +3346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef dmaxferstatus; + 7091 .loc 1 3346 12 view .LVU2483 + 7092 00d0 DFF89C80 ldr r8, .L462+16 + 7093 00d4 D7E7 b .L449 + 7094 .LVL459: + 7095 .L451: +3420:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 7096 .loc 1 3420 9 is_stmt 1 view .LVU2484 +3420:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 7097 .loc 1 3420 25 is_stmt 0 view .LVU2485 + 7098 00d6 2023 movs r3, #32 + 7099 00d8 84F84130 strb r3, [r4, #65] +3421:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7100 .loc 1 3421 9 is_stmt 1 view .LVU2486 +3421:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7101 .loc 1 3421 25 is_stmt 0 view .LVU2487 + 7102 00dc 0022 movs r2, #0 + 7103 00de 84F84220 strb r2, [r4, #66] +3424:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7104 .loc 1 3424 9 is_stmt 1 view .LVU2488 +3424:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7105 .loc 1 3424 13 is_stmt 0 view .LVU2489 + 7106 00e2 636C ldr r3, [r4, #68] +3424:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7107 .loc 1 3424 25 view .LVU2490 + 7108 00e4 43F08003 orr r3, r3, #128 + 7109 00e8 6364 str r3, [r4, #68] +3427:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7110 .loc 1 3427 9 is_stmt 1 view .LVU2491 +3427:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7111 .loc 1 3427 9 view .LVU2492 + 7112 00ea 84F84020 strb r2, [r4, #64] +3427:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7113 .loc 1 3427 9 view .LVU2493 +3429:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7114 .loc 1 3429 9 view .LVU2494 +3429:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7115 .loc 1 3429 16 is_stmt 0 view .LVU2495 + 7116 00ee 0120 movs r0, #1 + 7117 00f0 30E0 b .L445 + 7118 .LVL460: + 7119 .L461: +3435:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7120 .loc 1 3435 9 is_stmt 1 view .LVU2496 + 7121 00f2 CDF80080 str r8, [sp] + 7122 00f6 3B46 mov r3, r7 + 7123 00f8 94F82820 ldrb r2, [r4, #40] @ zero_extendqisi2 + 7124 00fc 3146 mov r1, r6 + 7125 00fe 2046 mov r0, r4 + 7126 .LVL461: +3435:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + ARM GAS /tmp/ccE2rRGE.s page 286 + + + 7127 .loc 1 3435 9 is_stmt 0 view .LVU2497 + 7128 0100 FFF7FEFF bl I2C_TransferConfig + 7129 .LVL462: +3438:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7130 .loc 1 3438 9 is_stmt 1 view .LVU2498 +3438:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7131 .loc 1 3438 13 is_stmt 0 view .LVU2499 + 7132 0104 638D ldrh r3, [r4, #42] + 7133 0106 9BB2 uxth r3, r3 +3438:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7134 .loc 1 3438 32 view .LVU2500 + 7135 0108 228D ldrh r2, [r4, #40] +3438:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7136 .loc 1 3438 25 view .LVU2501 + 7137 010a 9B1A subs r3, r3, r2 + 7138 010c 9BB2 uxth r3, r3 + 7139 010e 6385 strh r3, [r4, #42] @ movhi +3441:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7140 .loc 1 3441 9 is_stmt 1 view .LVU2502 +3441:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7141 .loc 1 3441 9 view .LVU2503 + 7142 0110 0023 movs r3, #0 + 7143 0112 84F84030 strb r3, [r4, #64] +3441:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7144 .loc 1 3441 9 view .LVU2504 +3447:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7145 .loc 1 3447 9 view .LVU2505 + 7146 0116 1021 movs r1, #16 + 7147 0118 2046 mov r0, r4 + 7148 011a FFF7FEFF bl I2C_Enable_IRQ + 7149 .LVL463: +3450:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7150 .loc 1 3450 9 view .LVU2506 +3450:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7151 .loc 1 3450 13 is_stmt 0 view .LVU2507 + 7152 011e 2268 ldr r2, [r4] +3450:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7153 .loc 1 3450 23 view .LVU2508 + 7154 0120 1368 ldr r3, [r2] +3450:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7155 .loc 1 3450 29 view .LVU2509 + 7156 0122 43F48043 orr r3, r3, #16384 + 7157 0126 1360 str r3, [r2] + 7158 0128 11E0 b .L454 + 7159 .LVL464: + 7160 .L450: +3470:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7161 .loc 1 3470 7 is_stmt 1 view .LVU2510 +3470:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7162 .loc 1 3470 21 is_stmt 0 view .LVU2511 + 7163 012a 104B ldr r3, .L462+12 + 7164 012c 6363 str r3, [r4, #52] +3474:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_GENERATE_START_WRITE); + 7165 .loc 1 3474 7 is_stmt 1 view .LVU2512 + 7166 012e 104B ldr r3, .L462+16 + 7167 0130 0093 str r3, [sp] + 7168 0132 4FF00073 mov r3, #33554432 + ARM GAS /tmp/ccE2rRGE.s page 287 + + + 7169 0136 D2B2 uxtb r2, r2 + 7170 0138 3146 mov r1, r6 + 7171 013a 2046 mov r0, r4 + 7172 013c FFF7FEFF bl I2C_TransferConfig + 7173 .LVL465: +3478:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7174 .loc 1 3478 7 view .LVU2513 +3478:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7175 .loc 1 3478 7 view .LVU2514 + 7176 0140 0023 movs r3, #0 + 7177 0142 84F84030 strb r3, [r4, #64] +3478:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7178 .loc 1 3478 7 view .LVU2515 +3487:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7179 .loc 1 3487 7 view .LVU2516 + 7180 0146 0121 movs r1, #1 + 7181 0148 2046 mov r0, r4 + 7182 014a FFF7FEFF bl I2C_Enable_IRQ + 7183 .LVL466: + 7184 .L454: +3490:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7185 .loc 1 3490 5 view .LVU2517 +3490:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7186 .loc 1 3490 12 is_stmt 0 view .LVU2518 + 7187 014e 0020 movs r0, #0 + 7188 0150 00E0 b .L445 + 7189 .LVL467: + 7190 .L455: +3494:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7191 .loc 1 3494 12 view .LVU2519 + 7192 0152 0220 movs r0, #2 + 7193 .LVL468: + 7194 .L445: +3496:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7195 .loc 1 3496 1 view .LVU2520 + 7196 0154 02B0 add sp, sp, #8 + 7197 .cfi_remember_state + 7198 .cfi_def_cfa_offset 24 + 7199 @ sp needed + 7200 0156 BDE8F081 pop {r4, r5, r6, r7, r8, pc} + 7201 .LVL469: + 7202 .L456: + 7203 .cfi_restore_state +3355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7204 .loc 1 3355 5 view .LVU2521 + 7205 015a 0220 movs r0, #2 + 7206 015c FAE7 b .L445 + 7207 .L463: + 7208 015e 00BF .align 2 + 7209 .L462: + 7210 0160 00000000 .word I2C_Master_ISR_DMA + 7211 0164 00000000 .word I2C_DMAMasterTransmitCplt + 7212 0168 00000000 .word I2C_DMAError + 7213 016c 00000000 .word I2C_Master_ISR_IT + 7214 0170 00200080 .word -2147475456 + 7215 .cfi_endproc + 7216 .LFE154: + ARM GAS /tmp/ccE2rRGE.s page 288 + + + 7218 .section .text.HAL_I2C_Master_Seq_Receive_IT,"ax",%progbits + 7219 .align 1 + 7220 .global HAL_I2C_Master_Seq_Receive_IT + 7221 .syntax unified + 7222 .thumb + 7223 .thumb_func + 7225 HAL_I2C_Master_Seq_Receive_IT: + 7226 .LVL470: + 7227 .LFB155: +3512:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t xfermode; + 7228 .loc 1 3512 1 is_stmt 1 view -0 + 7229 .cfi_startproc + 7230 @ args = 4, pretend = 0, frame = 0 + 7231 @ frame_needed = 0, uses_anonymous_args = 0 +3512:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t xfermode; + 7232 .loc 1 3512 1 is_stmt 0 view .LVU2523 + 7233 0000 70B5 push {r4, r5, r6, lr} + 7234 .cfi_def_cfa_offset 16 + 7235 .cfi_offset 4, -16 + 7236 .cfi_offset 5, -12 + 7237 .cfi_offset 6, -8 + 7238 .cfi_offset 14, -4 + 7239 0002 82B0 sub sp, sp, #8 + 7240 .cfi_def_cfa_offset 24 + 7241 0004 0446 mov r4, r0 +3513:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t xferrequest = I2C_GENERATE_START_READ; + 7242 .loc 1 3513 3 is_stmt 1 view .LVU2524 +3514:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7243 .loc 1 3514 3 view .LVU2525 + 7244 .LVL471: +3517:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7245 .loc 1 3517 3 view .LVU2526 +3519:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7246 .loc 1 3519 3 view .LVU2527 +3519:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7247 .loc 1 3519 11 is_stmt 0 view .LVU2528 + 7248 0006 90F84100 ldrb r0, [r0, #65] @ zero_extendqisi2 + 7249 .LVL472: +3519:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7250 .loc 1 3519 11 view .LVU2529 + 7251 000a C0B2 uxtb r0, r0 +3519:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7252 .loc 1 3519 6 view .LVU2530 + 7253 000c 2028 cmp r0, #32 + 7254 000e 49D1 bne .L470 + 7255 0010 0D46 mov r5, r1 +3522:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7256 .loc 1 3522 5 is_stmt 1 view .LVU2531 +3522:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7257 .loc 1 3522 5 view .LVU2532 + 7258 0012 94F84010 ldrb r1, [r4, #64] @ zero_extendqisi2 + 7259 .LVL473: +3522:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7260 .loc 1 3522 5 is_stmt 0 view .LVU2533 + 7261 0016 0129 cmp r1, #1 + 7262 0018 46D0 beq .L471 +3522:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + ARM GAS /tmp/ccE2rRGE.s page 289 + + + 7263 .loc 1 3522 5 is_stmt 1 discriminator 2 view .LVU2534 + 7264 001a 0121 movs r1, #1 + 7265 001c 84F84010 strb r1, [r4, #64] +3522:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7266 .loc 1 3522 5 discriminator 2 view .LVU2535 +3524:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MASTER; + 7267 .loc 1 3524 5 discriminator 2 view .LVU2536 +3524:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MASTER; + 7268 .loc 1 3524 21 is_stmt 0 discriminator 2 view .LVU2537 + 7269 0020 2221 movs r1, #34 + 7270 0022 84F84110 strb r1, [r4, #65] +3525:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 7271 .loc 1 3525 5 is_stmt 1 discriminator 2 view .LVU2538 +3525:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 7272 .loc 1 3525 21 is_stmt 0 discriminator 2 view .LVU2539 + 7273 0026 1021 movs r1, #16 + 7274 0028 84F84210 strb r1, [r4, #66] +3526:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7275 .loc 1 3526 5 is_stmt 1 discriminator 2 view .LVU2540 +3526:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7276 .loc 1 3526 21 is_stmt 0 discriminator 2 view .LVU2541 + 7277 002c 0021 movs r1, #0 + 7278 002e 6164 str r1, [r4, #68] +3529:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 7279 .loc 1 3529 5 is_stmt 1 discriminator 2 view .LVU2542 +3529:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 7280 .loc 1 3529 23 is_stmt 0 discriminator 2 view .LVU2543 + 7281 0030 6262 str r2, [r4, #36] +3530:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = XferOptions; + 7282 .loc 1 3530 5 is_stmt 1 discriminator 2 view .LVU2544 +3530:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = XferOptions; + 7283 .loc 1 3530 23 is_stmt 0 discriminator 2 view .LVU2545 + 7284 0032 6385 strh r3, [r4, #42] @ movhi +3531:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_IT; + 7285 .loc 1 3531 5 is_stmt 1 discriminator 2 view .LVU2546 +3531:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_IT; + 7286 .loc 1 3531 23 is_stmt 0 discriminator 2 view .LVU2547 + 7287 0034 069B ldr r3, [sp, #24] + 7288 .LVL474: +3531:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_IT; + 7289 .loc 1 3531 23 discriminator 2 view .LVU2548 + 7290 0036 E362 str r3, [r4, #44] + 7291 .LVL475: +3532:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7292 .loc 1 3532 5 is_stmt 1 discriminator 2 view .LVU2549 +3532:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7293 .loc 1 3532 23 is_stmt 0 discriminator 2 view .LVU2550 + 7294 0038 1C4B ldr r3, .L475 + 7295 003a 6363 str r3, [r4, #52] +3535:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7296 .loc 1 3535 5 is_stmt 1 discriminator 2 view .LVU2551 +3535:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7297 .loc 1 3535 13 is_stmt 0 discriminator 2 view .LVU2552 + 7298 003c 638D ldrh r3, [r4, #42] + 7299 003e 9BB2 uxth r3, r3 +3535:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7300 .loc 1 3535 8 discriminator 2 view .LVU2553 + ARM GAS /tmp/ccE2rRGE.s page 290 + + + 7301 0040 FF2B cmp r3, #255 + 7302 0042 0ED9 bls .L466 +3537:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_RELOAD_MODE; + 7303 .loc 1 3537 7 is_stmt 1 view .LVU2554 +3537:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_RELOAD_MODE; + 7304 .loc 1 3537 22 is_stmt 0 view .LVU2555 + 7305 0044 FF23 movs r3, #255 + 7306 0046 2385 strh r3, [r4, #40] @ movhi +3538:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7307 .loc 1 3538 7 is_stmt 1 view .LVU2556 + 7308 .LVL476: +3538:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7309 .loc 1 3538 16 is_stmt 0 view .LVU2557 + 7310 0048 4FF08076 mov r6, #16777216 + 7311 .LVL477: + 7312 .L467: +3549:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 0)) + 7313 .loc 1 3549 5 is_stmt 1 view .LVU2558 +3549:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 0)) + 7314 .loc 1 3549 14 is_stmt 0 view .LVU2559 + 7315 004c 236B ldr r3, [r4, #48] +3549:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 0)) + 7316 .loc 1 3549 8 view .LVU2560 + 7317 004e 122B cmp r3, #18 + 7318 0050 0BD1 bne .L468 +3550:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7319 .loc 1 3550 10 view .LVU2561 + 7320 0052 069B ldr r3, [sp, #24] + 7321 0054 AA2B cmp r3, #170 + 7322 0056 08D0 beq .L468 +3550:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7323 .loc 1 3550 10 discriminator 2 view .LVU2562 + 7324 0058 B3F52A4F cmp r3, #43520 + 7325 005c 05D0 beq .L468 +3552:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7326 .loc 1 3552 19 view .LVU2563 + 7327 005e 0023 movs r3, #0 + 7328 0060 0CE0 b .L469 + 7329 .LVL478: + 7330 .L466: +3542:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = hi2c->XferOptions; + 7331 .loc 1 3542 7 is_stmt 1 view .LVU2564 +3542:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = hi2c->XferOptions; + 7332 .loc 1 3542 28 is_stmt 0 view .LVU2565 + 7333 0062 638D ldrh r3, [r4, #42] +3542:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = hi2c->XferOptions; + 7334 .loc 1 3542 22 view .LVU2566 + 7335 0064 2385 strh r3, [r4, #40] @ movhi +3543:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7336 .loc 1 3543 7 is_stmt 1 view .LVU2567 +3543:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7337 .loc 1 3543 16 is_stmt 0 view .LVU2568 + 7338 0066 E66A ldr r6, [r4, #44] + 7339 .LVL479: +3543:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7340 .loc 1 3543 16 view .LVU2569 + 7341 0068 F0E7 b .L467 + ARM GAS /tmp/ccE2rRGE.s page 291 + + + 7342 .L468: +3557:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7343 .loc 1 3557 7 is_stmt 1 view .LVU2570 + 7344 006a 2046 mov r0, r4 + 7345 006c FFF7FEFF bl I2C_ConvertOtherXferOptions + 7346 .LVL480: +3560:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7347 .loc 1 3560 7 view .LVU2571 +3560:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7348 .loc 1 3560 15 is_stmt 0 view .LVU2572 + 7349 0070 638D ldrh r3, [r4, #42] + 7350 0072 9BB2 uxth r3, r3 +3560:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7351 .loc 1 3560 10 view .LVU2573 + 7352 0074 FF2B cmp r3, #255 + 7353 0076 13D8 bhi .L473 +3562:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7354 .loc 1 3562 9 is_stmt 1 view .LVU2574 +3562:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7355 .loc 1 3562 18 is_stmt 0 view .LVU2575 + 7356 0078 E66A ldr r6, [r4, #44] + 7357 .LVL481: +3514:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7358 .loc 1 3514 12 view .LVU2576 + 7359 007a 0D4B ldr r3, .L475+4 + 7360 .L469: + 7361 .LVL482: +3567:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7362 .loc 1 3567 5 is_stmt 1 view .LVU2577 + 7363 007c 0093 str r3, [sp] + 7364 007e 3346 mov r3, r6 + 7365 .LVL483: +3567:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7366 .loc 1 3567 5 is_stmt 0 view .LVU2578 + 7367 0080 94F82820 ldrb r2, [r4, #40] @ zero_extendqisi2 + 7368 0084 2946 mov r1, r5 + 7369 0086 2046 mov r0, r4 + 7370 0088 FFF7FEFF bl I2C_TransferConfig + 7371 .LVL484: +3570:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7372 .loc 1 3570 5 is_stmt 1 view .LVU2579 +3570:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7373 .loc 1 3570 5 view .LVU2580 + 7374 008c 0025 movs r5, #0 + 7375 008e 84F84050 strb r5, [r4, #64] +3570:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7376 .loc 1 3570 5 view .LVU2581 +3575:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7377 .loc 1 3575 5 view .LVU2582 + 7378 0092 0221 movs r1, #2 + 7379 0094 2046 mov r0, r4 + 7380 0096 FFF7FEFF bl I2C_Enable_IRQ + 7381 .LVL485: +3577:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7382 .loc 1 3577 5 view .LVU2583 +3577:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7383 .loc 1 3577 12 is_stmt 0 view .LVU2584 + ARM GAS /tmp/ccE2rRGE.s page 292 + + + 7384 009a 2846 mov r0, r5 + 7385 .LVL486: + 7386 .L465: +3583:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7387 .loc 1 3583 1 view .LVU2585 + 7388 009c 02B0 add sp, sp, #8 + 7389 .cfi_remember_state + 7390 .cfi_def_cfa_offset 16 + 7391 @ sp needed + 7392 009e 70BD pop {r4, r5, r6, pc} + 7393 .LVL487: + 7394 .L473: + 7395 .cfi_restore_state +3514:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7396 .loc 1 3514 12 view .LVU2586 + 7397 00a0 034B ldr r3, .L475+4 + 7398 00a2 EBE7 b .L469 + 7399 .LVL488: + 7400 .L470: +3581:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7401 .loc 1 3581 12 view .LVU2587 + 7402 00a4 0220 movs r0, #2 + 7403 00a6 F9E7 b .L465 + 7404 .LVL489: + 7405 .L471: +3522:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7406 .loc 1 3522 5 view .LVU2588 + 7407 00a8 0220 movs r0, #2 + 7408 00aa F7E7 b .L465 + 7409 .L476: + 7410 .align 2 + 7411 .L475: + 7412 00ac 00000000 .word I2C_Master_ISR_IT + 7413 00b0 00240080 .word -2147474432 + 7414 .cfi_endproc + 7415 .LFE155: + 7417 .section .text.HAL_I2C_Master_Seq_Receive_DMA,"ax",%progbits + 7418 .align 1 + 7419 .global HAL_I2C_Master_Seq_Receive_DMA + 7420 .syntax unified + 7421 .thumb + 7422 .thumb_func + 7424 HAL_I2C_Master_Seq_Receive_DMA: + 7425 .LVL490: + 7426 .LFB156: +3599:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t xfermode; + 7427 .loc 1 3599 1 is_stmt 1 view -0 + 7428 .cfi_startproc + 7429 @ args = 4, pretend = 0, frame = 0 + 7430 @ frame_needed = 0, uses_anonymous_args = 0 +3599:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t xfermode; + 7431 .loc 1 3599 1 is_stmt 0 view .LVU2590 + 7432 0000 2DE9F041 push {r4, r5, r6, r7, r8, lr} + 7433 .cfi_def_cfa_offset 24 + 7434 .cfi_offset 4, -24 + 7435 .cfi_offset 5, -20 + 7436 .cfi_offset 6, -16 + ARM GAS /tmp/ccE2rRGE.s page 293 + + + 7437 .cfi_offset 7, -12 + 7438 .cfi_offset 8, -8 + 7439 .cfi_offset 14, -4 + 7440 0004 82B0 sub sp, sp, #8 + 7441 .cfi_def_cfa_offset 32 + 7442 0006 0446 mov r4, r0 + 7443 0008 1546 mov r5, r2 + 7444 000a 089A ldr r2, [sp, #32] + 7445 .LVL491: +3600:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t xferrequest = I2C_GENERATE_START_READ; + 7446 .loc 1 3600 3 is_stmt 1 view .LVU2591 +3601:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef dmaxferstatus; + 7447 .loc 1 3601 3 view .LVU2592 +3602:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7448 .loc 1 3602 3 view .LVU2593 +3605:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7449 .loc 1 3605 3 view .LVU2594 +3607:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7450 .loc 1 3607 3 view .LVU2595 +3607:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7451 .loc 1 3607 11 is_stmt 0 view .LVU2596 + 7452 000c 90F84100 ldrb r0, [r0, #65] @ zero_extendqisi2 + 7453 .LVL492: +3607:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7454 .loc 1 3607 11 view .LVU2597 + 7455 0010 C0B2 uxtb r0, r0 +3607:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7456 .loc 1 3607 6 view .LVU2598 + 7457 0012 2028 cmp r0, #32 + 7458 0014 40F09D80 bne .L488 + 7459 0018 0E46 mov r6, r1 +3610:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7460 .loc 1 3610 5 is_stmt 1 view .LVU2599 +3610:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7461 .loc 1 3610 5 view .LVU2600 + 7462 001a 94F84010 ldrb r1, [r4, #64] @ zero_extendqisi2 + 7463 .LVL493: +3610:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7464 .loc 1 3610 5 is_stmt 0 view .LVU2601 + 7465 001e 0129 cmp r1, #1 + 7466 0020 00F09B80 beq .L489 +3610:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7467 .loc 1 3610 5 is_stmt 1 discriminator 2 view .LVU2602 + 7468 0024 0121 movs r1, #1 + 7469 0026 84F84010 strb r1, [r4, #64] +3610:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7470 .loc 1 3610 5 discriminator 2 view .LVU2603 +3612:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MASTER; + 7471 .loc 1 3612 5 discriminator 2 view .LVU2604 +3612:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_MASTER; + 7472 .loc 1 3612 21 is_stmt 0 discriminator 2 view .LVU2605 + 7473 002a 2221 movs r1, #34 + 7474 002c 84F84110 strb r1, [r4, #65] +3613:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 7475 .loc 1 3613 5 is_stmt 1 discriminator 2 view .LVU2606 +3613:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 7476 .loc 1 3613 21 is_stmt 0 discriminator 2 view .LVU2607 + ARM GAS /tmp/ccE2rRGE.s page 294 + + + 7477 0030 1021 movs r1, #16 + 7478 0032 84F84210 strb r1, [r4, #66] +3614:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7479 .loc 1 3614 5 is_stmt 1 discriminator 2 view .LVU2608 +3614:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7480 .loc 1 3614 21 is_stmt 0 discriminator 2 view .LVU2609 + 7481 0036 0021 movs r1, #0 + 7482 0038 6164 str r1, [r4, #68] +3617:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 7483 .loc 1 3617 5 is_stmt 1 discriminator 2 view .LVU2610 +3617:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 7484 .loc 1 3617 23 is_stmt 0 discriminator 2 view .LVU2611 + 7485 003a 6562 str r5, [r4, #36] +3618:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = XferOptions; + 7486 .loc 1 3618 5 is_stmt 1 discriminator 2 view .LVU2612 +3618:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = XferOptions; + 7487 .loc 1 3618 23 is_stmt 0 discriminator 2 view .LVU2613 + 7488 003c 6385 strh r3, [r4, #42] @ movhi +3619:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_DMA; + 7489 .loc 1 3619 5 is_stmt 1 discriminator 2 view .LVU2614 +3619:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Master_ISR_DMA; + 7490 .loc 1 3619 23 is_stmt 0 discriminator 2 view .LVU2615 + 7491 003e E262 str r2, [r4, #44] +3620:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7492 .loc 1 3620 5 is_stmt 1 discriminator 2 view .LVU2616 +3620:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7493 .loc 1 3620 23 is_stmt 0 discriminator 2 view .LVU2617 + 7494 0040 474B ldr r3, .L495 + 7495 .LVL494: +3620:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7496 .loc 1 3620 23 discriminator 2 view .LVU2618 + 7497 0042 6363 str r3, [r4, #52] +3623:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7498 .loc 1 3623 5 is_stmt 1 discriminator 2 view .LVU2619 +3623:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7499 .loc 1 3623 13 is_stmt 0 discriminator 2 view .LVU2620 + 7500 0044 638D ldrh r3, [r4, #42] + 7501 0046 9BB2 uxth r3, r3 +3623:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7502 .loc 1 3623 8 discriminator 2 view .LVU2621 + 7503 0048 FF2B cmp r3, #255 + 7504 004a 0ED9 bls .L479 +3625:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_RELOAD_MODE; + 7505 .loc 1 3625 7 is_stmt 1 view .LVU2622 +3625:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_RELOAD_MODE; + 7506 .loc 1 3625 22 is_stmt 0 view .LVU2623 + 7507 004c FF23 movs r3, #255 + 7508 004e 2385 strh r3, [r4, #40] @ movhi +3626:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7509 .loc 1 3626 7 is_stmt 1 view .LVU2624 + 7510 .LVL495: +3626:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7511 .loc 1 3626 16 is_stmt 0 view .LVU2625 + 7512 0050 4FF08077 mov r7, #16777216 + 7513 .LVL496: + 7514 .L480: +3637:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 0)) + ARM GAS /tmp/ccE2rRGE.s page 295 + + + 7515 .loc 1 3637 5 is_stmt 1 view .LVU2626 +3637:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 0)) + 7516 .loc 1 3637 14 is_stmt 0 view .LVU2627 + 7517 0054 236B ldr r3, [r4, #48] +3637:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(XferOptions) == 0)) + 7518 .loc 1 3637 8 view .LVU2628 + 7519 0056 122B cmp r3, #18 + 7520 0058 0BD1 bne .L481 +3638:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7521 .loc 1 3638 10 view .LVU2629 + 7522 005a AA2A cmp r2, #170 + 7523 005c 09D0 beq .L481 +3638:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7524 .loc 1 3638 10 discriminator 2 view .LVU2630 + 7525 005e B2F52A4F cmp r2, #43520 + 7526 0062 06D0 beq .L481 +3640:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7527 .loc 1 3640 19 view .LVU2631 + 7528 0064 4FF00008 mov r8, #0 + 7529 0068 0DE0 b .L482 + 7530 .LVL497: + 7531 .L479: +3630:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = hi2c->XferOptions; + 7532 .loc 1 3630 7 is_stmt 1 view .LVU2632 +3630:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = hi2c->XferOptions; + 7533 .loc 1 3630 28 is_stmt 0 view .LVU2633 + 7534 006a 638D ldrh r3, [r4, #42] +3630:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = hi2c->XferOptions; + 7535 .loc 1 3630 22 view .LVU2634 + 7536 006c 2385 strh r3, [r4, #40] @ movhi +3631:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7537 .loc 1 3631 7 is_stmt 1 view .LVU2635 +3631:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7538 .loc 1 3631 16 is_stmt 0 view .LVU2636 + 7539 006e E76A ldr r7, [r4, #44] + 7540 .LVL498: +3631:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7541 .loc 1 3631 16 view .LVU2637 + 7542 0070 F0E7 b .L480 + 7543 .L481: +3645:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7544 .loc 1 3645 7 is_stmt 1 view .LVU2638 + 7545 0072 2046 mov r0, r4 + 7546 0074 FFF7FEFF bl I2C_ConvertOtherXferOptions + 7547 .LVL499: +3648:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7548 .loc 1 3648 7 view .LVU2639 +3648:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7549 .loc 1 3648 15 is_stmt 0 view .LVU2640 + 7550 0078 638D ldrh r3, [r4, #42] + 7551 007a 9BB2 uxth r3, r3 +3648:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7552 .loc 1 3648 10 view .LVU2641 + 7553 007c FF2B cmp r3, #255 + 7554 007e 27D8 bhi .L491 +3650:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7555 .loc 1 3650 9 is_stmt 1 view .LVU2642 + ARM GAS /tmp/ccE2rRGE.s page 296 + + +3650:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7556 .loc 1 3650 18 is_stmt 0 view .LVU2643 + 7557 0080 E76A ldr r7, [r4, #44] + 7558 .LVL500: +3601:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef dmaxferstatus; + 7559 .loc 1 3601 12 view .LVU2644 + 7560 0082 DFF8EC80 ldr r8, .L495+16 + 7561 .L482: + 7562 .LVL501: +3654:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7563 .loc 1 3654 5 is_stmt 1 view .LVU2645 +3654:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7564 .loc 1 3654 13 is_stmt 0 view .LVU2646 + 7565 0086 228D ldrh r2, [r4, #40] +3654:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7566 .loc 1 3654 8 view .LVU2647 + 7567 0088 002A cmp r2, #0 + 7568 008a 4ED0 beq .L483 +3656:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7569 .loc 1 3656 7 is_stmt 1 view .LVU2648 +3656:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7570 .loc 1 3656 15 is_stmt 0 view .LVU2649 + 7571 008c E36B ldr r3, [r4, #60] +3656:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7572 .loc 1 3656 10 view .LVU2650 + 7573 008e 13B3 cbz r3, .L484 +3659:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7574 .loc 1 3659 9 is_stmt 1 view .LVU2651 +3659:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7575 .loc 1 3659 40 is_stmt 0 view .LVU2652 + 7576 0090 344A ldr r2, .L495+4 + 7577 0092 9A62 str r2, [r3, #40] +3662:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7578 .loc 1 3662 9 is_stmt 1 view .LVU2653 +3662:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7579 .loc 1 3662 13 is_stmt 0 view .LVU2654 + 7580 0094 E36B ldr r3, [r4, #60] +3662:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7581 .loc 1 3662 41 view .LVU2655 + 7582 0096 344A ldr r2, .L495+8 + 7583 0098 1A63 str r2, [r3, #48] +3665:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmarx->XferAbortCallback = NULL; + 7584 .loc 1 3665 9 is_stmt 1 view .LVU2656 +3665:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmarx->XferAbortCallback = NULL; + 7585 .loc 1 3665 13 is_stmt 0 view .LVU2657 + 7586 009a E26B ldr r2, [r4, #60] +3665:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmarx->XferAbortCallback = NULL; + 7587 .loc 1 3665 44 view .LVU2658 + 7588 009c 0023 movs r3, #0 + 7589 009e D362 str r3, [r2, #44] +3666:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7590 .loc 1 3666 9 is_stmt 1 view .LVU2659 +3666:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7591 .loc 1 3666 13 is_stmt 0 view .LVU2660 + 7592 00a0 E26B ldr r2, [r4, #60] +3666:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7593 .loc 1 3666 41 view .LVU2661 + ARM GAS /tmp/ccE2rRGE.s page 297 + + + 7594 00a2 5363 str r3, [r2, #52] +3669:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize); + 7595 .loc 1 3669 9 is_stmt 1 view .LVU2662 +3669:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize); + 7596 .loc 1 3669 71 is_stmt 0 view .LVU2663 + 7597 00a4 2168 ldr r1, [r4] +3669:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize); + 7598 .loc 1 3669 25 view .LVU2664 + 7599 00a6 238D ldrh r3, [r4, #40] + 7600 00a8 2A46 mov r2, r5 + 7601 00aa 2431 adds r1, r1, #36 + 7602 00ac E06B ldr r0, [r4, #60] + 7603 00ae FFF7FEFF bl HAL_DMA_Start_IT + 7604 .LVL502: +3687:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7605 .loc 1 3687 7 is_stmt 1 view .LVU2665 +3687:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7606 .loc 1 3687 10 is_stmt 0 view .LVU2666 + 7607 00b2 F0B1 cbz r0, .L494 +3710:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 7608 .loc 1 3710 9 is_stmt 1 view .LVU2667 +3710:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 7609 .loc 1 3710 25 is_stmt 0 view .LVU2668 + 7610 00b4 2023 movs r3, #32 + 7611 00b6 84F84130 strb r3, [r4, #65] +3711:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7612 .loc 1 3711 9 is_stmt 1 view .LVU2669 +3711:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7613 .loc 1 3711 25 is_stmt 0 view .LVU2670 + 7614 00ba 0022 movs r2, #0 + 7615 00bc 84F84220 strb r2, [r4, #66] +3714:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7616 .loc 1 3714 9 is_stmt 1 view .LVU2671 +3714:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7617 .loc 1 3714 13 is_stmt 0 view .LVU2672 + 7618 00c0 636C ldr r3, [r4, #68] +3714:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7619 .loc 1 3714 25 view .LVU2673 + 7620 00c2 43F01003 orr r3, r3, #16 + 7621 00c6 6364 str r3, [r4, #68] +3717:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7622 .loc 1 3717 9 is_stmt 1 view .LVU2674 +3717:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7623 .loc 1 3717 9 view .LVU2675 + 7624 00c8 84F84020 strb r2, [r4, #64] +3717:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7625 .loc 1 3717 9 view .LVU2676 +3719:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7626 .loc 1 3719 9 view .LVU2677 +3719:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7627 .loc 1 3719 16 is_stmt 0 view .LVU2678 + 7628 00cc 0120 movs r0, #1 + 7629 .LVL503: +3719:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7630 .loc 1 3719 16 view .LVU2679 + 7631 00ce 41E0 b .L478 + 7632 .LVL504: + ARM GAS /tmp/ccE2rRGE.s page 298 + + + 7633 .L491: +3601:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef dmaxferstatus; + 7634 .loc 1 3601 12 view .LVU2680 + 7635 00d0 DFF89C80 ldr r8, .L495+16 + 7636 00d4 D7E7 b .L482 + 7637 .LVL505: + 7638 .L484: +3675:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 7639 .loc 1 3675 9 is_stmt 1 view .LVU2681 +3675:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 7640 .loc 1 3675 25 is_stmt 0 view .LVU2682 + 7641 00d6 2023 movs r3, #32 + 7642 00d8 84F84130 strb r3, [r4, #65] +3676:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7643 .loc 1 3676 9 is_stmt 1 view .LVU2683 +3676:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7644 .loc 1 3676 25 is_stmt 0 view .LVU2684 + 7645 00dc 0022 movs r2, #0 + 7646 00de 84F84220 strb r2, [r4, #66] +3679:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7647 .loc 1 3679 9 is_stmt 1 view .LVU2685 +3679:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7648 .loc 1 3679 13 is_stmt 0 view .LVU2686 + 7649 00e2 636C ldr r3, [r4, #68] +3679:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7650 .loc 1 3679 25 view .LVU2687 + 7651 00e4 43F08003 orr r3, r3, #128 + 7652 00e8 6364 str r3, [r4, #68] +3682:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7653 .loc 1 3682 9 is_stmt 1 view .LVU2688 +3682:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7654 .loc 1 3682 9 view .LVU2689 + 7655 00ea 84F84020 strb r2, [r4, #64] +3682:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7656 .loc 1 3682 9 view .LVU2690 +3684:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7657 .loc 1 3684 9 view .LVU2691 +3684:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7658 .loc 1 3684 16 is_stmt 0 view .LVU2692 + 7659 00ee 0120 movs r0, #1 + 7660 00f0 30E0 b .L478 + 7661 .LVL506: + 7662 .L494: +3690:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7663 .loc 1 3690 9 is_stmt 1 view .LVU2693 + 7664 00f2 CDF80080 str r8, [sp] + 7665 00f6 3B46 mov r3, r7 + 7666 00f8 94F82820 ldrb r2, [r4, #40] @ zero_extendqisi2 + 7667 00fc 3146 mov r1, r6 + 7668 00fe 2046 mov r0, r4 + 7669 .LVL507: +3690:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7670 .loc 1 3690 9 is_stmt 0 view .LVU2694 + 7671 0100 FFF7FEFF bl I2C_TransferConfig + 7672 .LVL508: +3693:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7673 .loc 1 3693 9 is_stmt 1 view .LVU2695 + ARM GAS /tmp/ccE2rRGE.s page 299 + + +3693:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7674 .loc 1 3693 13 is_stmt 0 view .LVU2696 + 7675 0104 638D ldrh r3, [r4, #42] + 7676 0106 9BB2 uxth r3, r3 +3693:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7677 .loc 1 3693 32 view .LVU2697 + 7678 0108 228D ldrh r2, [r4, #40] +3693:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7679 .loc 1 3693 25 view .LVU2698 + 7680 010a 9B1A subs r3, r3, r2 + 7681 010c 9BB2 uxth r3, r3 + 7682 010e 6385 strh r3, [r4, #42] @ movhi +3696:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7683 .loc 1 3696 9 is_stmt 1 view .LVU2699 +3696:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7684 .loc 1 3696 9 view .LVU2700 + 7685 0110 0023 movs r3, #0 + 7686 0112 84F84030 strb r3, [r4, #64] +3696:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7687 .loc 1 3696 9 view .LVU2701 +3702:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7688 .loc 1 3702 9 view .LVU2702 + 7689 0116 1021 movs r1, #16 + 7690 0118 2046 mov r0, r4 + 7691 011a FFF7FEFF bl I2C_Enable_IRQ + 7692 .LVL509: +3705:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7693 .loc 1 3705 9 view .LVU2703 +3705:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7694 .loc 1 3705 13 is_stmt 0 view .LVU2704 + 7695 011e 2268 ldr r2, [r4] +3705:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7696 .loc 1 3705 23 view .LVU2705 + 7697 0120 1368 ldr r3, [r2] +3705:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7698 .loc 1 3705 29 view .LVU2706 + 7699 0122 43F40043 orr r3, r3, #32768 + 7700 0126 1360 str r3, [r2] + 7701 0128 11E0 b .L487 + 7702 .LVL510: + 7703 .L483: +3725:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7704 .loc 1 3725 7 is_stmt 1 view .LVU2707 +3725:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7705 .loc 1 3725 21 is_stmt 0 view .LVU2708 + 7706 012a 104B ldr r3, .L495+12 + 7707 012c 6363 str r3, [r4, #52] +3729:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_GENERATE_START_READ); + 7708 .loc 1 3729 7 is_stmt 1 view .LVU2709 + 7709 012e 104B ldr r3, .L495+16 + 7710 0130 0093 str r3, [sp] + 7711 0132 4FF00073 mov r3, #33554432 + 7712 0136 D2B2 uxtb r2, r2 + 7713 0138 3146 mov r1, r6 + 7714 013a 2046 mov r0, r4 + 7715 013c FFF7FEFF bl I2C_TransferConfig + 7716 .LVL511: + ARM GAS /tmp/ccE2rRGE.s page 300 + + +3733:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7717 .loc 1 3733 7 view .LVU2710 +3733:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7718 .loc 1 3733 7 view .LVU2711 + 7719 0140 0023 movs r3, #0 + 7720 0142 84F84030 strb r3, [r4, #64] +3733:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7721 .loc 1 3733 7 view .LVU2712 +3742:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7722 .loc 1 3742 7 view .LVU2713 + 7723 0146 0121 movs r1, #1 + 7724 0148 2046 mov r0, r4 + 7725 014a FFF7FEFF bl I2C_Enable_IRQ + 7726 .LVL512: + 7727 .L487: +3745:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7728 .loc 1 3745 5 view .LVU2714 +3745:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7729 .loc 1 3745 12 is_stmt 0 view .LVU2715 + 7730 014e 0020 movs r0, #0 + 7731 0150 00E0 b .L478 + 7732 .LVL513: + 7733 .L488: +3749:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7734 .loc 1 3749 12 view .LVU2716 + 7735 0152 0220 movs r0, #2 + 7736 .LVL514: + 7737 .L478: +3751:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7738 .loc 1 3751 1 view .LVU2717 + 7739 0154 02B0 add sp, sp, #8 + 7740 .cfi_remember_state + 7741 .cfi_def_cfa_offset 24 + 7742 @ sp needed + 7743 0156 BDE8F081 pop {r4, r5, r6, r7, r8, pc} + 7744 .LVL515: + 7745 .L489: + 7746 .cfi_restore_state +3610:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7747 .loc 1 3610 5 view .LVU2718 + 7748 015a 0220 movs r0, #2 + 7749 015c FAE7 b .L478 + 7750 .L496: + 7751 015e 00BF .align 2 + 7752 .L495: + 7753 0160 00000000 .word I2C_Master_ISR_DMA + 7754 0164 00000000 .word I2C_DMAMasterReceiveCplt + 7755 0168 00000000 .word I2C_DMAError + 7756 016c 00000000 .word I2C_Master_ISR_IT + 7757 0170 00240080 .word -2147474432 + 7758 .cfi_endproc + 7759 .LFE156: + 7761 .section .text.HAL_I2C_Slave_Seq_Transmit_IT,"ax",%progbits + 7762 .align 1 + 7763 .global HAL_I2C_Slave_Seq_Transmit_IT + 7764 .syntax unified + 7765 .thumb + ARM GAS /tmp/ccE2rRGE.s page 301 + + + 7766 .thumb_func + 7768 HAL_I2C_Slave_Seq_Transmit_IT: + 7769 .LVL516: + 7770 .LFB157: +3765:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Check the parameters */ + 7771 .loc 1 3765 1 is_stmt 1 view -0 + 7772 .cfi_startproc + 7773 @ args = 0, pretend = 0, frame = 0 + 7774 @ frame_needed = 0, uses_anonymous_args = 0 +3765:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Check the parameters */ + 7775 .loc 1 3765 1 is_stmt 0 view .LVU2720 + 7776 0000 F8B5 push {r3, r4, r5, r6, r7, lr} + 7777 .cfi_def_cfa_offset 24 + 7778 .cfi_offset 3, -24 + 7779 .cfi_offset 4, -20 + 7780 .cfi_offset 5, -16 + 7781 .cfi_offset 6, -12 + 7782 .cfi_offset 7, -8 + 7783 .cfi_offset 14, -4 + 7784 0002 0446 mov r4, r0 +3767:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7785 .loc 1 3767 3 is_stmt 1 view .LVU2721 +3769:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7786 .loc 1 3769 3 view .LVU2722 +3769:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7787 .loc 1 3769 22 is_stmt 0 view .LVU2723 + 7788 0004 90F84100 ldrb r0, [r0, #65] @ zero_extendqisi2 + 7789 .LVL517: +3769:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7790 .loc 1 3769 6 view .LVU2724 + 7791 0008 00F02800 and r0, r0, #40 + 7792 000c 2828 cmp r0, #40 + 7793 000e 5AD1 bne .L503 + 7794 0010 0F46 mov r7, r1 + 7795 0012 1646 mov r6, r2 + 7796 0014 1D46 mov r5, r3 +3771:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7797 .loc 1 3771 5 is_stmt 1 view .LVU2725 +3771:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7798 .loc 1 3771 8 is_stmt 0 view .LVU2726 + 7799 0016 01B1 cbz r1, .L499 +3771:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7800 .loc 1 3771 25 discriminator 1 view .LVU2727 + 7801 0018 22B9 cbnz r2, .L500 + 7802 .L499: +3773:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 7803 .loc 1 3773 7 is_stmt 1 view .LVU2728 +3773:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 7804 .loc 1 3773 23 is_stmt 0 view .LVU2729 + 7805 001a 4FF40073 mov r3, #512 + 7806 .LVL518: +3773:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 7807 .loc 1 3773 23 view .LVU2730 + 7808 001e 6364 str r3, [r4, #68] +3774:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7809 .loc 1 3774 7 is_stmt 1 view .LVU2731 +3774:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + ARM GAS /tmp/ccE2rRGE.s page 302 + + + 7810 .loc 1 3774 15 is_stmt 0 view .LVU2732 + 7811 0020 0120 movs r0, #1 + 7812 0022 51E0 b .L498 + 7813 .LVL519: + 7814 .L500: +3778:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7815 .loc 1 3778 5 is_stmt 1 view .LVU2733 + 7816 0024 48F20101 movw r1, #32769 + 7817 .LVL520: +3778:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7818 .loc 1 3778 5 is_stmt 0 view .LVU2734 + 7819 0028 2046 mov r0, r4 + 7820 002a FFF7FEFF bl I2C_Disable_IRQ + 7821 .LVL521: +3781:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7822 .loc 1 3781 5 is_stmt 1 view .LVU2735 +3781:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7823 .loc 1 3781 5 view .LVU2736 + 7824 002e 94F84030 ldrb r3, [r4, #64] @ zero_extendqisi2 + 7825 0032 012B cmp r3, #1 + 7826 0034 49D0 beq .L504 +3781:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7827 .loc 1 3781 5 discriminator 2 view .LVU2737 + 7828 0036 0123 movs r3, #1 + 7829 0038 84F84030 strb r3, [r4, #64] +3781:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7830 .loc 1 3781 5 discriminator 2 view .LVU2738 +3785:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7831 .loc 1 3785 5 discriminator 2 view .LVU2739 +3785:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7832 .loc 1 3785 13 is_stmt 0 discriminator 2 view .LVU2740 + 7833 003c 94F84130 ldrb r3, [r4, #65] @ zero_extendqisi2 + 7834 0040 DBB2 uxtb r3, r3 +3785:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7835 .loc 1 3785 8 discriminator 2 view .LVU2741 + 7836 0042 2A2B cmp r3, #42 + 7837 0044 24D0 beq .L506 + 7838 .L501: +3811:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_SLAVE; + 7839 .loc 1 3811 5 is_stmt 1 view .LVU2742 +3811:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_SLAVE; + 7840 .loc 1 3811 21 is_stmt 0 view .LVU2743 + 7841 0046 2923 movs r3, #41 + 7842 0048 84F84130 strb r3, [r4, #65] +3812:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 7843 .loc 1 3812 5 is_stmt 1 view .LVU2744 +3812:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 7844 .loc 1 3812 21 is_stmt 0 view .LVU2745 + 7845 004c 2023 movs r3, #32 + 7846 004e 84F84230 strb r3, [r4, #66] +3813:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7847 .loc 1 3813 5 is_stmt 1 view .LVU2746 +3813:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7848 .loc 1 3813 21 is_stmt 0 view .LVU2747 + 7849 0052 0023 movs r3, #0 + 7850 0054 6364 str r3, [r4, #68] +3816:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + ARM GAS /tmp/ccE2rRGE.s page 303 + + + 7851 .loc 1 3816 5 is_stmt 1 view .LVU2748 +3816:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7852 .loc 1 3816 9 is_stmt 0 view .LVU2749 + 7853 0056 2268 ldr r2, [r4] +3816:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7854 .loc 1 3816 19 view .LVU2750 + 7855 0058 5368 ldr r3, [r2, #4] +3816:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7856 .loc 1 3816 25 view .LVU2751 + 7857 005a 23F40043 bic r3, r3, #32768 + 7858 005e 5360 str r3, [r2, #4] +3819:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 7859 .loc 1 3819 5 is_stmt 1 view .LVU2752 +3819:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 7860 .loc 1 3819 23 is_stmt 0 view .LVU2753 + 7861 0060 6762 str r7, [r4, #36] +3820:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; + 7862 .loc 1 3820 5 is_stmt 1 view .LVU2754 +3820:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; + 7863 .loc 1 3820 23 is_stmt 0 view .LVU2755 + 7864 0062 6685 strh r6, [r4, #42] @ movhi +3821:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = XferOptions; + 7865 .loc 1 3821 5 is_stmt 1 view .LVU2756 +3821:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = XferOptions; + 7866 .loc 1 3821 29 is_stmt 0 view .LVU2757 + 7867 0064 638D ldrh r3, [r4, #42] +3821:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = XferOptions; + 7868 .loc 1 3821 23 view .LVU2758 + 7869 0066 2385 strh r3, [r4, #40] @ movhi +3822:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Slave_ISR_IT; + 7870 .loc 1 3822 5 is_stmt 1 view .LVU2759 +3822:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Slave_ISR_IT; + 7871 .loc 1 3822 23 is_stmt 0 view .LVU2760 + 7872 0068 E562 str r5, [r4, #44] +3823:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7873 .loc 1 3823 5 is_stmt 1 view .LVU2761 +3823:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7874 .loc 1 3823 23 is_stmt 0 view .LVU2762 + 7875 006a 194B ldr r3, .L507 + 7876 006c 6363 str r3, [r4, #52] +3825:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7877 .loc 1 3825 5 is_stmt 1 view .LVU2763 +3825:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7878 .loc 1 3825 9 is_stmt 0 view .LVU2764 + 7879 006e 2368 ldr r3, [r4] + 7880 0070 9A69 ldr r2, [r3, #24] +3825:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7881 .loc 1 3825 8 view .LVU2765 + 7882 0072 12F4803F tst r2, #65536 + 7883 0076 01D0 beq .L502 +3829:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7884 .loc 1 3829 7 is_stmt 1 view .LVU2766 + 7885 0078 0822 movs r2, #8 + 7886 007a DA61 str r2, [r3, #28] + 7887 .L502: +3833:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7888 .loc 1 3833 5 view .LVU2767 + ARM GAS /tmp/ccE2rRGE.s page 304 + + +3833:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7889 .loc 1 3833 5 view .LVU2768 + 7890 007c 0025 movs r5, #0 + 7891 .LVL522: +3833:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7892 .loc 1 3833 5 is_stmt 0 view .LVU2769 + 7893 007e 84F84050 strb r5, [r4, #64] +3833:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7894 .loc 1 3833 5 is_stmt 1 view .LVU2770 +3839:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7895 .loc 1 3839 5 view .LVU2771 + 7896 0082 48F20101 movw r1, #32769 + 7897 0086 2046 mov r0, r4 + 7898 0088 FFF7FEFF bl I2C_Enable_IRQ + 7899 .LVL523: +3841:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7900 .loc 1 3841 5 view .LVU2772 +3841:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7901 .loc 1 3841 12 is_stmt 0 view .LVU2773 + 7902 008c 2846 mov r0, r5 + 7903 008e 1BE0 b .L498 + 7904 .LVL524: + 7905 .L506: +3788:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7906 .loc 1 3788 7 is_stmt 1 view .LVU2774 + 7907 0090 0221 movs r1, #2 + 7908 0092 2046 mov r0, r4 + 7909 0094 FFF7FEFF bl I2C_Disable_IRQ + 7910 .LVL525: +3791:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7911 .loc 1 3791 7 view .LVU2775 +3791:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7912 .loc 1 3791 16 is_stmt 0 view .LVU2776 + 7913 0098 2368 ldr r3, [r4] +3791:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7914 .loc 1 3791 26 view .LVU2777 + 7915 009a 1A68 ldr r2, [r3] +3791:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7916 .loc 1 3791 10 view .LVU2778 + 7917 009c 12F4004F tst r2, #32768 + 7918 00a0 D1D0 beq .L501 +3793:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7919 .loc 1 3793 9 is_stmt 1 view .LVU2779 +3793:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7920 .loc 1 3793 23 is_stmt 0 view .LVU2780 + 7921 00a2 1A68 ldr r2, [r3] +3793:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7922 .loc 1 3793 29 view .LVU2781 + 7923 00a4 22F40042 bic r2, r2, #32768 + 7924 00a8 1A60 str r2, [r3] +3795:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7925 .loc 1 3795 9 is_stmt 1 view .LVU2782 +3795:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7926 .loc 1 3795 17 is_stmt 0 view .LVU2783 + 7927 00aa E36B ldr r3, [r4, #60] +3795:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7928 .loc 1 3795 12 view .LVU2784 + ARM GAS /tmp/ccE2rRGE.s page 305 + + + 7929 00ac 002B cmp r3, #0 + 7930 00ae CAD0 beq .L501 +3799:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7931 .loc 1 3799 11 is_stmt 1 view .LVU2785 +3799:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7932 .loc 1 3799 43 is_stmt 0 view .LVU2786 + 7933 00b0 084A ldr r2, .L507+4 + 7934 00b2 5A63 str r2, [r3, #52] +3802:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7935 .loc 1 3802 11 is_stmt 1 view .LVU2787 +3802:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7936 .loc 1 3802 15 is_stmt 0 view .LVU2788 + 7937 00b4 E06B ldr r0, [r4, #60] + 7938 00b6 FFF7FEFF bl HAL_DMA_Abort_IT + 7939 .LVL526: +3802:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7940 .loc 1 3802 14 view .LVU2789 + 7941 00ba 0028 cmp r0, #0 + 7942 00bc C3D0 beq .L501 +3805:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7943 .loc 1 3805 13 is_stmt 1 view .LVU2790 +3805:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7944 .loc 1 3805 17 is_stmt 0 view .LVU2791 + 7945 00be E06B ldr r0, [r4, #60] +3805:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7946 .loc 1 3805 25 view .LVU2792 + 7947 00c0 436B ldr r3, [r0, #52] +3805:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7948 .loc 1 3805 13 view .LVU2793 + 7949 00c2 9847 blx r3 + 7950 .LVL527: + 7951 00c4 BFE7 b .L501 + 7952 .LVL528: + 7953 .L503: +3845:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 7954 .loc 1 3845 12 view .LVU2794 + 7955 00c6 0120 movs r0, #1 + 7956 .LVL529: + 7957 .L498: +3847:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7958 .loc 1 3847 1 view .LVU2795 + 7959 00c8 F8BD pop {r3, r4, r5, r6, r7, pc} + 7960 .LVL530: + 7961 .L504: +3781:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7962 .loc 1 3781 5 view .LVU2796 + 7963 00ca 0220 movs r0, #2 + 7964 00cc FCE7 b .L498 + 7965 .L508: + 7966 00ce 00BF .align 2 + 7967 .L507: + 7968 00d0 00000000 .word I2C_Slave_ISR_IT + 7969 00d4 00000000 .word I2C_DMAAbort + 7970 .cfi_endproc + 7971 .LFE157: + 7973 .section .text.HAL_I2C_Slave_Seq_Transmit_DMA,"ax",%progbits + 7974 .align 1 + ARM GAS /tmp/ccE2rRGE.s page 306 + + + 7975 .global HAL_I2C_Slave_Seq_Transmit_DMA + 7976 .syntax unified + 7977 .thumb + 7978 .thumb_func + 7980 HAL_I2C_Slave_Seq_Transmit_DMA: + 7981 .LVL531: + 7982 .LFB158: +3861:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef dmaxferstatus; + 7983 .loc 1 3861 1 is_stmt 1 view -0 + 7984 .cfi_startproc + 7985 @ args = 0, pretend = 0, frame = 0 + 7986 @ frame_needed = 0, uses_anonymous_args = 0 +3861:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef dmaxferstatus; + 7987 .loc 1 3861 1 is_stmt 0 view .LVU2798 + 7988 0000 F8B5 push {r3, r4, r5, r6, r7, lr} + 7989 .cfi_def_cfa_offset 24 + 7990 .cfi_offset 3, -24 + 7991 .cfi_offset 4, -20 + 7992 .cfi_offset 5, -16 + 7993 .cfi_offset 6, -12 + 7994 .cfi_offset 7, -8 + 7995 .cfi_offset 14, -4 + 7996 0002 0446 mov r4, r0 +3862:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7997 .loc 1 3862 3 is_stmt 1 view .LVU2799 +3865:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 7998 .loc 1 3865 3 view .LVU2800 +3867:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 7999 .loc 1 3867 3 view .LVU2801 +3867:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8000 .loc 1 3867 22 is_stmt 0 view .LVU2802 + 8001 0004 90F84100 ldrb r0, [r0, #65] @ zero_extendqisi2 + 8002 .LVL532: +3867:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8003 .loc 1 3867 6 view .LVU2803 + 8004 0008 00F02800 and r0, r0, #40 + 8005 000c 2828 cmp r0, #40 + 8006 000e 40F0BB80 bne .L520 + 8007 0012 0F46 mov r7, r1 + 8008 0014 1646 mov r6, r2 + 8009 0016 1D46 mov r5, r3 +3869:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8010 .loc 1 3869 5 is_stmt 1 view .LVU2804 +3869:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8011 .loc 1 3869 8 is_stmt 0 view .LVU2805 + 8012 0018 0029 cmp r1, #0 + 8013 001a 51D0 beq .L511 +3869:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8014 .loc 1 3869 25 discriminator 1 view .LVU2806 + 8015 001c 002A cmp r2, #0 + 8016 001e 4FD0 beq .L511 +3876:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8017 .loc 1 3876 5 is_stmt 1 view .LVU2807 +3876:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8018 .loc 1 3876 5 view .LVU2808 + 8019 0020 94F84030 ldrb r3, [r4, #64] @ zero_extendqisi2 + 8020 .LVL533: + ARM GAS /tmp/ccE2rRGE.s page 307 + + +3876:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8021 .loc 1 3876 5 is_stmt 0 view .LVU2809 + 8022 0024 012B cmp r3, #1 + 8023 0026 00F0B280 beq .L521 +3876:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8024 .loc 1 3876 5 is_stmt 1 discriminator 2 view .LVU2810 + 8025 002a 0123 movs r3, #1 + 8026 002c 84F84030 strb r3, [r4, #64] +3876:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8027 .loc 1 3876 5 discriminator 2 view .LVU2811 +3879:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8028 .loc 1 3879 5 discriminator 2 view .LVU2812 + 8029 0030 48F20101 movw r1, #32769 + 8030 .LVL534: +3879:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8031 .loc 1 3879 5 is_stmt 0 discriminator 2 view .LVU2813 + 8032 0034 2046 mov r0, r4 + 8033 0036 FFF7FEFF bl I2C_Disable_IRQ + 8034 .LVL535: +3883:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8035 .loc 1 3883 5 is_stmt 1 discriminator 2 view .LVU2814 +3883:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8036 .loc 1 3883 13 is_stmt 0 discriminator 2 view .LVU2815 + 8037 003a 94F84130 ldrb r3, [r4, #65] @ zero_extendqisi2 + 8038 003e DBB2 uxtb r3, r3 +3883:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8039 .loc 1 3883 8 discriminator 2 view .LVU2816 + 8040 0040 2A2B cmp r3, #42 + 8041 0042 42D0 beq .L524 +3908:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8042 .loc 1 3908 10 is_stmt 1 view .LVU2817 +3908:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8043 .loc 1 3908 18 is_stmt 0 view .LVU2818 + 8044 0044 94F84130 ldrb r3, [r4, #65] @ zero_extendqisi2 + 8045 0048 DBB2 uxtb r3, r3 +3908:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8046 .loc 1 3908 13 view .LVU2819 + 8047 004a 292B cmp r3, #41 + 8048 004c 59D0 beq .L525 + 8049 .L514: +3933:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8050 .loc 1 3933 5 is_stmt 1 view .LVU2820 +3935:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_SLAVE; + 8051 .loc 1 3935 5 view .LVU2821 +3935:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_SLAVE; + 8052 .loc 1 3935 21 is_stmt 0 view .LVU2822 + 8053 004e 2923 movs r3, #41 + 8054 0050 84F84130 strb r3, [r4, #65] +3936:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 8055 .loc 1 3936 5 is_stmt 1 view .LVU2823 +3936:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 8056 .loc 1 3936 21 is_stmt 0 view .LVU2824 + 8057 0054 2023 movs r3, #32 + 8058 0056 84F84230 strb r3, [r4, #66] +3937:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8059 .loc 1 3937 5 is_stmt 1 view .LVU2825 +3937:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + ARM GAS /tmp/ccE2rRGE.s page 308 + + + 8060 .loc 1 3937 21 is_stmt 0 view .LVU2826 + 8061 005a 0023 movs r3, #0 + 8062 005c 6364 str r3, [r4, #68] +3940:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8063 .loc 1 3940 5 is_stmt 1 view .LVU2827 +3940:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8064 .loc 1 3940 9 is_stmt 0 view .LVU2828 + 8065 005e 2268 ldr r2, [r4] +3940:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8066 .loc 1 3940 19 view .LVU2829 + 8067 0060 5368 ldr r3, [r2, #4] +3940:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8068 .loc 1 3940 25 view .LVU2830 + 8069 0062 23F40043 bic r3, r3, #32768 + 8070 0066 5360 str r3, [r2, #4] +3943:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 8071 .loc 1 3943 5 is_stmt 1 view .LVU2831 +3943:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 8072 .loc 1 3943 23 is_stmt 0 view .LVU2832 + 8073 0068 6762 str r7, [r4, #36] +3944:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; + 8074 .loc 1 3944 5 is_stmt 1 view .LVU2833 +3944:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; + 8075 .loc 1 3944 23 is_stmt 0 view .LVU2834 + 8076 006a 6685 strh r6, [r4, #42] @ movhi +3945:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = XferOptions; + 8077 .loc 1 3945 5 is_stmt 1 view .LVU2835 +3945:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = XferOptions; + 8078 .loc 1 3945 29 is_stmt 0 view .LVU2836 + 8079 006c 638D ldrh r3, [r4, #42] +3945:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = XferOptions; + 8080 .loc 1 3945 23 view .LVU2837 + 8081 006e 2385 strh r3, [r4, #40] @ movhi +3946:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Slave_ISR_DMA; + 8082 .loc 1 3946 5 is_stmt 1 view .LVU2838 +3946:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Slave_ISR_DMA; + 8083 .loc 1 3946 23 is_stmt 0 view .LVU2839 + 8084 0070 E562 str r5, [r4, #44] +3947:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8085 .loc 1 3947 5 is_stmt 1 view .LVU2840 +3947:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8086 .loc 1 3947 23 is_stmt 0 view .LVU2841 + 8087 0072 484B ldr r3, .L526 + 8088 0074 6363 str r3, [r4, #52] +3949:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8089 .loc 1 3949 5 is_stmt 1 view .LVU2842 +3949:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8090 .loc 1 3949 13 is_stmt 0 view .LVU2843 + 8091 0076 A36B ldr r3, [r4, #56] +3949:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8092 .loc 1 3949 8 view .LVU2844 + 8093 0078 002B cmp r3, #0 + 8094 007a 59D0 beq .L515 +3952:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8095 .loc 1 3952 7 is_stmt 1 view .LVU2845 +3952:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8096 .loc 1 3952 38 is_stmt 0 view .LVU2846 + ARM GAS /tmp/ccE2rRGE.s page 309 + + + 8097 007c 464A ldr r2, .L526+4 + 8098 007e 9A62 str r2, [r3, #40] +3955:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8099 .loc 1 3955 7 is_stmt 1 view .LVU2847 +3955:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8100 .loc 1 3955 11 is_stmt 0 view .LVU2848 + 8101 0080 A36B ldr r3, [r4, #56] +3955:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8102 .loc 1 3955 39 view .LVU2849 + 8103 0082 464A ldr r2, .L526+8 + 8104 0084 1A63 str r2, [r3, #48] +3958:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmatx->XferAbortCallback = NULL; + 8105 .loc 1 3958 7 is_stmt 1 view .LVU2850 +3958:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmatx->XferAbortCallback = NULL; + 8106 .loc 1 3958 11 is_stmt 0 view .LVU2851 + 8107 0086 A26B ldr r2, [r4, #56] +3958:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmatx->XferAbortCallback = NULL; + 8108 .loc 1 3958 42 view .LVU2852 + 8109 0088 0023 movs r3, #0 + 8110 008a D362 str r3, [r2, #44] +3959:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8111 .loc 1 3959 7 is_stmt 1 view .LVU2853 +3959:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8112 .loc 1 3959 11 is_stmt 0 view .LVU2854 + 8113 008c A26B ldr r2, [r4, #56] +3959:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8114 .loc 1 3959 39 view .LVU2855 + 8115 008e 5363 str r3, [r2, #52] +3962:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize); + 8116 .loc 1 3962 7 is_stmt 1 view .LVU2856 +3962:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize); + 8117 .loc 1 3962 86 is_stmt 0 view .LVU2857 + 8118 0090 2268 ldr r2, [r4] +3962:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize); + 8119 .loc 1 3962 23 view .LVU2858 + 8120 0092 238D ldrh r3, [r4, #40] + 8121 0094 2832 adds r2, r2, #40 + 8122 0096 3946 mov r1, r7 + 8123 0098 A06B ldr r0, [r4, #56] + 8124 009a FFF7FEFF bl HAL_DMA_Start_IT + 8125 .LVL536: +3980:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8126 .loc 1 3980 5 is_stmt 1 view .LVU2859 +3980:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8127 .loc 1 3980 8 is_stmt 0 view .LVU2860 + 8128 009e 0546 mov r5, r0 + 8129 .LVL537: +3980:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8130 .loc 1 3980 8 view .LVU2861 + 8131 00a0 0028 cmp r0, #0 + 8132 00a2 53D0 beq .L516 +3991:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 8133 .loc 1 3991 7 is_stmt 1 view .LVU2862 +3991:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 8134 .loc 1 3991 23 is_stmt 0 view .LVU2863 + 8135 00a4 2823 movs r3, #40 + 8136 00a6 84F84130 strb r3, [r4, #65] + ARM GAS /tmp/ccE2rRGE.s page 310 + + +3992:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8137 .loc 1 3992 7 is_stmt 1 view .LVU2864 +3992:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8138 .loc 1 3992 23 is_stmt 0 view .LVU2865 + 8139 00aa 0022 movs r2, #0 + 8140 00ac 84F84220 strb r2, [r4, #66] +3995:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8141 .loc 1 3995 7 is_stmt 1 view .LVU2866 +3995:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8142 .loc 1 3995 11 is_stmt 0 view .LVU2867 + 8143 00b0 636C ldr r3, [r4, #68] +3995:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8144 .loc 1 3995 23 view .LVU2868 + 8145 00b2 43F01003 orr r3, r3, #16 + 8146 00b6 6364 str r3, [r4, #68] +3998:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8147 .loc 1 3998 7 is_stmt 1 view .LVU2869 +3998:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8148 .loc 1 3998 7 view .LVU2870 + 8149 00b8 84F84020 strb r2, [r4, #64] +3998:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8150 .loc 1 3998 7 view .LVU2871 +4000:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8151 .loc 1 4000 7 view .LVU2872 +4000:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8152 .loc 1 4000 14 is_stmt 0 view .LVU2873 + 8153 00bc 0125 movs r5, #1 + 8154 00be 64E0 b .L510 + 8155 .LVL538: + 8156 .L511: +3871:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 8157 .loc 1 3871 7 is_stmt 1 view .LVU2874 +3871:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 8158 .loc 1 3871 23 is_stmt 0 view .LVU2875 + 8159 00c0 4FF40073 mov r3, #512 + 8160 .LVL539: +3871:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 8161 .loc 1 3871 23 view .LVU2876 + 8162 00c4 6364 str r3, [r4, #68] +3872:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8163 .loc 1 3872 7 is_stmt 1 view .LVU2877 +3872:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8164 .loc 1 3872 15 is_stmt 0 view .LVU2878 + 8165 00c6 0125 movs r5, #1 + 8166 .LVL540: +3872:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8167 .loc 1 3872 15 view .LVU2879 + 8168 00c8 5FE0 b .L510 + 8169 .LVL541: + 8170 .L524: +3886:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8171 .loc 1 3886 7 is_stmt 1 view .LVU2880 + 8172 00ca 0221 movs r1, #2 + 8173 00cc 2046 mov r0, r4 + 8174 00ce FFF7FEFF bl I2C_Disable_IRQ + 8175 .LVL542: +3888:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + ARM GAS /tmp/ccE2rRGE.s page 311 + + + 8176 .loc 1 3888 7 view .LVU2881 +3888:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8177 .loc 1 3888 16 is_stmt 0 view .LVU2882 + 8178 00d2 2368 ldr r3, [r4] +3888:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8179 .loc 1 3888 26 view .LVU2883 + 8180 00d4 1A68 ldr r2, [r3] +3888:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8181 .loc 1 3888 10 view .LVU2884 + 8182 00d6 12F4004F tst r2, #32768 + 8183 00da B8D0 beq .L514 +3891:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8184 .loc 1 3891 9 is_stmt 1 view .LVU2885 +3891:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8185 .loc 1 3891 17 is_stmt 0 view .LVU2886 + 8186 00dc E26B ldr r2, [r4, #60] +3891:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8187 .loc 1 3891 12 view .LVU2887 + 8188 00de 002A cmp r2, #0 + 8189 00e0 B5D0 beq .L514 +3893:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8190 .loc 1 3893 11 is_stmt 1 view .LVU2888 +3893:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8191 .loc 1 3893 25 is_stmt 0 view .LVU2889 + 8192 00e2 1A68 ldr r2, [r3] +3893:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8193 .loc 1 3893 31 view .LVU2890 + 8194 00e4 22F40042 bic r2, r2, #32768 + 8195 00e8 1A60 str r2, [r3] +3897:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8196 .loc 1 3897 11 is_stmt 1 view .LVU2891 +3897:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8197 .loc 1 3897 15 is_stmt 0 view .LVU2892 + 8198 00ea E36B ldr r3, [r4, #60] +3897:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8199 .loc 1 3897 43 view .LVU2893 + 8200 00ec 2C4A ldr r2, .L526+12 + 8201 00ee 5A63 str r2, [r3, #52] +3900:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8202 .loc 1 3900 11 is_stmt 1 view .LVU2894 +3900:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8203 .loc 1 3900 15 is_stmt 0 view .LVU2895 + 8204 00f0 E06B ldr r0, [r4, #60] + 8205 00f2 FFF7FEFF bl HAL_DMA_Abort_IT + 8206 .LVL543: +3900:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8207 .loc 1 3900 14 view .LVU2896 + 8208 00f6 0028 cmp r0, #0 + 8209 00f8 A9D0 beq .L514 +3903:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8210 .loc 1 3903 13 is_stmt 1 view .LVU2897 +3903:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8211 .loc 1 3903 17 is_stmt 0 view .LVU2898 + 8212 00fa E06B ldr r0, [r4, #60] +3903:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8213 .loc 1 3903 25 view .LVU2899 + 8214 00fc 436B ldr r3, [r0, #52] + ARM GAS /tmp/ccE2rRGE.s page 312 + + +3903:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8215 .loc 1 3903 13 view .LVU2900 + 8216 00fe 9847 blx r3 + 8217 .LVL544: + 8218 0100 A5E7 b .L514 + 8219 .L525: +3910:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8220 .loc 1 3910 7 is_stmt 1 view .LVU2901 +3910:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8221 .loc 1 3910 16 is_stmt 0 view .LVU2902 + 8222 0102 2368 ldr r3, [r4] +3910:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8223 .loc 1 3910 26 view .LVU2903 + 8224 0104 1A68 ldr r2, [r3] +3910:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8225 .loc 1 3910 10 view .LVU2904 + 8226 0106 12F4804F tst r2, #16384 + 8227 010a A0D0 beq .L514 +3912:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8228 .loc 1 3912 9 is_stmt 1 view .LVU2905 +3912:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8229 .loc 1 3912 23 is_stmt 0 view .LVU2906 + 8230 010c 1A68 ldr r2, [r3] +3912:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8231 .loc 1 3912 29 view .LVU2907 + 8232 010e 22F48042 bic r2, r2, #16384 + 8233 0112 1A60 str r2, [r3] +3915:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8234 .loc 1 3915 9 is_stmt 1 view .LVU2908 +3915:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8235 .loc 1 3915 17 is_stmt 0 view .LVU2909 + 8236 0114 A36B ldr r3, [r4, #56] +3915:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8237 .loc 1 3915 12 view .LVU2910 + 8238 0116 002B cmp r3, #0 + 8239 0118 99D0 beq .L514 +3919:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8240 .loc 1 3919 11 is_stmt 1 view .LVU2911 +3919:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8241 .loc 1 3919 43 is_stmt 0 view .LVU2912 + 8242 011a 214A ldr r2, .L526+12 + 8243 011c 5A63 str r2, [r3, #52] +3922:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8244 .loc 1 3922 11 is_stmt 1 view .LVU2913 +3922:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8245 .loc 1 3922 15 is_stmt 0 view .LVU2914 + 8246 011e A06B ldr r0, [r4, #56] + 8247 0120 FFF7FEFF bl HAL_DMA_Abort_IT + 8248 .LVL545: +3922:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8249 .loc 1 3922 14 view .LVU2915 + 8250 0124 0028 cmp r0, #0 + 8251 0126 92D0 beq .L514 +3925:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8252 .loc 1 3925 13 is_stmt 1 view .LVU2916 +3925:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8253 .loc 1 3925 17 is_stmt 0 view .LVU2917 + ARM GAS /tmp/ccE2rRGE.s page 313 + + + 8254 0128 A06B ldr r0, [r4, #56] +3925:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8255 .loc 1 3925 25 view .LVU2918 + 8256 012a 436B ldr r3, [r0, #52] +3925:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8257 .loc 1 3925 13 view .LVU2919 + 8258 012c 9847 blx r3 + 8259 .LVL546: + 8260 012e 8EE7 b .L514 + 8261 .L515: +3968:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 8262 .loc 1 3968 7 is_stmt 1 view .LVU2920 +3968:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 8263 .loc 1 3968 23 is_stmt 0 view .LVU2921 + 8264 0130 2823 movs r3, #40 + 8265 0132 84F84130 strb r3, [r4, #65] +3969:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8266 .loc 1 3969 7 is_stmt 1 view .LVU2922 +3969:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8267 .loc 1 3969 23 is_stmt 0 view .LVU2923 + 8268 0136 0022 movs r2, #0 + 8269 0138 84F84220 strb r2, [r4, #66] +3972:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8270 .loc 1 3972 7 is_stmt 1 view .LVU2924 +3972:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8271 .loc 1 3972 11 is_stmt 0 view .LVU2925 + 8272 013c 636C ldr r3, [r4, #68] +3972:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8273 .loc 1 3972 23 view .LVU2926 + 8274 013e 43F08003 orr r3, r3, #128 + 8275 0142 6364 str r3, [r4, #68] +3975:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8276 .loc 1 3975 7 is_stmt 1 view .LVU2927 +3975:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8277 .loc 1 3975 7 view .LVU2928 + 8278 0144 84F84020 strb r2, [r4, #64] +3975:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8279 .loc 1 3975 7 view .LVU2929 +3977:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8280 .loc 1 3977 7 view .LVU2930 +3977:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8281 .loc 1 3977 14 is_stmt 0 view .LVU2931 + 8282 0148 0125 movs r5, #1 + 8283 .LVL547: +3977:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8284 .loc 1 3977 14 view .LVU2932 + 8285 014a 1EE0 b .L510 + 8286 .LVL548: + 8287 .L516: +3983:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8288 .loc 1 3983 7 is_stmt 1 view .LVU2933 +3983:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8289 .loc 1 3983 11 is_stmt 0 view .LVU2934 + 8290 014c 638D ldrh r3, [r4, #42] + 8291 014e 9BB2 uxth r3, r3 +3983:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8292 .loc 1 3983 30 view .LVU2935 + ARM GAS /tmp/ccE2rRGE.s page 314 + + + 8293 0150 228D ldrh r2, [r4, #40] +3983:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8294 .loc 1 3983 23 view .LVU2936 + 8295 0152 9B1A subs r3, r3, r2 + 8296 0154 9BB2 uxth r3, r3 + 8297 0156 6385 strh r3, [r4, #42] @ movhi +3986:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8298 .loc 1 3986 7 is_stmt 1 view .LVU2937 +3986:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8299 .loc 1 3986 22 is_stmt 0 view .LVU2938 + 8300 0158 0023 movs r3, #0 + 8301 015a 2385 strh r3, [r4, #40] @ movhi +4003:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8302 .loc 1 4003 5 is_stmt 1 view .LVU2939 +4003:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8303 .loc 1 4003 9 is_stmt 0 view .LVU2940 + 8304 015c 2368 ldr r3, [r4] + 8305 015e 9A69 ldr r2, [r3, #24] +4003:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8306 .loc 1 4003 8 view .LVU2941 + 8307 0160 12F4803F tst r2, #65536 + 8308 0164 0DD1 bne .L518 + 8309 .L519: +4011:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8310 .loc 1 4011 5 is_stmt 1 view .LVU2942 +4011:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8311 .loc 1 4011 5 view .LVU2943 + 8312 0166 0023 movs r3, #0 + 8313 0168 84F84030 strb r3, [r4, #64] +4011:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8314 .loc 1 4011 5 view .LVU2944 +4017:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8315 .loc 1 4017 5 view .LVU2945 + 8316 016c 4FF40041 mov r1, #32768 + 8317 0170 2046 mov r0, r4 + 8318 .LVL549: +4017:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8319 .loc 1 4017 5 is_stmt 0 view .LVU2946 + 8320 0172 FFF7FEFF bl I2C_Enable_IRQ + 8321 .LVL550: +4020:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8322 .loc 1 4020 5 is_stmt 1 view .LVU2947 +4020:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8323 .loc 1 4020 9 is_stmt 0 view .LVU2948 + 8324 0176 2268 ldr r2, [r4] +4020:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8325 .loc 1 4020 19 view .LVU2949 + 8326 0178 1368 ldr r3, [r2] +4020:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8327 .loc 1 4020 25 view .LVU2950 + 8328 017a 43F48043 orr r3, r3, #16384 + 8329 017e 1360 str r3, [r2] +4022:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8330 .loc 1 4022 5 is_stmt 1 view .LVU2951 +4022:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8331 .loc 1 4022 12 is_stmt 0 view .LVU2952 + 8332 0180 03E0 b .L510 + ARM GAS /tmp/ccE2rRGE.s page 315 + + + 8333 .LVL551: + 8334 .L518: +4007:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8335 .loc 1 4007 7 is_stmt 1 view .LVU2953 + 8336 0182 0822 movs r2, #8 + 8337 0184 DA61 str r2, [r3, #28] + 8338 0186 EEE7 b .L519 + 8339 .LVL552: + 8340 .L520: +4026:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8341 .loc 1 4026 12 is_stmt 0 view .LVU2954 + 8342 0188 0125 movs r5, #1 + 8343 .LVL553: + 8344 .L510: +4028:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8345 .loc 1 4028 1 view .LVU2955 + 8346 018a 2846 mov r0, r5 + 8347 018c F8BD pop {r3, r4, r5, r6, r7, pc} + 8348 .LVL554: + 8349 .L521: +3876:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8350 .loc 1 3876 5 view .LVU2956 + 8351 018e 0225 movs r5, #2 + 8352 .LVL555: +3876:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8353 .loc 1 3876 5 view .LVU2957 + 8354 0190 FBE7 b .L510 + 8355 .L527: + 8356 0192 00BF .align 2 + 8357 .L526: + 8358 0194 00000000 .word I2C_Slave_ISR_DMA + 8359 0198 00000000 .word I2C_DMASlaveTransmitCplt + 8360 019c 00000000 .word I2C_DMAError + 8361 01a0 00000000 .word I2C_DMAAbort + 8362 .cfi_endproc + 8363 .LFE158: + 8365 .section .text.HAL_I2C_Slave_Seq_Receive_IT,"ax",%progbits + 8366 .align 1 + 8367 .global HAL_I2C_Slave_Seq_Receive_IT + 8368 .syntax unified + 8369 .thumb + 8370 .thumb_func + 8372 HAL_I2C_Slave_Seq_Receive_IT: + 8373 .LVL556: + 8374 .LFB159: +4042:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Check the parameters */ + 8375 .loc 1 4042 1 is_stmt 1 view -0 + 8376 .cfi_startproc + 8377 @ args = 0, pretend = 0, frame = 0 + 8378 @ frame_needed = 0, uses_anonymous_args = 0 +4042:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Check the parameters */ + 8379 .loc 1 4042 1 is_stmt 0 view .LVU2959 + 8380 0000 F8B5 push {r3, r4, r5, r6, r7, lr} + 8381 .cfi_def_cfa_offset 24 + 8382 .cfi_offset 3, -24 + 8383 .cfi_offset 4, -20 + 8384 .cfi_offset 5, -16 + ARM GAS /tmp/ccE2rRGE.s page 316 + + + 8385 .cfi_offset 6, -12 + 8386 .cfi_offset 7, -8 + 8387 .cfi_offset 14, -4 + 8388 0002 0446 mov r4, r0 +4044:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8389 .loc 1 4044 3 is_stmt 1 view .LVU2960 +4046:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8390 .loc 1 4046 3 view .LVU2961 +4046:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8391 .loc 1 4046 22 is_stmt 0 view .LVU2962 + 8392 0004 90F84100 ldrb r0, [r0, #65] @ zero_extendqisi2 + 8393 .LVL557: +4046:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8394 .loc 1 4046 6 view .LVU2963 + 8395 0008 00F02800 and r0, r0, #40 + 8396 000c 2828 cmp r0, #40 + 8397 000e 5AD1 bne .L534 + 8398 0010 0F46 mov r7, r1 + 8399 0012 1646 mov r6, r2 + 8400 0014 1D46 mov r5, r3 +4048:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8401 .loc 1 4048 5 is_stmt 1 view .LVU2964 +4048:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8402 .loc 1 4048 8 is_stmt 0 view .LVU2965 + 8403 0016 01B1 cbz r1, .L530 +4048:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8404 .loc 1 4048 25 discriminator 1 view .LVU2966 + 8405 0018 22B9 cbnz r2, .L531 + 8406 .L530: +4050:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 8407 .loc 1 4050 7 is_stmt 1 view .LVU2967 +4050:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 8408 .loc 1 4050 23 is_stmt 0 view .LVU2968 + 8409 001a 4FF40073 mov r3, #512 + 8410 .LVL558: +4050:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 8411 .loc 1 4050 23 view .LVU2969 + 8412 001e 6364 str r3, [r4, #68] +4051:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8413 .loc 1 4051 7 is_stmt 1 view .LVU2970 +4051:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8414 .loc 1 4051 15 is_stmt 0 view .LVU2971 + 8415 0020 0120 movs r0, #1 + 8416 0022 51E0 b .L529 + 8417 .LVL559: + 8418 .L531: +4055:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8419 .loc 1 4055 5 is_stmt 1 view .LVU2972 + 8420 0024 48F20201 movw r1, #32770 + 8421 .LVL560: +4055:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8422 .loc 1 4055 5 is_stmt 0 view .LVU2973 + 8423 0028 2046 mov r0, r4 + 8424 002a FFF7FEFF bl I2C_Disable_IRQ + 8425 .LVL561: +4058:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8426 .loc 1 4058 5 is_stmt 1 view .LVU2974 + ARM GAS /tmp/ccE2rRGE.s page 317 + + +4058:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8427 .loc 1 4058 5 view .LVU2975 + 8428 002e 94F84030 ldrb r3, [r4, #64] @ zero_extendqisi2 + 8429 0032 012B cmp r3, #1 + 8430 0034 49D0 beq .L535 +4058:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8431 .loc 1 4058 5 discriminator 2 view .LVU2976 + 8432 0036 0123 movs r3, #1 + 8433 0038 84F84030 strb r3, [r4, #64] +4058:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8434 .loc 1 4058 5 discriminator 2 view .LVU2977 +4062:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8435 .loc 1 4062 5 discriminator 2 view .LVU2978 +4062:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8436 .loc 1 4062 13 is_stmt 0 discriminator 2 view .LVU2979 + 8437 003c 94F84130 ldrb r3, [r4, #65] @ zero_extendqisi2 + 8438 0040 DBB2 uxtb r3, r3 +4062:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8439 .loc 1 4062 8 discriminator 2 view .LVU2980 + 8440 0042 292B cmp r3, #41 + 8441 0044 24D0 beq .L537 + 8442 .L532: +4088:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_SLAVE; + 8443 .loc 1 4088 5 is_stmt 1 view .LVU2981 +4088:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_SLAVE; + 8444 .loc 1 4088 21 is_stmt 0 view .LVU2982 + 8445 0046 2A23 movs r3, #42 + 8446 0048 84F84130 strb r3, [r4, #65] +4089:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 8447 .loc 1 4089 5 is_stmt 1 view .LVU2983 +4089:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 8448 .loc 1 4089 21 is_stmt 0 view .LVU2984 + 8449 004c 2023 movs r3, #32 + 8450 004e 84F84230 strb r3, [r4, #66] +4090:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8451 .loc 1 4090 5 is_stmt 1 view .LVU2985 +4090:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8452 .loc 1 4090 21 is_stmt 0 view .LVU2986 + 8453 0052 0023 movs r3, #0 + 8454 0054 6364 str r3, [r4, #68] +4093:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8455 .loc 1 4093 5 is_stmt 1 view .LVU2987 +4093:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8456 .loc 1 4093 9 is_stmt 0 view .LVU2988 + 8457 0056 2268 ldr r2, [r4] +4093:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8458 .loc 1 4093 19 view .LVU2989 + 8459 0058 5368 ldr r3, [r2, #4] +4093:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8460 .loc 1 4093 25 view .LVU2990 + 8461 005a 23F40043 bic r3, r3, #32768 + 8462 005e 5360 str r3, [r2, #4] +4096:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 8463 .loc 1 4096 5 is_stmt 1 view .LVU2991 +4096:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 8464 .loc 1 4096 23 is_stmt 0 view .LVU2992 + 8465 0060 6762 str r7, [r4, #36] + ARM GAS /tmp/ccE2rRGE.s page 318 + + +4097:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; + 8466 .loc 1 4097 5 is_stmt 1 view .LVU2993 +4097:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; + 8467 .loc 1 4097 23 is_stmt 0 view .LVU2994 + 8468 0062 6685 strh r6, [r4, #42] @ movhi +4098:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = XferOptions; + 8469 .loc 1 4098 5 is_stmt 1 view .LVU2995 +4098:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = XferOptions; + 8470 .loc 1 4098 29 is_stmt 0 view .LVU2996 + 8471 0064 638D ldrh r3, [r4, #42] +4098:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = XferOptions; + 8472 .loc 1 4098 23 view .LVU2997 + 8473 0066 2385 strh r3, [r4, #40] @ movhi +4099:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Slave_ISR_IT; + 8474 .loc 1 4099 5 is_stmt 1 view .LVU2998 +4099:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Slave_ISR_IT; + 8475 .loc 1 4099 23 is_stmt 0 view .LVU2999 + 8476 0068 E562 str r5, [r4, #44] +4100:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8477 .loc 1 4100 5 is_stmt 1 view .LVU3000 +4100:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8478 .loc 1 4100 23 is_stmt 0 view .LVU3001 + 8479 006a 194B ldr r3, .L538 + 8480 006c 6363 str r3, [r4, #52] +4102:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8481 .loc 1 4102 5 is_stmt 1 view .LVU3002 +4102:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8482 .loc 1 4102 9 is_stmt 0 view .LVU3003 + 8483 006e 2368 ldr r3, [r4] + 8484 0070 9A69 ldr r2, [r3, #24] +4102:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8485 .loc 1 4102 8 view .LVU3004 + 8486 0072 12F4803F tst r2, #65536 + 8487 0076 01D1 bne .L533 +4106:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8488 .loc 1 4106 7 is_stmt 1 view .LVU3005 + 8489 0078 0822 movs r2, #8 + 8490 007a DA61 str r2, [r3, #28] + 8491 .L533: +4110:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8492 .loc 1 4110 5 view .LVU3006 +4110:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8493 .loc 1 4110 5 view .LVU3007 + 8494 007c 0025 movs r5, #0 + 8495 .LVL562: +4110:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8496 .loc 1 4110 5 is_stmt 0 view .LVU3008 + 8497 007e 84F84050 strb r5, [r4, #64] +4110:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8498 .loc 1 4110 5 is_stmt 1 view .LVU3009 +4116:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8499 .loc 1 4116 5 view .LVU3010 + 8500 0082 48F20201 movw r1, #32770 + 8501 0086 2046 mov r0, r4 + 8502 0088 FFF7FEFF bl I2C_Enable_IRQ + 8503 .LVL563: +4118:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + ARM GAS /tmp/ccE2rRGE.s page 319 + + + 8504 .loc 1 4118 5 view .LVU3011 +4118:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8505 .loc 1 4118 12 is_stmt 0 view .LVU3012 + 8506 008c 2846 mov r0, r5 + 8507 008e 1BE0 b .L529 + 8508 .LVL564: + 8509 .L537: +4065:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8510 .loc 1 4065 7 is_stmt 1 view .LVU3013 + 8511 0090 0121 movs r1, #1 + 8512 0092 2046 mov r0, r4 + 8513 0094 FFF7FEFF bl I2C_Disable_IRQ + 8514 .LVL565: +4067:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8515 .loc 1 4067 7 view .LVU3014 +4067:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8516 .loc 1 4067 16 is_stmt 0 view .LVU3015 + 8517 0098 2368 ldr r3, [r4] +4067:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8518 .loc 1 4067 26 view .LVU3016 + 8519 009a 1A68 ldr r2, [r3] +4067:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8520 .loc 1 4067 10 view .LVU3017 + 8521 009c 12F4804F tst r2, #16384 + 8522 00a0 D1D0 beq .L532 +4069:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8523 .loc 1 4069 9 is_stmt 1 view .LVU3018 +4069:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8524 .loc 1 4069 23 is_stmt 0 view .LVU3019 + 8525 00a2 1A68 ldr r2, [r3] +4069:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8526 .loc 1 4069 29 view .LVU3020 + 8527 00a4 22F48042 bic r2, r2, #16384 + 8528 00a8 1A60 str r2, [r3] +4072:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8529 .loc 1 4072 9 is_stmt 1 view .LVU3021 +4072:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8530 .loc 1 4072 17 is_stmt 0 view .LVU3022 + 8531 00aa A36B ldr r3, [r4, #56] +4072:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8532 .loc 1 4072 12 view .LVU3023 + 8533 00ac 002B cmp r3, #0 + 8534 00ae CAD0 beq .L532 +4076:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8535 .loc 1 4076 11 is_stmt 1 view .LVU3024 +4076:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8536 .loc 1 4076 43 is_stmt 0 view .LVU3025 + 8537 00b0 084A ldr r2, .L538+4 + 8538 00b2 5A63 str r2, [r3, #52] +4079:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8539 .loc 1 4079 11 is_stmt 1 view .LVU3026 +4079:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8540 .loc 1 4079 15 is_stmt 0 view .LVU3027 + 8541 00b4 A06B ldr r0, [r4, #56] + 8542 00b6 FFF7FEFF bl HAL_DMA_Abort_IT + 8543 .LVL566: +4079:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + ARM GAS /tmp/ccE2rRGE.s page 320 + + + 8544 .loc 1 4079 14 view .LVU3028 + 8545 00ba 0028 cmp r0, #0 + 8546 00bc C3D0 beq .L532 +4082:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8547 .loc 1 4082 13 is_stmt 1 view .LVU3029 +4082:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8548 .loc 1 4082 17 is_stmt 0 view .LVU3030 + 8549 00be A06B ldr r0, [r4, #56] +4082:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8550 .loc 1 4082 25 view .LVU3031 + 8551 00c0 436B ldr r3, [r0, #52] +4082:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8552 .loc 1 4082 13 view .LVU3032 + 8553 00c2 9847 blx r3 + 8554 .LVL567: + 8555 00c4 BFE7 b .L532 + 8556 .LVL568: + 8557 .L534: +4122:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8558 .loc 1 4122 12 view .LVU3033 + 8559 00c6 0120 movs r0, #1 + 8560 .LVL569: + 8561 .L529: +4124:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8562 .loc 1 4124 1 view .LVU3034 + 8563 00c8 F8BD pop {r3, r4, r5, r6, r7, pc} + 8564 .LVL570: + 8565 .L535: +4058:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8566 .loc 1 4058 5 view .LVU3035 + 8567 00ca 0220 movs r0, #2 + 8568 00cc FCE7 b .L529 + 8569 .L539: + 8570 00ce 00BF .align 2 + 8571 .L538: + 8572 00d0 00000000 .word I2C_Slave_ISR_IT + 8573 00d4 00000000 .word I2C_DMAAbort + 8574 .cfi_endproc + 8575 .LFE159: + 8577 .section .text.HAL_I2C_Slave_Seq_Receive_DMA,"ax",%progbits + 8578 .align 1 + 8579 .global HAL_I2C_Slave_Seq_Receive_DMA + 8580 .syntax unified + 8581 .thumb + 8582 .thumb_func + 8584 HAL_I2C_Slave_Seq_Receive_DMA: + 8585 .LVL571: + 8586 .LFB160: +4138:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef dmaxferstatus; + 8587 .loc 1 4138 1 is_stmt 1 view -0 + 8588 .cfi_startproc + 8589 @ args = 0, pretend = 0, frame = 0 + 8590 @ frame_needed = 0, uses_anonymous_args = 0 +4138:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_StatusTypeDef dmaxferstatus; + 8591 .loc 1 4138 1 is_stmt 0 view .LVU3037 + 8592 0000 F8B5 push {r3, r4, r5, r6, r7, lr} + 8593 .cfi_def_cfa_offset 24 + ARM GAS /tmp/ccE2rRGE.s page 321 + + + 8594 .cfi_offset 3, -24 + 8595 .cfi_offset 4, -20 + 8596 .cfi_offset 5, -16 + 8597 .cfi_offset 6, -12 + 8598 .cfi_offset 7, -8 + 8599 .cfi_offset 14, -4 + 8600 0002 0446 mov r4, r0 +4139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8601 .loc 1 4139 3 is_stmt 1 view .LVU3038 +4142:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8602 .loc 1 4142 3 view .LVU3039 +4144:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8603 .loc 1 4144 3 view .LVU3040 +4144:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8604 .loc 1 4144 22 is_stmt 0 view .LVU3041 + 8605 0004 90F84100 ldrb r0, [r0, #65] @ zero_extendqisi2 + 8606 .LVL572: +4144:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8607 .loc 1 4144 6 view .LVU3042 + 8608 0008 00F02800 and r0, r0, #40 + 8609 000c 2828 cmp r0, #40 + 8610 000e 40F0B980 bne .L551 + 8611 0012 0F46 mov r7, r1 + 8612 0014 1646 mov r6, r2 + 8613 0016 1D46 mov r5, r3 +4146:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8614 .loc 1 4146 5 is_stmt 1 view .LVU3043 +4146:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8615 .loc 1 4146 8 is_stmt 0 view .LVU3044 + 8616 0018 01B1 cbz r1, .L542 +4146:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8617 .loc 1 4146 25 discriminator 1 view .LVU3045 + 8618 001a 22B9 cbnz r2, .L543 + 8619 .L542: +4148:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 8620 .loc 1 4148 7 is_stmt 1 view .LVU3046 +4148:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 8621 .loc 1 4148 23 is_stmt 0 view .LVU3047 + 8622 001c 4FF40073 mov r3, #512 + 8623 .LVL573: +4148:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return HAL_ERROR; + 8624 .loc 1 4148 23 view .LVU3048 + 8625 0020 6364 str r3, [r4, #68] +4149:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8626 .loc 1 4149 7 is_stmt 1 view .LVU3049 +4149:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8627 .loc 1 4149 15 is_stmt 0 view .LVU3050 + 8628 0022 0125 movs r5, #1 + 8629 .LVL574: +4149:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8630 .loc 1 4149 15 view .LVU3051 + 8631 0024 AFE0 b .L541 + 8632 .LVL575: + 8633 .L543: +4153:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8634 .loc 1 4153 5 is_stmt 1 view .LVU3052 + 8635 0026 48F20201 movw r1, #32770 + ARM GAS /tmp/ccE2rRGE.s page 322 + + + 8636 .LVL576: +4153:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8637 .loc 1 4153 5 is_stmt 0 view .LVU3053 + 8638 002a 2046 mov r0, r4 + 8639 002c FFF7FEFF bl I2C_Disable_IRQ + 8640 .LVL577: +4156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8641 .loc 1 4156 5 is_stmt 1 view .LVU3054 +4156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8642 .loc 1 4156 5 view .LVU3055 + 8643 0030 94F84030 ldrb r3, [r4, #64] @ zero_extendqisi2 + 8644 0034 012B cmp r3, #1 + 8645 0036 00F0A880 beq .L552 +4156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8646 .loc 1 4156 5 discriminator 2 view .LVU3056 + 8647 003a 0123 movs r3, #1 + 8648 003c 84F84030 strb r3, [r4, #64] +4156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8649 .loc 1 4156 5 discriminator 2 view .LVU3057 +4160:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8650 .loc 1 4160 5 discriminator 2 view .LVU3058 +4160:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8651 .loc 1 4160 13 is_stmt 0 discriminator 2 view .LVU3059 + 8652 0040 94F84130 ldrb r3, [r4, #65] @ zero_extendqisi2 + 8653 0044 DBB2 uxtb r3, r3 +4160:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8654 .loc 1 4160 8 discriminator 2 view .LVU3060 + 8655 0046 292B cmp r3, #41 + 8656 0048 3DD0 beq .L555 +4185:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8657 .loc 1 4185 10 is_stmt 1 view .LVU3061 +4185:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8658 .loc 1 4185 18 is_stmt 0 view .LVU3062 + 8659 004a 94F84130 ldrb r3, [r4, #65] @ zero_extendqisi2 + 8660 004e DBB2 uxtb r3, r3 +4185:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8661 .loc 1 4185 13 view .LVU3063 + 8662 0050 2A2B cmp r3, #42 + 8663 0052 54D0 beq .L556 + 8664 .L545: +4210:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8665 .loc 1 4210 5 is_stmt 1 view .LVU3064 +4212:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_SLAVE; + 8666 .loc 1 4212 5 view .LVU3065 +4212:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_SLAVE; + 8667 .loc 1 4212 21 is_stmt 0 view .LVU3066 + 8668 0054 2A23 movs r3, #42 + 8669 0056 84F84130 strb r3, [r4, #65] +4213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 8670 .loc 1 4213 5 is_stmt 1 view .LVU3067 +4213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->ErrorCode = HAL_I2C_ERROR_NONE; + 8671 .loc 1 4213 21 is_stmt 0 view .LVU3068 + 8672 005a 2023 movs r3, #32 + 8673 005c 84F84230 strb r3, [r4, #66] +4214:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8674 .loc 1 4214 5 is_stmt 1 view .LVU3069 +4214:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + ARM GAS /tmp/ccE2rRGE.s page 323 + + + 8675 .loc 1 4214 21 is_stmt 0 view .LVU3070 + 8676 0060 0023 movs r3, #0 + 8677 0062 6364 str r3, [r4, #68] +4217:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8678 .loc 1 4217 5 is_stmt 1 view .LVU3071 +4217:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8679 .loc 1 4217 9 is_stmt 0 view .LVU3072 + 8680 0064 2268 ldr r2, [r4] +4217:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8681 .loc 1 4217 19 view .LVU3073 + 8682 0066 5368 ldr r3, [r2, #4] +4217:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8683 .loc 1 4217 25 view .LVU3074 + 8684 0068 23F40043 bic r3, r3, #32768 + 8685 006c 5360 str r3, [r2, #4] +4220:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 8686 .loc 1 4220 5 is_stmt 1 view .LVU3075 +4220:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = Size; + 8687 .loc 1 4220 23 is_stmt 0 view .LVU3076 + 8688 006e 6762 str r7, [r4, #36] +4221:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; + 8689 .loc 1 4221 5 is_stmt 1 view .LVU3077 +4221:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize = hi2c->XferCount; + 8690 .loc 1 4221 23 is_stmt 0 view .LVU3078 + 8691 0070 6685 strh r6, [r4, #42] @ movhi +4222:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = XferOptions; + 8692 .loc 1 4222 5 is_stmt 1 view .LVU3079 +4222:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = XferOptions; + 8693 .loc 1 4222 29 is_stmt 0 view .LVU3080 + 8694 0072 638D ldrh r3, [r4, #42] +4222:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = XferOptions; + 8695 .loc 1 4222 23 view .LVU3081 + 8696 0074 2385 strh r3, [r4, #40] @ movhi +4223:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Slave_ISR_DMA; + 8697 .loc 1 4223 5 is_stmt 1 view .LVU3082 +4223:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Slave_ISR_DMA; + 8698 .loc 1 4223 23 is_stmt 0 view .LVU3083 + 8699 0076 E562 str r5, [r4, #44] +4224:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8700 .loc 1 4224 5 is_stmt 1 view .LVU3084 +4224:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8701 .loc 1 4224 23 is_stmt 0 view .LVU3085 + 8702 0078 454B ldr r3, .L557 + 8703 007a 6363 str r3, [r4, #52] +4226:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8704 .loc 1 4226 5 is_stmt 1 view .LVU3086 +4226:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8705 .loc 1 4226 13 is_stmt 0 view .LVU3087 + 8706 007c E36B ldr r3, [r4, #60] +4226:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8707 .loc 1 4226 8 view .LVU3088 + 8708 007e 002B cmp r3, #0 + 8709 0080 54D0 beq .L546 +4229:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8710 .loc 1 4229 7 is_stmt 1 view .LVU3089 +4229:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8711 .loc 1 4229 38 is_stmt 0 view .LVU3090 + ARM GAS /tmp/ccE2rRGE.s page 324 + + + 8712 0082 444A ldr r2, .L557+4 + 8713 0084 9A62 str r2, [r3, #40] +4232:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8714 .loc 1 4232 7 is_stmt 1 view .LVU3091 +4232:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8715 .loc 1 4232 11 is_stmt 0 view .LVU3092 + 8716 0086 E36B ldr r3, [r4, #60] +4232:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8717 .loc 1 4232 39 view .LVU3093 + 8718 0088 434A ldr r2, .L557+8 + 8719 008a 1A63 str r2, [r3, #48] +4235:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmarx->XferAbortCallback = NULL; + 8720 .loc 1 4235 7 is_stmt 1 view .LVU3094 +4235:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmarx->XferAbortCallback = NULL; + 8721 .loc 1 4235 11 is_stmt 0 view .LVU3095 + 8722 008c E26B ldr r2, [r4, #60] +4235:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->hdmarx->XferAbortCallback = NULL; + 8723 .loc 1 4235 42 view .LVU3096 + 8724 008e 0023 movs r3, #0 + 8725 0090 D362 str r3, [r2, #44] +4236:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8726 .loc 1 4236 7 is_stmt 1 view .LVU3097 +4236:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8727 .loc 1 4236 11 is_stmt 0 view .LVU3098 + 8728 0092 E26B ldr r2, [r4, #60] +4236:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8729 .loc 1 4236 39 view .LVU3099 + 8730 0094 5363 str r3, [r2, #52] +4239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (uint32_t)pData, hi2c->XferSize); + 8731 .loc 1 4239 7 is_stmt 1 view .LVU3100 +4239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (uint32_t)pData, hi2c->XferSize); + 8732 .loc 1 4239 69 is_stmt 0 view .LVU3101 + 8733 0096 2168 ldr r1, [r4] +4239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (uint32_t)pData, hi2c->XferSize); + 8734 .loc 1 4239 23 view .LVU3102 + 8735 0098 238D ldrh r3, [r4, #40] + 8736 009a 3A46 mov r2, r7 + 8737 009c 2431 adds r1, r1, #36 + 8738 009e E06B ldr r0, [r4, #60] + 8739 00a0 FFF7FEFF bl HAL_DMA_Start_IT + 8740 .LVL578: +4257:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8741 .loc 1 4257 5 is_stmt 1 view .LVU3103 +4257:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8742 .loc 1 4257 8 is_stmt 0 view .LVU3104 + 8743 00a4 0546 mov r5, r0 + 8744 .LVL579: +4257:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8745 .loc 1 4257 8 view .LVU3105 + 8746 00a6 0028 cmp r0, #0 + 8747 00a8 4ED0 beq .L547 +4268:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 8748 .loc 1 4268 7 is_stmt 1 view .LVU3106 +4268:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 8749 .loc 1 4268 23 is_stmt 0 view .LVU3107 + 8750 00aa 2823 movs r3, #40 + 8751 00ac 84F84130 strb r3, [r4, #65] + ARM GAS /tmp/ccE2rRGE.s page 325 + + +4269:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8752 .loc 1 4269 7 is_stmt 1 view .LVU3108 +4269:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8753 .loc 1 4269 23 is_stmt 0 view .LVU3109 + 8754 00b0 0022 movs r2, #0 + 8755 00b2 84F84220 strb r2, [r4, #66] +4272:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8756 .loc 1 4272 7 is_stmt 1 view .LVU3110 +4272:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8757 .loc 1 4272 11 is_stmt 0 view .LVU3111 + 8758 00b6 636C ldr r3, [r4, #68] +4272:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8759 .loc 1 4272 23 view .LVU3112 + 8760 00b8 43F01003 orr r3, r3, #16 + 8761 00bc 6364 str r3, [r4, #68] +4275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8762 .loc 1 4275 7 is_stmt 1 view .LVU3113 +4275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8763 .loc 1 4275 7 view .LVU3114 + 8764 00be 84F84020 strb r2, [r4, #64] +4275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8765 .loc 1 4275 7 view .LVU3115 +4277:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8766 .loc 1 4277 7 view .LVU3116 +4277:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8767 .loc 1 4277 14 is_stmt 0 view .LVU3117 + 8768 00c2 0125 movs r5, #1 + 8769 00c4 5FE0 b .L541 + 8770 .LVL580: + 8771 .L555: +4163:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8772 .loc 1 4163 7 is_stmt 1 view .LVU3118 + 8773 00c6 0121 movs r1, #1 + 8774 00c8 2046 mov r0, r4 + 8775 00ca FFF7FEFF bl I2C_Disable_IRQ + 8776 .LVL581: +4165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8777 .loc 1 4165 7 view .LVU3119 +4165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8778 .loc 1 4165 16 is_stmt 0 view .LVU3120 + 8779 00ce 2368 ldr r3, [r4] +4165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8780 .loc 1 4165 26 view .LVU3121 + 8781 00d0 1A68 ldr r2, [r3] +4165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8782 .loc 1 4165 10 view .LVU3122 + 8783 00d2 12F4804F tst r2, #16384 + 8784 00d6 BDD0 beq .L545 +4168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8785 .loc 1 4168 9 is_stmt 1 view .LVU3123 +4168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8786 .loc 1 4168 17 is_stmt 0 view .LVU3124 + 8787 00d8 A26B ldr r2, [r4, #56] +4168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8788 .loc 1 4168 12 view .LVU3125 + 8789 00da 002A cmp r2, #0 + 8790 00dc BAD0 beq .L545 + ARM GAS /tmp/ccE2rRGE.s page 326 + + +4170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8791 .loc 1 4170 11 is_stmt 1 view .LVU3126 +4170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8792 .loc 1 4170 25 is_stmt 0 view .LVU3127 + 8793 00de 1A68 ldr r2, [r3] +4170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8794 .loc 1 4170 31 view .LVU3128 + 8795 00e0 22F48042 bic r2, r2, #16384 + 8796 00e4 1A60 str r2, [r3] +4174:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8797 .loc 1 4174 11 is_stmt 1 view .LVU3129 +4174:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8798 .loc 1 4174 15 is_stmt 0 view .LVU3130 + 8799 00e6 A36B ldr r3, [r4, #56] +4174:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8800 .loc 1 4174 43 view .LVU3131 + 8801 00e8 2C4A ldr r2, .L557+12 + 8802 00ea 5A63 str r2, [r3, #52] +4177:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8803 .loc 1 4177 11 is_stmt 1 view .LVU3132 +4177:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8804 .loc 1 4177 15 is_stmt 0 view .LVU3133 + 8805 00ec A06B ldr r0, [r4, #56] + 8806 00ee FFF7FEFF bl HAL_DMA_Abort_IT + 8807 .LVL582: +4177:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8808 .loc 1 4177 14 view .LVU3134 + 8809 00f2 0028 cmp r0, #0 + 8810 00f4 AED0 beq .L545 +4180:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8811 .loc 1 4180 13 is_stmt 1 view .LVU3135 +4180:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8812 .loc 1 4180 17 is_stmt 0 view .LVU3136 + 8813 00f6 A06B ldr r0, [r4, #56] +4180:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8814 .loc 1 4180 25 view .LVU3137 + 8815 00f8 436B ldr r3, [r0, #52] +4180:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8816 .loc 1 4180 13 view .LVU3138 + 8817 00fa 9847 blx r3 + 8818 .LVL583: + 8819 00fc AAE7 b .L545 + 8820 .L556: +4187:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8821 .loc 1 4187 7 is_stmt 1 view .LVU3139 +4187:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8822 .loc 1 4187 16 is_stmt 0 view .LVU3140 + 8823 00fe 2368 ldr r3, [r4] +4187:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8824 .loc 1 4187 26 view .LVU3141 + 8825 0100 1A68 ldr r2, [r3] +4187:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8826 .loc 1 4187 10 view .LVU3142 + 8827 0102 12F4004F tst r2, #32768 + 8828 0106 A5D0 beq .L545 +4189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8829 .loc 1 4189 9 is_stmt 1 view .LVU3143 + ARM GAS /tmp/ccE2rRGE.s page 327 + + +4189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8830 .loc 1 4189 23 is_stmt 0 view .LVU3144 + 8831 0108 1A68 ldr r2, [r3] +4189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8832 .loc 1 4189 29 view .LVU3145 + 8833 010a 22F40042 bic r2, r2, #32768 + 8834 010e 1A60 str r2, [r3] +4192:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8835 .loc 1 4192 9 is_stmt 1 view .LVU3146 +4192:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8836 .loc 1 4192 17 is_stmt 0 view .LVU3147 + 8837 0110 E36B ldr r3, [r4, #60] +4192:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8838 .loc 1 4192 12 view .LVU3148 + 8839 0112 002B cmp r3, #0 + 8840 0114 9ED0 beq .L545 +4196:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8841 .loc 1 4196 11 is_stmt 1 view .LVU3149 +4196:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8842 .loc 1 4196 43 is_stmt 0 view .LVU3150 + 8843 0116 214A ldr r2, .L557+12 + 8844 0118 5A63 str r2, [r3, #52] +4199:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8845 .loc 1 4199 11 is_stmt 1 view .LVU3151 +4199:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8846 .loc 1 4199 15 is_stmt 0 view .LVU3152 + 8847 011a E06B ldr r0, [r4, #60] + 8848 011c FFF7FEFF bl HAL_DMA_Abort_IT + 8849 .LVL584: +4199:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8850 .loc 1 4199 14 view .LVU3153 + 8851 0120 0028 cmp r0, #0 + 8852 0122 97D0 beq .L545 +4202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8853 .loc 1 4202 13 is_stmt 1 view .LVU3154 +4202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8854 .loc 1 4202 17 is_stmt 0 view .LVU3155 + 8855 0124 E06B ldr r0, [r4, #60] +4202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8856 .loc 1 4202 25 view .LVU3156 + 8857 0126 436B ldr r3, [r0, #52] +4202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8858 .loc 1 4202 13 view .LVU3157 + 8859 0128 9847 blx r3 + 8860 .LVL585: + 8861 012a 93E7 b .L545 + 8862 .L546: +4245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 8863 .loc 1 4245 7 is_stmt 1 view .LVU3158 +4245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 8864 .loc 1 4245 23 is_stmt 0 view .LVU3159 + 8865 012c 2823 movs r3, #40 + 8866 012e 84F84130 strb r3, [r4, #65] +4246:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8867 .loc 1 4246 7 is_stmt 1 view .LVU3160 +4246:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8868 .loc 1 4246 23 is_stmt 0 view .LVU3161 + ARM GAS /tmp/ccE2rRGE.s page 328 + + + 8869 0132 0022 movs r2, #0 + 8870 0134 84F84220 strb r2, [r4, #66] +4249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8871 .loc 1 4249 7 is_stmt 1 view .LVU3162 +4249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8872 .loc 1 4249 11 is_stmt 0 view .LVU3163 + 8873 0138 636C ldr r3, [r4, #68] +4249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8874 .loc 1 4249 23 view .LVU3164 + 8875 013a 43F08003 orr r3, r3, #128 + 8876 013e 6364 str r3, [r4, #68] +4252:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8877 .loc 1 4252 7 is_stmt 1 view .LVU3165 +4252:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8878 .loc 1 4252 7 view .LVU3166 + 8879 0140 84F84020 strb r2, [r4, #64] +4252:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8880 .loc 1 4252 7 view .LVU3167 +4254:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8881 .loc 1 4254 7 view .LVU3168 +4254:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8882 .loc 1 4254 14 is_stmt 0 view .LVU3169 + 8883 0144 0125 movs r5, #1 + 8884 .LVL586: +4254:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8885 .loc 1 4254 14 view .LVU3170 + 8886 0146 1EE0 b .L541 + 8887 .LVL587: + 8888 .L547: +4260:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8889 .loc 1 4260 7 is_stmt 1 view .LVU3171 +4260:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8890 .loc 1 4260 11 is_stmt 0 view .LVU3172 + 8891 0148 638D ldrh r3, [r4, #42] + 8892 014a 9BB2 uxth r3, r3 +4260:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8893 .loc 1 4260 30 view .LVU3173 + 8894 014c 228D ldrh r2, [r4, #40] +4260:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8895 .loc 1 4260 23 view .LVU3174 + 8896 014e 9B1A subs r3, r3, r2 + 8897 0150 9BB2 uxth r3, r3 + 8898 0152 6385 strh r3, [r4, #42] @ movhi +4263:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8899 .loc 1 4263 7 is_stmt 1 view .LVU3175 +4263:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8900 .loc 1 4263 22 is_stmt 0 view .LVU3176 + 8901 0154 0023 movs r3, #0 + 8902 0156 2385 strh r3, [r4, #40] @ movhi +4280:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8903 .loc 1 4280 5 is_stmt 1 view .LVU3177 +4280:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8904 .loc 1 4280 9 is_stmt 0 view .LVU3178 + 8905 0158 2368 ldr r3, [r4] + 8906 015a 9A69 ldr r2, [r3, #24] +4280:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8907 .loc 1 4280 8 view .LVU3179 + ARM GAS /tmp/ccE2rRGE.s page 329 + + + 8908 015c 12F4803F tst r2, #65536 + 8909 0160 0DD0 beq .L549 + 8910 .L550: +4288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8911 .loc 1 4288 5 is_stmt 1 view .LVU3180 +4288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8912 .loc 1 4288 5 view .LVU3181 + 8913 0162 0023 movs r3, #0 + 8914 0164 84F84030 strb r3, [r4, #64] +4288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8915 .loc 1 4288 5 view .LVU3182 +4294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8916 .loc 1 4294 5 view .LVU3183 + 8917 0168 48F20201 movw r1, #32770 + 8918 016c 2046 mov r0, r4 + 8919 .LVL588: +4294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8920 .loc 1 4294 5 is_stmt 0 view .LVU3184 + 8921 016e FFF7FEFF bl I2C_Enable_IRQ + 8922 .LVL589: +4297:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8923 .loc 1 4297 5 is_stmt 1 view .LVU3185 +4297:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8924 .loc 1 4297 9 is_stmt 0 view .LVU3186 + 8925 0172 2268 ldr r2, [r4] +4297:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8926 .loc 1 4297 19 view .LVU3187 + 8927 0174 1368 ldr r3, [r2] +4297:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8928 .loc 1 4297 25 view .LVU3188 + 8929 0176 43F40043 orr r3, r3, #32768 + 8930 017a 1360 str r3, [r2] +4299:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8931 .loc 1 4299 5 is_stmt 1 view .LVU3189 +4299:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8932 .loc 1 4299 12 is_stmt 0 view .LVU3190 + 8933 017c 03E0 b .L541 + 8934 .LVL590: + 8935 .L549: +4284:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8936 .loc 1 4284 7 is_stmt 1 view .LVU3191 + 8937 017e 0822 movs r2, #8 + 8938 0180 DA61 str r2, [r3, #28] + 8939 0182 EEE7 b .L550 + 8940 .LVL591: + 8941 .L551: +4303:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8942 .loc 1 4303 12 is_stmt 0 view .LVU3192 + 8943 0184 0125 movs r5, #1 + 8944 .LVL592: + 8945 .L541: +4305:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8946 .loc 1 4305 1 view .LVU3193 + 8947 0186 2846 mov r0, r5 + 8948 0188 F8BD pop {r3, r4, r5, r6, r7, pc} + 8949 .LVL593: + 8950 .L552: + ARM GAS /tmp/ccE2rRGE.s page 330 + + +4156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8951 .loc 1 4156 5 view .LVU3194 + 8952 018a 0225 movs r5, #2 + 8953 .LVL594: +4156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8954 .loc 1 4156 5 view .LVU3195 + 8955 018c FBE7 b .L541 + 8956 .L558: + 8957 018e 00BF .align 2 + 8958 .L557: + 8959 0190 00000000 .word I2C_Slave_ISR_DMA + 8960 0194 00000000 .word I2C_DMASlaveReceiveCplt + 8961 0198 00000000 .word I2C_DMAError + 8962 019c 00000000 .word I2C_DMAAbort + 8963 .cfi_endproc + 8964 .LFE160: + 8966 .section .text.HAL_I2C_EnableListen_IT,"ax",%progbits + 8967 .align 1 + 8968 .global HAL_I2C_EnableListen_IT + 8969 .syntax unified + 8970 .thumb + 8971 .thumb_func + 8973 HAL_I2C_EnableListen_IT: + 8974 .LVL595: + 8975 .LFB161: +4314:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_READY) + 8976 .loc 1 4314 1 is_stmt 1 view -0 + 8977 .cfi_startproc + 8978 @ args = 0, pretend = 0, frame = 0 + 8979 @ frame_needed = 0, uses_anonymous_args = 0 +4314:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_READY) + 8980 .loc 1 4314 1 is_stmt 0 view .LVU3197 + 8981 0000 08B5 push {r3, lr} + 8982 .cfi_def_cfa_offset 8 + 8983 .cfi_offset 3, -8 + 8984 .cfi_offset 14, -4 +4315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8985 .loc 1 4315 3 is_stmt 1 view .LVU3198 +4315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8986 .loc 1 4315 11 is_stmt 0 view .LVU3199 + 8987 0002 90F84130 ldrb r3, [r0, #65] @ zero_extendqisi2 + 8988 0006 DBB2 uxtb r3, r3 +4315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 8989 .loc 1 4315 6 view .LVU3200 + 8990 0008 202B cmp r3, #32 + 8991 000a 01D0 beq .L563 +4327:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 8992 .loc 1 4327 12 view .LVU3201 + 8993 000c 0220 movs r0, #2 + 8994 .LVL596: + 8995 .L560: +4329:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 8996 .loc 1 4329 1 view .LVU3202 + 8997 000e 08BD pop {r3, pc} + 8998 .LVL597: + 8999 .L563: +4317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Slave_ISR_IT; + ARM GAS /tmp/ccE2rRGE.s page 331 + + + 9000 .loc 1 4317 5 is_stmt 1 view .LVU3203 +4317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Slave_ISR_IT; + 9001 .loc 1 4317 17 is_stmt 0 view .LVU3204 + 9002 0010 2823 movs r3, #40 + 9003 0012 80F84130 strb r3, [r0, #65] +4318:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9004 .loc 1 4318 5 is_stmt 1 view .LVU3205 +4318:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9005 .loc 1 4318 19 is_stmt 0 view .LVU3206 + 9006 0016 044B ldr r3, .L564 + 9007 0018 4363 str r3, [r0, #52] +4321:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9008 .loc 1 4321 5 is_stmt 1 view .LVU3207 + 9009 001a 4FF40041 mov r1, #32768 + 9010 001e FFF7FEFF bl I2C_Enable_IRQ + 9011 .LVL598: +4323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 9012 .loc 1 4323 5 view .LVU3208 +4323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 9013 .loc 1 4323 12 is_stmt 0 view .LVU3209 + 9014 0022 0020 movs r0, #0 + 9015 0024 F3E7 b .L560 + 9016 .L565: + 9017 0026 00BF .align 2 + 9018 .L564: + 9019 0028 00000000 .word I2C_Slave_ISR_IT + 9020 .cfi_endproc + 9021 .LFE161: + 9023 .section .text.HAL_I2C_DisableListen_IT,"ax",%progbits + 9024 .align 1 + 9025 .global HAL_I2C_DisableListen_IT + 9026 .syntax unified + 9027 .thumb + 9028 .thumb_func + 9030 HAL_I2C_DisableListen_IT: + 9031 .LVL599: + 9032 .LFB162: +4338:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Declaration of tmp to prevent undefined behavior of volatile usage */ + 9033 .loc 1 4338 1 is_stmt 1 view -0 + 9034 .cfi_startproc + 9035 @ args = 0, pretend = 0, frame = 0 + 9036 @ frame_needed = 0, uses_anonymous_args = 0 +4340:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9037 .loc 1 4340 3 view .LVU3211 +4343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9038 .loc 1 4343 3 view .LVU3212 +4343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9039 .loc 1 4343 11 is_stmt 0 view .LVU3213 + 9040 0000 90F84130 ldrb r3, [r0, #65] @ zero_extendqisi2 + 9041 0004 DBB2 uxtb r3, r3 +4343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9042 .loc 1 4343 6 view .LVU3214 + 9043 0006 282B cmp r3, #40 + 9044 0008 01D0 beq .L573 +4358:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 9045 .loc 1 4358 12 view .LVU3215 + 9046 000a 0220 movs r0, #2 + ARM GAS /tmp/ccE2rRGE.s page 332 + + + 9047 .LVL600: +4360:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9048 .loc 1 4360 1 view .LVU3216 + 9049 000c 7047 bx lr + 9050 .LVL601: + 9051 .L573: +4338:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Declaration of tmp to prevent undefined behavior of volatile usage */ + 9052 .loc 1 4338 1 view .LVU3217 + 9053 000e 10B5 push {r4, lr} + 9054 .cfi_def_cfa_offset 8 + 9055 .cfi_offset 4, -8 + 9056 .cfi_offset 14, -4 +4345:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = tmp | (uint32_t)(hi2c->Mode); + 9057 .loc 1 4345 5 is_stmt 1 view .LVU3218 +4345:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = tmp | (uint32_t)(hi2c->Mode); + 9058 .loc 1 4345 26 is_stmt 0 view .LVU3219 + 9059 0010 90F84120 ldrb r2, [r0, #65] @ zero_extendqisi2 + 9060 .LVL602: +4346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; + 9061 .loc 1 4346 5 is_stmt 1 view .LVU3220 +4346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; + 9062 .loc 1 4346 48 is_stmt 0 view .LVU3221 + 9063 0014 90F84230 ldrb r3, [r0, #66] @ zero_extendqisi2 +4346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; + 9064 .loc 1 4346 31 view .LVU3222 + 9065 0018 02F00302 and r2, r2, #3 + 9066 .LVL603: +4346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; + 9067 .loc 1 4346 31 view .LVU3223 + 9068 001c 1343 orrs r3, r3, r2 +4346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; + 9069 .loc 1 4346 25 view .LVU3224 + 9070 001e 0363 str r3, [r0, #48] +4347:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 9071 .loc 1 4347 5 is_stmt 1 view .LVU3225 +4347:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 9072 .loc 1 4347 17 is_stmt 0 view .LVU3226 + 9073 0020 2023 movs r3, #32 + 9074 0022 80F84130 strb r3, [r0, #65] +4348:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = NULL; + 9075 .loc 1 4348 5 is_stmt 1 view .LVU3227 +4348:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = NULL; + 9076 .loc 1 4348 16 is_stmt 0 view .LVU3228 + 9077 0026 0024 movs r4, #0 + 9078 0028 80F84240 strb r4, [r0, #66] +4349:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9079 .loc 1 4349 5 is_stmt 1 view .LVU3229 +4349:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9080 .loc 1 4349 19 is_stmt 0 view .LVU3230 + 9081 002c 4463 str r4, [r0, #52] +4352:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9082 .loc 1 4352 5 is_stmt 1 view .LVU3231 + 9083 002e 4FF40041 mov r1, #32768 + 9084 0032 FFF7FEFF bl I2C_Disable_IRQ + 9085 .LVL604: +4354:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 9086 .loc 1 4354 5 view .LVU3232 + ARM GAS /tmp/ccE2rRGE.s page 333 + + +4354:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 9087 .loc 1 4354 12 is_stmt 0 view .LVU3233 + 9088 0036 2046 mov r0, r4 +4360:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9089 .loc 1 4360 1 view .LVU3234 + 9090 0038 10BD pop {r4, pc} + 9091 .cfi_endproc + 9092 .LFE162: + 9094 .section .text.HAL_I2C_Master_Abort_IT,"ax",%progbits + 9095 .align 1 + 9096 .global HAL_I2C_Master_Abort_IT + 9097 .syntax unified + 9098 .thumb + 9099 .thumb_func + 9101 HAL_I2C_Master_Abort_IT: + 9102 .LVL605: + 9103 .LFB163: +4371:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->Mode == HAL_I2C_MODE_MASTER) + 9104 .loc 1 4371 1 is_stmt 1 view -0 + 9105 .cfi_startproc + 9106 @ args = 0, pretend = 0, frame = 0 + 9107 @ frame_needed = 0, uses_anonymous_args = 0 +4372:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9108 .loc 1 4372 3 view .LVU3236 +4372:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9109 .loc 1 4372 11 is_stmt 0 view .LVU3237 + 9110 0000 90F84230 ldrb r3, [r0, #66] @ zero_extendqisi2 + 9111 0004 DBB2 uxtb r3, r3 +4372:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9112 .loc 1 4372 6 view .LVU3238 + 9113 0006 102B cmp r3, #16 + 9114 0008 36D1 bne .L578 +4371:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->Mode == HAL_I2C_MODE_MASTER) + 9115 .loc 1 4371 1 view .LVU3239 + 9116 000a 30B5 push {r4, r5, lr} + 9117 .cfi_def_cfa_offset 12 + 9118 .cfi_offset 4, -12 + 9119 .cfi_offset 5, -8 + 9120 .cfi_offset 14, -4 + 9121 000c 83B0 sub sp, sp, #12 + 9122 .cfi_def_cfa_offset 24 + 9123 000e 0446 mov r4, r0 + 9124 0010 0D46 mov r5, r1 +4375:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9125 .loc 1 4375 5 is_stmt 1 view .LVU3240 +4375:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9126 .loc 1 4375 5 view .LVU3241 + 9127 0012 90F84030 ldrb r3, [r0, #64] @ zero_extendqisi2 + 9128 0016 012B cmp r3, #1 + 9129 0018 30D0 beq .L579 +4375:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9130 .loc 1 4375 5 discriminator 2 view .LVU3242 + 9131 001a 0123 movs r3, #1 + 9132 001c 80F84030 strb r3, [r0, #64] +4375:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9133 .loc 1 4375 5 discriminator 2 view .LVU3243 +4378:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + ARM GAS /tmp/ccE2rRGE.s page 334 + + + 9134 .loc 1 4378 5 discriminator 2 view .LVU3244 +4378:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9135 .loc 1 4378 13 is_stmt 0 discriminator 2 view .LVU3245 + 9136 0020 90F84130 ldrb r3, [r0, #65] @ zero_extendqisi2 + 9137 0024 DBB2 uxtb r3, r3 +4378:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9138 .loc 1 4378 8 discriminator 2 view .LVU3246 + 9139 0026 212B cmp r3, #33 + 9140 0028 1AD0 beq .L584 +4383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9141 .loc 1 4383 10 is_stmt 1 view .LVU3247 +4383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9142 .loc 1 4383 18 is_stmt 0 view .LVU3248 + 9143 002a 90F84130 ldrb r3, [r0, #65] @ zero_extendqisi2 + 9144 002e DBB2 uxtb r3, r3 +4383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9145 .loc 1 4383 13 view .LVU3249 + 9146 0030 222B cmp r3, #34 + 9147 0032 1BD0 beq .L585 + 9148 .LVL606: + 9149 .L577: +4391:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9150 .loc 1 4391 5 is_stmt 1 view .LVU3250 +4394:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9151 .loc 1 4394 5 view .LVU3251 +4394:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9152 .loc 1 4394 17 is_stmt 0 view .LVU3252 + 9153 0034 6023 movs r3, #96 + 9154 0036 84F84130 strb r3, [r4, #65] +4398:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9155 .loc 1 4398 5 is_stmt 1 view .LVU3253 + 9156 003a 114B ldr r3, .L586 + 9157 003c 0093 str r3, [sp] + 9158 003e 4FF00073 mov r3, #33554432 + 9159 0042 0122 movs r2, #1 + 9160 0044 2946 mov r1, r5 + 9161 0046 2046 mov r0, r4 + 9162 0048 FFF7FEFF bl I2C_TransferConfig + 9163 .LVL607: +4401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9164 .loc 1 4401 5 view .LVU3254 +4401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9165 .loc 1 4401 5 view .LVU3255 + 9166 004c 0025 movs r5, #0 + 9167 004e 84F84050 strb r5, [r4, #64] +4401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9168 .loc 1 4401 5 view .LVU3256 +4406:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9169 .loc 1 4406 5 view .LVU3257 + 9170 0052 2021 movs r1, #32 + 9171 0054 2046 mov r0, r4 + 9172 0056 FFF7FEFF bl I2C_Enable_IRQ + 9173 .LVL608: +4408:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 9174 .loc 1 4408 5 view .LVU3258 +4408:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 9175 .loc 1 4408 12 is_stmt 0 view .LVU3259 + ARM GAS /tmp/ccE2rRGE.s page 335 + + + 9176 005a 2846 mov r0, r5 + 9177 .L575: +4416:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9178 .loc 1 4416 1 view .LVU3260 + 9179 005c 03B0 add sp, sp, #12 + 9180 .cfi_remember_state + 9181 .cfi_def_cfa_offset 12 + 9182 @ sp needed + 9183 005e 30BD pop {r4, r5, pc} + 9184 .LVL609: + 9185 .L584: + 9186 .cfi_restore_state +4380:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_MASTER_BUSY_TX; + 9187 .loc 1 4380 7 is_stmt 1 view .LVU3261 + 9188 0060 0121 movs r1, #1 + 9189 .LVL610: +4380:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_MASTER_BUSY_TX; + 9190 .loc 1 4380 7 is_stmt 0 view .LVU3262 + 9191 0062 FFF7FEFF bl I2C_Disable_IRQ + 9192 .LVL611: +4381:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 9193 .loc 1 4381 7 is_stmt 1 view .LVU3263 +4381:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 9194 .loc 1 4381 27 is_stmt 0 view .LVU3264 + 9195 0066 1123 movs r3, #17 + 9196 0068 2363 str r3, [r4, #48] + 9197 006a E3E7 b .L577 + 9198 .LVL612: + 9199 .L585: +4385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_MASTER_BUSY_RX; + 9200 .loc 1 4385 7 is_stmt 1 view .LVU3265 + 9201 006c 0221 movs r1, #2 + 9202 .LVL613: +4385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_MASTER_BUSY_RX; + 9203 .loc 1 4385 7 is_stmt 0 view .LVU3266 + 9204 006e FFF7FEFF bl I2C_Disable_IRQ + 9205 .LVL614: +4386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 9206 .loc 1 4386 7 is_stmt 1 view .LVU3267 +4386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 9207 .loc 1 4386 27 is_stmt 0 view .LVU3268 + 9208 0072 1223 movs r3, #18 + 9209 0074 2363 str r3, [r4, #48] + 9210 0076 DDE7 b .L577 + 9211 .LVL615: + 9212 .L578: + 9213 .cfi_def_cfa_offset 0 + 9214 .cfi_restore 4 + 9215 .cfi_restore 5 + 9216 .cfi_restore 14 +4414:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 9217 .loc 1 4414 12 view .LVU3269 + 9218 0078 0120 movs r0, #1 + 9219 .LVL616: +4416:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9220 .loc 1 4416 1 view .LVU3270 + 9221 007a 7047 bx lr + ARM GAS /tmp/ccE2rRGE.s page 336 + + + 9222 .LVL617: + 9223 .L579: + 9224 .cfi_def_cfa_offset 24 + 9225 .cfi_offset 4, -12 + 9226 .cfi_offset 5, -8 + 9227 .cfi_offset 14, -4 +4375:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9228 .loc 1 4375 5 view .LVU3271 + 9229 007c 0220 movs r0, #2 + 9230 .LVL618: +4375:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9231 .loc 1 4375 5 view .LVU3272 + 9232 007e EDE7 b .L575 + 9233 .L587: + 9234 .align 2 + 9235 .L586: + 9236 0080 00400080 .word -2147467264 + 9237 .cfi_endproc + 9238 .LFE163: + 9240 .section .text.HAL_I2C_EV_IRQHandler,"ax",%progbits + 9241 .align 1 + 9242 .global HAL_I2C_EV_IRQHandler + 9243 .syntax unified + 9244 .thumb + 9245 .thumb_func + 9247 HAL_I2C_EV_IRQHandler: + 9248 .LVL619: + 9249 .LFB164: +4433:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Get current IT Flags and IT sources value */ + 9250 .loc 1 4433 1 is_stmt 1 view -0 + 9251 .cfi_startproc + 9252 @ args = 0, pretend = 0, frame = 0 + 9253 @ frame_needed = 0, uses_anonymous_args = 0 +4433:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Get current IT Flags and IT sources value */ + 9254 .loc 1 4433 1 is_stmt 0 view .LVU3274 + 9255 0000 08B5 push {r3, lr} + 9256 .cfi_def_cfa_offset 8 + 9257 .cfi_offset 3, -8 + 9258 .cfi_offset 14, -4 +4435:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t itsources = READ_REG(hi2c->Instance->CR1); + 9259 .loc 1 4435 3 is_stmt 1 view .LVU3275 +4435:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t itsources = READ_REG(hi2c->Instance->CR1); + 9260 .loc 1 4435 24 is_stmt 0 view .LVU3276 + 9261 0002 0368 ldr r3, [r0] +4435:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t itsources = READ_REG(hi2c->Instance->CR1); + 9262 .loc 1 4435 12 view .LVU3277 + 9263 0004 9969 ldr r1, [r3, #24] + 9264 .LVL620: +4436:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9265 .loc 1 4436 3 is_stmt 1 view .LVU3278 +4436:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9266 .loc 1 4436 12 is_stmt 0 view .LVU3279 + 9267 0006 1A68 ldr r2, [r3] + 9268 .LVL621: +4439:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9269 .loc 1 4439 3 is_stmt 1 view .LVU3280 +4439:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + ARM GAS /tmp/ccE2rRGE.s page 337 + + + 9270 .loc 1 4439 11 is_stmt 0 view .LVU3281 + 9271 0008 436B ldr r3, [r0, #52] +4439:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9272 .loc 1 4439 6 view .LVU3282 + 9273 000a 03B1 cbz r3, .L588 +4441:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 9274 .loc 1 4441 5 is_stmt 1 view .LVU3283 + 9275 000c 9847 blx r3 + 9276 .LVL622: + 9277 .L588: +4443:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9278 .loc 1 4443 1 is_stmt 0 view .LVU3284 + 9279 000e 08BD pop {r3, pc} + 9280 .cfi_endproc + 9281 .LFE164: + 9283 .section .text.HAL_I2C_MasterTxCpltCallback,"ax",%progbits + 9284 .align 1 + 9285 .weak HAL_I2C_MasterTxCpltCallback + 9286 .syntax unified + 9287 .thumb + 9288 .thumb_func + 9290 HAL_I2C_MasterTxCpltCallback: + 9291 .LVL623: + 9292 .LFB166: +4504:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prevent unused argument(s) compilation warning */ + 9293 .loc 1 4504 1 is_stmt 1 view -0 + 9294 .cfi_startproc + 9295 @ args = 0, pretend = 0, frame = 0 + 9296 @ frame_needed = 0, uses_anonymous_args = 0 + 9297 @ link register save eliminated. +4506:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9298 .loc 1 4506 3 view .LVU3286 +4511:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9299 .loc 1 4511 1 is_stmt 0 view .LVU3287 + 9300 0000 7047 bx lr + 9301 .cfi_endproc + 9302 .LFE166: + 9304 .section .text.HAL_I2C_MasterRxCpltCallback,"ax",%progbits + 9305 .align 1 + 9306 .weak HAL_I2C_MasterRxCpltCallback + 9307 .syntax unified + 9308 .thumb + 9309 .thumb_func + 9311 HAL_I2C_MasterRxCpltCallback: + 9312 .LVL624: + 9313 .LFB167: +4520:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prevent unused argument(s) compilation warning */ + 9314 .loc 1 4520 1 is_stmt 1 view -0 + 9315 .cfi_startproc + 9316 @ args = 0, pretend = 0, frame = 0 + 9317 @ frame_needed = 0, uses_anonymous_args = 0 + 9318 @ link register save eliminated. +4522:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9319 .loc 1 4522 3 view .LVU3289 +4527:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9320 .loc 1 4527 1 is_stmt 0 view .LVU3290 + 9321 0000 7047 bx lr + ARM GAS /tmp/ccE2rRGE.s page 338 + + + 9322 .cfi_endproc + 9323 .LFE167: + 9325 .section .text.I2C_ITMasterSeqCplt,"ax",%progbits + 9326 .align 1 + 9327 .syntax unified + 9328 .thumb + 9329 .thumb_func + 9331 I2C_ITMasterSeqCplt: + 9332 .LVL625: + 9333 .LFB186: +5505:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Reset I2C handle mode */ + 9334 .loc 1 5505 1 is_stmt 1 view -0 + 9335 .cfi_startproc + 9336 @ args = 0, pretend = 0, frame = 0 + 9337 @ frame_needed = 0, uses_anonymous_args = 0 +5505:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Reset I2C handle mode */ + 9338 .loc 1 5505 1 is_stmt 0 view .LVU3292 + 9339 0000 38B5 push {r3, r4, r5, lr} + 9340 .cfi_def_cfa_offset 16 + 9341 .cfi_offset 3, -16 + 9342 .cfi_offset 4, -12 + 9343 .cfi_offset 5, -8 + 9344 .cfi_offset 14, -4 + 9345 0002 0446 mov r4, r0 +5507:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9346 .loc 1 5507 3 is_stmt 1 view .LVU3293 +5507:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9347 .loc 1 5507 14 is_stmt 0 view .LVU3294 + 9348 0004 0023 movs r3, #0 + 9349 0006 80F84230 strb r3, [r0, #66] +5511:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9350 .loc 1 5511 3 is_stmt 1 view .LVU3295 +5511:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9351 .loc 1 5511 11 is_stmt 0 view .LVU3296 + 9352 000a 90F84130 ldrb r3, [r0, #65] @ zero_extendqisi2 + 9353 000e DBB2 uxtb r3, r3 +5511:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9354 .loc 1 5511 6 view .LVU3297 + 9355 0010 212B cmp r3, #33 + 9356 0012 0FD0 beq .L597 +5533:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_MASTER_BUSY_RX; + 9357 .loc 1 5533 5 is_stmt 1 view .LVU3298 +5533:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_MASTER_BUSY_RX; + 9358 .loc 1 5533 25 is_stmt 0 view .LVU3299 + 9359 0014 2023 movs r3, #32 + 9360 0016 80F84130 strb r3, [r0, #65] +5534:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = NULL; + 9361 .loc 1 5534 5 is_stmt 1 view .LVU3300 +5534:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = NULL; + 9362 .loc 1 5534 25 is_stmt 0 view .LVU3301 + 9363 001a 1223 movs r3, #18 + 9364 001c 0363 str r3, [r0, #48] +5535:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9365 .loc 1 5535 5 is_stmt 1 view .LVU3302 +5535:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9366 .loc 1 5535 25 is_stmt 0 view .LVU3303 + 9367 001e 0025 movs r5, #0 + ARM GAS /tmp/ccE2rRGE.s page 339 + + + 9368 0020 4563 str r5, [r0, #52] +5538:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9369 .loc 1 5538 5 is_stmt 1 view .LVU3304 + 9370 0022 0221 movs r1, #2 + 9371 0024 FFF7FEFF bl I2C_Disable_IRQ + 9372 .LVL626: +5541:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9373 .loc 1 5541 5 view .LVU3305 +5541:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9374 .loc 1 5541 5 view .LVU3306 + 9375 0028 84F84050 strb r5, [r4, #64] +5541:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9376 .loc 1 5541 5 view .LVU3307 +5547:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + 9377 .loc 1 5547 5 view .LVU3308 + 9378 002c 2046 mov r0, r4 + 9379 002e FFF7FEFF bl HAL_I2C_MasterRxCpltCallback + 9380 .LVL627: + 9381 .L593: +5550:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9382 .loc 1 5550 1 is_stmt 0 view .LVU3309 + 9383 0032 38BD pop {r3, r4, r5, pc} + 9384 .LVL628: + 9385 .L597: +5513:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_MASTER_BUSY_TX; + 9386 .loc 1 5513 5 is_stmt 1 view .LVU3310 +5513:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_MASTER_BUSY_TX; + 9387 .loc 1 5513 25 is_stmt 0 view .LVU3311 + 9388 0034 2023 movs r3, #32 + 9389 0036 80F84130 strb r3, [r0, #65] +5514:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = NULL; + 9390 .loc 1 5514 5 is_stmt 1 view .LVU3312 +5514:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = NULL; + 9391 .loc 1 5514 25 is_stmt 0 view .LVU3313 + 9392 003a 1123 movs r3, #17 + 9393 003c 0363 str r3, [r0, #48] +5515:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9394 .loc 1 5515 5 is_stmt 1 view .LVU3314 +5515:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9395 .loc 1 5515 25 is_stmt 0 view .LVU3315 + 9396 003e 0025 movs r5, #0 + 9397 0040 4563 str r5, [r0, #52] +5518:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9398 .loc 1 5518 5 is_stmt 1 view .LVU3316 + 9399 0042 0121 movs r1, #1 + 9400 0044 FFF7FEFF bl I2C_Disable_IRQ + 9401 .LVL629: +5521:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9402 .loc 1 5521 5 view .LVU3317 +5521:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9403 .loc 1 5521 5 view .LVU3318 + 9404 0048 84F84050 strb r5, [r4, #64] +5521:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9405 .loc 1 5521 5 view .LVU3319 +5527:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + 9406 .loc 1 5527 5 view .LVU3320 + 9407 004c 2046 mov r0, r4 + ARM GAS /tmp/ccE2rRGE.s page 340 + + + 9408 004e FFF7FEFF bl HAL_I2C_MasterTxCpltCallback + 9409 .LVL630: + 9410 0052 EEE7 b .L593 + 9411 .cfi_endproc + 9412 .LFE186: + 9414 .section .text.HAL_I2C_SlaveTxCpltCallback,"ax",%progbits + 9415 .align 1 + 9416 .weak HAL_I2C_SlaveTxCpltCallback + 9417 .syntax unified + 9418 .thumb + 9419 .thumb_func + 9421 HAL_I2C_SlaveTxCpltCallback: + 9422 .LVL631: + 9423 .LFB168: +4535:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prevent unused argument(s) compilation warning */ + 9424 .loc 1 4535 1 view -0 + 9425 .cfi_startproc + 9426 @ args = 0, pretend = 0, frame = 0 + 9427 @ frame_needed = 0, uses_anonymous_args = 0 + 9428 @ link register save eliminated. +4537:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9429 .loc 1 4537 3 view .LVU3322 +4542:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9430 .loc 1 4542 1 is_stmt 0 view .LVU3323 + 9431 0000 7047 bx lr + 9432 .cfi_endproc + 9433 .LFE168: + 9435 .section .text.HAL_I2C_SlaveRxCpltCallback,"ax",%progbits + 9436 .align 1 + 9437 .weak HAL_I2C_SlaveRxCpltCallback + 9438 .syntax unified + 9439 .thumb + 9440 .thumb_func + 9442 HAL_I2C_SlaveRxCpltCallback: + 9443 .LVL632: + 9444 .LFB169: +4551:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prevent unused argument(s) compilation warning */ + 9445 .loc 1 4551 1 is_stmt 1 view -0 + 9446 .cfi_startproc + 9447 @ args = 0, pretend = 0, frame = 0 + 9448 @ frame_needed = 0, uses_anonymous_args = 0 + 9449 @ link register save eliminated. +4553:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9450 .loc 1 4553 3 view .LVU3325 +4558:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9451 .loc 1 4558 1 is_stmt 0 view .LVU3326 + 9452 0000 7047 bx lr + 9453 .cfi_endproc + 9454 .LFE169: + 9456 .section .text.I2C_ITSlaveSeqCplt,"ax",%progbits + 9457 .align 1 + 9458 .syntax unified + 9459 .thumb + 9460 .thumb_func + 9462 I2C_ITSlaveSeqCplt: + 9463 .LVL633: + 9464 .LFB187: + ARM GAS /tmp/ccE2rRGE.s page 341 + + +5558:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tmpcr1value = READ_REG(hi2c->Instance->CR1); + 9465 .loc 1 5558 1 is_stmt 1 view -0 + 9466 .cfi_startproc + 9467 @ args = 0, pretend = 0, frame = 0 + 9468 @ frame_needed = 0, uses_anonymous_args = 0 +5558:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tmpcr1value = READ_REG(hi2c->Instance->CR1); + 9469 .loc 1 5558 1 is_stmt 0 view .LVU3328 + 9470 0000 10B5 push {r4, lr} + 9471 .cfi_def_cfa_offset 8 + 9472 .cfi_offset 4, -8 + 9473 .cfi_offset 14, -4 + 9474 0002 0446 mov r4, r0 +5559:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9475 .loc 1 5559 3 is_stmt 1 view .LVU3329 +5559:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9476 .loc 1 5559 26 is_stmt 0 view .LVU3330 + 9477 0004 0368 ldr r3, [r0] +5559:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9478 .loc 1 5559 12 view .LVU3331 + 9479 0006 1A68 ldr r2, [r3] + 9480 .LVL634: +5562:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9481 .loc 1 5562 3 is_stmt 1 view .LVU3332 +5562:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9482 .loc 1 5562 14 is_stmt 0 view .LVU3333 + 9483 0008 0021 movs r1, #0 + 9484 000a 80F84210 strb r1, [r0, #66] +5565:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9485 .loc 1 5565 3 is_stmt 1 view .LVU3334 +5565:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9486 .loc 1 5565 6 is_stmt 0 view .LVU3335 + 9487 000e 12F4804F tst r2, #16384 + 9488 0012 0ED0 beq .L601 +5568:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 9489 .loc 1 5568 5 is_stmt 1 view .LVU3336 +5568:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 9490 .loc 1 5568 19 is_stmt 0 view .LVU3337 + 9491 0014 1A68 ldr r2, [r3] + 9492 .LVL635: +5568:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 9493 .loc 1 5568 25 view .LVU3338 + 9494 0016 22F48042 bic r2, r2, #16384 + 9495 001a 1A60 str r2, [r3] + 9496 .L602: +5578:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9497 .loc 1 5578 3 is_stmt 1 view .LVU3339 +5580:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9498 .loc 1 5580 3 view .LVU3340 +5580:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9499 .loc 1 5580 11 is_stmt 0 view .LVU3341 + 9500 001c 94F84130 ldrb r3, [r4, #65] @ zero_extendqisi2 + 9501 0020 DBB2 uxtb r3, r3 +5580:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9502 .loc 1 5580 6 view .LVU3342 + 9503 0022 292B cmp r3, #41 + 9504 0024 0DD0 beq .L606 +5600:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + ARM GAS /tmp/ccE2rRGE.s page 342 + + + 9505 .loc 1 5600 8 is_stmt 1 view .LVU3343 +5600:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9506 .loc 1 5600 16 is_stmt 0 view .LVU3344 + 9507 0026 94F84130 ldrb r3, [r4, #65] @ zero_extendqisi2 + 9508 002a DBB2 uxtb r3, r3 +5600:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9509 .loc 1 5600 11 view .LVU3345 + 9510 002c 2A2B cmp r3, #42 + 9511 002e 18D0 beq .L607 + 9512 .LVL636: + 9513 .L600: +5623:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9514 .loc 1 5623 1 view .LVU3346 + 9515 0030 10BD pop {r4, pc} + 9516 .LVL637: + 9517 .L601: +5570:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9518 .loc 1 5570 8 is_stmt 1 view .LVU3347 +5570:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9519 .loc 1 5570 11 is_stmt 0 view .LVU3348 + 9520 0032 12F4004F tst r2, #32768 + 9521 0036 F1D0 beq .L602 +5573:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 9522 .loc 1 5573 5 is_stmt 1 view .LVU3349 +5573:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 9523 .loc 1 5573 19 is_stmt 0 view .LVU3350 + 9524 0038 1A68 ldr r2, [r3] + 9525 .LVL638: +5573:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 9526 .loc 1 5573 25 view .LVU3351 + 9527 003a 22F40042 bic r2, r2, #32768 + 9528 003e 1A60 str r2, [r3] + 9529 0040 ECE7 b .L602 + 9530 .L606: +5583:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_TX; + 9531 .loc 1 5583 5 is_stmt 1 view .LVU3352 +5583:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_TX; + 9532 .loc 1 5583 25 is_stmt 0 view .LVU3353 + 9533 0042 2823 movs r3, #40 + 9534 0044 84F84130 strb r3, [r4, #65] +5584:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9535 .loc 1 5584 5 is_stmt 1 view .LVU3354 +5584:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9536 .loc 1 5584 25 is_stmt 0 view .LVU3355 + 9537 0048 2123 movs r3, #33 + 9538 004a 2363 str r3, [r4, #48] +5587:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9539 .loc 1 5587 5 is_stmt 1 view .LVU3356 + 9540 004c 0121 movs r1, #1 + 9541 004e 2046 mov r0, r4 + 9542 .LVL639: +5587:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9543 .loc 1 5587 5 is_stmt 0 view .LVU3357 + 9544 0050 FFF7FEFF bl I2C_Disable_IRQ + 9545 .LVL640: +5590:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9546 .loc 1 5590 5 is_stmt 1 view .LVU3358 + ARM GAS /tmp/ccE2rRGE.s page 343 + + +5590:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9547 .loc 1 5590 5 view .LVU3359 + 9548 0054 0023 movs r3, #0 + 9549 0056 84F84030 strb r3, [r4, #64] +5590:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9550 .loc 1 5590 5 view .LVU3360 +5596:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + 9551 .loc 1 5596 5 view .LVU3361 + 9552 005a 2046 mov r0, r4 + 9553 005c FFF7FEFF bl HAL_I2C_SlaveTxCpltCallback + 9554 .LVL641: + 9555 0060 E6E7 b .L600 + 9556 .LVL642: + 9557 .L607: +5603:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_RX; + 9558 .loc 1 5603 5 view .LVU3362 +5603:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_RX; + 9559 .loc 1 5603 25 is_stmt 0 view .LVU3363 + 9560 0062 2823 movs r3, #40 + 9561 0064 84F84130 strb r3, [r4, #65] +5604:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9562 .loc 1 5604 5 is_stmt 1 view .LVU3364 +5604:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9563 .loc 1 5604 25 is_stmt 0 view .LVU3365 + 9564 0068 2223 movs r3, #34 + 9565 006a 2363 str r3, [r4, #48] +5607:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9566 .loc 1 5607 5 is_stmt 1 view .LVU3366 + 9567 006c 0221 movs r1, #2 + 9568 006e 2046 mov r0, r4 + 9569 .LVL643: +5607:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9570 .loc 1 5607 5 is_stmt 0 view .LVU3367 + 9571 0070 FFF7FEFF bl I2C_Disable_IRQ + 9572 .LVL644: +5610:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9573 .loc 1 5610 5 is_stmt 1 view .LVU3368 +5610:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9574 .loc 1 5610 5 view .LVU3369 + 9575 0074 0023 movs r3, #0 + 9576 0076 84F84030 strb r3, [r4, #64] +5610:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9577 .loc 1 5610 5 view .LVU3370 +5616:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + 9578 .loc 1 5616 5 view .LVU3371 + 9579 007a 2046 mov r0, r4 + 9580 007c FFF7FEFF bl HAL_I2C_SlaveRxCpltCallback + 9581 .LVL645: +5622:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 9582 .loc 1 5622 3 view .LVU3372 +5623:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9583 .loc 1 5623 1 is_stmt 0 view .LVU3373 + 9584 0080 D6E7 b .L600 + 9585 .cfi_endproc + 9586 .LFE187: + 9588 .section .text.I2C_DMASlaveTransmitCplt,"ax",%progbits + 9589 .align 1 + ARM GAS /tmp/ccE2rRGE.s page 344 + + + 9590 .syntax unified + 9591 .thumb + 9592 .thumb_func + 9594 I2C_DMASlaveTransmitCplt: + 9595 .LVL646: + 9596 .LFB195: +6206:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Derogation MISRAC2012-Rule-11.5 */ + 9597 .loc 1 6206 1 is_stmt 1 view -0 + 9598 .cfi_startproc + 9599 @ args = 0, pretend = 0, frame = 0 + 9600 @ frame_needed = 0, uses_anonymous_args = 0 +6206:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Derogation MISRAC2012-Rule-11.5 */ + 9601 .loc 1 6206 1 is_stmt 0 view .LVU3375 + 9602 0000 08B5 push {r3, lr} + 9603 .cfi_def_cfa_offset 8 + 9604 .cfi_offset 3, -8 + 9605 .cfi_offset 14, -4 +6208:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tmpoptions = hi2c->XferOptions; + 9606 .loc 1 6208 3 is_stmt 1 view .LVU3376 +6208:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tmpoptions = hi2c->XferOptions; + 9607 .loc 1 6208 22 is_stmt 0 view .LVU3377 + 9608 0002 406A ldr r0, [r0, #36] + 9609 .LVL647: +6209:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9610 .loc 1 6209 3 is_stmt 1 view .LVU3378 +6209:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9611 .loc 1 6209 12 is_stmt 0 view .LVU3379 + 9612 0004 C36A ldr r3, [r0, #44] + 9613 .LVL648: +6211:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9614 .loc 1 6211 3 is_stmt 1 view .LVU3380 +6211:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9615 .loc 1 6211 6 is_stmt 0 view .LVU3381 + 9616 0006 B3F1807F cmp r3, #16777216 + 9617 000a 00D0 beq .L609 +6211:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9618 .loc 1 6211 38 discriminator 1 view .LVU3382 + 9619 000c 33B9 cbnz r3, .L608 + 9620 .L609: +6214:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9621 .loc 1 6214 5 is_stmt 1 view .LVU3383 +6214:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9622 .loc 1 6214 9 is_stmt 0 view .LVU3384 + 9623 000e 0268 ldr r2, [r0] +6214:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9624 .loc 1 6214 19 view .LVU3385 + 9625 0010 1368 ldr r3, [r2] + 9626 .LVL649: +6214:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9627 .loc 1 6214 25 view .LVU3386 + 9628 0012 23F48043 bic r3, r3, #16384 + 9629 0016 1360 str r3, [r2] +6218:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 9630 .loc 1 6218 5 is_stmt 1 view .LVU3387 + 9631 0018 FFF7FEFF bl I2C_ITSlaveSeqCplt + 9632 .LVL650: + 9633 .L608: + ARM GAS /tmp/ccE2rRGE.s page 345 + + +6226:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9634 .loc 1 6226 1 is_stmt 0 view .LVU3388 + 9635 001c 08BD pop {r3, pc} + 9636 .cfi_endproc + 9637 .LFE195: + 9639 .section .text.I2C_DMASlaveReceiveCplt,"ax",%progbits + 9640 .align 1 + 9641 .syntax unified + 9642 .thumb + 9643 .thumb_func + 9645 I2C_DMASlaveReceiveCplt: + 9646 .LVL651: + 9647 .LFB197: +6284:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Derogation MISRAC2012-Rule-11.5 */ + 9648 .loc 1 6284 1 is_stmt 1 view -0 + 9649 .cfi_startproc + 9650 @ args = 0, pretend = 0, frame = 0 + 9651 @ frame_needed = 0, uses_anonymous_args = 0 +6284:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Derogation MISRAC2012-Rule-11.5 */ + 9652 .loc 1 6284 1 is_stmt 0 view .LVU3390 + 9653 0000 08B5 push {r3, lr} + 9654 .cfi_def_cfa_offset 8 + 9655 .cfi_offset 3, -8 + 9656 .cfi_offset 14, -4 +6286:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tmpoptions = hi2c->XferOptions; + 9657 .loc 1 6286 3 is_stmt 1 view .LVU3391 +6286:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tmpoptions = hi2c->XferOptions; + 9658 .loc 1 6286 22 is_stmt 0 view .LVU3392 + 9659 0002 406A ldr r0, [r0, #36] + 9660 .LVL652: +6287:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9661 .loc 1 6287 3 is_stmt 1 view .LVU3393 +6287:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9662 .loc 1 6287 12 is_stmt 0 view .LVU3394 + 9663 0004 C26A ldr r2, [r0, #44] + 9664 .LVL653: +6289:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (tmpoptions != I2C_NO_OPTION_FRAME)) + 9665 .loc 1 6289 3 is_stmt 1 view .LVU3395 +6289:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (tmpoptions != I2C_NO_OPTION_FRAME)) + 9666 .loc 1 6289 8 is_stmt 0 view .LVU3396 + 9667 0006 C36B ldr r3, [r0, #60] + 9668 0008 1B68 ldr r3, [r3] + 9669 000a 5B68 ldr r3, [r3, #4] +6289:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (tmpoptions != I2C_NO_OPTION_FRAME)) + 9670 .loc 1 6289 6 view .LVU3397 + 9671 000c 13B9 cbnz r3, .L612 +6289:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (tmpoptions != I2C_NO_OPTION_FRAME)) + 9672 .loc 1 6289 51 discriminator 1 view .LVU3398 + 9673 000e 12F5803F cmn r2, #65536 + 9674 0012 00D1 bne .L615 + 9675 .LVL654: + 9676 .L612: +6304:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9677 .loc 1 6304 1 view .LVU3399 + 9678 0014 08BD pop {r3, pc} + 9679 .LVL655: + 9680 .L615: + ARM GAS /tmp/ccE2rRGE.s page 346 + + +6293:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9681 .loc 1 6293 5 is_stmt 1 view .LVU3400 +6293:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9682 .loc 1 6293 9 is_stmt 0 view .LVU3401 + 9683 0016 0268 ldr r2, [r0] + 9684 .LVL656: +6293:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9685 .loc 1 6293 19 view .LVU3402 + 9686 0018 1368 ldr r3, [r2] +6293:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9687 .loc 1 6293 25 view .LVU3403 + 9688 001a 23F40043 bic r3, r3, #32768 + 9689 001e 1360 str r3, [r2] +6296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 9690 .loc 1 6296 5 is_stmt 1 view .LVU3404 + 9691 0020 FFF7FEFF bl I2C_ITSlaveSeqCplt + 9692 .LVL657: +6303:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 9693 .loc 1 6303 3 view .LVU3405 +6304:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9694 .loc 1 6304 1 is_stmt 0 view .LVU3406 + 9695 0024 F6E7 b .L612 + 9696 .cfi_endproc + 9697 .LFE197: + 9699 .section .text.HAL_I2C_AddrCallback,"ax",%progbits + 9700 .align 1 + 9701 .weak HAL_I2C_AddrCallback + 9702 .syntax unified + 9703 .thumb + 9704 .thumb_func + 9706 HAL_I2C_AddrCallback: + 9707 .LVL658: + 9708 .LFB170: +4569:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prevent unused argument(s) compilation warning */ + 9709 .loc 1 4569 1 is_stmt 1 view -0 + 9710 .cfi_startproc + 9711 @ args = 0, pretend = 0, frame = 0 + 9712 @ frame_needed = 0, uses_anonymous_args = 0 + 9713 @ link register save eliminated. +4571:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** UNUSED(TransferDirection); + 9714 .loc 1 4571 3 view .LVU3408 +4572:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** UNUSED(AddrMatchCode); + 9715 .loc 1 4572 3 view .LVU3409 +4573:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9716 .loc 1 4573 3 view .LVU3410 +4578:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9717 .loc 1 4578 1 is_stmt 0 view .LVU3411 + 9718 0000 7047 bx lr + 9719 .cfi_endproc + 9720 .LFE170: + 9722 .section .text.I2C_ITAddrCplt,"ax",%progbits + 9723 .align 1 + 9724 .syntax unified + 9725 .thumb + 9726 .thumb_func + 9728 I2C_ITAddrCplt: + 9729 .LVL659: + ARM GAS /tmp/ccE2rRGE.s page 347 + + + 9730 .LFB185: +5410:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint8_t transferdirection; + 9731 .loc 1 5410 1 is_stmt 1 view -0 + 9732 .cfi_startproc + 9733 @ args = 0, pretend = 0, frame = 0 + 9734 @ frame_needed = 0, uses_anonymous_args = 0 +5410:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint8_t transferdirection; + 9735 .loc 1 5410 1 is_stmt 0 view .LVU3413 + 9736 0000 F8B5 push {r3, r4, r5, r6, r7, lr} + 9737 .cfi_def_cfa_offset 24 + 9738 .cfi_offset 3, -24 + 9739 .cfi_offset 4, -20 + 9740 .cfi_offset 5, -16 + 9741 .cfi_offset 6, -12 + 9742 .cfi_offset 7, -8 + 9743 .cfi_offset 14, -4 + 9744 0002 0446 mov r4, r0 +5411:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint16_t slaveaddrcode; + 9745 .loc 1 5411 3 is_stmt 1 view .LVU3414 +5412:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint16_t ownadd1code; + 9746 .loc 1 5412 3 view .LVU3415 +5413:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint16_t ownadd2code; + 9747 .loc 1 5413 3 view .LVU3416 +5414:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9748 .loc 1 5414 3 view .LVU3417 +5417:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9749 .loc 1 5417 3 view .LVU3418 +5420:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9750 .loc 1 5420 3 view .LVU3419 +5420:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9751 .loc 1 5420 22 is_stmt 0 view .LVU3420 + 9752 0004 90F84130 ldrb r3, [r0, #65] @ zero_extendqisi2 +5420:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9753 .loc 1 5420 6 view .LVU3421 + 9754 0008 03F02803 and r3, r3, #40 + 9755 000c 282B cmp r3, #40 + 9756 000e 06D0 beq .L623 +5492:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9757 .loc 1 5492 5 is_stmt 1 view .LVU3422 + 9758 0010 0368 ldr r3, [r0] + 9759 0012 0822 movs r2, #8 + 9760 0014 DA61 str r2, [r3, #28] +5495:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 9761 .loc 1 5495 5 view .LVU3423 +5495:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 9762 .loc 1 5495 5 view .LVU3424 + 9763 0016 0023 movs r3, #0 + 9764 0018 80F84030 strb r3, [r0, #64] +5495:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 9765 .loc 1 5495 5 view .LVU3425 + 9766 .LVL660: + 9767 .L617: +5497:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9768 .loc 1 5497 1 is_stmt 0 view .LVU3426 + 9769 001c F8BD pop {r3, r4, r5, r6, r7, pc} + 9770 .LVL661: + 9771 .L623: + ARM GAS /tmp/ccE2rRGE.s page 348 + + +5422:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** slaveaddrcode = I2C_GET_ADDR_MATCH(hi2c); + 9772 .loc 1 5422 5 is_stmt 1 view .LVU3427 +5422:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** slaveaddrcode = I2C_GET_ADDR_MATCH(hi2c); + 9773 .loc 1 5422 25 is_stmt 0 view .LVU3428 + 9774 001e 0368 ldr r3, [r0] + 9775 0020 9E69 ldr r6, [r3, #24] +5422:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** slaveaddrcode = I2C_GET_ADDR_MATCH(hi2c); + 9776 .loc 1 5422 23 view .LVU3429 + 9777 0022 C6F30046 ubfx r6, r6, #16, #1 + 9778 .LVL662: +5423:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** ownadd1code = I2C_GET_OWN_ADDRESS1(hi2c); + 9779 .loc 1 5423 5 is_stmt 1 view .LVU3430 +5423:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** ownadd1code = I2C_GET_OWN_ADDRESS1(hi2c); + 9780 .loc 1 5423 25 is_stmt 0 view .LVU3431 + 9781 0026 9A69 ldr r2, [r3, #24] + 9782 0028 120C lsrs r2, r2, #16 +5423:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** ownadd1code = I2C_GET_OWN_ADDRESS1(hi2c); + 9783 .loc 1 5423 23 view .LVU3432 + 9784 002a 02F0FE05 and r5, r2, #254 + 9785 .LVL663: +5424:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** ownadd2code = I2C_GET_OWN_ADDRESS2(hi2c); + 9786 .loc 1 5424 5 is_stmt 1 view .LVU3433 +5424:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** ownadd2code = I2C_GET_OWN_ADDRESS2(hi2c); + 9787 .loc 1 5424 25 is_stmt 0 view .LVU3434 + 9788 002e 9A68 ldr r2, [r3, #8] +5424:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** ownadd2code = I2C_GET_OWN_ADDRESS2(hi2c); + 9789 .loc 1 5424 23 view .LVU3435 + 9790 0030 C2F30902 ubfx r2, r2, #0, #10 + 9791 .LVL664: +5425:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9792 .loc 1 5425 5 is_stmt 1 view .LVU3436 +5425:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9793 .loc 1 5425 25 is_stmt 0 view .LVU3437 + 9794 0034 DF68 ldr r7, [r3, #12] +5425:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9795 .loc 1 5425 23 view .LVU3438 + 9796 0036 07F0FE07 and r7, r7, #254 + 9797 .LVL665: +5428:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9798 .loc 1 5428 5 is_stmt 1 view .LVU3439 +5428:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9799 .loc 1 5428 19 is_stmt 0 view .LVU3440 + 9800 003a C168 ldr r1, [r0, #12] + 9801 .LVL666: +5428:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9802 .loc 1 5428 8 view .LVU3441 + 9803 003c 0229 cmp r1, #2 + 9804 003e 22D1 bne .L619 +5430:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9805 .loc 1 5430 7 is_stmt 1 view .LVU3442 +5430:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9806 .loc 1 5430 44 is_stmt 0 view .LVU3443 + 9807 0040 85EAD215 eor r5, r5, r2, lsr #7 + 9808 .LVL667: +5430:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9809 .loc 1 5430 10 view .LVU3444 + 9810 0044 15F0060F tst r5, #6 + ARM GAS /tmp/ccE2rRGE.s page 349 + + + 9811 0048 10D1 bne .L620 +5432:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->AddrEventCount++; + 9812 .loc 1 5432 9 is_stmt 1 view .LVU3445 + 9813 .LVL668: +5433:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->AddrEventCount == 2U) + 9814 .loc 1 5433 9 view .LVU3446 +5433:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->AddrEventCount == 2U) + 9815 .loc 1 5433 13 is_stmt 0 view .LVU3447 + 9816 004a 816C ldr r1, [r0, #72] +5433:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->AddrEventCount == 2U) + 9817 .loc 1 5433 29 view .LVU3448 + 9818 004c 0131 adds r1, r1, #1 + 9819 004e 8164 str r1, [r0, #72] +5434:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9820 .loc 1 5434 9 is_stmt 1 view .LVU3449 +5434:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9821 .loc 1 5434 17 is_stmt 0 view .LVU3450 + 9822 0050 816C ldr r1, [r0, #72] +5434:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9823 .loc 1 5434 12 view .LVU3451 + 9824 0052 0229 cmp r1, #2 + 9825 0054 E2D1 bne .L617 +5437:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9826 .loc 1 5437 11 is_stmt 1 view .LVU3452 +5437:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9827 .loc 1 5437 32 is_stmt 0 view .LVU3453 + 9828 0056 0021 movs r1, #0 + 9829 0058 8164 str r1, [r0, #72] +5440:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9830 .loc 1 5440 11 is_stmt 1 view .LVU3454 + 9831 005a 0820 movs r0, #8 + 9832 .LVL669: +5440:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9833 .loc 1 5440 11 is_stmt 0 view .LVU3455 + 9834 005c D861 str r0, [r3, #28] +5443:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9835 .loc 1 5443 11 is_stmt 1 view .LVU3456 +5443:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9836 .loc 1 5443 11 view .LVU3457 + 9837 005e 84F84010 strb r1, [r4, #64] +5443:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9838 .loc 1 5443 11 view .LVU3458 +5449:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + 9839 .loc 1 5449 11 view .LVU3459 + 9840 0062 3146 mov r1, r6 + 9841 0064 2046 mov r0, r4 + 9842 0066 FFF7FEFF bl HAL_I2C_AddrCallback + 9843 .LVL670: +5449:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + 9844 .loc 1 5449 11 is_stmt 0 view .LVU3460 + 9845 006a D7E7 b .L617 + 9846 .LVL671: + 9847 .L620: +5455:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9848 .loc 1 5455 9 is_stmt 1 view .LVU3461 +5458:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9849 .loc 1 5458 9 view .LVU3462 + ARM GAS /tmp/ccE2rRGE.s page 350 + + + 9850 006c 4FF40041 mov r1, #32768 + 9851 0070 FFF7FEFF bl I2C_Disable_IRQ + 9852 .LVL672: +5461:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9853 .loc 1 5461 9 view .LVU3463 +5461:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9854 .loc 1 5461 9 view .LVU3464 + 9855 0074 0023 movs r3, #0 + 9856 0076 84F84030 strb r3, [r4, #64] +5461:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9857 .loc 1 5461 9 view .LVU3465 +5467:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + 9858 .loc 1 5467 9 view .LVU3466 + 9859 007a 3A46 mov r2, r7 + 9860 007c 3146 mov r1, r6 + 9861 007e 2046 mov r0, r4 + 9862 0080 FFF7FEFF bl HAL_I2C_AddrCallback + 9863 .LVL673: + 9864 0084 CAE7 b .L617 + 9865 .LVL674: + 9866 .L619: +5475:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9867 .loc 1 5475 7 view .LVU3467 + 9868 0086 4FF40041 mov r1, #32768 + 9869 008a FFF7FEFF bl I2C_Disable_IRQ + 9870 .LVL675: +5478:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9871 .loc 1 5478 7 view .LVU3468 +5478:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9872 .loc 1 5478 7 view .LVU3469 + 9873 008e 0023 movs r3, #0 + 9874 0090 84F84030 strb r3, [r4, #64] +5478:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9875 .loc 1 5478 7 view .LVU3470 +5484:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + 9876 .loc 1 5484 7 view .LVU3471 + 9877 0094 2A46 mov r2, r5 + 9878 0096 3146 mov r1, r6 + 9879 0098 2046 mov r0, r4 + 9880 009a FFF7FEFF bl HAL_I2C_AddrCallback + 9881 .LVL676: + 9882 009e BDE7 b .L617 + 9883 .cfi_endproc + 9884 .LFE185: + 9886 .section .text.HAL_I2C_ListenCpltCallback,"ax",%progbits + 9887 .align 1 + 9888 .weak HAL_I2C_ListenCpltCallback + 9889 .syntax unified + 9890 .thumb + 9891 .thumb_func + 9893 HAL_I2C_ListenCpltCallback: + 9894 .LVL677: + 9895 .LFB171: +4587:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prevent unused argument(s) compilation warning */ + 9896 .loc 1 4587 1 view -0 + 9897 .cfi_startproc + 9898 @ args = 0, pretend = 0, frame = 0 + ARM GAS /tmp/ccE2rRGE.s page 351 + + + 9899 @ frame_needed = 0, uses_anonymous_args = 0 + 9900 @ link register save eliminated. +4589:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9901 .loc 1 4589 3 view .LVU3473 +4594:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9902 .loc 1 4594 1 is_stmt 0 view .LVU3474 + 9903 0000 7047 bx lr + 9904 .cfi_endproc + 9905 .LFE171: + 9907 .section .text.I2C_ITListenCplt,"ax",%progbits + 9908 .align 1 + 9909 .syntax unified + 9910 .thumb + 9911 .thumb_func + 9913 I2C_ITListenCplt: + 9914 .LVL678: + 9915 .LFB190: +5934:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Reset handle parameters */ + 9916 .loc 1 5934 1 is_stmt 1 view -0 + 9917 .cfi_startproc + 9918 @ args = 0, pretend = 0, frame = 0 + 9919 @ frame_needed = 0, uses_anonymous_args = 0 +5934:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Reset handle parameters */ + 9920 .loc 1 5934 1 is_stmt 0 view .LVU3476 + 9921 0000 10B5 push {r4, lr} + 9922 .cfi_def_cfa_offset 8 + 9923 .cfi_offset 4, -8 + 9924 .cfi_offset 14, -4 + 9925 0002 0446 mov r4, r0 +5936:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_NONE; + 9926 .loc 1 5936 3 is_stmt 1 view .LVU3477 +5936:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_NONE; + 9927 .loc 1 5936 21 is_stmt 0 view .LVU3478 + 9928 0004 174B ldr r3, .L628 + 9929 0006 C362 str r3, [r0, #44] +5937:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; + 9930 .loc 1 5937 3 is_stmt 1 view .LVU3479 +5937:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; + 9931 .loc 1 5937 23 is_stmt 0 view .LVU3480 + 9932 0008 0023 movs r3, #0 + 9933 000a 0363 str r3, [r0, #48] +5938:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 9934 .loc 1 5938 3 is_stmt 1 view .LVU3481 +5938:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->Mode = HAL_I2C_MODE_NONE; + 9935 .loc 1 5938 15 is_stmt 0 view .LVU3482 + 9936 000c 2022 movs r2, #32 + 9937 000e 80F84120 strb r2, [r0, #65] +5939:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = NULL; + 9938 .loc 1 5939 3 is_stmt 1 view .LVU3483 +5939:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = NULL; + 9939 .loc 1 5939 14 is_stmt 0 view .LVU3484 + 9940 0012 80F84230 strb r3, [r0, #66] +5940:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9941 .loc 1 5940 3 is_stmt 1 view .LVU3485 +5940:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9942 .loc 1 5940 17 is_stmt 0 view .LVU3486 + 9943 0016 4363 str r3, [r0, #52] + ARM GAS /tmp/ccE2rRGE.s page 352 + + +5943:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9944 .loc 1 5943 3 is_stmt 1 view .LVU3487 +5943:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9945 .loc 1 5943 6 is_stmt 0 view .LVU3488 + 9946 0018 11F0040F tst r1, #4 + 9947 001c 13D0 beq .L626 +5946:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9948 .loc 1 5946 5 is_stmt 1 view .LVU3489 +5946:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9949 .loc 1 5946 36 is_stmt 0 view .LVU3490 + 9950 001e 0368 ldr r3, [r0] +5946:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9951 .loc 1 5946 46 view .LVU3491 + 9952 0020 5A6A ldr r2, [r3, #36] +5946:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9953 .loc 1 5946 10 view .LVU3492 + 9954 0022 436A ldr r3, [r0, #36] +5946:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9955 .loc 1 5946 21 view .LVU3493 + 9956 0024 1A70 strb r2, [r3] +5949:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9957 .loc 1 5949 5 is_stmt 1 view .LVU3494 +5949:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9958 .loc 1 5949 9 is_stmt 0 view .LVU3495 + 9959 0026 436A ldr r3, [r0, #36] +5949:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9960 .loc 1 5949 19 view .LVU3496 + 9961 0028 0133 adds r3, r3, #1 + 9962 002a 4362 str r3, [r0, #36] +5951:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9963 .loc 1 5951 5 is_stmt 1 view .LVU3497 +5951:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9964 .loc 1 5951 14 is_stmt 0 view .LVU3498 + 9965 002c 038D ldrh r3, [r0, #40] +5951:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 9966 .loc 1 5951 8 view .LVU3499 + 9967 002e 53B1 cbz r3, .L626 +5953:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount--; + 9968 .loc 1 5953 7 is_stmt 1 view .LVU3500 +5953:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount--; + 9969 .loc 1 5953 21 is_stmt 0 view .LVU3501 + 9970 0030 013B subs r3, r3, #1 + 9971 0032 0385 strh r3, [r0, #40] @ movhi +5954:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9972 .loc 1 5954 7 is_stmt 1 view .LVU3502 +5954:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9973 .loc 1 5954 11 is_stmt 0 view .LVU3503 + 9974 0034 438D ldrh r3, [r0, #42] + 9975 0036 9BB2 uxth r3, r3 +5954:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9976 .loc 1 5954 22 view .LVU3504 + 9977 0038 013B subs r3, r3, #1 + 9978 003a 9BB2 uxth r3, r3 + 9979 003c 4385 strh r3, [r0, #42] @ movhi +5957:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 9980 .loc 1 5957 7 is_stmt 1 view .LVU3505 +5957:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + ARM GAS /tmp/ccE2rRGE.s page 353 + + + 9981 .loc 1 5957 11 is_stmt 0 view .LVU3506 + 9982 003e 436C ldr r3, [r0, #68] +5957:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 9983 .loc 1 5957 23 view .LVU3507 + 9984 0040 43F00403 orr r3, r3, #4 + 9985 0044 4364 str r3, [r0, #68] + 9986 .L626: +5962:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9987 .loc 1 5962 3 is_stmt 1 view .LVU3508 + 9988 0046 48F20301 movw r1, #32771 + 9989 .LVL679: +5962:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9990 .loc 1 5962 3 is_stmt 0 view .LVU3509 + 9991 004a 2046 mov r0, r4 + 9992 .LVL680: +5962:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9993 .loc 1 5962 3 view .LVU3510 + 9994 004c FFF7FEFF bl I2C_Disable_IRQ + 9995 .LVL681: +5965:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 9996 .loc 1 5965 3 is_stmt 1 view .LVU3511 + 9997 0050 2368 ldr r3, [r4] + 9998 0052 1022 movs r2, #16 + 9999 0054 DA61 str r2, [r3, #28] +5968:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10000 .loc 1 5968 3 view .LVU3512 +5968:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10001 .loc 1 5968 3 view .LVU3513 + 10002 0056 0023 movs r3, #0 + 10003 0058 84F84030 strb r3, [r4, #64] +5968:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10004 .loc 1 5968 3 view .LVU3514 +5974:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + 10005 .loc 1 5974 3 view .LVU3515 + 10006 005c 2046 mov r0, r4 + 10007 005e FFF7FEFF bl HAL_I2C_ListenCpltCallback + 10008 .LVL682: +5976:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10009 .loc 1 5976 1 is_stmt 0 view .LVU3516 + 10010 0062 10BD pop {r4, pc} + 10011 .LVL683: + 10012 .L629: +5976:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10013 .loc 1 5976 1 view .LVU3517 + 10014 .align 2 + 10015 .L628: + 10016 0064 0000FFFF .word -65536 + 10017 .cfi_endproc + 10018 .LFE190: + 10020 .section .text.HAL_I2C_MemTxCpltCallback,"ax",%progbits + 10021 .align 1 + 10022 .weak HAL_I2C_MemTxCpltCallback + 10023 .syntax unified + 10024 .thumb + 10025 .thumb_func + 10027 HAL_I2C_MemTxCpltCallback: + 10028 .LVL684: + ARM GAS /tmp/ccE2rRGE.s page 354 + + + 10029 .LFB172: +4603:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prevent unused argument(s) compilation warning */ + 10030 .loc 1 4603 1 is_stmt 1 view -0 + 10031 .cfi_startproc + 10032 @ args = 0, pretend = 0, frame = 0 + 10033 @ frame_needed = 0, uses_anonymous_args = 0 + 10034 @ link register save eliminated. +4605:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10035 .loc 1 4605 3 view .LVU3519 +4610:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10036 .loc 1 4610 1 is_stmt 0 view .LVU3520 + 10037 0000 7047 bx lr + 10038 .cfi_endproc + 10039 .LFE172: + 10041 .section .text.HAL_I2C_MemRxCpltCallback,"ax",%progbits + 10042 .align 1 + 10043 .weak HAL_I2C_MemRxCpltCallback + 10044 .syntax unified + 10045 .thumb + 10046 .thumb_func + 10048 HAL_I2C_MemRxCpltCallback: + 10049 .LVL685: + 10050 .LFB173: +4619:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prevent unused argument(s) compilation warning */ + 10051 .loc 1 4619 1 is_stmt 1 view -0 + 10052 .cfi_startproc + 10053 @ args = 0, pretend = 0, frame = 0 + 10054 @ frame_needed = 0, uses_anonymous_args = 0 + 10055 @ link register save eliminated. +4621:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10056 .loc 1 4621 3 view .LVU3522 +4626:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10057 .loc 1 4626 1 is_stmt 0 view .LVU3523 + 10058 0000 7047 bx lr + 10059 .cfi_endproc + 10060 .LFE173: + 10062 .section .text.HAL_I2C_ErrorCallback,"ax",%progbits + 10063 .align 1 + 10064 .weak HAL_I2C_ErrorCallback + 10065 .syntax unified + 10066 .thumb + 10067 .thumb_func + 10069 HAL_I2C_ErrorCallback: + 10070 .LVL686: + 10071 .LFB174: +4635:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prevent unused argument(s) compilation warning */ + 10072 .loc 1 4635 1 is_stmt 1 view -0 + 10073 .cfi_startproc + 10074 @ args = 0, pretend = 0, frame = 0 + 10075 @ frame_needed = 0, uses_anonymous_args = 0 + 10076 @ link register save eliminated. +4637:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10077 .loc 1 4637 3 view .LVU3525 +4642:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10078 .loc 1 4642 1 is_stmt 0 view .LVU3526 + 10079 0000 7047 bx lr + 10080 .cfi_endproc + ARM GAS /tmp/ccE2rRGE.s page 355 + + + 10081 .LFE174: + 10083 .section .text.HAL_I2C_AbortCpltCallback,"ax",%progbits + 10084 .align 1 + 10085 .weak HAL_I2C_AbortCpltCallback + 10086 .syntax unified + 10087 .thumb + 10088 .thumb_func + 10090 HAL_I2C_AbortCpltCallback: + 10091 .LVL687: + 10092 .LFB175: +4651:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Prevent unused argument(s) compilation warning */ + 10093 .loc 1 4651 1 is_stmt 1 view -0 + 10094 .cfi_startproc + 10095 @ args = 0, pretend = 0, frame = 0 + 10096 @ frame_needed = 0, uses_anonymous_args = 0 + 10097 @ link register save eliminated. +4653:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10098 .loc 1 4653 3 view .LVU3528 +4658:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10099 .loc 1 4658 1 is_stmt 0 view .LVU3529 + 10100 0000 7047 bx lr + 10101 .cfi_endproc + 10102 .LFE175: + 10104 .section .text.I2C_TreatErrorCallback,"ax",%progbits + 10105 .align 1 + 10106 .syntax unified + 10107 .thumb + 10108 .thumb_func + 10110 I2C_TreatErrorCallback: + 10111 .LVL688: + 10112 .LFB192: +6097:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_ABORT) + 10113 .loc 1 6097 1 is_stmt 1 view -0 + 10114 .cfi_startproc + 10115 @ args = 0, pretend = 0, frame = 0 + 10116 @ frame_needed = 0, uses_anonymous_args = 0 +6097:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->State == HAL_I2C_STATE_ABORT) + 10117 .loc 1 6097 1 is_stmt 0 view .LVU3531 + 10118 0000 08B5 push {r3, lr} + 10119 .cfi_def_cfa_offset 8 + 10120 .cfi_offset 3, -8 + 10121 .cfi_offset 14, -4 +6098:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10122 .loc 1 6098 3 is_stmt 1 view .LVU3532 +6098:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10123 .loc 1 6098 11 is_stmt 0 view .LVU3533 + 10124 0002 90F84130 ldrb r3, [r0, #65] @ zero_extendqisi2 + 10125 0006 DBB2 uxtb r3, r3 +6098:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10126 .loc 1 6098 6 view .LVU3534 + 10127 0008 602B cmp r3, #96 + 10128 000a 06D0 beq .L638 +6115:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10129 .loc 1 6115 5 is_stmt 1 view .LVU3535 +6115:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10130 .loc 1 6115 25 is_stmt 0 view .LVU3536 + 10131 000c 0023 movs r3, #0 + ARM GAS /tmp/ccE2rRGE.s page 356 + + + 10132 000e 0363 str r3, [r0, #48] +6118:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10133 .loc 1 6118 5 is_stmt 1 view .LVU3537 +6118:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10134 .loc 1 6118 5 view .LVU3538 + 10135 0010 80F84030 strb r3, [r0, #64] +6118:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10136 .loc 1 6118 5 view .LVU3539 +6124:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + 10137 .loc 1 6124 5 view .LVU3540 + 10138 0014 FFF7FEFF bl HAL_I2C_ErrorCallback + 10139 .LVL689: + 10140 .L634: +6127:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10141 .loc 1 6127 1 is_stmt 0 view .LVU3541 + 10142 0018 08BD pop {r3, pc} + 10143 .LVL690: + 10144 .L638: +6100:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_NONE; + 10145 .loc 1 6100 5 is_stmt 1 view .LVU3542 +6100:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_NONE; + 10146 .loc 1 6100 17 is_stmt 0 view .LVU3543 + 10147 001a 2023 movs r3, #32 + 10148 001c 80F84130 strb r3, [r0, #65] +6101:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10149 .loc 1 6101 5 is_stmt 1 view .LVU3544 +6101:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10150 .loc 1 6101 25 is_stmt 0 view .LVU3545 + 10151 0020 0023 movs r3, #0 + 10152 0022 0363 str r3, [r0, #48] +6104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10153 .loc 1 6104 5 is_stmt 1 view .LVU3546 +6104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10154 .loc 1 6104 5 view .LVU3547 + 10155 0024 80F84030 strb r3, [r0, #64] +6104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10156 .loc 1 6104 5 view .LVU3548 +6110:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + 10157 .loc 1 6110 5 view .LVU3549 + 10158 0028 FFF7FEFF bl HAL_I2C_AbortCpltCallback + 10159 .LVL691: +6110:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + 10160 .loc 1 6110 5 is_stmt 0 view .LVU3550 + 10161 002c F4E7 b .L634 + 10162 .cfi_endproc + 10163 .LFE192: + 10165 .section .text.I2C_ITError,"ax",%progbits + 10166 .align 1 + 10167 .syntax unified + 10168 .thumb + 10169 .thumb_func + 10171 I2C_ITError: + 10172 .LVL692: + 10173 .LFB191: +5985:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_StateTypeDef tmpstate = hi2c->State; + 10174 .loc 1 5985 1 is_stmt 1 view -0 + 10175 .cfi_startproc + ARM GAS /tmp/ccE2rRGE.s page 357 + + + 10176 @ args = 0, pretend = 0, frame = 0 + 10177 @ frame_needed = 0, uses_anonymous_args = 0 +5985:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_StateTypeDef tmpstate = hi2c->State; + 10178 .loc 1 5985 1 is_stmt 0 view .LVU3552 + 10179 0000 10B5 push {r4, lr} + 10180 .cfi_def_cfa_offset 8 + 10181 .cfi_offset 4, -8 + 10182 .cfi_offset 14, -4 + 10183 0002 0446 mov r4, r0 +5986:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tmppreviousstate; + 10184 .loc 1 5986 3 is_stmt 1 view .LVU3553 +5986:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tmppreviousstate; + 10185 .loc 1 5986 24 is_stmt 0 view .LVU3554 + 10186 0004 90F84130 ldrb r3, [r0, #65] @ zero_extendqisi2 + 10187 .LVL693: +5987:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10188 .loc 1 5987 3 is_stmt 1 view .LVU3555 +5990:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; + 10189 .loc 1 5990 3 view .LVU3556 +5990:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; + 10190 .loc 1 5990 23 is_stmt 0 view .LVU3557 + 10191 0008 0022 movs r2, #0 + 10192 000a 80F84220 strb r2, [r0, #66] +5991:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = 0U; + 10193 .loc 1 5991 3 is_stmt 1 view .LVU3558 +5991:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = 0U; + 10194 .loc 1 5991 23 is_stmt 0 view .LVU3559 + 10195 000e 3B48 ldr r0, .L653 + 10196 .LVL694: +5991:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount = 0U; + 10197 .loc 1 5991 23 view .LVU3560 + 10198 0010 E062 str r0, [r4, #44] +5992:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10199 .loc 1 5992 3 is_stmt 1 view .LVU3561 +5992:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10200 .loc 1 5992 23 is_stmt 0 view .LVU3562 + 10201 0012 6285 strh r2, [r4, #42] @ movhi +5995:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10202 .loc 1 5995 3 is_stmt 1 view .LVU3563 +5995:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10203 .loc 1 5995 7 is_stmt 0 view .LVU3564 + 10204 0014 626C ldr r2, [r4, #68] +5995:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10205 .loc 1 5995 19 view .LVU3565 + 10206 0016 0A43 orrs r2, r2, r1 + 10207 0018 6264 str r2, [r4, #68] +5998:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (tmpstate == HAL_I2C_STATE_BUSY_TX_LISTEN) || + 10208 .loc 1 5998 3 is_stmt 1 view .LVU3566 +5999:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (tmpstate == HAL_I2C_STATE_BUSY_RX_LISTEN)) + 10209 .loc 1 5999 50 is_stmt 0 view .LVU3567 + 10210 001a 283B subs r3, r3, #40 + 10211 .LVL695: +5999:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (tmpstate == HAL_I2C_STATE_BUSY_RX_LISTEN)) + 10212 .loc 1 5999 50 view .LVU3568 + 10213 001c DBB2 uxtb r3, r3 +5998:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (tmpstate == HAL_I2C_STATE_BUSY_TX_LISTEN) || + 10214 .loc 1 5998 6 view .LVU3569 + ARM GAS /tmp/ccE2rRGE.s page 358 + + + 10215 001e 022B cmp r3, #2 + 10216 0020 19D8 bhi .L640 +6003:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10217 .loc 1 6003 5 is_stmt 1 view .LVU3570 + 10218 0022 0321 movs r1, #3 + 10219 .LVL696: +6003:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10220 .loc 1 6003 5 is_stmt 0 view .LVU3571 + 10221 0024 2046 mov r0, r4 + 10222 0026 FFF7FEFF bl I2C_Disable_IRQ + 10223 .LVL697: +6006:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Slave_ISR_IT; + 10224 .loc 1 6006 5 is_stmt 1 view .LVU3572 +6006:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = I2C_Slave_ISR_IT; + 10225 .loc 1 6006 25 is_stmt 0 view .LVU3573 + 10226 002a 2823 movs r3, #40 + 10227 002c 84F84130 strb r3, [r4, #65] +6007:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10228 .loc 1 6007 5 is_stmt 1 view .LVU3574 +6007:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10229 .loc 1 6007 25 is_stmt 0 view .LVU3575 + 10230 0030 334B ldr r3, .L653+4 + 10231 0032 6363 str r3, [r4, #52] + 10232 .L641: +6025:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((hi2c->hdmatx != NULL) && ((tmppreviousstate == I2C_STATE_MASTER_BUSY_TX) || \ + 10233 .loc 1 6025 3 is_stmt 1 view .LVU3576 +6025:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if ((hi2c->hdmatx != NULL) && ((tmppreviousstate == I2C_STATE_MASTER_BUSY_TX) || \ + 10234 .loc 1 6025 20 is_stmt 0 view .LVU3577 + 10235 0034 236B ldr r3, [r4, #48] + 10236 .LVL698: +6026:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (tmppreviousstate == I2C_STATE_SLAVE_BUSY_TX))) + 10237 .loc 1 6026 3 is_stmt 1 view .LVU3578 +6026:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (tmppreviousstate == I2C_STATE_SLAVE_BUSY_TX))) + 10238 .loc 1 6026 12 is_stmt 0 view .LVU3579 + 10239 0036 A26B ldr r2, [r4, #56] +6026:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (tmppreviousstate == I2C_STATE_SLAVE_BUSY_TX))) + 10240 .loc 1 6026 6 view .LVU3580 + 10241 0038 1AB1 cbz r2, .L643 +6026:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (tmppreviousstate == I2C_STATE_SLAVE_BUSY_TX))) + 10242 .loc 1 6026 30 discriminator 1 view .LVU3581 + 10243 003a 112B cmp r3, #17 + 10244 003c 1BD0 beq .L644 +6026:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (tmppreviousstate == I2C_STATE_SLAVE_BUSY_TX))) + 10245 .loc 1 6026 81 discriminator 2 view .LVU3582 + 10246 003e 212B cmp r3, #33 + 10247 0040 19D0 beq .L644 + 10248 .L643: +6056:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (tmppreviousstate == I2C_STATE_SLAVE_BUSY_RX))) + 10249 .loc 1 6056 8 is_stmt 1 view .LVU3583 +6056:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (tmppreviousstate == I2C_STATE_SLAVE_BUSY_RX))) + 10250 .loc 1 6056 17 is_stmt 0 view .LVU3584 + 10251 0042 E26B ldr r2, [r4, #60] +6056:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (tmppreviousstate == I2C_STATE_SLAVE_BUSY_RX))) + 10252 .loc 1 6056 11 view .LVU3585 + 10253 0044 1AB1 cbz r2, .L648 +6056:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (tmppreviousstate == I2C_STATE_SLAVE_BUSY_RX))) + 10254 .loc 1 6056 35 discriminator 1 view .LVU3586 + ARM GAS /tmp/ccE2rRGE.s page 359 + + + 10255 0046 122B cmp r3, #18 + 10256 0048 36D0 beq .L649 +6056:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (tmppreviousstate == I2C_STATE_SLAVE_BUSY_RX))) + 10257 .loc 1 6056 86 discriminator 2 view .LVU3587 + 10258 004a 222B cmp r3, #34 + 10259 004c 34D0 beq .L649 + 10260 .L648: +6087:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10261 .loc 1 6087 5 is_stmt 1 view .LVU3588 + 10262 004e 2046 mov r0, r4 + 10263 0050 FFF7FEFF bl I2C_TreatErrorCallback + 10264 .LVL699: + 10265 .L639: +6089:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10266 .loc 1 6089 1 is_stmt 0 view .LVU3589 + 10267 0054 10BD pop {r4, pc} + 10268 .LVL700: + 10269 .L640: +6012:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10270 .loc 1 6012 5 is_stmt 1 view .LVU3590 + 10271 0056 48F20301 movw r1, #32771 + 10272 .LVL701: +6012:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10273 .loc 1 6012 5 is_stmt 0 view .LVU3591 + 10274 005a 2046 mov r0, r4 + 10275 005c FFF7FEFF bl I2C_Disable_IRQ + 10276 .LVL702: +6016:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10277 .loc 1 6016 5 is_stmt 1 view .LVU3592 +6016:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10278 .loc 1 6016 13 is_stmt 0 view .LVU3593 + 10279 0060 94F84130 ldrb r3, [r4, #65] @ zero_extendqisi2 + 10280 0064 DBB2 uxtb r3, r3 +6016:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10281 .loc 1 6016 8 view .LVU3594 + 10282 0066 602B cmp r3, #96 + 10283 0068 02D0 beq .L642 +6019:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10284 .loc 1 6019 7 is_stmt 1 view .LVU3595 +6019:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10285 .loc 1 6019 27 is_stmt 0 view .LVU3596 + 10286 006a 2023 movs r3, #32 + 10287 006c 84F84130 strb r3, [r4, #65] + 10288 .L642: +6021:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10289 .loc 1 6021 5 is_stmt 1 view .LVU3597 +6021:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10290 .loc 1 6021 25 is_stmt 0 view .LVU3598 + 10291 0070 0023 movs r3, #0 + 10292 0072 6363 str r3, [r4, #52] + 10293 0074 DEE7 b .L641 + 10294 .LVL703: + 10295 .L644: +6029:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10296 .loc 1 6029 5 is_stmt 1 view .LVU3599 +6029:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10297 .loc 1 6029 14 is_stmt 0 view .LVU3600 + ARM GAS /tmp/ccE2rRGE.s page 360 + + + 10298 0076 2368 ldr r3, [r4] + 10299 .LVL704: +6029:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10300 .loc 1 6029 24 view .LVU3601 + 10301 0078 1A68 ldr r2, [r3] +6029:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10302 .loc 1 6029 8 view .LVU3602 + 10303 007a 12F4804F tst r2, #16384 + 10304 007e 03D0 beq .L645 +6031:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10305 .loc 1 6031 7 is_stmt 1 view .LVU3603 +6031:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10306 .loc 1 6031 21 is_stmt 0 view .LVU3604 + 10307 0080 1A68 ldr r2, [r3] +6031:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10308 .loc 1 6031 27 view .LVU3605 + 10309 0082 22F48042 bic r2, r2, #16384 + 10310 0086 1A60 str r2, [r3] + 10311 .L645: +6034:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10312 .loc 1 6034 5 is_stmt 1 view .LVU3606 +6034:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10313 .loc 1 6034 9 is_stmt 0 view .LVU3607 + 10314 0088 A06B ldr r0, [r4, #56] + 10315 008a FFF7FEFF bl HAL_DMA_GetState + 10316 .LVL705: +6034:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10317 .loc 1 6034 8 view .LVU3608 + 10318 008e 0128 cmp r0, #1 + 10319 0090 0ED0 beq .L646 +6038:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10320 .loc 1 6038 7 is_stmt 1 view .LVU3609 +6038:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10321 .loc 1 6038 11 is_stmt 0 view .LVU3610 + 10322 0092 A36B ldr r3, [r4, #56] +6038:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10323 .loc 1 6038 39 view .LVU3611 + 10324 0094 1B4A ldr r2, .L653+8 + 10325 0096 5A63 str r2, [r3, #52] +6041:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10326 .loc 1 6041 7 is_stmt 1 view .LVU3612 +6041:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10327 .loc 1 6041 7 view .LVU3613 + 10328 0098 0023 movs r3, #0 + 10329 009a 84F84030 strb r3, [r4, #64] +6041:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10330 .loc 1 6041 7 view .LVU3614 +6044:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10331 .loc 1 6044 7 view .LVU3615 +6044:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10332 .loc 1 6044 11 is_stmt 0 view .LVU3616 + 10333 009e A06B ldr r0, [r4, #56] + 10334 00a0 FFF7FEFF bl HAL_DMA_Abort_IT + 10335 .LVL706: +6044:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10336 .loc 1 6044 10 view .LVU3617 + 10337 00a4 0028 cmp r0, #0 + ARM GAS /tmp/ccE2rRGE.s page 361 + + + 10338 00a6 D5D0 beq .L639 +6047:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10339 .loc 1 6047 9 is_stmt 1 view .LVU3618 +6047:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10340 .loc 1 6047 13 is_stmt 0 view .LVU3619 + 10341 00a8 A06B ldr r0, [r4, #56] +6047:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10342 .loc 1 6047 21 view .LVU3620 + 10343 00aa 436B ldr r3, [r0, #52] +6047:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10344 .loc 1 6047 9 view .LVU3621 + 10345 00ac 9847 blx r3 + 10346 .LVL707: + 10347 00ae D1E7 b .L639 + 10348 .L646: +6052:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10349 .loc 1 6052 7 is_stmt 1 view .LVU3622 + 10350 00b0 2046 mov r0, r4 + 10351 00b2 FFF7FEFF bl I2C_TreatErrorCallback + 10352 .LVL708: + 10353 00b6 CDE7 b .L639 + 10354 .LVL709: + 10355 .L649: +6059:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10356 .loc 1 6059 5 view .LVU3623 +6059:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10357 .loc 1 6059 14 is_stmt 0 view .LVU3624 + 10358 00b8 2368 ldr r3, [r4] + 10359 .LVL710: +6059:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10360 .loc 1 6059 24 view .LVU3625 + 10361 00ba 1A68 ldr r2, [r3] +6059:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10362 .loc 1 6059 8 view .LVU3626 + 10363 00bc 12F4004F tst r2, #32768 + 10364 00c0 03D0 beq .L650 +6061:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10365 .loc 1 6061 7 is_stmt 1 view .LVU3627 +6061:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10366 .loc 1 6061 21 is_stmt 0 view .LVU3628 + 10367 00c2 1A68 ldr r2, [r3] +6061:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10368 .loc 1 6061 27 view .LVU3629 + 10369 00c4 22F40042 bic r2, r2, #32768 + 10370 00c8 1A60 str r2, [r3] + 10371 .L650: +6064:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10372 .loc 1 6064 5 is_stmt 1 view .LVU3630 +6064:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10373 .loc 1 6064 9 is_stmt 0 view .LVU3631 + 10374 00ca E06B ldr r0, [r4, #60] + 10375 00cc FFF7FEFF bl HAL_DMA_GetState + 10376 .LVL711: +6064:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10377 .loc 1 6064 8 view .LVU3632 + 10378 00d0 0128 cmp r0, #1 + 10379 00d2 0ED0 beq .L651 + ARM GAS /tmp/ccE2rRGE.s page 362 + + +6068:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10380 .loc 1 6068 7 is_stmt 1 view .LVU3633 +6068:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10381 .loc 1 6068 11 is_stmt 0 view .LVU3634 + 10382 00d4 E36B ldr r3, [r4, #60] +6068:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10383 .loc 1 6068 39 view .LVU3635 + 10384 00d6 0B4A ldr r2, .L653+8 + 10385 00d8 5A63 str r2, [r3, #52] +6071:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10386 .loc 1 6071 7 is_stmt 1 view .LVU3636 +6071:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10387 .loc 1 6071 7 view .LVU3637 + 10388 00da 0023 movs r3, #0 + 10389 00dc 84F84030 strb r3, [r4, #64] +6071:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10390 .loc 1 6071 7 view .LVU3638 +6074:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10391 .loc 1 6074 7 view .LVU3639 +6074:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10392 .loc 1 6074 11 is_stmt 0 view .LVU3640 + 10393 00e0 E06B ldr r0, [r4, #60] + 10394 00e2 FFF7FEFF bl HAL_DMA_Abort_IT + 10395 .LVL712: +6074:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10396 .loc 1 6074 10 view .LVU3641 + 10397 00e6 0028 cmp r0, #0 + 10398 00e8 B4D0 beq .L639 +6077:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10399 .loc 1 6077 9 is_stmt 1 view .LVU3642 +6077:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10400 .loc 1 6077 13 is_stmt 0 view .LVU3643 + 10401 00ea E06B ldr r0, [r4, #60] +6077:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10402 .loc 1 6077 21 view .LVU3644 + 10403 00ec 436B ldr r3, [r0, #52] +6077:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10404 .loc 1 6077 9 view .LVU3645 + 10405 00ee 9847 blx r3 + 10406 .LVL713: + 10407 00f0 B0E7 b .L639 + 10408 .L651: +6082:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10409 .loc 1 6082 7 is_stmt 1 view .LVU3646 + 10410 00f2 2046 mov r0, r4 + 10411 00f4 FFF7FEFF bl I2C_TreatErrorCallback + 10412 .LVL714: + 10413 00f8 ACE7 b .L639 + 10414 .L654: + 10415 00fa 00BF .align 2 + 10416 .L653: + 10417 00fc 0000FFFF .word -65536 + 10418 0100 00000000 .word I2C_Slave_ISR_IT + 10419 0104 00000000 .word I2C_DMAAbort + 10420 .cfi_endproc + 10421 .LFE191: + 10423 .section .text.I2C_ITSlaveCplt,"ax",%progbits + ARM GAS /tmp/ccE2rRGE.s page 363 + + + 10424 .align 1 + 10425 .syntax unified + 10426 .thumb + 10427 .thumb_func + 10429 I2C_ITSlaveCplt: + 10430 .LVL715: + 10431 .LFB189: +5775:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tmpcr1value = READ_REG(hi2c->Instance->CR1); + 10432 .loc 1 5775 1 view -0 + 10433 .cfi_startproc + 10434 @ args = 0, pretend = 0, frame = 0 + 10435 @ frame_needed = 0, uses_anonymous_args = 0 +5775:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tmpcr1value = READ_REG(hi2c->Instance->CR1); + 10436 .loc 1 5775 1 is_stmt 0 view .LVU3648 + 10437 0000 70B5 push {r4, r5, r6, lr} + 10438 .cfi_def_cfa_offset 16 + 10439 .cfi_offset 4, -16 + 10440 .cfi_offset 5, -12 + 10441 .cfi_offset 6, -8 + 10442 .cfi_offset 14, -4 + 10443 0002 0446 mov r4, r0 + 10444 0004 0D46 mov r5, r1 +5776:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tmpITFlags = ITFlags; + 10445 .loc 1 5776 3 is_stmt 1 view .LVU3649 +5776:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tmpITFlags = ITFlags; + 10446 .loc 1 5776 26 is_stmt 0 view .LVU3650 + 10447 0006 0268 ldr r2, [r0] +5776:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tmpITFlags = ITFlags; + 10448 .loc 1 5776 12 view .LVU3651 + 10449 0008 1668 ldr r6, [r2] + 10450 .LVL716: +5777:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_StateTypeDef tmpstate = hi2c->State; + 10451 .loc 1 5777 3 is_stmt 1 view .LVU3652 +5778:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10452 .loc 1 5778 3 view .LVU3653 +5778:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10453 .loc 1 5778 24 is_stmt 0 view .LVU3654 + 10454 000a 90F84130 ldrb r3, [r0, #65] @ zero_extendqisi2 + 10455 000e DBB2 uxtb r3, r3 + 10456 .LVL717: +5781:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10457 .loc 1 5781 3 is_stmt 1 view .LVU3655 + 10458 0010 2021 movs r1, #32 + 10459 .LVL718: +5781:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10460 .loc 1 5781 3 is_stmt 0 view .LVU3656 + 10461 0012 D161 str r1, [r2, #28] +5784:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10462 .loc 1 5784 3 is_stmt 1 view .LVU3657 +5784:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10463 .loc 1 5784 6 is_stmt 0 view .LVU3658 + 10464 0014 212B cmp r3, #33 + 10465 0016 0DD0 beq .L656 +5784:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10466 .loc 1 5784 43 discriminator 1 view .LVU3659 + 10467 0018 292B cmp r3, #41 + 10468 001a 0BD0 beq .L656 + ARM GAS /tmp/ccE2rRGE.s page 364 + + +5789:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10469 .loc 1 5789 8 is_stmt 1 view .LVU3660 +5789:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10470 .loc 1 5789 11 is_stmt 0 view .LVU3661 + 10471 001c 222B cmp r3, #34 + 10472 001e 01D0 beq .L659 +5789:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10473 .loc 1 5789 48 discriminator 1 view .LVU3662 + 10474 0020 2A2B cmp r3, #42 + 10475 0022 0ED1 bne .L658 + 10476 .L659: +5791:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_RX; + 10477 .loc 1 5791 5 is_stmt 1 view .LVU3663 + 10478 0024 48F20201 movw r1, #32770 + 10479 0028 2046 mov r0, r4 + 10480 .LVL719: +5791:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_RX; + 10481 .loc 1 5791 5 is_stmt 0 view .LVU3664 + 10482 002a FFF7FEFF bl I2C_Disable_IRQ + 10483 .LVL720: +5792:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10484 .loc 1 5792 5 is_stmt 1 view .LVU3665 +5792:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10485 .loc 1 5792 25 is_stmt 0 view .LVU3666 + 10486 002e 2223 movs r3, #34 + 10487 0030 2363 str r3, [r4, #48] + 10488 0032 06E0 b .L658 + 10489 .LVL721: + 10490 .L656: +5786:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_TX; + 10491 .loc 1 5786 5 is_stmt 1 view .LVU3667 + 10492 0034 48F20101 movw r1, #32769 + 10493 0038 2046 mov r0, r4 + 10494 .LVL722: +5786:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_SLAVE_BUSY_TX; + 10495 .loc 1 5786 5 is_stmt 0 view .LVU3668 + 10496 003a FFF7FEFF bl I2C_Disable_IRQ + 10497 .LVL723: +5787:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10498 .loc 1 5787 5 is_stmt 1 view .LVU3669 +5787:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10499 .loc 1 5787 25 is_stmt 0 view .LVU3670 + 10500 003e 2123 movs r3, #33 + 10501 0040 2363 str r3, [r4, #48] + 10502 .L658: +5800:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10503 .loc 1 5800 3 is_stmt 1 view .LVU3671 +5800:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10504 .loc 1 5800 7 is_stmt 0 view .LVU3672 + 10505 0042 2268 ldr r2, [r4] +5800:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10506 .loc 1 5800 17 view .LVU3673 + 10507 0044 5368 ldr r3, [r2, #4] +5800:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10508 .loc 1 5800 23 view .LVU3674 + 10509 0046 43F40043 orr r3, r3, #32768 + 10510 004a 5360 str r3, [r2, #4] + ARM GAS /tmp/ccE2rRGE.s page 365 + + +5803:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10511 .loc 1 5803 3 is_stmt 1 view .LVU3675 + 10512 004c 2268 ldr r2, [r4] + 10513 004e 5368 ldr r3, [r2, #4] + 10514 0050 23F0FF73 bic r3, r3, #33423360 + 10515 0054 23F48B33 bic r3, r3, #71168 + 10516 0058 23F4FF73 bic r3, r3, #510 + 10517 005c 23F00103 bic r3, r3, #1 + 10518 0060 5360 str r3, [r2, #4] +5806:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10519 .loc 1 5806 3 view .LVU3676 + 10520 0062 2046 mov r0, r4 + 10521 0064 FFF7FEFF bl I2C_Flush_TXDR + 10522 .LVL724: +5809:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10523 .loc 1 5809 3 view .LVU3677 +5809:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10524 .loc 1 5809 6 is_stmt 0 view .LVU3678 + 10525 0068 16F4804F tst r6, #16384 + 10526 006c 40D0 beq .L660 +5812:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10527 .loc 1 5812 5 is_stmt 1 view .LVU3679 +5812:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10528 .loc 1 5812 9 is_stmt 0 view .LVU3680 + 10529 006e 2268 ldr r2, [r4] +5812:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10530 .loc 1 5812 19 view .LVU3681 + 10531 0070 1368 ldr r3, [r2] +5812:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10532 .loc 1 5812 25 view .LVU3682 + 10533 0072 23F48043 bic r3, r3, #16384 + 10534 0076 1360 str r3, [r2] +5814:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10535 .loc 1 5814 5 is_stmt 1 view .LVU3683 +5814:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10536 .loc 1 5814 13 is_stmt 0 view .LVU3684 + 10537 0078 A36B ldr r3, [r4, #56] +5814:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10538 .loc 1 5814 8 view .LVU3685 + 10539 007a 1BB1 cbz r3, .L661 +5816:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10540 .loc 1 5816 7 is_stmt 1 view .LVU3686 +5816:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10541 .loc 1 5816 35 is_stmt 0 view .LVU3687 + 10542 007c 1B68 ldr r3, [r3] + 10543 007e 5B68 ldr r3, [r3, #4] +5816:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10544 .loc 1 5816 25 view .LVU3688 + 10545 0080 9BB2 uxth r3, r3 +5816:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10546 .loc 1 5816 23 view .LVU3689 + 10547 0082 6385 strh r3, [r4, #42] @ movhi + 10548 .L661: +5832:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10549 .loc 1 5832 3 is_stmt 1 view .LVU3690 +5835:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10550 .loc 1 5835 3 view .LVU3691 + ARM GAS /tmp/ccE2rRGE.s page 366 + + +5835:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10551 .loc 1 5835 6 is_stmt 0 view .LVU3692 + 10552 0084 15F0040F tst r5, #4 + 10553 0088 11D0 beq .L662 +5838:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10554 .loc 1 5838 5 is_stmt 1 view .LVU3693 +5838:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10555 .loc 1 5838 16 is_stmt 0 view .LVU3694 + 10556 008a 25F00405 bic r5, r5, #4 + 10557 .LVL725: +5841:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10558 .loc 1 5841 5 is_stmt 1 view .LVU3695 +5841:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10559 .loc 1 5841 36 is_stmt 0 view .LVU3696 + 10560 008e 2368 ldr r3, [r4] +5841:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10561 .loc 1 5841 46 view .LVU3697 + 10562 0090 5A6A ldr r2, [r3, #36] +5841:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10563 .loc 1 5841 10 view .LVU3698 + 10564 0092 636A ldr r3, [r4, #36] +5841:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10565 .loc 1 5841 21 view .LVU3699 + 10566 0094 1A70 strb r2, [r3] +5844:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10567 .loc 1 5844 5 is_stmt 1 view .LVU3700 +5844:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10568 .loc 1 5844 9 is_stmt 0 view .LVU3701 + 10569 0096 636A ldr r3, [r4, #36] +5844:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10570 .loc 1 5844 19 view .LVU3702 + 10571 0098 0133 adds r3, r3, #1 + 10572 009a 6362 str r3, [r4, #36] +5846:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10573 .loc 1 5846 5 is_stmt 1 view .LVU3703 +5846:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10574 .loc 1 5846 14 is_stmt 0 view .LVU3704 + 10575 009c 238D ldrh r3, [r4, #40] +5846:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10576 .loc 1 5846 8 view .LVU3705 + 10577 009e 33B1 cbz r3, .L662 +5848:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount--; + 10578 .loc 1 5848 7 is_stmt 1 view .LVU3706 +5848:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount--; + 10579 .loc 1 5848 21 is_stmt 0 view .LVU3707 + 10580 00a0 013B subs r3, r3, #1 + 10581 00a2 2385 strh r3, [r4, #40] @ movhi +5849:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10582 .loc 1 5849 7 is_stmt 1 view .LVU3708 +5849:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10583 .loc 1 5849 11 is_stmt 0 view .LVU3709 + 10584 00a4 638D ldrh r3, [r4, #42] + 10585 00a6 9BB2 uxth r3, r3 +5849:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10586 .loc 1 5849 22 view .LVU3710 + 10587 00a8 013B subs r3, r3, #1 + 10588 00aa 9BB2 uxth r3, r3 + ARM GAS /tmp/ccE2rRGE.s page 367 + + + 10589 00ac 6385 strh r3, [r4, #42] @ movhi + 10590 .L662: +5854:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10591 .loc 1 5854 3 is_stmt 1 view .LVU3711 +5854:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10592 .loc 1 5854 11 is_stmt 0 view .LVU3712 + 10593 00ae 638D ldrh r3, [r4, #42] + 10594 00b0 9BB2 uxth r3, r3 +5854:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10595 .loc 1 5854 6 view .LVU3713 + 10596 00b2 1BB1 cbz r3, .L663 +5857:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10597 .loc 1 5857 5 is_stmt 1 view .LVU3714 +5857:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10598 .loc 1 5857 9 is_stmt 0 view .LVU3715 + 10599 00b4 636C ldr r3, [r4, #68] +5857:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10600 .loc 1 5857 21 view .LVU3716 + 10601 00b6 43F00403 orr r3, r3, #4 + 10602 00ba 6364 str r3, [r4, #68] + 10603 .L663: +5860:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = NULL; + 10604 .loc 1 5860 3 is_stmt 1 view .LVU3717 +5860:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferISR = NULL; + 10605 .loc 1 5860 14 is_stmt 0 view .LVU3718 + 10606 00bc 0023 movs r3, #0 + 10607 00be 84F84230 strb r3, [r4, #66] +5861:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10608 .loc 1 5861 3 is_stmt 1 view .LVU3719 +5861:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10609 .loc 1 5861 17 is_stmt 0 view .LVU3720 + 10610 00c2 6363 str r3, [r4, #52] +5863:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10611 .loc 1 5863 3 is_stmt 1 view .LVU3721 +5863:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10612 .loc 1 5863 11 is_stmt 0 view .LVU3722 + 10613 00c4 636C ldr r3, [r4, #68] +5863:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10614 .loc 1 5863 6 view .LVU3723 + 10615 00c6 1BBB cbnz r3, .L669 +5875:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10616 .loc 1 5875 8 is_stmt 1 view .LVU3724 +5875:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10617 .loc 1 5875 16 is_stmt 0 view .LVU3725 + 10618 00c8 E36A ldr r3, [r4, #44] +5875:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10619 .loc 1 5875 11 view .LVU3726 + 10620 00ca 13F5803F cmn r3, #65536 + 10621 00ce 2DD1 bne .L670 +5895:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10622 .loc 1 5895 8 is_stmt 1 view .LVU3727 +5895:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10623 .loc 1 5895 16 is_stmt 0 view .LVU3728 + 10624 00d0 94F84130 ldrb r3, [r4, #65] @ zero_extendqisi2 + 10625 00d4 DBB2 uxtb r3, r3 +5895:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10626 .loc 1 5895 11 view .LVU3729 + ARM GAS /tmp/ccE2rRGE.s page 368 + + + 10627 00d6 222B cmp r3, #34 + 10628 00d8 38D0 beq .L671 +5912:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_NONE; + 10629 .loc 1 5912 5 is_stmt 1 view .LVU3730 +5912:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_NONE; + 10630 .loc 1 5912 17 is_stmt 0 view .LVU3731 + 10631 00da 2023 movs r3, #32 + 10632 00dc 84F84130 strb r3, [r4, #65] +5913:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10633 .loc 1 5913 5 is_stmt 1 view .LVU3732 +5913:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10634 .loc 1 5913 25 is_stmt 0 view .LVU3733 + 10635 00e0 0023 movs r3, #0 + 10636 00e2 2363 str r3, [r4, #48] +5916:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10637 .loc 1 5916 5 is_stmt 1 view .LVU3734 +5916:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10638 .loc 1 5916 5 view .LVU3735 + 10639 00e4 84F84030 strb r3, [r4, #64] +5916:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10640 .loc 1 5916 5 view .LVU3736 +5922:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + 10641 .loc 1 5922 5 view .LVU3737 + 10642 00e8 2046 mov r0, r4 + 10643 00ea FFF7FEFF bl HAL_I2C_SlaveTxCpltCallback + 10644 .LVL726: +5925:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10645 .loc 1 5925 1 is_stmt 0 view .LVU3738 + 10646 00ee 2CE0 b .L655 + 10647 .LVL727: + 10648 .L660: +5819:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10649 .loc 1 5819 8 is_stmt 1 view .LVU3739 +5819:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10650 .loc 1 5819 11 is_stmt 0 view .LVU3740 + 10651 00f0 16F4004F tst r6, #32768 + 10652 00f4 C6D0 beq .L661 +5822:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10653 .loc 1 5822 5 is_stmt 1 view .LVU3741 +5822:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10654 .loc 1 5822 9 is_stmt 0 view .LVU3742 + 10655 00f6 2268 ldr r2, [r4] +5822:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10656 .loc 1 5822 19 view .LVU3743 + 10657 00f8 1368 ldr r3, [r2] +5822:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10658 .loc 1 5822 25 view .LVU3744 + 10659 00fa 23F40043 bic r3, r3, #32768 + 10660 00fe 1360 str r3, [r2] +5824:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10661 .loc 1 5824 5 is_stmt 1 view .LVU3745 +5824:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10662 .loc 1 5824 13 is_stmt 0 view .LVU3746 + 10663 0100 E36B ldr r3, [r4, #60] +5824:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10664 .loc 1 5824 8 view .LVU3747 + 10665 0102 002B cmp r3, #0 + ARM GAS /tmp/ccE2rRGE.s page 369 + + + 10666 0104 BED0 beq .L661 +5826:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10667 .loc 1 5826 7 is_stmt 1 view .LVU3748 +5826:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10668 .loc 1 5826 35 is_stmt 0 view .LVU3749 + 10669 0106 1B68 ldr r3, [r3] + 10670 0108 5B68 ldr r3, [r3, #4] +5826:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10671 .loc 1 5826 25 view .LVU3750 + 10672 010a 9BB2 uxth r3, r3 +5826:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10673 .loc 1 5826 23 view .LVU3751 + 10674 010c 6385 strh r3, [r4, #42] @ movhi + 10675 010e B9E7 b .L661 + 10676 .LVL728: + 10677 .L669: +5866:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10678 .loc 1 5866 5 is_stmt 1 view .LVU3752 +5866:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10679 .loc 1 5866 27 is_stmt 0 view .LVU3753 + 10680 0110 616C ldr r1, [r4, #68] +5866:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10681 .loc 1 5866 5 view .LVU3754 + 10682 0112 2046 mov r0, r4 + 10683 0114 FFF7FEFF bl I2C_ITError + 10684 .LVL729: +5869:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10685 .loc 1 5869 5 is_stmt 1 view .LVU3755 +5869:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10686 .loc 1 5869 13 is_stmt 0 view .LVU3756 + 10687 0118 94F84130 ldrb r3, [r4, #65] @ zero_extendqisi2 + 10688 011c DBB2 uxtb r3, r3 +5869:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10689 .loc 1 5869 8 view .LVU3757 + 10690 011e 282B cmp r3, #40 + 10691 0120 13D1 bne .L655 +5872:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10692 .loc 1 5872 7 is_stmt 1 view .LVU3758 + 10693 0122 2946 mov r1, r5 + 10694 0124 2046 mov r0, r4 + 10695 0126 FFF7FEFF bl I2C_ITListenCplt + 10696 .LVL730: + 10697 012a 0EE0 b .L655 + 10698 .L670: +5878:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10699 .loc 1 5878 5 view .LVU3759 + 10700 012c 2046 mov r0, r4 + 10701 012e FFF7FEFF bl I2C_ITSlaveSeqCplt + 10702 .LVL731: +5880:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; + 10703 .loc 1 5880 5 view .LVU3760 +5880:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->State = HAL_I2C_STATE_READY; + 10704 .loc 1 5880 23 is_stmt 0 view .LVU3761 + 10705 0132 0C4B ldr r3, .L672 + 10706 0134 E362 str r3, [r4, #44] +5881:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_NONE; + 10707 .loc 1 5881 5 is_stmt 1 view .LVU3762 + ARM GAS /tmp/ccE2rRGE.s page 370 + + +5881:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_NONE; + 10708 .loc 1 5881 17 is_stmt 0 view .LVU3763 + 10709 0136 2023 movs r3, #32 + 10710 0138 84F84130 strb r3, [r4, #65] +5882:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10711 .loc 1 5882 5 is_stmt 1 view .LVU3764 +5882:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10712 .loc 1 5882 25 is_stmt 0 view .LVU3765 + 10713 013c 0023 movs r3, #0 + 10714 013e 2363 str r3, [r4, #48] +5885:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10715 .loc 1 5885 5 is_stmt 1 view .LVU3766 +5885:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10716 .loc 1 5885 5 view .LVU3767 + 10717 0140 84F84030 strb r3, [r4, #64] +5885:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10718 .loc 1 5885 5 view .LVU3768 +5891:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + 10719 .loc 1 5891 5 view .LVU3769 + 10720 0144 2046 mov r0, r4 + 10721 0146 FFF7FEFF bl HAL_I2C_ListenCpltCallback + 10722 .LVL732: + 10723 .L655: +5925:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10724 .loc 1 5925 1 is_stmt 0 view .LVU3770 + 10725 014a 70BD pop {r4, r5, r6, pc} + 10726 .LVL733: + 10727 .L671: +5897:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_NONE; + 10728 .loc 1 5897 5 is_stmt 1 view .LVU3771 +5897:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_NONE; + 10729 .loc 1 5897 17 is_stmt 0 view .LVU3772 + 10730 014c 2023 movs r3, #32 + 10731 014e 84F84130 strb r3, [r4, #65] +5898:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10732 .loc 1 5898 5 is_stmt 1 view .LVU3773 +5898:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10733 .loc 1 5898 25 is_stmt 0 view .LVU3774 + 10734 0152 0023 movs r3, #0 + 10735 0154 2363 str r3, [r4, #48] +5901:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10736 .loc 1 5901 5 is_stmt 1 view .LVU3775 +5901:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10737 .loc 1 5901 5 view .LVU3776 + 10738 0156 84F84030 strb r3, [r4, #64] +5901:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10739 .loc 1 5901 5 view .LVU3777 +5907:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + 10740 .loc 1 5907 5 view .LVU3778 + 10741 015a 2046 mov r0, r4 + 10742 015c FFF7FEFF bl HAL_I2C_SlaveRxCpltCallback + 10743 .LVL734: + 10744 0160 F3E7 b .L655 + 10745 .L673: + 10746 0162 00BF .align 2 + 10747 .L672: + 10748 0164 0000FFFF .word -65536 + ARM GAS /tmp/ccE2rRGE.s page 371 + + + 10749 .cfi_endproc + 10750 .LFE189: + 10752 .section .text.I2C_Slave_ISR_IT,"ax",%progbits + 10753 .align 1 + 10754 .syntax unified + 10755 .thumb + 10756 .thumb_func + 10758 I2C_Slave_ISR_IT: + 10759 .LVL735: + 10760 .LFB180: +4881:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tmpoptions = hi2c->XferOptions; + 10761 .loc 1 4881 1 view -0 + 10762 .cfi_startproc + 10763 @ args = 0, pretend = 0, frame = 0 + 10764 @ frame_needed = 0, uses_anonymous_args = 0 +4881:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tmpoptions = hi2c->XferOptions; + 10765 .loc 1 4881 1 is_stmt 0 view .LVU3780 + 10766 0000 F8B5 push {r3, r4, r5, r6, r7, lr} + 10767 .cfi_def_cfa_offset 24 + 10768 .cfi_offset 3, -24 + 10769 .cfi_offset 4, -20 + 10770 .cfi_offset 5, -16 + 10771 .cfi_offset 6, -12 + 10772 .cfi_offset 7, -8 + 10773 .cfi_offset 14, -4 +4882:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tmpITFlags = ITFlags; + 10774 .loc 1 4882 3 is_stmt 1 view .LVU3781 +4882:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tmpITFlags = ITFlags; + 10775 .loc 1 4882 12 is_stmt 0 view .LVU3782 + 10776 0002 C76A ldr r7, [r0, #44] + 10777 .LVL736: +4883:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10778 .loc 1 4883 3 is_stmt 1 view .LVU3783 +4886:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10779 .loc 1 4886 3 view .LVU3784 +4886:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10780 .loc 1 4886 3 view .LVU3785 + 10781 0004 90F84030 ldrb r3, [r0, #64] @ zero_extendqisi2 + 10782 0008 012B cmp r3, #1 + 10783 000a 00F09E80 beq .L688 + 10784 000e 0446 mov r4, r0 + 10785 0010 0D46 mov r5, r1 + 10786 0012 1646 mov r6, r2 +4886:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10787 .loc 1 4886 3 discriminator 2 view .LVU3786 + 10788 0014 0123 movs r3, #1 + 10789 0016 80F84030 strb r3, [r0, #64] +4886:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10790 .loc 1 4886 3 discriminator 2 view .LVU3787 +4889:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) + 10791 .loc 1 4889 3 discriminator 2 view .LVU3788 +4889:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) + 10792 .loc 1 4889 6 is_stmt 0 discriminator 2 view .LVU3789 + 10793 001a 11F0200F tst r1, #32 + 10794 001e 02D0 beq .L676 +4889:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) + 10795 .loc 1 4889 61 discriminator 1 view .LVU3790 + ARM GAS /tmp/ccE2rRGE.s page 372 + + + 10796 0020 12F0200F tst r2, #32 + 10797 0024 19D1 bne .L690 + 10798 .LVL737: + 10799 .L676: +4896:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET)) + 10800 .loc 1 4896 3 is_stmt 1 view .LVU3791 +4896:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET)) + 10801 .loc 1 4896 6 is_stmt 0 view .LVU3792 + 10802 0026 15F0100F tst r5, #16 + 10803 002a 3ED0 beq .L677 +4896:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET)) + 10804 .loc 1 4896 58 discriminator 1 view .LVU3793 + 10805 002c 16F0100F tst r6, #16 + 10806 0030 3BD0 beq .L677 +4903:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10807 .loc 1 4903 5 is_stmt 1 view .LVU3794 +4903:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10808 .loc 1 4903 13 is_stmt 0 view .LVU3795 + 10809 0032 638D ldrh r3, [r4, #42] + 10810 0034 9BB2 uxth r3, r3 +4903:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10811 .loc 1 4903 8 view .LVU3796 + 10812 0036 43BB cbnz r3, .L678 +4905:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Same action must be done for (tmpoptions == I2C_LAST_FRAME) which removed for + 10813 .loc 1 4905 7 is_stmt 1 view .LVU3797 +4905:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Same action must be done for (tmpoptions == I2C_LAST_FRAME) which removed for + 10814 .loc 1 4905 16 is_stmt 0 view .LVU3798 + 10815 0038 94F84130 ldrb r3, [r4, #65] @ zero_extendqisi2 + 10816 003c DBB2 uxtb r3, r3 +4905:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Same action must be done for (tmpoptions == I2C_LAST_FRAME) which removed for + 10817 .loc 1 4905 10 view .LVU3799 + 10818 003e 282B cmp r3, #40 + 10819 0040 0ED0 beq .L691 + 10820 .L679: +4912:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10821 .loc 1 4912 12 is_stmt 1 view .LVU3800 +4912:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10822 .loc 1 4912 21 is_stmt 0 view .LVU3801 + 10823 0042 94F84130 ldrb r3, [r4, #65] @ zero_extendqisi2 + 10824 0046 DBB2 uxtb r3, r3 +4912:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10825 .loc 1 4912 15 view .LVU3802 + 10826 0048 292B cmp r3, #41 + 10827 004a 11D0 beq .L692 + 10828 .L681: +4927:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10829 .loc 1 4927 9 is_stmt 1 view .LVU3803 + 10830 004c 2368 ldr r3, [r4] + 10831 004e 1022 movs r2, #16 + 10832 0050 DA61 str r2, [r3, #28] + 10833 .L680: +5004:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10834 .loc 1 5004 3 view .LVU3804 +5007:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10835 .loc 1 5007 3 view .LVU3805 +5007:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10836 .loc 1 5007 3 view .LVU3806 + ARM GAS /tmp/ccE2rRGE.s page 373 + + + 10837 0052 0020 movs r0, #0 + 10838 0054 84F84000 strb r0, [r4, #64] +5007:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10839 .loc 1 5007 3 view .LVU3807 +5009:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10840 .loc 1 5009 3 view .LVU3808 + 10841 .LVL738: + 10842 .L675: +5010:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10843 .loc 1 5010 1 is_stmt 0 view .LVU3809 + 10844 0058 F8BD pop {r3, r4, r5, r6, r7, pc} + 10845 .LVL739: + 10846 .L690: +4893:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10847 .loc 1 4893 5 is_stmt 1 view .LVU3810 + 10848 005a FFF7FEFF bl I2C_ITSlaveCplt + 10849 .LVL740: +4893:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10850 .loc 1 4893 5 is_stmt 0 view .LVU3811 + 10851 005e E2E7 b .L676 + 10852 .L691: +4905:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Same action must be done for (tmpoptions == I2C_LAST_FRAME) which removed for + 10853 .loc 1 4905 49 discriminator 1 view .LVU3812 + 10854 0060 B7F1007F cmp r7, #33554432 + 10855 0064 EDD1 bne .L679 +4910:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10856 .loc 1 4910 9 is_stmt 1 view .LVU3813 + 10857 0066 2946 mov r1, r5 + 10858 0068 2046 mov r0, r4 + 10859 006a FFF7FEFF bl I2C_ITListenCplt + 10860 .LVL741: + 10861 006e F0E7 b .L680 + 10862 .L692: +4912:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10863 .loc 1 4912 62 is_stmt 0 discriminator 1 view .LVU3814 + 10864 0070 17F5803F cmn r7, #65536 + 10865 0074 EAD0 beq .L681 +4915:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10866 .loc 1 4915 9 is_stmt 1 view .LVU3815 + 10867 0076 2368 ldr r3, [r4] + 10868 0078 1022 movs r2, #16 + 10869 007a DA61 str r2, [r3, #28] +4918:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10870 .loc 1 4918 9 view .LVU3816 + 10871 007c 2046 mov r0, r4 + 10872 007e FFF7FEFF bl I2C_Flush_TXDR + 10873 .LVL742: +4922:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10874 .loc 1 4922 9 view .LVU3817 + 10875 0082 2046 mov r0, r4 + 10876 0084 FFF7FEFF bl I2C_ITSlaveSeqCplt + 10877 .LVL743: + 10878 0088 E3E7 b .L680 + 10879 .L678: +4934:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10880 .loc 1 4934 7 view .LVU3818 + 10881 008a 2368 ldr r3, [r4] + ARM GAS /tmp/ccE2rRGE.s page 374 + + + 10882 008c 1022 movs r2, #16 + 10883 008e DA61 str r2, [r3, #28] +4937:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10884 .loc 1 4937 7 view .LVU3819 +4937:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10885 .loc 1 4937 11 is_stmt 0 view .LVU3820 + 10886 0090 636C ldr r3, [r4, #68] +4937:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10887 .loc 1 4937 23 view .LVU3821 + 10888 0092 43F00403 orr r3, r3, #4 + 10889 0096 6364 str r3, [r4, #68] +4939:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10890 .loc 1 4939 7 is_stmt 1 view .LVU3822 +4939:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10891 .loc 1 4939 10 is_stmt 0 view .LVU3823 + 10892 0098 17B1 cbz r7, .L682 +4939:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10893 .loc 1 4939 43 discriminator 1 view .LVU3824 + 10894 009a B7F1807F cmp r7, #16777216 + 10895 009e D8D1 bne .L680 + 10896 .L682: +4942:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10897 .loc 1 4942 9 is_stmt 1 view .LVU3825 +4942:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10898 .loc 1 4942 31 is_stmt 0 view .LVU3826 + 10899 00a0 616C ldr r1, [r4, #68] +4942:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10900 .loc 1 4942 9 view .LVU3827 + 10901 00a2 2046 mov r0, r4 + 10902 00a4 FFF7FEFF bl I2C_ITError + 10903 .LVL744: + 10904 00a8 D3E7 b .L680 + 10905 .L677: +4946:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_RXI) != RESET)) + 10906 .loc 1 4946 8 is_stmt 1 view .LVU3828 +4946:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_RXI) != RESET)) + 10907 .loc 1 4946 11 is_stmt 0 view .LVU3829 + 10908 00aa 15F0040F tst r5, #4 + 10909 00ae 1FD0 beq .L683 +4946:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_RXI) != RESET)) + 10910 .loc 1 4946 65 discriminator 1 view .LVU3830 + 10911 00b0 16F0040F tst r6, #4 + 10912 00b4 1CD0 beq .L683 +4949:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10913 .loc 1 4949 5 is_stmt 1 view .LVU3831 +4949:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10914 .loc 1 4949 13 is_stmt 0 view .LVU3832 + 10915 00b6 638D ldrh r3, [r4, #42] + 10916 00b8 9BB2 uxth r3, r3 +4949:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10917 .loc 1 4949 8 view .LVU3833 + 10918 00ba 73B1 cbz r3, .L684 +4952:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10919 .loc 1 4952 7 is_stmt 1 view .LVU3834 +4952:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10920 .loc 1 4952 38 is_stmt 0 view .LVU3835 + 10921 00bc 2368 ldr r3, [r4] + ARM GAS /tmp/ccE2rRGE.s page 375 + + +4952:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10922 .loc 1 4952 48 view .LVU3836 + 10923 00be 5A6A ldr r2, [r3, #36] +4952:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10924 .loc 1 4952 12 view .LVU3837 + 10925 00c0 636A ldr r3, [r4, #36] +4952:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10926 .loc 1 4952 23 view .LVU3838 + 10927 00c2 1A70 strb r2, [r3] +4955:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10928 .loc 1 4955 7 is_stmt 1 view .LVU3839 +4955:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10929 .loc 1 4955 11 is_stmt 0 view .LVU3840 + 10930 00c4 636A ldr r3, [r4, #36] +4955:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10931 .loc 1 4955 21 view .LVU3841 + 10932 00c6 0133 adds r3, r3, #1 + 10933 00c8 6362 str r3, [r4, #36] +4957:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount--; + 10934 .loc 1 4957 7 is_stmt 1 view .LVU3842 +4957:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount--; + 10935 .loc 1 4957 11 is_stmt 0 view .LVU3843 + 10936 00ca 238D ldrh r3, [r4, #40] +4957:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount--; + 10937 .loc 1 4957 21 view .LVU3844 + 10938 00cc 013B subs r3, r3, #1 + 10939 00ce 2385 strh r3, [r4, #40] @ movhi +4958:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10940 .loc 1 4958 7 is_stmt 1 view .LVU3845 +4958:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10941 .loc 1 4958 11 is_stmt 0 view .LVU3846 + 10942 00d0 638D ldrh r3, [r4, #42] + 10943 00d2 9BB2 uxth r3, r3 +4958:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10944 .loc 1 4958 22 view .LVU3847 + 10945 00d4 013B subs r3, r3, #1 + 10946 00d6 9BB2 uxth r3, r3 + 10947 00d8 6385 strh r3, [r4, #42] @ movhi + 10948 .L684: +4961:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (tmpoptions != I2C_NO_OPTION_FRAME)) + 10949 .loc 1 4961 5 is_stmt 1 view .LVU3848 +4961:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (tmpoptions != I2C_NO_OPTION_FRAME)) + 10950 .loc 1 4961 14 is_stmt 0 view .LVU3849 + 10951 00da 638D ldrh r3, [r4, #42] + 10952 00dc 9BB2 uxth r3, r3 +4961:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (tmpoptions != I2C_NO_OPTION_FRAME)) + 10953 .loc 1 4961 8 view .LVU3850 + 10954 00de 002B cmp r3, #0 + 10955 00e0 B7D1 bne .L680 +4961:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (tmpoptions != I2C_NO_OPTION_FRAME)) + 10956 .loc 1 4961 33 discriminator 1 view .LVU3851 + 10957 00e2 17F5803F cmn r7, #65536 + 10958 00e6 B4D0 beq .L680 +4965:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 10959 .loc 1 4965 7 is_stmt 1 view .LVU3852 + 10960 00e8 2046 mov r0, r4 + 10961 00ea FFF7FEFF bl I2C_ITSlaveSeqCplt + ARM GAS /tmp/ccE2rRGE.s page 376 + + + 10962 .LVL745: + 10963 00ee B0E7 b .L680 + 10964 .L683: +4968:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_ADDRI) != RESET)) + 10965 .loc 1 4968 8 view .LVU3853 +4968:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_ADDRI) != RESET)) + 10966 .loc 1 4968 11 is_stmt 0 view .LVU3854 + 10967 00f0 15F0080F tst r5, #8 + 10968 00f4 02D0 beq .L685 +4968:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_ADDRI) != RESET)) + 10969 .loc 1 4968 65 discriminator 1 view .LVU3855 + 10970 00f6 16F0080F tst r6, #8 + 10971 00fa 18D1 bne .L693 + 10972 .L685: +4973:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TXI) != RESET)) + 10973 .loc 1 4973 8 is_stmt 1 view .LVU3856 +4973:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TXI) != RESET)) + 10974 .loc 1 4973 11 is_stmt 0 view .LVU3857 + 10975 00fc 15F0020F tst r5, #2 + 10976 0100 A7D0 beq .L680 +4973:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TXI) != RESET)) + 10977 .loc 1 4973 65 discriminator 1 view .LVU3858 + 10978 0102 16F0020F tst r6, #2 + 10979 0106 A4D0 beq .L680 +4980:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10980 .loc 1 4980 5 is_stmt 1 view .LVU3859 +4980:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10981 .loc 1 4980 13 is_stmt 0 view .LVU3860 + 10982 0108 638D ldrh r3, [r4, #42] + 10983 010a 9BB2 uxth r3, r3 +4980:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 10984 .loc 1 4980 8 view .LVU3861 + 10985 010c A3B1 cbz r3, .L686 +4983:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10986 .loc 1 4983 7 is_stmt 1 view .LVU3862 +4983:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10987 .loc 1 4983 35 is_stmt 0 view .LVU3863 + 10988 010e 626A ldr r2, [r4, #36] +4983:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10989 .loc 1 4983 11 view .LVU3864 + 10990 0110 2368 ldr r3, [r4] +4983:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10991 .loc 1 4983 30 view .LVU3865 + 10992 0112 1278 ldrb r2, [r2] @ zero_extendqisi2 +4983:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10993 .loc 1 4983 28 view .LVU3866 + 10994 0114 9A62 str r2, [r3, #40] +4986:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10995 .loc 1 4986 7 is_stmt 1 view .LVU3867 +4986:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10996 .loc 1 4986 11 is_stmt 0 view .LVU3868 + 10997 0116 636A ldr r3, [r4, #36] +4986:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 10998 .loc 1 4986 21 view .LVU3869 + 10999 0118 0133 adds r3, r3, #1 + 11000 011a 6362 str r3, [r4, #36] +4988:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize--; + ARM GAS /tmp/ccE2rRGE.s page 377 + + + 11001 .loc 1 4988 7 is_stmt 1 view .LVU3870 +4988:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize--; + 11002 .loc 1 4988 11 is_stmt 0 view .LVU3871 + 11003 011c 638D ldrh r3, [r4, #42] + 11004 011e 9BB2 uxth r3, r3 +4988:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize--; + 11005 .loc 1 4988 22 view .LVU3872 + 11006 0120 013B subs r3, r3, #1 + 11007 0122 9BB2 uxth r3, r3 + 11008 0124 6385 strh r3, [r4, #42] @ movhi +4989:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11009 .loc 1 4989 7 is_stmt 1 view .LVU3873 +4989:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11010 .loc 1 4989 11 is_stmt 0 view .LVU3874 + 11011 0126 238D ldrh r3, [r4, #40] +4989:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11012 .loc 1 4989 21 view .LVU3875 + 11013 0128 013B subs r3, r3, #1 + 11014 012a 2385 strh r3, [r4, #40] @ movhi + 11015 012c 91E7 b .L680 + 11016 .L693: +4971:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11017 .loc 1 4971 5 is_stmt 1 view .LVU3876 + 11018 012e 2946 mov r1, r5 + 11019 0130 2046 mov r0, r4 + 11020 0132 FFF7FEFF bl I2C_ITAddrCplt + 11021 .LVL746: + 11022 0136 8CE7 b .L680 + 11023 .L686: +4993:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11024 .loc 1 4993 7 view .LVU3877 +4993:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11025 .loc 1 4993 10 is_stmt 0 view .LVU3878 + 11026 0138 B7F1807F cmp r7, #16777216 + 11027 013c 01D0 beq .L687 +4993:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11028 .loc 1 4993 42 discriminator 1 view .LVU3879 + 11029 013e 002F cmp r7, #0 + 11030 0140 87D1 bne .L680 + 11031 .L687: +4997:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11032 .loc 1 4997 9 is_stmt 1 view .LVU3880 + 11033 0142 2046 mov r0, r4 + 11034 0144 FFF7FEFF bl I2C_ITSlaveSeqCplt + 11035 .LVL747: + 11036 0148 83E7 b .L680 + 11037 .LVL748: + 11038 .L688: +4886:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11039 .loc 1 4886 3 is_stmt 0 view .LVU3881 + 11040 014a 0220 movs r0, #2 + 11041 .LVL749: +4886:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11042 .loc 1 4886 3 view .LVU3882 + 11043 014c 84E7 b .L675 + 11044 .cfi_endproc + 11045 .LFE180: + ARM GAS /tmp/ccE2rRGE.s page 378 + + + 11047 .section .text.I2C_ITMasterCplt,"ax",%progbits + 11048 .align 1 + 11049 .syntax unified + 11050 .thumb + 11051 .thumb_func + 11053 I2C_ITMasterCplt: + 11054 .LVL750: + 11055 .LFB188: +5632:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tmperror; + 11056 .loc 1 5632 1 is_stmt 1 view -0 + 11057 .cfi_startproc + 11058 @ args = 0, pretend = 0, frame = 8 + 11059 @ frame_needed = 0, uses_anonymous_args = 0 +5632:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tmperror; + 11060 .loc 1 5632 1 is_stmt 0 view .LVU3884 + 11061 0000 30B5 push {r4, r5, lr} + 11062 .cfi_def_cfa_offset 12 + 11063 .cfi_offset 4, -12 + 11064 .cfi_offset 5, -8 + 11065 .cfi_offset 14, -4 + 11066 0002 83B0 sub sp, sp, #12 + 11067 .cfi_def_cfa_offset 24 + 11068 0004 0446 mov r4, r0 + 11069 0006 0D46 mov r5, r1 +5633:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tmpITFlags = ITFlags; + 11070 .loc 1 5633 3 is_stmt 1 view .LVU3885 +5634:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** __IO uint32_t tmpreg; + 11071 .loc 1 5634 3 view .LVU3886 + 11072 .LVL751: +5635:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11073 .loc 1 5635 3 view .LVU3887 +5638:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11074 .loc 1 5638 3 view .LVU3888 + 11075 0008 0368 ldr r3, [r0] + 11076 000a 2022 movs r2, #32 + 11077 000c DA61 str r2, [r3, #28] +5641:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11078 .loc 1 5641 3 view .LVU3889 +5641:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11079 .loc 1 5641 11 is_stmt 0 view .LVU3890 + 11080 000e 90F84130 ldrb r3, [r0, #65] @ zero_extendqisi2 + 11081 0012 DBB2 uxtb r3, r3 +5641:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11082 .loc 1 5641 6 view .LVU3891 + 11083 0014 212B cmp r3, #33 + 11084 0016 33D0 beq .L706 +5646:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11085 .loc 1 5646 8 is_stmt 1 view .LVU3892 +5646:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11086 .loc 1 5646 16 is_stmt 0 view .LVU3893 + 11087 0018 90F84130 ldrb r3, [r0, #65] @ zero_extendqisi2 + 11088 001c DBB2 uxtb r3, r3 +5646:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11089 .loc 1 5646 11 view .LVU3894 + 11090 001e 222B cmp r3, #34 + 11091 0020 34D0 beq .L707 + 11092 .LVL752: + ARM GAS /tmp/ccE2rRGE.s page 379 + + + 11093 .L696: +5654:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11094 .loc 1 5654 3 is_stmt 1 view .LVU3895 +5657:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11095 .loc 1 5657 3 view .LVU3896 + 11096 0022 2268 ldr r2, [r4] + 11097 0024 5368 ldr r3, [r2, #4] + 11098 0026 23F0FF73 bic r3, r3, #33423360 + 11099 002a 23F48B33 bic r3, r3, #71168 + 11100 002e 23F4FF73 bic r3, r3, #510 + 11101 0032 23F00103 bic r3, r3, #1 + 11102 0036 5360 str r3, [r2, #4] +5660:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; + 11103 .loc 1 5660 3 view .LVU3897 +5660:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions = I2C_NO_OPTION_FRAME; + 11104 .loc 1 5660 23 is_stmt 0 view .LVU3898 + 11105 0038 0023 movs r3, #0 + 11106 003a 6363 str r3, [r4, #52] +5661:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11107 .loc 1 5661 3 is_stmt 1 view .LVU3899 +5661:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11108 .loc 1 5661 23 is_stmt 0 view .LVU3900 + 11109 003c A3F58033 sub r3, r3, #65536 + 11110 0040 E362 str r3, [r4, #44] +5663:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11111 .loc 1 5663 3 is_stmt 1 view .LVU3901 +5663:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11112 .loc 1 5663 6 is_stmt 0 view .LVU3902 + 11113 0042 15F0100F tst r5, #16 + 11114 0046 06D0 beq .L697 +5666:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11115 .loc 1 5666 5 is_stmt 1 view .LVU3903 + 11116 0048 2368 ldr r3, [r4] + 11117 004a 1022 movs r2, #16 + 11118 004c DA61 str r2, [r3, #28] +5669:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11119 .loc 1 5669 5 view .LVU3904 +5669:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11120 .loc 1 5669 9 is_stmt 0 view .LVU3905 + 11121 004e 636C ldr r3, [r4, #68] +5669:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11122 .loc 1 5669 21 view .LVU3906 + 11123 0050 43F00403 orr r3, r3, #4 + 11124 0054 6364 str r3, [r4, #68] + 11125 .L697: +5673:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11126 .loc 1 5673 3 is_stmt 1 view .LVU3907 +5673:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11127 .loc 1 5673 12 is_stmt 0 view .LVU3908 + 11128 0056 94F84130 ldrb r3, [r4, #65] @ zero_extendqisi2 + 11129 005a DBB2 uxtb r3, r3 +5673:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11130 .loc 1 5673 6 view .LVU3909 + 11131 005c 602B cmp r3, #96 + 11132 005e 1BD0 beq .L708 + 11133 .L698: +5681:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + ARM GAS /tmp/ccE2rRGE.s page 380 + + + 11134 .loc 1 5681 3 is_stmt 1 view .LVU3910 + 11135 0060 2046 mov r0, r4 + 11136 0062 FFF7FEFF bl I2C_Flush_TXDR + 11137 .LVL753: +5684:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11138 .loc 1 5684 3 view .LVU3911 +5684:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11139 .loc 1 5684 12 is_stmt 0 view .LVU3912 + 11140 0066 626C ldr r2, [r4, #68] + 11141 .LVL754: +5687:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11142 .loc 1 5687 3 is_stmt 1 view .LVU3913 +5687:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11143 .loc 1 5687 12 is_stmt 0 view .LVU3914 + 11144 0068 94F84130 ldrb r3, [r4, #65] @ zero_extendqisi2 + 11145 006c DBB2 uxtb r3, r3 +5687:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11146 .loc 1 5687 6 view .LVU3915 + 11147 006e 602B cmp r3, #96 + 11148 0070 00D0 beq .L699 +5687:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11149 .loc 1 5687 44 discriminator 1 view .LVU3916 + 11150 0072 D2B1 cbz r2, .L700 + 11151 .L699: +5690:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11152 .loc 1 5690 5 is_stmt 1 view .LVU3917 +5690:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11153 .loc 1 5690 27 is_stmt 0 view .LVU3918 + 11154 0074 616C ldr r1, [r4, #68] +5690:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11155 .loc 1 5690 5 view .LVU3919 + 11156 0076 2046 mov r0, r4 + 11157 0078 FFF7FEFF bl I2C_ITError + 11158 .LVL755: + 11159 .L694: +5766:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11160 .loc 1 5766 1 view .LVU3920 + 11161 007c 03B0 add sp, sp, #12 + 11162 .cfi_remember_state + 11163 .cfi_def_cfa_offset 12 + 11164 @ sp needed + 11165 007e 30BD pop {r4, r5, pc} + 11166 .LVL756: + 11167 .L706: + 11168 .cfi_restore_state +5643:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_MASTER_BUSY_TX; + 11169 .loc 1 5643 5 is_stmt 1 view .LVU3921 + 11170 0080 0121 movs r1, #1 + 11171 .LVL757: +5643:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_MASTER_BUSY_TX; + 11172 .loc 1 5643 5 is_stmt 0 view .LVU3922 + 11173 0082 FFF7FEFF bl I2C_Disable_IRQ + 11174 .LVL758: +5644:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11175 .loc 1 5644 5 is_stmt 1 view .LVU3923 +5644:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11176 .loc 1 5644 25 is_stmt 0 view .LVU3924 + ARM GAS /tmp/ccE2rRGE.s page 381 + + + 11177 0086 1123 movs r3, #17 + 11178 0088 2363 str r3, [r4, #48] + 11179 008a CAE7 b .L696 + 11180 .LVL759: + 11181 .L707: +5648:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_MASTER_BUSY_RX; + 11182 .loc 1 5648 5 is_stmt 1 view .LVU3925 + 11183 008c 0221 movs r1, #2 + 11184 .LVL760: +5648:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_MASTER_BUSY_RX; + 11185 .loc 1 5648 5 is_stmt 0 view .LVU3926 + 11186 008e FFF7FEFF bl I2C_Disable_IRQ + 11187 .LVL761: +5649:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11188 .loc 1 5649 5 is_stmt 1 view .LVU3927 +5649:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11189 .loc 1 5649 25 is_stmt 0 view .LVU3928 + 11190 0092 1223 movs r3, #18 + 11191 0094 2363 str r3, [r4, #48] + 11192 0096 C4E7 b .L696 + 11193 .L708: +5673:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11194 .loc 1 5673 44 discriminator 1 view .LVU3929 + 11195 0098 15F0040F tst r5, #4 + 11196 009c E0D0 beq .L698 +5676:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** UNUSED(tmpreg); + 11197 .loc 1 5676 5 is_stmt 1 view .LVU3930 +5676:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** UNUSED(tmpreg); + 11198 .loc 1 5676 27 is_stmt 0 view .LVU3931 + 11199 009e 2368 ldr r3, [r4] +5676:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** UNUSED(tmpreg); + 11200 .loc 1 5676 37 view .LVU3932 + 11201 00a0 5B6A ldr r3, [r3, #36] + 11202 00a2 DBB2 uxtb r3, r3 +5676:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** UNUSED(tmpreg); + 11203 .loc 1 5676 12 view .LVU3933 + 11204 00a4 0193 str r3, [sp, #4] +5677:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11205 .loc 1 5677 5 is_stmt 1 view .LVU3934 + 11206 00a6 019B ldr r3, [sp, #4] + 11207 00a8 DAE7 b .L698 + 11208 .LVL762: + 11209 .L700: +5693:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11210 .loc 1 5693 8 view .LVU3935 +5693:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11211 .loc 1 5693 16 is_stmt 0 view .LVU3936 + 11212 00aa 94F84130 ldrb r3, [r4, #65] @ zero_extendqisi2 + 11213 00ae DBB2 uxtb r3, r3 +5693:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11214 .loc 1 5693 11 view .LVU3937 + 11215 00b0 212B cmp r3, #33 + 11216 00b2 17D0 beq .L709 +5728:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11217 .loc 1 5728 8 is_stmt 1 view .LVU3938 +5728:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11218 .loc 1 5728 16 is_stmt 0 view .LVU3939 + ARM GAS /tmp/ccE2rRGE.s page 382 + + + 11219 00b4 94F84130 ldrb r3, [r4, #65] @ zero_extendqisi2 + 11220 00b8 DBB2 uxtb r3, r3 +5728:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11221 .loc 1 5728 11 view .LVU3940 + 11222 00ba 222B cmp r3, #34 + 11223 00bc DED1 bne .L694 +5730:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_NONE; + 11224 .loc 1 5730 5 is_stmt 1 view .LVU3941 +5730:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_NONE; + 11225 .loc 1 5730 17 is_stmt 0 view .LVU3942 + 11226 00be 2023 movs r3, #32 + 11227 00c0 84F84130 strb r3, [r4, #65] +5731:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11228 .loc 1 5731 5 is_stmt 1 view .LVU3943 +5731:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11229 .loc 1 5731 25 is_stmt 0 view .LVU3944 + 11230 00c4 0023 movs r3, #0 + 11231 00c6 2363 str r3, [r4, #48] +5733:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11232 .loc 1 5733 5 is_stmt 1 view .LVU3945 +5733:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11233 .loc 1 5733 13 is_stmt 0 view .LVU3946 + 11234 00c8 94F84230 ldrb r3, [r4, #66] @ zero_extendqisi2 + 11235 00cc DBB2 uxtb r3, r3 +5733:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11236 .loc 1 5733 8 view .LVU3947 + 11237 00ce 402B cmp r3, #64 + 11238 00d0 24D0 beq .L710 +5749:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11239 .loc 1 5749 7 is_stmt 1 view .LVU3948 +5749:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11240 .loc 1 5749 18 is_stmt 0 view .LVU3949 + 11241 00d2 0023 movs r3, #0 + 11242 00d4 84F84230 strb r3, [r4, #66] +5752:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11243 .loc 1 5752 7 is_stmt 1 view .LVU3950 +5752:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11244 .loc 1 5752 7 view .LVU3951 + 11245 00d8 84F84030 strb r3, [r4, #64] +5752:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11246 .loc 1 5752 7 view .LVU3952 +5758:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + 11247 .loc 1 5758 7 view .LVU3953 + 11248 00dc 2046 mov r0, r4 + 11249 00de FFF7FEFF bl HAL_I2C_MasterRxCpltCallback + 11250 .LVL763: +5765:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11251 .loc 1 5765 3 view .LVU3954 +5766:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11252 .loc 1 5766 1 is_stmt 0 view .LVU3955 + 11253 00e2 CBE7 b .L694 + 11254 .LVL764: + 11255 .L709: +5695:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_NONE; + 11256 .loc 1 5695 5 is_stmt 1 view .LVU3956 +5695:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->PreviousState = I2C_STATE_NONE; + 11257 .loc 1 5695 17 is_stmt 0 view .LVU3957 + ARM GAS /tmp/ccE2rRGE.s page 383 + + + 11258 00e4 2023 movs r3, #32 + 11259 00e6 84F84130 strb r3, [r4, #65] +5696:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11260 .loc 1 5696 5 is_stmt 1 view .LVU3958 +5696:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11261 .loc 1 5696 25 is_stmt 0 view .LVU3959 + 11262 00ea 0023 movs r3, #0 + 11263 00ec 2363 str r3, [r4, #48] +5698:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11264 .loc 1 5698 5 is_stmt 1 view .LVU3960 +5698:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11265 .loc 1 5698 13 is_stmt 0 view .LVU3961 + 11266 00ee 94F84230 ldrb r3, [r4, #66] @ zero_extendqisi2 + 11267 00f2 DBB2 uxtb r3, r3 +5698:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11268 .loc 1 5698 8 view .LVU3962 + 11269 00f4 402B cmp r3, #64 + 11270 00f6 08D0 beq .L711 +5714:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11271 .loc 1 5714 7 is_stmt 1 view .LVU3963 +5714:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11272 .loc 1 5714 18 is_stmt 0 view .LVU3964 + 11273 00f8 0023 movs r3, #0 + 11274 00fa 84F84230 strb r3, [r4, #66] +5717:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11275 .loc 1 5717 7 is_stmt 1 view .LVU3965 +5717:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11276 .loc 1 5717 7 view .LVU3966 + 11277 00fe 84F84030 strb r3, [r4, #64] +5717:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11278 .loc 1 5717 7 view .LVU3967 +5723:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + 11279 .loc 1 5723 7 view .LVU3968 + 11280 0102 2046 mov r0, r4 + 11281 0104 FFF7FEFF bl HAL_I2C_MasterTxCpltCallback + 11282 .LVL765: +5723:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + 11283 .loc 1 5723 7 is_stmt 0 view .LVU3969 + 11284 0108 B8E7 b .L694 + 11285 .LVL766: + 11286 .L711: +5700:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11287 .loc 1 5700 7 is_stmt 1 view .LVU3970 +5700:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11288 .loc 1 5700 18 is_stmt 0 view .LVU3971 + 11289 010a 0023 movs r3, #0 + 11290 010c 84F84230 strb r3, [r4, #66] +5703:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11291 .loc 1 5703 7 is_stmt 1 view .LVU3972 +5703:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11292 .loc 1 5703 7 view .LVU3973 + 11293 0110 84F84030 strb r3, [r4, #64] +5703:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11294 .loc 1 5703 7 view .LVU3974 +5709:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + 11295 .loc 1 5709 7 view .LVU3975 + 11296 0114 2046 mov r0, r4 + ARM GAS /tmp/ccE2rRGE.s page 384 + + + 11297 0116 FFF7FEFF bl HAL_I2C_MemTxCpltCallback + 11298 .LVL767: +5709:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + 11299 .loc 1 5709 7 is_stmt 0 view .LVU3976 + 11300 011a AFE7 b .L694 + 11301 .LVL768: + 11302 .L710: +5735:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11303 .loc 1 5735 7 is_stmt 1 view .LVU3977 +5735:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11304 .loc 1 5735 18 is_stmt 0 view .LVU3978 + 11305 011c 0023 movs r3, #0 + 11306 011e 84F84230 strb r3, [r4, #66] +5738:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11307 .loc 1 5738 7 is_stmt 1 view .LVU3979 +5738:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11308 .loc 1 5738 7 view .LVU3980 + 11309 0122 84F84030 strb r3, [r4, #64] +5738:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11310 .loc 1 5738 7 view .LVU3981 +5744:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + 11311 .loc 1 5744 7 view .LVU3982 + 11312 0126 2046 mov r0, r4 + 11313 0128 FFF7FEFF bl HAL_I2C_MemRxCpltCallback + 11314 .LVL769: +5744:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */ + 11315 .loc 1 5744 7 is_stmt 0 view .LVU3983 + 11316 012c A6E7 b .L694 + 11317 .cfi_endproc + 11318 .LFE188: + 11320 .section .text.I2C_Master_ISR_IT,"ax",%progbits + 11321 .align 1 + 11322 .syntax unified + 11323 .thumb + 11324 .thumb_func + 11326 I2C_Master_ISR_IT: + 11327 .LVL770: + 11328 .LFB179: +4735:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint16_t devaddress; + 11329 .loc 1 4735 1 is_stmt 1 view -0 + 11330 .cfi_startproc + 11331 @ args = 0, pretend = 0, frame = 0 + 11332 @ frame_needed = 0, uses_anonymous_args = 0 +4736:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tmpITFlags = ITFlags; + 11333 .loc 1 4736 3 view .LVU3985 +4737:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11334 .loc 1 4737 3 view .LVU3986 +4740:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11335 .loc 1 4740 3 view .LVU3987 +4740:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11336 .loc 1 4740 3 view .LVU3988 + 11337 0000 90F84030 ldrb r3, [r0, #64] @ zero_extendqisi2 + 11338 0004 012B cmp r3, #1 + 11339 0006 00F0B980 beq .L726 +4735:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint16_t devaddress; + 11340 .loc 1 4735 1 is_stmt 0 discriminator 2 view .LVU3989 + 11341 000a 70B5 push {r4, r5, r6, lr} + ARM GAS /tmp/ccE2rRGE.s page 385 + + + 11342 .cfi_def_cfa_offset 16 + 11343 .cfi_offset 4, -16 + 11344 .cfi_offset 5, -12 + 11345 .cfi_offset 6, -8 + 11346 .cfi_offset 14, -4 + 11347 000c 82B0 sub sp, sp, #8 + 11348 .cfi_def_cfa_offset 24 + 11349 000e 0446 mov r4, r0 + 11350 0010 0D46 mov r5, r1 + 11351 0012 1646 mov r6, r2 +4740:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11352 .loc 1 4740 3 is_stmt 1 discriminator 2 view .LVU3990 + 11353 0014 0123 movs r3, #1 + 11354 0016 80F84030 strb r3, [r0, #64] +4740:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11355 .loc 1 4740 3 discriminator 2 view .LVU3991 +4742:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET)) + 11356 .loc 1 4742 3 discriminator 2 view .LVU3992 +4742:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET)) + 11357 .loc 1 4742 6 is_stmt 0 discriminator 2 view .LVU3993 + 11358 001a 11F0100F tst r1, #16 + 11359 001e 02D0 beq .L714 +4742:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET)) + 11360 .loc 1 4742 58 discriminator 1 view .LVU3994 + 11361 0020 12F0100F tst r2, #16 + 11362 0024 22D1 bne .L731 + 11363 .L714: +4756:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_RXI) != RESET)) + 11364 .loc 1 4756 8 is_stmt 1 view .LVU3995 +4756:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_RXI) != RESET)) + 11365 .loc 1 4756 11 is_stmt 0 view .LVU3996 + 11366 0026 15F0040F tst r5, #4 + 11367 002a 29D0 beq .L716 +4756:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_RXI) != RESET)) + 11368 .loc 1 4756 65 discriminator 1 view .LVU3997 + 11369 002c 16F0040F tst r6, #4 + 11370 0030 26D0 beq .L716 +4760:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11371 .loc 1 4760 5 is_stmt 1 view .LVU3998 +4760:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11372 .loc 1 4760 16 is_stmt 0 view .LVU3999 + 11373 0032 25F00405 bic r5, r5, #4 + 11374 .LVL771: +4763:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11375 .loc 1 4763 5 is_stmt 1 view .LVU4000 +4763:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11376 .loc 1 4763 36 is_stmt 0 view .LVU4001 + 11377 0036 2368 ldr r3, [r4] +4763:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11378 .loc 1 4763 46 view .LVU4002 + 11379 0038 5A6A ldr r2, [r3, #36] + 11380 .LVL772: +4763:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11381 .loc 1 4763 10 view .LVU4003 + 11382 003a 636A ldr r3, [r4, #36] +4763:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11383 .loc 1 4763 21 view .LVU4004 + ARM GAS /tmp/ccE2rRGE.s page 386 + + + 11384 003c 1A70 strb r2, [r3] +4766:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11385 .loc 1 4766 5 is_stmt 1 view .LVU4005 +4766:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11386 .loc 1 4766 9 is_stmt 0 view .LVU4006 + 11387 003e 636A ldr r3, [r4, #36] +4766:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11388 .loc 1 4766 19 view .LVU4007 + 11389 0040 0133 adds r3, r3, #1 + 11390 0042 6362 str r3, [r4, #36] +4768:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount--; + 11391 .loc 1 4768 5 is_stmt 1 view .LVU4008 +4768:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount--; + 11392 .loc 1 4768 9 is_stmt 0 view .LVU4009 + 11393 0044 238D ldrh r3, [r4, #40] +4768:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount--; + 11394 .loc 1 4768 19 view .LVU4010 + 11395 0046 013B subs r3, r3, #1 + 11396 0048 2385 strh r3, [r4, #40] @ movhi +4769:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11397 .loc 1 4769 5 is_stmt 1 view .LVU4011 +4769:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11398 .loc 1 4769 9 is_stmt 0 view .LVU4012 + 11399 004a 638D ldrh r3, [r4, #42] + 11400 004c 9BB2 uxth r3, r3 +4769:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11401 .loc 1 4769 20 view .LVU4013 + 11402 004e 013B subs r3, r3, #1 + 11403 0050 9BB2 uxth r3, r3 + 11404 0052 6385 strh r3, [r4, #42] @ movhi + 11405 .LVL773: + 11406 .L715: +4856:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11407 .loc 1 4856 3 is_stmt 1 view .LVU4014 +4858:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) + 11408 .loc 1 4858 3 view .LVU4015 +4858:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) + 11409 .loc 1 4858 6 is_stmt 0 view .LVU4016 + 11410 0054 15F0200F tst r5, #32 + 11411 0058 03D0 beq .L725 +4858:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) + 11412 .loc 1 4858 61 discriminator 1 view .LVU4017 + 11413 005a 16F0200F tst r6, #32 + 11414 005e 40F08880 bne .L732 + 11415 .L725: +4866:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11416 .loc 1 4866 3 is_stmt 1 view .LVU4018 +4866:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11417 .loc 1 4866 3 view .LVU4019 + 11418 0062 0020 movs r0, #0 + 11419 0064 84F84000 strb r0, [r4, #64] +4866:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11420 .loc 1 4866 3 view .LVU4020 +4868:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11421 .loc 1 4868 3 view .LVU4021 +4869:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11422 .loc 1 4869 1 is_stmt 0 view .LVU4022 + ARM GAS /tmp/ccE2rRGE.s page 387 + + + 11423 0068 02B0 add sp, sp, #8 + 11424 .cfi_remember_state + 11425 .cfi_def_cfa_offset 16 + 11426 @ sp needed + 11427 006a 70BD pop {r4, r5, r6, pc} + 11428 .LVL774: + 11429 .L731: + 11430 .cfi_restore_state +4746:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11431 .loc 1 4746 5 is_stmt 1 view .LVU4023 + 11432 006c 0368 ldr r3, [r0] + 11433 006e 1022 movs r2, #16 + 11434 .LVL775: +4746:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11435 .loc 1 4746 5 is_stmt 0 view .LVU4024 + 11436 0070 DA61 str r2, [r3, #28] +4751:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11437 .loc 1 4751 5 is_stmt 1 view .LVU4025 +4751:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11438 .loc 1 4751 9 is_stmt 0 view .LVU4026 + 11439 0072 436C ldr r3, [r0, #68] +4751:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11440 .loc 1 4751 21 view .LVU4027 + 11441 0074 43F00403 orr r3, r3, #4 + 11442 0078 4364 str r3, [r0, #68] +4754:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11443 .loc 1 4754 5 is_stmt 1 view .LVU4028 + 11444 007a FFF7FEFF bl I2C_Flush_TXDR + 11445 .LVL776: +4754:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11446 .loc 1 4754 5 is_stmt 0 view .LVU4029 + 11447 007e E9E7 b .L715 + 11448 .LVL777: + 11449 .L716: +4771:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TXI) != RESET)) + 11450 .loc 1 4771 8 is_stmt 1 view .LVU4030 +4771:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TXI) != RESET)) + 11451 .loc 1 4771 11 is_stmt 0 view .LVU4031 + 11452 0080 15F0020F tst r5, #2 + 11453 0084 12D0 beq .L717 +4771:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TXI) != RESET)) + 11454 .loc 1 4771 65 discriminator 1 view .LVU4032 + 11455 0086 16F0020F tst r6, #2 + 11456 008a 0FD0 beq .L717 +4775:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11457 .loc 1 4775 5 is_stmt 1 view .LVU4033 +4775:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11458 .loc 1 4775 33 is_stmt 0 view .LVU4034 + 11459 008c 626A ldr r2, [r4, #36] + 11460 .LVL778: +4775:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11461 .loc 1 4775 9 view .LVU4035 + 11462 008e 2368 ldr r3, [r4] +4775:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11463 .loc 1 4775 28 view .LVU4036 + 11464 0090 1278 ldrb r2, [r2] @ zero_extendqisi2 +4775:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + ARM GAS /tmp/ccE2rRGE.s page 388 + + + 11465 .loc 1 4775 26 view .LVU4037 + 11466 0092 9A62 str r2, [r3, #40] +4778:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11467 .loc 1 4778 5 is_stmt 1 view .LVU4038 +4778:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11468 .loc 1 4778 9 is_stmt 0 view .LVU4039 + 11469 0094 636A ldr r3, [r4, #36] +4778:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11470 .loc 1 4778 19 view .LVU4040 + 11471 0096 0133 adds r3, r3, #1 + 11472 0098 6362 str r3, [r4, #36] +4780:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount--; + 11473 .loc 1 4780 5 is_stmt 1 view .LVU4041 +4780:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount--; + 11474 .loc 1 4780 9 is_stmt 0 view .LVU4042 + 11475 009a 238D ldrh r3, [r4, #40] +4780:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferCount--; + 11476 .loc 1 4780 19 view .LVU4043 + 11477 009c 013B subs r3, r3, #1 + 11478 009e 2385 strh r3, [r4, #40] @ movhi +4781:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11479 .loc 1 4781 5 is_stmt 1 view .LVU4044 +4781:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11480 .loc 1 4781 9 is_stmt 0 view .LVU4045 + 11481 00a0 638D ldrh r3, [r4, #42] + 11482 00a2 9BB2 uxth r3, r3 +4781:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11483 .loc 1 4781 20 view .LVU4046 + 11484 00a4 013B subs r3, r3, #1 + 11485 00a6 9BB2 uxth r3, r3 + 11486 00a8 6385 strh r3, [r4, #42] @ movhi + 11487 00aa D3E7 b .L715 + 11488 .LVL779: + 11489 .L717: +4783:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TCI) != RESET)) + 11490 .loc 1 4783 8 is_stmt 1 view .LVU4047 +4783:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TCI) != RESET)) + 11491 .loc 1 4783 11 is_stmt 0 view .LVU4048 + 11492 00ac 15F0800F tst r5, #128 + 11493 00b0 3FD0 beq .L718 +4783:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TCI) != RESET)) + 11494 .loc 1 4783 64 discriminator 1 view .LVU4049 + 11495 00b2 16F0400F tst r6, #64 + 11496 00b6 3CD0 beq .L718 +4786:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11497 .loc 1 4786 5 is_stmt 1 view .LVU4050 +4786:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11498 .loc 1 4786 14 is_stmt 0 view .LVU4051 + 11499 00b8 638D ldrh r3, [r4, #42] + 11500 00ba 9BB2 uxth r3, r3 +4786:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11501 .loc 1 4786 8 view .LVU4052 + 11502 00bc 5BB3 cbz r3, .L719 +4786:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11503 .loc 1 4786 41 discriminator 1 view .LVU4053 + 11504 00be 238D ldrh r3, [r4, #40] +4786:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + ARM GAS /tmp/ccE2rRGE.s page 389 + + + 11505 .loc 1 4786 33 discriminator 1 view .LVU4054 + 11506 00c0 4BBB cbnz r3, .L719 +4788:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11507 .loc 1 4788 7 is_stmt 1 view .LVU4055 +4788:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11508 .loc 1 4788 35 is_stmt 0 view .LVU4056 + 11509 00c2 2368 ldr r3, [r4] +4788:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11510 .loc 1 4788 45 view .LVU4057 + 11511 00c4 5968 ldr r1, [r3, #4] + 11512 .LVL780: +4788:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11513 .loc 1 4788 18 view .LVU4058 + 11514 00c6 C1F30901 ubfx r1, r1, #0, #10 + 11515 .LVL781: +4790:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11516 .loc 1 4790 7 is_stmt 1 view .LVU4059 +4790:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11517 .loc 1 4790 15 is_stmt 0 view .LVU4060 + 11518 00ca 638D ldrh r3, [r4, #42] + 11519 00cc 9BB2 uxth r3, r3 +4790:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11520 .loc 1 4790 10 view .LVU4061 + 11521 00ce FF2B cmp r3, #255 + 11522 00d0 0ED8 bhi .L733 +4797:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferOptions != I2C_NO_OPTION_FRAME) + 11523 .loc 1 4797 9 is_stmt 1 view .LVU4062 +4797:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferOptions != I2C_NO_OPTION_FRAME) + 11524 .loc 1 4797 30 is_stmt 0 view .LVU4063 + 11525 00d2 628D ldrh r2, [r4, #42] + 11526 .LVL782: +4797:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferOptions != I2C_NO_OPTION_FRAME) + 11527 .loc 1 4797 30 view .LVU4064 + 11528 00d4 92B2 uxth r2, r2 +4797:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferOptions != I2C_NO_OPTION_FRAME) + 11529 .loc 1 4797 24 view .LVU4065 + 11530 00d6 2285 strh r2, [r4, #40] @ movhi +4798:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11531 .loc 1 4798 9 is_stmt 1 view .LVU4066 +4798:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11532 .loc 1 4798 17 is_stmt 0 view .LVU4067 + 11533 00d8 E36A ldr r3, [r4, #44] +4798:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11534 .loc 1 4798 12 view .LVU4068 + 11535 00da 13F5803F cmn r3, #65536 + 11536 00de 11D0 beq .L721 +4800:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions, I2C_NO_STARTSTOP); + 11537 .loc 1 4800 11 is_stmt 1 view .LVU4069 +4801:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11538 .loc 1 4801 34 is_stmt 0 view .LVU4070 + 11539 00e0 E36A ldr r3, [r4, #44] +4800:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions, I2C_NO_STARTSTOP); + 11540 .loc 1 4800 11 view .LVU4071 + 11541 00e2 0020 movs r0, #0 + 11542 .LVL783: +4800:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions, I2C_NO_STARTSTOP); + 11543 .loc 1 4800 11 view .LVU4072 + ARM GAS /tmp/ccE2rRGE.s page 390 + + + 11544 00e4 0090 str r0, [sp] + 11545 00e6 D2B2 uxtb r2, r2 + 11546 00e8 2046 mov r0, r4 + 11547 00ea FFF7FEFF bl I2C_TransferConfig + 11548 .LVL784: +4800:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferOptions, I2C_NO_STARTSTOP); + 11549 .loc 1 4800 11 view .LVU4073 + 11550 00ee B1E7 b .L715 + 11551 .LVL785: + 11552 .L733: +4792:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, devaddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, I2C_NO_START + 11553 .loc 1 4792 9 is_stmt 1 view .LVU4074 +4792:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, devaddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, I2C_NO_START + 11554 .loc 1 4792 24 is_stmt 0 view .LVU4075 + 11555 00f0 FF22 movs r2, #255 + 11556 .LVL786: +4792:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_TransferConfig(hi2c, devaddress, (uint8_t)hi2c->XferSize, I2C_RELOAD_MODE, I2C_NO_START + 11557 .loc 1 4792 24 view .LVU4076 + 11558 00f2 2285 strh r2, [r4, #40] @ movhi +4793:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11559 .loc 1 4793 9 is_stmt 1 view .LVU4077 + 11560 00f4 0023 movs r3, #0 + 11561 00f6 0093 str r3, [sp] + 11562 00f8 4FF08073 mov r3, #16777216 + 11563 00fc 2046 mov r0, r4 + 11564 .LVL787: +4793:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11565 .loc 1 4793 9 is_stmt 0 view .LVU4078 + 11566 00fe FFF7FEFF bl I2C_TransferConfig + 11567 .LVL788: +4793:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11568 .loc 1 4793 9 view .LVU4079 + 11569 0102 A7E7 b .L715 + 11570 .LVL789: + 11571 .L721: +4805:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_AUTOEND_MODE, I2C_NO_STARTSTOP); + 11572 .loc 1 4805 11 is_stmt 1 view .LVU4080 + 11573 0104 0023 movs r3, #0 + 11574 0106 0093 str r3, [sp] + 11575 0108 4FF00073 mov r3, #33554432 + 11576 010c D2B2 uxtb r2, r2 + 11577 010e 2046 mov r0, r4 + 11578 .LVL790: +4805:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_AUTOEND_MODE, I2C_NO_STARTSTOP); + 11579 .loc 1 4805 11 is_stmt 0 view .LVU4081 + 11580 0110 FFF7FEFF bl I2C_TransferConfig + 11581 .LVL791: +4805:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** I2C_AUTOEND_MODE, I2C_NO_STARTSTOP); + 11582 .loc 1 4805 11 view .LVU4082 + 11583 0114 9EE7 b .L715 + 11584 .LVL792: + 11585 .L719: +4813:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11586 .loc 1 4813 7 is_stmt 1 view .LVU4083 +4813:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11587 .loc 1 4813 11 is_stmt 0 view .LVU4084 + 11588 0116 2368 ldr r3, [r4] + ARM GAS /tmp/ccE2rRGE.s page 391 + + + 11589 0118 5B68 ldr r3, [r3, #4] +4813:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11590 .loc 1 4813 10 view .LVU4085 + 11591 011a 13F0007F tst r3, #33554432 + 11592 011e 03D1 bne .L722 +4816:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11593 .loc 1 4816 9 is_stmt 1 view .LVU4086 + 11594 0120 2046 mov r0, r4 + 11595 .LVL793: +4816:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11596 .loc 1 4816 9 is_stmt 0 view .LVU4087 + 11597 0122 FFF7FEFF bl I2C_ITMasterSeqCplt + 11598 .LVL794: +4816:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11599 .loc 1 4816 9 view .LVU4088 + 11600 0126 95E7 b .L715 + 11601 .LVL795: + 11602 .L722: +4822:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11603 .loc 1 4822 9 is_stmt 1 view .LVU4089 + 11604 0128 4021 movs r1, #64 + 11605 .LVL796: +4822:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11606 .loc 1 4822 9 is_stmt 0 view .LVU4090 + 11607 012a 2046 mov r0, r4 + 11608 .LVL797: +4822:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11609 .loc 1 4822 9 view .LVU4091 + 11610 012c FFF7FEFF bl I2C_ITError + 11611 .LVL798: +4822:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11612 .loc 1 4822 9 view .LVU4092 + 11613 0130 90E7 b .L715 + 11614 .LVL799: + 11615 .L718: +4826:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TCI) != RESET)) + 11616 .loc 1 4826 8 is_stmt 1 view .LVU4093 +4826:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TCI) != RESET)) + 11617 .loc 1 4826 11 is_stmt 0 view .LVU4094 + 11618 0132 15F0400F tst r5, #64 + 11619 0136 8DD0 beq .L715 +4826:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TCI) != RESET)) + 11620 .loc 1 4826 63 discriminator 1 view .LVU4095 + 11621 0138 16F0400F tst r6, #64 + 11622 013c 8AD0 beq .L715 +4829:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11623 .loc 1 4829 5 is_stmt 1 view .LVU4096 +4829:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11624 .loc 1 4829 13 is_stmt 0 view .LVU4097 + 11625 013e 638D ldrh r3, [r4, #42] + 11626 0140 9BB2 uxth r3, r3 +4829:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11627 .loc 1 4829 8 view .LVU4098 + 11628 0142 8BB9 cbnz r3, .L723 +4831:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11629 .loc 1 4831 7 is_stmt 1 view .LVU4099 +4831:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + ARM GAS /tmp/ccE2rRGE.s page 392 + + + 11630 .loc 1 4831 11 is_stmt 0 view .LVU4100 + 11631 0144 2368 ldr r3, [r4] + 11632 0146 5A68 ldr r2, [r3, #4] + 11633 .LVL800: +4831:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11634 .loc 1 4831 10 view .LVU4101 + 11635 0148 12F0007F tst r2, #33554432 + 11636 014c 82D1 bne .L715 +4834:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11637 .loc 1 4834 9 is_stmt 1 view .LVU4102 +4834:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11638 .loc 1 4834 17 is_stmt 0 view .LVU4103 + 11639 014e E26A ldr r2, [r4, #44] +4834:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11640 .loc 1 4834 12 view .LVU4104 + 11641 0150 12F5803F cmn r2, #65536 + 11642 0154 04D1 bne .L724 +4837:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11643 .loc 1 4837 11 is_stmt 1 view .LVU4105 +4837:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11644 .loc 1 4837 25 is_stmt 0 view .LVU4106 + 11645 0156 5A68 ldr r2, [r3, #4] +4837:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11646 .loc 1 4837 31 view .LVU4107 + 11647 0158 42F48042 orr r2, r2, #16384 + 11648 015c 5A60 str r2, [r3, #4] + 11649 015e 79E7 b .L715 + 11650 .L724: +4842:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11651 .loc 1 4842 11 is_stmt 1 view .LVU4108 + 11652 0160 2046 mov r0, r4 + 11653 .LVL801: +4842:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11654 .loc 1 4842 11 is_stmt 0 view .LVU4109 + 11655 0162 FFF7FEFF bl I2C_ITMasterSeqCplt + 11656 .LVL802: +4842:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11657 .loc 1 4842 11 view .LVU4110 + 11658 0166 75E7 b .L715 + 11659 .LVL803: + 11660 .L723: +4850:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11661 .loc 1 4850 7 is_stmt 1 view .LVU4111 + 11662 0168 4021 movs r1, #64 + 11663 .LVL804: +4850:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11664 .loc 1 4850 7 is_stmt 0 view .LVU4112 + 11665 016a 2046 mov r0, r4 + 11666 .LVL805: +4850:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11667 .loc 1 4850 7 view .LVU4113 + 11668 016c FFF7FEFF bl I2C_ITError + 11669 .LVL806: +4850:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11670 .loc 1 4850 7 view .LVU4114 + 11671 0170 70E7 b .L715 + 11672 .LVL807: + ARM GAS /tmp/ccE2rRGE.s page 393 + + + 11673 .L732: +4862:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11674 .loc 1 4862 5 is_stmt 1 view .LVU4115 + 11675 0172 2946 mov r1, r5 + 11676 0174 2046 mov r0, r4 + 11677 0176 FFF7FEFF bl I2C_ITMasterCplt + 11678 .LVL808: + 11679 017a 72E7 b .L725 + 11680 .LVL809: + 11681 .L726: + 11682 .cfi_def_cfa_offset 0 + 11683 .cfi_restore 4 + 11684 .cfi_restore 5 + 11685 .cfi_restore 6 + 11686 .cfi_restore 14 +4740:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11687 .loc 1 4740 3 is_stmt 0 view .LVU4116 + 11688 017c 0220 movs r0, #2 + 11689 .LVL810: +4869:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11690 .loc 1 4869 1 view .LVU4117 + 11691 017e 7047 bx lr + 11692 .cfi_endproc + 11693 .LFE179: + 11695 .section .text.I2C_Slave_ISR_DMA,"ax",%progbits + 11696 .align 1 + 11697 .syntax unified + 11698 .thumb + 11699 .thumb_func + 11701 I2C_Slave_ISR_DMA: + 11702 .LVL811: + 11703 .LFB182: +5162:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tmpoptions = hi2c->XferOptions; + 11704 .loc 1 5162 1 is_stmt 1 view -0 + 11705 .cfi_startproc + 11706 @ args = 0, pretend = 0, frame = 0 + 11707 @ frame_needed = 0, uses_anonymous_args = 0 +5162:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tmpoptions = hi2c->XferOptions; + 11708 .loc 1 5162 1 is_stmt 0 view .LVU4119 + 11709 0000 F8B5 push {r3, r4, r5, r6, r7, lr} + 11710 .cfi_def_cfa_offset 24 + 11711 .cfi_offset 3, -24 + 11712 .cfi_offset 4, -20 + 11713 .cfi_offset 5, -16 + 11714 .cfi_offset 6, -12 + 11715 .cfi_offset 7, -8 + 11716 .cfi_offset 14, -4 +5163:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t treatdmanack = 0U; + 11717 .loc 1 5163 3 is_stmt 1 view .LVU4120 +5163:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t treatdmanack = 0U; + 11718 .loc 1 5163 12 is_stmt 0 view .LVU4121 + 11719 0002 C76A ldr r7, [r0, #44] + 11720 .LVL812: +5164:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_StateTypeDef tmpstate; + 11721 .loc 1 5164 3 is_stmt 1 view .LVU4122 +5165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11722 .loc 1 5165 3 view .LVU4123 + ARM GAS /tmp/ccE2rRGE.s page 394 + + +5168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11723 .loc 1 5168 3 view .LVU4124 +5168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11724 .loc 1 5168 3 view .LVU4125 + 11725 0004 90F84030 ldrb r3, [r0, #64] @ zero_extendqisi2 + 11726 0008 012B cmp r3, #1 + 11727 000a 00F08780 beq .L751 + 11728 000e 0446 mov r4, r0 + 11729 0010 0D46 mov r5, r1 + 11730 0012 1646 mov r6, r2 +5168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11731 .loc 1 5168 3 discriminator 2 view .LVU4126 + 11732 0014 0123 movs r3, #1 + 11733 0016 80F84030 strb r3, [r0, #64] +5168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11734 .loc 1 5168 3 discriminator 2 view .LVU4127 +5171:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) + 11735 .loc 1 5171 3 discriminator 2 view .LVU4128 +5171:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) + 11736 .loc 1 5171 6 is_stmt 0 discriminator 2 view .LVU4129 + 11737 001a 11F0200F tst r1, #32 + 11738 001e 02D0 beq .L736 +5171:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) + 11739 .loc 1 5171 58 discriminator 1 view .LVU4130 + 11740 0020 12F0200F tst r2, #32 + 11741 0024 12D1 bne .L756 + 11742 .LVL813: + 11743 .L736: +5178:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET)) + 11744 .loc 1 5178 3 is_stmt 1 view .LVU4131 +5178:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET)) + 11745 .loc 1 5178 6 is_stmt 0 view .LVU4132 + 11746 0026 15F0100F tst r5, #16 + 11747 002a 68D0 beq .L737 +5178:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET)) + 11748 .loc 1 5178 55 discriminator 1 view .LVU4133 + 11749 002c 16F0100F tst r6, #16 + 11750 0030 65D0 beq .L737 +5185:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_CR1_RXDMAEN) != RESET)) + 11751 .loc 1 5185 5 is_stmt 1 view .LVU4134 +5185:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_CR1_RXDMAEN) != RESET)) + 11752 .loc 1 5185 8 is_stmt 0 view .LVU4135 + 11753 0032 16F4404F tst r6, #49152 + 11754 0036 5ED0 beq .L738 +5189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11755 .loc 1 5189 7 is_stmt 1 view .LVU4136 +5189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11756 .loc 1 5189 15 is_stmt 0 view .LVU4137 + 11757 0038 E36B ldr r3, [r4, #60] +5189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11758 .loc 1 5189 10 view .LVU4138 + 11759 003a 53B1 cbz r3, .L752 +5191:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11760 .loc 1 5191 9 is_stmt 1 view .LVU4139 +5191:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11761 .loc 1 5191 12 is_stmt 0 view .LVU4140 + 11762 003c 16F40042 ands r2, r6, #32768 + ARM GAS /tmp/ccE2rRGE.s page 395 + + + 11763 0040 08D0 beq .L739 +5193:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11764 .loc 1 5193 11 is_stmt 1 view .LVU4141 +5193:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11765 .loc 1 5193 15 is_stmt 0 view .LVU4142 + 11766 0042 1B68 ldr r3, [r3] + 11767 0044 5B68 ldr r3, [r3, #4] +5193:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11768 .loc 1 5193 14 view .LVU4143 + 11769 0046 3BB3 cbz r3, .L753 +5164:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_StateTypeDef tmpstate; + 11770 .loc 1 5164 12 view .LVU4144 + 11771 0048 0022 movs r2, #0 + 11772 004a 03E0 b .L739 + 11773 .LVL814: + 11774 .L756: +5175:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11775 .loc 1 5175 5 is_stmt 1 view .LVU4145 + 11776 004c FFF7FEFF bl I2C_ITSlaveCplt + 11777 .LVL815: +5175:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11778 .loc 1 5175 5 is_stmt 0 view .LVU4146 + 11779 0050 E9E7 b .L736 + 11780 .L752: +5164:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** HAL_I2C_StateTypeDef tmpstate; + 11781 .loc 1 5164 12 view .LVU4147 + 11782 0052 0022 movs r2, #0 + 11783 .L739: + 11784 .LVL816: +5201:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11785 .loc 1 5201 7 is_stmt 1 view .LVU4148 +5201:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11786 .loc 1 5201 15 is_stmt 0 view .LVU4149 + 11787 0054 A36B ldr r3, [r4, #56] +5201:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11788 .loc 1 5201 10 view .LVU4150 + 11789 0056 2BB1 cbz r3, .L740 +5203:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11790 .loc 1 5203 9 is_stmt 1 view .LVU4151 +5203:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11791 .loc 1 5203 12 is_stmt 0 view .LVU4152 + 11792 0058 16F4804F tst r6, #16384 + 11793 005c 02D0 beq .L740 +5205:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11794 .loc 1 5205 11 is_stmt 1 view .LVU4153 +5205:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11795 .loc 1 5205 15 is_stmt 0 view .LVU4154 + 11796 005e 1B68 ldr r3, [r3] + 11797 0060 5B68 ldr r3, [r3, #4] +5205:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11798 .loc 1 5205 14 view .LVU4155 + 11799 0062 DBB1 cbz r3, .L741 + 11800 .L740: +5212:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11801 .loc 1 5212 7 is_stmt 1 view .LVU4156 +5212:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11802 .loc 1 5212 10 is_stmt 0 view .LVU4157 + ARM GAS /tmp/ccE2rRGE.s page 396 + + + 11803 0064 012A cmp r2, #1 + 11804 0066 19D0 beq .L741 +5243:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11805 .loc 1 5243 9 is_stmt 1 view .LVU4158 + 11806 0068 2368 ldr r3, [r4] + 11807 006a 1022 movs r2, #16 + 11808 .LVL817: +5243:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11809 .loc 1 5243 9 is_stmt 0 view .LVU4159 + 11810 006c DA61 str r2, [r3, #28] +5246:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11811 .loc 1 5246 9 is_stmt 1 view .LVU4160 +5246:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11812 .loc 1 5246 13 is_stmt 0 view .LVU4161 + 11813 006e 636C ldr r3, [r4, #68] +5246:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11814 .loc 1 5246 25 view .LVU4162 + 11815 0070 43F00403 orr r3, r3, #4 + 11816 0074 6364 str r3, [r4, #68] +5249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11817 .loc 1 5249 9 is_stmt 1 view .LVU4163 +5249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11818 .loc 1 5249 18 is_stmt 0 view .LVU4164 + 11819 0076 94F84130 ldrb r3, [r4, #65] @ zero_extendqisi2 + 11820 007a DBB2 uxtb r3, r3 + 11821 .LVL818: +5251:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11822 .loc 1 5251 9 is_stmt 1 view .LVU4165 +5251:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11823 .loc 1 5251 12 is_stmt 0 view .LVU4166 + 11824 007c 17B1 cbz r7, .L746 +5251:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11825 .loc 1 5251 45 discriminator 1 view .LVU4167 + 11826 007e B7F1807F cmp r7, #16777216 + 11827 0082 42D1 bne .L744 + 11828 .L746: +5253:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11829 .loc 1 5253 11 is_stmt 1 view .LVU4168 + 11830 0084 213B subs r3, r3, #33 + 11831 .LVL819: +5253:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11832 .loc 1 5253 11 is_stmt 0 view .LVU4169 + 11833 0086 092B cmp r3, #9 + 11834 0088 2DD8 bhi .L747 + 11835 008a DFE803F0 tbb [pc, r3] + 11836 .L749: + 11837 008e 2A .byte (.L750-.L749)/2 + 11838 008f 31 .byte (.L748-.L749)/2 + 11839 0090 2C .byte (.L747-.L749)/2 + 11840 0091 2C .byte (.L747-.L749)/2 + 11841 0092 2C .byte (.L747-.L749)/2 + 11842 0093 2C .byte (.L747-.L749)/2 + 11843 0094 2C .byte (.L747-.L749)/2 + 11844 0095 2C .byte (.L747-.L749)/2 + 11845 0096 2A .byte (.L750-.L749)/2 + 11846 0097 31 .byte (.L748-.L749)/2 + 11847 .LVL820: + ARM GAS /tmp/ccE2rRGE.s page 397 + + + 11848 .p2align 1 + 11849 .L753: +5195:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11850 .loc 1 5195 26 view .LVU4170 + 11851 0098 0122 movs r2, #1 + 11852 009a DBE7 b .L739 + 11853 .LVL821: + 11854 .L741: +5214:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Same action must be done for (tmpoptions == I2C_LAST_FRAME) which removed for + 11855 .loc 1 5214 9 is_stmt 1 view .LVU4171 +5214:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Same action must be done for (tmpoptions == I2C_LAST_FRAME) which removed for + 11856 .loc 1 5214 18 is_stmt 0 view .LVU4172 + 11857 009c 94F84130 ldrb r3, [r4, #65] @ zero_extendqisi2 + 11858 00a0 DBB2 uxtb r3, r3 +5214:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Same action must be done for (tmpoptions == I2C_LAST_FRAME) which removed for + 11859 .loc 1 5214 12 view .LVU4173 + 11860 00a2 282B cmp r3, #40 + 11861 00a4 08D0 beq .L757 + 11862 .L743: +5221:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11863 .loc 1 5221 14 is_stmt 1 view .LVU4174 +5221:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11864 .loc 1 5221 23 is_stmt 0 view .LVU4175 + 11865 00a6 94F84130 ldrb r3, [r4, #65] @ zero_extendqisi2 + 11866 00aa DBB2 uxtb r3, r3 +5221:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11867 .loc 1 5221 17 view .LVU4176 + 11868 00ac 292B cmp r3, #41 + 11869 00ae 0BD0 beq .L758 + 11870 .L745: +5236:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11871 .loc 1 5236 11 is_stmt 1 view .LVU4177 + 11872 00b0 2368 ldr r3, [r4] + 11873 00b2 1022 movs r2, #16 + 11874 00b4 DA61 str r2, [r3, #28] + 11875 00b6 28E0 b .L744 + 11876 .L757: +5214:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Same action must be done for (tmpoptions == I2C_LAST_FRAME) which removed for + 11877 .loc 1 5214 51 is_stmt 0 discriminator 1 view .LVU4178 + 11878 00b8 B7F1007F cmp r7, #33554432 + 11879 00bc F3D1 bne .L743 +5219:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11880 .loc 1 5219 11 is_stmt 1 view .LVU4179 + 11881 00be 2946 mov r1, r5 + 11882 00c0 2046 mov r0, r4 + 11883 00c2 FFF7FEFF bl I2C_ITListenCplt + 11884 .LVL822: + 11885 00c6 20E0 b .L744 + 11886 .L758: +5221:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 11887 .loc 1 5221 64 is_stmt 0 discriminator 1 view .LVU4180 + 11888 00c8 17F5803F cmn r7, #65536 + 11889 00cc F0D0 beq .L745 +5224:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11890 .loc 1 5224 11 is_stmt 1 view .LVU4181 + 11891 00ce 2368 ldr r3, [r4] + 11892 00d0 1022 movs r2, #16 + ARM GAS /tmp/ccE2rRGE.s page 398 + + + 11893 00d2 DA61 str r2, [r3, #28] +5227:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11894 .loc 1 5227 11 view .LVU4182 + 11895 00d4 2046 mov r0, r4 + 11896 00d6 FFF7FEFF bl I2C_Flush_TXDR + 11897 .LVL823: +5231:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11898 .loc 1 5231 11 view .LVU4183 + 11899 00da 2046 mov r0, r4 + 11900 00dc FFF7FEFF bl I2C_ITSlaveSeqCplt + 11901 .LVL824: + 11902 00e0 13E0 b .L744 + 11903 .LVL825: + 11904 .L750: +5255:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11905 .loc 1 5255 13 view .LVU4184 +5255:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11906 .loc 1 5255 33 is_stmt 0 view .LVU4185 + 11907 00e2 2123 movs r3, #33 + 11908 .LVL826: +5255:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11909 .loc 1 5255 33 view .LVU4186 + 11910 00e4 2363 str r3, [r4, #48] + 11911 .L747: +5267:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11912 .loc 1 5267 11 is_stmt 1 view .LVU4187 +5267:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11913 .loc 1 5267 33 is_stmt 0 view .LVU4188 + 11914 00e6 616C ldr r1, [r4, #68] +5267:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11915 .loc 1 5267 11 view .LVU4189 + 11916 00e8 2046 mov r0, r4 + 11917 00ea FFF7FEFF bl I2C_ITError + 11918 .LVL827: + 11919 00ee 0CE0 b .L744 + 11920 .LVL828: + 11921 .L748: +5259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11922 .loc 1 5259 13 is_stmt 1 view .LVU4190 +5259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11923 .loc 1 5259 33 is_stmt 0 view .LVU4191 + 11924 00f0 2223 movs r3, #34 + 11925 .LVL829: +5259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11926 .loc 1 5259 33 view .LVU4192 + 11927 00f2 2363 str r3, [r4, #48] + 11928 00f4 F7E7 b .L747 + 11929 .LVL830: + 11930 .L738: +5274:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11931 .loc 1 5274 7 is_stmt 1 view .LVU4193 + 11932 00f6 2368 ldr r3, [r4] + 11933 00f8 1022 movs r2, #16 + 11934 00fa DA61 str r2, [r3, #28] + 11935 00fc 05E0 b .L744 + 11936 .L737: +5277:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_ADDRI) != RESET)) + ARM GAS /tmp/ccE2rRGE.s page 399 + + + 11937 .loc 1 5277 8 view .LVU4194 +5277:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_ADDRI) != RESET)) + 11938 .loc 1 5277 11 is_stmt 0 view .LVU4195 + 11939 00fe 15F0080F tst r5, #8 + 11940 0102 02D0 beq .L744 +5277:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_ADDRI) != RESET)) + 11941 .loc 1 5277 62 discriminator 1 view .LVU4196 + 11942 0104 16F0080F tst r6, #8 + 11943 0108 03D1 bne .L759 + 11944 .LVL831: + 11945 .L744: +5285:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11946 .loc 1 5285 3 is_stmt 1 view .LVU4197 +5288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11947 .loc 1 5288 3 view .LVU4198 +5288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11948 .loc 1 5288 3 view .LVU4199 + 11949 010a 0020 movs r0, #0 + 11950 010c 84F84000 strb r0, [r4, #64] +5288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11951 .loc 1 5288 3 view .LVU4200 +5290:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11952 .loc 1 5290 3 view .LVU4201 + 11953 .LVL832: + 11954 .L735: +5291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11955 .loc 1 5291 1 is_stmt 0 view .LVU4202 + 11956 0110 F8BD pop {r3, r4, r5, r6, r7, pc} + 11957 .LVL833: + 11958 .L759: +5280:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 11959 .loc 1 5280 5 is_stmt 1 view .LVU4203 + 11960 0112 2946 mov r1, r5 + 11961 0114 2046 mov r0, r4 + 11962 0116 FFF7FEFF bl I2C_ITAddrCplt + 11963 .LVL834: + 11964 011a F6E7 b .L744 + 11965 .LVL835: + 11966 .L751: +5168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11967 .loc 1 5168 3 is_stmt 0 view .LVU4204 + 11968 011c 0220 movs r0, #2 + 11969 .LVL836: +5168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11970 .loc 1 5168 3 view .LVU4205 + 11971 011e F7E7 b .L735 + 11972 .cfi_endproc + 11973 .LFE182: + 11975 .section .text.I2C_Master_ISR_DMA,"ax",%progbits + 11976 .align 1 + 11977 .syntax unified + 11978 .thumb + 11979 .thumb_func + 11981 I2C_Master_ISR_DMA: + 11982 .LVL837: + 11983 .LFB181: +5022:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint16_t devaddress; + ARM GAS /tmp/ccE2rRGE.s page 400 + + + 11984 .loc 1 5022 1 is_stmt 1 view -0 + 11985 .cfi_startproc + 11986 @ args = 0, pretend = 0, frame = 0 + 11987 @ frame_needed = 0, uses_anonymous_args = 0 +5023:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t xfermode; + 11988 .loc 1 5023 3 view .LVU4207 +5024:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11989 .loc 1 5024 3 view .LVU4208 +5027:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11990 .loc 1 5027 3 view .LVU4209 +5027:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 11991 .loc 1 5027 3 view .LVU4210 + 11992 0000 90F84030 ldrb r3, [r0, #64] @ zero_extendqisi2 + 11993 0004 012B cmp r3, #1 + 11994 0006 00F09A80 beq .L773 +5022:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint16_t devaddress; + 11995 .loc 1 5022 1 is_stmt 0 discriminator 2 view .LVU4211 + 11996 000a 10B5 push {r4, lr} + 11997 .cfi_def_cfa_offset 8 + 11998 .cfi_offset 4, -8 + 11999 .cfi_offset 14, -4 + 12000 000c 82B0 sub sp, sp, #8 + 12001 .cfi_def_cfa_offset 16 + 12002 000e 0446 mov r4, r0 +5027:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12003 .loc 1 5027 3 is_stmt 1 discriminator 2 view .LVU4212 + 12004 0010 0123 movs r3, #1 + 12005 0012 80F84030 strb r3, [r0, #64] +5027:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12006 .loc 1 5027 3 discriminator 2 view .LVU4213 +5029:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET)) + 12007 .loc 1 5029 3 discriminator 2 view .LVU4214 +5029:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET)) + 12008 .loc 1 5029 6 is_stmt 0 discriminator 2 view .LVU4215 + 12009 0016 11F0100F tst r1, #16 + 12010 001a 02D0 beq .L762 +5029:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET)) + 12011 .loc 1 5029 55 discriminator 1 view .LVU4216 + 12012 001c 12F0100F tst r2, #16 + 12013 0020 32D1 bne .L779 + 12014 .L762: +5046:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TCI) != RESET)) + 12015 .loc 1 5046 8 is_stmt 1 view .LVU4217 +5046:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TCI) != RESET)) + 12016 .loc 1 5046 11 is_stmt 0 view .LVU4218 + 12017 0022 11F0800F tst r1, #128 + 12018 0026 60D0 beq .L764 +5046:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TCI) != RESET)) + 12019 .loc 1 5046 61 discriminator 1 view .LVU4219 + 12020 0028 12F0400F tst r2, #64 + 12021 002c 5DD0 beq .L764 +5050:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12022 .loc 1 5050 5 is_stmt 1 view .LVU4220 + 12023 002e 2268 ldr r2, [r4] + 12024 .LVL838: +5050:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12025 .loc 1 5050 5 is_stmt 0 view .LVU4221 + ARM GAS /tmp/ccE2rRGE.s page 401 + + + 12026 0030 1368 ldr r3, [r2] + 12027 0032 23F04003 bic r3, r3, #64 + 12028 0036 1360 str r3, [r2] +5052:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 12029 .loc 1 5052 5 is_stmt 1 view .LVU4222 +5052:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 12030 .loc 1 5052 13 is_stmt 0 view .LVU4223 + 12031 0038 638D ldrh r3, [r4, #42] + 12032 003a 9BB2 uxth r3, r3 +5052:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 12033 .loc 1 5052 8 view .LVU4224 + 12034 003c 002B cmp r3, #0 + 12035 003e 46D0 beq .L765 +5055:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12036 .loc 1 5055 7 is_stmt 1 view .LVU4225 +5055:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12037 .loc 1 5055 35 is_stmt 0 view .LVU4226 + 12038 0040 2368 ldr r3, [r4] +5055:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12039 .loc 1 5055 45 view .LVU4227 + 12040 0042 5968 ldr r1, [r3, #4] + 12041 .LVL839: +5055:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12042 .loc 1 5055 18 view .LVU4228 + 12043 0044 C1F30901 ubfx r1, r1, #0, #10 + 12044 .LVL840: +5058:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 12045 .loc 1 5058 7 is_stmt 1 view .LVU4229 +5058:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 12046 .loc 1 5058 15 is_stmt 0 view .LVU4230 + 12047 0048 638D ldrh r3, [r4, #42] + 12048 004a 9BB2 uxth r3, r3 +5058:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 12049 .loc 1 5058 10 view .LVU4231 + 12050 004c FF2B cmp r3, #255 + 12051 004e 2DD9 bls .L766 +5060:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_RELOAD_MODE; + 12052 .loc 1 5060 9 is_stmt 1 view .LVU4232 +5060:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** xfermode = I2C_RELOAD_MODE; + 12053 .loc 1 5060 24 is_stmt 0 view .LVU4233 + 12054 0050 FF23 movs r3, #255 + 12055 0052 2385 strh r3, [r4, #40] @ movhi +5061:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12056 .loc 1 5061 9 is_stmt 1 view .LVU4234 + 12057 .LVL841: +5061:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12058 .loc 1 5061 18 is_stmt 0 view .LVU4235 + 12059 0054 4FF08073 mov r3, #16777216 + 12060 .LVL842: + 12061 .L767: +5077:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12062 .loc 1 5077 7 is_stmt 1 view .LVU4236 + 12063 0058 0022 movs r2, #0 + 12064 005a 0092 str r2, [sp] + 12065 005c 94F82820 ldrb r2, [r4, #40] @ zero_extendqisi2 + 12066 0060 2046 mov r0, r4 + 12067 .LVL843: + ARM GAS /tmp/ccE2rRGE.s page 402 + + +5077:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12068 .loc 1 5077 7 is_stmt 0 view .LVU4237 + 12069 0062 FFF7FEFF bl I2C_TransferConfig + 12070 .LVL844: +5080:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12071 .loc 1 5080 7 is_stmt 1 view .LVU4238 +5080:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12072 .loc 1 5080 11 is_stmt 0 view .LVU4239 + 12073 0066 638D ldrh r3, [r4, #42] + 12074 0068 9BB2 uxth r3, r3 +5080:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12075 .loc 1 5080 30 view .LVU4240 + 12076 006a 228D ldrh r2, [r4, #40] +5080:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12077 .loc 1 5080 23 view .LVU4241 + 12078 006c 9B1A subs r3, r3, r2 + 12079 006e 9BB2 uxth r3, r3 + 12080 0070 6385 strh r3, [r4, #42] @ movhi +5083:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 12081 .loc 1 5083 7 is_stmt 1 view .LVU4242 +5083:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 12082 .loc 1 5083 15 is_stmt 0 view .LVU4243 + 12083 0072 94F84130 ldrb r3, [r4, #65] @ zero_extendqisi2 + 12084 0076 DBB2 uxtb r3, r3 +5083:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 12085 .loc 1 5083 10 view .LVU4244 + 12086 0078 222B cmp r3, #34 + 12087 007a 22D0 beq .L780 +5089:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12088 .loc 1 5089 9 is_stmt 1 view .LVU4245 +5089:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12089 .loc 1 5089 13 is_stmt 0 view .LVU4246 + 12090 007c 2268 ldr r2, [r4] +5089:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12091 .loc 1 5089 23 view .LVU4247 + 12092 007e 1368 ldr r3, [r2] +5089:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12093 .loc 1 5089 29 view .LVU4248 + 12094 0080 43F48043 orr r3, r3, #16384 + 12095 0084 1360 str r3, [r2] + 12096 0086 0CE0 b .L763 + 12097 .LVL845: + 12098 .L779: +5033:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12099 .loc 1 5033 5 is_stmt 1 view .LVU4249 + 12100 0088 0368 ldr r3, [r0] + 12101 008a 1022 movs r2, #16 + 12102 .LVL846: +5033:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12103 .loc 1 5033 5 is_stmt 0 view .LVU4250 + 12104 008c DA61 str r2, [r3, #28] +5036:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12105 .loc 1 5036 5 is_stmt 1 view .LVU4251 +5036:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12106 .loc 1 5036 9 is_stmt 0 view .LVU4252 + 12107 008e 436C ldr r3, [r0, #68] +5036:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + ARM GAS /tmp/ccE2rRGE.s page 403 + + + 12108 .loc 1 5036 21 view .LVU4253 + 12109 0090 43F00403 orr r3, r3, #4 + 12110 0094 4364 str r3, [r0, #68] +5041:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12111 .loc 1 5041 5 is_stmt 1 view .LVU4254 + 12112 0096 2021 movs r1, #32 + 12113 .LVL847: +5041:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12114 .loc 1 5041 5 is_stmt 0 view .LVU4255 + 12115 0098 FFF7FEFF bl I2C_Enable_IRQ + 12116 .LVL848: +5044:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12117 .loc 1 5044 5 is_stmt 1 view .LVU4256 + 12118 009c 2046 mov r0, r4 + 12119 009e FFF7FEFF bl I2C_Flush_TXDR + 12120 .LVL849: + 12121 .L763: +5144:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12122 .loc 1 5144 3 view .LVU4257 +5147:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12123 .loc 1 5147 3 view .LVU4258 +5147:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12124 .loc 1 5147 3 view .LVU4259 + 12125 00a2 0020 movs r0, #0 + 12126 00a4 84F84000 strb r0, [r4, #64] +5147:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12127 .loc 1 5147 3 view .LVU4260 +5149:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12128 .loc 1 5149 3 view .LVU4261 +5150:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12129 .loc 1 5150 1 is_stmt 0 view .LVU4262 + 12130 00a8 02B0 add sp, sp, #8 + 12131 .cfi_remember_state + 12132 .cfi_def_cfa_offset 8 + 12133 @ sp needed + 12134 00aa 10BD pop {r4, pc} + 12135 .LVL850: + 12136 .L766: + 12137 .cfi_restore_state +5065:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferOptions != I2C_NO_OPTION_FRAME) + 12138 .loc 1 5065 9 is_stmt 1 view .LVU4263 +5065:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferOptions != I2C_NO_OPTION_FRAME) + 12139 .loc 1 5065 30 is_stmt 0 view .LVU4264 + 12140 00ac 638D ldrh r3, [r4, #42] +5065:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** if (hi2c->XferOptions != I2C_NO_OPTION_FRAME) + 12141 .loc 1 5065 24 view .LVU4265 + 12142 00ae 2385 strh r3, [r4, #40] @ movhi +5066:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 12143 .loc 1 5066 9 is_stmt 1 view .LVU4266 +5066:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 12144 .loc 1 5066 17 is_stmt 0 view .LVU4267 + 12145 00b0 E36A ldr r3, [r4, #44] +5066:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 12146 .loc 1 5066 12 view .LVU4268 + 12147 00b2 13F5803F cmn r3, #65536 + 12148 00b6 01D0 beq .L774 +5068:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + ARM GAS /tmp/ccE2rRGE.s page 404 + + + 12149 .loc 1 5068 11 is_stmt 1 view .LVU4269 +5068:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12150 .loc 1 5068 20 is_stmt 0 view .LVU4270 + 12151 00b8 E36A ldr r3, [r4, #44] + 12152 .LVL851: +5068:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12153 .loc 1 5068 20 view .LVU4271 + 12154 00ba CDE7 b .L767 + 12155 .LVL852: + 12156 .L774: +5072:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12157 .loc 1 5072 20 view .LVU4272 + 12158 00bc 4FF00073 mov r3, #33554432 + 12159 00c0 CAE7 b .L767 + 12160 .LVL853: + 12161 .L780: +5085:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12162 .loc 1 5085 9 is_stmt 1 view .LVU4273 +5085:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12163 .loc 1 5085 13 is_stmt 0 view .LVU4274 + 12164 00c2 2268 ldr r2, [r4] +5085:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12165 .loc 1 5085 23 view .LVU4275 + 12166 00c4 1368 ldr r3, [r2] +5085:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12167 .loc 1 5085 29 view .LVU4276 + 12168 00c6 43F40043 orr r3, r3, #32768 + 12169 00ca 1360 str r3, [r2] + 12170 00cc E9E7 b .L763 + 12171 .LVL854: + 12172 .L765: +5095:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 12173 .loc 1 5095 7 is_stmt 1 view .LVU4277 +5095:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 12174 .loc 1 5095 11 is_stmt 0 view .LVU4278 + 12175 00ce 2368 ldr r3, [r4] + 12176 00d0 5B68 ldr r3, [r3, #4] +5095:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 12177 .loc 1 5095 10 view .LVU4279 + 12178 00d2 13F0007F tst r3, #33554432 + 12179 00d6 03D1 bne .L769 +5098:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12180 .loc 1 5098 9 is_stmt 1 view .LVU4280 + 12181 00d8 2046 mov r0, r4 + 12182 .LVL855: +5098:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12183 .loc 1 5098 9 is_stmt 0 view .LVU4281 + 12184 00da FFF7FEFF bl I2C_ITMasterSeqCplt + 12185 .LVL856: +5098:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12186 .loc 1 5098 9 view .LVU4282 + 12187 00de E0E7 b .L763 + 12188 .LVL857: + 12189 .L769: +5104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12190 .loc 1 5104 9 is_stmt 1 view .LVU4283 + 12191 00e0 4021 movs r1, #64 + ARM GAS /tmp/ccE2rRGE.s page 405 + + + 12192 .LVL858: +5104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12193 .loc 1 5104 9 is_stmt 0 view .LVU4284 + 12194 00e2 2046 mov r0, r4 + 12195 .LVL859: +5104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12196 .loc 1 5104 9 view .LVU4285 + 12197 00e4 FFF7FEFF bl I2C_ITError + 12198 .LVL860: + 12199 00e8 DBE7 b .L763 + 12200 .LVL861: + 12201 .L764: +5108:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TCI) != RESET)) + 12202 .loc 1 5108 8 is_stmt 1 view .LVU4286 +5108:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TCI) != RESET)) + 12203 .loc 1 5108 11 is_stmt 0 view .LVU4287 + 12204 00ea 11F0400F tst r1, #64 + 12205 00ee 1CD0 beq .L770 +5108:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_TCI) != RESET)) + 12206 .loc 1 5108 60 discriminator 1 view .LVU4288 + 12207 00f0 12F0400F tst r2, #64 + 12208 00f4 19D0 beq .L770 +5111:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 12209 .loc 1 5111 5 is_stmt 1 view .LVU4289 +5111:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 12210 .loc 1 5111 13 is_stmt 0 view .LVU4290 + 12211 00f6 638D ldrh r3, [r4, #42] + 12212 00f8 9BB2 uxth r3, r3 +5111:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 12213 .loc 1 5111 8 view .LVU4291 + 12214 00fa 8BB9 cbnz r3, .L771 +5113:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 12215 .loc 1 5113 7 is_stmt 1 view .LVU4292 +5113:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 12216 .loc 1 5113 11 is_stmt 0 view .LVU4293 + 12217 00fc 2368 ldr r3, [r4] + 12218 00fe 5A68 ldr r2, [r3, #4] + 12219 .LVL862: +5113:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 12220 .loc 1 5113 10 view .LVU4294 + 12221 0100 12F0007F tst r2, #33554432 + 12222 0104 CDD1 bne .L763 +5116:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 12223 .loc 1 5116 9 is_stmt 1 view .LVU4295 +5116:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 12224 .loc 1 5116 17 is_stmt 0 view .LVU4296 + 12225 0106 E26A ldr r2, [r4, #44] +5116:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 12226 .loc 1 5116 12 view .LVU4297 + 12227 0108 12F5803F cmn r2, #65536 + 12228 010c 04D1 bne .L772 +5119:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12229 .loc 1 5119 11 is_stmt 1 view .LVU4298 +5119:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12230 .loc 1 5119 25 is_stmt 0 view .LVU4299 + 12231 010e 5A68 ldr r2, [r3, #4] +5119:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + ARM GAS /tmp/ccE2rRGE.s page 406 + + + 12232 .loc 1 5119 31 view .LVU4300 + 12233 0110 42F48042 orr r2, r2, #16384 + 12234 0114 5A60 str r2, [r3, #4] + 12235 0116 C4E7 b .L763 + 12236 .L772: +5124:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12237 .loc 1 5124 11 is_stmt 1 view .LVU4301 + 12238 0118 2046 mov r0, r4 + 12239 .LVL863: +5124:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12240 .loc 1 5124 11 is_stmt 0 view .LVU4302 + 12241 011a FFF7FEFF bl I2C_ITMasterSeqCplt + 12242 .LVL864: +5124:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12243 .loc 1 5124 11 view .LVU4303 + 12244 011e C0E7 b .L763 + 12245 .LVL865: + 12246 .L771: +5132:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12247 .loc 1 5132 7 is_stmt 1 view .LVU4304 + 12248 0120 4021 movs r1, #64 + 12249 .LVL866: +5132:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12250 .loc 1 5132 7 is_stmt 0 view .LVU4305 + 12251 0122 2046 mov r0, r4 + 12252 .LVL867: +5132:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12253 .loc 1 5132 7 view .LVU4306 + 12254 0124 FFF7FEFF bl I2C_ITError + 12255 .LVL868: +5132:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12256 .loc 1 5132 7 view .LVU4307 + 12257 0128 BBE7 b .L763 + 12258 .LVL869: + 12259 .L770: +5135:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) + 12260 .loc 1 5135 8 is_stmt 1 view .LVU4308 +5135:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) + 12261 .loc 1 5135 11 is_stmt 0 view .LVU4309 + 12262 012a 11F0200F tst r1, #32 + 12263 012e B8D0 beq .L763 +5135:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) + 12264 .loc 1 5135 63 discriminator 1 view .LVU4310 + 12265 0130 12F0200F tst r2, #32 + 12266 0134 B5D0 beq .L763 +5139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12267 .loc 1 5139 5 is_stmt 1 view .LVU4311 + 12268 0136 2046 mov r0, r4 + 12269 .LVL870: +5139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12270 .loc 1 5139 5 is_stmt 0 view .LVU4312 + 12271 0138 FFF7FEFF bl I2C_ITMasterCplt + 12272 .LVL871: +5139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12273 .loc 1 5139 5 view .LVU4313 + 12274 013c B1E7 b .L763 + 12275 .LVL872: + ARM GAS /tmp/ccE2rRGE.s page 407 + + + 12276 .L773: + 12277 .cfi_def_cfa_offset 0 + 12278 .cfi_restore 4 + 12279 .cfi_restore 14 +5027:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12280 .loc 1 5027 3 view .LVU4314 + 12281 013e 0220 movs r0, #2 + 12282 .LVL873: +5150:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12283 .loc 1 5150 1 view .LVU4315 + 12284 0140 7047 bx lr + 12285 .cfi_endproc + 12286 .LFE181: + 12288 .section .text.I2C_DMAError,"ax",%progbits + 12289 .align 1 + 12290 .syntax unified + 12291 .thumb + 12292 .thumb_func + 12294 I2C_DMAError: + 12295 .LVL874: + 12296 .LFB198: +6312:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Derogation MISRAC2012-Rule-11.5 */ + 12297 .loc 1 6312 1 is_stmt 1 view -0 + 12298 .cfi_startproc + 12299 @ args = 0, pretend = 0, frame = 0 + 12300 @ frame_needed = 0, uses_anonymous_args = 0 +6312:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Derogation MISRAC2012-Rule-11.5 */ + 12301 .loc 1 6312 1 is_stmt 0 view .LVU4317 + 12302 0000 08B5 push {r3, lr} + 12303 .cfi_def_cfa_offset 8 + 12304 .cfi_offset 3, -8 + 12305 .cfi_offset 14, -4 +6314:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12306 .loc 1 6314 3 is_stmt 1 view .LVU4318 +6314:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12307 .loc 1 6314 22 is_stmt 0 view .LVU4319 + 12308 0002 406A ldr r0, [r0, #36] + 12309 .LVL875: +6317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12310 .loc 1 6317 3 is_stmt 1 view .LVU4320 +6317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12311 .loc 1 6317 7 is_stmt 0 view .LVU4321 + 12312 0004 0268 ldr r2, [r0] +6317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12313 .loc 1 6317 17 view .LVU4322 + 12314 0006 5368 ldr r3, [r2, #4] +6317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12315 .loc 1 6317 23 view .LVU4323 + 12316 0008 43F40043 orr r3, r3, #32768 + 12317 000c 5360 str r3, [r2, #4] +6320:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12318 .loc 1 6320 3 is_stmt 1 view .LVU4324 + 12319 000e 1021 movs r1, #16 + 12320 0010 FFF7FEFF bl I2C_ITError + 12321 .LVL876: +6321:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12322 .loc 1 6321 1 is_stmt 0 view .LVU4325 + ARM GAS /tmp/ccE2rRGE.s page 408 + + + 12323 0014 08BD pop {r3, pc} + 12324 .cfi_endproc + 12325 .LFE198: + 12327 .section .text.I2C_DMAMasterTransmitCplt,"ax",%progbits + 12328 .align 1 + 12329 .syntax unified + 12330 .thumb + 12331 .thumb_func + 12333 I2C_DMAMasterTransmitCplt: + 12334 .LVL877: + 12335 .LFB194: +6156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Derogation MISRAC2012-Rule-11.5 */ + 12336 .loc 1 6156 1 is_stmt 1 view -0 + 12337 .cfi_startproc + 12338 @ args = 0, pretend = 0, frame = 0 + 12339 @ frame_needed = 0, uses_anonymous_args = 0 +6156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Derogation MISRAC2012-Rule-11.5 */ + 12340 .loc 1 6156 1 is_stmt 0 view .LVU4327 + 12341 0000 10B5 push {r4, lr} + 12342 .cfi_def_cfa_offset 8 + 12343 .cfi_offset 4, -8 + 12344 .cfi_offset 14, -4 +6158:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12345 .loc 1 6158 3 is_stmt 1 view .LVU4328 +6158:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12346 .loc 1 6158 22 is_stmt 0 view .LVU4329 + 12347 0002 446A ldr r4, [r0, #36] + 12348 .LVL878: +6161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12349 .loc 1 6161 3 is_stmt 1 view .LVU4330 +6161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12350 .loc 1 6161 7 is_stmt 0 view .LVU4331 + 12351 0004 2268 ldr r2, [r4] +6161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12352 .loc 1 6161 17 view .LVU4332 + 12353 0006 1368 ldr r3, [r2] +6161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12354 .loc 1 6161 23 view .LVU4333 + 12355 0008 23F48043 bic r3, r3, #16384 + 12356 000c 1360 str r3, [r2] +6164:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 12357 .loc 1 6164 3 is_stmt 1 view .LVU4334 +6164:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 12358 .loc 1 6164 11 is_stmt 0 view .LVU4335 + 12359 000e 638D ldrh r3, [r4, #42] + 12360 0010 9BB2 uxth r3, r3 +6164:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 12361 .loc 1 6164 6 view .LVU4336 + 12362 0012 ABB1 cbz r3, .L790 +6173:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12363 .loc 1 6173 5 is_stmt 1 view .LVU4337 +6173:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12364 .loc 1 6173 9 is_stmt 0 view .LVU4338 + 12365 0014 616A ldr r1, [r4, #36] +6173:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12366 .loc 1 6173 27 view .LVU4339 + 12367 0016 238D ldrh r3, [r4, #40] + ARM GAS /tmp/ccE2rRGE.s page 409 + + +6173:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12368 .loc 1 6173 20 view .LVU4340 + 12369 0018 1944 add r1, r1, r3 + 12370 001a 6162 str r1, [r4, #36] +6176:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 12371 .loc 1 6176 5 is_stmt 1 view .LVU4341 +6176:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 12372 .loc 1 6176 13 is_stmt 0 view .LVU4342 + 12373 001c 638D ldrh r3, [r4, #42] + 12374 001e 9BB2 uxth r3, r3 +6176:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 12375 .loc 1 6176 8 view .LVU4343 + 12376 0020 FF2B cmp r3, #255 + 12377 0022 12D9 bls .L786 +6178:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12378 .loc 1 6178 7 is_stmt 1 view .LVU4344 +6178:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12379 .loc 1 6178 22 is_stmt 0 view .LVU4345 + 12380 0024 FF23 movs r3, #255 + 12381 0026 2385 strh r3, [r4, #40] @ movhi + 12382 .L787: +6186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize) != HAL_OK) + 12383 .loc 1 6186 5 is_stmt 1 view .LVU4346 +6186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize) != HAL_OK) + 12384 .loc 1 6186 81 is_stmt 0 view .LVU4347 + 12385 0028 2268 ldr r2, [r4] +6186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize) != HAL_OK) + 12386 .loc 1 6186 9 view .LVU4348 + 12387 002a 238D ldrh r3, [r4, #40] + 12388 002c 2832 adds r2, r2, #40 + 12389 002e A06B ldr r0, [r4, #56] + 12390 .LVL879: +6186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize) != HAL_OK) + 12391 .loc 1 6186 9 view .LVU4349 + 12392 0030 FFF7FEFF bl HAL_DMA_Start_IT + 12393 .LVL880: +6186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize) != HAL_OK) + 12394 .loc 1 6186 8 view .LVU4350 + 12395 0034 60B1 cbz r0, .L788 +6190:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12396 .loc 1 6190 7 is_stmt 1 view .LVU4351 + 12397 0036 1021 movs r1, #16 + 12398 0038 2046 mov r0, r4 + 12399 003a FFF7FEFF bl I2C_ITError + 12400 .LVL881: + 12401 .L783: +6198:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12402 .loc 1 6198 1 is_stmt 0 view .LVU4352 + 12403 003e 10BD pop {r4, pc} + 12404 .LVL882: + 12405 .L790: +6167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12406 .loc 1 6167 5 is_stmt 1 view .LVU4353 + 12407 0040 2021 movs r1, #32 + 12408 0042 2046 mov r0, r4 + 12409 .LVL883: +6167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + ARM GAS /tmp/ccE2rRGE.s page 410 + + + 12410 .loc 1 6167 5 is_stmt 0 view .LVU4354 + 12411 0044 FFF7FEFF bl I2C_Enable_IRQ + 12412 .LVL884: + 12413 0048 F9E7 b .L783 + 12414 .LVL885: + 12415 .L786: +6182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12416 .loc 1 6182 7 is_stmt 1 view .LVU4355 +6182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12417 .loc 1 6182 28 is_stmt 0 view .LVU4356 + 12418 004a 638D ldrh r3, [r4, #42] +6182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12419 .loc 1 6182 22 view .LVU4357 + 12420 004c 2385 strh r3, [r4, #40] @ movhi + 12421 004e EBE7 b .L787 + 12422 .LVL886: + 12423 .L788: +6195:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12424 .loc 1 6195 7 is_stmt 1 view .LVU4358 + 12425 0050 4021 movs r1, #64 + 12426 0052 2046 mov r0, r4 + 12427 0054 FFF7FEFF bl I2C_Enable_IRQ + 12428 .LVL887: +6198:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12429 .loc 1 6198 1 is_stmt 0 view .LVU4359 + 12430 0058 F1E7 b .L783 + 12431 .cfi_endproc + 12432 .LFE194: + 12434 .section .text.I2C_DMAMasterReceiveCplt,"ax",%progbits + 12435 .align 1 + 12436 .syntax unified + 12437 .thumb + 12438 .thumb_func + 12440 I2C_DMAMasterReceiveCplt: + 12441 .LVL888: + 12442 .LFB196: +6234:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Derogation MISRAC2012-Rule-11.5 */ + 12443 .loc 1 6234 1 is_stmt 1 view -0 + 12444 .cfi_startproc + 12445 @ args = 0, pretend = 0, frame = 0 + 12446 @ frame_needed = 0, uses_anonymous_args = 0 +6234:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Derogation MISRAC2012-Rule-11.5 */ + 12447 .loc 1 6234 1 is_stmt 0 view .LVU4361 + 12448 0000 10B5 push {r4, lr} + 12449 .cfi_def_cfa_offset 8 + 12450 .cfi_offset 4, -8 + 12451 .cfi_offset 14, -4 +6236:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12452 .loc 1 6236 3 is_stmt 1 view .LVU4362 +6236:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12453 .loc 1 6236 22 is_stmt 0 view .LVU4363 + 12454 0002 446A ldr r4, [r0, #36] + 12455 .LVL889: +6239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12456 .loc 1 6239 3 is_stmt 1 view .LVU4364 +6239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12457 .loc 1 6239 7 is_stmt 0 view .LVU4365 + ARM GAS /tmp/ccE2rRGE.s page 411 + + + 12458 0004 2268 ldr r2, [r4] +6239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12459 .loc 1 6239 17 view .LVU4366 + 12460 0006 1368 ldr r3, [r2] +6239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12461 .loc 1 6239 23 view .LVU4367 + 12462 0008 23F40043 bic r3, r3, #32768 + 12463 000c 1360 str r3, [r2] +6242:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 12464 .loc 1 6242 3 is_stmt 1 view .LVU4368 +6242:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 12465 .loc 1 6242 11 is_stmt 0 view .LVU4369 + 12466 000e 638D ldrh r3, [r4, #42] + 12467 0010 9BB2 uxth r3, r3 +6242:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 12468 .loc 1 6242 6 view .LVU4370 + 12469 0012 ABB1 cbz r3, .L798 +6251:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12470 .loc 1 6251 5 is_stmt 1 view .LVU4371 +6251:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12471 .loc 1 6251 9 is_stmt 0 view .LVU4372 + 12472 0014 626A ldr r2, [r4, #36] +6251:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12473 .loc 1 6251 27 view .LVU4373 + 12474 0016 238D ldrh r3, [r4, #40] +6251:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12475 .loc 1 6251 20 view .LVU4374 + 12476 0018 1A44 add r2, r2, r3 + 12477 001a 6262 str r2, [r4, #36] +6254:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 12478 .loc 1 6254 5 is_stmt 1 view .LVU4375 +6254:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 12479 .loc 1 6254 13 is_stmt 0 view .LVU4376 + 12480 001c 638D ldrh r3, [r4, #42] + 12481 001e 9BB2 uxth r3, r3 +6254:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 12482 .loc 1 6254 8 view .LVU4377 + 12483 0020 FF2B cmp r3, #255 + 12484 0022 12D9 bls .L794 +6256:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12485 .loc 1 6256 7 is_stmt 1 view .LVU4378 +6256:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12486 .loc 1 6256 22 is_stmt 0 view .LVU4379 + 12487 0024 FF23 movs r3, #255 + 12488 0026 2385 strh r3, [r4, #40] @ movhi + 12489 .L795: +6264:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize) != HAL_OK) + 12490 .loc 1 6264 5 is_stmt 1 view .LVU4380 +6264:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize) != HAL_OK) + 12491 .loc 1 6264 55 is_stmt 0 view .LVU4381 + 12492 0028 2168 ldr r1, [r4] +6264:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize) != HAL_OK) + 12493 .loc 1 6264 9 view .LVU4382 + 12494 002a 238D ldrh r3, [r4, #40] + 12495 002c 2431 adds r1, r1, #36 + 12496 002e E06B ldr r0, [r4, #60] + 12497 .LVL890: + ARM GAS /tmp/ccE2rRGE.s page 412 + + +6264:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize) != HAL_OK) + 12498 .loc 1 6264 9 view .LVU4383 + 12499 0030 FFF7FEFF bl HAL_DMA_Start_IT + 12500 .LVL891: +6264:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** hi2c->XferSize) != HAL_OK) + 12501 .loc 1 6264 8 view .LVU4384 + 12502 0034 60B1 cbz r0, .L796 +6268:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12503 .loc 1 6268 7 is_stmt 1 view .LVU4385 + 12504 0036 1021 movs r1, #16 + 12505 0038 2046 mov r0, r4 + 12506 003a FFF7FEFF bl I2C_ITError + 12507 .LVL892: + 12508 .L791: +6276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12509 .loc 1 6276 1 is_stmt 0 view .LVU4386 + 12510 003e 10BD pop {r4, pc} + 12511 .LVL893: + 12512 .L798: +6245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12513 .loc 1 6245 5 is_stmt 1 view .LVU4387 + 12514 0040 2021 movs r1, #32 + 12515 0042 2046 mov r0, r4 + 12516 .LVL894: +6245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12517 .loc 1 6245 5 is_stmt 0 view .LVU4388 + 12518 0044 FFF7FEFF bl I2C_Enable_IRQ + 12519 .LVL895: + 12520 0048 F9E7 b .L791 + 12521 .LVL896: + 12522 .L794: +6260:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12523 .loc 1 6260 7 is_stmt 1 view .LVU4389 +6260:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12524 .loc 1 6260 28 is_stmt 0 view .LVU4390 + 12525 004a 638D ldrh r3, [r4, #42] +6260:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12526 .loc 1 6260 22 view .LVU4391 + 12527 004c 2385 strh r3, [r4, #40] @ movhi + 12528 004e EBE7 b .L795 + 12529 .LVL897: + 12530 .L796: +6273:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12531 .loc 1 6273 7 is_stmt 1 view .LVU4392 + 12532 0050 4021 movs r1, #64 + 12533 0052 2046 mov r0, r4 + 12534 0054 FFF7FEFF bl I2C_Enable_IRQ + 12535 .LVL898: +6276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12536 .loc 1 6276 1 is_stmt 0 view .LVU4393 + 12537 0058 F1E7 b .L791 + 12538 .cfi_endproc + 12539 .LFE196: + 12541 .section .text.HAL_I2C_ER_IRQHandler,"ax",%progbits + 12542 .align 1 + 12543 .global HAL_I2C_ER_IRQHandler + 12544 .syntax unified + ARM GAS /tmp/ccE2rRGE.s page 413 + + + 12545 .thumb + 12546 .thumb_func + 12548 HAL_I2C_ER_IRQHandler: + 12549 .LVL899: + 12550 .LFB165: +4452:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t itflags = READ_REG(hi2c->Instance->ISR); + 12551 .loc 1 4452 1 is_stmt 1 view -0 + 12552 .cfi_startproc + 12553 @ args = 0, pretend = 0, frame = 0 + 12554 @ frame_needed = 0, uses_anonymous_args = 0 +4452:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t itflags = READ_REG(hi2c->Instance->ISR); + 12555 .loc 1 4452 1 is_stmt 0 view .LVU4395 + 12556 0000 10B5 push {r4, lr} + 12557 .cfi_def_cfa_offset 8 + 12558 .cfi_offset 4, -8 + 12559 .cfi_offset 14, -4 +4453:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t itsources = READ_REG(hi2c->Instance->CR1); + 12560 .loc 1 4453 3 is_stmt 1 view .LVU4396 +4453:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t itsources = READ_REG(hi2c->Instance->CR1); + 12561 .loc 1 4453 24 is_stmt 0 view .LVU4397 + 12562 0002 0268 ldr r2, [r0] +4453:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t itsources = READ_REG(hi2c->Instance->CR1); + 12563 .loc 1 4453 12 view .LVU4398 + 12564 0004 9369 ldr r3, [r2, #24] + 12565 .LVL900: +4454:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tmperror; + 12566 .loc 1 4454 3 is_stmt 1 view .LVU4399 +4454:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** uint32_t tmperror; + 12567 .loc 1 4454 12 is_stmt 0 view .LVU4400 + 12568 0006 1168 ldr r1, [r2] + 12569 .LVL901: +4455:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12570 .loc 1 4455 3 is_stmt 1 view .LVU4401 +4458:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERRI) != RESET)) + 12571 .loc 1 4458 3 view .LVU4402 +4458:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERRI) != RESET)) + 12572 .loc 1 4458 6 is_stmt 0 view .LVU4403 + 12573 0008 13F4807F tst r3, #256 + 12574 000c 09D0 beq .L800 +4458:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERRI) != RESET)) + 12575 .loc 1 4458 57 discriminator 1 view .LVU4404 + 12576 000e 11F0800F tst r1, #128 + 12577 0012 06D0 beq .L800 +4461:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12578 .loc 1 4461 5 is_stmt 1 view .LVU4405 +4461:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12579 .loc 1 4461 9 is_stmt 0 view .LVU4406 + 12580 0014 446C ldr r4, [r0, #68] +4461:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12581 .loc 1 4461 21 view .LVU4407 + 12582 0016 44F00104 orr r4, r4, #1 + 12583 001a 4464 str r4, [r0, #68] +4464:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12584 .loc 1 4464 5 is_stmt 1 view .LVU4408 + 12585 001c 4FF48074 mov r4, #256 + 12586 0020 D461 str r4, [r2, #28] + 12587 .L800: + ARM GAS /tmp/ccE2rRGE.s page 414 + + +4468:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERRI) != RESET)) + 12588 .loc 1 4468 3 view .LVU4409 +4468:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERRI) != RESET)) + 12589 .loc 1 4468 6 is_stmt 0 view .LVU4410 + 12590 0022 13F4806F tst r3, #1024 + 12591 0026 0AD0 beq .L801 +4468:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERRI) != RESET)) + 12592 .loc 1 4468 56 discriminator 1 view .LVU4411 + 12593 0028 11F0800F tst r1, #128 + 12594 002c 07D0 beq .L801 +4471:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12595 .loc 1 4471 5 is_stmt 1 view .LVU4412 +4471:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12596 .loc 1 4471 9 is_stmt 0 view .LVU4413 + 12597 002e 426C ldr r2, [r0, #68] +4471:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12598 .loc 1 4471 21 view .LVU4414 + 12599 0030 42F00802 orr r2, r2, #8 + 12600 0034 4264 str r2, [r0, #68] +4474:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12601 .loc 1 4474 5 is_stmt 1 view .LVU4415 + 12602 0036 0268 ldr r2, [r0] + 12603 0038 4FF48064 mov r4, #1024 + 12604 003c D461 str r4, [r2, #28] + 12605 .L801: +4478:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERRI) != RESET)) + 12606 .loc 1 4478 3 view .LVU4416 +4478:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERRI) != RESET)) + 12607 .loc 1 4478 6 is_stmt 0 view .LVU4417 + 12608 003e 13F4007F tst r3, #512 + 12609 0042 0AD0 beq .L802 +4478:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** (I2C_CHECK_IT_SOURCE(itsources, I2C_IT_ERRI) != RESET)) + 12610 .loc 1 4478 57 discriminator 1 view .LVU4418 + 12611 0044 11F0800F tst r1, #128 + 12612 0048 07D0 beq .L802 +4481:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12613 .loc 1 4481 5 is_stmt 1 view .LVU4419 +4481:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12614 .loc 1 4481 9 is_stmt 0 view .LVU4420 + 12615 004a 436C ldr r3, [r0, #68] + 12616 .LVL902: +4481:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12617 .loc 1 4481 21 view .LVU4421 + 12618 004c 43F00203 orr r3, r3, #2 + 12619 0050 4364 str r3, [r0, #68] +4484:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12620 .loc 1 4484 5 is_stmt 1 view .LVU4422 + 12621 0052 0368 ldr r3, [r0] + 12622 0054 4FF40072 mov r2, #512 + 12623 0058 DA61 str r2, [r3, #28] + 12624 .L802: +4488:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12625 .loc 1 4488 3 view .LVU4423 +4488:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12626 .loc 1 4488 12 is_stmt 0 view .LVU4424 + 12627 005a 416C ldr r1, [r0, #68] + 12628 .LVL903: + ARM GAS /tmp/ccE2rRGE.s page 415 + + +4491:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 12629 .loc 1 4491 3 is_stmt 1 view .LVU4425 +4491:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 12630 .loc 1 4491 6 is_stmt 0 view .LVU4426 + 12631 005c 11F00B0F tst r1, #11 + 12632 0060 00D1 bne .L805 + 12633 .LVL904: + 12634 .L799: +4495:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12635 .loc 1 4495 1 view .LVU4427 + 12636 0062 10BD pop {r4, pc} + 12637 .LVL905: + 12638 .L805: +4493:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12639 .loc 1 4493 5 is_stmt 1 view .LVU4428 + 12640 0064 FFF7FEFF bl I2C_ITError + 12641 .LVL906: +4495:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12642 .loc 1 4495 1 is_stmt 0 view .LVU4429 + 12643 0068 FBE7 b .L799 + 12644 .cfi_endproc + 12645 .LFE165: + 12647 .section .text.I2C_DMAAbort,"ax",%progbits + 12648 .align 1 + 12649 .syntax unified + 12650 .thumb + 12651 .thumb_func + 12653 I2C_DMAAbort: + 12654 .LVL907: + 12655 .LFB199: +6330:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Derogation MISRAC2012-Rule-11.5 */ + 12656 .loc 1 6330 1 is_stmt 1 view -0 + 12657 .cfi_startproc + 12658 @ args = 0, pretend = 0, frame = 0 + 12659 @ frame_needed = 0, uses_anonymous_args = 0 +6330:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Derogation MISRAC2012-Rule-11.5 */ + 12660 .loc 1 6330 1 is_stmt 0 view .LVU4431 + 12661 0000 08B5 push {r3, lr} + 12662 .cfi_def_cfa_offset 8 + 12663 .cfi_offset 3, -8 + 12664 .cfi_offset 14, -4 +6332:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12665 .loc 1 6332 3 is_stmt 1 view .LVU4432 +6332:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12666 .loc 1 6332 22 is_stmt 0 view .LVU4433 + 12667 0002 406A ldr r0, [r0, #36] + 12668 .LVL908: +6335:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 12669 .loc 1 6335 3 is_stmt 1 view .LVU4434 +6335:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 12670 .loc 1 6335 11 is_stmt 0 view .LVU4435 + 12671 0004 836B ldr r3, [r0, #56] +6335:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 12672 .loc 1 6335 6 view .LVU4436 + 12673 0006 0BB1 cbz r3, .L807 +6337:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12674 .loc 1 6337 5 is_stmt 1 view .LVU4437 + ARM GAS /tmp/ccE2rRGE.s page 416 + + +6337:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12675 .loc 1 6337 37 is_stmt 0 view .LVU4438 + 12676 0008 0022 movs r2, #0 + 12677 000a 5A63 str r2, [r3, #52] + 12678 .L807: +6339:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 12679 .loc 1 6339 3 is_stmt 1 view .LVU4439 +6339:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 12680 .loc 1 6339 11 is_stmt 0 view .LVU4440 + 12681 000c C36B ldr r3, [r0, #60] +6339:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** { + 12682 .loc 1 6339 6 view .LVU4441 + 12683 000e 0BB1 cbz r3, .L808 +6341:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12684 .loc 1 6341 5 is_stmt 1 view .LVU4442 +6341:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12685 .loc 1 6341 37 is_stmt 0 view .LVU4443 + 12686 0010 0022 movs r2, #0 + 12687 0012 5A63 str r2, [r3, #52] + 12688 .L808: +6344:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12689 .loc 1 6344 3 is_stmt 1 view .LVU4444 + 12690 0014 FFF7FEFF bl I2C_TreatErrorCallback + 12691 .LVL909: +6345:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12692 .loc 1 6345 1 is_stmt 0 view .LVU4445 + 12693 0018 08BD pop {r3, pc} + 12694 .cfi_endproc + 12695 .LFE199: + 12697 .section .text.HAL_I2C_GetState,"ax",%progbits + 12698 .align 1 + 12699 .global HAL_I2C_GetState + 12700 .syntax unified + 12701 .thumb + 12702 .thumb_func + 12704 HAL_I2C_GetState: + 12705 .LVL910: + 12706 .LFB176: +4686:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** /* Return I2C handle state */ + 12707 .loc 1 4686 1 is_stmt 1 view -0 + 12708 .cfi_startproc + 12709 @ args = 0, pretend = 0, frame = 0 + 12710 @ frame_needed = 0, uses_anonymous_args = 0 + 12711 @ link register save eliminated. +4688:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12712 .loc 1 4688 3 view .LVU4447 +4688:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12713 .loc 1 4688 14 is_stmt 0 view .LVU4448 + 12714 0000 90F84100 ldrb r0, [r0, #65] @ zero_extendqisi2 + 12715 .LVL911: +4689:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12716 .loc 1 4689 1 view .LVU4449 + 12717 0004 7047 bx lr + 12718 .cfi_endproc + 12719 .LFE176: + 12721 .section .text.HAL_I2C_GetMode,"ax",%progbits + 12722 .align 1 + ARM GAS /tmp/ccE2rRGE.s page 417 + + + 12723 .global HAL_I2C_GetMode + 12724 .syntax unified + 12725 .thumb + 12726 .thumb_func + 12728 HAL_I2C_GetMode: + 12729 .LVL912: + 12730 .LFB177: +4698:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return hi2c->Mode; + 12731 .loc 1 4698 1 is_stmt 1 view -0 + 12732 .cfi_startproc + 12733 @ args = 0, pretend = 0, frame = 0 + 12734 @ frame_needed = 0, uses_anonymous_args = 0 + 12735 @ link register save eliminated. +4699:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12736 .loc 1 4699 3 view .LVU4451 +4699:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12737 .loc 1 4699 14 is_stmt 0 view .LVU4452 + 12738 0000 90F84200 ldrb r0, [r0, #66] @ zero_extendqisi2 + 12739 .LVL913: +4700:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12740 .loc 1 4700 1 view .LVU4453 + 12741 0004 7047 bx lr + 12742 .cfi_endproc + 12743 .LFE177: + 12745 .section .text.HAL_I2C_GetError,"ax",%progbits + 12746 .align 1 + 12747 .global HAL_I2C_GetError + 12748 .syntax unified + 12749 .thumb + 12750 .thumb_func + 12752 HAL_I2C_GetError: + 12753 .LVL914: + 12754 .LFB178: +4709:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** return hi2c->ErrorCode; + 12755 .loc 1 4709 1 is_stmt 1 view -0 + 12756 .cfi_startproc + 12757 @ args = 0, pretend = 0, frame = 0 + 12758 @ frame_needed = 0, uses_anonymous_args = 0 + 12759 @ link register save eliminated. +4710:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12760 .loc 1 4710 3 view .LVU4455 +4710:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** } + 12761 .loc 1 4710 14 is_stmt 0 view .LVU4456 + 12762 0000 406C ldr r0, [r0, #68] + 12763 .LVL915: +4711:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c.c **** + 12764 .loc 1 4711 1 view .LVU4457 + 12765 0002 7047 bx lr + 12766 .cfi_endproc + 12767 .LFE178: + 12769 .text + 12770 .Letext0: + 12771 .file 2 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 12772 .file 3 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 12773 .file 4 "Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h" + 12774 .file 5 "Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h" + 12775 .file 6 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h" + ARM GAS /tmp/ccE2rRGE.s page 418 + + + 12776 .file 7 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h" + 12777 .file 8 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h" + 12778 .file 9 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h" + ARM GAS /tmp/ccE2rRGE.s page 419 + + +DEFINED SYMBOLS + *ABS*:0000000000000000 stm32f3xx_hal_i2c.c + /tmp/ccE2rRGE.s:21 .text.I2C_Flush_TXDR:0000000000000000 $t + /tmp/ccE2rRGE.s:26 .text.I2C_Flush_TXDR:0000000000000000 I2C_Flush_TXDR + /tmp/ccE2rRGE.s:64 .text.I2C_TransferConfig:0000000000000000 $t + /tmp/ccE2rRGE.s:69 .text.I2C_TransferConfig:0000000000000000 I2C_TransferConfig + /tmp/ccE2rRGE.s:118 .text.I2C_Enable_IRQ:0000000000000000 $t + /tmp/ccE2rRGE.s:123 .text.I2C_Enable_IRQ:0000000000000000 I2C_Enable_IRQ + /tmp/ccE2rRGE.s:246 .text.I2C_Enable_IRQ:000000000000006c $d + /tmp/ccE2rRGE.s:11981 .text.I2C_Master_ISR_DMA:0000000000000000 I2C_Master_ISR_DMA + /tmp/ccE2rRGE.s:11701 .text.I2C_Slave_ISR_DMA:0000000000000000 I2C_Slave_ISR_DMA + /tmp/ccE2rRGE.s:252 .text.I2C_Disable_IRQ:0000000000000000 $t + /tmp/ccE2rRGE.s:257 .text.I2C_Disable_IRQ:0000000000000000 I2C_Disable_IRQ + /tmp/ccE2rRGE.s:381 .text.I2C_ConvertOtherXferOptions:0000000000000000 $t + /tmp/ccE2rRGE.s:386 .text.I2C_ConvertOtherXferOptions:0000000000000000 I2C_ConvertOtherXferOptions + /tmp/ccE2rRGE.s:427 .text.I2C_IsAcknowledgeFailed:0000000000000000 $t + /tmp/ccE2rRGE.s:432 .text.I2C_IsAcknowledgeFailed:0000000000000000 I2C_IsAcknowledgeFailed + /tmp/ccE2rRGE.s:574 .text.I2C_WaitOnTXISFlagUntilTimeout:0000000000000000 $t + /tmp/ccE2rRGE.s:579 .text.I2C_WaitOnTXISFlagUntilTimeout:0000000000000000 I2C_WaitOnTXISFlagUntilTimeout + /tmp/ccE2rRGE.s:669 .text.I2C_WaitOnFlagUntilTimeout:0000000000000000 $t + /tmp/ccE2rRGE.s:674 .text.I2C_WaitOnFlagUntilTimeout:0000000000000000 I2C_WaitOnFlagUntilTimeout + /tmp/ccE2rRGE.s:759 .text.I2C_RequestMemoryWrite:0000000000000000 $t + /tmp/ccE2rRGE.s:764 .text.I2C_RequestMemoryWrite:0000000000000000 I2C_RequestMemoryWrite + /tmp/ccE2rRGE.s:879 .text.I2C_RequestMemoryWrite:0000000000000078 $d + /tmp/ccE2rRGE.s:884 .text.I2C_RequestMemoryRead:0000000000000000 $t + /tmp/ccE2rRGE.s:889 .text.I2C_RequestMemoryRead:0000000000000000 I2C_RequestMemoryRead + /tmp/ccE2rRGE.s:1004 .text.I2C_RequestMemoryRead:0000000000000074 $d + /tmp/ccE2rRGE.s:1009 .text.I2C_WaitOnSTOPFlagUntilTimeout:0000000000000000 $t + /tmp/ccE2rRGE.s:1014 .text.I2C_WaitOnSTOPFlagUntilTimeout:0000000000000000 I2C_WaitOnSTOPFlagUntilTimeout + /tmp/ccE2rRGE.s:1100 .text.I2C_WaitOnRXNEFlagUntilTimeout:0000000000000000 $t + /tmp/ccE2rRGE.s:1105 .text.I2C_WaitOnRXNEFlagUntilTimeout:0000000000000000 I2C_WaitOnRXNEFlagUntilTimeout + /tmp/ccE2rRGE.s:1240 .text.HAL_I2C_MspInit:0000000000000000 $t + /tmp/ccE2rRGE.s:1246 .text.HAL_I2C_MspInit:0000000000000000 HAL_I2C_MspInit + /tmp/ccE2rRGE.s:1261 .text.HAL_I2C_Init:0000000000000000 $t + /tmp/ccE2rRGE.s:1267 .text.HAL_I2C_Init:0000000000000000 HAL_I2C_Init + /tmp/ccE2rRGE.s:1457 .text.HAL_I2C_MspDeInit:0000000000000000 $t + /tmp/ccE2rRGE.s:1463 .text.HAL_I2C_MspDeInit:0000000000000000 HAL_I2C_MspDeInit + /tmp/ccE2rRGE.s:1478 .text.HAL_I2C_DeInit:0000000000000000 $t + /tmp/ccE2rRGE.s:1484 .text.HAL_I2C_DeInit:0000000000000000 HAL_I2C_DeInit + /tmp/ccE2rRGE.s:1547 .text.HAL_I2C_Master_Transmit:0000000000000000 $t + /tmp/ccE2rRGE.s:1553 .text.HAL_I2C_Master_Transmit:0000000000000000 HAL_I2C_Master_Transmit + /tmp/ccE2rRGE.s:1859 .text.HAL_I2C_Master_Transmit:0000000000000178 $d + /tmp/ccE2rRGE.s:1864 .text.HAL_I2C_Master_Receive:0000000000000000 $t + /tmp/ccE2rRGE.s:1870 .text.HAL_I2C_Master_Receive:0000000000000000 HAL_I2C_Master_Receive + /tmp/ccE2rRGE.s:2175 .text.HAL_I2C_Master_Receive:0000000000000178 $d + /tmp/ccE2rRGE.s:2180 .text.HAL_I2C_Slave_Transmit:0000000000000000 $t + /tmp/ccE2rRGE.s:2186 .text.HAL_I2C_Slave_Transmit:0000000000000000 HAL_I2C_Slave_Transmit + /tmp/ccE2rRGE.s:2539 .text.HAL_I2C_Slave_Receive:0000000000000000 $t + /tmp/ccE2rRGE.s:2545 .text.HAL_I2C_Slave_Receive:0000000000000000 HAL_I2C_Slave_Receive + /tmp/ccE2rRGE.s:2872 .text.HAL_I2C_Master_Transmit_IT:0000000000000000 $t + /tmp/ccE2rRGE.s:2878 .text.HAL_I2C_Master_Transmit_IT:0000000000000000 HAL_I2C_Master_Transmit_IT + /tmp/ccE2rRGE.s:3027 .text.HAL_I2C_Master_Transmit_IT:000000000000008c $d + /tmp/ccE2rRGE.s:11326 .text.I2C_Master_ISR_IT:0000000000000000 I2C_Master_ISR_IT + /tmp/ccE2rRGE.s:3034 .text.HAL_I2C_Master_Receive_IT:0000000000000000 $t + /tmp/ccE2rRGE.s:3040 .text.HAL_I2C_Master_Receive_IT:0000000000000000 HAL_I2C_Master_Receive_IT + /tmp/ccE2rRGE.s:3189 .text.HAL_I2C_Master_Receive_IT:000000000000008c $d + /tmp/ccE2rRGE.s:3196 .text.HAL_I2C_Slave_Transmit_IT:0000000000000000 $t + ARM GAS /tmp/ccE2rRGE.s page 420 + + + /tmp/ccE2rRGE.s:3202 .text.HAL_I2C_Slave_Transmit_IT:0000000000000000 HAL_I2C_Slave_Transmit_IT + /tmp/ccE2rRGE.s:3304 .text.HAL_I2C_Slave_Transmit_IT:000000000000005c $d + /tmp/ccE2rRGE.s:10758 .text.I2C_Slave_ISR_IT:0000000000000000 I2C_Slave_ISR_IT + /tmp/ccE2rRGE.s:3310 .text.HAL_I2C_Slave_Receive_IT:0000000000000000 $t + /tmp/ccE2rRGE.s:3316 .text.HAL_I2C_Slave_Receive_IT:0000000000000000 HAL_I2C_Slave_Receive_IT + /tmp/ccE2rRGE.s:3418 .text.HAL_I2C_Slave_Receive_IT:000000000000005c $d + /tmp/ccE2rRGE.s:3424 .text.HAL_I2C_Master_Transmit_DMA:0000000000000000 $t + /tmp/ccE2rRGE.s:3430 .text.HAL_I2C_Master_Transmit_DMA:0000000000000000 HAL_I2C_Master_Transmit_DMA + /tmp/ccE2rRGE.s:3728 .text.HAL_I2C_Master_Transmit_DMA:000000000000013c $d + /tmp/ccE2rRGE.s:12333 .text.I2C_DMAMasterTransmitCplt:0000000000000000 I2C_DMAMasterTransmitCplt + /tmp/ccE2rRGE.s:12294 .text.I2C_DMAError:0000000000000000 I2C_DMAError + /tmp/ccE2rRGE.s:3738 .text.HAL_I2C_Master_Receive_DMA:0000000000000000 $t + /tmp/ccE2rRGE.s:3744 .text.HAL_I2C_Master_Receive_DMA:0000000000000000 HAL_I2C_Master_Receive_DMA + /tmp/ccE2rRGE.s:4042 .text.HAL_I2C_Master_Receive_DMA:0000000000000138 $d + /tmp/ccE2rRGE.s:12440 .text.I2C_DMAMasterReceiveCplt:0000000000000000 I2C_DMAMasterReceiveCplt + /tmp/ccE2rRGE.s:4052 .text.HAL_I2C_Slave_Transmit_DMA:0000000000000000 $t + /tmp/ccE2rRGE.s:4058 .text.HAL_I2C_Slave_Transmit_DMA:0000000000000000 HAL_I2C_Slave_Transmit_DMA + /tmp/ccE2rRGE.s:4278 .text.HAL_I2C_Slave_Transmit_DMA:00000000000000e0 $d + /tmp/ccE2rRGE.s:9594 .text.I2C_DMASlaveTransmitCplt:0000000000000000 I2C_DMASlaveTransmitCplt + /tmp/ccE2rRGE.s:4286 .text.HAL_I2C_Slave_Receive_DMA:0000000000000000 $t + /tmp/ccE2rRGE.s:4292 .text.HAL_I2C_Slave_Receive_DMA:0000000000000000 HAL_I2C_Slave_Receive_DMA + /tmp/ccE2rRGE.s:4514 .text.HAL_I2C_Slave_Receive_DMA:00000000000000e4 $d + /tmp/ccE2rRGE.s:9645 .text.I2C_DMASlaveReceiveCplt:0000000000000000 I2C_DMASlaveReceiveCplt + /tmp/ccE2rRGE.s:4522 .text.HAL_I2C_Mem_Write:0000000000000000 $t + /tmp/ccE2rRGE.s:4528 .text.HAL_I2C_Mem_Write:0000000000000000 HAL_I2C_Mem_Write + /tmp/ccE2rRGE.s:4882 .text.HAL_I2C_Mem_Read:0000000000000000 $t + /tmp/ccE2rRGE.s:4888 .text.HAL_I2C_Mem_Read:0000000000000000 HAL_I2C_Mem_Read + /tmp/ccE2rRGE.s:5242 .text.HAL_I2C_Mem_Read:00000000000001ac $d + /tmp/ccE2rRGE.s:5247 .text.HAL_I2C_Mem_Write_IT:0000000000000000 $t + /tmp/ccE2rRGE.s:5253 .text.HAL_I2C_Mem_Write_IT:0000000000000000 HAL_I2C_Mem_Write_IT + /tmp/ccE2rRGE.s:5458 .text.HAL_I2C_Mem_Write_IT:00000000000000dc $d + /tmp/ccE2rRGE.s:5464 .text.HAL_I2C_Mem_Read_IT:0000000000000000 $t + /tmp/ccE2rRGE.s:5470 .text.HAL_I2C_Mem_Read_IT:0000000000000000 HAL_I2C_Mem_Read_IT + /tmp/ccE2rRGE.s:5676 .text.HAL_I2C_Mem_Read_IT:00000000000000dc $d + /tmp/ccE2rRGE.s:5683 .text.HAL_I2C_Mem_Write_DMA:0000000000000000 $t + /tmp/ccE2rRGE.s:5689 .text.HAL_I2C_Mem_Write_DMA:0000000000000000 HAL_I2C_Mem_Write_DMA + /tmp/ccE2rRGE.s:6003 .text.HAL_I2C_Mem_Write_DMA:000000000000015c $d + /tmp/ccE2rRGE.s:6011 .text.HAL_I2C_Mem_Read_DMA:0000000000000000 $t + /tmp/ccE2rRGE.s:6017 .text.HAL_I2C_Mem_Read_DMA:0000000000000000 HAL_I2C_Mem_Read_DMA + /tmp/ccE2rRGE.s:6332 .text.HAL_I2C_Mem_Read_DMA:000000000000015c $d + /tmp/ccE2rRGE.s:6341 .text.HAL_I2C_IsDeviceReady:0000000000000000 $t + /tmp/ccE2rRGE.s:6347 .text.HAL_I2C_IsDeviceReady:0000000000000000 HAL_I2C_IsDeviceReady + /tmp/ccE2rRGE.s:6676 .text.HAL_I2C_Master_Seq_Transmit_IT:0000000000000000 $t + /tmp/ccE2rRGE.s:6682 .text.HAL_I2C_Master_Seq_Transmit_IT:0000000000000000 HAL_I2C_Master_Seq_Transmit_IT + /tmp/ccE2rRGE.s:6869 .text.HAL_I2C_Master_Seq_Transmit_IT:00000000000000ac $d + /tmp/ccE2rRGE.s:6875 .text.HAL_I2C_Master_Seq_Transmit_DMA:0000000000000000 $t + /tmp/ccE2rRGE.s:6881 .text.HAL_I2C_Master_Seq_Transmit_DMA:0000000000000000 HAL_I2C_Master_Seq_Transmit_DMA + /tmp/ccE2rRGE.s:7210 .text.HAL_I2C_Master_Seq_Transmit_DMA:0000000000000160 $d + /tmp/ccE2rRGE.s:7219 .text.HAL_I2C_Master_Seq_Receive_IT:0000000000000000 $t + /tmp/ccE2rRGE.s:7225 .text.HAL_I2C_Master_Seq_Receive_IT:0000000000000000 HAL_I2C_Master_Seq_Receive_IT + /tmp/ccE2rRGE.s:7412 .text.HAL_I2C_Master_Seq_Receive_IT:00000000000000ac $d + /tmp/ccE2rRGE.s:7418 .text.HAL_I2C_Master_Seq_Receive_DMA:0000000000000000 $t + /tmp/ccE2rRGE.s:7424 .text.HAL_I2C_Master_Seq_Receive_DMA:0000000000000000 HAL_I2C_Master_Seq_Receive_DMA + /tmp/ccE2rRGE.s:7753 .text.HAL_I2C_Master_Seq_Receive_DMA:0000000000000160 $d + /tmp/ccE2rRGE.s:7762 .text.HAL_I2C_Slave_Seq_Transmit_IT:0000000000000000 $t + /tmp/ccE2rRGE.s:7768 .text.HAL_I2C_Slave_Seq_Transmit_IT:0000000000000000 HAL_I2C_Slave_Seq_Transmit_IT + /tmp/ccE2rRGE.s:7968 .text.HAL_I2C_Slave_Seq_Transmit_IT:00000000000000d0 $d + ARM GAS /tmp/ccE2rRGE.s page 421 + + + /tmp/ccE2rRGE.s:12653 .text.I2C_DMAAbort:0000000000000000 I2C_DMAAbort + /tmp/ccE2rRGE.s:7974 .text.HAL_I2C_Slave_Seq_Transmit_DMA:0000000000000000 $t + /tmp/ccE2rRGE.s:7980 .text.HAL_I2C_Slave_Seq_Transmit_DMA:0000000000000000 HAL_I2C_Slave_Seq_Transmit_DMA + /tmp/ccE2rRGE.s:8358 .text.HAL_I2C_Slave_Seq_Transmit_DMA:0000000000000194 $d + /tmp/ccE2rRGE.s:8366 .text.HAL_I2C_Slave_Seq_Receive_IT:0000000000000000 $t + /tmp/ccE2rRGE.s:8372 .text.HAL_I2C_Slave_Seq_Receive_IT:0000000000000000 HAL_I2C_Slave_Seq_Receive_IT + /tmp/ccE2rRGE.s:8572 .text.HAL_I2C_Slave_Seq_Receive_IT:00000000000000d0 $d + /tmp/ccE2rRGE.s:8578 .text.HAL_I2C_Slave_Seq_Receive_DMA:0000000000000000 $t + /tmp/ccE2rRGE.s:8584 .text.HAL_I2C_Slave_Seq_Receive_DMA:0000000000000000 HAL_I2C_Slave_Seq_Receive_DMA + /tmp/ccE2rRGE.s:8959 .text.HAL_I2C_Slave_Seq_Receive_DMA:0000000000000190 $d + /tmp/ccE2rRGE.s:8967 .text.HAL_I2C_EnableListen_IT:0000000000000000 $t + /tmp/ccE2rRGE.s:8973 .text.HAL_I2C_EnableListen_IT:0000000000000000 HAL_I2C_EnableListen_IT + /tmp/ccE2rRGE.s:9019 .text.HAL_I2C_EnableListen_IT:0000000000000028 $d + /tmp/ccE2rRGE.s:9024 .text.HAL_I2C_DisableListen_IT:0000000000000000 $t + /tmp/ccE2rRGE.s:9030 .text.HAL_I2C_DisableListen_IT:0000000000000000 HAL_I2C_DisableListen_IT + /tmp/ccE2rRGE.s:9095 .text.HAL_I2C_Master_Abort_IT:0000000000000000 $t + /tmp/ccE2rRGE.s:9101 .text.HAL_I2C_Master_Abort_IT:0000000000000000 HAL_I2C_Master_Abort_IT + /tmp/ccE2rRGE.s:9236 .text.HAL_I2C_Master_Abort_IT:0000000000000080 $d + /tmp/ccE2rRGE.s:9241 .text.HAL_I2C_EV_IRQHandler:0000000000000000 $t + /tmp/ccE2rRGE.s:9247 .text.HAL_I2C_EV_IRQHandler:0000000000000000 HAL_I2C_EV_IRQHandler + /tmp/ccE2rRGE.s:9284 .text.HAL_I2C_MasterTxCpltCallback:0000000000000000 $t + /tmp/ccE2rRGE.s:9290 .text.HAL_I2C_MasterTxCpltCallback:0000000000000000 HAL_I2C_MasterTxCpltCallback + /tmp/ccE2rRGE.s:9305 .text.HAL_I2C_MasterRxCpltCallback:0000000000000000 $t + /tmp/ccE2rRGE.s:9311 .text.HAL_I2C_MasterRxCpltCallback:0000000000000000 HAL_I2C_MasterRxCpltCallback + /tmp/ccE2rRGE.s:9326 .text.I2C_ITMasterSeqCplt:0000000000000000 $t + /tmp/ccE2rRGE.s:9331 .text.I2C_ITMasterSeqCplt:0000000000000000 I2C_ITMasterSeqCplt + /tmp/ccE2rRGE.s:9415 .text.HAL_I2C_SlaveTxCpltCallback:0000000000000000 $t + /tmp/ccE2rRGE.s:9421 .text.HAL_I2C_SlaveTxCpltCallback:0000000000000000 HAL_I2C_SlaveTxCpltCallback + /tmp/ccE2rRGE.s:9436 .text.HAL_I2C_SlaveRxCpltCallback:0000000000000000 $t + /tmp/ccE2rRGE.s:9442 .text.HAL_I2C_SlaveRxCpltCallback:0000000000000000 HAL_I2C_SlaveRxCpltCallback + /tmp/ccE2rRGE.s:9457 .text.I2C_ITSlaveSeqCplt:0000000000000000 $t + /tmp/ccE2rRGE.s:9462 .text.I2C_ITSlaveSeqCplt:0000000000000000 I2C_ITSlaveSeqCplt + /tmp/ccE2rRGE.s:9589 .text.I2C_DMASlaveTransmitCplt:0000000000000000 $t + /tmp/ccE2rRGE.s:9640 .text.I2C_DMASlaveReceiveCplt:0000000000000000 $t + /tmp/ccE2rRGE.s:9700 .text.HAL_I2C_AddrCallback:0000000000000000 $t + /tmp/ccE2rRGE.s:9706 .text.HAL_I2C_AddrCallback:0000000000000000 HAL_I2C_AddrCallback + /tmp/ccE2rRGE.s:9723 .text.I2C_ITAddrCplt:0000000000000000 $t + /tmp/ccE2rRGE.s:9728 .text.I2C_ITAddrCplt:0000000000000000 I2C_ITAddrCplt + /tmp/ccE2rRGE.s:9887 .text.HAL_I2C_ListenCpltCallback:0000000000000000 $t + /tmp/ccE2rRGE.s:9893 .text.HAL_I2C_ListenCpltCallback:0000000000000000 HAL_I2C_ListenCpltCallback + /tmp/ccE2rRGE.s:9908 .text.I2C_ITListenCplt:0000000000000000 $t + /tmp/ccE2rRGE.s:9913 .text.I2C_ITListenCplt:0000000000000000 I2C_ITListenCplt + /tmp/ccE2rRGE.s:10016 .text.I2C_ITListenCplt:0000000000000064 $d + /tmp/ccE2rRGE.s:10021 .text.HAL_I2C_MemTxCpltCallback:0000000000000000 $t + /tmp/ccE2rRGE.s:10027 .text.HAL_I2C_MemTxCpltCallback:0000000000000000 HAL_I2C_MemTxCpltCallback + /tmp/ccE2rRGE.s:10042 .text.HAL_I2C_MemRxCpltCallback:0000000000000000 $t + /tmp/ccE2rRGE.s:10048 .text.HAL_I2C_MemRxCpltCallback:0000000000000000 HAL_I2C_MemRxCpltCallback + /tmp/ccE2rRGE.s:10063 .text.HAL_I2C_ErrorCallback:0000000000000000 $t + /tmp/ccE2rRGE.s:10069 .text.HAL_I2C_ErrorCallback:0000000000000000 HAL_I2C_ErrorCallback + /tmp/ccE2rRGE.s:10084 .text.HAL_I2C_AbortCpltCallback:0000000000000000 $t + /tmp/ccE2rRGE.s:10090 .text.HAL_I2C_AbortCpltCallback:0000000000000000 HAL_I2C_AbortCpltCallback + /tmp/ccE2rRGE.s:10105 .text.I2C_TreatErrorCallback:0000000000000000 $t + /tmp/ccE2rRGE.s:10110 .text.I2C_TreatErrorCallback:0000000000000000 I2C_TreatErrorCallback + /tmp/ccE2rRGE.s:10166 .text.I2C_ITError:0000000000000000 $t + /tmp/ccE2rRGE.s:10171 .text.I2C_ITError:0000000000000000 I2C_ITError + /tmp/ccE2rRGE.s:10417 .text.I2C_ITError:00000000000000fc $d + /tmp/ccE2rRGE.s:10424 .text.I2C_ITSlaveCplt:0000000000000000 $t + ARM GAS /tmp/ccE2rRGE.s page 422 + + + /tmp/ccE2rRGE.s:10429 .text.I2C_ITSlaveCplt:0000000000000000 I2C_ITSlaveCplt + /tmp/ccE2rRGE.s:10748 .text.I2C_ITSlaveCplt:0000000000000164 $d + /tmp/ccE2rRGE.s:10753 .text.I2C_Slave_ISR_IT:0000000000000000 $t + /tmp/ccE2rRGE.s:11048 .text.I2C_ITMasterCplt:0000000000000000 $t + /tmp/ccE2rRGE.s:11053 .text.I2C_ITMasterCplt:0000000000000000 I2C_ITMasterCplt + /tmp/ccE2rRGE.s:11321 .text.I2C_Master_ISR_IT:0000000000000000 $t + /tmp/ccE2rRGE.s:11696 .text.I2C_Slave_ISR_DMA:0000000000000000 $t + /tmp/ccE2rRGE.s:11837 .text.I2C_Slave_ISR_DMA:000000000000008e $d + /tmp/ccE2rRGE.s:11848 .text.I2C_Slave_ISR_DMA:0000000000000098 $t + /tmp/ccE2rRGE.s:11976 .text.I2C_Master_ISR_DMA:0000000000000000 $t + /tmp/ccE2rRGE.s:12289 .text.I2C_DMAError:0000000000000000 $t + /tmp/ccE2rRGE.s:12328 .text.I2C_DMAMasterTransmitCplt:0000000000000000 $t + /tmp/ccE2rRGE.s:12435 .text.I2C_DMAMasterReceiveCplt:0000000000000000 $t + /tmp/ccE2rRGE.s:12542 .text.HAL_I2C_ER_IRQHandler:0000000000000000 $t + /tmp/ccE2rRGE.s:12548 .text.HAL_I2C_ER_IRQHandler:0000000000000000 HAL_I2C_ER_IRQHandler + /tmp/ccE2rRGE.s:12648 .text.I2C_DMAAbort:0000000000000000 $t + /tmp/ccE2rRGE.s:12698 .text.HAL_I2C_GetState:0000000000000000 $t + /tmp/ccE2rRGE.s:12704 .text.HAL_I2C_GetState:0000000000000000 HAL_I2C_GetState + /tmp/ccE2rRGE.s:12722 .text.HAL_I2C_GetMode:0000000000000000 $t + /tmp/ccE2rRGE.s:12728 .text.HAL_I2C_GetMode:0000000000000000 HAL_I2C_GetMode + /tmp/ccE2rRGE.s:12746 .text.HAL_I2C_GetError:0000000000000000 $t + /tmp/ccE2rRGE.s:12752 .text.HAL_I2C_GetError:0000000000000000 HAL_I2C_GetError + +UNDEFINED SYMBOLS +HAL_GetTick +HAL_DMA_Start_IT +HAL_DMA_Abort_IT +HAL_DMA_GetState diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_i2c.o b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_i2c.o new file mode 100644 index 0000000000000000000000000000000000000000..561ef14b49a7c08a6521db3a51e431c92f3817d8 GIT binary patch literal 101776 zcmeFa31C#!y+3~M+?mN_-$N1>Ckqe~2nm}AfrJDjo00_(Q7a??!=mO1QtD47B3P0=|n00i1*{q}Z?zZBBN8*g{ ze;RF0IpUd;RW+=`##rnhI|Go?NGs4=^s!^lhSHZfXN_a|1e zj9b-x)Cvwu=&0%rTCtsMWpyMCi)}aZjLygNg2Mvs6~m(2&E}Zq)T-EpEoW@WJK9y% zz0mp;pB2_8U61Fz)@3|x^Gxi~?OTpbDY3c>tb!u5{gXUTXC-iPWDn}9x~ImWKIrK# z@Dvm#p?uWhsPPyzp*=V(5#uGvc)3R`iz7Bx{}y9CZt-)A^&5N!t&e2%Uw1vb?7kvz z`?JgT{l0Lv)ef%no^5D3V|KT(^4W$zb{%^pq1tM`eQ9!cQet(xuex9Lg65QNW3AP( zpt1~_;~pr+mHY8v*XY7-(6`QHj2ADmapJg%bS9E8^Do) z&&rYw$0|z9V6ZbO_svB`&B6S)7Zp^qS7CE~b6)rHm3c?6ADwp;-`%EFzmOQbz<~Z0 z?*5QR@YsQtN4(YX)fv@!&D)ozLOKIGMpX~14hp`5`yT;C9}7jT{qH43BaU=53Pp{e zXuVLh9u%z?iiol0fEoO2*N9(rPw`i81h)gL$29L+I{t{)8~3!CZ{$B!nb|?Cp9)t0 z_Ghvc-d}gD6uc{e_gcYwE%09J;63nR_tl0$yz6#*tG57eU`O5BXLq-*JhGSk zPpB@{lpot~j!5XpYrf#m8$a3BVB9vk+Q@CqQC!`--?N+8@?g)Iu=r4~lKpm%Uv`9Yc_%Y+#os?N#%+1TR~-ip6^Vv|iP_LlPPNkb?)~Juwf|1) zX83PTU@a{N4CuuS{<$k$Op6dlKxCzH1a! zwdae47o(oT? zf(KTiP5r{$=2xWkD+}|MHY`o8`sPx!K4Rv*vhcm7Im>dJW2;ipCKWw6iV<9>Z9CWq zI*p_Qt*}B$;?XWO4#$0|3-)u=XjriDAf(!IM#~xZ?jh~@d99${saBI#>U1?+xH$Xih1LBZtjLD+Fwr7ev;YQ zu<53~xf>=5+*o;NuU!+XYY>CsVeT5@Ga&Oq$J>m8nvRBLdCe(nwly>^GeoS3R(KGk6ToAMhN-^GTQX=N_`ZD?;`=PD1vZTXX-LWj`uR_Os!y3zju5 z%WhG!&)sBBpiVYJ=t&e-4j|AwWcHfMBwl2Qu(nVCY zviguNmYh%*^TViH(`id@Wv7ylahu}C*3IK#?H8hz+s1p-2sQcZJrkVl#VB}R%>$wt zHK%zKW7^$#LOx;!i#tPo!)2L+(HVDa8vjv=8%D_^*D#C0obb%vAnYyJ+`2Rg8R(df zTQEDA1*6(c%#jsF4nC(CNt`bY&LRyBjT=&DzSodC(~j$DZye9d+b|nBP~r^Zrdy5` z1hs7sM*kX9dqP3AwY%g%<0iH=R{pBXgIMT6Ec7rI8pn@I?u=aHWa-NN2kG*B5xNjB z#y`TGfRQ4vLs?@^yNU}rGT#RAiHMLtwaM4KT;}@a3#T+xZm8O1ZHSurY(vz{szyYS zifNyiCTG!L_4orGC7v z-&#IyMt0*}%Zct|&>;dY0_!XlqsK!sN~rP@d%E8+KpS-nLiF z&oY0vKudptmi{E`J8h?8toVSv@-*C&2E2>5}kf~!+XoePS0xm1tj{ThF>h7iCHIaQ+{dZ|Bn(i zdPwx8y(cYE+wUnv{=v`q74n0|4lm~837C(^>-qTn-n=fas>$}X0{B`1eC?X$dHaUK z2CrE@6gId{Y;YZH(9>+e23tj9$Yl2wz)Fzo_q4*nL+lx1a874|_#akq@PR7WYO7V% z1aA(SgHvUe<4T|&YYSRjXg&ailR+a&f` zL(E*Ogl2Z5;H-%3E|dfGx>iA6652c1((78qrsKt~&^X7C_kEGIip4#NuiN>Uy;kW< zPfzu!r+p`(r#l=yZS7Q9+!xo=RK1e4c@OF7;vQ>CyUpk6X-qpaEF;(J}{`YY)w7it5v=5PuCRoh@5qe7k-uBYG-%zJL0hqHmEwV-6$I0{y4m9Y`g5X zVSbv;d=IPqGZAMPz35w!o)g&KNY80K1#{FX&K#9#&-!aj><4fr4%wc+x@C{@8godt zt?MD__PoC4mtDqCxf`Rmn6}(IJwr;W)h?N5$e+4AL;mQBoAy4Ko5yobz+;W( z@hlgQkyiJQ@z~$tF~h}U0xUF~MV+=bT84E7LA85Eb~3&p{X2VFjXUF`1@+ALdX+Nv>cexn-fXI(`}Pyc`svv^Fe-|@4bH2bfJL@~KtWR@fJ*F2~7oI@Y13EK$Sg%{w zN?+m9*0X-!HqGRYf6BJ2HtZf)ZRA-u+bgSz?j5cE>aStVZ*iwtvgg|n#gskY0vU53 zM(uAJ$bqJI{_xXiOYgGQPwgCybByOctw`Ix^x031)aUj;DW?Z&pZ^(sdhk()+TFMJ z`VH*$1AoxR+3%XsvcsK}SfuBHU`~mgLl_0~J4QG2v}3f)sn+(Y(+k_J?dE9fX1`LDjr}avL~I|)!5vtoY{zpup4+g;cq^Wp@!W|0cK4cZIwB=v1Xd)~?WU|pa(Y>h z__x2;Fu;in33g;yowq!>D7M4D{l20=JI|YZ?M7al*wzQjy1UfMpLTM*DE06M%i>`} z;VU#FVpqVkyXAm2^VhP%@&pm(`R6+8NUsiTv*)pj?mJo&H0?(B_SW91UySwXyA5ab zr2Wf^_WKH>+xLQUe>-*}0`Wq7R|M@t4|gs5&to68ay@$%*0ZVm#z@o~(@WGFR;{95 z_nyeemE^2dr*!`3v9{Kqop3e#lVe8fM41uoY~}O(O|52=z-eeTYxmXh)SgfEYL=%? zvg6>KRf@c|%slZ6_)J1Us>3$^zs9z1WFsj{JN(iKPBSc0$^}xShPG?c}}X zw3G0NU07{L?Eii{QET*nlAS>2$J7a#VRRQ51qBN_5^**-u-e>{yWieZt?lGKmx=}| zADOOmuUing-r8GOl;1u~=6U*zTAy*BS*@clY*>P`gS-vDY{-Ib%f9K+)^f9*yVxpz zgs>M>_wTf=B(FKUnY&mW?b*$_M~%wtg`7oSY7fj<(5P0wM!~b~oy)71Z$0B_M8;#X z0~b2C59h0*`^i?tnK7&u+5PNxJG0uWXZsKpHdmEsL;i*popVzBO#^?-s?KSzmiSWL zOME#^#}};J3+mhZ-mhq~=la1H^pMEo?XbqeM_h6l?vlxOv`oH@6Gcj}b@ona*$N4g zy4%}x&{{<~qu{3Yog%@_U6HgnncCn%h^p?LxV#Ov7UOY#z^t^lT@tI48vbpUiMq45lUXdb<~&bc}`$^!(e-bU)1(G+_q<9r|p?K!rGEkwr5LD*`6)AXSL)`#`gAW z+jDu<;D_K<_Sm*9-m7iVw!2B%0t<`goD`R*!vg6gbK0lE0^eI+)gy9Ea3U8i@T?P9 z-~~OTaiIM!*xeH@YoguR@_10o<34S7#_VsqEYv94A$Dhb?rqviZ~pu24tWagE+j#< zJIB~~GIkem_W#XxPcU#m?Ff3Y^F~XS9qr(!vPLxwmCy3tj|XS$N$eTif+*+dwmhj- zRwK^}u)@j5Zeqn$r+=_I=>YpyB7P(ljq6Y+A@TYYz69};*{{N#QH zxoWw!XX_b(1H4->9x>kl1(gm3iS3Gylsv1^7<_u8!Uh@FsJK7=fT~Z{^=jl${cmyK zg3|FK+s|$`a)3LDu_wW?7Tc!d9h=Tfox%I{mtjgG(p)rz*m zR(}8|IxguOU;cJW&Ri+6ijrdotmYj{U-;Ch#x0dNPxoiOZOuRUG}`l@%~9Q-MSZ{7 zGc31b!;wSj>D~Usq>igsn59=YUA@9H?A;C{=jx_F@bDr?Ey>R8e#UcOWpQHBq1!_* zMbw1uEgS%ahCx~P!+tT=T#Z5OWlsrGpH+>?xH*#wiWe-a!Wn)Q?oU)TSexqim=i6W zU#WW(RU5eP?Zv+Lv`;J@UGro`nX}QY}vLf7C)NV!ScJ7XYWad7vvOWVV29@lTtLU zJ-28~yV8Hsfe^jQo)#8)V7ao#kk{Dwjx*<3j@_yFWELdwBn$CMacD=a*L2kC(5s!F zIMGXCVBVo(7BRfHJl4TrN3w@?B-^bq-0#}k;w0AsJ;hghnlqY}j|X!)7UdMhw+}0d z1!rb^VNpVdD~`dk{jPkAo)9{-m#nJCjXWir40u}wPN;FaNh}`R?xCIY^ei1Vk=#DG z+v^KI_s-ii8g`Kvakr!Y9-iQNvEHGqDoYw08&~vy^1WrL@Rt$TeN&NYyd(F#M#f@A z#qiDyc=QXJ4*C@5qwlrbl)sr?I2~M_`j2$@c z4j6J~e(V6P{N1j{J~r0=#-X*ls~@CsM7LCQtIzjfLF{eIu-~4?5RDFZ*nGdzMQxk{ z8oY@Egoc%SBDK;}Cq~g@9USpt?FqYqB>=86@RW=(shob))tlrmm+4GepJ0$izHQJe{#>icWp0`7BHq-d6-?xr_uYr>G zYx&r+uzj|_=AvPR4Kdme?Xe}qy9J?{?IqXD_MFJB6Ijn(_SRnWW^?=x%=`q&BRT(bDDYQnm%#7DB-ZW$ESQgx&6Im*u~j$Xs?pM zo-W?~vv1ZZ*gcSneX~zNcEArX%gWtk1-Z4WLPz{9prRsilTdM;P;ouZx71DMbsg_6 z!)rulC{lDdPLh7&9qxaeKzmirHU6Jg?t_cvTsY z_%v~!k!y7-i5j`zT3&>@*4ZAZduxwbnANK_EB~(S$e9>jG~)1oerRb z(#Un+5n^lmzJ}s8w4po@p*_*Pb;?9-}v-{4-$zt|2-@G)rIrV7k+UR!b-QPZS#nf)oJGBXS8CSi! z2sM|)NKI6G<%-JgfTyy_gWJiiO{_E4+I5UU9^{Y~Z!TZ@=AtPplDlIQjgBOlG5;dD z_%+L8_ZYbgaHBzetBeuziGkl;;1*iT85Jv9&bW1wVfYNw%Y13z5kEfe_8G=a0mFzR zNdG07{!2Xo^*0T}QoNH9_&&u~+*UOAoR(G38c$Rz5G8qiJ1o@f0&dUj ztczIVjamTgNdaFIuq6ee9>&)ouW#wat5_FENGtEEZJGH8+&X{fP$E%Sr1sH1N-J38MC~M_CkZ=azb@Co(WJZI- zdeizIkp$+N`Cu${dVQU7wnkD8e&#DAM&?uC@Ep^!(5T<=1LgrXuBt0Fo>q$ zFu?~d4$6Ce!nF|X59PhU$UHUCFkUh}C1{&QrTD)63%o`T1AgO_`qSqarV-ao_`TK- zQIQnzK8}(!^%rD9_|b0xwGllK+?vr-(Zmz|GKFr$9l$vL5!O)~wSROO+owmf{Z}D9 zpdJhT`o~%MsK_1=^<8}VA4Bh`QE^m`;lBsD6w0I!=f4a? zMU_h-$$v9QiK>)Bntu(18FhvfGL5*u0B6*6YZ}H87NTaqMUp-RiAMBPVc~D!+!Nh^ zZeZaZ6r$#M9z&!4voYY*sEfCd;=h20sFrNL8~z;};?gV<@AcnF>Q`lv)1ZG7DOsJx zF>?GZtXY$NEBfU7S3vAhmk%I&1^%m0A9aNkhWm4g`YI`u_!qEQs}#og&m)uTvS^~? z{b#bUKI?uUDD#ge>T9zovI--a<{b3q+=Z$Xei+GJ7$EsJye891<17yGRg2K^axDMDtUxI-Gw$L9y_kb<*k!)rQ{bd+uz!v&uNF-3Lgzi6`sHaO|fDv~& z#tzJ~4uBZZK;Yu9qCWav2-iRrD35*_Bj!i{4a&}mo&`*~(eLB4AbJ^0W?1wu(6cc5 zPSh@pz8vK2jGhlEcN%fmahxly)9{r}oC^Ino+A2sG&iEhVUVQgiC{Yz-3~MrMqEEs z1lp{v?8KJ+zlEV@1)jVEMlD(n95{vVO3Q(#2T@vH{~cug`={K6ntXpPS$cL5!%Klb z4%h?F54snHLjPz`7I<+GH8$LTK4tfk6iWPWv(Jw+o(F<4{sk<&e9B8GjQ4*Z0|Yvx zP$t$Ccx4c+sY0wN@Yq zjWX;;MpixgY&0`y`@b zMw{4g;A5yXY>|c!+6{+hm#BuGTp%8rT}~yW;DO)`ZxT2emMxYy0p&tGM(o#MsGV7S zU4_SN`?HO!Gi#&^S7+8_;<^;i3Os`A-7LYi73J&j7_nc5j9wI6<54u*nt|Ix242h> zOvWEo40T82@jL|5uFRT445y+zny`3S?Uh+e2&+MP8lI?e zC{RB>a#?|4O|!;x8Qv4q@G;35j!c_v^B`qma8lMR4!0U8E+uLXH!15}qP`yGuM)=L zCTCR=wiD$xJk|gdD5Y6I#F19vvlio-W}Rm>$SFZR$uSZKqj|P7d<{Tm+iUjl*=qPl z&}I)F89rML&spku!Z>_?HT=&}egls){EzhT9Jp49P{Zds!(RvO9L=jl{mLH4|j?E1{{ zr0F@-KZ8eT+N_W<0R2p0Xz=w+@!;Q~{A)Z>`9QNM2_Lc7gZy&@^#VaX7qLUwJty-t zqK<`(j|&>Gd!9l)0kH9SqWBYPra{(ZypZ60^mY^s(yeKzVAPuIuJ8nchHt*EahiJq z6&P+2ls!r4QL%BiP0u7n&lwoE3XiZ_q3AgesCew@o zc(U<$JK?g8{lvbCP#%oODnzFS^dE!vj)Kk6hBXHjj%*joO75&cxQE_$Gp{IgO2|cDvOFx|Q#kZl%VC+OLAgj1W0CqsnYchg^m05&cTZ z^)ygjiO2IU3M2YeJU|2}FT`Up2$MiBIyu}3fxZS*J)|UzaEgH@q1|S>ywNP;tw%hP zfi`Ezl)V-RIep4Nn={He5Z8Iz@OYWDY{?K&9zwaDunz&dQNcP`B!Ad%k*C(_fZypvVWg;$xVqBQ6Shn*_J`Ym7+`WwbaE?6e0pzRr8M+?;|1dP^` z?ZDKWW>}+8L!T>lY7A=zV3bs42)KrDa7u3?C{M=YU4)QpDoI_9@|Ovt^gIf-2jy?$8Bh#MwlbKUdTv}{Ex|V>@MefE z>k7cg?QdPMYXPGWO^^gW%~HdIi7K=0niM^LPPzomT40%i zM=T^KT_*h-P+pJ6y8=-lFFke(dOn2m0|JAd^V8$n0DA`I#|hhqkTzJsI#GU;uq}}B z5C!`q%D=~BEkmbQp|JrV!r_tmoFmXusX;U|S`BNxZeAPFoJru9(P=a4DTO7jPQD$w zlN&!fTn2dJZ(#D>X?C`@1|YNTo>VQ7?zAdu#0zE&Jd%uer`3_uOqA0Ii-CoIoOT*v zBT+6Q>`_Mhw6h4SM!AwOrcfWJH9i2?`6!=57*nWE(oQ36CCZoJkxY*(i^(9urkJ#v zX1!TrdagA5$*s?{wyrU(A?U`u_DimowUC`Hj7roq@w_gqK2U*rV8U7fO@WVs^PQ)0 z*(18}7>Pqb&VENmSD>lc_LDTw&jfCN+EmJji=z$Xi3^tfY4zm&4wP>vj52y6Z31Br zqr96i%IJx-*@XQFWHrXn`Z8AdKB?dlh~rQYuKB z#>I0s2#LWXzEzMWiT7fZ&nE035DZHjOHS`bc`F_-LvvA@#HF`TeuJ>5k%0_Xu-~El zOTsvxjYyOEEC^;Y@kG@C5oc-Z1-x*Yxf;}jNQe1bZ=!~w`&OsMusQ+btnnQej1wBe z`GFA3#{kUO6^0SB8}!nq*8S*IDPo96-XLOVOPx+JG=aPdJR*j+)cIuD5AHuCjAFPW zbsS;bEcq%P?>dZqXR3r41Kj_Wu#qs9ov9+448XW#x0aw24P!a-2Td0&+$=FH+8NX6 z4WSyW-vU9yx(hXw!R=0sVZ8$w=ZXhhunz&F3|@3#h_Fn#twCUtt>1EL5WE3n>)$&t z-P%`%8s;>P+>lt-A`)?xo9GDcER@W)0wkp(xWv>mD7Z2(S&T;nmzX+_Lb?Lw7Q!gF zq|`Bl?M3-+JYqj7N=WaZ{5D~n(Nh(Sd)go3iK1nTtz3*3+R6h^nL{B%rNtSPa{9hg zV^|vjqpiH=g53)kIscUlM*CsAzqw%JKnCrnA9xHK$u|u(Y^|V>3e|CCiXEg|MKqhS zdm^H_GDTdg8bc1kBci!7MO^DB%C8be(Oi`xuJv^=w-k@qRBMXZR2IA>6_1GK>J+gl z?jIK8v97}4I^2`uNN$lfQLqYlkKvYVfiGM>#}M$;cjbFS{s zOv&KFhkvR$msW!P%#;ai{sEf4%jWUd;-fGH6rlkgvyDqLS=$w=rdXZD)1aGhyUpF`J9eYnLXEx!t7}ZA&WvRw zvn^|YR$ODUT4^Jo{RuMkavootEFP2xSPmX+g$gziWgaF)H3K#6 z+lZeBf2~pD!3QwjSM2d>)OfSeekSp7yn2PF3FQXDINlruy9DKn@C>F=!O_$rKJYPm zr6fDScD;--Y@p^TC3!NXa|8OV!6PY6O7fXh(Ca84#AD4ufqwoG2(uknZ%3M?;_S+o zk*&2}&1`J}I&cE=W0X(_PC!dg!=yD!YPc@)U8+IwSS0*LU>B-CPIBm-fNHaCgH7+p zN#&$B8KR2DGi238ErxkCNt7@efKoiZaSlom0x(NTZ3Om1T5p7K4;S1&wsF6aB(j(Z z6jel%i)yl=W$B>FD1t>6B-t@~CxV07_T(Tf(SjsN5-$OU<#;@EAi{#AdY*z@hjJ@n z+|@2fYNV8(M0p=!JO&w-q>?|BJMnnAZBmq!&XK-^>0>?~t3)%`gaIAlTCtv1!`g)^ z?y#+qDz!}bscwFwyE)_@^$98%nxdG#@x{kIYRxZ}qQWk)8X03i?ZHHw-NR^Ywq1FO zX7^yCtQ-CxNc%D#VfSES9ohW`$~O>3b`K^tklhziewr|{`@=+84}6C5M|hlFiE<#1 zVC@F80u_oBRwFmjNVC|h2CL;06@L}3|;qOhe{iZtS}Xu+f}9Rs?!GNG^? zsG`D#NmZ?^>kjGWmG0*7jHo}LLKMd1Nl_RN79td8w1VB!5tsKRge$B#N3**xLG1Hd zkhTtwu)8lo?DLx_-$oeO-IpNtc?ji~2qU`>Cy0GUWBu?)z#N5j2Yaw)D=Ze{MsRH_ zEZ<#44jqLB4uF981Sbfr0;6WzO>jt=LE{rdW3xfVOgs{_;uGdjJIyFBB#dqspRkl# zyb<3WIB;1L-=p8VakpSi?&7Ct#DunR!HpBLf`OhLwz{E zqrh(z=EZ~%zsjaQ$k+TP#8-1-xddZ!MJ4>UyUg< zBI76G#HJ>rJdQB>?UM@Di1N939Glt+!fbikHua1H`#hVX4`o^i-XVThfPEYS4h4PW zcUYVxv3Fuj9>@v5!{TPrR{ntUZwb3nFf63448?+iizL|_DvTRN*tsa5jmJA3Imd9t z$7+;U;2DsF;fmw-qnYQ%^Sn_Wm{42-4>P}w+U2l2w~ zpr?l@G0;%BPvC3^!K3u1S=0x1CqK}$)6viG$85NqGuu`d zfG>)1Tdb@&eg)!xiATh^Ep`UQ7|2E>AdK5?+hS#5Q4iSZcx2mcdu%D&ZAEztVKlGp zvDI|p@1uNxFq+r)*m-RCCd#kl5pmxUE2i{&lz&GUcVTuY7#BM6c*I@rj1_m~+GQM` zs2R4bXj9yB4uTV9XSPi-H&f9{7Sq!W>v6Q@95Ghf)>$`VhPOD=Gte#UfuP>AMwH{k z_{nG*9`h<7p2raLqC$dI_W7e>V48xBiWU1j3q;SrBZ7^J75lshWv;VCuu-uKDV)bq zzK<~OX9i+N5%xEfe@_?%8;CuFf*mrzFmmyTU<0vdvt2pL6Y+>(W0VjVpge~#3N}{3 zE=T!N!WakRlwj{fc{`qP!E)#NE8yg01-n_=)`koAksb(a!7>+<{i~ir{Z6!Dd^g6i z)(^p++4h%0FifF-H%1oG`#|tRctoh*jhWttR)E;t`=f7$esDG|Kx4qfj4Gu%Dy+8lI@B zKrXI-EnaAuPk`#r6W|kQOC$VckG8g~93wo4rs4A9#9I--c1TEG@1v2~Hgq_6p}fwF zQTqv4pZpCpioDK@5$_HHmV!s*b!Los_i~iaCyeqsD@MF~H_G=CMtPkTBi{W6%C8Yd zd7Tv_-u(&6zr`c+s!_6u$EqO;kI1W5!HQ7MBRouAG`J&0CoivLa2PIITV7&YFZ7TV zClqchJQwZQ)^3S}D~iDfW%XRNoa3Jh+GgSrSv?nBO`EwLiOsqgav~5z$3DHKDv^&Rf_Tm!YHffqvgVGgo}SG#%N{g`~M)4dULuxuShCKL!9YuER#hYBOH?9uc%2# z<{~d8XWfSZXpmR-(kE>9(Y8zLr@F^?di3a#EL(JEVsG!et%*&`&oq~RaW^x^^fGr^ z6QD#2Bo}H783d1A>Y23aDb|{gW*m5SSToL>JvUW-O=!$}W+8k`e`U#U1b&6VCWegY zUbHpazKM+kF`|jlvR(N=5Qh$U#E2$FpF!jJHOgIt(TFBSpGR0?4o=w#qY;%w7ZbJs zusS?qL}k%cG@@%zUP~B_s4QAm3T-HFC5%Q?7Txdw`aXj49z0@1la&!2Lir^;J&owR zkuDxjWJL7NE$+rAX+#Hl=@Vu|RJLtD@Aqiz*bkf8rV|TMhZH0Ew|l?)&yWI->59Ud zIr_84o626!4y$(^)47ah9@^4q)`zw2!)O}NxKE>b4phAya3ar96wS8rh)H5JF9#~P zJo+1y^gBGF_?H8-srac_fsVl=ihnsEQTi5?uf-$Nct=3;qt{UGz+sBKg+ac%ez$3Ti@DNb|Cf!JWAH2Q;P7A9Oc0D{w&!{1C^R?h3WS zwk_F4;^Xm6nC4`6VKh)zg#MRPQ3FY$$qc9SqB#YdL@;W@e8ci_x;{HF@8?rTQ1YSYF`MKXQST)@5?BRay z7x%s&D0UJxjq~SzaqnNC{03nh?&p4SZy#2;#{uhgII|U5#z*jvt)bzz3U_yn1sdit zTh(wmKqHG~UZmLSmkSc(0UL!!NZ9IcBFE>TTuT^9xZOXF>TgAP4IWYdcE9+?Jt%(@ zkJW$%)XohUP-_^otYfh)s18>M%senL2BSohJa?QXxz;Z({Q}Vc0FPK~tzTUF=P3V- zFiNe~FE0HV%6}k?B-i=Hr3V*)T|7ea97Xahl&kSLB$s2rFp`xG^&}ZlDsVSQKIC(h zda*d!j#Du#rF_UI%eyZF{e^ghyhFa3l<3na?;(uj9r8)GXbi&*9l|(Szv7eahe?2) zhDRpr*L))7IVhinCkjGSs|kvm2~HG7b{xta-&-zplWsc3-PEcm%V%RACb=`BSJ9Yv z_vg49i<7CdjU@2P`D|71^*$cElP-rQoj^nmWCS*1cV${gkXuBMDW_>cPV>nT;^km^ z86FYjG~X-=@*v8O6GlN!^GU{(QHbq%JR->HzR}Ej7NLAT9ueeBCCJNBz7&u1^8#y$ zmQKxh7tuWhxf=Fzt!{dyyQwWmx$>m51U9C_Fypwx-B=5f^+zvj2$h>=kmiZyC$o$)o&+T}`-wt_ak&`!2evL5t+ad2F z>fui)|AsK?;T7*_wkySAZ5SS9&|dkK!2*=$;ZX+d6@$JEtGi(DPlwkYvokc2!$j zyOa8EYipPOdwy6mN7}OSPwjp!tlqU^aH%*~tN78dwtc9$7>)Z?QS{oL$lny;xb&LVJA9b2zS#2 zAuPuWwsMjcX^Aex*^vY#f;k{p~85^t7MYCI`uqF5*Mcfjx`$thJ>|Q1vv!!F~ z#GI1Ta-?JbREP?=DF2)!q8bp=7TNYdo&%H3!3nA0tbfAXe#vGM)H_Hs3)eaYiU?2< zL2!+)oOE-j43^86>0$zT#fGRdHbf4tgNrmZNJ(C?H<-48-EdG60A+5o8mbv{5ZM}o zb-qJ0l^ba&$RA<}%+Hu%)_P~m@!|&Mo!&VuxJT(Rf!_6}+xa~ucY6KVR-p1uZ}tEd z1`ILly+g*C=XuA~;BC%)yv=Vh>vdnFUbQ8PPH0Oi^ffK;F z;lMfpVxWlbHIWU`yCxDNI@gfMh`#e8+oA8gNPOr!FT8IY#1Yp6R!i7?_ZV>yLL5~b z&UGC0hNj>Te_9e=p!80Ny0BU0K8c9H%a*ExQ<9Uq) zP?nTp*2w_&hbE;2?Mo^IjkjVd3R7pO!i*XeY8Kc72$3Q|AaJuWD6B<489BfPVB8){ zzWC=HJ9V< za%f_%cfENnhq%_fJA4R-HZko{;9``Ras%EPTEI;U2vwG$vC}^aN4fk%OJyh;4;4L~ zfwwc}==h;H(fshsYYagBfI%2w(0O<}Zw1~~ti;<&kT?eQh%@dbv<0Q&WJ7sM(W3+YJ539>dq0a z0$6bvOU$$J=}4zPDC)n)76dE2Mt=<7e@)0{HHn$Plu0ln8~!vn1qPKuaD5nf24|TW zYw+oA45(M23{wt@fgobw72!k-1Q7$T=s`p_h{z_m7a|A_Ct?=j*_F34(bxf;x?0o#JtwS@6BKc-+Fkcs3ah4wUe2=B?d7feE8P5;G719Tpn!>42%hZiJv~GlCP~Hl%#PmSf z&k6WBC{ut=^IZbo1#t>+#JmH#^WLG%06N|2xr>0iK%#1KpXW&eo&=Q&@I6o%Qg;M- znyeD&sYJ+vmNzn-)*+nApa2{(TRi}@szCwR>A8o1d(@x+$e?xhpa96AYV!9_!GHV_`-bng7gAY=v61Z=BZwe3xE)D zfe;3j80BJ=+&LI`jy?aM1IRfqa6)~-gI{8e*p$xud(s$!IMmjHT4jbSt_15OnA7$PwCWd35H%M>eH()Cew#$i z1yS&|S{M|FnhT!d}gNt*ywPFMluu4utq z3+S2$x{yHBA%Q^9n1`V8Dod{-6GExm#D7qr4nYhw&r>wlDVpbj=7;DG50U11p!pz6 z2TAih(EK}=en&yhgCIevatj#uOAwgX$OB75PQ}NB>0kmICnxyR#E(PkaVsE$f2L4D z;9NzZvPwM`74Pwe)ULs@obZ1xn7rs74M5b;Bt5)M7ou?CGP}Fv?$zS`k`d3*+Vr1? z?q0(Wb_20Cj3~WEJP^bug&~NN7J|U%2$`)zf0~pr=sad2413{Xye$@g`VYMQ2XYgp zdo|w6IlW`{z2Yhqu0rmolDA$k)dCaRBB(5E0G$oCxnGRJ#VW7yt^tCOt7{@;jhCQ? zNf?V^#!hh9Ny9*az@^6M?7;Et&=jb9CZKVG;@z8+gF?=5yQd>iZTpZ$uRXcX#iYj-C&{14QgDSd4a@T7}jg# zLJGUgmz;S$Y+)<1I2^7+O`YsoAR3*GXmpT4=^&6OS-fPTOAlF$fGkD`)sThsfvcmX z2q!`UEb4Ivf#*RY1+0d=Bd!7`S8dU}Z(%sZgg^r7Z34it5TKV+M8!20wqACHE7di~ z7|=iF88Y(>MNtb38>!}v&@W2YS(~+*H(NjwGDxCuC_N1fp7xC5N8zaxJi?$tRcE7u z2n3ZK(G(*0r)EDNjOFhnmpe_t4fdWfpCiA|k?px*Y-3{Nyu6XrqM?vqZ;uJUW@`&g zVGFpB7J5Mc4!kH+c#yGMCw2cjO(6;FB^|}&>`2?Ov|8_=LwaUBBPy@G`6 z;fk~DT_{#?QBmWKdD!jwn&J#dC1aQN^j+q?^p<K}dvs5MQCX^2Q% zAKE&r;VIQynCWgYzd<)Z^79Q7(PJJw|8*vTuX_$N004d%p#Xq4J#Vx6Z4Y++YP|1o z#efZP{pX;q^;W;CqtUCLPDZ0nv;-p89wqxY9qNRR`8FMJI-z4e=s@>6>CRp7P#@Vk z!02I-Osy}=5OylBz{f4-F3t$MxRgEHdxK{yLs96@UXCLF3zXpleX!@k#@LW#V>{0J z8_SL;& z4rwS<5R#y(!&ZTy0zgpJ*{A?`)dN(asan$``I+=V)RI2+=+jMl!ne0xl^{iI z7+B#I?D$qShJOZLyvAgReDV~}jZN6(xC`=^xj{CKS4+Je_8Ji4TULAVZ%EwfU5%+* ztM_qf6aJ~kR-oi7y zS{%ZK(&rx&@MC0R;_O&R163bFu7V{iR1l${;(4B+0^lVRs9?zo6##;&hma-5mOiv( z_JJj1(4LkoGcl1w2>De2V98S9Sn^ac!jL5|XmZxRsF>3WDgXpk@6wb$G+7Q0lf|GtqnGh?4!w4(m646u`F2LA!w5hGam{alEjHZ54k*bu*yL8@0I<#4VWGhej3X@~ zQRPC8xzZbQmEM>{RO9eau+4%zfo?ayDf@c7>S@-rP(R;tBM7L;($~blQ zIFRU8YOW5N6O{TWhIDGSMWWIh5|!Td=q-)ICAw84x)oIs5@m%KU)`o?B(Xd98B8!DB>OZ6|D3f^C+ju$Ulu{2|~b< z<&eel8*~^DbhUyG2qdEb##$V12u1(|V;_NH22jlqR1otGjNlBrdNV^2S7)O_3qhp< zg?|M|^ctL+t8x4oL9ZqkfzsQwk$i5%A_WCmmd`aCu}73(zV4bPF@^>%Lnq<4KNWn)t2bxv$}NLVvZ zO?C5-O{mo0f2}m)S{xUNluGrGA}A~!=R8h7D9m4g!UDCAZuhaZItz@> zn(b-H_s+KOl{Gm@f`b_6x~zq;<}~$g9sj+9Yr@1na3E^ihXyYKPm5NAUO4w^REK<9 zH<$;LpEsYbF`v!A7Mu0RXC_0JlPjppidNbRRM*P$S6g)v`&B%UEG!Z87AgNr5b4+h zUNpg_u$IzG5rQw3V-1|~&A}Pp`&_ZVkK;550ycGoix!^tAt$iKZ{u?C)Dq7;@1<8j zAy)v;JcXy$#smEvA%c*C6bc7H9S|r50SB((ysQ0B$f>i@K!1Wp2VUY}@`4L(z-_Pa z^_`PK5M4MKbMG_+4fk?BY-BlG!N%eoY%C%;;H=ohDcl@ytF_KTX`Lk-%@BiZG}mCG znfZ=F;ri5kj0O8+f$eNy!*zmM9NGih*$Nx(A}MST#zr1k)Z)Mb*iJxO9kD5~2*Nr+ zr~pD?osAQc5u7-h2To}rb-_Y3CRbJElnIvazp2^d#i>>93{b8 zu(>lwZSK?{O%yFbIF8ZqMA$uU0+>wDN3jC8KOCG;JaEoeIO}YjVCP+?Om*H5csQz- z{Oqgy$;L!z&l!77_2?=Cg{O7z%9{CIRM}}AaEt*Wo%G(#;{-XC4T;7zj(7;L&jEJ5 zll8v#i}y)ijiT?1^9-Ex70x>BjtNfi{65cx>u@gIC(mzlbc81%rygB<;rV^x`Tah5 zzLz{d%#-L4&swfo;0PD7=Xi@t@K!PkgGHR^>xQz&!hnp;8(f*I@!n}Z&eG%N6D&Pp zK1I7l-y5(`t+uM|WgdPTPYL6XCdj{4>dR=+--Gn`PW^4~9NOQ!6vV$Z>dUaR!>zik z#xsnkBFdw5nZG{bpZ(2Wfbow%spFrG$Np|oV8j0A&z|_l9|H5QTYVWv^*4Wm&%fRJ z`+Ze3KGfg*ms$ANqQC9(!wPJy((uUgVO_sV*W2Ztx{S-@^2ghC{9CWSj3oVS%fxzp5JjwZ#(PZxvAY)n83gr9NL(4cgULw?cbVech{Y>{egzE8vIf z>m%Jked*G}y1N2~mkz7CT?&~l?Np`VLeK>HT(8La3rAL6(zJNw+?9(j9eLr3OBxofs9$x-rHd|HJhI`Urs9>WE*d>* z#F9%c9kF_4BimK1X<5{`d_>dY)gxA2a>xZ*OPyJ%5k^U{kK|Bs_<S2Ai%BLD~q4x)&n-~~2-@oPk%S1s5daF=-FC<44-N6 zKY;~H`@=}nXQlh1{HD)e?DP32`?B$B`A4}yrhgWGziFDGZU;x3(ySykHQitQiO;+! z7}270G|;4``QnH<=o?{pyk;2&um+a-0)WL?i=;R>D8(p$xi0}=pTD$^aw+RcqE)N9 z`23X`(`CiJgmJ8iwrj>njpeuUi~Yf3pPA!JuNuTu;%lZ*lnWxXA-9fk4-Glr@qHTd|T0=s*F^{S?2~x zcw8~Dk-H&%yhMoi0}`6yi^VvQZoogzmxR~YpwFC2e3u4&{ZRJ#r^>hGpW-w9sS!B- zHcBaRWJuTN`l8V-KuMMR((&3q=o{;=5LU+)3p57MXxK?2z6XMAG@x#aK}(4M(IwVD zNyg=O2HM5?%gy36UkYA*{xPNHEwNqFIm7Ng#({zNvnw|frNr#>iK=CqIf3$ zX+Iwc8AXwmE28J)b%-{e$-a2h_AmCu1bw3wdC?$`z^ovePZH+%od!^}8k7=@8KsP6 zMG%)`-InpX9{NJxFg5hBRT$4U*3fvxCp%uM@GIjLhmG{)Fva9G{@@G@Ag(zd)-*&L zUa7D?FXVT6hv-9ynd{j6fzYN=9i6ckKgKMG`$FBPx+rqRKgX@B%i zGv60;3OH{mj!^LToFV(Ltx6?H2|$H-nwfacf@Ae@Yq`}4eMY#BNUa4RhGKa%j#-*yiG$9`m z9|m+vvAC_}FF(&Wl)?)7Mh59SmOo!iD>>-P45Cyno{De-ANI{8r9of0Hp9Voo#h{G zcY-1;|9N&vqZo{Sl|kRQpl?WyFX|NEY#`@QgMIm^nF8G*pdfm&Z{7mYq6L94+E~yg zqnhPMIG1lk2!AS#{-L!&9X_ngVt=vUN(=hNqX{S+E)=2-{!6B`fB1i#wSVmlpK1NV zh@7<^?MslyT!I_~3dW_`LbKxLmqw5|GJ;IeA1RHqEbh-U^r(tXJSG5HBYltQjAIs{ze3+Ot8dJeOBm`)vXBm>C^yO|_Jl{BSEBzl)G#gk{a#^S3@$R8PpIy{roUS&+=|>XqK5hOPL1(khs8n z+Pb($AD)rU1`vYs6nMf3%kYe_`kaU|JSMCjbE__=@;m4wdH7PJAuUn0{G1W;%W>rr zE--N+C?%?(6j%pG8{4Zhjr)9OngPE;NLwXghjSjHC4J38%+-#Eq>L2|n}EmAmoTxe zLZQGHeY*G>LheA78*!>ZD+J7*y=A8Ar9F6w*Ss(UI36zpt85XoUNjaKoa4|sx>)CJ z>v}X-bo$Vi0UHSpVm6m1%Cqf+F~Y+))3lPTR}s_0Gq+b_Pi#)ajekQ9O8OTxr$|XV zDqd0?ZViz5z~JXd96HCe|9L?pV+L&1YFrYsR;6r&emiX2rc|ziIPIw1HwL;)LSjLi z%#+y@YPA;)m{O313(6B(l4Ba5!^#&lo^3Fmh}7v&oHCn9?kH3u7Ku3$i%&5bnU*C2 zrTO|PcXxu#iOZ!C?Q{An6RRClA{${zqX*T~zH9Ebg&BjzX3&4GS!TtUvt%WQg#uK) zxL8f@j0`!_IL^u}LqM(pd!syou!Q{f`2UkeX#3;mS{lfSVAOtYWR(8H=5XS&sk_n1bR~Wf%V^ ziRZK=CSlVHR-u#l1q>M2py4Egvzf3-=6`C$7$;F%Hi6WRj!fKnz5>{~9pQ&@E>}4^ z7Fb-eGF=yFo^L*05!(@CQs&F*9Z3UH5w*CTq`%eNfM%iH7wPf@mU6P_2*o9KFZ=xN zz%hb2U*j&zJkyo0fT*+?vI2_okMb|^S0FA%BO$>CpWnphPc8!BHESgTCWb}8 zpC#%D7^dG@81&yxzi0ec>o;UvVfOKND0sgAtiBbT5T@X+Bpu4ce^peU+}o<-zjDt1 zyTW)x7C^_zV;ZMkI7JQRt6HHK@^z$4TmsGW%|nBJ*pEiyh5bNo&eKUk`6KsSxF1YJ z$n0F3X=t|(zM>k)vV&doLJ-u1Mvm+|MlfOxDr*Gnlx6z4-N<1S5CkQc(J%EP{=v1y zp4c#*y`21Ss>OkdRMrTi@D4kuF?w%-ReXmx~Fd3h}Dl}Ps(XFq9Tw39( zkQK^u7{-LNoA9kLduyz(Eit`$z7F&hs7Wzwcg$L|#Vkv;7u8rUpJ20W(5l~m-7ekl*vN4~(#OJvG;C@-+7uhenO|7Oex2IULOVclM&-wY(e?>L&h_L52r}bsG zBC(GVrpWN^wn4YJ6p8(OTanyL`5(CBcB@h(cJ#F(du+G;G)*b;!qhN_T)>$?JEW|4 zndxwQxaZQ>*?iMW-;#)B2Da_>O2XcU3ol15g(H_KpI45U|H6FKUIj+zdg$3 zw)4W`1S1CyL?RMUxNLmc&1SK^f|mIx!Ky<19Tjnce1H1Cois~b(mea*q!|ZkI{Oh? zno~uZ;oA-yGi+&w8>f4=h%nB`Ro1_lal+JKsuH49=EUtdJ9j&YG>+3t3QmEf7Y@Um zLH1b=mt5u)^t1-7;%vc*LS04~bZJCr@Qxx@)OyPsC%D#6t?4qu`ZC|GZve;=kWSU$&lHE7t~sJpadV8D*ki zIpZ8t?u)9BQ&-fXDbD$cC<{rS&$<`=kY)_TfBO;}NWg(F?+jmmexWtLaC*x#C@=b` z@?>8^Sb1hd88=pRJt)Bf%sFixqAvbmcZc-zC2F1xKZJC!(bIWo2A zxpAsf5eTEtU3Tnqu^IyCdzT&AKM&WiYZfz-jmvzglc~tnk;#OpHvva6ywZS!INnR* z9hEq%hLW?!262C3sae*~*{hF(;S^iX8kp#;(~CX+Fpv0pcJG1lOj~v$w*Ok$>9o(0 zty`9Pe~0XfZP}GYBw~Hb4%bL1JJ-zl4{u#Av9~T^^(V1)8E0LGolE%2OUB9VRjQCk zw>qi4%3FHuWBII4uPVcT+Q5Bv>#_d-=ShF3Cv6_^f1ZRW^w07n*Cz45q$fQ*P?3!JD8y;m#Gg|n>iB9apsKBT`rS!XpcA}JOIizD^9!n+K6)Bcqo_D$_MmJ zt@w=;fRnHrq^g{Q=_uUR#qC%>W|7PVlCfYCnpu3N%;ecR^_VOO<+g{qRe>8qvAAwg z1oW}UWjHk@Fgqz#SqNr--kK}GO=@1I`rg`L#H#m}K}uL7v4y~^VmQ+*lDQrx?G5`<0v;<3(s$xCHr6m)bvLp(V2t=6{v{sym8(?w23GN*X#=qo=f4 zVfs;7q$s6C=AKiip9;}S5nuaIQIx(z)Qg^7C_hKfu$Q8fV1|Sb0V%G9ov0quFg6UG zy&^0b)waIduqWGw`5!PVTw%stc-qy6R}}|6F=6xB4^R2u_?_U1 zy|8D@VkpUXf>!AMQ;(qaKh_x|m%Crc88@#j4p)gw5C2Y%_v@aH_ePGgCFf#C9Dk%j zH^tFPP_OvZEqh#kk+n+1)sT;Kc=uc#bKr_h9Pc`sxz;k;+)%m4%e%)V2q32v%V9ld zHT#Mm*PXn&%v=2U5re%Jinyb7Q!a)`l^}!>%n@jcA8umx6`Fq2drm8(LzBul><-EZ z71)ooS6l^Lx1EPuQy{NDYB8lc?{U@u9jwj{20d0-tZL6yBFmLu1R;9!qB<7A_*OUM zK&WMbjdTJWXr4{vnIH2a6Ma{0Jci`vsg!pvHh4KGOhV zA!-YISAfjqtVdIDI)R0l84)a$B9vj4vUCW zQ&AQ9^Nw#8D#}OVR~_l;q0GxVXw1MC40@zd)sJ9dN?k*gwlTP0>5$4qB(+q(X3*Dv zhNGKoQcO;j9U#dWM~c%(dQvJs2tYyt56Odd`DcKoA?asA3BIU{`4zEWailMUd7#*~ zXeN35%?I--_isPcZ$8xEbSXdTX%PJ3NU>zLviIcZiNDR$dos+`iPpaP02gs(X!v=Y zzc}cJdw^=wKRNOS@t^ym`MUf*{B~Pk75DX3(LPeK@5Ec^4SAGyT;;c=ROaGP@C{Y^ ziz7_2Q%iHC#3D#BU5iuFQx%$&eDfd)u|W%2rz-gi9Xwt>q>cGJdoSU~dy6Gtlym zx8iB4C=PeV#0)2k?yyNoZA)g!KBFWes3Q@xOdqH7$8YLd8f*b)z5FqXulApaE#h2a z^9ZH3Nue;8ld5H2PM;7fEuxetp3y>ci7LWAapA=d&er8+P6?vMAvE=Z-(JBf@!PA1 zLQ&HlGt>_cMM}AHivUX|>0l)V(;W{{vuWwy=_&m6sKjQ559M7DE`JZEJW^fA$5y;* z#h;^E2o4g#rI1#p3KH~S)b=DFvR`;zIlFxWk;;zqeXv>LViTr>HK~{mt<_~tzAvfl znvt#7;jCPtrl~h?idfuk8DhJpn#}Q^W~5E8z- zjXKR0S;X*O(^#=<%mvsrL~>+VKQYSExpS_6)pkAIME$&x0*!_qCKIEdw@S;)D|}H_ z+zi*ftjV%tDaOXu<-Suu5}Y95KTD)K#U@9KisZ;evCsdJkh(C2ut^t`pjzz9Av)ry z@CDRKjvgSO4aOPI#eUuwyz2rLUkq=zGSp4dLd61qM*=6gaqW!AYx~D_-Z2w1q7sdy z6r*hm#83CqA9AJ^6#^&Qj^dnPSm24uMqhL&cd|GQ8?HE~Hz?!7l>TFE`-0dFYgOW? zY+EIce3ve~#!3OQ(_k!pDb5^UfTuk=-+>R{`kXFs0t+`@^%G_Zne62Jwl&jdRoPav zA3k)Fy%2D$r8t)XIdZFyD|HK-2W~*b#PS&@Fvu3iS`dQAU+=Tz`+R=tV+PwBwE2T4 zY$nmI9fPP47Ww<>6HVSa0?>!~iYtlG`OgeE2&aC>*Xmp@L-7~m7lUjs*+4lw2m~OG zMi7vL7Vr)HJ`oJtaSgK{h2C@EfPa=CsG#PR615i$BP6JtK`pTP&piAgP5FLWe>n(WKPFGFKb3G(MN)*3WmD>U)X=kI3V`2HnyvH}@jaxqLS#r`4q zRR>wi7kGJyE{TFF(vW49By^I^_cn~|RNoq~uk z2qU1^kxX>5bF^etrhk#aWk8j265_&dYl3 z5ry@n`ezAncL(annG;4)SBJ%x`R^6bbw?;&;S3k4OSVnw_?ETvBZYm((B9pQ9u(YAK5Ee*8aK6Z z3oi$?3UYlB06h(?S|{tP88; z3W@*Yd#^l8D*wOQ&OAP<>TcsF8Fn#ZL}U{KqDBM^5iu&-1i~ttAs`hs1Tv6lHj@dU zxFDM#sHnKsT3m1|Dq2*uXw}NAwl1isRMApP6?bga;{HC*xzCxo_hg`b|9J0*;XBXo z{O<3p_uMmgZtm=1&vD5!InN*&g=oGWXs0}{ogQn}&$ge~FTGmw2?jAt?9EIA5b0Io2j+F$Ic)UKv7{IngRw4OF5pY=2hf8WY7SCdSWA zpX}|L+^uMOT|;7MeRX1Jd3E)4JT%IdWmIF)jB{%1=2XWkX2pk>SAnLwu69;VMP1YM z>UeVRAk&igj5wZXWsAd_D6dfyOUg!-8rEiFqCC-rXElv2DjQW>l_gD)RZU@vPFQ(x7$FIFTBRslrIEO@hAc#AZTseY)8!ZMaJhmJq=7a1^$&}&}lXfiWXwtB^#U5H$i|6Gf#wRM{4LoAT z*Rvdr92<3dJ9I)(Nia&&1`URZo2N8FI9ToR<_2qVRbx43x3Wad<}G(b0#u z1<#6O{l}k@Y}e4l5X#z)m0%+0B!g0z#!5`WIgygnt0aDIQ@k;Op;y;%-f0b0n9*n+ zRcfnahih?7`H=F)xTYvGtf8R}6ABtw7W9xEA&602o+vM>##B(l;ZVvBU^L_(lv72t zVO>Y6MS`Q1&BO!_m!?KHUYu)cv>P|=jTkp6XXt?Aa)L(<=H%z)=MTuwJ2t0Z&5Zh{ zlV+gK@wxqK20|w)n`)+mGhv@uKYL)m#`=C00|wDjU00syhlduPgxRYChVq6Pl_%kG zhO>{0_p3Q-W_?b-S@>5mr@Ub%II99-#=|nR0@dx;7!27)=$TEmcK9Z3w)VqnlReJH z2+qOHPB+0RVt_qGV62ZCH=@K;C1%>Wef*qSwRJw)@f3e4*ix9C93g zI;hKBYx3AKqiS)MZ)mDdXaKl=vb~!cUGbVSJ1AVgVD>Jp!oiEf0=w5WBt27IQ&t+8 zh{lW`ddjfk$YULg#!fuCkxPkw2@JjI@!A=c{qm1FddS#`Wu?ww)x^4)2{d}VZ1R9q zMs^M2=2LfAMTRkFb-NB2SzcRF9e4HSD4H}*<>4_NjAXYaNe;5)A}4e}(cMnWY`nx= z*IM=Zi+8#Wi46FEgVNOLH#G^{6)i*mk^AF z=m{y3mRvNacCjTa8Zy4btz?4352xMo1O{5ITPrso$ZX^2_~i-So=uaPChLzw5_3tT znv&_mN=n9;*z2%MJmWrNVR<>gjEL998_KJ>6t$zkE@{i`2h?brx~!73nO(WCaY}ha zM8~^x4$9>%ecgPjHMJdw$sM9+5HB~=JWT51pbrg-WS?!d=~$Zteiz{7Pnr~>e7}=TP%xRhPXvpxtaI1%gPzD z4;=qX|FzCP*98Yx+W3(+MjK}S!8Q)k!@jlYeb+hPoKW1Lz1lB|Ew-iYJhxp|`yv$f zzwrsTO$B12PZr|G%^4{&cKoz(pYyi}LVbxLn0Z~htPU(fWDMa?w0ys7onN>d{4Ik$ zmE$WfE!-dc&4VFXy%)7z+-6DZOIs~%xeULRvfQ>wUgmS{vU;Nj!~W~`=Kp-)AMTSK z$h-M5kXhmSB<#C0y>C37FMoR>P24-u`PQfRU6al?h}(Tp>&2~>w7e8Q&azBxF}z(? zceF*g5BWO}ULTHieG{%1e-|Q6S?_lF|9`{`AMaajIiqu2IGw*s;m?8L^#8Q~>NNXz zM4oQr_`!U=kjF>Z&fmKj8O$pt&pCsO@EV?#IyNiqu{j1)&!(5zj=_;;BC$GPAD2h_ zP%O@Uz78KZrFOs6@$38gI$Zt*L7tpPBW2+^#+4=Pe|X65#|^jlYU>y6FW)~Lw=#%p z%i;U|Uv)SxfA=F@J@`8yu-p8?ZOPvS2^|lSbI!OlVd0IfFfs(YnRogXrIhc_G}n#1O9eNx;Ef% zn7B3w`|rul-#SU>-!&9J+*hq&-8wmfcFzpJ=oU7#Fkk*0PQ{(OVToU3;L()YV*GuE&=$kb zGaMMw{Iw>I4@T*QS0;bHA+*KtLk&^?mgWeg)4u?(O#YBVXp7+&Vxs=74CfH~C-BNd z`Y5m(uV8Cs#^4Rp+25JwVpAraWA%lBoBofPHeUQT=3M#LgPBMVZ!y!>^KWY|kw52v zOr(dmm}%$vw==(%|7tK3>ESJg5fH6!d-E_HSRbxEGb1B}KZ%m%`Dd9e5&tZx)E2`p z3`OI2Fkc{<@h`wD6X|Tvxp)N|XW7&iGuht$*#>`pZTIIsnMmjU?3-ZAc5f_Wm^GvM zcQoC#{{(nsMrKvkuaoEB$($(v8>~N%*3=fm=!?ehoJz#InCarBck$A@dFkD}^zL4I zcm`tp9$tEnpgq~Zc5}bf6sVZV@%(c<|D3>4|Hp7tMeE0-EVae3T8XBIXF!(ka4-FE zo8O9Lh{Mh4YTx-_rkR&a;hPv%-_iKF-u~g)oBn+~|323LjAYb4hU+iwP;w=>N`bGqc15f@R!zv}3f1Zt3 zkc^jSxR#;};w?_?Z1>Oi_RqKbZ%=yVnPbJkhlLJFTKD^FR<~~vO;z%aBnPQn0=$|af0>Vmh|H6oZ4b$u;)M6^BUV5>YUTov7O?nk4-|M|%Dvz4#+N|IwcRXfHl~7b~>IaQ2J#&lu~!Iq5UTe6I1*6}C*XESbVLF*DBF zf1KTaRkA+gJpT!v{{$~T&g!WxW=cGNd~Jqge&!Fh;0HsUikVW+AD54jn3`ouovURG zXUS;&dDcvAF*C(WpJL<9Pr6J=zT=x1j_PPU9_6VGKS}1LPfaD_UCf-}rKe^-I>yYI zUiz8ld-V@%mWlN67Q<>LS{|-$Qd`VS^U|lK67eo(%Dwb*vmcgtZ2kp!Wg80|lhG!9$@7duDG7|#FE`ds3rFZ9wE zdg+V3bbmc?sh57KxBoIPeVLcO+)H2XrLXYPQ!6_<#?0kj`sLpKsg?}LJMs$w(S(@jhY~;`>7R-;eR`)i2r8&m3v7R0g(YdBvnsZDx*1z*2y02L! z&FjJ0roUMS?Kal$X{ArF>3L?G^e&`jn|$+c>94FFX!dUrl#kbSv$5VgRC=A&1!kc1 z4(pHgn)FVq2b(jcxem|9`m0g8-s(cLG?G5V+#-$&9% zo31T`@@}>Jk1++%Ze#sNDV^);Y^+BrBmNW2V(Ha3y~Nxu%})Z^STFounk&(4tOvG8 zFS2@y`Ba*DW#jygzr?iXKXf~Kd#X7kqR%jcBf88?iRfu25z({EvWPz0+!4_==E;bz zHCrRP&U_xx^`=d06ige-+yxp{$C;4jztkKpjoqM^o5F}*Vff3p^hY-!9mjjRd#!p0 zw@ie-iVePt48Fd_En~dHji%5oKD{ffMPIqP`z+`b++h&5gl`6;$DVFNV_Le~WobXn z-qM@)=8{x$v-?h%6uD<6b?aBeY;UDW#YuakY$`eJjm1n3wFbVIrzO=GGT>|2z{`C@ zo%|*oDZ$s-+%M^-@A<=CHfFlrZ9;o-49HW@90N`Z*pOJny;yY z-BJ|@-&q%=g}!6vSJdtnEBAG^yFb?H=nbLGZeH;3WeDy9bgh#7HeWrWMoF53ZfWKn zn0;r(aNgltgrecYDbXC7rzn$ff}an+v1e<5yay<_6WBG6m$UO_Q+ruAPjY#OQ0 zB-*E*n7Xi#^@c&$((}T8`5b+hkI~ zU21sep!FiLwKKd@H@Ui^rg2Xn&E*v;Norr07~VCQY@6R3l=ena_PeT`yeZNZF?t`H zvj*PY{V>r)?|vSaXp6mv9c|hk_Oo+}yPd=ZOWi(~ys^Y3VF2zS7o_YVkM#G>1b4E8 zZ(d;@?9XPm>8HO>tC<@NV|j0|D=Ty`_u)KSjaTM=#?+HIX>;w_?o(qw&9=k&xHB~_ zJ@=N~k=JC};VS{FyBkwTeMoR^u^qJC59z&VhvwBVrcaS}ad|C~`8mzC5%taFX9ic* zL0tIfXG+=&NyNE;MEvW-b>cH5^5a5+emzL|^&$KGALH~h<|oEO9A5ipoLt3m?KEBK z3&a~p5Ri~^B9-cvl++6!zC^o4{^pQP6hWvoM*NF4v^!JYyQmBjX{^&e0fcTe$SJLYt!Lp z)6p2aY#@tDwTz?Xo5A`=B`fDJ|3;z-l_Or-7C_mHvc!%#f9*St= z3{pIPc4E9~idU$3w*649N2rnh42gPe2id-b)X3NRAwTEm+R6D1m!GRAKkKlaa+EKx z|1&Q0XFpVs=+8WLZ-N@>_mgZy?gziF%AezidbISO>ch{5jQ9VVU%39tuMf+8fa-^Ot&)C(#Lu#A z26;SgAulob^c(o!M54YgOWWfJ{z3m`mCZ{zAIx_dhSw6@%vZdTHeT?Z zFw>{YUMuz%`&(w1V(D>Yc7~ZCeFoVv!=9(u&KFSQ@7L{l<2GY*sKJ>eCbN1He)FX- zleX=R^fA(Q9z7_yN2VPH8_VCWTL!L{1pC|kHyT_W544Sg##v2`c6x|J`ims&cKpNs zmF$M?hW2PdqMiECj&hwKR**Q)eoUf%_-ESv!I;Czbvk}fui?}v=NTmGjUiy#{W17# zO}~p2XAueiJ4nQ_aiR0M-*1EYm+8~xKUaPWNR;ae@jc57TWO#pPdJhUk9b9Bw;9pFQc%|ZhO0Q6yjwJfO4Vd|N zV-Uh*?lic55wMfkmHZ%B4`qI6%#pHl+|z%sh^fo!k>X^L->%S)^(X5^Ud5(n|C1|3 zUj3xzJsjly;_KpH#ZScDBD&c6A10nEo+(y|P2!E>8u3B#N%0NweQ}p)GJ||tiS5N~ zv5S}|4iZliCx~Z?XNz;hMdDTBE#g}7kKzmBE8-jCHj&p{*?wP%8L>cTiQU9p@mO() zI9@zMtP*F73&n@TP2y|fU&T+wZ^c$Ef^r-n=7{~pVd5#`sp4rOucfkHGsG&fPHYnA ziI<4H#>)Nf5bqV&iI0f9)=IyZ#ka)|#jnH+T;rr)me@_q6^|8%h~vdG#42&NxKLav zZWgzR8Lfi+4ifu`Cy0e44(jpJGsG%#f81{*y+pi<++obM;!U!zk-kTKK=y~peX!n@ zeocIrM4Z2gAISct^w;9|vS(oK#ZUa24kX&I8;Si75qrzdYp%2(BNoU$Tr3sKls-eO zlD&~U2F-G7^OG2B8~A0BuxE=0$=*x)aPcS-@lFvZkvokkBM&yFR{A^=@h%h> z$bPx>RpNEB-zvREyjS*zr5_WYl>H?V`Mo9mF8MY-he`jNME>842Ip#)a~~4+{ltzW z_Uoba-sEc-r_v{r@E;D{ddxj ziW^D9`yZvhNMe!lj`Rm4;(siDA^UgIKZ!9M^W3k!c$oMLaWaW^I)l6&^^u-UBL4Z} z#j;-}eT8_9?6*kYCf-FN-h)bil-z>)NWV%V{u|=kvj0Q+Bk^+*`~6$&&_2+8#3B;q zA3qA0`p+3GxXXU(#=p*zX;2yX>Dxe<6M)`_Ixb zEX=rH8xnC3kUmK4P9mRU#Zh8~SR>9BFB7j3Zx-((5&w527G2LszeFPcSH(AF|C{tb z#E(hrhhO`#>_j47ck*dtj*=ckBHjt&FJvDrJx-h``&rV{#aXg9NY57M$-YGTGVw|h z`QIyU68|E8CT8Fo1O2**M~g$nQWEt!oqW!iD(M7?`pgwClzpl63h^r0ZP{r$cNGsIkzOE<5#!=)68l|1-eb&i>FY?uxk>zu?DtCF zFaA#UC#9bepOgJH={Lo9WdA_=WAO{wzmxt+jNyY3%XP4rFP4b2#6=|PaRu2MpJSx& zCQ*;I;)AkplzvLwB>QIRE#hBf-yywI{7m-U(m#k9_)N@lv?q~o2k}4><@$wKCN3B6 zCb8c`WDf3?kbaRwoXz4JvTv8(A$}zLSJJ!1A7yWYH7et@7xyQTUw7#o@i5u*qz8(} zlPFhQTr55)zDy$CR`Nw-K9v3^iG05izn8rgZbqWLowy%~{kux{5D%5TzjVHMoa{rS zhl{7kK3V#7v5Z8yD#Zojb>h9^lj0jB%JWxpvoW7be@mj=KZ=?7z)rt?N!a%nJIUTt z`Y^GN?8izUFP<#>DCx0c35oox#UC45dW&gGGt>T>|@_$_1B7QG+$9G>$&l5+B zXNhygD@oMnCUUzm_eifNQJ)Rsld``+;v(Bt>Ax%eL-8}&cayjn)*5Sn#?K}Zuanqa z_Cv`HxXveCB#tB>G3GSsnPLsO9_I<^<>J-kL&n@Hy-s|TT#I$1^c&(f@-AaOk^WX} z-3@k>x084GZPTBt@{crIH*;{uH;_M@KAdyd367}mzUW4%=eIki`e<2pjK3;mFI7Rju z(zC>B67kMg`eJe=jx*`skcfY~c(?4olYUg(NMgUw#Mb!CM%`8HL!$i0l2_pRr}TId z@h6HEVx?F^!hZ>g{jVaI<9i6{-;&t>0dc+3UsC#8QD<;(6lL;;+Oz#Em5K{U35MJ|{_UCsFPl;zzQ7 zCB0kxQT8^61pe*C{Yk{_E}bJDMk1d=ajKXQFCwwuQgVSY*Gu0Bq%C z$o?nkm&Mm*e^2^-@k81FDgBN3J&F7~VGTj{5r>Ln#7SZeiE_^&FT(hdzKTS-uN7~S zeU0=z;{CEeCjEr?jO;H-zbd{-BA+kC_B{iAn0Pda@|-}o-ZzzeWmm&@kZJ2kiJ{IPxcMc8^xz(e^Gj~_=fD;rFV!Qk*LRy;{Lq?T_Bz+ zUMOBeqW-s#bB(!AdIO32Zxo-F{YB}`;v2GWm);?MB>Pv=yTu=6Z*yo6zrDCWiE?z8 z&JhojJx_X|csz;njumUfg(Tu!K{ny@g7n=a>a$jSQ1*?|Pl=mk-z>dF{EO^6q<4y+ z$-Z0q2Qi~}P>%K_^6elVD0_}{Z}CXk2TB)+Cy}VfsbXAQA+8Z$6+a|V|9_GV`1<^? zK({A%pd8|Xvgb(m7LSyDpmc$FlI$a;$B3uOeunfkF)n+(bV58&_C?Z5#mh;Q_g3*~ z@huYdd7rGuaV-4A#JxDAU=a4(` zeFJ$m))&$@lW33C;u_i4Nv{_lll@ug=f#&~-zvRL{G05bO79ZCmYrYJGT#AvCs*#}D(io;0MZ=86(c%}G=_#%n?-XdpV-6Z`biE@1{ekXg&K7qZh zm_=g$F46~!y=3nvJwO~Jdy(`oakT7{q<<-%C3}^0jo2Xjh0>RZOGwn?O7ZvN2jUMT z%G>%VumbA~61pde`W`0sk^NZd2h(V?B_~1iRa6{SbCXwh3q#< z|606F_WPtC6dxf`k3Wc?h}nGudoGFk9YdDmbFlPS67@Y*oGg2}bX+`J_9p4`#EWEK zCVjbhwd}u^zE!+a_6MaO79W>=lk^KBAGF1C|3&&;@qH5Y_(bg7FVJJei^O}ySH&O1 zL;DB*6T})4`OGEDjJZ_$Y7*^po%k!+@07k*d_eZcrJof4DErIOuZeHT{=W1F;wQ3y zBmJHDv+VfMcw3$<@cA&4iTsPn)9|@b`YaOpPZwv& z-XJ|&oG1Gd>C40`Wxq-K7V&lx`D_q3lgR%aaw5Kmlm41S{@;o}$=)_Uu7L@@vJa3xRy;xWVbY_-akBqX`b=>;iE^DIUMD^vz9W7~q8vYv<8b}|m_TyA+{xvUq|WA;=v^H zKU_Rjyhyx7d_nw3JmB~sUJnwle$oXb%0E~vl6{Qy1aXq=)1)iJD%lg#bHxi~Un;#q zyh`?)rB{n9fT;+0U20NL)ywTr0%K#81S7(6>xKSv*U;Ong+_LZY7U zkT?f?Ed8x$PJ$h4jr~aY^$?FFF;^8x4<*qqBg8REKU3*dB+l&#>5EDDFBF$5{Qv{| z{+O@DMsgoxZWRASw!!^s;%*VQ3fud;c)u<0^RoAkf^(>`_FW;~Dn3Hy;{J2-J@KDp zS7Yq`pp5f|r^PaCsFd|mvT_>Gv|5`NF& zzAtfs_>lM^xf<6$S_RA{(McubJve`e>%^x;d!HfFcT2Zy4gcQ3-)xh4(j&yP#DsVm znS<+xqP@=#`bFu#i{FafFjn||?M%_$KL@={dY9OU;;_t-2ieHQNz9bCVuiL{PT)A(+u2})cijR@o@%=pc9=`V`x8b!PUR!ZLxoGce zfgUV9fxHI&E7psblPmH0UCizPeFgsBNE|~h$9a=niu*OhjpDar8IDD!+xt2e7qMtn#7Mzr6H z!ry)m3XboF{m;gIoZ@5RPvQ~XgY-gisyI(vEv_eL8S}c>19K(y3~`0HMtn+qPt5EA z{|bD*6RX7s#ka+OiCO#}2>yM=Gstp$4=z3_w#D2)d%k#zSRq~_-cOd{ep0bR&p=NV z7m2?X9}!;{ez(t3`546|+L3_P_BCey;4jzTMki1fS zLHu0IJPhgMaKD>aDn2ZJA=>NG@XI?K{-0x@`UHBqI8VHjJRW~fDt;&C z9~IcAinGO=$U*qK0P%D2a9%HheY|L|Ye8Q|JrMU(l6hDU81Q|Z@5q+H-wksel0&_Z z{{9SeAzbZ!`~~De_`E{m*c(Y=tWO|wg1<-R`ED9D+N6?1nd-^@!Sh9#?|ka~;P3lb zo|V)n-wh<{znVmQ-A$rB*O7%-caZ46r^peQugOzzejza)wvrfM+ewVSog~KZE)vJV zZn7NzWq=j9f0dkt`jcm){v_s)9I`(6`()04dDNH>?K*5O>Q6mSf5&?f>QB7@^(Pmj z{^U~BpInamlUJbrrsF5M%16Y8TBV`LH)_qs6Tl->QAmg{mHvf zfASvGpInRjllPg~ zNW6)K0+}%Wu(D*zh_`79}yZdOzxI+`$arb)?5SpFR!$KAms3f-H; zxI2nmZp;7@cna%sgt0y9Ff1-BJ?c?h5iDd|yYRQEnnJ?(De6xVw`Y<8Cd9arZm&Y1}tPZo>VY zmXf*5z% zhk+P(U5)@T?(Fw<4H!RtpfT=F=nG=pHT45A?iL*lV%$B5I&s{!I|f{g@r62Z+$}_% zIPNx)7Iwad+j3;6s=<$@LgV@~8#PMoiht4J2U|y9*wsszzAYDpgOiYtTSK9GeFP$I{!g)k` z71#L&-wm`6)OiegJvGLNJx@XJphh3t^AL1L9+&8&!6bAciQ~eaPoS%*3o$<{eItYJKrTkVNN*sQB0uS^B#vu7Ly!6GB5{1T;QR;OhFppE zljgJYc)U-LE+ui?Pm``7as1ay^I3YF2UbY0BrzY{EWMhFBkMqhI($mQG7>CmJ zB<7h5r00{EZ&paJBr)&YA$>QA`Ddf_Q{>ZFze#T+H(|Xd{R8F3=s*8)gv|q{@k?LAl%vZyZIzq5r4Q#nrLcL)nmwnnyN%lhO{o~voxiQJYCVRUh;9S(VC@s_@cjO%0=g9H~%+(I%70;^Jg?h)1yyn zjHWezUSqUaX`VkDbr@9|JdM$}+GbAEyw+aEXBI~ehVa-(vzLZ#+TBtSqsL9?L7naq z$Jzd#h)>z-`APIaTqa-A?I-sX%x2b54JzW(n`V_& z)y}NLI?ui@pFSNw>K>e{0!ww>jOwb!1eSj+th`XqS@DRep>|d?x9Y0exC@L$rRhJT zuBIkli$!HB)XawR8aNe|jO|~ZNHkPUZ^93DQJVBvV%5$^(|yN!O_@aViq`F0~-4(yEA0WTM?(2K|CW8rc@a&z%` z9VcAh&OKA{vP1EvdGUBXV?r`os^55>I2^A4@mMaFuVX0QGA~|l6zGOD@fLgWMuy^b z3dOtMi?YY@y>6V$}61jzdgST;Fq5! z-+y`eP7CGRJ(Mr6i@`NH53NJI3uw^h`nNs&!u?T+cq8G%{^)@h{a7y^58-%yaeX0O zJl-D^j<+rpFDDdlq8E?X8Tg%++mLLx@m{>$h{ySgbMZ5~6yUoS>ix+Pt;<@9k51d{3_*}hk{|??aeY_vNc&kJ4cn)&$dVBF! zBOb2>yUmp^2Y!+9f_QHH^$*1x?Zx{FljDRm@rHZxc8B7zpI!Otym-ZElwGcH@}oS* zi&uDP@QhOSFON?bZ%Dj@ z5pM!gSiV7cxp*e8iWAI%EpMB~!7mwH1!|~=L zULl;=ekbEaKTJ(#j2CYM4)Xdm@kV;_o(jb)48=Rgi% z+#3QHyD?vGM|ttu;6cH8u(SQf;N{A9nip?l4zA^=X}^hHyaL2??KdtIZ@w3ATCeow zVT%m~Fh!Hc&U@$fIXxp;%TcuPa^;-Pp`ym;Rrn2W)n z?)@CkZ#Vo_(?Of_rq;#$8sEjc(Tlehi~4b)c&@(JdhzBWULoSJd~-ta)_d{3J1Tev zK3weP;;r-IZ3x9X51y`kuXyot`x$#LqrxS}%b&e?yF>NGZ3)SEpLp@^M(5_Fsqcqg zyuu?>=jjVW@miyi!~O9*?pGR;CLW&`9PW>L#4AJ`w%^5}c)h)N?FQhUJEXhKwO@`G zZyn;H$Tr?3pliPqy?8l@$7^nGbMcPz;%z{@95}Ij3-NOC_`Kq9eb3)Rys2Kit)X~} zL-F{0<8Zt!h<7&9-R8=7kr!`wsJ@rN*_H1$FW$-ckcFjja&z%+@#66ZhFtqC3&rDe zl*8qlf_SZx(Ngo(i=N+Ed+>YT^Q(X#%kDN;z8~f1?3M7l@g%2$GEsdCKm0R=6xiCJ z9-DCtv)``3%e70}cBy^nmr;*<;9O?ZG-B)K`CZ+Bd)h+_G3R#>{KENe#fNh~W1IP2 zg_q0sXfIykH^DUz=Ecp$JIae!e`bcgXP5D=!OO+t^Q7HA+`q+bxJNHdJ^1|TaQSwX zW!QUx84tGwCFAiq)Zuvh-+_A*M>BG;ximhvIvlTZdMX}nD@w+ju6TLczt89R+a}y& z={CmWtH$%Y>&NK&)cKt+Kezu5_zh%1w6R^d&GyQ-y&}WxLL%$?E4*C$T?#*Zq(<)t zTj$mpW}p+Gt1lU9R@|3_^Le&0=stVTFyrz3&Y~b*ayz3-hAGFn+ifo1{xF37Hdkes L>rocBIlun}TX+9f literal 0 HcmV?d00001 diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_i2c_ex.d b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_i2c_ex.d new file mode 100644 index 0000000..06b8c77 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_i2c_ex.d @@ -0,0 +1,58 @@ +build/stm32f3xx_hal_i2c_ex.o: \ + Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h \ + Core/Inc/stm32f3xx_hal_conf.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h \ + Drivers/CMSIS/Include/core_cm4.h Drivers/CMSIS/Include/cmsis_version.h \ + Drivers/CMSIS/Include/cmsis_compiler.h Drivers/CMSIS/Include/cmsis_gcc.h \ + Drivers/CMSIS/Include/mpu_armv7.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h: +Core/Inc/stm32f3xx_hal_conf.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h: +Drivers/CMSIS/Include/core_cm4.h: +Drivers/CMSIS/Include/cmsis_version.h: +Drivers/CMSIS/Include/cmsis_compiler.h: +Drivers/CMSIS/Include/cmsis_gcc.h: +Drivers/CMSIS/Include/mpu_armv7.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h: +Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h: diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_i2c_ex.lst b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_i2c_ex.lst new file mode 100644 index 0000000..77ebc57 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_i2c_ex.lst @@ -0,0 +1,916 @@ +ARM GAS /tmp/cchPdkSO.s page 1 + + + 1 .cpu cortex-m4 + 2 .arch armv7e-m + 3 .fpu fpv4-sp-d16 + 4 .eabi_attribute 27, 1 + 5 .eabi_attribute 28, 1 + 6 .eabi_attribute 20, 1 + 7 .eabi_attribute 21, 1 + 8 .eabi_attribute 23, 3 + 9 .eabi_attribute 24, 1 + 10 .eabi_attribute 25, 1 + 11 .eabi_attribute 26, 1 + 12 .eabi_attribute 30, 1 + 13 .eabi_attribute 34, 1 + 14 .eabi_attribute 18, 4 + 15 .file "stm32f3xx_hal_i2c_ex.c" + 16 .text + 17 .Ltext0: + 18 .cfi_sections .debug_frame + 19 .file 1 "Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c" + 20 .section .text.HAL_I2CEx_ConfigAnalogFilter,"ax",%progbits + 21 .align 1 + 22 .global HAL_I2CEx_ConfigAnalogFilter + 23 .syntax unified + 24 .thumb + 25 .thumb_func + 27 HAL_I2CEx_ConfigAnalogFilter: + 28 .LVL0: + 29 .LFB130: + 1:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /** + 2:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** ****************************************************************************** + 3:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * @file stm32f3xx_hal_i2c_ex.c + 4:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * @author MCD Application Team + 5:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * @brief I2C Extended HAL module driver. + 6:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * This file provides firmware functions to manage the following + 7:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * functionalities of I2C Extended peripheral: + 8:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * + Filter Mode Functions + 9:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * + WakeUp Mode Functions + 10:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * + FastModePlus Functions + 11:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * + 12:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** @verbatim + 13:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** ============================================================================== + 14:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** ##### I2C peripheral Extended features ##### + 15:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** ============================================================================== + 16:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 17:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** [..] Comparing to other previous devices, the I2C interface for STM32F3xx + 18:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** devices contains the following additional features + 19:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 20:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** (+) Possibility to disable or enable Analog Noise Filter + 21:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** (+) Use of a configured Digital Noise Filter + 22:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** (+) Disable or enable wakeup from Stop mode(s) + 23:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** (+) Disable or enable Fast Mode Plus + 24:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 25:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** ##### How to use this driver ##### + 26:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** ============================================================================== + 27:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** [..] This driver provides functions to configure Noise Filter and Wake Up Feature + 28:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** (#) Configure I2C Analog noise filter using the function HAL_I2CEx_ConfigAnalogFilter() + 29:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** (#) Configure I2C Digital noise filter using the function HAL_I2CEx_ConfigDigitalFilter() + ARM GAS /tmp/cchPdkSO.s page 2 + + + 30:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** (#) Configure the enable or disable of I2C Wake Up Mode using the functions : + 31:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** (++) HAL_I2CEx_EnableWakeUp() + 32:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** (++) HAL_I2CEx_DisableWakeUp() + 33:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** (#) Configure the enable or disable of fast mode plus driving capability using the functions : + 34:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** (++) HAL_I2CEx_EnableFastModePlus() + 35:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** (++) HAL_I2CEx_DisableFastModePlus() + 36:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** @endverbatim + 37:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** ****************************************************************************** + 38:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * @attention + 39:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * + 40:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** *

    © Copyright (c) 2016 STMicroelectronics. + 41:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * All rights reserved.

    + 42:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * + 43:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * This software component is licensed by ST under BSD 3-Clause license, + 44:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * the "License"; You may not use this file except in compliance with the + 45:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * License. You may obtain a copy of the License at: + 46:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * opensource.org/licenses/BSD-3-Clause + 47:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * + 48:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** ****************************************************************************** + 49:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** */ + 50:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 51:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /* Includes ------------------------------------------------------------------*/ + 52:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** #include "stm32f3xx_hal.h" + 53:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 54:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /** @addtogroup STM32F3xx_HAL_Driver + 55:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * @{ + 56:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** */ + 57:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 58:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /** @defgroup I2CEx I2CEx + 59:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * @brief I2C Extended HAL module driver + 60:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * @{ + 61:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** */ + 62:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 63:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** #ifdef HAL_I2C_MODULE_ENABLED + 64:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 65:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /* Private typedef -----------------------------------------------------------*/ + 66:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /* Private define ------------------------------------------------------------*/ + 67:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /* Private macro -------------------------------------------------------------*/ + 68:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /* Private variables ---------------------------------------------------------*/ + 69:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /* Private function prototypes -----------------------------------------------*/ + 70:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /* Private functions ---------------------------------------------------------*/ + 71:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 72:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /** @defgroup I2CEx_Exported_Functions I2C Extended Exported Functions + 73:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * @{ + 74:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** */ + 75:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 76:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /** @defgroup I2CEx_Exported_Functions_Group1 Filter Mode Functions + 77:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * @brief Filter Mode Functions + 78:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * + 79:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** @verbatim + 80:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** =============================================================================== + 81:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** ##### Filter Mode Functions ##### + 82:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** =============================================================================== + 83:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** [..] This section provides functions allowing to: + 84:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** (+) Configure Noise Filters + 85:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 86:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** @endverbatim + ARM GAS /tmp/cchPdkSO.s page 3 + + + 87:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * @{ + 88:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** */ + 89:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 90:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /** + 91:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * @brief Configure I2C Analog noise filter. + 92:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + 93:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * the configuration information for the specified I2Cx peripheral. + 94:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * @param AnalogFilter New state of the Analog filter. + 95:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * @retval HAL status + 96:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** */ + 97:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** HAL_StatusTypeDef HAL_I2CEx_ConfigAnalogFilter(I2C_HandleTypeDef *hi2c, uint32_t AnalogFilter) + 98:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** { + 30 .loc 1 98 1 view -0 + 31 .cfi_startproc + 32 @ args = 0, pretend = 0, frame = 0 + 33 @ frame_needed = 0, uses_anonymous_args = 0 + 34 @ link register save eliminated. + 35 .loc 1 98 1 is_stmt 0 view .LVU1 + 36 0000 0346 mov r3, r0 + 99:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /* Check the parameters */ + 100:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance)); + 37 .loc 1 100 3 is_stmt 1 view .LVU2 + 101:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** assert_param(IS_I2C_ANALOG_FILTER(AnalogFilter)); + 38 .loc 1 101 3 view .LVU3 + 102:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 103:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** if (hi2c->State == HAL_I2C_STATE_READY) + 39 .loc 1 103 3 view .LVU4 + 40 .loc 1 103 11 is_stmt 0 view .LVU5 + 41 0002 90F84120 ldrb r2, [r0, #65] @ zero_extendqisi2 + 42 0006 D2B2 uxtb r2, r2 + 43 .loc 1 103 6 view .LVU6 + 44 0008 202A cmp r2, #32 + 45 000a 23D1 bne .L3 + 104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** { + 105:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /* Process Locked */ + 106:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** __HAL_LOCK(hi2c); + 46 .loc 1 106 5 is_stmt 1 view .LVU7 + 47 .loc 1 106 5 view .LVU8 + 48 000c 90F84020 ldrb r2, [r0, #64] @ zero_extendqisi2 + 49 0010 012A cmp r2, #1 + 50 0012 21D0 beq .L4 + 51 .loc 1 106 5 discriminator 2 view .LVU9 + 52 0014 0122 movs r2, #1 + 53 0016 80F84020 strb r2, [r0, #64] + 54 .loc 1 106 5 discriminator 2 view .LVU10 + 107:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 108:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** hi2c->State = HAL_I2C_STATE_BUSY; + 55 .loc 1 108 5 discriminator 2 view .LVU11 + 56 .loc 1 108 17 is_stmt 0 discriminator 2 view .LVU12 + 57 001a 2422 movs r2, #36 + 58 001c 80F84120 strb r2, [r0, #65] + 109:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 110:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /* Disable the selected I2C peripheral */ + 111:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** __HAL_I2C_DISABLE(hi2c); + 59 .loc 1 111 5 is_stmt 1 discriminator 2 view .LVU13 + 60 0020 0068 ldr r0, [r0] + 61 .LVL1: + ARM GAS /tmp/cchPdkSO.s page 4 + + + 62 .loc 1 111 5 is_stmt 0 discriminator 2 view .LVU14 + 63 0022 0268 ldr r2, [r0] + 64 0024 22F00102 bic r2, r2, #1 + 65 0028 0260 str r2, [r0] + 112:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 113:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /* Reset I2Cx ANOFF bit */ + 114:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** hi2c->Instance->CR1 &= ~(I2C_CR1_ANFOFF); + 66 .loc 1 114 5 is_stmt 1 discriminator 2 view .LVU15 + 67 .loc 1 114 9 is_stmt 0 discriminator 2 view .LVU16 + 68 002a 1868 ldr r0, [r3] + 69 .loc 1 114 19 discriminator 2 view .LVU17 + 70 002c 0268 ldr r2, [r0] + 71 .loc 1 114 25 discriminator 2 view .LVU18 + 72 002e 22F48052 bic r2, r2, #4096 + 73 0032 0260 str r2, [r0] + 115:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 116:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /* Set analog filter bit*/ + 117:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** hi2c->Instance->CR1 |= AnalogFilter; + 74 .loc 1 117 5 is_stmt 1 discriminator 2 view .LVU19 + 75 .loc 1 117 9 is_stmt 0 discriminator 2 view .LVU20 + 76 0034 1868 ldr r0, [r3] + 77 .loc 1 117 19 discriminator 2 view .LVU21 + 78 0036 0268 ldr r2, [r0] + 79 .loc 1 117 25 discriminator 2 view .LVU22 + 80 0038 1143 orrs r1, r1, r2 + 81 .LVL2: + 82 .loc 1 117 25 discriminator 2 view .LVU23 + 83 003a 0160 str r1, [r0] + 118:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 119:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** __HAL_I2C_ENABLE(hi2c); + 84 .loc 1 119 5 is_stmt 1 discriminator 2 view .LVU24 + 85 003c 1968 ldr r1, [r3] + 86 003e 0A68 ldr r2, [r1] + 87 0040 42F00102 orr r2, r2, #1 + 88 0044 0A60 str r2, [r1] + 120:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 121:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** hi2c->State = HAL_I2C_STATE_READY; + 89 .loc 1 121 5 discriminator 2 view .LVU25 + 90 .loc 1 121 17 is_stmt 0 discriminator 2 view .LVU26 + 91 0046 2022 movs r2, #32 + 92 0048 83F84120 strb r2, [r3, #65] + 122:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /* Process Unlocked */ + 124:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** __HAL_UNLOCK(hi2c); + 93 .loc 1 124 5 is_stmt 1 discriminator 2 view .LVU27 + 94 .loc 1 124 5 discriminator 2 view .LVU28 + 95 004c 0020 movs r0, #0 + 96 004e 83F84000 strb r0, [r3, #64] + 97 .loc 1 124 5 discriminator 2 view .LVU29 + 125:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 126:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** return HAL_OK; + 98 .loc 1 126 5 discriminator 2 view .LVU30 + 99 .loc 1 126 12 is_stmt 0 discriminator 2 view .LVU31 + 100 0052 7047 bx lr + 101 .LVL3: + 102 .L3: + 127:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** } + ARM GAS /tmp/cchPdkSO.s page 5 + + + 128:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** else + 129:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** { + 130:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** return HAL_BUSY; + 103 .loc 1 130 12 view .LVU32 + 104 0054 0220 movs r0, #2 + 105 .LVL4: + 106 .loc 1 130 12 view .LVU33 + 107 0056 7047 bx lr + 108 .LVL5: + 109 .L4: + 106:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 110 .loc 1 106 5 view .LVU34 + 111 0058 0220 movs r0, #2 + 112 .LVL6: + 131:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** } + 132:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** } + 113 .loc 1 132 1 view .LVU35 + 114 005a 7047 bx lr + 115 .cfi_endproc + 116 .LFE130: + 118 .section .text.HAL_I2CEx_ConfigDigitalFilter,"ax",%progbits + 119 .align 1 + 120 .global HAL_I2CEx_ConfigDigitalFilter + 121 .syntax unified + 122 .thumb + 123 .thumb_func + 125 HAL_I2CEx_ConfigDigitalFilter: + 126 .LVL7: + 127 .LFB131: + 133:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 134:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /** + 135:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * @brief Configure I2C Digital noise filter. + 136:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + 137:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * the configuration information for the specified I2Cx peripheral. + 138:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * @param DigitalFilter Coefficient of digital noise filter between Min_Data=0x00 and Max_Data=0x + 139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * @retval HAL status + 140:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** */ + 141:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** HAL_StatusTypeDef HAL_I2CEx_ConfigDigitalFilter(I2C_HandleTypeDef *hi2c, uint32_t DigitalFilter) + 142:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** { + 128 .loc 1 142 1 is_stmt 1 view -0 + 129 .cfi_startproc + 130 @ args = 0, pretend = 0, frame = 0 + 131 @ frame_needed = 0, uses_anonymous_args = 0 + 132 @ link register save eliminated. + 133 .loc 1 142 1 is_stmt 0 view .LVU37 + 134 0000 0346 mov r3, r0 + 143:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** uint32_t tmpreg; + 135 .loc 1 143 3 is_stmt 1 view .LVU38 + 144:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 145:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /* Check the parameters */ + 146:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** assert_param(IS_I2C_ALL_INSTANCE(hi2c->Instance)); + 136 .loc 1 146 3 view .LVU39 + 147:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** assert_param(IS_I2C_DIGITAL_FILTER(DigitalFilter)); + 137 .loc 1 147 3 view .LVU40 + 148:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 149:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** if (hi2c->State == HAL_I2C_STATE_READY) + 138 .loc 1 149 3 view .LVU41 + ARM GAS /tmp/cchPdkSO.s page 6 + + + 139 .loc 1 149 11 is_stmt 0 view .LVU42 + 140 0002 90F84120 ldrb r2, [r0, #65] @ zero_extendqisi2 + 141 0006 D2B2 uxtb r2, r2 + 142 .loc 1 149 6 view .LVU43 + 143 0008 202A cmp r2, #32 + 144 000a 21D1 bne .L7 + 150:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** { + 151:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /* Process Locked */ + 152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** __HAL_LOCK(hi2c); + 145 .loc 1 152 5 is_stmt 1 view .LVU44 + 146 .loc 1 152 5 view .LVU45 + 147 000c 90F84020 ldrb r2, [r0, #64] @ zero_extendqisi2 + 148 0010 012A cmp r2, #1 + 149 0012 1FD0 beq .L8 + 150 .loc 1 152 5 discriminator 2 view .LVU46 + 151 0014 0122 movs r2, #1 + 152 0016 80F84020 strb r2, [r0, #64] + 153 .loc 1 152 5 discriminator 2 view .LVU47 + 153:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 154:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** hi2c->State = HAL_I2C_STATE_BUSY; + 154 .loc 1 154 5 discriminator 2 view .LVU48 + 155 .loc 1 154 17 is_stmt 0 discriminator 2 view .LVU49 + 156 001a 2422 movs r2, #36 + 157 001c 80F84120 strb r2, [r0, #65] + 155:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /* Disable the selected I2C peripheral */ + 157:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** __HAL_I2C_DISABLE(hi2c); + 158 .loc 1 157 5 is_stmt 1 discriminator 2 view .LVU50 + 159 0020 0068 ldr r0, [r0] + 160 .LVL8: + 161 .loc 1 157 5 is_stmt 0 discriminator 2 view .LVU51 + 162 0022 0268 ldr r2, [r0] + 163 0024 22F00102 bic r2, r2, #1 + 164 0028 0260 str r2, [r0] + 158:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 159:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /* Get the old register value */ + 160:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** tmpreg = hi2c->Instance->CR1; + 165 .loc 1 160 5 is_stmt 1 discriminator 2 view .LVU52 + 166 .loc 1 160 18 is_stmt 0 discriminator 2 view .LVU53 + 167 002a 1868 ldr r0, [r3] + 168 .loc 1 160 12 discriminator 2 view .LVU54 + 169 002c 0268 ldr r2, [r0] + 170 .LVL9: + 161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 162:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /* Reset I2Cx DNF bits [11:8] */ + 163:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** tmpreg &= ~(I2C_CR1_DNF); + 171 .loc 1 163 5 is_stmt 1 discriminator 2 view .LVU55 + 172 .loc 1 163 12 is_stmt 0 discriminator 2 view .LVU56 + 173 002e 22F47062 bic r2, r2, #3840 + 174 .LVL10: + 164:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /* Set I2Cx DNF coefficient */ + 166:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** tmpreg |= DigitalFilter << 8U; + 175 .loc 1 166 5 is_stmt 1 discriminator 2 view .LVU57 + 176 .loc 1 166 12 is_stmt 0 discriminator 2 view .LVU58 + 177 0032 42EA0122 orr r2, r2, r1, lsl #8 + 178 .LVL11: + ARM GAS /tmp/cchPdkSO.s page 7 + + + 167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /* Store the new register value */ + 169:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** hi2c->Instance->CR1 = tmpreg; + 179 .loc 1 169 5 is_stmt 1 discriminator 2 view .LVU59 + 180 .loc 1 169 25 is_stmt 0 discriminator 2 view .LVU60 + 181 0036 0260 str r2, [r0] + 170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 171:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** __HAL_I2C_ENABLE(hi2c); + 182 .loc 1 171 5 is_stmt 1 discriminator 2 view .LVU61 + 183 0038 1968 ldr r1, [r3] + 184 .LVL12: + 185 .loc 1 171 5 is_stmt 0 discriminator 2 view .LVU62 + 186 003a 0A68 ldr r2, [r1] + 187 .LVL13: + 188 .loc 1 171 5 discriminator 2 view .LVU63 + 189 003c 42F00102 orr r2, r2, #1 + 190 0040 0A60 str r2, [r1] + 191 .LVL14: + 172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 173:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** hi2c->State = HAL_I2C_STATE_READY; + 192 .loc 1 173 5 is_stmt 1 discriminator 2 view .LVU64 + 193 .loc 1 173 17 is_stmt 0 discriminator 2 view .LVU65 + 194 0042 2022 movs r2, #32 + 195 0044 83F84120 strb r2, [r3, #65] + 174:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 175:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /* Process Unlocked */ + 176:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** __HAL_UNLOCK(hi2c); + 196 .loc 1 176 5 is_stmt 1 discriminator 2 view .LVU66 + 197 .loc 1 176 5 discriminator 2 view .LVU67 + 198 0048 0020 movs r0, #0 + 199 004a 83F84000 strb r0, [r3, #64] + 200 .loc 1 176 5 discriminator 2 view .LVU68 + 177:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 178:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** return HAL_OK; + 201 .loc 1 178 5 discriminator 2 view .LVU69 + 202 .loc 1 178 12 is_stmt 0 discriminator 2 view .LVU70 + 203 004e 7047 bx lr + 204 .LVL15: + 205 .L7: + 179:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** } + 180:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** else + 181:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** { + 182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** return HAL_BUSY; + 206 .loc 1 182 12 view .LVU71 + 207 0050 0220 movs r0, #2 + 208 .LVL16: + 209 .loc 1 182 12 view .LVU72 + 210 0052 7047 bx lr + 211 .LVL17: + 212 .L8: + 152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 213 .loc 1 152 5 view .LVU73 + 214 0054 0220 movs r0, #2 + 215 .LVL18: + 183:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** } + 184:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** } + 216 .loc 1 184 1 view .LVU74 + ARM GAS /tmp/cchPdkSO.s page 8 + + + 217 0056 7047 bx lr + 218 .cfi_endproc + 219 .LFE131: + 221 .section .text.HAL_I2CEx_EnableWakeUp,"ax",%progbits + 222 .align 1 + 223 .global HAL_I2CEx_EnableWakeUp + 224 .syntax unified + 225 .thumb + 226 .thumb_func + 228 HAL_I2CEx_EnableWakeUp: + 229 .LVL19: + 230 .LFB132: + 185:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /** + 186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * @} + 187:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** */ + 188:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /** @defgroup I2CEx_Exported_Functions_Group2 WakeUp Mode Functions + 190:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * @brief WakeUp Mode Functions + 191:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * + 192:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** @verbatim + 193:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** =============================================================================== + 194:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** ##### WakeUp Mode Functions ##### + 195:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** =============================================================================== + 196:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** [..] This section provides functions allowing to: + 197:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** (+) Configure Wake Up Feature + 198:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 199:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** @endverbatim + 200:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * @{ + 201:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** */ + 202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 203:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /** + 204:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * @brief Enable I2C wakeup from Stop mode(s). + 205:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + 206:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * the configuration information for the specified I2Cx peripheral. + 207:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * @retval HAL status + 208:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** */ + 209:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** HAL_StatusTypeDef HAL_I2CEx_EnableWakeUp(I2C_HandleTypeDef *hi2c) + 210:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** { + 231 .loc 1 210 1 is_stmt 1 view -0 + 232 .cfi_startproc + 233 @ args = 0, pretend = 0, frame = 0 + 234 @ frame_needed = 0, uses_anonymous_args = 0 + 235 @ link register save eliminated. + 236 .loc 1 210 1 is_stmt 0 view .LVU76 + 237 0000 0346 mov r3, r0 + 211:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /* Check the parameters */ + 212:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** assert_param(IS_I2C_WAKEUP_FROMSTOP_INSTANCE(hi2c->Instance)); + 238 .loc 1 212 3 is_stmt 1 view .LVU77 + 213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 214:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** if (hi2c->State == HAL_I2C_STATE_READY) + 239 .loc 1 214 3 view .LVU78 + 240 .loc 1 214 11 is_stmt 0 view .LVU79 + 241 0002 90F84120 ldrb r2, [r0, #65] @ zero_extendqisi2 + 242 0006 D2B2 uxtb r2, r2 + 243 .loc 1 214 6 view .LVU80 + 244 0008 202A cmp r2, #32 + 245 000a 1FD1 bne .L11 + ARM GAS /tmp/cchPdkSO.s page 9 + + + 215:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** { + 216:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /* Process Locked */ + 217:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** __HAL_LOCK(hi2c); + 246 .loc 1 217 5 is_stmt 1 view .LVU81 + 247 .loc 1 217 5 view .LVU82 + 248 000c 90F84020 ldrb r2, [r0, #64] @ zero_extendqisi2 + 249 0010 012A cmp r2, #1 + 250 0012 1DD0 beq .L12 + 251 .loc 1 217 5 discriminator 2 view .LVU83 + 252 0014 0122 movs r2, #1 + 253 0016 80F84020 strb r2, [r0, #64] + 254 .loc 1 217 5 discriminator 2 view .LVU84 + 218:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 219:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** hi2c->State = HAL_I2C_STATE_BUSY; + 255 .loc 1 219 5 discriminator 2 view .LVU85 + 256 .loc 1 219 17 is_stmt 0 discriminator 2 view .LVU86 + 257 001a 2422 movs r2, #36 + 258 001c 80F84120 strb r2, [r0, #65] + 220:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 221:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /* Disable the selected I2C peripheral */ + 222:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** __HAL_I2C_DISABLE(hi2c); + 259 .loc 1 222 5 is_stmt 1 discriminator 2 view .LVU87 + 260 0020 0168 ldr r1, [r0] + 261 0022 0A68 ldr r2, [r1] + 262 0024 22F00102 bic r2, r2, #1 + 263 0028 0A60 str r2, [r1] + 223:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 224:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /* Enable wakeup from stop mode */ + 225:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** hi2c->Instance->CR1 |= I2C_CR1_WUPEN; + 264 .loc 1 225 5 discriminator 2 view .LVU88 + 265 .loc 1 225 9 is_stmt 0 discriminator 2 view .LVU89 + 266 002a 0168 ldr r1, [r0] + 267 .loc 1 225 19 discriminator 2 view .LVU90 + 268 002c 0A68 ldr r2, [r1] + 269 .loc 1 225 25 discriminator 2 view .LVU91 + 270 002e 42F48022 orr r2, r2, #262144 + 271 0032 0A60 str r2, [r1] + 226:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 227:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** __HAL_I2C_ENABLE(hi2c); + 272 .loc 1 227 5 is_stmt 1 discriminator 2 view .LVU92 + 273 0034 0168 ldr r1, [r0] + 274 0036 0A68 ldr r2, [r1] + 275 0038 42F00102 orr r2, r2, #1 + 276 003c 0A60 str r2, [r1] + 228:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 229:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** hi2c->State = HAL_I2C_STATE_READY; + 277 .loc 1 229 5 discriminator 2 view .LVU93 + 278 .loc 1 229 17 is_stmt 0 discriminator 2 view .LVU94 + 279 003e 2022 movs r2, #32 + 280 0040 80F84120 strb r2, [r0, #65] + 230:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 231:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /* Process Unlocked */ + 232:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** __HAL_UNLOCK(hi2c); + 281 .loc 1 232 5 is_stmt 1 discriminator 2 view .LVU95 + 282 .loc 1 232 5 discriminator 2 view .LVU96 + 283 0044 0020 movs r0, #0 + 284 .LVL20: + ARM GAS /tmp/cchPdkSO.s page 10 + + + 285 .loc 1 232 5 is_stmt 0 discriminator 2 view .LVU97 + 286 0046 83F84000 strb r0, [r3, #64] + 287 .loc 1 232 5 is_stmt 1 discriminator 2 view .LVU98 + 233:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 234:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** return HAL_OK; + 288 .loc 1 234 5 discriminator 2 view .LVU99 + 289 .loc 1 234 12 is_stmt 0 discriminator 2 view .LVU100 + 290 004a 7047 bx lr + 291 .LVL21: + 292 .L11: + 235:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** } + 236:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** else + 237:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** { + 238:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** return HAL_BUSY; + 293 .loc 1 238 12 view .LVU101 + 294 004c 0220 movs r0, #2 + 295 .LVL22: + 296 .loc 1 238 12 view .LVU102 + 297 004e 7047 bx lr + 298 .LVL23: + 299 .L12: + 217:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 300 .loc 1 217 5 view .LVU103 + 301 0050 0220 movs r0, #2 + 302 .LVL24: + 239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** } + 240:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** } + 303 .loc 1 240 1 view .LVU104 + 304 0052 7047 bx lr + 305 .cfi_endproc + 306 .LFE132: + 308 .section .text.HAL_I2CEx_DisableWakeUp,"ax",%progbits + 309 .align 1 + 310 .global HAL_I2CEx_DisableWakeUp + 311 .syntax unified + 312 .thumb + 313 .thumb_func + 315 HAL_I2CEx_DisableWakeUp: + 316 .LVL25: + 317 .LFB133: + 241:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 242:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /** + 243:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * @brief Disable I2C wakeup from Stop mode(s). + 244:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * @param hi2c Pointer to a I2C_HandleTypeDef structure that contains + 245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * the configuration information for the specified I2Cx peripheral. + 246:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * @retval HAL status + 247:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** */ + 248:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** HAL_StatusTypeDef HAL_I2CEx_DisableWakeUp(I2C_HandleTypeDef *hi2c) + 249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** { + 318 .loc 1 249 1 is_stmt 1 view -0 + 319 .cfi_startproc + 320 @ args = 0, pretend = 0, frame = 0 + 321 @ frame_needed = 0, uses_anonymous_args = 0 + 322 @ link register save eliminated. + 323 .loc 1 249 1 is_stmt 0 view .LVU106 + 324 0000 0346 mov r3, r0 + 250:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /* Check the parameters */ + ARM GAS /tmp/cchPdkSO.s page 11 + + + 251:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** assert_param(IS_I2C_WAKEUP_FROMSTOP_INSTANCE(hi2c->Instance)); + 325 .loc 1 251 3 is_stmt 1 view .LVU107 + 252:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 253:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** if (hi2c->State == HAL_I2C_STATE_READY) + 326 .loc 1 253 3 view .LVU108 + 327 .loc 1 253 11 is_stmt 0 view .LVU109 + 328 0002 90F84120 ldrb r2, [r0, #65] @ zero_extendqisi2 + 329 0006 D2B2 uxtb r2, r2 + 330 .loc 1 253 6 view .LVU110 + 331 0008 202A cmp r2, #32 + 332 000a 1FD1 bne .L15 + 254:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** { + 255:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /* Process Locked */ + 256:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** __HAL_LOCK(hi2c); + 333 .loc 1 256 5 is_stmt 1 view .LVU111 + 334 .loc 1 256 5 view .LVU112 + 335 000c 90F84020 ldrb r2, [r0, #64] @ zero_extendqisi2 + 336 0010 012A cmp r2, #1 + 337 0012 1DD0 beq .L16 + 338 .loc 1 256 5 discriminator 2 view .LVU113 + 339 0014 0122 movs r2, #1 + 340 0016 80F84020 strb r2, [r0, #64] + 341 .loc 1 256 5 discriminator 2 view .LVU114 + 257:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 258:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** hi2c->State = HAL_I2C_STATE_BUSY; + 342 .loc 1 258 5 discriminator 2 view .LVU115 + 343 .loc 1 258 17 is_stmt 0 discriminator 2 view .LVU116 + 344 001a 2422 movs r2, #36 + 345 001c 80F84120 strb r2, [r0, #65] + 259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 260:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /* Disable the selected I2C peripheral */ + 261:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** __HAL_I2C_DISABLE(hi2c); + 346 .loc 1 261 5 is_stmt 1 discriminator 2 view .LVU117 + 347 0020 0168 ldr r1, [r0] + 348 0022 0A68 ldr r2, [r1] + 349 0024 22F00102 bic r2, r2, #1 + 350 0028 0A60 str r2, [r1] + 262:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 263:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /* Enable wakeup from stop mode */ + 264:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** hi2c->Instance->CR1 &= ~(I2C_CR1_WUPEN); + 351 .loc 1 264 5 discriminator 2 view .LVU118 + 352 .loc 1 264 9 is_stmt 0 discriminator 2 view .LVU119 + 353 002a 0168 ldr r1, [r0] + 354 .loc 1 264 19 discriminator 2 view .LVU120 + 355 002c 0A68 ldr r2, [r1] + 356 .loc 1 264 25 discriminator 2 view .LVU121 + 357 002e 22F48022 bic r2, r2, #262144 + 358 0032 0A60 str r2, [r1] + 265:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 266:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** __HAL_I2C_ENABLE(hi2c); + 359 .loc 1 266 5 is_stmt 1 discriminator 2 view .LVU122 + 360 0034 0168 ldr r1, [r0] + 361 0036 0A68 ldr r2, [r1] + 362 0038 42F00102 orr r2, r2, #1 + 363 003c 0A60 str r2, [r1] + 267:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 268:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** hi2c->State = HAL_I2C_STATE_READY; + ARM GAS /tmp/cchPdkSO.s page 12 + + + 364 .loc 1 268 5 discriminator 2 view .LVU123 + 365 .loc 1 268 17 is_stmt 0 discriminator 2 view .LVU124 + 366 003e 2022 movs r2, #32 + 367 0040 80F84120 strb r2, [r0, #65] + 269:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 270:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /* Process Unlocked */ + 271:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** __HAL_UNLOCK(hi2c); + 368 .loc 1 271 5 is_stmt 1 discriminator 2 view .LVU125 + 369 .loc 1 271 5 discriminator 2 view .LVU126 + 370 0044 0020 movs r0, #0 + 371 .LVL26: + 372 .loc 1 271 5 is_stmt 0 discriminator 2 view .LVU127 + 373 0046 83F84000 strb r0, [r3, #64] + 374 .loc 1 271 5 is_stmt 1 discriminator 2 view .LVU128 + 272:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 273:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** return HAL_OK; + 375 .loc 1 273 5 discriminator 2 view .LVU129 + 376 .loc 1 273 12 is_stmt 0 discriminator 2 view .LVU130 + 377 004a 7047 bx lr + 378 .LVL27: + 379 .L15: + 274:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** } + 275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** else + 276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** { + 277:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** return HAL_BUSY; + 380 .loc 1 277 12 view .LVU131 + 381 004c 0220 movs r0, #2 + 382 .LVL28: + 383 .loc 1 277 12 view .LVU132 + 384 004e 7047 bx lr + 385 .LVL29: + 386 .L16: + 256:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 387 .loc 1 256 5 view .LVU133 + 388 0050 0220 movs r0, #2 + 389 .LVL30: + 278:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** } + 279:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** } + 390 .loc 1 279 1 view .LVU134 + 391 0052 7047 bx lr + 392 .cfi_endproc + 393 .LFE133: + 395 .section .text.HAL_I2CEx_EnableFastModePlus,"ax",%progbits + 396 .align 1 + 397 .global HAL_I2CEx_EnableFastModePlus + 398 .syntax unified + 399 .thumb + 400 .thumb_func + 402 HAL_I2CEx_EnableFastModePlus: + 403 .LVL31: + 404 .LFB134: + 280:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /** + 281:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * @} + 282:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** */ + 283:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 284:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /** @defgroup I2CEx_Exported_Functions_Group3 Fast Mode Plus Functions + 285:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * @brief Fast Mode Plus Functions + ARM GAS /tmp/cchPdkSO.s page 13 + + + 286:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * + 287:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** @verbatim + 288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** =============================================================================== + 289:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** ##### Fast Mode Plus Functions ##### + 290:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** =============================================================================== + 291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** [..] This section provides functions allowing to: + 292:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** (+) Configure Fast Mode Plus + 293:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** @endverbatim + 295:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * @{ + 296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** */ + 297:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 298:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /** + 299:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * @brief Enable the I2C fast mode plus driving capability. + 300:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * @param ConfigFastModePlus Selects the pin. + 301:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * This parameter can be one of the @ref I2CEx_FastModePlus values + 302:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * @note For I2C1, fast mode plus driving capability can be enabled on all selected + 303:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * I2C1 pins using I2C_FASTMODEPLUS_I2C1 parameter or independently + 304:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * on each one of the following pins PB6, PB7, PB8 and PB9. + 305:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * @note For remaining I2C1 pins (PA14, PA15...) fast mode plus driving capability + 306:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * can be enabled only by using I2C_FASTMODEPLUS_I2C1 parameter. + 307:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * @note For all I2C2 pins fast mode plus driving capability can be enabled + 308:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * only by using I2C_FASTMODEPLUS_I2C2 parameter. + 309:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * @note For all I2C3 pins fast mode plus driving capability can be enabled + 310:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * only by using I2C_FASTMODEPLUS_I2C3 parameter. + 311:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * @retval None + 312:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** */ + 313:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** void HAL_I2CEx_EnableFastModePlus(uint32_t ConfigFastModePlus) + 314:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** { + 405 .loc 1 314 1 is_stmt 1 view -0 + 406 .cfi_startproc + 407 @ args = 0, pretend = 0, frame = 8 + 408 @ frame_needed = 0, uses_anonymous_args = 0 + 409 @ link register save eliminated. + 410 .loc 1 314 1 is_stmt 0 view .LVU136 + 411 0000 82B0 sub sp, sp, #8 + 412 .cfi_def_cfa_offset 8 + 315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /* Check the parameter */ + 316:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** assert_param(IS_I2C_FASTMODEPLUS(ConfigFastModePlus)); + 413 .loc 1 316 3 is_stmt 1 view .LVU137 + 317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 318:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /* Enable SYSCFG clock */ + 319:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** __HAL_RCC_SYSCFG_CLK_ENABLE(); + 414 .loc 1 319 3 view .LVU138 + 415 .LBB2: + 416 .loc 1 319 3 view .LVU139 + 417 .loc 1 319 3 view .LVU140 + 418 0002 084B ldr r3, .L19 + 419 0004 9A69 ldr r2, [r3, #24] + 420 0006 42F00102 orr r2, r2, #1 + 421 000a 9A61 str r2, [r3, #24] + 422 .loc 1 319 3 view .LVU141 + 423 000c 9B69 ldr r3, [r3, #24] + 424 000e 03F00103 and r3, r3, #1 + 425 0012 0193 str r3, [sp, #4] + 426 .loc 1 319 3 view .LVU142 + 427 0014 019B ldr r3, [sp, #4] + ARM GAS /tmp/cchPdkSO.s page 14 + + + 428 .LBE2: + 429 .loc 1 319 3 view .LVU143 + 320:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 321:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /* Enable fast mode plus driving capability for selected pin */ + 322:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** SET_BIT(SYSCFG->CFGR1, (uint32_t)ConfigFastModePlus); + 430 .loc 1 322 3 view .LVU144 + 431 0016 044A ldr r2, .L19+4 + 432 0018 1368 ldr r3, [r2] + 433 001a 0343 orrs r3, r3, r0 + 434 001c 1360 str r3, [r2] + 323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** } + 435 .loc 1 323 1 is_stmt 0 view .LVU145 + 436 001e 02B0 add sp, sp, #8 + 437 .cfi_def_cfa_offset 0 + 438 @ sp needed + 439 0020 7047 bx lr + 440 .L20: + 441 0022 00BF .align 2 + 442 .L19: + 443 0024 00100240 .word 1073876992 + 444 0028 00000140 .word 1073807360 + 445 .cfi_endproc + 446 .LFE134: + 448 .section .text.HAL_I2CEx_DisableFastModePlus,"ax",%progbits + 449 .align 1 + 450 .global HAL_I2CEx_DisableFastModePlus + 451 .syntax unified + 452 .thumb + 453 .thumb_func + 455 HAL_I2CEx_DisableFastModePlus: + 456 .LVL32: + 457 .LFB135: + 324:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 325:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /** + 326:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * @brief Disable the I2C fast mode plus driving capability. + 327:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * @param ConfigFastModePlus Selects the pin. + 328:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * This parameter can be one of the @ref I2CEx_FastModePlus values + 329:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * @note For I2C1, fast mode plus driving capability can be disabled on all selected + 330:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * I2C1 pins using I2C_FASTMODEPLUS_I2C1 parameter or independently + 331:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * on each one of the following pins PB6, PB7, PB8 and PB9. + 332:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * @note For remaining I2C1 pins (PA14, PA15...) fast mode plus driving capability + 333:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * can be disabled only by using I2C_FASTMODEPLUS_I2C1 parameter. + 334:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * @note For all I2C2 pins fast mode plus driving capability can be disabled + 335:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * only by using I2C_FASTMODEPLUS_I2C2 parameter. + 336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * @note For all I2C3 pins fast mode plus driving capability can be disabled + 337:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * only by using I2C_FASTMODEPLUS_I2C3 parameter. + 338:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** * @retval None + 339:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** */ + 340:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** void HAL_I2CEx_DisableFastModePlus(uint32_t ConfigFastModePlus) + 341:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** { + 458 .loc 1 341 1 is_stmt 1 view -0 + 459 .cfi_startproc + 460 @ args = 0, pretend = 0, frame = 8 + 461 @ frame_needed = 0, uses_anonymous_args = 0 + 462 @ link register save eliminated. + 463 .loc 1 341 1 is_stmt 0 view .LVU147 + 464 0000 82B0 sub sp, sp, #8 + ARM GAS /tmp/cchPdkSO.s page 15 + + + 465 .cfi_def_cfa_offset 8 + 342:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /* Check the parameter */ + 343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** assert_param(IS_I2C_FASTMODEPLUS(ConfigFastModePlus)); + 466 .loc 1 343 3 is_stmt 1 view .LVU148 + 344:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 345:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /* Enable SYSCFG clock */ + 346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** __HAL_RCC_SYSCFG_CLK_ENABLE(); + 467 .loc 1 346 3 view .LVU149 + 468 .LBB3: + 469 .loc 1 346 3 view .LVU150 + 470 .loc 1 346 3 view .LVU151 + 471 0002 084B ldr r3, .L23 + 472 0004 9A69 ldr r2, [r3, #24] + 473 0006 42F00102 orr r2, r2, #1 + 474 000a 9A61 str r2, [r3, #24] + 475 .loc 1 346 3 view .LVU152 + 476 000c 9B69 ldr r3, [r3, #24] + 477 000e 03F00103 and r3, r3, #1 + 478 0012 0193 str r3, [sp, #4] + 479 .loc 1 346 3 view .LVU153 + 480 0014 019B ldr r3, [sp, #4] + 481 .LBE3: + 482 .loc 1 346 3 view .LVU154 + 347:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** + 348:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** /* Disable fast mode plus driving capability for selected pin */ + 349:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** CLEAR_BIT(SYSCFG->CFGR1, (uint32_t)ConfigFastModePlus); + 483 .loc 1 349 3 view .LVU155 + 484 0016 044A ldr r2, .L23+4 + 485 0018 1368 ldr r3, [r2] + 486 001a 23EA0003 bic r3, r3, r0 + 487 001e 1360 str r3, [r2] + 350:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_i2c_ex.c **** } + 488 .loc 1 350 1 is_stmt 0 view .LVU156 + 489 0020 02B0 add sp, sp, #8 + 490 .cfi_def_cfa_offset 0 + 491 @ sp needed + 492 0022 7047 bx lr + 493 .L24: + 494 .align 2 + 495 .L23: + 496 0024 00100240 .word 1073876992 + 497 0028 00000140 .word 1073807360 + 498 .cfi_endproc + 499 .LFE135: + 501 .text + 502 .Letext0: + 503 .file 2 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 504 .file 3 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 505 .file 4 "Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h" + 506 .file 5 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h" + 507 .file 6 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h" + 508 .file 7 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h" + ARM GAS /tmp/cchPdkSO.s page 16 + + +DEFINED SYMBOLS + *ABS*:0000000000000000 stm32f3xx_hal_i2c_ex.c + /tmp/cchPdkSO.s:21 .text.HAL_I2CEx_ConfigAnalogFilter:0000000000000000 $t + /tmp/cchPdkSO.s:27 .text.HAL_I2CEx_ConfigAnalogFilter:0000000000000000 HAL_I2CEx_ConfigAnalogFilter + /tmp/cchPdkSO.s:119 .text.HAL_I2CEx_ConfigDigitalFilter:0000000000000000 $t + /tmp/cchPdkSO.s:125 .text.HAL_I2CEx_ConfigDigitalFilter:0000000000000000 HAL_I2CEx_ConfigDigitalFilter + /tmp/cchPdkSO.s:222 .text.HAL_I2CEx_EnableWakeUp:0000000000000000 $t + /tmp/cchPdkSO.s:228 .text.HAL_I2CEx_EnableWakeUp:0000000000000000 HAL_I2CEx_EnableWakeUp + /tmp/cchPdkSO.s:309 .text.HAL_I2CEx_DisableWakeUp:0000000000000000 $t + /tmp/cchPdkSO.s:315 .text.HAL_I2CEx_DisableWakeUp:0000000000000000 HAL_I2CEx_DisableWakeUp + /tmp/cchPdkSO.s:396 .text.HAL_I2CEx_EnableFastModePlus:0000000000000000 $t + /tmp/cchPdkSO.s:402 .text.HAL_I2CEx_EnableFastModePlus:0000000000000000 HAL_I2CEx_EnableFastModePlus + /tmp/cchPdkSO.s:443 .text.HAL_I2CEx_EnableFastModePlus:0000000000000024 $d + /tmp/cchPdkSO.s:449 .text.HAL_I2CEx_DisableFastModePlus:0000000000000000 $t + /tmp/cchPdkSO.s:455 .text.HAL_I2CEx_DisableFastModePlus:0000000000000000 HAL_I2CEx_DisableFastModePlus + /tmp/cchPdkSO.s:496 .text.HAL_I2CEx_DisableFastModePlus:0000000000000024 $d + +NO UNDEFINED SYMBOLS diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_i2c_ex.o b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_i2c_ex.o new file mode 100644 index 0000000000000000000000000000000000000000..08810fb2f77435ca80f56dbf517ad9c6f8ded97c GIT binary patch literal 11076 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 + 107 .loc 1 88 3 is_stmt 1 view .LVU18 + 108 .loc 1 88 10 is_stmt 0 view .LVU19 + 109 0010 0268 ldr r2, [r0] + 110 .loc 1 88 5 view .LVU20 + 111 0012 184B ldr r3, .L9 + 112 0014 9A42 cmp r2, r3 + 113 0016 02D0 beq .L8 + 114 .LVL1: + 115 .L5: + 89:Core/Src/stm32f3xx_hal_msp.c **** { + 90:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE BEGIN CAN_MspInit 0 */ + 91:Core/Src/stm32f3xx_hal_msp.c **** + 92:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE END CAN_MspInit 0 */ + 93:Core/Src/stm32f3xx_hal_msp.c **** /* Peripheral clock enable */ + 94:Core/Src/stm32f3xx_hal_msp.c **** __HAL_RCC_CAN1_CLK_ENABLE(); + 95:Core/Src/stm32f3xx_hal_msp.c **** + 96:Core/Src/stm32f3xx_hal_msp.c **** __HAL_RCC_GPIOA_CLK_ENABLE(); + 97:Core/Src/stm32f3xx_hal_msp.c **** /**CAN GPIO Configuration + 98:Core/Src/stm32f3xx_hal_msp.c **** PA11 ------> CAN_RX + 99:Core/Src/stm32f3xx_hal_msp.c **** PA12 ------> CAN_TX + 100:Core/Src/stm32f3xx_hal_msp.c **** */ + 101:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12; + 102:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + 103:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Pull = GPIO_NOPULL; + 104:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + 105:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Alternate = GPIO_AF9_CAN; + 106:Core/Src/stm32f3xx_hal_msp.c **** HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + 107:Core/Src/stm32f3xx_hal_msp.c **** + 108:Core/Src/stm32f3xx_hal_msp.c **** /* CAN interrupt Init */ + 109:Core/Src/stm32f3xx_hal_msp.c **** HAL_NVIC_SetPriority(USB_LP_CAN_RX0_IRQn, 0, 0); + 110:Core/Src/stm32f3xx_hal_msp.c **** HAL_NVIC_EnableIRQ(USB_LP_CAN_RX0_IRQn); + 111:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE BEGIN CAN_MspInit 1 */ + 112:Core/Src/stm32f3xx_hal_msp.c **** + 113:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE END CAN_MspInit 1 */ + 114:Core/Src/stm32f3xx_hal_msp.c **** } + 115:Core/Src/stm32f3xx_hal_msp.c **** + 116:Core/Src/stm32f3xx_hal_msp.c **** } + ARM GAS /tmp/ccBY67LK.s page 5 + + + 116 .loc 1 116 1 view .LVU21 + 117 0018 09B0 add sp, sp, #36 + 118 .cfi_remember_state + 119 .cfi_def_cfa_offset 4 + 120 @ sp needed + 121 001a 5DF804FB ldr pc, [sp], #4 + 122 .LVL2: + 123 .L8: + 124 .cfi_restore_state + 94:Core/Src/stm32f3xx_hal_msp.c **** + 125 .loc 1 94 5 is_stmt 1 view .LVU22 + 126 .LBB4: + 94:Core/Src/stm32f3xx_hal_msp.c **** + 127 .loc 1 94 5 view .LVU23 + 94:Core/Src/stm32f3xx_hal_msp.c **** + 128 .loc 1 94 5 view .LVU24 + 129 001e 03F5D633 add r3, r3, #109568 + 130 0022 DA69 ldr r2, [r3, #28] + 131 0024 42F00072 orr r2, r2, #33554432 + 132 0028 DA61 str r2, [r3, #28] + 94:Core/Src/stm32f3xx_hal_msp.c **** + 133 .loc 1 94 5 view .LVU25 + 134 002a DA69 ldr r2, [r3, #28] + 135 002c 02F00072 and r2, r2, #33554432 + 136 0030 0192 str r2, [sp, #4] + 94:Core/Src/stm32f3xx_hal_msp.c **** + 137 .loc 1 94 5 view .LVU26 + 138 0032 019A ldr r2, [sp, #4] + 139 .LBE4: + 94:Core/Src/stm32f3xx_hal_msp.c **** + 140 .loc 1 94 5 view .LVU27 + 96:Core/Src/stm32f3xx_hal_msp.c **** /**CAN GPIO Configuration + 141 .loc 1 96 5 view .LVU28 + 142 .LBB5: + 96:Core/Src/stm32f3xx_hal_msp.c **** /**CAN GPIO Configuration + 143 .loc 1 96 5 view .LVU29 + 96:Core/Src/stm32f3xx_hal_msp.c **** /**CAN GPIO Configuration + 144 .loc 1 96 5 view .LVU30 + 145 0034 5A69 ldr r2, [r3, #20] + 146 0036 42F40032 orr r2, r2, #131072 + 147 003a 5A61 str r2, [r3, #20] + 96:Core/Src/stm32f3xx_hal_msp.c **** /**CAN GPIO Configuration + 148 .loc 1 96 5 view .LVU31 + 149 003c 5B69 ldr r3, [r3, #20] + 150 003e 03F40033 and r3, r3, #131072 + 151 0042 0293 str r3, [sp, #8] + 96:Core/Src/stm32f3xx_hal_msp.c **** /**CAN GPIO Configuration + 152 .loc 1 96 5 view .LVU32 + 153 0044 029B ldr r3, [sp, #8] + 154 .LBE5: + 96:Core/Src/stm32f3xx_hal_msp.c **** /**CAN GPIO Configuration + 155 .loc 1 96 5 view .LVU33 + 101:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + 156 .loc 1 101 5 view .LVU34 + 101:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + 157 .loc 1 101 25 is_stmt 0 view .LVU35 + 158 0046 4FF4C053 mov r3, #6144 + ARM GAS /tmp/ccBY67LK.s page 6 + + + 159 004a 0393 str r3, [sp, #12] + 102:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Pull = GPIO_NOPULL; + 160 .loc 1 102 5 is_stmt 1 view .LVU36 + 102:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Pull = GPIO_NOPULL; + 161 .loc 1 102 26 is_stmt 0 view .LVU37 + 162 004c 0223 movs r3, #2 + 163 004e 0493 str r3, [sp, #16] + 103:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + 164 .loc 1 103 5 is_stmt 1 view .LVU38 + 104:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Alternate = GPIO_AF9_CAN; + 165 .loc 1 104 5 view .LVU39 + 104:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Alternate = GPIO_AF9_CAN; + 166 .loc 1 104 27 is_stmt 0 view .LVU40 + 167 0050 0323 movs r3, #3 + 168 0052 0693 str r3, [sp, #24] + 105:Core/Src/stm32f3xx_hal_msp.c **** HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + 169 .loc 1 105 5 is_stmt 1 view .LVU41 + 105:Core/Src/stm32f3xx_hal_msp.c **** HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + 170 .loc 1 105 31 is_stmt 0 view .LVU42 + 171 0054 0923 movs r3, #9 + 172 0056 0793 str r3, [sp, #28] + 106:Core/Src/stm32f3xx_hal_msp.c **** + 173 .loc 1 106 5 is_stmt 1 view .LVU43 + 174 0058 03A9 add r1, sp, #12 + 175 005a 4FF09040 mov r0, #1207959552 + 176 .LVL3: + 106:Core/Src/stm32f3xx_hal_msp.c **** + 177 .loc 1 106 5 is_stmt 0 view .LVU44 + 178 005e FFF7FEFF bl HAL_GPIO_Init + 179 .LVL4: + 109:Core/Src/stm32f3xx_hal_msp.c **** HAL_NVIC_EnableIRQ(USB_LP_CAN_RX0_IRQn); + 180 .loc 1 109 5 is_stmt 1 view .LVU45 + 181 0062 0022 movs r2, #0 + 182 0064 1146 mov r1, r2 + 183 0066 1420 movs r0, #20 + 184 0068 FFF7FEFF bl HAL_NVIC_SetPriority + 185 .LVL5: + 110:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE BEGIN CAN_MspInit 1 */ + 186 .loc 1 110 5 view .LVU46 + 187 006c 1420 movs r0, #20 + 188 006e FFF7FEFF bl HAL_NVIC_EnableIRQ + 189 .LVL6: + 190 .loc 1 116 1 is_stmt 0 view .LVU47 + 191 0072 D1E7 b .L5 + 192 .L10: + 193 .align 2 + 194 .L9: + 195 0074 00640040 .word 1073767424 + 196 .cfi_endproc + 197 .LFE131: + 199 .section .text.HAL_CAN_MspDeInit,"ax",%progbits + 200 .align 1 + 201 .global HAL_CAN_MspDeInit + 202 .syntax unified + 203 .thumb + 204 .thumb_func + 206 HAL_CAN_MspDeInit: + ARM GAS /tmp/ccBY67LK.s page 7 + + + 207 .LVL7: + 208 .LFB132: + 117:Core/Src/stm32f3xx_hal_msp.c **** + 118:Core/Src/stm32f3xx_hal_msp.c **** /** + 119:Core/Src/stm32f3xx_hal_msp.c **** * @brief CAN MSP De-Initialization + 120:Core/Src/stm32f3xx_hal_msp.c **** * This function freeze the hardware resources used in this example + 121:Core/Src/stm32f3xx_hal_msp.c **** * @param hcan: CAN handle pointer + 122:Core/Src/stm32f3xx_hal_msp.c **** * @retval None + 123:Core/Src/stm32f3xx_hal_msp.c **** */ + 124:Core/Src/stm32f3xx_hal_msp.c **** void HAL_CAN_MspDeInit(CAN_HandleTypeDef* hcan) + 125:Core/Src/stm32f3xx_hal_msp.c **** { + 209 .loc 1 125 1 is_stmt 1 view -0 + 210 .cfi_startproc + 211 @ args = 0, pretend = 0, frame = 0 + 212 @ frame_needed = 0, uses_anonymous_args = 0 + 213 .loc 1 125 1 is_stmt 0 view .LVU49 + 214 0000 08B5 push {r3, lr} + 215 .cfi_def_cfa_offset 8 + 216 .cfi_offset 3, -8 + 217 .cfi_offset 14, -4 + 126:Core/Src/stm32f3xx_hal_msp.c **** if(hcan->Instance==CAN) + 218 .loc 1 126 3 is_stmt 1 view .LVU50 + 219 .loc 1 126 10 is_stmt 0 view .LVU51 + 220 0002 0268 ldr r2, [r0] + 221 .loc 1 126 5 view .LVU52 + 222 0004 094B ldr r3, .L15 + 223 0006 9A42 cmp r2, r3 + 224 0008 00D0 beq .L14 + 225 .LVL8: + 226 .L11: + 127:Core/Src/stm32f3xx_hal_msp.c **** { + 128:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE BEGIN CAN_MspDeInit 0 */ + 129:Core/Src/stm32f3xx_hal_msp.c **** + 130:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE END CAN_MspDeInit 0 */ + 131:Core/Src/stm32f3xx_hal_msp.c **** /* Peripheral clock disable */ + 132:Core/Src/stm32f3xx_hal_msp.c **** __HAL_RCC_CAN1_CLK_DISABLE(); + 133:Core/Src/stm32f3xx_hal_msp.c **** + 134:Core/Src/stm32f3xx_hal_msp.c **** /**CAN GPIO Configuration + 135:Core/Src/stm32f3xx_hal_msp.c **** PA11 ------> CAN_RX + 136:Core/Src/stm32f3xx_hal_msp.c **** PA12 ------> CAN_TX + 137:Core/Src/stm32f3xx_hal_msp.c **** */ + 138:Core/Src/stm32f3xx_hal_msp.c **** HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11|GPIO_PIN_12); + 139:Core/Src/stm32f3xx_hal_msp.c **** + 140:Core/Src/stm32f3xx_hal_msp.c **** /* CAN interrupt DeInit */ + 141:Core/Src/stm32f3xx_hal_msp.c **** HAL_NVIC_DisableIRQ(USB_LP_CAN_RX0_IRQn); + 142:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE BEGIN CAN_MspDeInit 1 */ + 143:Core/Src/stm32f3xx_hal_msp.c **** + 144:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE END CAN_MspDeInit 1 */ + 145:Core/Src/stm32f3xx_hal_msp.c **** } + 146:Core/Src/stm32f3xx_hal_msp.c **** + 147:Core/Src/stm32f3xx_hal_msp.c **** } + 227 .loc 1 147 1 view .LVU53 + 228 000a 08BD pop {r3, pc} + 229 .LVL9: + 230 .L14: + 132:Core/Src/stm32f3xx_hal_msp.c **** + 231 .loc 1 132 5 is_stmt 1 view .LVU54 + ARM GAS /tmp/ccBY67LK.s page 8 + + + 232 000c 084A ldr r2, .L15+4 + 233 000e D369 ldr r3, [r2, #28] + 234 0010 23F00073 bic r3, r3, #33554432 + 235 0014 D361 str r3, [r2, #28] + 138:Core/Src/stm32f3xx_hal_msp.c **** + 236 .loc 1 138 5 view .LVU55 + 237 0016 4FF4C051 mov r1, #6144 + 238 001a 4FF09040 mov r0, #1207959552 + 239 .LVL10: + 138:Core/Src/stm32f3xx_hal_msp.c **** + 240 .loc 1 138 5 is_stmt 0 view .LVU56 + 241 001e FFF7FEFF bl HAL_GPIO_DeInit + 242 .LVL11: + 141:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE BEGIN CAN_MspDeInit 1 */ + 243 .loc 1 141 5 is_stmt 1 view .LVU57 + 244 0022 1420 movs r0, #20 + 245 0024 FFF7FEFF bl HAL_NVIC_DisableIRQ + 246 .LVL12: + 247 .loc 1 147 1 is_stmt 0 view .LVU58 + 248 0028 EFE7 b .L11 + 249 .L16: + 250 002a 00BF .align 2 + 251 .L15: + 252 002c 00640040 .word 1073767424 + 253 0030 00100240 .word 1073876992 + 254 .cfi_endproc + 255 .LFE132: + 257 .section .text.HAL_I2C_MspInit,"ax",%progbits + 258 .align 1 + 259 .global HAL_I2C_MspInit + 260 .syntax unified + 261 .thumb + 262 .thumb_func + 264 HAL_I2C_MspInit: + 265 .LVL13: + 266 .LFB133: + 148:Core/Src/stm32f3xx_hal_msp.c **** + 149:Core/Src/stm32f3xx_hal_msp.c **** /** + 150:Core/Src/stm32f3xx_hal_msp.c **** * @brief I2C MSP Initialization + 151:Core/Src/stm32f3xx_hal_msp.c **** * This function configures the hardware resources used in this example + 152:Core/Src/stm32f3xx_hal_msp.c **** * @param hi2c: I2C handle pointer + 153:Core/Src/stm32f3xx_hal_msp.c **** * @retval None + 154:Core/Src/stm32f3xx_hal_msp.c **** */ + 155:Core/Src/stm32f3xx_hal_msp.c **** void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c) + 156:Core/Src/stm32f3xx_hal_msp.c **** { + 267 .loc 1 156 1 is_stmt 1 view -0 + 268 .cfi_startproc + 269 @ args = 0, pretend = 0, frame = 40 + 270 @ frame_needed = 0, uses_anonymous_args = 0 + 271 .loc 1 156 1 is_stmt 0 view .LVU60 + 272 0000 F0B5 push {r4, r5, r6, r7, lr} + 273 .cfi_def_cfa_offset 20 + 274 .cfi_offset 4, -20 + 275 .cfi_offset 5, -16 + 276 .cfi_offset 6, -12 + 277 .cfi_offset 7, -8 + 278 .cfi_offset 14, -4 + ARM GAS /tmp/ccBY67LK.s page 9 + + + 279 0002 8BB0 sub sp, sp, #44 + 280 .cfi_def_cfa_offset 64 + 157:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitTypeDef GPIO_InitStruct = {0}; + 281 .loc 1 157 3 is_stmt 1 view .LVU61 + 282 .loc 1 157 20 is_stmt 0 view .LVU62 + 283 0004 0023 movs r3, #0 + 284 0006 0593 str r3, [sp, #20] + 285 0008 0693 str r3, [sp, #24] + 286 000a 0793 str r3, [sp, #28] + 287 000c 0893 str r3, [sp, #32] + 288 000e 0993 str r3, [sp, #36] + 158:Core/Src/stm32f3xx_hal_msp.c **** if(hi2c->Instance==I2C1) + 289 .loc 1 158 3 is_stmt 1 view .LVU63 + 290 .loc 1 158 10 is_stmt 0 view .LVU64 + 291 0010 0368 ldr r3, [r0] + 292 .loc 1 158 5 view .LVU65 + 293 0012 304A ldr r2, .L23 + 294 0014 9342 cmp r3, r2 + 295 0016 04D0 beq .L21 + 159:Core/Src/stm32f3xx_hal_msp.c **** { + 160:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE BEGIN I2C1_MspInit 0 */ + 161:Core/Src/stm32f3xx_hal_msp.c **** + 162:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE END I2C1_MspInit 0 */ + 163:Core/Src/stm32f3xx_hal_msp.c **** + 164:Core/Src/stm32f3xx_hal_msp.c **** __HAL_RCC_GPIOA_CLK_ENABLE(); + 165:Core/Src/stm32f3xx_hal_msp.c **** __HAL_RCC_GPIOB_CLK_ENABLE(); + 166:Core/Src/stm32f3xx_hal_msp.c **** /**I2C1 GPIO Configuration + 167:Core/Src/stm32f3xx_hal_msp.c **** PA15 ------> I2C1_SCL + 168:Core/Src/stm32f3xx_hal_msp.c **** PB7 ------> I2C1_SDA + 169:Core/Src/stm32f3xx_hal_msp.c **** */ + 170:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Pin = TMP_SCL_Pin; + 171:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + 172:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Pull = GPIO_NOPULL; + 173:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + 174:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; + 175:Core/Src/stm32f3xx_hal_msp.c **** HAL_GPIO_Init(TMP_SCL_GPIO_Port, &GPIO_InitStruct); + 176:Core/Src/stm32f3xx_hal_msp.c **** + 177:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Pin = TMP_SDA_Pin; + 178:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + 179:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Pull = GPIO_NOPULL; + 180:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + 181:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; + 182:Core/Src/stm32f3xx_hal_msp.c **** HAL_GPIO_Init(TMP_SDA_GPIO_Port, &GPIO_InitStruct); + 183:Core/Src/stm32f3xx_hal_msp.c **** + 184:Core/Src/stm32f3xx_hal_msp.c **** /* Peripheral clock enable */ + 185:Core/Src/stm32f3xx_hal_msp.c **** __HAL_RCC_I2C1_CLK_ENABLE(); + 186:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE BEGIN I2C1_MspInit 1 */ + 187:Core/Src/stm32f3xx_hal_msp.c **** + 188:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE END I2C1_MspInit 1 */ + 189:Core/Src/stm32f3xx_hal_msp.c **** } + 190:Core/Src/stm32f3xx_hal_msp.c **** else if(hi2c->Instance==I2C2) + 296 .loc 1 190 8 is_stmt 1 view .LVU66 + 297 .loc 1 190 10 is_stmt 0 view .LVU67 + 298 0018 2F4A ldr r2, .L23+4 + 299 001a 9342 cmp r3, r2 + 300 001c 37D0 beq .L22 + 301 .LVL14: + ARM GAS /tmp/ccBY67LK.s page 10 + + + 302 .L17: + 191:Core/Src/stm32f3xx_hal_msp.c **** { + 192:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE BEGIN I2C2_MspInit 0 */ + 193:Core/Src/stm32f3xx_hal_msp.c **** + 194:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE END I2C2_MspInit 0 */ + 195:Core/Src/stm32f3xx_hal_msp.c **** + 196:Core/Src/stm32f3xx_hal_msp.c **** __HAL_RCC_GPIOA_CLK_ENABLE(); + 197:Core/Src/stm32f3xx_hal_msp.c **** /**I2C2 GPIO Configuration + 198:Core/Src/stm32f3xx_hal_msp.c **** PA9 ------> I2C2_SCL + 199:Core/Src/stm32f3xx_hal_msp.c **** PA10 ------> I2C2_SDA + 200:Core/Src/stm32f3xx_hal_msp.c **** */ + 201:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10; + 202:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + 203:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Pull = GPIO_NOPULL; + 204:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + 205:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Alternate = GPIO_AF4_I2C2; + 206:Core/Src/stm32f3xx_hal_msp.c **** HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + 207:Core/Src/stm32f3xx_hal_msp.c **** + 208:Core/Src/stm32f3xx_hal_msp.c **** /* Peripheral clock enable */ + 209:Core/Src/stm32f3xx_hal_msp.c **** __HAL_RCC_I2C2_CLK_ENABLE(); + 210:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE BEGIN I2C2_MspInit 1 */ + 211:Core/Src/stm32f3xx_hal_msp.c **** + 212:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE END I2C2_MspInit 1 */ + 213:Core/Src/stm32f3xx_hal_msp.c **** } + 214:Core/Src/stm32f3xx_hal_msp.c **** + 215:Core/Src/stm32f3xx_hal_msp.c **** } + 303 .loc 1 215 1 view .LVU68 + 304 001e 0BB0 add sp, sp, #44 + 305 .cfi_remember_state + 306 .cfi_def_cfa_offset 20 + 307 @ sp needed + 308 0020 F0BD pop {r4, r5, r6, r7, pc} + 309 .LVL15: + 310 .L21: + 311 .cfi_restore_state + 164:Core/Src/stm32f3xx_hal_msp.c **** __HAL_RCC_GPIOB_CLK_ENABLE(); + 312 .loc 1 164 5 is_stmt 1 view .LVU69 + 313 .LBB6: + 164:Core/Src/stm32f3xx_hal_msp.c **** __HAL_RCC_GPIOB_CLK_ENABLE(); + 314 .loc 1 164 5 view .LVU70 + 164:Core/Src/stm32f3xx_hal_msp.c **** __HAL_RCC_GPIOB_CLK_ENABLE(); + 315 .loc 1 164 5 view .LVU71 + 316 0022 2E4C ldr r4, .L23+8 + 317 0024 6369 ldr r3, [r4, #20] + 318 0026 43F40033 orr r3, r3, #131072 + 319 002a 6361 str r3, [r4, #20] + 164:Core/Src/stm32f3xx_hal_msp.c **** __HAL_RCC_GPIOB_CLK_ENABLE(); + 320 .loc 1 164 5 view .LVU72 + 321 002c 6369 ldr r3, [r4, #20] + 322 002e 03F40033 and r3, r3, #131072 + 323 0032 0093 str r3, [sp] + 164:Core/Src/stm32f3xx_hal_msp.c **** __HAL_RCC_GPIOB_CLK_ENABLE(); + 324 .loc 1 164 5 view .LVU73 + 325 0034 009B ldr r3, [sp] + 326 .LBE6: + 164:Core/Src/stm32f3xx_hal_msp.c **** __HAL_RCC_GPIOB_CLK_ENABLE(); + 327 .loc 1 164 5 view .LVU74 + ARM GAS /tmp/ccBY67LK.s page 11 + + + 165:Core/Src/stm32f3xx_hal_msp.c **** /**I2C1 GPIO Configuration + 328 .loc 1 165 5 view .LVU75 + 329 .LBB7: + 165:Core/Src/stm32f3xx_hal_msp.c **** /**I2C1 GPIO Configuration + 330 .loc 1 165 5 view .LVU76 + 165:Core/Src/stm32f3xx_hal_msp.c **** /**I2C1 GPIO Configuration + 331 .loc 1 165 5 view .LVU77 + 332 0036 6369 ldr r3, [r4, #20] + 333 0038 43F48023 orr r3, r3, #262144 + 334 003c 6361 str r3, [r4, #20] + 165:Core/Src/stm32f3xx_hal_msp.c **** /**I2C1 GPIO Configuration + 335 .loc 1 165 5 view .LVU78 + 336 003e 6369 ldr r3, [r4, #20] + 337 0040 03F48023 and r3, r3, #262144 + 338 0044 0193 str r3, [sp, #4] + 165:Core/Src/stm32f3xx_hal_msp.c **** /**I2C1 GPIO Configuration + 339 .loc 1 165 5 view .LVU79 + 340 0046 019B ldr r3, [sp, #4] + 341 .LBE7: + 165:Core/Src/stm32f3xx_hal_msp.c **** /**I2C1 GPIO Configuration + 342 .loc 1 165 5 view .LVU80 + 170:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + 343 .loc 1 170 5 view .LVU81 + 170:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + 344 .loc 1 170 25 is_stmt 0 view .LVU82 + 345 0048 4FF40043 mov r3, #32768 + 346 004c 0593 str r3, [sp, #20] + 171:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Pull = GPIO_NOPULL; + 347 .loc 1 171 5 is_stmt 1 view .LVU83 + 171:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Pull = GPIO_NOPULL; + 348 .loc 1 171 26 is_stmt 0 view .LVU84 + 349 004e 1227 movs r7, #18 + 350 0050 0697 str r7, [sp, #24] + 172:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + 351 .loc 1 172 5 is_stmt 1 view .LVU85 + 173:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; + 352 .loc 1 173 5 view .LVU86 + 173:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; + 353 .loc 1 173 27 is_stmt 0 view .LVU87 + 354 0052 0326 movs r6, #3 + 355 0054 0896 str r6, [sp, #32] + 174:Core/Src/stm32f3xx_hal_msp.c **** HAL_GPIO_Init(TMP_SCL_GPIO_Port, &GPIO_InitStruct); + 356 .loc 1 174 5 is_stmt 1 view .LVU88 + 174:Core/Src/stm32f3xx_hal_msp.c **** HAL_GPIO_Init(TMP_SCL_GPIO_Port, &GPIO_InitStruct); + 357 .loc 1 174 31 is_stmt 0 view .LVU89 + 358 0056 0425 movs r5, #4 + 359 0058 0995 str r5, [sp, #36] + 175:Core/Src/stm32f3xx_hal_msp.c **** + 360 .loc 1 175 5 is_stmt 1 view .LVU90 + 361 005a 05A9 add r1, sp, #20 + 362 005c 4FF09040 mov r0, #1207959552 + 363 .LVL16: + 175:Core/Src/stm32f3xx_hal_msp.c **** + 364 .loc 1 175 5 is_stmt 0 view .LVU91 + 365 0060 FFF7FEFF bl HAL_GPIO_Init + 366 .LVL17: + 177:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + ARM GAS /tmp/ccBY67LK.s page 12 + + + 367 .loc 1 177 5 is_stmt 1 view .LVU92 + 177:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + 368 .loc 1 177 25 is_stmt 0 view .LVU93 + 369 0064 8023 movs r3, #128 + 370 0066 0593 str r3, [sp, #20] + 178:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Pull = GPIO_NOPULL; + 371 .loc 1 178 5 is_stmt 1 view .LVU94 + 178:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Pull = GPIO_NOPULL; + 372 .loc 1 178 26 is_stmt 0 view .LVU95 + 373 0068 0697 str r7, [sp, #24] + 179:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + 374 .loc 1 179 5 is_stmt 1 view .LVU96 + 179:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + 375 .loc 1 179 26 is_stmt 0 view .LVU97 + 376 006a 0023 movs r3, #0 + 377 006c 0793 str r3, [sp, #28] + 180:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; + 378 .loc 1 180 5 is_stmt 1 view .LVU98 + 180:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; + 379 .loc 1 180 27 is_stmt 0 view .LVU99 + 380 006e 0896 str r6, [sp, #32] + 181:Core/Src/stm32f3xx_hal_msp.c **** HAL_GPIO_Init(TMP_SDA_GPIO_Port, &GPIO_InitStruct); + 381 .loc 1 181 5 is_stmt 1 view .LVU100 + 181:Core/Src/stm32f3xx_hal_msp.c **** HAL_GPIO_Init(TMP_SDA_GPIO_Port, &GPIO_InitStruct); + 382 .loc 1 181 31 is_stmt 0 view .LVU101 + 383 0070 0995 str r5, [sp, #36] + 182:Core/Src/stm32f3xx_hal_msp.c **** + 384 .loc 1 182 5 is_stmt 1 view .LVU102 + 385 0072 05A9 add r1, sp, #20 + 386 0074 1A48 ldr r0, .L23+12 + 387 0076 FFF7FEFF bl HAL_GPIO_Init + 388 .LVL18: + 185:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE BEGIN I2C1_MspInit 1 */ + 389 .loc 1 185 5 view .LVU103 + 390 .LBB8: + 185:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE BEGIN I2C1_MspInit 1 */ + 391 .loc 1 185 5 view .LVU104 + 185:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE BEGIN I2C1_MspInit 1 */ + 392 .loc 1 185 5 view .LVU105 + 393 007a E369 ldr r3, [r4, #28] + 394 007c 43F40013 orr r3, r3, #2097152 + 395 0080 E361 str r3, [r4, #28] + 185:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE BEGIN I2C1_MspInit 1 */ + 396 .loc 1 185 5 view .LVU106 + 397 0082 E369 ldr r3, [r4, #28] + 398 0084 03F40013 and r3, r3, #2097152 + 399 0088 0293 str r3, [sp, #8] + 185:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE BEGIN I2C1_MspInit 1 */ + 400 .loc 1 185 5 view .LVU107 + 401 008a 029B ldr r3, [sp, #8] + 402 .LBE8: + 185:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE BEGIN I2C1_MspInit 1 */ + 403 .loc 1 185 5 view .LVU108 + 404 008c C7E7 b .L17 + 405 .LVL19: + 406 .L22: + 196:Core/Src/stm32f3xx_hal_msp.c **** /**I2C2 GPIO Configuration + ARM GAS /tmp/ccBY67LK.s page 13 + + + 407 .loc 1 196 5 view .LVU109 + 408 .LBB9: + 196:Core/Src/stm32f3xx_hal_msp.c **** /**I2C2 GPIO Configuration + 409 .loc 1 196 5 view .LVU110 + 196:Core/Src/stm32f3xx_hal_msp.c **** /**I2C2 GPIO Configuration + 410 .loc 1 196 5 view .LVU111 + 411 008e 134C ldr r4, .L23+8 + 412 0090 6369 ldr r3, [r4, #20] + 413 0092 43F40033 orr r3, r3, #131072 + 414 0096 6361 str r3, [r4, #20] + 196:Core/Src/stm32f3xx_hal_msp.c **** /**I2C2 GPIO Configuration + 415 .loc 1 196 5 view .LVU112 + 416 0098 6369 ldr r3, [r4, #20] + 417 009a 03F40033 and r3, r3, #131072 + 418 009e 0393 str r3, [sp, #12] + 196:Core/Src/stm32f3xx_hal_msp.c **** /**I2C2 GPIO Configuration + 419 .loc 1 196 5 view .LVU113 + 420 00a0 039B ldr r3, [sp, #12] + 421 .LBE9: + 196:Core/Src/stm32f3xx_hal_msp.c **** /**I2C2 GPIO Configuration + 422 .loc 1 196 5 view .LVU114 + 201:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + 423 .loc 1 201 5 view .LVU115 + 201:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + 424 .loc 1 201 25 is_stmt 0 view .LVU116 + 425 00a2 4FF4C063 mov r3, #1536 + 426 00a6 0593 str r3, [sp, #20] + 202:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Pull = GPIO_NOPULL; + 427 .loc 1 202 5 is_stmt 1 view .LVU117 + 202:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Pull = GPIO_NOPULL; + 428 .loc 1 202 26 is_stmt 0 view .LVU118 + 429 00a8 1223 movs r3, #18 + 430 00aa 0693 str r3, [sp, #24] + 203:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + 431 .loc 1 203 5 is_stmt 1 view .LVU119 + 204:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Alternate = GPIO_AF4_I2C2; + 432 .loc 1 204 5 view .LVU120 + 204:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Alternate = GPIO_AF4_I2C2; + 433 .loc 1 204 27 is_stmt 0 view .LVU121 + 434 00ac 0323 movs r3, #3 + 435 00ae 0893 str r3, [sp, #32] + 205:Core/Src/stm32f3xx_hal_msp.c **** HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + 436 .loc 1 205 5 is_stmt 1 view .LVU122 + 205:Core/Src/stm32f3xx_hal_msp.c **** HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + 437 .loc 1 205 31 is_stmt 0 view .LVU123 + 438 00b0 0423 movs r3, #4 + 439 00b2 0993 str r3, [sp, #36] + 206:Core/Src/stm32f3xx_hal_msp.c **** + 440 .loc 1 206 5 is_stmt 1 view .LVU124 + 441 00b4 05A9 add r1, sp, #20 + 442 00b6 4FF09040 mov r0, #1207959552 + 443 .LVL20: + 206:Core/Src/stm32f3xx_hal_msp.c **** + 444 .loc 1 206 5 is_stmt 0 view .LVU125 + 445 00ba FFF7FEFF bl HAL_GPIO_Init + 446 .LVL21: + 209:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE BEGIN I2C2_MspInit 1 */ + ARM GAS /tmp/ccBY67LK.s page 14 + + + 447 .loc 1 209 5 is_stmt 1 view .LVU126 + 448 .LBB10: + 209:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE BEGIN I2C2_MspInit 1 */ + 449 .loc 1 209 5 view .LVU127 + 209:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE BEGIN I2C2_MspInit 1 */ + 450 .loc 1 209 5 view .LVU128 + 451 00be E369 ldr r3, [r4, #28] + 452 00c0 43F48003 orr r3, r3, #4194304 + 453 00c4 E361 str r3, [r4, #28] + 209:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE BEGIN I2C2_MspInit 1 */ + 454 .loc 1 209 5 view .LVU129 + 455 00c6 E369 ldr r3, [r4, #28] + 456 00c8 03F48003 and r3, r3, #4194304 + 457 00cc 0493 str r3, [sp, #16] + 209:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE BEGIN I2C2_MspInit 1 */ + 458 .loc 1 209 5 view .LVU130 + 459 00ce 049B ldr r3, [sp, #16] + 460 .LBE10: + 209:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE BEGIN I2C2_MspInit 1 */ + 461 .loc 1 209 5 view .LVU131 + 462 .loc 1 215 1 is_stmt 0 view .LVU132 + 463 00d0 A5E7 b .L17 + 464 .L24: + 465 00d2 00BF .align 2 + 466 .L23: + 467 00d4 00540040 .word 1073763328 + 468 00d8 00580040 .word 1073764352 + 469 00dc 00100240 .word 1073876992 + 470 00e0 00040048 .word 1207960576 + 471 .cfi_endproc + 472 .LFE133: + 474 .section .text.HAL_I2C_MspDeInit,"ax",%progbits + 475 .align 1 + 476 .global HAL_I2C_MspDeInit + 477 .syntax unified + 478 .thumb + 479 .thumb_func + 481 HAL_I2C_MspDeInit: + 482 .LVL22: + 483 .LFB134: + 216:Core/Src/stm32f3xx_hal_msp.c **** + 217:Core/Src/stm32f3xx_hal_msp.c **** /** + 218:Core/Src/stm32f3xx_hal_msp.c **** * @brief I2C MSP De-Initialization + 219:Core/Src/stm32f3xx_hal_msp.c **** * This function freeze the hardware resources used in this example + 220:Core/Src/stm32f3xx_hal_msp.c **** * @param hi2c: I2C handle pointer + 221:Core/Src/stm32f3xx_hal_msp.c **** * @retval None + 222:Core/Src/stm32f3xx_hal_msp.c **** */ + 223:Core/Src/stm32f3xx_hal_msp.c **** void HAL_I2C_MspDeInit(I2C_HandleTypeDef* hi2c) + 224:Core/Src/stm32f3xx_hal_msp.c **** { + 484 .loc 1 224 1 is_stmt 1 view -0 + 485 .cfi_startproc + 486 @ args = 0, pretend = 0, frame = 0 + 487 @ frame_needed = 0, uses_anonymous_args = 0 + 488 .loc 1 224 1 is_stmt 0 view .LVU134 + 489 0000 08B5 push {r3, lr} + 490 .cfi_def_cfa_offset 8 + 491 .cfi_offset 3, -8 + ARM GAS /tmp/ccBY67LK.s page 15 + + + 492 .cfi_offset 14, -4 + 225:Core/Src/stm32f3xx_hal_msp.c **** if(hi2c->Instance==I2C1) + 493 .loc 1 225 3 is_stmt 1 view .LVU135 + 494 .loc 1 225 10 is_stmt 0 view .LVU136 + 495 0002 0368 ldr r3, [r0] + 496 .loc 1 225 5 view .LVU137 + 497 0004 154A ldr r2, .L31 + 498 0006 9342 cmp r3, r2 + 499 0008 03D0 beq .L29 + 226:Core/Src/stm32f3xx_hal_msp.c **** { + 227:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE BEGIN I2C1_MspDeInit 0 */ + 228:Core/Src/stm32f3xx_hal_msp.c **** + 229:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE END I2C1_MspDeInit 0 */ + 230:Core/Src/stm32f3xx_hal_msp.c **** /* Peripheral clock disable */ + 231:Core/Src/stm32f3xx_hal_msp.c **** __HAL_RCC_I2C1_CLK_DISABLE(); + 232:Core/Src/stm32f3xx_hal_msp.c **** + 233:Core/Src/stm32f3xx_hal_msp.c **** /**I2C1 GPIO Configuration + 234:Core/Src/stm32f3xx_hal_msp.c **** PA15 ------> I2C1_SCL + 235:Core/Src/stm32f3xx_hal_msp.c **** PB7 ------> I2C1_SDA + 236:Core/Src/stm32f3xx_hal_msp.c **** */ + 237:Core/Src/stm32f3xx_hal_msp.c **** HAL_GPIO_DeInit(TMP_SCL_GPIO_Port, TMP_SCL_Pin); + 238:Core/Src/stm32f3xx_hal_msp.c **** + 239:Core/Src/stm32f3xx_hal_msp.c **** HAL_GPIO_DeInit(TMP_SDA_GPIO_Port, TMP_SDA_Pin); + 240:Core/Src/stm32f3xx_hal_msp.c **** + 241:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE BEGIN I2C1_MspDeInit 1 */ + 242:Core/Src/stm32f3xx_hal_msp.c **** + 243:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE END I2C1_MspDeInit 1 */ + 244:Core/Src/stm32f3xx_hal_msp.c **** } + 245:Core/Src/stm32f3xx_hal_msp.c **** else if(hi2c->Instance==I2C2) + 500 .loc 1 245 8 is_stmt 1 view .LVU138 + 501 .loc 1 245 10 is_stmt 0 view .LVU139 + 502 000a 154A ldr r2, .L31+4 + 503 000c 9342 cmp r3, r2 + 504 000e 11D0 beq .L30 + 505 .LVL23: + 506 .L25: + 246:Core/Src/stm32f3xx_hal_msp.c **** { + 247:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE BEGIN I2C2_MspDeInit 0 */ + 248:Core/Src/stm32f3xx_hal_msp.c **** + 249:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE END I2C2_MspDeInit 0 */ + 250:Core/Src/stm32f3xx_hal_msp.c **** /* Peripheral clock disable */ + 251:Core/Src/stm32f3xx_hal_msp.c **** __HAL_RCC_I2C2_CLK_DISABLE(); + 252:Core/Src/stm32f3xx_hal_msp.c **** + 253:Core/Src/stm32f3xx_hal_msp.c **** /**I2C2 GPIO Configuration + 254:Core/Src/stm32f3xx_hal_msp.c **** PA9 ------> I2C2_SCL + 255:Core/Src/stm32f3xx_hal_msp.c **** PA10 ------> I2C2_SDA + 256:Core/Src/stm32f3xx_hal_msp.c **** */ + 257:Core/Src/stm32f3xx_hal_msp.c **** HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9); + 258:Core/Src/stm32f3xx_hal_msp.c **** + 259:Core/Src/stm32f3xx_hal_msp.c **** HAL_GPIO_DeInit(GPIOA, GPIO_PIN_10); + 260:Core/Src/stm32f3xx_hal_msp.c **** + 261:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE BEGIN I2C2_MspDeInit 1 */ + 262:Core/Src/stm32f3xx_hal_msp.c **** + 263:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE END I2C2_MspDeInit 1 */ + 264:Core/Src/stm32f3xx_hal_msp.c **** } + 265:Core/Src/stm32f3xx_hal_msp.c **** + 266:Core/Src/stm32f3xx_hal_msp.c **** } + ARM GAS /tmp/ccBY67LK.s page 16 + + + 507 .loc 1 266 1 view .LVU140 + 508 0010 08BD pop {r3, pc} + 509 .LVL24: + 510 .L29: + 231:Core/Src/stm32f3xx_hal_msp.c **** + 511 .loc 1 231 5 is_stmt 1 view .LVU141 + 512 0012 02F5DE32 add r2, r2, #113664 + 513 0016 D369 ldr r3, [r2, #28] + 514 0018 23F40013 bic r3, r3, #2097152 + 515 001c D361 str r3, [r2, #28] + 237:Core/Src/stm32f3xx_hal_msp.c **** + 516 .loc 1 237 5 view .LVU142 + 517 001e 4FF40041 mov r1, #32768 + 518 0022 4FF09040 mov r0, #1207959552 + 519 .LVL25: + 237:Core/Src/stm32f3xx_hal_msp.c **** + 520 .loc 1 237 5 is_stmt 0 view .LVU143 + 521 0026 FFF7FEFF bl HAL_GPIO_DeInit + 522 .LVL26: + 239:Core/Src/stm32f3xx_hal_msp.c **** + 523 .loc 1 239 5 is_stmt 1 view .LVU144 + 524 002a 8021 movs r1, #128 + 525 002c 0D48 ldr r0, .L31+8 + 526 002e FFF7FEFF bl HAL_GPIO_DeInit + 527 .LVL27: + 528 0032 EDE7 b .L25 + 529 .LVL28: + 530 .L30: + 251:Core/Src/stm32f3xx_hal_msp.c **** + 531 .loc 1 251 5 view .LVU145 + 532 0034 02F5DC32 add r2, r2, #112640 + 533 0038 D369 ldr r3, [r2, #28] + 534 003a 23F48003 bic r3, r3, #4194304 + 535 003e D361 str r3, [r2, #28] + 257:Core/Src/stm32f3xx_hal_msp.c **** + 536 .loc 1 257 5 view .LVU146 + 537 0040 4FF40071 mov r1, #512 + 538 0044 4FF09040 mov r0, #1207959552 + 539 .LVL29: + 257:Core/Src/stm32f3xx_hal_msp.c **** + 540 .loc 1 257 5 is_stmt 0 view .LVU147 + 541 0048 FFF7FEFF bl HAL_GPIO_DeInit + 542 .LVL30: + 259:Core/Src/stm32f3xx_hal_msp.c **** + 543 .loc 1 259 5 is_stmt 1 view .LVU148 + 544 004c 4FF48061 mov r1, #1024 + 545 0050 4FF09040 mov r0, #1207959552 + 546 0054 FFF7FEFF bl HAL_GPIO_DeInit + 547 .LVL31: + 548 .loc 1 266 1 is_stmt 0 view .LVU149 + 549 0058 DAE7 b .L25 + 550 .L32: + 551 005a 00BF .align 2 + 552 .L31: + 553 005c 00540040 .word 1073763328 + 554 0060 00580040 .word 1073764352 + 555 0064 00040048 .word 1207960576 + ARM GAS /tmp/ccBY67LK.s page 17 + + + 556 .cfi_endproc + 557 .LFE134: + 559 .section .text.HAL_SPI_MspInit,"ax",%progbits + 560 .align 1 + 561 .global HAL_SPI_MspInit + 562 .syntax unified + 563 .thumb + 564 .thumb_func + 566 HAL_SPI_MspInit: + 567 .LVL32: + 568 .LFB135: + 267:Core/Src/stm32f3xx_hal_msp.c **** + 268:Core/Src/stm32f3xx_hal_msp.c **** /** + 269:Core/Src/stm32f3xx_hal_msp.c **** * @brief SPI MSP Initialization + 270:Core/Src/stm32f3xx_hal_msp.c **** * This function configures the hardware resources used in this example + 271:Core/Src/stm32f3xx_hal_msp.c **** * @param hspi: SPI handle pointer + 272:Core/Src/stm32f3xx_hal_msp.c **** * @retval None + 273:Core/Src/stm32f3xx_hal_msp.c **** */ + 274:Core/Src/stm32f3xx_hal_msp.c **** void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi) + 275:Core/Src/stm32f3xx_hal_msp.c **** { + 569 .loc 1 275 1 is_stmt 1 view -0 + 570 .cfi_startproc + 571 @ args = 0, pretend = 0, frame = 32 + 572 @ frame_needed = 0, uses_anonymous_args = 0 + 573 .loc 1 275 1 is_stmt 0 view .LVU151 + 574 0000 00B5 push {lr} + 575 .cfi_def_cfa_offset 4 + 576 .cfi_offset 14, -4 + 577 0002 89B0 sub sp, sp, #36 + 578 .cfi_def_cfa_offset 40 + 276:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitTypeDef GPIO_InitStruct = {0}; + 579 .loc 1 276 3 is_stmt 1 view .LVU152 + 580 .loc 1 276 20 is_stmt 0 view .LVU153 + 581 0004 0023 movs r3, #0 + 582 0006 0393 str r3, [sp, #12] + 583 0008 0493 str r3, [sp, #16] + 584 000a 0593 str r3, [sp, #20] + 585 000c 0693 str r3, [sp, #24] + 586 000e 0793 str r3, [sp, #28] + 277:Core/Src/stm32f3xx_hal_msp.c **** if(hspi->Instance==SPI1) + 587 .loc 1 277 3 is_stmt 1 view .LVU154 + 588 .loc 1 277 10 is_stmt 0 view .LVU155 + 589 0010 0268 ldr r2, [r0] + 590 .loc 1 277 5 view .LVU156 + 591 0012 144B ldr r3, .L37 + 592 0014 9A42 cmp r2, r3 + 593 0016 02D0 beq .L36 + 594 .LVL33: + 595 .L33: + 278:Core/Src/stm32f3xx_hal_msp.c **** { + 279:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE BEGIN SPI1_MspInit 0 */ + 280:Core/Src/stm32f3xx_hal_msp.c **** + 281:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE END SPI1_MspInit 0 */ + 282:Core/Src/stm32f3xx_hal_msp.c **** /* Peripheral clock enable */ + 283:Core/Src/stm32f3xx_hal_msp.c **** __HAL_RCC_SPI1_CLK_ENABLE(); + 284:Core/Src/stm32f3xx_hal_msp.c **** + 285:Core/Src/stm32f3xx_hal_msp.c **** __HAL_RCC_GPIOA_CLK_ENABLE(); + ARM GAS /tmp/ccBY67LK.s page 18 + + + 286:Core/Src/stm32f3xx_hal_msp.c **** /**SPI1 GPIO Configuration + 287:Core/Src/stm32f3xx_hal_msp.c **** PA5 ------> SPI1_SCK + 288:Core/Src/stm32f3xx_hal_msp.c **** PA6 ------> SPI1_MISO + 289:Core/Src/stm32f3xx_hal_msp.c **** PA7 ------> SPI1_MOSI + 290:Core/Src/stm32f3xx_hal_msp.c **** */ + 291:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; + 292:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + 293:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Pull = GPIO_NOPULL; + 294:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + 295:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; + 296:Core/Src/stm32f3xx_hal_msp.c **** HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + 297:Core/Src/stm32f3xx_hal_msp.c **** + 298:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE BEGIN SPI1_MspInit 1 */ + 299:Core/Src/stm32f3xx_hal_msp.c **** + 300:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE END SPI1_MspInit 1 */ + 301:Core/Src/stm32f3xx_hal_msp.c **** } + 302:Core/Src/stm32f3xx_hal_msp.c **** + 303:Core/Src/stm32f3xx_hal_msp.c **** } + 596 .loc 1 303 1 view .LVU157 + 597 0018 09B0 add sp, sp, #36 + 598 .cfi_remember_state + 599 .cfi_def_cfa_offset 4 + 600 @ sp needed + 601 001a 5DF804FB ldr pc, [sp], #4 + 602 .LVL34: + 603 .L36: + 604 .cfi_restore_state + 283:Core/Src/stm32f3xx_hal_msp.c **** + 605 .loc 1 283 5 is_stmt 1 view .LVU158 + 606 .LBB11: + 283:Core/Src/stm32f3xx_hal_msp.c **** + 607 .loc 1 283 5 view .LVU159 + 283:Core/Src/stm32f3xx_hal_msp.c **** + 608 .loc 1 283 5 view .LVU160 + 609 001e 03F56043 add r3, r3, #57344 + 610 0022 9A69 ldr r2, [r3, #24] + 611 0024 42F48052 orr r2, r2, #4096 + 612 0028 9A61 str r2, [r3, #24] + 283:Core/Src/stm32f3xx_hal_msp.c **** + 613 .loc 1 283 5 view .LVU161 + 614 002a 9A69 ldr r2, [r3, #24] + 615 002c 02F48052 and r2, r2, #4096 + 616 0030 0192 str r2, [sp, #4] + 283:Core/Src/stm32f3xx_hal_msp.c **** + 617 .loc 1 283 5 view .LVU162 + 618 0032 019A ldr r2, [sp, #4] + 619 .LBE11: + 283:Core/Src/stm32f3xx_hal_msp.c **** + 620 .loc 1 283 5 view .LVU163 + 285:Core/Src/stm32f3xx_hal_msp.c **** /**SPI1 GPIO Configuration + 621 .loc 1 285 5 view .LVU164 + 622 .LBB12: + 285:Core/Src/stm32f3xx_hal_msp.c **** /**SPI1 GPIO Configuration + 623 .loc 1 285 5 view .LVU165 + 285:Core/Src/stm32f3xx_hal_msp.c **** /**SPI1 GPIO Configuration + 624 .loc 1 285 5 view .LVU166 + 625 0034 5A69 ldr r2, [r3, #20] + ARM GAS /tmp/ccBY67LK.s page 19 + + + 626 0036 42F40032 orr r2, r2, #131072 + 627 003a 5A61 str r2, [r3, #20] + 285:Core/Src/stm32f3xx_hal_msp.c **** /**SPI1 GPIO Configuration + 628 .loc 1 285 5 view .LVU167 + 629 003c 5B69 ldr r3, [r3, #20] + 630 003e 03F40033 and r3, r3, #131072 + 631 0042 0293 str r3, [sp, #8] + 285:Core/Src/stm32f3xx_hal_msp.c **** /**SPI1 GPIO Configuration + 632 .loc 1 285 5 view .LVU168 + 633 0044 029B ldr r3, [sp, #8] + 634 .LBE12: + 285:Core/Src/stm32f3xx_hal_msp.c **** /**SPI1 GPIO Configuration + 635 .loc 1 285 5 view .LVU169 + 291:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + 636 .loc 1 291 5 view .LVU170 + 291:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + 637 .loc 1 291 25 is_stmt 0 view .LVU171 + 638 0046 E023 movs r3, #224 + 639 0048 0393 str r3, [sp, #12] + 292:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Pull = GPIO_NOPULL; + 640 .loc 1 292 5 is_stmt 1 view .LVU172 + 292:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Pull = GPIO_NOPULL; + 641 .loc 1 292 26 is_stmt 0 view .LVU173 + 642 004a 0223 movs r3, #2 + 643 004c 0493 str r3, [sp, #16] + 293:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + 644 .loc 1 293 5 is_stmt 1 view .LVU174 + 294:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; + 645 .loc 1 294 5 view .LVU175 + 294:Core/Src/stm32f3xx_hal_msp.c **** GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; + 646 .loc 1 294 27 is_stmt 0 view .LVU176 + 647 004e 0323 movs r3, #3 + 648 0050 0693 str r3, [sp, #24] + 295:Core/Src/stm32f3xx_hal_msp.c **** HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + 649 .loc 1 295 5 is_stmt 1 view .LVU177 + 295:Core/Src/stm32f3xx_hal_msp.c **** HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + 650 .loc 1 295 31 is_stmt 0 view .LVU178 + 651 0052 0523 movs r3, #5 + 652 0054 0793 str r3, [sp, #28] + 296:Core/Src/stm32f3xx_hal_msp.c **** + 653 .loc 1 296 5 is_stmt 1 view .LVU179 + 654 0056 03A9 add r1, sp, #12 + 655 0058 4FF09040 mov r0, #1207959552 + 656 .LVL35: + 296:Core/Src/stm32f3xx_hal_msp.c **** + 657 .loc 1 296 5 is_stmt 0 view .LVU180 + 658 005c FFF7FEFF bl HAL_GPIO_Init + 659 .LVL36: + 660 .loc 1 303 1 view .LVU181 + 661 0060 DAE7 b .L33 + 662 .L38: + 663 0062 00BF .align 2 + 664 .L37: + 665 0064 00300140 .word 1073819648 + 666 .cfi_endproc + 667 .LFE135: + 669 .section .text.HAL_SPI_MspDeInit,"ax",%progbits + ARM GAS /tmp/ccBY67LK.s page 20 + + + 670 .align 1 + 671 .global HAL_SPI_MspDeInit + 672 .syntax unified + 673 .thumb + 674 .thumb_func + 676 HAL_SPI_MspDeInit: + 677 .LVL37: + 678 .LFB136: + 304:Core/Src/stm32f3xx_hal_msp.c **** + 305:Core/Src/stm32f3xx_hal_msp.c **** /** + 306:Core/Src/stm32f3xx_hal_msp.c **** * @brief SPI MSP De-Initialization + 307:Core/Src/stm32f3xx_hal_msp.c **** * This function freeze the hardware resources used in this example + 308:Core/Src/stm32f3xx_hal_msp.c **** * @param hspi: SPI handle pointer + 309:Core/Src/stm32f3xx_hal_msp.c **** * @retval None + 310:Core/Src/stm32f3xx_hal_msp.c **** */ + 311:Core/Src/stm32f3xx_hal_msp.c **** void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi) + 312:Core/Src/stm32f3xx_hal_msp.c **** { + 679 .loc 1 312 1 is_stmt 1 view -0 + 680 .cfi_startproc + 681 @ args = 0, pretend = 0, frame = 0 + 682 @ frame_needed = 0, uses_anonymous_args = 0 + 683 .loc 1 312 1 is_stmt 0 view .LVU183 + 684 0000 08B5 push {r3, lr} + 685 .cfi_def_cfa_offset 8 + 686 .cfi_offset 3, -8 + 687 .cfi_offset 14, -4 + 313:Core/Src/stm32f3xx_hal_msp.c **** if(hspi->Instance==SPI1) + 688 .loc 1 313 3 is_stmt 1 view .LVU184 + 689 .loc 1 313 10 is_stmt 0 view .LVU185 + 690 0002 0268 ldr r2, [r0] + 691 .loc 1 313 5 view .LVU186 + 692 0004 074B ldr r3, .L43 + 693 0006 9A42 cmp r2, r3 + 694 0008 00D0 beq .L42 + 695 .LVL38: + 696 .L39: + 314:Core/Src/stm32f3xx_hal_msp.c **** { + 315:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE BEGIN SPI1_MspDeInit 0 */ + 316:Core/Src/stm32f3xx_hal_msp.c **** + 317:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE END SPI1_MspDeInit 0 */ + 318:Core/Src/stm32f3xx_hal_msp.c **** /* Peripheral clock disable */ + 319:Core/Src/stm32f3xx_hal_msp.c **** __HAL_RCC_SPI1_CLK_DISABLE(); + 320:Core/Src/stm32f3xx_hal_msp.c **** + 321:Core/Src/stm32f3xx_hal_msp.c **** /**SPI1 GPIO Configuration + 322:Core/Src/stm32f3xx_hal_msp.c **** PA5 ------> SPI1_SCK + 323:Core/Src/stm32f3xx_hal_msp.c **** PA6 ------> SPI1_MISO + 324:Core/Src/stm32f3xx_hal_msp.c **** PA7 ------> SPI1_MOSI + 325:Core/Src/stm32f3xx_hal_msp.c **** */ + 326:Core/Src/stm32f3xx_hal_msp.c **** HAL_GPIO_DeInit(GPIOA, GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7); + 327:Core/Src/stm32f3xx_hal_msp.c **** + 328:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE BEGIN SPI1_MspDeInit 1 */ + 329:Core/Src/stm32f3xx_hal_msp.c **** + 330:Core/Src/stm32f3xx_hal_msp.c **** /* USER CODE END SPI1_MspDeInit 1 */ + 331:Core/Src/stm32f3xx_hal_msp.c **** } + 332:Core/Src/stm32f3xx_hal_msp.c **** + 333:Core/Src/stm32f3xx_hal_msp.c **** } + 697 .loc 1 333 1 view .LVU187 + ARM GAS /tmp/ccBY67LK.s page 21 + + + 698 000a 08BD pop {r3, pc} + 699 .LVL39: + 700 .L42: + 319:Core/Src/stm32f3xx_hal_msp.c **** + 701 .loc 1 319 5 is_stmt 1 view .LVU188 + 702 000c 064A ldr r2, .L43+4 + 703 000e 9369 ldr r3, [r2, #24] + 704 0010 23F48053 bic r3, r3, #4096 + 705 0014 9361 str r3, [r2, #24] + 326:Core/Src/stm32f3xx_hal_msp.c **** + 706 .loc 1 326 5 view .LVU189 + 707 0016 E021 movs r1, #224 + 708 0018 4FF09040 mov r0, #1207959552 + 709 .LVL40: + 326:Core/Src/stm32f3xx_hal_msp.c **** + 710 .loc 1 326 5 is_stmt 0 view .LVU190 + 711 001c FFF7FEFF bl HAL_GPIO_DeInit + 712 .LVL41: + 713 .loc 1 333 1 view .LVU191 + 714 0020 F3E7 b .L39 + 715 .L44: + 716 0022 00BF .align 2 + 717 .L43: + 718 0024 00300140 .word 1073819648 + 719 0028 00100240 .word 1073876992 + 720 .cfi_endproc + 721 .LFE136: + 723 .text + 724 .Letext0: + 725 .file 2 "Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h" + 726 .file 3 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 727 .file 4 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 728 .file 5 "Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h" + 729 .file 6 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h" + 730 .file 7 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h" + 731 .file 8 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h" + 732 .file 9 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h" + 733 .file 10 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h" + 734 .file 11 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h" + 735 .file 12 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h" + ARM GAS /tmp/ccBY67LK.s page 22 + + +DEFINED SYMBOLS + *ABS*:0000000000000000 stm32f3xx_hal_msp.c + /tmp/ccBY67LK.s:21 .text.HAL_MspInit:0000000000000000 $t + /tmp/ccBY67LK.s:27 .text.HAL_MspInit:0000000000000000 HAL_MspInit + /tmp/ccBY67LK.s:75 .text.HAL_MspInit:000000000000002c $d + /tmp/ccBY67LK.s:80 .text.HAL_CAN_MspInit:0000000000000000 $t + /tmp/ccBY67LK.s:86 .text.HAL_CAN_MspInit:0000000000000000 HAL_CAN_MspInit + /tmp/ccBY67LK.s:195 .text.HAL_CAN_MspInit:0000000000000074 $d + /tmp/ccBY67LK.s:200 .text.HAL_CAN_MspDeInit:0000000000000000 $t + /tmp/ccBY67LK.s:206 .text.HAL_CAN_MspDeInit:0000000000000000 HAL_CAN_MspDeInit + /tmp/ccBY67LK.s:252 .text.HAL_CAN_MspDeInit:000000000000002c $d + /tmp/ccBY67LK.s:258 .text.HAL_I2C_MspInit:0000000000000000 $t + /tmp/ccBY67LK.s:264 .text.HAL_I2C_MspInit:0000000000000000 HAL_I2C_MspInit + /tmp/ccBY67LK.s:467 .text.HAL_I2C_MspInit:00000000000000d4 $d + /tmp/ccBY67LK.s:475 .text.HAL_I2C_MspDeInit:0000000000000000 $t + /tmp/ccBY67LK.s:481 .text.HAL_I2C_MspDeInit:0000000000000000 HAL_I2C_MspDeInit + /tmp/ccBY67LK.s:553 .text.HAL_I2C_MspDeInit:000000000000005c $d + /tmp/ccBY67LK.s:560 .text.HAL_SPI_MspInit:0000000000000000 $t + /tmp/ccBY67LK.s:566 .text.HAL_SPI_MspInit:0000000000000000 HAL_SPI_MspInit + /tmp/ccBY67LK.s:665 .text.HAL_SPI_MspInit:0000000000000064 $d + /tmp/ccBY67LK.s:670 .text.HAL_SPI_MspDeInit:0000000000000000 $t + /tmp/ccBY67LK.s:676 .text.HAL_SPI_MspDeInit:0000000000000000 HAL_SPI_MspDeInit + /tmp/ccBY67LK.s:718 .text.HAL_SPI_MspDeInit:0000000000000024 $d + +UNDEFINED SYMBOLS +HAL_GPIO_Init +HAL_NVIC_SetPriority +HAL_NVIC_EnableIRQ +HAL_GPIO_DeInit +HAL_NVIC_DisableIRQ diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_msp.o b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_msp.o new file mode 100644 index 0000000000000000000000000000000000000000..80440c98d8ef689589d6cd1ca7bfe6d6a3286464 GIT binary patch literal 18888 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

    © Copyright (c) 2016 STMicroelectronics. + 16:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * All rights reserved.
    + 17:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * + 18:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * This software component is licensed by ST under BSD 3-Clause license, + 19:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * the "License"; You may not use this file except in compliance with the + 20:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * License. You may obtain a copy of the License at: + 21:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * opensource.org/licenses/BSD-3-Clause + 22:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * + 23:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** ****************************************************************************** + 24:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** */ + 25:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 26:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /* Includes ------------------------------------------------------------------*/ + 27:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** #include "stm32f3xx_hal.h" + 28:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 29:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /** @addtogroup STM32F3xx_HAL_Driver + 30:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @{ + ARM GAS /tmp/ccVidTYQ.s page 2 + + + 31:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** */ + 32:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 33:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /** @defgroup PWR PWR + 34:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @brief PWR HAL module driver + 35:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @{ + 36:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** */ + 37:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 38:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** #ifdef HAL_PWR_MODULE_ENABLED + 39:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 40:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /* Private typedef -----------------------------------------------------------*/ + 41:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /* Private define ------------------------------------------------------------*/ + 42:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /* Private macro -------------------------------------------------------------*/ + 43:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /* Private variables ---------------------------------------------------------*/ + 44:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /* Private function prototypes -----------------------------------------------*/ + 45:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /* Private functions ---------------------------------------------------------*/ + 46:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 47:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /** @defgroup PWR_Exported_Functions PWR Exported Functions + 48:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @{ + 49:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** */ + 50:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 51:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /** @defgroup PWR_Exported_Functions_Group1 Initialization and de-initialization functions + 52:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @brief Initialization and de-initialization functions + 53:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * + 54:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** @verbatim + 55:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** =============================================================================== + 56:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** ##### Initialization and de-initialization functions ##### + 57:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** =============================================================================== + 58:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** [..] + 59:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** After reset, the backup domain (RTC registers, RTC backup data + 60:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** registers and backup SRAM) is protected against possible unwanted + 61:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** write accesses. + 62:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** To enable access to the RTC Domain and RTC registers, proceed as follows: + 63:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** (+) Enable the Power Controller (PWR) APB1 interface clock using the + 64:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** __HAL_RCC_PWR_CLK_ENABLE() macro. + 65:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** (+) Enable access to RTC domain using the HAL_PWR_EnableBkUpAccess() function. + 66:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 67:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** @endverbatim + 68:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @{ + 69:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** */ + 70:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 71:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /** + 72:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @brief Deinitializes the PWR peripheral registers to their default reset values. + 73:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @retval None + 74:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** */ + 75:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** void HAL_PWR_DeInit(void) + 76:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** { + 29 .loc 1 76 1 view -0 + 30 .cfi_startproc + 31 @ args = 0, pretend = 0, frame = 0 + 32 @ frame_needed = 0, uses_anonymous_args = 0 + 33 @ link register save eliminated. + 77:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** __HAL_RCC_PWR_FORCE_RESET(); + 34 .loc 1 77 3 view .LVU1 + 35 0000 044B ldr r3, .L2 + 36 0002 1A69 ldr r2, [r3, #16] + 37 0004 42F08052 orr r2, r2, #268435456 + 38 0008 1A61 str r2, [r3, #16] + ARM GAS /tmp/ccVidTYQ.s page 3 + + + 78:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** __HAL_RCC_PWR_RELEASE_RESET(); + 39 .loc 1 78 3 view .LVU2 + 40 000a 1A69 ldr r2, [r3, #16] + 41 000c 22F08052 bic r2, r2, #268435456 + 42 0010 1A61 str r2, [r3, #16] + 79:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** } + 43 .loc 1 79 1 is_stmt 0 view .LVU3 + 44 0012 7047 bx lr + 45 .L3: + 46 .align 2 + 47 .L2: + 48 0014 00100240 .word 1073876992 + 49 .cfi_endproc + 50 .LFE130: + 52 .section .text.HAL_PWR_EnableBkUpAccess,"ax",%progbits + 53 .align 1 + 54 .global HAL_PWR_EnableBkUpAccess + 55 .syntax unified + 56 .thumb + 57 .thumb_func + 59 HAL_PWR_EnableBkUpAccess: + 60 .LFB131: + 80:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 81:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /** + 82:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @brief Enables access to the backup domain (RTC registers, RTC + 83:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * backup data registers and backup SRAM). + 84:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @note If the HSE divided by 32 is used as the RTC clock, the + 85:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * Backup Domain Access should be kept enabled. + 86:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @retval None + 87:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** */ + 88:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** void HAL_PWR_EnableBkUpAccess(void) + 89:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** { + 61 .loc 1 89 1 is_stmt 1 view -0 + 62 .cfi_startproc + 63 @ args = 0, pretend = 0, frame = 0 + 64 @ frame_needed = 0, uses_anonymous_args = 0 + 65 @ link register save eliminated. + 90:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** SET_BIT(PWR->CR, PWR_CR_DBP); + 66 .loc 1 90 3 view .LVU5 + 67 0000 024A ldr r2, .L5 + 68 0002 1368 ldr r3, [r2] + 69 0004 43F48073 orr r3, r3, #256 + 70 0008 1360 str r3, [r2] + 91:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** } + 71 .loc 1 91 1 is_stmt 0 view .LVU6 + 72 000a 7047 bx lr + 73 .L6: + 74 .align 2 + 75 .L5: + 76 000c 00700040 .word 1073770496 + 77 .cfi_endproc + 78 .LFE131: + 80 .section .text.HAL_PWR_DisableBkUpAccess,"ax",%progbits + 81 .align 1 + 82 .global HAL_PWR_DisableBkUpAccess + 83 .syntax unified + 84 .thumb + ARM GAS /tmp/ccVidTYQ.s page 4 + + + 85 .thumb_func + 87 HAL_PWR_DisableBkUpAccess: + 88 .LFB132: + 92:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 93:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /** + 94:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @brief Disables access to the backup domain (RTC registers, RTC + 95:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * backup data registers and backup SRAM). + 96:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @note If the HSE divided by 32 is used as the RTC clock, the + 97:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * Backup Domain Access should be kept enabled. + 98:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @retval None + 99:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** */ + 100:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** void HAL_PWR_DisableBkUpAccess(void) + 101:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** { + 89 .loc 1 101 1 is_stmt 1 view -0 + 90 .cfi_startproc + 91 @ args = 0, pretend = 0, frame = 0 + 92 @ frame_needed = 0, uses_anonymous_args = 0 + 93 @ link register save eliminated. + 102:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** CLEAR_BIT(PWR->CR, PWR_CR_DBP); + 94 .loc 1 102 3 view .LVU8 + 95 0000 024A ldr r2, .L8 + 96 0002 1368 ldr r3, [r2] + 97 0004 23F48073 bic r3, r3, #256 + 98 0008 1360 str r3, [r2] + 103:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** } + 99 .loc 1 103 1 is_stmt 0 view .LVU9 + 100 000a 7047 bx lr + 101 .L9: + 102 .align 2 + 103 .L8: + 104 000c 00700040 .word 1073770496 + 105 .cfi_endproc + 106 .LFE132: + 108 .section .text.HAL_PWR_EnableWakeUpPin,"ax",%progbits + 109 .align 1 + 110 .global HAL_PWR_EnableWakeUpPin + 111 .syntax unified + 112 .thumb + 113 .thumb_func + 115 HAL_PWR_EnableWakeUpPin: + 116 .LVL0: + 117 .LFB133: + 104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 105:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /** + 106:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @} + 107:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** */ + 108:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 109:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /** @defgroup PWR_Exported_Functions_Group2 Peripheral Control functions + 110:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @brief Low Power modes configuration functions + 111:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * + 112:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** @verbatim + 113:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 114:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** =============================================================================== + 115:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** ##### Peripheral Control functions ##### + 116:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** =============================================================================== + 117:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 118:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** *** WakeUp pin configuration *** + ARM GAS /tmp/ccVidTYQ.s page 5 + + + 119:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** ================================ + 120:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** [..] + 121:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** (+) WakeUp pin is used to wakeup the system from Standby mode. This pin is + 122:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** forced in input pull down configuration and is active on rising edges. + 123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** (+) There are up to three WakeUp pins: + 124:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** (++)WakeUp Pin 1 on PA.00. + 125:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** (++)WakeUp Pin 2 on PC.13 (STM32F303xC, STM32F303xE only). + 126:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** (++)WakeUp Pin 3 on PE.06. + 127:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 128:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** *** Main and Backup Regulators configuration *** + 129:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** ================================================ + 130:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** [..] + 131:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** (+) When the backup domain is supplied by VDD (analog switch connected to VDD) + 132:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** the backup SRAM is powered from VDD which replaces the VBAT power supply to + 133:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** save battery life. + 134:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 135:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** (+) The backup SRAM is not mass erased by a tamper event. It is read + 136:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** protected to prevent confidential data, such as cryptographic private + 137:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** key, from being accessed. The backup SRAM can be erased only through + 138:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** the Flash interface when a protection level change from level 1 to + 139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** level 0 is requested. + 140:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** -@- Refer to the description of Read protection (RDP) in the Flash + 141:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** programming manual. + 142:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 143:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** Refer to the datasheets for more details. + 144:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 145:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** *** Low Power modes configuration *** + 146:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** ===================================== + 147:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** [..] + 148:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** The devices feature 3 low-power modes: + 149:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** (+) Sleep mode: Cortex-M4 core stopped, peripherals kept running. + 150:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** (+) Stop mode: all clocks are stopped, regulator running, regulator + 151:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** in low power mode + 152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** (+) Standby mode: 1.2V domain powered off (mode not available on STM32F3x8 devices). + 153:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 154:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** *** Sleep mode *** + 155:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** ================== + 156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** [..] + 157:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** (+) Entry: + 158:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** The Sleep mode is entered by using the HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_S + 159:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** functions with + 160:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** (++) PWR_SLEEPENTRY_WFI: enter SLEEP mode with WFI instruction + 161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** (++) PWR_SLEEPENTRY_WFE: enter SLEEP mode with WFE instruction + 162:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 163:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** (+) Exit: + 164:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** (++) Any peripheral interrupt acknowledged by the nested vectored interrupt + 165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** controller (NVIC) can wake up the device from Sleep mode. + 166:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** *** Stop mode *** + 168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** ================= + 169:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** [..] + 170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** In Stop mode, all clocks in the 1.8V domain are stopped, the PLL, the HSI, + 171:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** and the HSE RC oscillators are disabled. Internal SRAM and register contents + 172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** are preserved. + 173:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** The voltage regulator can be configured either in normal or low-power mode to minimize the co + 174:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 175:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** (+) Entry: + ARM GAS /tmp/ccVidTYQ.s page 6 + + + 176:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** The Stop mode is entered using the HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_STOPEN + 177:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** function with: + 178:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** (++) Main regulator ON or + 179:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** (++) Low Power regulator ON. + 180:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** (++) PWR_STOPENTRY_WFI: enter STOP mode with WFI instruction or + 181:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** (++) PWR_STOPENTRY_WFE: enter STOP mode with WFE instruction + 182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** (+) Exit: + 183:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** (++) Any EXTI Line (Internal or External) configured in Interrupt/Event mode. + 184:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** (++) Some specific communication peripherals (CEC, USART, I2C) interrupts, + 185:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** when programmed in wakeup mode (the peripheral must be + 186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** programmed in wakeup mode and the corresponding interrupt vector + 187:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** must be enabled in the NVIC). + 188:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** *** Standby mode *** + 190:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** ==================== + 191:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** [..] + 192:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** The Standby mode allows to achieve the lowest power consumption. It is based + 193:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** on the Cortex-M4 deep sleep mode, with the voltage regulator disabled. + 194:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** The 1.8V domain is consequently powered off. The PLL, the HSI oscillator and + 195:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** the HSE oscillator are also switched off. SRAM and register contents are lost + 196:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** except for the RTC registers, RTC backup registers, backup SRAM and Standby + 197:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** circuitry. + 198:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** The voltage regulator is OFF. + 199:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 200:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** (+) Entry: + 201:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** (++) The Standby mode is entered using the HAL_PWR_EnterSTANDBYMode() function. + 202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** (+) Exit: + 203:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** (++) WKUP pin rising edge, RTC alarm (Alarm A and Alarm B), RTC wakeup, + 204:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** tamper event, time-stamp event, external reset in NRST pin, IWDG reset. + 205:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 206:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** *** Auto-wakeup (AWU) from low-power mode *** + 207:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** ============================================= + 208:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** [..] + 209:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** The MCU can be woken up from low-power mode by an RTC Alarm event, an RTC + 210:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** Wakeup event, a tamper event, a time-stamp event, or a comparator event, + 211:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** without depending on an external interrupt (Auto-wakeup mode). + 212:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** (+) RTC auto-wakeup (AWU) from the Stop and Standby modes + 214:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 215:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** (++) To wake up from the Stop mode with an RTC alarm event, it is necessary to + 216:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** configure the RTC to generate the RTC alarm using the HAL_RTC_SetAlarm_IT() function. + 217:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 218:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** (++) To wake up from the Stop mode with an RTC Tamper or time stamp event, it + 219:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** is necessary to configure the RTC to detect the tamper or time stamp event using the + 220:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** HAL_RTC_SetTimeStamp_IT() or HAL_RTC_SetTamper_IT() functions. + 221:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 222:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** (++) To wake up from the Stop mode with an RTC WakeUp event, it is necessary to + 223:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** configure the RTC to generate the RTC WakeUp event using the HAL_RTC_SetWakeUpTimer_IT() + 224:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 225:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** (+) Comparator auto-wakeup (AWU) from the Stop mode + 226:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 227:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** (++) To wake up from the Stop mode with a comparator wakeup event, it is necessary to: + 228:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** (+++) Configure the EXTI Line associated with the comparator (example EXTI Line 22 for c + 229:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** to be sensitive to to the selected edges (falling, rising or falling + 230:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** and rising) (Interrupt or Event modes) using the EXTI_Init() function. + 231:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** (+++) Configure the comparator to generate the event. + 232:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** @endverbatim + ARM GAS /tmp/ccVidTYQ.s page 7 + + + 233:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @{ + 234:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** */ + 235:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 236:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /** + 237:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @brief Enables the WakeUp PINx functionality. + 238:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @param WakeUpPinx Specifies the Power Wake-Up pin to enable. + 239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * This parameter can be value of : + 240:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @ref PWR_WakeUp_Pins + 241:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @retval None + 242:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** */ + 243:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** void HAL_PWR_EnableWakeUpPin(uint32_t WakeUpPinx) + 244:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** { + 118 .loc 1 244 1 is_stmt 1 view -0 + 119 .cfi_startproc + 120 @ args = 0, pretend = 0, frame = 0 + 121 @ frame_needed = 0, uses_anonymous_args = 0 + 122 @ link register save eliminated. + 245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /* Check the parameters */ + 246:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** assert_param(IS_PWR_WAKEUP_PIN(WakeUpPinx)); + 123 .loc 1 246 3 view .LVU11 + 247:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /* Enable the EWUPx pin */ + 248:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** SET_BIT(PWR->CSR, WakeUpPinx); + 124 .loc 1 248 3 view .LVU12 + 125 0000 024A ldr r2, .L11 + 126 0002 5368 ldr r3, [r2, #4] + 127 0004 0343 orrs r3, r3, r0 + 128 0006 5360 str r3, [r2, #4] + 249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** } + 129 .loc 1 249 1 is_stmt 0 view .LVU13 + 130 0008 7047 bx lr + 131 .L12: + 132 000a 00BF .align 2 + 133 .L11: + 134 000c 00700040 .word 1073770496 + 135 .cfi_endproc + 136 .LFE133: + 138 .section .text.HAL_PWR_DisableWakeUpPin,"ax",%progbits + 139 .align 1 + 140 .global HAL_PWR_DisableWakeUpPin + 141 .syntax unified + 142 .thumb + 143 .thumb_func + 145 HAL_PWR_DisableWakeUpPin: + 146 .LVL1: + 147 .LFB134: + 250:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 251:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /** + 252:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @brief Disables the WakeUp PINx functionality. + 253:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @param WakeUpPinx Specifies the Power Wake-Up pin to disable. + 254:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * This parameter can be values of : + 255:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @ref PWR_WakeUp_Pins + 256:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @retval None + 257:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** */ + 258:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** void HAL_PWR_DisableWakeUpPin(uint32_t WakeUpPinx) + 259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** { + 148 .loc 1 259 1 is_stmt 1 view -0 + 149 .cfi_startproc + ARM GAS /tmp/ccVidTYQ.s page 8 + + + 150 @ args = 0, pretend = 0, frame = 0 + 151 @ frame_needed = 0, uses_anonymous_args = 0 + 152 @ link register save eliminated. + 260:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /* Check the parameters */ + 261:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** assert_param(IS_PWR_WAKEUP_PIN(WakeUpPinx)); + 153 .loc 1 261 3 view .LVU15 + 262:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /* Disable the EWUPx pin */ + 263:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** CLEAR_BIT(PWR->CSR, WakeUpPinx); + 154 .loc 1 263 3 view .LVU16 + 155 0000 024A ldr r2, .L14 + 156 0002 5368 ldr r3, [r2, #4] + 157 0004 23EA0003 bic r3, r3, r0 + 158 0008 5360 str r3, [r2, #4] + 264:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** } + 159 .loc 1 264 1 is_stmt 0 view .LVU17 + 160 000a 7047 bx lr + 161 .L15: + 162 .align 2 + 163 .L14: + 164 000c 00700040 .word 1073770496 + 165 .cfi_endproc + 166 .LFE134: + 168 .section .text.HAL_PWR_EnterSLEEPMode,"ax",%progbits + 169 .align 1 + 170 .global HAL_PWR_EnterSLEEPMode + 171 .syntax unified + 172 .thumb + 173 .thumb_func + 175 HAL_PWR_EnterSLEEPMode: + 176 .LVL2: + 177 .LFB135: + 265:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 266:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /** + 267:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @brief Enters Sleep mode. + 268:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @note In Sleep mode, all I/O pins keep the same state as in Run mode. + 269:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @param Regulator Specifies the regulator state in SLEEP mode. + 270:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * This parameter can be one of the following values: + 271:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @arg PWR_MAINREGULATOR_ON: SLEEP mode with regulator ON + 272:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @arg PWR_LOWPOWERREGULATOR_ON: SLEEP mode with low power regulator ON + 273:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @note This parameter has no effect in F3 family and is just maintained to + 274:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * offer full portability of other STM32 families softwares. + 275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @param SLEEPEntry Specifies if SLEEP mode is entered with WFI or WFE instruction. + 276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * When WFI entry is used, tick interrupt have to be disabled if not desired as + 277:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * the interrupt wake up source. + 278:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * This parameter can be one of the following values: + 279:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @arg PWR_SLEEPENTRY_WFI: enter SLEEP mode with WFI instruction + 280:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @arg PWR_SLEEPENTRY_WFE: enter SLEEP mode with WFE instruction + 281:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @retval None + 282:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** */ + 283:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** void HAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t SLEEPEntry) + 284:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** { + 178 .loc 1 284 1 is_stmt 1 view -0 + 179 .cfi_startproc + 180 @ args = 0, pretend = 0, frame = 0 + 181 @ frame_needed = 0, uses_anonymous_args = 0 + 182 @ link register save eliminated. + 285:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /* Check the parameters */ + ARM GAS /tmp/ccVidTYQ.s page 9 + + + 286:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** assert_param(IS_PWR_SLEEP_ENTRY(SLEEPEntry)); + 183 .loc 1 286 3 view .LVU19 + 287:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /* Clear SLEEPDEEP bit of Cortex System Control Register */ + 289:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP_Msk); + 184 .loc 1 289 3 view .LVU20 + 185 .loc 1 289 6 is_stmt 0 view .LVU21 + 186 0000 064A ldr r2, .L20 + 187 0002 1369 ldr r3, [r2, #16] + 188 .loc 1 289 12 view .LVU22 + 189 0004 23F00403 bic r3, r3, #4 + 190 0008 1361 str r3, [r2, #16] + 290:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /* Select SLEEP mode entry -------------------------------------------------*/ + 292:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** if(SLEEPEntry == PWR_SLEEPENTRY_WFI) + 191 .loc 1 292 3 is_stmt 1 view .LVU23 + 192 .loc 1 292 5 is_stmt 0 view .LVU24 + 193 000a 0129 cmp r1, #1 + 194 000c 03D0 beq .L19 + 293:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** { + 294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /* Request Wait For Interrupt */ + 295:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** __WFI(); + 296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** } + 297:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** else + 298:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** { + 299:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /* Request Wait For Event */ + 300:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** __SEV(); + 195 .loc 1 300 5 is_stmt 1 view .LVU25 + 196 .syntax unified + 197 @ 300 "Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c" 1 + 198 000e 40BF sev + 199 @ 0 "" 2 + 301:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** __WFE(); + 200 .loc 1 301 5 view .LVU26 + 201 @ 301 "Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c" 1 + 202 0010 20BF wfe + 203 @ 0 "" 2 + 302:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** __WFE(); + 204 .loc 1 302 5 view .LVU27 + 205 @ 302 "Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c" 1 + 206 0012 20BF wfe + 207 @ 0 "" 2 + 303:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** } + 304:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** } + 208 .loc 1 304 1 is_stmt 0 view .LVU28 + 209 .thumb + 210 .syntax unified + 211 0014 7047 bx lr + 212 .L19: + 295:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** } + 213 .loc 1 295 5 is_stmt 1 view .LVU29 + 214 .syntax unified + 215 @ 295 "Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c" 1 + 216 0016 30BF wfi + 217 @ 0 "" 2 + 218 .thumb + 219 .syntax unified + ARM GAS /tmp/ccVidTYQ.s page 10 + + + 220 0018 7047 bx lr + 221 .L21: + 222 001a 00BF .align 2 + 223 .L20: + 224 001c 00ED00E0 .word -536810240 + 225 .cfi_endproc + 226 .LFE135: + 228 .section .text.HAL_PWR_EnterSTOPMode,"ax",%progbits + 229 .align 1 + 230 .global HAL_PWR_EnterSTOPMode + 231 .syntax unified + 232 .thumb + 233 .thumb_func + 235 HAL_PWR_EnterSTOPMode: + 236 .LVL3: + 237 .LFB136: + 305:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 306:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /** + 307:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @brief Enters STOP mode. + 308:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @note In Stop mode, all I/O pins keep the same state as in Run mode. + 309:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @note When exiting Stop mode by issuing an interrupt or a wakeup event, + 310:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * the HSI RC oscillator is selected as system clock. + 311:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @note When the voltage regulator operates in low power mode, an additional + 312:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * startup delay is incurred when waking up from Stop mode. + 313:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * By keeping the internal regulator ON during Stop mode, the consumption + 314:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * is higher although the startup time is reduced. + 315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @param Regulator Specifies the regulator state in STOP mode. + 316:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * This parameter can be one of the following values: + 317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @arg PWR_MAINREGULATOR_ON: STOP mode with regulator ON + 318:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @arg PWR_LOWPOWERREGULATOR_ON: STOP mode with low power regulator ON + 319:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @param STOPEntry specifies if STOP mode in entered with WFI or WFE instruction. + 320:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * This parameter can be one of the following values: + 321:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @arg PWR_STOPENTRY_WFI:Enter STOP mode with WFI instruction + 322:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @arg PWR_STOPENTRY_WFE: Enter STOP mode with WFE instruction + 323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @retval None + 324:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** */ + 325:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** void HAL_PWR_EnterSTOPMode(uint32_t Regulator, uint8_t STOPEntry) + 326:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** { + 238 .loc 1 326 1 view -0 + 239 .cfi_startproc + 240 @ args = 0, pretend = 0, frame = 0 + 241 @ frame_needed = 0, uses_anonymous_args = 0 + 242 @ link register save eliminated. + 327:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** uint32_t tmpreg = 0U; + 243 .loc 1 327 3 view .LVU31 + 328:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 329:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /* Check the parameters */ + 330:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** assert_param(IS_PWR_REGULATOR(Regulator)); + 244 .loc 1 330 3 view .LVU32 + 331:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** assert_param(IS_PWR_STOP_ENTRY(STOPEntry)); + 245 .loc 1 331 3 view .LVU33 + 332:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 333:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /* Select the regulator state in STOP mode ---------------------------------*/ + 334:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** tmpreg = PWR->CR; + 246 .loc 1 334 3 view .LVU34 + 247 .loc 1 334 10 is_stmt 0 view .LVU35 + 248 0000 0B4A ldr r2, .L26 + ARM GAS /tmp/ccVidTYQ.s page 11 + + + 249 0002 1368 ldr r3, [r2] + 250 .LVL4: + 335:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /* Clear PDDS and LPDS bits */ + 337:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** tmpreg &= (uint32_t)~(PWR_CR_PDDS | PWR_CR_LPDS); + 251 .loc 1 337 3 is_stmt 1 view .LVU36 + 252 .loc 1 337 10 is_stmt 0 view .LVU37 + 253 0004 23F00303 bic r3, r3, #3 + 254 .LVL5: + 338:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 339:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /* Set LPDS bit according to Regulator value */ + 340:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** tmpreg |= Regulator; + 255 .loc 1 340 3 is_stmt 1 view .LVU38 + 256 .loc 1 340 10 is_stmt 0 view .LVU39 + 257 0008 0343 orrs r3, r3, r0 + 258 .LVL6: + 341:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 342:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /* Store the new value */ + 343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** PWR->CR = tmpreg; + 259 .loc 1 343 3 is_stmt 1 view .LVU40 + 260 .loc 1 343 11 is_stmt 0 view .LVU41 + 261 000a 1360 str r3, [r2] + 344:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 345:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /* Set SLEEPDEEP bit of Cortex System Control Register */ + 346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; + 262 .loc 1 346 3 is_stmt 1 view .LVU42 + 263 .loc 1 346 6 is_stmt 0 view .LVU43 + 264 000c 094A ldr r2, .L26+4 + 265 000e 1369 ldr r3, [r2, #16] + 266 .LVL7: + 267 .loc 1 346 12 view .LVU44 + 268 0010 43F00403 orr r3, r3, #4 + 269 0014 1361 str r3, [r2, #16] + 270 .LVL8: + 347:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 348:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /* Select STOP mode entry --------------------------------------------------*/ + 349:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** if(STOPEntry == PWR_STOPENTRY_WFI) + 271 .loc 1 349 3 is_stmt 1 view .LVU45 + 272 .loc 1 349 5 is_stmt 0 view .LVU46 + 273 0016 0129 cmp r1, #1 + 274 0018 08D0 beq .L25 + 350:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** { + 351:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /* Request Wait For Interrupt */ + 352:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** __WFI(); + 353:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** } + 354:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** else + 355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** { + 356:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /* Request Wait For Event */ + 357:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** __SEV(); + 275 .loc 1 357 5 is_stmt 1 view .LVU47 + 276 .syntax unified + 277 @ 357 "Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c" 1 + 278 001a 40BF sev + 279 @ 0 "" 2 + 358:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** __WFE(); + 280 .loc 1 358 5 view .LVU48 + 281 @ 358 "Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c" 1 + ARM GAS /tmp/ccVidTYQ.s page 12 + + + 282 001c 20BF wfe + 283 @ 0 "" 2 + 359:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** __WFE(); + 284 .loc 1 359 5 view .LVU49 + 285 @ 359 "Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c" 1 + 286 001e 20BF wfe + 287 @ 0 "" 2 + 288 .thumb + 289 .syntax unified + 290 .L24: + 360:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** } + 361:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 362:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /* Reset SLEEPDEEP bit of Cortex System Control Register */ + 363:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP_Msk); + 291 .loc 1 363 3 view .LVU50 + 292 .loc 1 363 6 is_stmt 0 view .LVU51 + 293 0020 044A ldr r2, .L26+4 + 294 0022 1369 ldr r3, [r2, #16] + 295 .loc 1 363 12 view .LVU52 + 296 0024 23F00403 bic r3, r3, #4 + 297 0028 1361 str r3, [r2, #16] + 364:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** } + 298 .loc 1 364 1 view .LVU53 + 299 002a 7047 bx lr + 300 .L25: + 352:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** } + 301 .loc 1 352 5 is_stmt 1 view .LVU54 + 302 .syntax unified + 303 @ 352 "Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c" 1 + 304 002c 30BF wfi + 305 @ 0 "" 2 + 306 .thumb + 307 .syntax unified + 308 002e F7E7 b .L24 + 309 .L27: + 310 .align 2 + 311 .L26: + 312 0030 00700040 .word 1073770496 + 313 0034 00ED00E0 .word -536810240 + 314 .cfi_endproc + 315 .LFE136: + 317 .section .text.HAL_PWR_EnterSTANDBYMode,"ax",%progbits + 318 .align 1 + 319 .global HAL_PWR_EnterSTANDBYMode + 320 .syntax unified + 321 .thumb + 322 .thumb_func + 324 HAL_PWR_EnterSTANDBYMode: + 325 .LFB137: + 365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 366:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /** + 367:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @brief Enters STANDBY mode. + 368:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @note In Standby mode, all I/O pins are high impedance except for: + 369:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * - Reset pad (still available), + 370:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * - RTC alternate function pins if configured for tamper, time-stamp, RTC + 371:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * Alarm out, or RTC clock calibration out, + 372:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * - WKUP pins if enabled. + ARM GAS /tmp/ccVidTYQ.s page 13 + + + 373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @retval None + 374:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** */ + 375:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** void HAL_PWR_EnterSTANDBYMode(void) + 376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** { + 326 .loc 1 376 1 view -0 + 327 .cfi_startproc + 328 @ args = 0, pretend = 0, frame = 0 + 329 @ frame_needed = 0, uses_anonymous_args = 0 + 330 @ link register save eliminated. + 377:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /* Select STANDBY mode */ + 378:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** PWR->CR |= PWR_CR_PDDS; + 331 .loc 1 378 3 view .LVU56 + 332 .loc 1 378 6 is_stmt 0 view .LVU57 + 333 0000 054A ldr r2, .L29 + 334 0002 1368 ldr r3, [r2] + 335 .loc 1 378 11 view .LVU58 + 336 0004 43F00203 orr r3, r3, #2 + 337 0008 1360 str r3, [r2] + 379:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 380:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /* Set SLEEPDEEP bit of Cortex System Control Register */ + 381:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; + 338 .loc 1 381 3 is_stmt 1 view .LVU59 + 339 .loc 1 381 6 is_stmt 0 view .LVU60 + 340 000a 044A ldr r2, .L29+4 + 341 000c 1369 ldr r3, [r2, #16] + 342 .loc 1 381 12 view .LVU61 + 343 000e 43F00403 orr r3, r3, #4 + 344 0012 1361 str r3, [r2, #16] + 382:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /* This option is used to ensure that store operations are completed */ + 384:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** #if defined ( __CC_ARM) + 385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** __force_stores(); + 386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** #endif + 387:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /* Request Wait For Interrupt */ + 388:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** __WFI(); + 345 .loc 1 388 3 is_stmt 1 view .LVU62 + 346 .syntax unified + 347 @ 388 "Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c" 1 + 348 0014 30BF wfi + 349 @ 0 "" 2 + 389:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** } + 350 .loc 1 389 1 is_stmt 0 view .LVU63 + 351 .thumb + 352 .syntax unified + 353 0016 7047 bx lr + 354 .L30: + 355 .align 2 + 356 .L29: + 357 0018 00700040 .word 1073770496 + 358 001c 00ED00E0 .word -536810240 + 359 .cfi_endproc + 360 .LFE137: + 362 .section .text.HAL_PWR_EnableSleepOnExit,"ax",%progbits + 363 .align 1 + 364 .global HAL_PWR_EnableSleepOnExit + 365 .syntax unified + 366 .thumb + ARM GAS /tmp/ccVidTYQ.s page 14 + + + 367 .thumb_func + 369 HAL_PWR_EnableSleepOnExit: + 370 .LFB138: + 390:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 391:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /** + 392:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @brief Indicates Sleep-On-Exit when returning from Handler mode to Thread mode. + 393:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @note Set SLEEPONEXIT bit of SCR register. When this bit is set, the processor + 394:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * re-enters SLEEP mode when an interruption handling is over. + 395:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * Setting this bit is useful when the processor is expected to run only on + 396:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * interruptions handling. + 397:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @retval None + 398:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** */ + 399:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** void HAL_PWR_EnableSleepOnExit(void) + 400:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** { + 371 .loc 1 400 1 is_stmt 1 view -0 + 372 .cfi_startproc + 373 @ args = 0, pretend = 0, frame = 0 + 374 @ frame_needed = 0, uses_anonymous_args = 0 + 375 @ link register save eliminated. + 401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /* Set SLEEPONEXIT bit of Cortex System Control Register */ + 402:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk)); + 376 .loc 1 402 3 view .LVU65 + 377 0000 024A ldr r2, .L32 + 378 0002 1369 ldr r3, [r2, #16] + 379 0004 43F00203 orr r3, r3, #2 + 380 0008 1361 str r3, [r2, #16] + 403:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** } + 381 .loc 1 403 1 is_stmt 0 view .LVU66 + 382 000a 7047 bx lr + 383 .L33: + 384 .align 2 + 385 .L32: + 386 000c 00ED00E0 .word -536810240 + 387 .cfi_endproc + 388 .LFE138: + 390 .section .text.HAL_PWR_DisableSleepOnExit,"ax",%progbits + 391 .align 1 + 392 .global HAL_PWR_DisableSleepOnExit + 393 .syntax unified + 394 .thumb + 395 .thumb_func + 397 HAL_PWR_DisableSleepOnExit: + 398 .LFB139: + 404:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 405:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 406:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /** + 407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @brief Disables Sleep-On-Exit feature when returning from Handler mode to Thread mode. + 408:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @note Clears SLEEPONEXIT bit of SCR register. When this bit is set, the processor + 409:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * re-enters SLEEP mode when an interruption handling is over. + 410:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @retval None + 411:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** */ + 412:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** void HAL_PWR_DisableSleepOnExit(void) + 413:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** { + 399 .loc 1 413 1 is_stmt 1 view -0 + 400 .cfi_startproc + 401 @ args = 0, pretend = 0, frame = 0 + 402 @ frame_needed = 0, uses_anonymous_args = 0 + ARM GAS /tmp/ccVidTYQ.s page 15 + + + 403 @ link register save eliminated. + 414:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /* Clear SLEEPONEXIT bit of Cortex System Control Register */ + 415:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SLEEPONEXIT_Msk)); + 404 .loc 1 415 3 view .LVU68 + 405 0000 024A ldr r2, .L35 + 406 0002 1369 ldr r3, [r2, #16] + 407 0004 23F00203 bic r3, r3, #2 + 408 0008 1361 str r3, [r2, #16] + 416:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** } + 409 .loc 1 416 1 is_stmt 0 view .LVU69 + 410 000a 7047 bx lr + 411 .L36: + 412 .align 2 + 413 .L35: + 414 000c 00ED00E0 .word -536810240 + 415 .cfi_endproc + 416 .LFE139: + 418 .section .text.HAL_PWR_EnableSEVOnPend,"ax",%progbits + 419 .align 1 + 420 .global HAL_PWR_EnableSEVOnPend + 421 .syntax unified + 422 .thumb + 423 .thumb_func + 425 HAL_PWR_EnableSEVOnPend: + 426 .LFB140: + 417:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 418:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 419:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 420:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /** + 421:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @brief Enables CORTEX M4 SEVONPEND bit. + 422:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @note Sets SEVONPEND bit of SCR register. When this bit is set, this causes + 423:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * WFE to wake up when an interrupt moves from inactive to pended. + 424:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @retval None + 425:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** */ + 426:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** void HAL_PWR_EnableSEVOnPend(void) + 427:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** { + 427 .loc 1 427 1 is_stmt 1 view -0 + 428 .cfi_startproc + 429 @ args = 0, pretend = 0, frame = 0 + 430 @ frame_needed = 0, uses_anonymous_args = 0 + 431 @ link register save eliminated. + 428:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /* Set SEVONPEND bit of Cortex System Control Register */ + 429:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** SET_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk)); + 432 .loc 1 429 3 view .LVU71 + 433 0000 024A ldr r2, .L38 + 434 0002 1369 ldr r3, [r2, #16] + 435 0004 43F01003 orr r3, r3, #16 + 436 0008 1361 str r3, [r2, #16] + 430:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** } + 437 .loc 1 430 1 is_stmt 0 view .LVU72 + 438 000a 7047 bx lr + 439 .L39: + 440 .align 2 + 441 .L38: + 442 000c 00ED00E0 .word -536810240 + 443 .cfi_endproc + 444 .LFE140: + ARM GAS /tmp/ccVidTYQ.s page 16 + + + 446 .section .text.HAL_PWR_DisableSEVOnPend,"ax",%progbits + 447 .align 1 + 448 .global HAL_PWR_DisableSEVOnPend + 449 .syntax unified + 450 .thumb + 451 .thumb_func + 453 HAL_PWR_DisableSEVOnPend: + 454 .LFB141: + 431:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 432:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** + 433:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /** + 434:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @brief Disables CORTEX M4 SEVONPEND bit. + 435:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @note Clears SEVONPEND bit of SCR register. When this bit is set, this causes + 436:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * WFE to wake up when an interrupt moves from inactive to pended. + 437:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** * @retval None + 438:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** */ + 439:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** void HAL_PWR_DisableSEVOnPend(void) + 440:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** { + 455 .loc 1 440 1 is_stmt 1 view -0 + 456 .cfi_startproc + 457 @ args = 0, pretend = 0, frame = 0 + 458 @ frame_needed = 0, uses_anonymous_args = 0 + 459 @ link register save eliminated. + 441:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** /* Clear SEVONPEND bit of Cortex System Control Register */ + 442:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** CLEAR_BIT(SCB->SCR, ((uint32_t)SCB_SCR_SEVONPEND_Msk)); + 460 .loc 1 442 3 view .LVU74 + 461 0000 024A ldr r2, .L41 + 462 0002 1369 ldr r3, [r2, #16] + 463 0004 23F01003 bic r3, r3, #16 + 464 0008 1361 str r3, [r2, #16] + 443:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr.c **** } + 465 .loc 1 443 1 is_stmt 0 view .LVU75 + 466 000a 7047 bx lr + 467 .L42: + 468 .align 2 + 469 .L41: + 470 000c 00ED00E0 .word -536810240 + 471 .cfi_endproc + 472 .LFE141: + 474 .text + 475 .Letext0: + 476 .file 2 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 477 .file 3 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 478 .file 4 "Drivers/CMSIS/Include/core_cm4.h" + 479 .file 5 "Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h" + ARM GAS /tmp/ccVidTYQ.s page 17 + + +DEFINED SYMBOLS + *ABS*:0000000000000000 stm32f3xx_hal_pwr.c + /tmp/ccVidTYQ.s:21 .text.HAL_PWR_DeInit:0000000000000000 $t + /tmp/ccVidTYQ.s:27 .text.HAL_PWR_DeInit:0000000000000000 HAL_PWR_DeInit + /tmp/ccVidTYQ.s:48 .text.HAL_PWR_DeInit:0000000000000014 $d + /tmp/ccVidTYQ.s:53 .text.HAL_PWR_EnableBkUpAccess:0000000000000000 $t + /tmp/ccVidTYQ.s:59 .text.HAL_PWR_EnableBkUpAccess:0000000000000000 HAL_PWR_EnableBkUpAccess + /tmp/ccVidTYQ.s:76 .text.HAL_PWR_EnableBkUpAccess:000000000000000c $d + /tmp/ccVidTYQ.s:81 .text.HAL_PWR_DisableBkUpAccess:0000000000000000 $t + /tmp/ccVidTYQ.s:87 .text.HAL_PWR_DisableBkUpAccess:0000000000000000 HAL_PWR_DisableBkUpAccess + /tmp/ccVidTYQ.s:104 .text.HAL_PWR_DisableBkUpAccess:000000000000000c $d + /tmp/ccVidTYQ.s:109 .text.HAL_PWR_EnableWakeUpPin:0000000000000000 $t + /tmp/ccVidTYQ.s:115 .text.HAL_PWR_EnableWakeUpPin:0000000000000000 HAL_PWR_EnableWakeUpPin + /tmp/ccVidTYQ.s:134 .text.HAL_PWR_EnableWakeUpPin:000000000000000c $d + /tmp/ccVidTYQ.s:139 .text.HAL_PWR_DisableWakeUpPin:0000000000000000 $t + /tmp/ccVidTYQ.s:145 .text.HAL_PWR_DisableWakeUpPin:0000000000000000 HAL_PWR_DisableWakeUpPin + /tmp/ccVidTYQ.s:164 .text.HAL_PWR_DisableWakeUpPin:000000000000000c $d + /tmp/ccVidTYQ.s:169 .text.HAL_PWR_EnterSLEEPMode:0000000000000000 $t + /tmp/ccVidTYQ.s:175 .text.HAL_PWR_EnterSLEEPMode:0000000000000000 HAL_PWR_EnterSLEEPMode + /tmp/ccVidTYQ.s:224 .text.HAL_PWR_EnterSLEEPMode:000000000000001c $d + /tmp/ccVidTYQ.s:229 .text.HAL_PWR_EnterSTOPMode:0000000000000000 $t + /tmp/ccVidTYQ.s:235 .text.HAL_PWR_EnterSTOPMode:0000000000000000 HAL_PWR_EnterSTOPMode + /tmp/ccVidTYQ.s:312 .text.HAL_PWR_EnterSTOPMode:0000000000000030 $d + /tmp/ccVidTYQ.s:318 .text.HAL_PWR_EnterSTANDBYMode:0000000000000000 $t + /tmp/ccVidTYQ.s:324 .text.HAL_PWR_EnterSTANDBYMode:0000000000000000 HAL_PWR_EnterSTANDBYMode + /tmp/ccVidTYQ.s:357 .text.HAL_PWR_EnterSTANDBYMode:0000000000000018 $d + /tmp/ccVidTYQ.s:363 .text.HAL_PWR_EnableSleepOnExit:0000000000000000 $t + /tmp/ccVidTYQ.s:369 .text.HAL_PWR_EnableSleepOnExit:0000000000000000 HAL_PWR_EnableSleepOnExit + /tmp/ccVidTYQ.s:386 .text.HAL_PWR_EnableSleepOnExit:000000000000000c $d + /tmp/ccVidTYQ.s:391 .text.HAL_PWR_DisableSleepOnExit:0000000000000000 $t + /tmp/ccVidTYQ.s:397 .text.HAL_PWR_DisableSleepOnExit:0000000000000000 HAL_PWR_DisableSleepOnExit + /tmp/ccVidTYQ.s:414 .text.HAL_PWR_DisableSleepOnExit:000000000000000c $d + /tmp/ccVidTYQ.s:419 .text.HAL_PWR_EnableSEVOnPend:0000000000000000 $t + /tmp/ccVidTYQ.s:425 .text.HAL_PWR_EnableSEVOnPend:0000000000000000 HAL_PWR_EnableSEVOnPend + /tmp/ccVidTYQ.s:442 .text.HAL_PWR_EnableSEVOnPend:000000000000000c $d + /tmp/ccVidTYQ.s:447 .text.HAL_PWR_DisableSEVOnPend:0000000000000000 $t + /tmp/ccVidTYQ.s:453 .text.HAL_PWR_DisableSEVOnPend:0000000000000000 HAL_PWR_DisableSEVOnPend + /tmp/ccVidTYQ.s:470 .text.HAL_PWR_DisableSEVOnPend:000000000000000c $d + +NO UNDEFINED SYMBOLS diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_pwr.o b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_pwr.o new file mode 100644 index 0000000000000000000000000000000000000000..ab5844978400dbd165527efd41bb08584bd4dc71 GIT binary patch literal 8752 zcmd5>Yj7LY8NFA#l4Z+w9LXV0!ebpf;53os7l{K2SeBjGNgNw14y04+$kNKzL=TU& zb__!&nGR54U1_zp zr=9jsZ?b##eBZg>eeS(?<)Z_8cXG~|l{jl-WyaV8rwfm}TR*P z_}cV(fit^UgR9rIJ1`yn;8-zm2z-VK-crG1(@Hc(-jk+3Hr?_TQ-lS2&+b6FWkFQ} zalTP`vG=5ge>1z9j}brrUghOR+% zr*j7RuBNcxBVAJ<2vD!Yt@=SSv^S2E;YQqQPT=OdR(*i~5kdG-vj2?xe*k1W4wL#2 z_mf8D_adPBbCY>_8?lE?R_lsI$C&zv$r@ZyVkb@3=!y-FGWAjJe;d)7_%X`&nCWZf z9%7H1tc`z2>YA=G#{b&Ap=zQJozwq5?g2?cO z%)q}*<-92~xS~VI{+7wS{1mn5ZIjjVIg0g;$r|`OxSOyBh%oE;*)mK7;&ptR8HUyMBaTbtFk3T1 zIj(@g#oNpr%>N0Mb;^T`vdIQS0TS_3=SWfgLl7m)lKP`)!6i0Mk9+9Wgo__%ypAdL z=lRZeZ}SZWdVDAl2Cv31$03ScBS9|~|hc$&e($W#?#7p_5^W{yD3 zo^#f$1R7Yl)`V-*>i#JypeyC&>C;%+`Kp=2j8u@v^Pn44joAwtu**b7$B5{KQ~n?}TX$#|jA+p3Z0Wa56rZPKHB?d@hxq3PsB*Gn?q0Uf8u!HWR5JS%ymAY^`m&nW_TsEGVPUrOhyLuHbD>ADyqrqrrA4DG?F+x zfM9SF`GP)?$aaHay2>c+o%0D8+!$#$XSBg$7CgteTL~O=bI%@^f{9S}yd*qu9CSEd zU(Rs~*_Fmd5lgLz^<|gkaR$3ZcviVR9`3FUxfRcaZnuYfwlp^*%z8X4M>H2sVz!Ds zMOgx?0;}9L$fS5W9N6Oa346;@L6ug^%6Cw7Lvwj5qJJzZBt$;5KBcNfQKe=_Wv)}G zWlQwZ@#P$MFXypF9#Tq<~XNgc*S)m5dwlU{OyP>3psTo|?^x=aP*L(U~hU z*e9Bs$>*jtaigxgIDS|kpBYW(<{dpiT`IbuBz25NM%QOXas%@ivFOfSW1Va)8eP=u zvNt39`uh%wXs8AC9D1-*)MjGB>fPv0RMN=K6!a-3%1q{GG3t!Q!W`Sk&=>}HHdjnf z<@BVMKtG8<6ws=i9OhE9m|a|MdMSvQK7-Uh6((v?muQ!qW)p%<|tQga;cn61wS?S6BDmn)44KE}odVgq9b2Kw90?x?7N*==I(*|(|4a4cNR z#OL&&p%;xwJ(rjcc6NpPhGP@^ErVdOe9FK?(kBjdlqzXf!q$WcRWUjmL8n{m`*NFQ zc&YW9?TSXv)7s`ou?uSSibM)oZ6G_TCzBXHIJNnnEfZV1H#*-NTCeGh`WX^ut}E(m z>ngrR={O?Jup~sHW5oZ$HAj9rzS!eA{r^pQkuC&{)5g#EMm)N=4g`mpr><(a+EwH6 ztBrgWKIWSE8orjVS`#E8TZiI++| zEb$JB_ewk|@db$^SpF&QF^RWJd_>~&66yCR(!C+^BZ(@u3$kkxLlU=3+#~Uz#4k!r z5}wUiUh-MO7Su!Xs|hv6zA5=lgm|@Ym;5e54Aze&e~=JM#WRxsLE`HY7YH{o_JPDt zq#dt6b73=EL5OyoA#tq^HpH@+de-A>u~~HO7Vr5r2db@#&{;s=r2v z`1G?g#UCR?{0t%D)9?6H{|5;XpMIF8_&W&^e}WM4=LuWn_#-~DFc&&O^bg8umAs7* z<#kIg`UmCqOFl@5^7l(F`Umw$NQ801Zdcs$q!9w(X#zK?$CJ2!sR9eK$&)rJnq6NLu zy?9x#^g9>#O7Eg2zS8Yj=$CR@%l(qR@}lo_JD2`SzqOj%Hh@Zja~r7iTG>lK4}=PO zCY01CXQw98xl|q_AfDrslLdW_*}R#2B9kr}7?^U7cp;vf(ko1b+|(jjhJJ~Yfic_+ zKM-cKIzFgvp;Co-7NW@5a42pVh4kbszRECT{^LX^AS~zRkF~&VM^3zIA~oYqI=osU zId$ZtbPg^ru79W742`qgCfKZ`%7+NhuGz$P>-60t4x-Wn)r90-(WtP$1>d;-W zjP7BF?pkmSmzAvgy$plBe)oX)SR$aM`^cet9bCg@B}=yo!R+x=kfqvtu0z+jjP8I# z*Sd_(aOk?1(cL6OR3 zL!{xNZ!jy~D~@(-{h6`IvDIWc4)ye}iTaQNEX}x^lmXH2Y zX>V`R7LWFGtA3x#c1phTFFE2-%qol#p{2WR1!Lz?2ARl5SEJNf_E(^L(IP-9 zmr?_C_WC`EN<9j@h6`I}seaASp*k}#iF8jx<(frhQX+)3lwO05&T-AKbm5|MVG?E9 fn#W#jL_4e?@LP}A_DgFT9@&-H*E?(lSh{}!rCQyz literal 0 HcmV?d00001 diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_pwr_ex.d b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_pwr_ex.d new file mode 100644 index 0000000..c2bd2fc --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_pwr_ex.d @@ -0,0 +1,58 @@ +build/stm32f3xx_hal_pwr_ex.o: \ + Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h \ + Core/Inc/stm32f3xx_hal_conf.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h \ + Drivers/CMSIS/Include/core_cm4.h Drivers/CMSIS/Include/cmsis_version.h \ + Drivers/CMSIS/Include/cmsis_compiler.h Drivers/CMSIS/Include/cmsis_gcc.h \ + Drivers/CMSIS/Include/mpu_armv7.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h: +Core/Inc/stm32f3xx_hal_conf.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h: +Drivers/CMSIS/Include/core_cm4.h: +Drivers/CMSIS/Include/cmsis_version.h: +Drivers/CMSIS/Include/cmsis_compiler.h: +Drivers/CMSIS/Include/cmsis_gcc.h: +Drivers/CMSIS/Include/mpu_armv7.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h: +Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h: diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_pwr_ex.lst b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_pwr_ex.lst new file mode 100644 index 0000000..4ed93c4 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_pwr_ex.lst @@ -0,0 +1,499 @@ +ARM GAS /tmp/ccAAJ6DZ.s page 1 + + + 1 .cpu cortex-m4 + 2 .arch armv7e-m + 3 .fpu fpv4-sp-d16 + 4 .eabi_attribute 27, 1 + 5 .eabi_attribute 28, 1 + 6 .eabi_attribute 20, 1 + 7 .eabi_attribute 21, 1 + 8 .eabi_attribute 23, 3 + 9 .eabi_attribute 24, 1 + 10 .eabi_attribute 25, 1 + 11 .eabi_attribute 26, 1 + 12 .eabi_attribute 30, 1 + 13 .eabi_attribute 34, 1 + 14 .eabi_attribute 18, 4 + 15 .file "stm32f3xx_hal_pwr_ex.c" + 16 .text + 17 .Ltext0: + 18 .cfi_sections .debug_frame + 19 .file 1 "Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c" + 20 .section .text.HAL_PWR_ConfigPVD,"ax",%progbits + 21 .align 1 + 22 .global HAL_PWR_ConfigPVD + 23 .syntax unified + 24 .thumb + 25 .thumb_func + 27 HAL_PWR_ConfigPVD: + 28 .LVL0: + 29 .LFB130: + 1:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** /** + 2:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** ****************************************************************************** + 3:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** * @file stm32f3xx_hal_pwr_ex.c + 4:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** * @author MCD Application Team + 5:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** * @brief Extended PWR HAL module driver. + 6:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** * This file provides firmware functions to manage the following + 7:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** * functionalities of the Power Controller (PWR) peripheral: + 8:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** * + Extended Initialization and de-initialization functions + 9:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** * + Extended Peripheral Control functions + 10:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** * + 11:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** ****************************************************************************** + 12:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** * @attention + 13:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** * + 14:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** *

    © Copyright (c) 2016 STMicroelectronics. + 15:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** * All rights reserved.

    + 16:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** * + 17:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** * This software component is licensed by ST under BSD 3-Clause license, + 18:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** * the "License"; You may not use this file except in compliance with the + 19:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** * License. You may obtain a copy of the License at: + 20:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** * opensource.org/licenses/BSD-3-Clause + 21:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** * + 22:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** ****************************************************************************** + 23:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** */ + 24:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** + 25:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** /* Includes ------------------------------------------------------------------*/ + 26:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** #include "stm32f3xx_hal.h" + 27:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** + 28:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** /** @addtogroup STM32F3xx_HAL_Driver + 29:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** * @{ + ARM GAS /tmp/ccAAJ6DZ.s page 2 + + + 30:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** */ + 31:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** + 32:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** /** @defgroup PWREx PWREx + 33:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** * @brief PWREx HAL module driver + 34:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** * @{ + 35:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** */ + 36:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** + 37:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** #ifdef HAL_PWR_MODULE_ENABLED + 38:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** + 39:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** /* Private typedef -----------------------------------------------------------*/ + 40:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** /* Private define ------------------------------------------------------------*/ + 41:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** /** @defgroup PWREx_Private_Constants PWR Extended Private Constants + 42:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** * @{ + 43:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** */ + 44:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** #define PVD_MODE_IT (0x00010000U) + 45:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** #define PVD_MODE_EVT (0x00020000U) + 46:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** #define PVD_RISING_EDGE (0x00000001U) + 47:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** #define PVD_FALLING_EDGE (0x00000002U) + 48:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** /** + 49:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** * @} + 50:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** */ + 51:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** + 52:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** /* Private macro -------------------------------------------------------------*/ + 53:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** /* Private variables ---------------------------------------------------------*/ + 54:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** /* Private function prototypes -----------------------------------------------*/ + 55:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** /* Exported functions ---------------------------------------------------------*/ + 56:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** + 57:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** /** @defgroup PWREx_Exported_Functions PWR Extended Exported Functions + 58:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** * @{ + 59:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** */ + 60:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** + 61:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** /** @defgroup PWREx_Exported_Functions_Group1 Peripheral Extended Control Functions + 62:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** * @brief Extended Peripheral Control functions + 63:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** * + 64:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** @verbatim + 65:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** + 66:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** =============================================================================== + 67:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** ##### Peripheral Extended control functions ##### + 68:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** =============================================================================== + 69:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** *** PVD configuration (present on all other devices than STM32F3x8 devices) *** + 70:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** ========================= + 71:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** [..] + 72:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** (+) The PVD is used to monitor the VDD power supply by comparing it to a + 73:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** threshold selected by the PVD Level (PLS[2:0] bits in the PWR_CR). + 74:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** (+) A PVDO flag is available to indicate if VDD/VDDA is higher or lower + 75:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** than the PVD threshold. This event is internally connected to the EXTI + 76:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** line16 and can generate an interrupt if enabled. This is done through + 77:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** __HAL_PWR_PVD_EXTI_ENABLE_IT() macro + 78:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** (+) The PVD is stopped in Standby mode. + 79:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** -@- PVD is not available on STM32F3x8 Product Line + 80:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** + 81:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** + 82:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** *** Voltage regulator *** + 83:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** ========================= + 84:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** [..] + 85:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** (+) The voltage regulator is always enabled after Reset. It works in three different + 86:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** modes. + ARM GAS /tmp/ccAAJ6DZ.s page 3 + + + 87:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** In Run mode, the regulator supplies full power to the 1.8V domain (core, memories + 88:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** and digital peripherals). + 89:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** In Stop mode, the regulator supplies low power to the 1.8V domain, preserving + 90:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** contents of registers and SRAM. + 91:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** In Stop mode, the regulator is powered off. The contents of the registers and SRAM + 92:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** are lost except for the Standby circuitry and the Backup Domain. + 93:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** Note: in the STM32F3x8xx devices, the voltage regulator is bypassed and the + 94:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** microcontroller must be powered from a nominal VDD = 1.8V +/-8U% voltage. + 95:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** + 96:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** + 97:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** (+) A PVDO flag is available to indicate if VDD/VDDA is higher or lower + 98:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** than the PVD threshold. This event is internally connected to the EXTI + 99:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** line16 and can generate an interrupt if enabled. This is done through + 100:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** __HAL_PWR_PVD_EXTI_ENABLE_IT() macro + 101:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** (+) The PVD is stopped in Standby mode. + 102:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** + 103:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** + 104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** *** SDADC power configuration *** + 105:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** ================================ + 106:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** [..] + 107:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** (+) On STM32F373xC/STM32F378xx devices, there are up to + 108:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** 3 SDADC instances that can be enabled/disabled. + 109:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** + 110:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** @endverbatim + 111:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** * @{ + 112:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** */ + 113:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** + 114:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** #if defined(STM32F302xE) || defined(STM32F303xE) || \ + 115:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** defined(STM32F302xC) || defined(STM32F303xC) || \ + 116:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** defined(STM32F303x8) || defined(STM32F334x8) || \ + 117:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** defined(STM32F301x8) || defined(STM32F302x8) || \ + 118:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** defined(STM32F373xC) + 119:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** + 120:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** /** + 121:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** * @brief Configures the voltage threshold detected by the Power Voltage Detector(PVD). + 122:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** * @param sConfigPVD pointer to an PWR_PVDTypeDef structure that contains the configuration + 123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** * information for the PVD. + 124:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** * @note Refer to the electrical characteristics of your device datasheet for + 125:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** * more details about the voltage threshold corresponding to each + 126:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** * detection level. + 127:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** * @retval None + 128:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** */ + 129:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** void HAL_PWR_ConfigPVD(PWR_PVDTypeDef *sConfigPVD) + 130:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** { + 30 .loc 1 130 1 view -0 + 31 .cfi_startproc + 32 @ args = 0, pretend = 0, frame = 0 + 33 @ frame_needed = 0, uses_anonymous_args = 0 + 34 @ link register save eliminated. + 131:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** /* Check the parameters */ + 132:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** assert_param(IS_PWR_PVD_LEVEL(sConfigPVD->PVDLevel)); + 35 .loc 1 132 3 view .LVU1 + 133:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** assert_param(IS_PWR_PVD_MODE(sConfigPVD->Mode)); + 36 .loc 1 133 3 view .LVU2 + 134:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** + 135:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** /* Set PLS[7:5] bits according to PVDLevel value */ + 136:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** MODIFY_REG(PWR->CR, PWR_CR_PLS, sConfigPVD->PVDLevel); + ARM GAS /tmp/ccAAJ6DZ.s page 4 + + + 37 .loc 1 136 3 view .LVU3 + 38 0000 1E4A ldr r2, .L6 + 39 0002 1368 ldr r3, [r2] + 40 0004 23F0E003 bic r3, r3, #224 + 41 0008 0168 ldr r1, [r0] + 42 000a 0B43 orrs r3, r3, r1 + 43 000c 1360 str r3, [r2] + 137:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** + 138:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** /* Clear any previous config. Keep it clear if no event or IT mode is selected */ + 139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** __HAL_PWR_PVD_EXTI_DISABLE_EVENT(); + 44 .loc 1 139 3 view .LVU4 + 45 000e 1C4B ldr r3, .L6+4 + 46 0010 5A68 ldr r2, [r3, #4] + 47 0012 22F48032 bic r2, r2, #65536 + 48 0016 5A60 str r2, [r3, #4] + 140:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** __HAL_PWR_PVD_EXTI_DISABLE_IT(); + 49 .loc 1 140 3 view .LVU5 + 50 0018 1A68 ldr r2, [r3] + 51 001a 22F48032 bic r2, r2, #65536 + 52 001e 1A60 str r2, [r3] + 141:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** __HAL_PWR_PVD_EXTI_DISABLE_RISING_EDGE();__HAL_PWR_PVD_EXTI_DISABLE_FALLING_EDGE(); + 53 .loc 1 141 3 view .LVU6 + 54 0020 9A68 ldr r2, [r3, #8] + 55 0022 22F48032 bic r2, r2, #65536 + 56 0026 9A60 str r2, [r3, #8] + 57 .loc 1 141 44 view .LVU7 + 58 0028 DA68 ldr r2, [r3, #12] + 59 002a 22F48032 bic r2, r2, #65536 + 60 002e DA60 str r2, [r3, #12] + 142:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** + 143:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** /* Configure interrupt mode */ + 144:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** if((sConfigPVD->Mode & PVD_MODE_IT) == PVD_MODE_IT) + 61 .loc 1 144 3 view .LVU8 + 62 .loc 1 144 17 is_stmt 0 view .LVU9 + 63 0030 4368 ldr r3, [r0, #4] + 64 .loc 1 144 5 view .LVU10 + 65 0032 13F4803F tst r3, #65536 + 66 0036 04D0 beq .L2 + 145:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** { + 146:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** __HAL_PWR_PVD_EXTI_ENABLE_IT(); + 67 .loc 1 146 5 is_stmt 1 view .LVU11 + 68 0038 114A ldr r2, .L6+4 + 69 003a 1368 ldr r3, [r2] + 70 003c 43F48033 orr r3, r3, #65536 + 71 0040 1360 str r3, [r2] + 72 .L2: + 147:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** } + 148:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** + 149:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** /* Configure event mode */ + 150:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** if((sConfigPVD->Mode & PVD_MODE_EVT) == PVD_MODE_EVT) + 73 .loc 1 150 3 view .LVU12 + 74 .loc 1 150 17 is_stmt 0 view .LVU13 + 75 0042 4368 ldr r3, [r0, #4] + 76 .loc 1 150 5 view .LVU14 + 77 0044 13F4003F tst r3, #131072 + 78 0048 04D0 beq .L3 + 151:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** { + ARM GAS /tmp/ccAAJ6DZ.s page 5 + + + 152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** __HAL_PWR_PVD_EXTI_ENABLE_EVENT(); + 79 .loc 1 152 5 is_stmt 1 view .LVU15 + 80 004a 0D4A ldr r2, .L6+4 + 81 004c 5368 ldr r3, [r2, #4] + 82 004e 43F48033 orr r3, r3, #65536 + 83 0052 5360 str r3, [r2, #4] + 84 .L3: + 153:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** } + 154:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** + 155:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** /* Configure the edge */ + 156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** if((sConfigPVD->Mode & PVD_RISING_EDGE) == PVD_RISING_EDGE) + 85 .loc 1 156 3 view .LVU16 + 86 .loc 1 156 17 is_stmt 0 view .LVU17 + 87 0054 4368 ldr r3, [r0, #4] + 88 .loc 1 156 5 view .LVU18 + 89 0056 13F0010F tst r3, #1 + 90 005a 04D0 beq .L4 + 157:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** { + 158:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** __HAL_PWR_PVD_EXTI_ENABLE_RISING_EDGE(); + 91 .loc 1 158 5 is_stmt 1 view .LVU19 + 92 005c 084A ldr r2, .L6+4 + 93 005e 9368 ldr r3, [r2, #8] + 94 0060 43F48033 orr r3, r3, #65536 + 95 0064 9360 str r3, [r2, #8] + 96 .L4: + 159:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** } + 160:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** + 161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** if((sConfigPVD->Mode & PVD_FALLING_EDGE) == PVD_FALLING_EDGE) + 97 .loc 1 161 3 view .LVU20 + 98 .loc 1 161 17 is_stmt 0 view .LVU21 + 99 0066 4368 ldr r3, [r0, #4] + 100 .loc 1 161 5 view .LVU22 + 101 0068 13F0020F tst r3, #2 + 102 006c 04D0 beq .L1 + 162:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** { + 163:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** __HAL_PWR_PVD_EXTI_ENABLE_FALLING_EDGE(); + 103 .loc 1 163 5 is_stmt 1 view .LVU23 + 104 006e 044A ldr r2, .L6+4 + 105 0070 D368 ldr r3, [r2, #12] + 106 0072 43F48033 orr r3, r3, #65536 + 107 0076 D360 str r3, [r2, #12] + 108 .L1: + 164:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** } + 165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** } + 109 .loc 1 165 1 is_stmt 0 view .LVU24 + 110 0078 7047 bx lr + 111 .L7: + 112 007a 00BF .align 2 + 113 .L6: + 114 007c 00700040 .word 1073770496 + 115 0080 00040140 .word 1073808384 + 116 .cfi_endproc + 117 .LFE130: + 119 .section .text.HAL_PWR_EnablePVD,"ax",%progbits + 120 .align 1 + 121 .global HAL_PWR_EnablePVD + 122 .syntax unified + ARM GAS /tmp/ccAAJ6DZ.s page 6 + + + 123 .thumb + 124 .thumb_func + 126 HAL_PWR_EnablePVD: + 127 .LFB131: + 166:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** + 167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** /** + 168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** * @brief Enables the Power Voltage Detector(PVD). + 169:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** * @retval None + 170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** */ + 171:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** void HAL_PWR_EnablePVD(void) + 172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** { + 128 .loc 1 172 1 is_stmt 1 view -0 + 129 .cfi_startproc + 130 @ args = 0, pretend = 0, frame = 0 + 131 @ frame_needed = 0, uses_anonymous_args = 0 + 132 @ link register save eliminated. + 173:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** SET_BIT(PWR->CR, PWR_CR_PVDE); + 133 .loc 1 173 3 view .LVU26 + 134 0000 024A ldr r2, .L9 + 135 0002 1368 ldr r3, [r2] + 136 0004 43F01003 orr r3, r3, #16 + 137 0008 1360 str r3, [r2] + 174:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** } + 138 .loc 1 174 1 is_stmt 0 view .LVU27 + 139 000a 7047 bx lr + 140 .L10: + 141 .align 2 + 142 .L9: + 143 000c 00700040 .word 1073770496 + 144 .cfi_endproc + 145 .LFE131: + 147 .section .text.HAL_PWR_DisablePVD,"ax",%progbits + 148 .align 1 + 149 .global HAL_PWR_DisablePVD + 150 .syntax unified + 151 .thumb + 152 .thumb_func + 154 HAL_PWR_DisablePVD: + 155 .LFB132: + 175:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** + 176:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** /** + 177:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** * @brief Disables the Power Voltage Detector(PVD). + 178:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** * @retval None + 179:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** */ + 180:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** void HAL_PWR_DisablePVD(void) + 181:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** { + 156 .loc 1 181 1 is_stmt 1 view -0 + 157 .cfi_startproc + 158 @ args = 0, pretend = 0, frame = 0 + 159 @ frame_needed = 0, uses_anonymous_args = 0 + 160 @ link register save eliminated. + 182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** CLEAR_BIT(PWR->CR, PWR_CR_PVDE); + 161 .loc 1 182 3 view .LVU29 + 162 0000 024A ldr r2, .L12 + 163 0002 1368 ldr r3, [r2] + 164 0004 23F01003 bic r3, r3, #16 + 165 0008 1360 str r3, [r2] + ARM GAS /tmp/ccAAJ6DZ.s page 7 + + + 183:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** } + 166 .loc 1 183 1 is_stmt 0 view .LVU30 + 167 000a 7047 bx lr + 168 .L13: + 169 .align 2 + 170 .L12: + 171 000c 00700040 .word 1073770496 + 172 .cfi_endproc + 173 .LFE132: + 175 .section .text.HAL_PWR_PVDCallback,"ax",%progbits + 176 .align 1 + 177 .weak HAL_PWR_PVDCallback + 178 .syntax unified + 179 .thumb + 180 .thumb_func + 182 HAL_PWR_PVDCallback: + 183 .LFB134: + 184:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** + 185:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** /** + 186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** * @brief This function handles the PWR PVD interrupt request. + 187:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** * @note This API should be called under the PVD_IRQHandler(). + 188:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** * @retval None + 189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** */ + 190:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** void HAL_PWR_PVD_IRQHandler(void) + 191:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** { + 192:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** /* Check PWR exti flag */ + 193:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** if(__HAL_PWR_PVD_EXTI_GET_FLAG() != RESET) + 194:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** { + 195:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** /* PWR PVD interrupt user callback */ + 196:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** HAL_PWR_PVDCallback(); + 197:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** + 198:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** /* Clear PWR Exti pending bit */ + 199:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** __HAL_PWR_PVD_EXTI_CLEAR_FLAG(); + 200:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** } + 201:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** } + 202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** + 203:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** /** + 204:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** * @brief PWR PVD interrupt callback + 205:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** * @retval None + 206:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** */ + 207:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** __weak void HAL_PWR_PVDCallback(void) + 208:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** { + 184 .loc 1 208 1 is_stmt 1 view -0 + 185 .cfi_startproc + 186 @ args = 0, pretend = 0, frame = 0 + 187 @ frame_needed = 0, uses_anonymous_args = 0 + 188 @ link register save eliminated. + 209:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** /* NOTE : This function Should not be modified, when the callback is needed, + 210:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** the HAL_PWR_PVDCallback could be implemented in the user file + 211:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** */ + 212:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** } + 189 .loc 1 212 1 view .LVU32 + 190 0000 7047 bx lr + 191 .cfi_endproc + 192 .LFE134: + 194 .section .text.HAL_PWR_PVD_IRQHandler,"ax",%progbits + 195 .align 1 + ARM GAS /tmp/ccAAJ6DZ.s page 8 + + + 196 .global HAL_PWR_PVD_IRQHandler + 197 .syntax unified + 198 .thumb + 199 .thumb_func + 201 HAL_PWR_PVD_IRQHandler: + 202 .LFB133: + 191:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** /* Check PWR exti flag */ + 203 .loc 1 191 1 view -0 + 204 .cfi_startproc + 205 @ args = 0, pretend = 0, frame = 0 + 206 @ frame_needed = 0, uses_anonymous_args = 0 + 207 0000 08B5 push {r3, lr} + 208 .cfi_def_cfa_offset 8 + 209 .cfi_offset 3, -8 + 210 .cfi_offset 14, -4 + 193:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** { + 211 .loc 1 193 3 view .LVU34 + 193:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** { + 212 .loc 1 193 6 is_stmt 0 view .LVU35 + 213 0002 064B ldr r3, .L19 + 214 0004 5B69 ldr r3, [r3, #20] + 193:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** { + 215 .loc 1 193 5 view .LVU36 + 216 0006 13F4803F tst r3, #65536 + 217 000a 00D1 bne .L18 + 218 .L15: + 201:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** + 219 .loc 1 201 1 view .LVU37 + 220 000c 08BD pop {r3, pc} + 221 .L18: + 196:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** + 222 .loc 1 196 5 is_stmt 1 view .LVU38 + 223 000e FFF7FEFF bl HAL_PWR_PVDCallback + 224 .LVL1: + 199:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** } + 225 .loc 1 199 5 view .LVU39 + 226 0012 024B ldr r3, .L19 + 227 0014 4FF48032 mov r2, #65536 + 228 0018 5A61 str r2, [r3, #20] + 201:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_pwr_ex.c **** + 229 .loc 1 201 1 is_stmt 0 view .LVU40 + 230 001a F7E7 b .L15 + 231 .L20: + 232 .align 2 + 233 .L19: + 234 001c 00040140 .word 1073808384 + 235 .cfi_endproc + 236 .LFE133: + 238 .text + 239 .Letext0: + 240 .file 2 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 241 .file 3 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 242 .file 4 "Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h" + 243 .file 5 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h" + 244 .file 6 "Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h" + ARM GAS /tmp/ccAAJ6DZ.s page 9 + + +DEFINED SYMBOLS + *ABS*:0000000000000000 stm32f3xx_hal_pwr_ex.c + /tmp/ccAAJ6DZ.s:21 .text.HAL_PWR_ConfigPVD:0000000000000000 $t + /tmp/ccAAJ6DZ.s:27 .text.HAL_PWR_ConfigPVD:0000000000000000 HAL_PWR_ConfigPVD + /tmp/ccAAJ6DZ.s:114 .text.HAL_PWR_ConfigPVD:000000000000007c $d + /tmp/ccAAJ6DZ.s:120 .text.HAL_PWR_EnablePVD:0000000000000000 $t + /tmp/ccAAJ6DZ.s:126 .text.HAL_PWR_EnablePVD:0000000000000000 HAL_PWR_EnablePVD + /tmp/ccAAJ6DZ.s:143 .text.HAL_PWR_EnablePVD:000000000000000c $d + /tmp/ccAAJ6DZ.s:148 .text.HAL_PWR_DisablePVD:0000000000000000 $t + /tmp/ccAAJ6DZ.s:154 .text.HAL_PWR_DisablePVD:0000000000000000 HAL_PWR_DisablePVD + /tmp/ccAAJ6DZ.s:171 .text.HAL_PWR_DisablePVD:000000000000000c $d + /tmp/ccAAJ6DZ.s:176 .text.HAL_PWR_PVDCallback:0000000000000000 $t + /tmp/ccAAJ6DZ.s:182 .text.HAL_PWR_PVDCallback:0000000000000000 HAL_PWR_PVDCallback + /tmp/ccAAJ6DZ.s:195 .text.HAL_PWR_PVD_IRQHandler:0000000000000000 $t + /tmp/ccAAJ6DZ.s:201 .text.HAL_PWR_PVD_IRQHandler:0000000000000000 HAL_PWR_PVD_IRQHandler + /tmp/ccAAJ6DZ.s:234 .text.HAL_PWR_PVD_IRQHandler:000000000000001c $d + +NO UNDEFINED SYMBOLS diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_pwr_ex.o b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_pwr_ex.o new file mode 100644 index 0000000000000000000000000000000000000000..7da9586d82479eae1b2d13be262fa51cb3d61e1d GIT binary patch literal 5500 zcmd5oOW$D&AGO(KbSuv z`#Me0&{EMqlYk-0AEtu%!-Uu$G&(dPu~kT*iXUua5`qfECQ-o;1fA$KAqM4nkMFUs zy%zY%k?(!pkLSGSocEl2&hc}xQ^$l5q>7*+YHCE&z0zZhNf@H-w2gMo267MIc~=)X z|5RXU$H@!1!MkhG3rpK1Zd-a$;)_eSB;Hz@$_4JOJ?eR@7xkv@u8jtyg<$ELjY~_M zEqBBQ&s)CPtI~2+S~OTZv+qdDJ4?&Q=?z+@3G#>ujbq*E(F1ISjrE6JI;`Y-)qC>E zJhx46`+j`y!++h=PM+qTnjij=V~lG=1_=)jZQUY9{ZK!o$MLLZlT(E7u7W6p??8r>-G7D&o{n1#K4T9Pd>sVvdyIU^X5Zhy^jv{SAKo|v-uhL% zyay8EARPM4+ya^63QVNOASb2l(Kf@GlCn>G8kN&hUax%{vL)pneSU#5QrxJ04fV5v zBX8BN;hmH64((OQdC3WC!wC5~Deuw(usgYt} zve2GKJ+JR~!s5P9Ezs|!A7Xrg-j%Y4I<~|4p3q}}t_~66D&G-bg4V6$MH}L=MXWgC z^AylpkIxwE`~mE~-FS`j5Xg5Pj)N?E$nz4wIILZT*Vu>Gn_Wx+fyA}WKLcK8J%~qK z`wRTNeGuP(fSE?Q?&Wt69&ydM33%CM=sbcrmzlsbAg+x~tm><`XQ1N1`g(hvVbP2>;BAKE`s;edBi#XXb$j=j zExn>=3s$4kdmonHKH~m#dBjn_AMxv5T2S|r~RwQk% zq?!`7oUkormdBH%0gzF$&Jj^N6}#3H|-!1$vkFwLULvyv3#+TuvWt< zK7bNwD`VCQcEY~2Y*oWKUPg(koyIl_MQ>Ccj;^L)z!JG{tQ>##4Nsj&h9E<(HvO^? zhQ2Yd>Eij5#@<;&pEG*B!Z3o~qlW&}1LP;0cHzCCd9l!%0bk~T0YiAtYkG_0`hy&A z3b9$k{^ttvI&%jNFLxzuh-t&{ZXZF+Q!*wm-T5aL64UvrnJifIXQydlF^=6?P0W4M zja43LD_X57D(n%-*z>AslQ`s+FqwY{^OoQ#rFjY84H^}4K7mb+~Q0^HNYv5jVc4GoU&G|0^uBux&uv_g+dY^D_@$Ax3^1EUnA5Oi(xz>Os#eO*mrGUX znOaH84O=sDoD-R)kEg0SCATeJ4)G^uVi3N(>qxy24lsfl}=*;z!_XUFrFA6+tZ$N zZ1Q~jx`!f2d$xOhSIcdTPY?I)j8BjMr1N*a5sxZC2$S8uFKS;AG&u^z?C89X`jF4ZT68bTD?MyHbA!}DdB-0F_7TSSfK7FmO}o;KZKwIU zsSmKZ>nV$CKUXGv%#Gd3Wpi(ZxPj8TPvDXa)UePwgM0_$YcJzw2e&ao8DzvAkk>o= zdHjs~9X#q_%)wa)&pDWIFyo-@;3WsY=im<={E36VaqzZ-?>qQU2l*cb_hXZT0}dW? zFyr8wgD*JvO$Wd0;B^OYIQTP0BTs|2aK$Qo%$c;^xC#FPibY(|-SsjRvk21U!d%$2 z?Mgmb!zBr+`(F$1^Vr8_Hy%v&f9353r@dX?|5Wif z0bI$HV(ZGav7BP%QoKA z2r$7FoT7NYfbMSh0FJp~*tlKZCsez)A*(tN>05B{T&kjc@4?`XmqWZE*f<`apeo+q zA*(tN>F03#={|Y+06urTue###39RDbZ;y<}edqEDt_Lr*#pCvR+IZ)X+(WWP{ly%9 z9&&if^>y%aN&#}aT>8Ot_wP0IZyt6YFW&%E|2_pCrfL}`Sw2EM_qW7ta$$6Jn})Gp p_P~Jcl=v>g@p|xZo9df{NE4W>H5Qzr;&G1LJRd6aIi`vd{|z;lIa>e# literal 0 HcmV?d00001 diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_rcc.d b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_rcc.d new file mode 100644 index 0000000..a412abf --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_rcc.d @@ -0,0 +1,58 @@ +build/stm32f3xx_hal_rcc.o: \ + Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h \ + Core/Inc/stm32f3xx_hal_conf.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h \ + Drivers/CMSIS/Include/core_cm4.h Drivers/CMSIS/Include/cmsis_version.h \ + Drivers/CMSIS/Include/cmsis_compiler.h Drivers/CMSIS/Include/cmsis_gcc.h \ + Drivers/CMSIS/Include/mpu_armv7.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h: +Core/Inc/stm32f3xx_hal_conf.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h: +Drivers/CMSIS/Include/core_cm4.h: +Drivers/CMSIS/Include/cmsis_version.h: +Drivers/CMSIS/Include/cmsis_compiler.h: +Drivers/CMSIS/Include/cmsis_gcc.h: +Drivers/CMSIS/Include/mpu_armv7.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h: +Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h: diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_rcc.lst b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_rcc.lst new file mode 100644 index 0000000..73aca6b --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_rcc.lst @@ -0,0 +1,6322 @@ +ARM GAS /tmp/cczyIHoC.s page 1 + + + 1 .cpu cortex-m4 + 2 .arch armv7e-m + 3 .fpu fpv4-sp-d16 + 4 .eabi_attribute 27, 1 + 5 .eabi_attribute 28, 1 + 6 .eabi_attribute 20, 1 + 7 .eabi_attribute 21, 1 + 8 .eabi_attribute 23, 3 + 9 .eabi_attribute 24, 1 + 10 .eabi_attribute 25, 1 + 11 .eabi_attribute 26, 1 + 12 .eabi_attribute 30, 1 + 13 .eabi_attribute 34, 1 + 14 .eabi_attribute 18, 4 + 15 .file "stm32f3xx_hal_rcc.c" + 16 .text + 17 .Ltext0: + 18 .cfi_sections .debug_frame + 19 .file 1 "Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c" + 20 .section .text.HAL_RCC_DeInit,"ax",%progbits + 21 .align 1 + 22 .global HAL_RCC_DeInit + 23 .syntax unified + 24 .thumb + 25 .thumb_func + 27 HAL_RCC_DeInit: + 28 .LFB130: + 1:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /** + 2:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** ****************************************************************************** + 3:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @file stm32f3xx_hal_rcc.c + 4:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @author MCD Application Team + 5:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @brief RCC HAL module driver. + 6:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * This file provides firmware functions to manage the following + 7:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * functionalities of the Reset and Clock Control (RCC) peripheral: + 8:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * + Initialization and de-initialization functions + 9:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * + Peripheral Control functions + 10:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * + 11:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** @verbatim + 12:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** ============================================================================== + 13:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** ##### RCC specific features ##### + 14:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** ============================================================================== + 15:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** [..] + 16:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** After reset the device is running from Internal High Speed oscillator + 17:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (HSI 8MHz) with Flash 0 wait state, Flash prefetch buffer is enabled, + 18:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** and all peripherals are off except internal SRAM, Flash and JTAG. + 19:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (+) There is no prescaler on High speed (AHB) and Low speed (APB) buses; + 20:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** all peripherals mapped on these buses are running at HSI speed. + 21:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (+) The clock for all peripherals is switched off, except the SRAM and FLASH. + 22:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (+) All GPIOs are in input floating state, except the JTAG pins which + 23:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** are assigned to be used for debug purpose. + 24:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** [..] Once the device started from reset, the user application has to: + 25:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (+) Configure the clock source to be used to drive the System clock + 26:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (if the application needs higher frequency/performance) + 27:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (+) Configure the System clock frequency and Flash settings + 28:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (+) Configure the AHB and APB buses prescalers + 29:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (+) Enable the clock for the peripheral(s) to be used + 30:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (+) Configure the clock source(s) for peripherals whose clocks are not + ARM GAS /tmp/cczyIHoC.s page 2 + + + 31:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** derived from the System clock (RTC, ADC, I2C, I2S, TIM, USB FS) + 32:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 33:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** ##### RCC Limitations ##### + 34:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** ============================================================================== + 35:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** [..] + 36:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** A delay between an RCC peripheral clock enable and the effective peripheral + 37:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** enabling should be taken into account in order to manage the peripheral read/write + 38:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** from/to registers. + 39:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (+) This delay depends on the peripheral mapping. + 40:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (++) AHB & APB peripherals, 1 dummy read is necessary + 41:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 42:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** [..] + 43:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** Workarounds: + 44:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (#) For AHB & APB peripherals, a dummy read to the peripheral register has been + 45:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** inserted in each __HAL_RCC_PPP_CLK_ENABLE() macro. + 46:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 47:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** @endverbatim + 48:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** ****************************************************************************** + 49:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @attention + 50:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * + 51:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** *

    © Copyright (c) 2016 STMicroelectronics. + 52:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * All rights reserved.

    + 53:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * + 54:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * This software component is licensed by ST under BSD 3-Clause license, + 55:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * the "License"; You may not use this file except in compliance with the + 56:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * License. You may obtain a copy of the License at: + 57:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * opensource.org/licenses/BSD-3-Clause + 58:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * + 59:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** ****************************************************************************** + 60:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** */ + 61:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 62:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Includes ------------------------------------------------------------------*/ + 63:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** #include "stm32f3xx_hal.h" + 64:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 65:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /** @addtogroup STM32F3xx_HAL_Driver + 66:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @{ + 67:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** */ + 68:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 69:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /** @defgroup RCC RCC + 70:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @brief RCC HAL module driver + 71:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @{ + 72:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** */ + 73:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 74:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** #ifdef HAL_RCC_MODULE_ENABLED + 75:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 76:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Private typedef -----------------------------------------------------------*/ + 77:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Private define ------------------------------------------------------------*/ + 78:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /** @defgroup RCC_Private_Constants RCC Private Constants + 79:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @{ + 80:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** */ + 81:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Bits position in in the CFGR register */ + 82:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** #define RCC_CFGR_HPRE_BITNUMBER POSITION_VAL(RCC_CFGR_HPRE) + 83:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** #define RCC_CFGR_PPRE1_BITNUMBER POSITION_VAL(RCC_CFGR_PPRE1) + 84:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** #define RCC_CFGR_PPRE2_BITNUMBER POSITION_VAL(RCC_CFGR_PPRE2) + 85:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /** + 86:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @} + 87:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** */ + ARM GAS /tmp/cczyIHoC.s page 3 + + + 88:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Private macro -------------------------------------------------------------*/ + 89:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /** @defgroup RCC_Private_Macros RCC Private Macros + 90:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @{ + 91:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** */ + 92:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 93:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** #define MCO1_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() + 94:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** #define MCO1_GPIO_PORT GPIOA + 95:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** #define MCO1_PIN GPIO_PIN_8 + 96:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 97:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /** + 98:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @} + 99:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** */ + 100:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 101:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Private variables ---------------------------------------------------------*/ + 102:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /** @defgroup RCC_Private_Variables RCC Private Variables + 103:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @{ + 104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** */ + 105:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** const uint8_t aPLLMULFactorTable[16] = { 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, + 106:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** 10U, 11U, 12U, 13U, 14U, 15U, 16U, 16U}; + 107:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** const uint8_t aPredivFactorTable[16] = { 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, + 108:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** 9U,10U, 11U, 12U, 13U, 14U, 15U, 16U}; + 109:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /** + 110:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @} + 111:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** */ + 112:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 113:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Private function prototypes -----------------------------------------------*/ + 114:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Exported functions ---------------------------------------------------------*/ + 115:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 116:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /** @defgroup RCC_Exported_Functions RCC Exported Functions + 117:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @{ + 118:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** */ + 119:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 120:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /** @defgroup RCC_Exported_Functions_Group1 Initialization and de-initialization functions + 121:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @brief Initialization and Configuration functions + 122:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * + 123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** @verbatim + 124:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** =============================================================================== + 125:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** ##### Initialization and de-initialization functions ##### + 126:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** =============================================================================== + 127:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** [..] + 128:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** This section provides functions allowing to configure the internal/external oscillators + 129:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (HSE, HSI, LSE, LSI, PLL, CSS and MCO) and the System buses clocks (SYSCLK, AHB, APB1 + 130:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** and APB2). + 131:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 132:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** [..] Internal/external clock and PLL configuration + 133:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (#) HSI (high-speed internal), 8 MHz factory-trimmed RC used directly or through + 134:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** the PLL as System clock source. + 135:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** The HSI clock can be used also to clock the USART and I2C peripherals. + 136:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 137:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (#) LSI (low-speed internal), ~40 KHz low consumption RC used as IWDG and/or RTC + 138:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** clock source. + 139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 140:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (#) HSE (high-speed external), 4 to 32 MHz crystal oscillator used directly or + 141:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** through the PLL as System clock source. Can be used also as RTC clock source. + 142:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 143:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (#) LSE (low-speed external), 32 KHz oscillator used as RTC clock source. + 144:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + ARM GAS /tmp/cczyIHoC.s page 4 + + + 145:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (#) PLL (clocked by HSI or HSE), featuring different output clocks: + 146:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (++) The first output is used to generate the high speed system clock (up to 72 MHz) + 147:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (++) The second output is used to generate the clock for the USB FS (48 MHz) + 148:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (++) The third output may be used to generate the clock for the ADC peripherals (up to 72 M + 149:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (++) The fourth output may be used to generate the clock for the TIM peripherals (144 MHz) + 150:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 151:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (#) CSS (Clock security system), once enable using the macro __HAL_RCC_CSS_ENABLE() + 152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** and if a HSE clock failure occurs(HSE used directly or through PLL as System + 153:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** clock source), the System clocks automatically switched to HSI and an interrupt + 154:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** is generated if enabled. The interrupt is linked to the Cortex-M4 NMI + 155:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (Non-Maskable Interrupt) exception vector. + 156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 157:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (#) MCO (microcontroller clock output), used to output SYSCLK, HSI, HSE, LSI, LSE or PLL + 158:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** clock (divided by 2) output on pin (such as PA8 pin). + 159:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 160:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** [..] System, AHB and APB buses clocks configuration + 161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (#) Several clock sources can be used to drive the System clock (SYSCLK): HSI, + 162:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** HSE and PLL. + 163:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** The AHB clock (HCLK) is derived from System clock through configurable + 164:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** prescaler and used to clock the CPU, memory and peripherals mapped + 165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** on AHB bus (DMA, GPIO...). APB1 (PCLK1) and APB2 (PCLK2) clocks are derived + 166:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** from AHB clock through configurable prescalers and used to clock + 167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** the peripherals mapped on these buses. You can use + 168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** "HAL_RCC_GetSysClockFreq()" function to retrieve the frequencies of these clocks. + 169:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (#) All the peripheral clocks are derived from the System clock (SYSCLK) except: + 171:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (++) The FLASH program/erase clock which is always HSI 8MHz clock. + 172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (++) The USB 48 MHz clock which is derived from the PLL VCO clock. + 173:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (++) The USART clock which can be derived as well from HSI 8MHz, LSI or LSE. + 174:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (++) The I2C clock which can be derived as well from HSI 8MHz clock. + 175:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (++) The ADC clock which is derived from PLL output. + 176:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (++) The RTC clock which is derived from the LSE, LSI or 1 MHz HSE_RTC + 177:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (HSE divided by a programmable prescaler). The System clock (SYSCLK) + 178:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** frequency must be higher or equal to the RTC clock frequency. + 179:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (++) IWDG clock which is always the LSI clock. + 180:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 181:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (#) For the STM32F3xx devices, the maximum frequency of the SYSCLK, HCLK, PCLK1 and PCLK2 + 182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** Depending on the SYSCLK frequency, the flash latency should be adapted accordingly. + 183:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 184:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (#) After reset, the System clock source is the HSI (8 MHz) with 0 WS and + 185:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** prefetch is disabled. + 186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** @endverbatim + 187:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @{ + 188:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** */ + 189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 190:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* + 191:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** Additional consideration on the SYSCLK based on Latency settings: + 192:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** +-----------------------------------------------+ + 193:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** | Latency | SYSCLK clock frequency (MHz) | + 194:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** |---------------|-------------------------------| + 195:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** |0WS(1CPU cycle)| 0 < SYSCLK <= 24 | + 196:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** |---------------|-------------------------------| + 197:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** |1WS(2CPU cycle)| 24 < SYSCLK <= 48 | + 198:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** |---------------|-------------------------------| + 199:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** |2WS(3CPU cycle)| 48 < SYSCLK <= 72 | + 200:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** +-----------------------------------------------+ + 201:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** */ + ARM GAS /tmp/cczyIHoC.s page 5 + + + 202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 203:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /** + 204:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @brief Resets the RCC clock configuration to the default reset state. + 205:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @note The default reset state of the clock configuration is given below: + 206:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * - HSI ON and used as system clock source + 207:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * - HSE and PLL OFF + 208:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * - AHB, APB1 and APB2 prescaler set to 1. + 209:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * - CSS and MCO1 OFF + 210:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * - All interrupts disabled + 211:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @note This function does not modify the configuration of the + 212:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * - Peripheral clocks + 213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * - LSI, LSE and RTC clocks + 214:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @retval HAL status + 215:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** */ + 216:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** HAL_StatusTypeDef HAL_RCC_DeInit(void) + 217:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 29 .loc 1 217 1 view -0 + 30 .cfi_startproc + 31 @ args = 0, pretend = 0, frame = 0 + 32 @ frame_needed = 0, uses_anonymous_args = 0 + 33 0000 38B5 push {r3, r4, r5, lr} + 34 .cfi_def_cfa_offset 16 + 35 .cfi_offset 3, -16 + 36 .cfi_offset 4, -12 + 37 .cfi_offset 5, -8 + 38 .cfi_offset 14, -4 + 218:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** uint32_t tickstart = 0; + 39 .loc 1 218 3 view .LVU1 + 40 .LVL0: + 219:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 220:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Set HSION bit */ + 221:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** SET_BIT(RCC->CR, RCC_CR_HSION); + 41 .loc 1 221 3 view .LVU2 + 42 0002 364A ldr r2, .L18 + 43 0004 1368 ldr r3, [r2] + 44 0006 43F00103 orr r3, r3, #1 + 45 000a 1360 str r3, [r2] + 222:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 223:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Insure HSIRDY bit is set before writing default HSITRIM value */ + 224:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Get start tick */ + 225:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** tickstart = HAL_GetTick(); + 46 .loc 1 225 3 view .LVU3 + 47 .loc 1 225 15 is_stmt 0 view .LVU4 + 48 000c FFF7FEFF bl HAL_GetTick + 49 .LVL1: + 50 0010 0446 mov r4, r0 + 51 .LVL2: + 226:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 227:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Wait till HSI is ready */ + 228:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** while(READ_BIT(RCC->CR, RCC_CR_HSIRDY) == RESET) + 52 .loc 1 228 3 is_stmt 1 view .LVU5 + 53 .L2: + 54 .loc 1 228 42 view .LVU6 + 55 .loc 1 228 9 is_stmt 0 view .LVU7 + 56 0012 324B ldr r3, .L18 + 57 0014 1B68 ldr r3, [r3] + 58 .loc 1 228 42 view .LVU8 + ARM GAS /tmp/cczyIHoC.s page 6 + + + 59 0016 13F0020F tst r3, #2 + 60 001a 07D1 bne .L14 + 229:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 230:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE) + 61 .loc 1 230 5 is_stmt 1 view .LVU9 + 62 .loc 1 230 9 is_stmt 0 view .LVU10 + 63 001c FFF7FEFF bl HAL_GetTick + 64 .LVL3: + 65 .loc 1 230 23 view .LVU11 + 66 0020 001B subs r0, r0, r4 + 67 .loc 1 230 7 view .LVU12 + 68 0022 0228 cmp r0, #2 + 69 0024 F5D9 bls .L2 + 231:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 232:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** return HAL_TIMEOUT; + 70 .loc 1 232 14 view .LVU13 + 71 0026 0324 movs r4, #3 + 72 .LVL4: + 73 .L3: + 233:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 234:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 235:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 236:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Set HSITRIM default value */ + 237:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** MODIFY_REG(RCC->CR, RCC_CR_HSITRIM, RCC_CR_HSITRIM_4); + 238:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Reset SW[1:0], HPRE[3:0], PPRE1[2:0], PPRE2[2:0] and MCOSEL[2:0] bits */ + 240:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** CLEAR_BIT(RCC->CFGR, RCC_CFGR_SW | RCC_CFGR_HPRE | RCC_CFGR_PPRE1 | RCC_CFGR_PPRE2 | RCC_CFGR_MCO + 241:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 242:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Insure HSI selected as system clock source */ + 243:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Get start tick */ + 244:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** tickstart = HAL_GetTick(); + 245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 246:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Wait till system clock source is ready */ + 247:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** while(READ_BIT(RCC->CFGR, RCC_CFGR_SWS) != RCC_CFGR_SWS_HSI) + 248:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if((HAL_GetTick() - tickstart) > CLOCKSWITCH_TIMEOUT_VALUE) + 250:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 251:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** return HAL_TIMEOUT; + 252:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 253:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 254:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 255:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Update the SystemCoreClock global variable for HSI as system clock source */ + 256:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** SystemCoreClock = HSI_VALUE; + 257:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 258:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Configure the source of time base considering new system clock settings */ + 259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if(HAL_InitTick(uwTickPrio) != HAL_OK) + 260:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 261:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** return HAL_ERROR; + 262:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 263:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 264:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Reset HSEON, CSSON, PLLON bits */ + 265:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** CLEAR_BIT(RCC->CR, RCC_CR_PLLON | RCC_CR_CSSON | RCC_CR_HSEON); + 266:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 267:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Reset HSEBYP bit */ + 268:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** CLEAR_BIT(RCC->CR, RCC_CR_HSEBYP); + 269:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 270:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Insure PLLRDY is reset */ + ARM GAS /tmp/cczyIHoC.s page 7 + + + 271:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Get start tick */ + 272:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** tickstart = HAL_GetTick(); + 273:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** while(READ_BIT(RCC->CR, RCC_CR_PLLRDY) != 0U) + 274:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) + 276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 277:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** return HAL_TIMEOUT; + 278:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 279:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 280:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 281:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Reset CFGR register */ + 282:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** CLEAR_REG(RCC->CFGR); + 283:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 284:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Reset CFGR2 register */ + 285:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** CLEAR_REG(RCC->CFGR2); + 286:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 287:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Reset CFGR3 register */ + 288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** CLEAR_REG(RCC->CFGR3); + 289:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 290:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Clear all interrupt flags */ + 291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** SET_BIT(RCC->CIR, RCC_CIR_LSIRDYC | RCC_CIR_LSERDYC | RCC_CIR_HSIRDYC | RCC_CIR_HSERDYC | RCC_CIR + 292:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 293:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Disable all interrupts */ + 294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** CLEAR_REG(RCC->CIR); + 295:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Reset all CSR flags */ + 297:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** __HAL_RCC_CLEAR_RESET_FLAGS(); + 298:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 299:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** return HAL_OK; + 300:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 74 .loc 1 300 1 view .LVU14 + 75 0028 2046 mov r0, r4 + 76 002a 38BD pop {r3, r4, r5, pc} + 77 .LVL5: + 78 .L14: + 237:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 79 .loc 1 237 3 is_stmt 1 view .LVU15 + 80 002c 2B4A ldr r2, .L18 + 81 002e 1368 ldr r3, [r2] + 82 0030 23F0F803 bic r3, r3, #248 + 83 0034 43F08003 orr r3, r3, #128 + 84 0038 1360 str r3, [r2] + 240:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 85 .loc 1 240 3 view .LVU16 + 86 003a 5168 ldr r1, [r2, #4] + 87 003c 284B ldr r3, .L18+4 + 88 003e 0B40 ands r3, r3, r1 + 89 0040 5360 str r3, [r2, #4] + 244:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 90 .loc 1 244 3 view .LVU17 + 244:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 91 .loc 1 244 15 is_stmt 0 view .LVU18 + 92 0042 FFF7FEFF bl HAL_GetTick + 93 .LVL6: + 94 0046 0446 mov r4, r0 + 95 .LVL7: + 247:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + ARM GAS /tmp/cczyIHoC.s page 8 + + + 96 .loc 1 247 3 is_stmt 1 view .LVU19 + 97 .L5: + 247:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 98 .loc 1 247 43 view .LVU20 + 247:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 99 .loc 1 247 9 is_stmt 0 view .LVU21 + 100 0048 244B ldr r3, .L18 + 101 004a 5B68 ldr r3, [r3, #4] + 247:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 102 .loc 1 247 43 view .LVU22 + 103 004c 13F00C0F tst r3, #12 + 104 0050 08D0 beq .L15 + 249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 105 .loc 1 249 5 is_stmt 1 view .LVU23 + 249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 106 .loc 1 249 9 is_stmt 0 view .LVU24 + 107 0052 FFF7FEFF bl HAL_GetTick + 108 .LVL8: + 249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 109 .loc 1 249 23 view .LVU25 + 110 0056 001B subs r0, r0, r4 + 249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 111 .loc 1 249 7 view .LVU26 + 112 0058 41F28833 movw r3, #5000 + 113 005c 9842 cmp r0, r3 + 114 005e F3D9 bls .L5 + 251:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 115 .loc 1 251 14 view .LVU27 + 116 0060 0324 movs r4, #3 + 117 .LVL9: + 251:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 118 .loc 1 251 14 view .LVU28 + 119 0062 E1E7 b .L3 + 120 .LVL10: + 121 .L15: + 256:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 122 .loc 1 256 3 is_stmt 1 view .LVU29 + 256:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 123 .loc 1 256 19 is_stmt 0 view .LVU30 + 124 0064 1F4B ldr r3, .L18+8 + 125 0066 204A ldr r2, .L18+12 + 126 0068 1A60 str r2, [r3] + 259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 127 .loc 1 259 3 is_stmt 1 view .LVU31 + 259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 128 .loc 1 259 6 is_stmt 0 view .LVU32 + 129 006a 204B ldr r3, .L18+16 + 130 006c 1868 ldr r0, [r3] + 131 006e FFF7FEFF bl HAL_InitTick + 132 .LVL11: + 259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 133 .loc 1 259 5 view .LVU33 + 134 0072 0446 mov r4, r0 + 135 .LVL12: + 259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 136 .loc 1 259 5 view .LVU34 + 137 0074 08B1 cbz r0, .L16 + ARM GAS /tmp/cczyIHoC.s page 9 + + + 261:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 138 .loc 1 261 12 view .LVU35 + 139 0076 0124 movs r4, #1 + 140 0078 D6E7 b .L3 + 141 .L16: + 265:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 142 .loc 1 265 3 is_stmt 1 view .LVU36 + 143 007a 184A ldr r2, .L18 + 144 007c 1368 ldr r3, [r2] + 145 007e 23F08473 bic r3, r3, #17301504 + 146 0082 23F48033 bic r3, r3, #65536 + 147 0086 1360 str r3, [r2] + 268:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 148 .loc 1 268 3 view .LVU37 + 149 0088 1368 ldr r3, [r2] + 150 008a 23F48023 bic r3, r3, #262144 + 151 008e 1360 str r3, [r2] + 272:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** while(READ_BIT(RCC->CR, RCC_CR_PLLRDY) != 0U) + 152 .loc 1 272 3 view .LVU38 + 272:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** while(READ_BIT(RCC->CR, RCC_CR_PLLRDY) != 0U) + 153 .loc 1 272 15 is_stmt 0 view .LVU39 + 154 0090 FFF7FEFF bl HAL_GetTick + 155 .LVL13: + 156 0094 0546 mov r5, r0 + 157 .LVL14: + 273:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 158 .loc 1 273 3 is_stmt 1 view .LVU40 + 159 .L7: + 273:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 160 .loc 1 273 42 view .LVU41 + 273:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 161 .loc 1 273 9 is_stmt 0 view .LVU42 + 162 0096 114B ldr r3, .L18 + 163 0098 1B68 ldr r3, [r3] + 273:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 164 .loc 1 273 42 view .LVU43 + 165 009a 13F0007F tst r3, #33554432 + 166 009e 06D0 beq .L17 + 275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 167 .loc 1 275 5 is_stmt 1 view .LVU44 + 275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 168 .loc 1 275 9 is_stmt 0 view .LVU45 + 169 00a0 FFF7FEFF bl HAL_GetTick + 170 .LVL15: + 275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 171 .loc 1 275 23 view .LVU46 + 172 00a4 401B subs r0, r0, r5 + 275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 173 .loc 1 275 7 view .LVU47 + 174 00a6 0228 cmp r0, #2 + 175 00a8 F5D9 bls .L7 + 277:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 176 .loc 1 277 14 view .LVU48 + 177 00aa 0324 movs r4, #3 + 178 00ac BCE7 b .L3 + 179 .L17: + 282:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + ARM GAS /tmp/cczyIHoC.s page 10 + + + 180 .loc 1 282 3 is_stmt 1 view .LVU49 + 181 00ae 0B4B ldr r3, .L18 + 182 00b0 0022 movs r2, #0 + 183 00b2 5A60 str r2, [r3, #4] + 285:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 184 .loc 1 285 3 view .LVU50 + 185 00b4 DA62 str r2, [r3, #44] + 288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 186 .loc 1 288 3 view .LVU51 + 187 00b6 1A63 str r2, [r3, #48] + 291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 188 .loc 1 291 3 view .LVU52 + 189 00b8 9968 ldr r1, [r3, #8] + 190 00ba 41F41F01 orr r1, r1, #10420224 + 191 00be 9960 str r1, [r3, #8] + 294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 192 .loc 1 294 3 view .LVU53 + 193 00c0 9A60 str r2, [r3, #8] + 297:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 194 .loc 1 297 3 view .LVU54 + 195 .LVL16: + 196 .LBB168: + 197 .LBI168: + 198 .file 2 "Drivers/CMSIS/Include/cmsis_gcc.h" + 1:Drivers/CMSIS/Include/cmsis_gcc.h **** /**************************************************************************//** + 2:Drivers/CMSIS/Include/cmsis_gcc.h **** * @file cmsis_gcc.h + 3:Drivers/CMSIS/Include/cmsis_gcc.h **** * @brief CMSIS compiler GCC header file + 4:Drivers/CMSIS/Include/cmsis_gcc.h **** * @version V5.0.4 + 5:Drivers/CMSIS/Include/cmsis_gcc.h **** * @date 09. April 2018 + 6:Drivers/CMSIS/Include/cmsis_gcc.h **** ******************************************************************************/ + 7:Drivers/CMSIS/Include/cmsis_gcc.h **** /* + 8:Drivers/CMSIS/Include/cmsis_gcc.h **** * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + 9:Drivers/CMSIS/Include/cmsis_gcc.h **** * + 10:Drivers/CMSIS/Include/cmsis_gcc.h **** * SPDX-License-Identifier: Apache-2.0 + 11:Drivers/CMSIS/Include/cmsis_gcc.h **** * + 12:Drivers/CMSIS/Include/cmsis_gcc.h **** * Licensed under the Apache License, Version 2.0 (the License); you may + 13:Drivers/CMSIS/Include/cmsis_gcc.h **** * not use this file except in compliance with the License. + 14:Drivers/CMSIS/Include/cmsis_gcc.h **** * You may obtain a copy of the License at + 15:Drivers/CMSIS/Include/cmsis_gcc.h **** * + 16:Drivers/CMSIS/Include/cmsis_gcc.h **** * www.apache.org/licenses/LICENSE-2.0 + 17:Drivers/CMSIS/Include/cmsis_gcc.h **** * + 18:Drivers/CMSIS/Include/cmsis_gcc.h **** * Unless required by applicable law or agreed to in writing, software + 19:Drivers/CMSIS/Include/cmsis_gcc.h **** * distributed under the License is distributed on an AS IS BASIS, WITHOUT + 20:Drivers/CMSIS/Include/cmsis_gcc.h **** * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + 21:Drivers/CMSIS/Include/cmsis_gcc.h **** * See the License for the specific language governing permissions and + 22:Drivers/CMSIS/Include/cmsis_gcc.h **** * limitations under the License. + 23:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 24:Drivers/CMSIS/Include/cmsis_gcc.h **** + 25:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __CMSIS_GCC_H + 26:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __CMSIS_GCC_H + 27:Drivers/CMSIS/Include/cmsis_gcc.h **** + 28:Drivers/CMSIS/Include/cmsis_gcc.h **** /* ignore some GCC warnings */ + 29:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic push + 30:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wsign-conversion" + 31:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wconversion" + 32:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wunused-parameter" + 33:Drivers/CMSIS/Include/cmsis_gcc.h **** + ARM GAS /tmp/cczyIHoC.s page 11 + + + 34:Drivers/CMSIS/Include/cmsis_gcc.h **** /* Fallback for __has_builtin */ + 35:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __has_builtin + 36:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __has_builtin(x) (0) + 37:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 38:Drivers/CMSIS/Include/cmsis_gcc.h **** + 39:Drivers/CMSIS/Include/cmsis_gcc.h **** /* CMSIS compiler specific defines */ + 40:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __ASM + 41:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __ASM __asm + 42:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 43:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __INLINE + 44:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __INLINE inline + 45:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 46:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __STATIC_INLINE + 47:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __STATIC_INLINE static inline + 48:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 49:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __STATIC_FORCEINLINE + 50:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __STATIC_FORCEINLINE __attribute__((always_inline)) static inline + 51:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 52:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __NO_RETURN + 53:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __NO_RETURN __attribute__((__noreturn__)) + 54:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 55:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __USED + 56:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __USED __attribute__((used)) + 57:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 58:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __WEAK + 59:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __WEAK __attribute__((weak)) + 60:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 61:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __PACKED + 62:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __PACKED __attribute__((packed, aligned(1))) + 63:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 64:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __PACKED_STRUCT + 65:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) + 66:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 67:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __PACKED_UNION + 68:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __PACKED_UNION union __attribute__((packed, aligned(1))) + 69:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 70:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __UNALIGNED_UINT32 /* deprecated */ + 71:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic push + 72:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wpacked" + 73:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wattributes" + 74:Drivers/CMSIS/Include/cmsis_gcc.h **** struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + 75:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic pop + 76:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + 77:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 78:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __UNALIGNED_UINT16_WRITE + 79:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic push + 80:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wpacked" + 81:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wattributes" + 82:Drivers/CMSIS/Include/cmsis_gcc.h **** __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + 83:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic pop + 84:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))- + 85:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 86:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __UNALIGNED_UINT16_READ + 87:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic push + 88:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wpacked" + 89:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wattributes" + 90:Drivers/CMSIS/Include/cmsis_gcc.h **** __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + ARM GAS /tmp/cczyIHoC.s page 12 + + + 91:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic pop + 92:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(add + 93:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 94:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __UNALIGNED_UINT32_WRITE + 95:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic push + 96:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wpacked" + 97:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wattributes" + 98:Drivers/CMSIS/Include/cmsis_gcc.h **** __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + 99:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic pop + 100:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))- + 101:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 102:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __UNALIGNED_UINT32_READ + 103:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic push + 104:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wpacked" + 105:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wattributes" + 106:Drivers/CMSIS/Include/cmsis_gcc.h **** __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + 107:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic pop + 108:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(add + 109:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 110:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __ALIGNED + 111:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __ALIGNED(x) __attribute__((aligned(x))) + 112:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 113:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __RESTRICT + 114:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __RESTRICT __restrict + 115:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 116:Drivers/CMSIS/Include/cmsis_gcc.h **** + 117:Drivers/CMSIS/Include/cmsis_gcc.h **** + 118:Drivers/CMSIS/Include/cmsis_gcc.h **** /* ########################### Core Function Access ########################### */ + 119:Drivers/CMSIS/Include/cmsis_gcc.h **** /** \ingroup CMSIS_Core_FunctionInterface + 120:Drivers/CMSIS/Include/cmsis_gcc.h **** \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + 121:Drivers/CMSIS/Include/cmsis_gcc.h **** @{ + 122:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 123:Drivers/CMSIS/Include/cmsis_gcc.h **** + 124:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 125:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Enable IRQ Interrupts + 126:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + 127:Drivers/CMSIS/Include/cmsis_gcc.h **** Can only be executed in Privileged modes. + 128:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 129:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __enable_irq(void) + 130:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 131:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("cpsie i" : : : "memory"); + 132:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 133:Drivers/CMSIS/Include/cmsis_gcc.h **** + 134:Drivers/CMSIS/Include/cmsis_gcc.h **** + 135:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 136:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Disable IRQ Interrupts + 137:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Disables IRQ interrupts by setting the I-bit in the CPSR. + 138:Drivers/CMSIS/Include/cmsis_gcc.h **** Can only be executed in Privileged modes. + 139:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 140:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __disable_irq(void) + 141:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 142:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("cpsid i" : : : "memory"); + 143:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 144:Drivers/CMSIS/Include/cmsis_gcc.h **** + 145:Drivers/CMSIS/Include/cmsis_gcc.h **** + 146:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 147:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Control Register + ARM GAS /tmp/cczyIHoC.s page 13 + + + 148:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the content of the Control Register. + 149:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Control Register value + 150:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 151:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_CONTROL(void) + 152:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 153:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 154:Drivers/CMSIS/Include/cmsis_gcc.h **** + 155:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, control" : "=r" (result) ); + 156:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 157:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 158:Drivers/CMSIS/Include/cmsis_gcc.h **** + 159:Drivers/CMSIS/Include/cmsis_gcc.h **** + 160:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 161:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 162:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Control Register (non-secure) + 163:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the content of the non-secure Control Register when in secure mode. + 164:Drivers/CMSIS/Include/cmsis_gcc.h **** \return non-secure Control Register value + 165:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 166:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) + 167:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 168:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 169:Drivers/CMSIS/Include/cmsis_gcc.h **** + 170:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); + 171:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 172:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 173:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 174:Drivers/CMSIS/Include/cmsis_gcc.h **** + 175:Drivers/CMSIS/Include/cmsis_gcc.h **** + 176:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 177:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Control Register + 178:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Writes the given value to the Control Register. + 179:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] control Control Register value to set + 180:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 181:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) + 182:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 183:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); + 184:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 185:Drivers/CMSIS/Include/cmsis_gcc.h **** + 186:Drivers/CMSIS/Include/cmsis_gcc.h **** + 187:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 188:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 189:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Control Register (non-secure) + 190:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Writes the given value to the non-secure Control Register when in secure state. + 191:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] control Control Register value to set + 192:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 193:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) + 194:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 195:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); + 196:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 197:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 198:Drivers/CMSIS/Include/cmsis_gcc.h **** + 199:Drivers/CMSIS/Include/cmsis_gcc.h **** + 200:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 201:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get IPSR Register + 202:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the content of the IPSR Register. + 203:Drivers/CMSIS/Include/cmsis_gcc.h **** \return IPSR Register value + 204:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + ARM GAS /tmp/cczyIHoC.s page 14 + + + 205:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_IPSR(void) + 206:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 207:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 208:Drivers/CMSIS/Include/cmsis_gcc.h **** + 209:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); + 210:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 211:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 212:Drivers/CMSIS/Include/cmsis_gcc.h **** + 213:Drivers/CMSIS/Include/cmsis_gcc.h **** + 214:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 215:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get APSR Register + 216:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the content of the APSR Register. + 217:Drivers/CMSIS/Include/cmsis_gcc.h **** \return APSR Register value + 218:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 219:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_APSR(void) + 220:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 221:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 222:Drivers/CMSIS/Include/cmsis_gcc.h **** + 223:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, apsr" : "=r" (result) ); + 224:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 225:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 226:Drivers/CMSIS/Include/cmsis_gcc.h **** + 227:Drivers/CMSIS/Include/cmsis_gcc.h **** + 228:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 229:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get xPSR Register + 230:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the content of the xPSR Register. + 231:Drivers/CMSIS/Include/cmsis_gcc.h **** \return xPSR Register value + 232:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 233:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_xPSR(void) + 234:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 235:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 236:Drivers/CMSIS/Include/cmsis_gcc.h **** + 237:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); + 238:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 239:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 240:Drivers/CMSIS/Include/cmsis_gcc.h **** + 241:Drivers/CMSIS/Include/cmsis_gcc.h **** + 242:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 243:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Process Stack Pointer + 244:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the Process Stack Pointer (PSP). + 245:Drivers/CMSIS/Include/cmsis_gcc.h **** \return PSP Register value + 246:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 247:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_PSP(void) + 248:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 249:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 250:Drivers/CMSIS/Include/cmsis_gcc.h **** + 251:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, psp" : "=r" (result) ); + 252:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 253:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 254:Drivers/CMSIS/Include/cmsis_gcc.h **** + 255:Drivers/CMSIS/Include/cmsis_gcc.h **** + 256:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 257:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 258:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Process Stack Pointer (non-secure) + 259:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure s + 260:Drivers/CMSIS/Include/cmsis_gcc.h **** \return PSP Register value + 261:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + ARM GAS /tmp/cczyIHoC.s page 15 + + + 262:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) + 263:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 264:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 265:Drivers/CMSIS/Include/cmsis_gcc.h **** + 266:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); + 267:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 268:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 269:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 270:Drivers/CMSIS/Include/cmsis_gcc.h **** + 271:Drivers/CMSIS/Include/cmsis_gcc.h **** + 272:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 273:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Process Stack Pointer + 274:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Process Stack Pointer (PSP). + 275:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] topOfProcStack Process Stack Pointer value to set + 276:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 277:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) + 278:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 279:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); + 280:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 281:Drivers/CMSIS/Include/cmsis_gcc.h **** + 282:Drivers/CMSIS/Include/cmsis_gcc.h **** + 283:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 284:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 285:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Process Stack Pointer (non-secure) + 286:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure sta + 287:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] topOfProcStack Process Stack Pointer value to set + 288:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 289:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) + 290:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 291:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); + 292:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 293:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 294:Drivers/CMSIS/Include/cmsis_gcc.h **** + 295:Drivers/CMSIS/Include/cmsis_gcc.h **** + 296:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 297:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Main Stack Pointer + 298:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the Main Stack Pointer (MSP). + 299:Drivers/CMSIS/Include/cmsis_gcc.h **** \return MSP Register value + 300:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 301:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_MSP(void) + 302:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 303:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 304:Drivers/CMSIS/Include/cmsis_gcc.h **** + 305:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, msp" : "=r" (result) ); + 306:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 307:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 308:Drivers/CMSIS/Include/cmsis_gcc.h **** + 309:Drivers/CMSIS/Include/cmsis_gcc.h **** + 310:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 311:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 312:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Main Stack Pointer (non-secure) + 313:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure stat + 314:Drivers/CMSIS/Include/cmsis_gcc.h **** \return MSP Register value + 315:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 316:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) + 317:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 318:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + ARM GAS /tmp/cczyIHoC.s page 16 + + + 319:Drivers/CMSIS/Include/cmsis_gcc.h **** + 320:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); + 321:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 322:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 323:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 324:Drivers/CMSIS/Include/cmsis_gcc.h **** + 325:Drivers/CMSIS/Include/cmsis_gcc.h **** + 326:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 327:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Main Stack Pointer + 328:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Main Stack Pointer (MSP). + 329:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] topOfMainStack Main Stack Pointer value to set + 330:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 331:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) + 332:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 333:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); + 334:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 335:Drivers/CMSIS/Include/cmsis_gcc.h **** + 336:Drivers/CMSIS/Include/cmsis_gcc.h **** + 337:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 338:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 339:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Main Stack Pointer (non-secure) + 340:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. + 341:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] topOfMainStack Main Stack Pointer value to set + 342:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 343:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) + 344:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 345:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); + 346:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 347:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 348:Drivers/CMSIS/Include/cmsis_gcc.h **** + 349:Drivers/CMSIS/Include/cmsis_gcc.h **** + 350:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 351:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 352:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Stack Pointer (non-secure) + 353:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. + 354:Drivers/CMSIS/Include/cmsis_gcc.h **** \return SP Register value + 355:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 356:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) + 357:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 358:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 359:Drivers/CMSIS/Include/cmsis_gcc.h **** + 360:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); + 361:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 362:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 363:Drivers/CMSIS/Include/cmsis_gcc.h **** + 364:Drivers/CMSIS/Include/cmsis_gcc.h **** + 365:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 366:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Stack Pointer (non-secure) + 367:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. + 368:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] topOfStack Stack Pointer value to set + 369:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 370:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) + 371:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 372:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); + 373:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 374:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 375:Drivers/CMSIS/Include/cmsis_gcc.h **** + ARM GAS /tmp/cczyIHoC.s page 17 + + + 376:Drivers/CMSIS/Include/cmsis_gcc.h **** + 377:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 378:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Priority Mask + 379:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current state of the priority mask bit from the Priority Mask Register. + 380:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Priority Mask value + 381:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 382:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) + 383:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 384:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 385:Drivers/CMSIS/Include/cmsis_gcc.h **** + 386:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, primask" : "=r" (result) :: "memory"); + 387:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 388:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 389:Drivers/CMSIS/Include/cmsis_gcc.h **** + 390:Drivers/CMSIS/Include/cmsis_gcc.h **** + 391:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 392:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 393:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Priority Mask (non-secure) + 394:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current state of the non-secure priority mask bit from the Priority Mask Reg + 395:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Priority Mask value + 396:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 397:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) + 398:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 399:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 400:Drivers/CMSIS/Include/cmsis_gcc.h **** + 401:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, primask_ns" : "=r" (result) :: "memory"); + 402:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 403:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 404:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 405:Drivers/CMSIS/Include/cmsis_gcc.h **** + 406:Drivers/CMSIS/Include/cmsis_gcc.h **** + 407:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 408:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Priority Mask + 409:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Priority Mask Register. + 410:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] priMask Priority Mask + 411:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 412:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) + 413:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 414:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); + 415:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 416:Drivers/CMSIS/Include/cmsis_gcc.h **** + 417:Drivers/CMSIS/Include/cmsis_gcc.h **** + 418:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 419:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 420:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Priority Mask (non-secure) + 421:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the non-secure Priority Mask Register when in secure state. + 422:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] priMask Priority Mask + 423:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 424:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) + 425:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 426:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); + 427:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 428:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 429:Drivers/CMSIS/Include/cmsis_gcc.h **** + 430:Drivers/CMSIS/Include/cmsis_gcc.h **** + 431:Drivers/CMSIS/Include/cmsis_gcc.h **** #if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + 432:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + ARM GAS /tmp/cczyIHoC.s page 18 + + + 433:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + 434:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 435:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Enable FIQ + 436:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Enables FIQ interrupts by clearing the F-bit in the CPSR. + 437:Drivers/CMSIS/Include/cmsis_gcc.h **** Can only be executed in Privileged modes. + 438:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 439:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __enable_fault_irq(void) + 440:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 441:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("cpsie f" : : : "memory"); + 442:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 443:Drivers/CMSIS/Include/cmsis_gcc.h **** + 444:Drivers/CMSIS/Include/cmsis_gcc.h **** + 445:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 446:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Disable FIQ + 447:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Disables FIQ interrupts by setting the F-bit in the CPSR. + 448:Drivers/CMSIS/Include/cmsis_gcc.h **** Can only be executed in Privileged modes. + 449:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 450:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __disable_fault_irq(void) + 451:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 452:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("cpsid f" : : : "memory"); + 453:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 454:Drivers/CMSIS/Include/cmsis_gcc.h **** + 455:Drivers/CMSIS/Include/cmsis_gcc.h **** + 456:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 457:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Base Priority + 458:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the Base Priority register. + 459:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Base Priority register value + 460:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 461:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) + 462:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 463:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 464:Drivers/CMSIS/Include/cmsis_gcc.h **** + 465:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, basepri" : "=r" (result) ); + 466:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 467:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 468:Drivers/CMSIS/Include/cmsis_gcc.h **** + 469:Drivers/CMSIS/Include/cmsis_gcc.h **** + 470:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 471:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 472:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Base Priority (non-secure) + 473:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the non-secure Base Priority register when in secure state. + 474:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Base Priority register value + 475:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 476:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) + 477:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 478:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 479:Drivers/CMSIS/Include/cmsis_gcc.h **** + 480:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); + 481:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 482:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 483:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 484:Drivers/CMSIS/Include/cmsis_gcc.h **** + 485:Drivers/CMSIS/Include/cmsis_gcc.h **** + 486:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 487:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Base Priority + 488:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Base Priority register. + 489:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] basePri Base Priority value to set + ARM GAS /tmp/cczyIHoC.s page 19 + + + 490:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 491:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) + 492:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 493:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); + 494:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 495:Drivers/CMSIS/Include/cmsis_gcc.h **** + 496:Drivers/CMSIS/Include/cmsis_gcc.h **** + 497:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 498:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 499:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Base Priority (non-secure) + 500:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the non-secure Base Priority register when in secure state. + 501:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] basePri Base Priority value to set + 502:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 503:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) + 504:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 505:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); + 506:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 507:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 508:Drivers/CMSIS/Include/cmsis_gcc.h **** + 509:Drivers/CMSIS/Include/cmsis_gcc.h **** + 510:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 511:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Base Priority with condition + 512:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Base Priority register only if BASEPRI masking is disable + 513:Drivers/CMSIS/Include/cmsis_gcc.h **** or the new value increases the BASEPRI priority level. + 514:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] basePri Base Priority value to set + 515:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 516:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) + 517:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 518:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); + 519:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 520:Drivers/CMSIS/Include/cmsis_gcc.h **** + 521:Drivers/CMSIS/Include/cmsis_gcc.h **** + 522:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 523:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Fault Mask + 524:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the Fault Mask register. + 525:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Fault Mask register value + 526:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 527:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) + 528:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 529:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 530:Drivers/CMSIS/Include/cmsis_gcc.h **** + 531:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + 532:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 533:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 534:Drivers/CMSIS/Include/cmsis_gcc.h **** + 535:Drivers/CMSIS/Include/cmsis_gcc.h **** + 536:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 537:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 538:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Fault Mask (non-secure) + 539:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the non-secure Fault Mask register when in secure state. + 540:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Fault Mask register value + 541:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 542:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) + 543:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 544:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 545:Drivers/CMSIS/Include/cmsis_gcc.h **** + 546:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); + ARM GAS /tmp/cczyIHoC.s page 20 + + + 547:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 548:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 549:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 550:Drivers/CMSIS/Include/cmsis_gcc.h **** + 551:Drivers/CMSIS/Include/cmsis_gcc.h **** + 552:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 553:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Fault Mask + 554:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Fault Mask register. + 555:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] faultMask Fault Mask value to set + 556:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 557:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) + 558:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 559:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); + 560:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 561:Drivers/CMSIS/Include/cmsis_gcc.h **** + 562:Drivers/CMSIS/Include/cmsis_gcc.h **** + 563:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 564:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 565:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Fault Mask (non-secure) + 566:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the non-secure Fault Mask register when in secure state. + 567:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] faultMask Fault Mask value to set + 568:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 569:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) + 570:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 571:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); + 572:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 573:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 574:Drivers/CMSIS/Include/cmsis_gcc.h **** + 575:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + 576:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + 577:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + 578:Drivers/CMSIS/Include/cmsis_gcc.h **** + 579:Drivers/CMSIS/Include/cmsis_gcc.h **** + 580:Drivers/CMSIS/Include/cmsis_gcc.h **** #if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + 581:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + 582:Drivers/CMSIS/Include/cmsis_gcc.h **** + 583:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 584:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Process Stack Pointer Limit + 585:Drivers/CMSIS/Include/cmsis_gcc.h **** Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + 586:Drivers/CMSIS/Include/cmsis_gcc.h **** Stack Pointer Limit register hence zero is returned always in non-secure + 587:Drivers/CMSIS/Include/cmsis_gcc.h **** mode. + 588:Drivers/CMSIS/Include/cmsis_gcc.h **** + 589:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). + 590:Drivers/CMSIS/Include/cmsis_gcc.h **** \return PSPLIM Register value + 591:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 592:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) + 593:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 594:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + 595:Drivers/CMSIS/Include/cmsis_gcc.h **** (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + 596:Drivers/CMSIS/Include/cmsis_gcc.h **** // without main extensions, the non-secure PSPLIM is RAZ/WI + 597:Drivers/CMSIS/Include/cmsis_gcc.h **** return 0U; + 598:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 599:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 600:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, psplim" : "=r" (result) ); + 601:Drivers/CMSIS/Include/cmsis_gcc.h **** return result; + 602:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 603:Drivers/CMSIS/Include/cmsis_gcc.h **** } + ARM GAS /tmp/cczyIHoC.s page 21 + + + 604:Drivers/CMSIS/Include/cmsis_gcc.h **** + 605:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)) + 606:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 607:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Process Stack Pointer Limit (non-secure) + 608:Drivers/CMSIS/Include/cmsis_gcc.h **** Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + 609:Drivers/CMSIS/Include/cmsis_gcc.h **** Stack Pointer Limit register hence zero is returned always. + 610:Drivers/CMSIS/Include/cmsis_gcc.h **** + 611:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in + 612:Drivers/CMSIS/Include/cmsis_gcc.h **** \return PSPLIM Register value + 613:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 614:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) + 615:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 616:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + 617:Drivers/CMSIS/Include/cmsis_gcc.h **** // without main extensions, the non-secure PSPLIM is RAZ/WI + 618:Drivers/CMSIS/Include/cmsis_gcc.h **** return 0U; + 619:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 620:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 621:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); + 622:Drivers/CMSIS/Include/cmsis_gcc.h **** return result; + 623:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 624:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 625:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 626:Drivers/CMSIS/Include/cmsis_gcc.h **** + 627:Drivers/CMSIS/Include/cmsis_gcc.h **** + 628:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 629:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Process Stack Pointer Limit + 630:Drivers/CMSIS/Include/cmsis_gcc.h **** Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + 631:Drivers/CMSIS/Include/cmsis_gcc.h **** Stack Pointer Limit register hence the write is silently ignored in non-secure + 632:Drivers/CMSIS/Include/cmsis_gcc.h **** mode. + 633:Drivers/CMSIS/Include/cmsis_gcc.h **** + 634:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). + 635:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + 636:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 637:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) + 638:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 639:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + 640:Drivers/CMSIS/Include/cmsis_gcc.h **** (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + 641:Drivers/CMSIS/Include/cmsis_gcc.h **** // without main extensions, the non-secure PSPLIM is RAZ/WI + 642:Drivers/CMSIS/Include/cmsis_gcc.h **** (void)ProcStackPtrLimit; + 643:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 644:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); + 645:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 646:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 647:Drivers/CMSIS/Include/cmsis_gcc.h **** + 648:Drivers/CMSIS/Include/cmsis_gcc.h **** + 649:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 650:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 651:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Process Stack Pointer (non-secure) + 652:Drivers/CMSIS/Include/cmsis_gcc.h **** Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + 653:Drivers/CMSIS/Include/cmsis_gcc.h **** Stack Pointer Limit register hence the write is silently ignored. + 654:Drivers/CMSIS/Include/cmsis_gcc.h **** + 655:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in s + 656:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + 657:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 658:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) + 659:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 660:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + ARM GAS /tmp/cczyIHoC.s page 22 + + + 661:Drivers/CMSIS/Include/cmsis_gcc.h **** // without main extensions, the non-secure PSPLIM is RAZ/WI + 662:Drivers/CMSIS/Include/cmsis_gcc.h **** (void)ProcStackPtrLimit; + 663:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 664:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); + 665:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 666:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 667:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 668:Drivers/CMSIS/Include/cmsis_gcc.h **** + 669:Drivers/CMSIS/Include/cmsis_gcc.h **** + 670:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 671:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Main Stack Pointer Limit + 672:Drivers/CMSIS/Include/cmsis_gcc.h **** Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + 673:Drivers/CMSIS/Include/cmsis_gcc.h **** Stack Pointer Limit register hence zero is returned always in non-secure + 674:Drivers/CMSIS/Include/cmsis_gcc.h **** mode. + 675:Drivers/CMSIS/Include/cmsis_gcc.h **** + 676:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). + 677:Drivers/CMSIS/Include/cmsis_gcc.h **** \return MSPLIM Register value + 678:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 679:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) + 680:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 681:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + 682:Drivers/CMSIS/Include/cmsis_gcc.h **** (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + 683:Drivers/CMSIS/Include/cmsis_gcc.h **** // without main extensions, the non-secure MSPLIM is RAZ/WI + 684:Drivers/CMSIS/Include/cmsis_gcc.h **** return 0U; + 685:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 686:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 687:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, msplim" : "=r" (result) ); + 688:Drivers/CMSIS/Include/cmsis_gcc.h **** return result; + 689:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 690:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 691:Drivers/CMSIS/Include/cmsis_gcc.h **** + 692:Drivers/CMSIS/Include/cmsis_gcc.h **** + 693:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 694:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 695:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Main Stack Pointer Limit (non-secure) + 696:Drivers/CMSIS/Include/cmsis_gcc.h **** Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + 697:Drivers/CMSIS/Include/cmsis_gcc.h **** Stack Pointer Limit register hence zero is returned always. + 698:Drivers/CMSIS/Include/cmsis_gcc.h **** + 699:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in sec + 700:Drivers/CMSIS/Include/cmsis_gcc.h **** \return MSPLIM Register value + 701:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 702:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) + 703:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 704:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + 705:Drivers/CMSIS/Include/cmsis_gcc.h **** // without main extensions, the non-secure MSPLIM is RAZ/WI + 706:Drivers/CMSIS/Include/cmsis_gcc.h **** return 0U; + 707:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 708:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 709:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); + 710:Drivers/CMSIS/Include/cmsis_gcc.h **** return result; + 711:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 712:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 713:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 714:Drivers/CMSIS/Include/cmsis_gcc.h **** + 715:Drivers/CMSIS/Include/cmsis_gcc.h **** + 716:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 717:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Main Stack Pointer Limit + ARM GAS /tmp/cczyIHoC.s page 23 + + + 718:Drivers/CMSIS/Include/cmsis_gcc.h **** Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + 719:Drivers/CMSIS/Include/cmsis_gcc.h **** Stack Pointer Limit register hence the write is silently ignored in non-secure + 720:Drivers/CMSIS/Include/cmsis_gcc.h **** mode. + 721:Drivers/CMSIS/Include/cmsis_gcc.h **** + 722:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). + 723:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set + 724:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 725:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) + 726:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 727:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + 728:Drivers/CMSIS/Include/cmsis_gcc.h **** (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + 729:Drivers/CMSIS/Include/cmsis_gcc.h **** // without main extensions, the non-secure MSPLIM is RAZ/WI + 730:Drivers/CMSIS/Include/cmsis_gcc.h **** (void)MainStackPtrLimit; + 731:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 732:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); + 733:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 734:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 735:Drivers/CMSIS/Include/cmsis_gcc.h **** + 736:Drivers/CMSIS/Include/cmsis_gcc.h **** + 737:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 738:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 739:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Main Stack Pointer Limit (non-secure) + 740:Drivers/CMSIS/Include/cmsis_gcc.h **** Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + 741:Drivers/CMSIS/Include/cmsis_gcc.h **** Stack Pointer Limit register hence the write is silently ignored. + 742:Drivers/CMSIS/Include/cmsis_gcc.h **** + 743:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secu + 744:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] MainStackPtrLimit Main Stack Pointer value to set + 745:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 746:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) + 747:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 748:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + 749:Drivers/CMSIS/Include/cmsis_gcc.h **** // without main extensions, the non-secure MSPLIM is RAZ/WI + 750:Drivers/CMSIS/Include/cmsis_gcc.h **** (void)MainStackPtrLimit; + 751:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 752:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); + 753:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 754:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 755:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 756:Drivers/CMSIS/Include/cmsis_gcc.h **** + 757:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + 758:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + 759:Drivers/CMSIS/Include/cmsis_gcc.h **** + 760:Drivers/CMSIS/Include/cmsis_gcc.h **** + 761:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 762:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get FPSCR + 763:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the Floating Point Status/Control register. + 764:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Floating Point Status/Control register value + 765:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 766:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_FPSCR(void) + 767:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 768:Drivers/CMSIS/Include/cmsis_gcc.h **** #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + 769:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + 770:Drivers/CMSIS/Include/cmsis_gcc.h **** #if __has_builtin(__builtin_arm_get_fpscr) + 771:Drivers/CMSIS/Include/cmsis_gcc.h **** // Re-enable using built-in when GCC has been fixed + 772:Drivers/CMSIS/Include/cmsis_gcc.h **** // || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) + 773:Drivers/CMSIS/Include/cmsis_gcc.h **** /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ + 774:Drivers/CMSIS/Include/cmsis_gcc.h **** return __builtin_arm_get_fpscr(); + ARM GAS /tmp/cczyIHoC.s page 24 + + + 775:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 776:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 777:Drivers/CMSIS/Include/cmsis_gcc.h **** + 778:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); + 779:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 780:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 781:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 782:Drivers/CMSIS/Include/cmsis_gcc.h **** return(0U); + 783:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 784:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 785:Drivers/CMSIS/Include/cmsis_gcc.h **** + 786:Drivers/CMSIS/Include/cmsis_gcc.h **** + 787:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 788:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set FPSCR + 789:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Floating Point Status/Control register. + 790:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] fpscr Floating Point Status/Control value to set + 791:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 792:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_FPSCR(uint32_t fpscr) + 793:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 794:Drivers/CMSIS/Include/cmsis_gcc.h **** #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + 795:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + 796:Drivers/CMSIS/Include/cmsis_gcc.h **** #if __has_builtin(__builtin_arm_set_fpscr) + 797:Drivers/CMSIS/Include/cmsis_gcc.h **** // Re-enable using built-in when GCC has been fixed + 798:Drivers/CMSIS/Include/cmsis_gcc.h **** // || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) + 799:Drivers/CMSIS/Include/cmsis_gcc.h **** /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ + 800:Drivers/CMSIS/Include/cmsis_gcc.h **** __builtin_arm_set_fpscr(fpscr); + 801:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 802:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc", "memory"); + 803:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 804:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 805:Drivers/CMSIS/Include/cmsis_gcc.h **** (void)fpscr; + 806:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 807:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 808:Drivers/CMSIS/Include/cmsis_gcc.h **** + 809:Drivers/CMSIS/Include/cmsis_gcc.h **** + 810:Drivers/CMSIS/Include/cmsis_gcc.h **** /*@} end of CMSIS_Core_RegAccFunctions */ + 811:Drivers/CMSIS/Include/cmsis_gcc.h **** + 812:Drivers/CMSIS/Include/cmsis_gcc.h **** + 813:Drivers/CMSIS/Include/cmsis_gcc.h **** /* ########################## Core Instruction Access ######################### */ + 814:Drivers/CMSIS/Include/cmsis_gcc.h **** /** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + 815:Drivers/CMSIS/Include/cmsis_gcc.h **** Access to dedicated instructions + 816:Drivers/CMSIS/Include/cmsis_gcc.h **** @{ + 817:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 818:Drivers/CMSIS/Include/cmsis_gcc.h **** + 819:Drivers/CMSIS/Include/cmsis_gcc.h **** /* Define macros for porting to both thumb1 and thumb2. + 820:Drivers/CMSIS/Include/cmsis_gcc.h **** * For thumb1, use low register (r0-r7), specified by constraint "l" + 821:Drivers/CMSIS/Include/cmsis_gcc.h **** * Otherwise, use general registers, specified by constraint "r" */ + 822:Drivers/CMSIS/Include/cmsis_gcc.h **** #if defined (__thumb__) && !defined (__thumb2__) + 823:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __CMSIS_GCC_OUT_REG(r) "=l" (r) + 824:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __CMSIS_GCC_RW_REG(r) "+l" (r) + 825:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __CMSIS_GCC_USE_REG(r) "l" (r) + 826:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 827:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __CMSIS_GCC_OUT_REG(r) "=r" (r) + 828:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __CMSIS_GCC_RW_REG(r) "+r" (r) + 829:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __CMSIS_GCC_USE_REG(r) "r" (r) + 830:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 831:Drivers/CMSIS/Include/cmsis_gcc.h **** + ARM GAS /tmp/cczyIHoC.s page 25 + + + 832:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 833:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief No Operation + 834:Drivers/CMSIS/Include/cmsis_gcc.h **** \details No Operation does nothing. This instruction can be used for code alignment purposes. + 835:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 836:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __NOP() __ASM volatile ("nop") + 837:Drivers/CMSIS/Include/cmsis_gcc.h **** + 838:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 839:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Wait For Interrupt + 840:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Wait For Interrupt is a hint instruction that suspends execution until one of a number o + 841:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 842:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __WFI() __ASM volatile ("wfi") + 843:Drivers/CMSIS/Include/cmsis_gcc.h **** + 844:Drivers/CMSIS/Include/cmsis_gcc.h **** + 845:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 846:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Wait For Event + 847:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Wait For Event is a hint instruction that permits the processor to enter + 848:Drivers/CMSIS/Include/cmsis_gcc.h **** a low-power state until one of a number of events occurs. + 849:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 850:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __WFE() __ASM volatile ("wfe") + 851:Drivers/CMSIS/Include/cmsis_gcc.h **** + 852:Drivers/CMSIS/Include/cmsis_gcc.h **** + 853:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 854:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Send Event + 855:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + 856:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 857:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __SEV() __ASM volatile ("sev") + 858:Drivers/CMSIS/Include/cmsis_gcc.h **** + 859:Drivers/CMSIS/Include/cmsis_gcc.h **** + 860:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 861:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Instruction Synchronization Barrier + 862:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Instruction Synchronization Barrier flushes the pipeline in the processor, + 863:Drivers/CMSIS/Include/cmsis_gcc.h **** so that all instructions following the ISB are fetched from cache or memory, + 864:Drivers/CMSIS/Include/cmsis_gcc.h **** after the instruction has been completed. + 865:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 866:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __ISB(void) + 867:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 868:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("isb 0xF":::"memory"); + 869:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 870:Drivers/CMSIS/Include/cmsis_gcc.h **** + 871:Drivers/CMSIS/Include/cmsis_gcc.h **** + 872:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 873:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Data Synchronization Barrier + 874:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Acts as a special kind of Data Memory Barrier. + 875:Drivers/CMSIS/Include/cmsis_gcc.h **** It completes when all explicit memory accesses before this instruction complete. + 876:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 877:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __DSB(void) + 878:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 879:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("dsb 0xF":::"memory"); + 880:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 881:Drivers/CMSIS/Include/cmsis_gcc.h **** + 882:Drivers/CMSIS/Include/cmsis_gcc.h **** + 883:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 884:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Data Memory Barrier + 885:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Ensures the apparent order of the explicit memory operations before + 886:Drivers/CMSIS/Include/cmsis_gcc.h **** and after the instruction, without ensuring their completion. + 887:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 888:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __DMB(void) + ARM GAS /tmp/cczyIHoC.s page 26 + + + 889:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 890:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("dmb 0xF":::"memory"); + 891:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 892:Drivers/CMSIS/Include/cmsis_gcc.h **** + 893:Drivers/CMSIS/Include/cmsis_gcc.h **** + 894:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 895:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Reverse byte order (32 bit) + 896:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x785 + 897:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] value Value to reverse + 898:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Reversed value + 899:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 900:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __REV(uint32_t value) + 901:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 902:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) + 903:Drivers/CMSIS/Include/cmsis_gcc.h **** return __builtin_bswap32(value); + 904:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 905:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 906:Drivers/CMSIS/Include/cmsis_gcc.h **** + 907:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + 908:Drivers/CMSIS/Include/cmsis_gcc.h **** return result; + 909:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 910:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 911:Drivers/CMSIS/Include/cmsis_gcc.h **** + 912:Drivers/CMSIS/Include/cmsis_gcc.h **** + 913:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 914:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Reverse byte order (16 bit) + 915:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes + 916:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] value Value to reverse + 917:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Reversed value + 918:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 919:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __REV16(uint32_t value) + 920:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 921:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 922:Drivers/CMSIS/Include/cmsis_gcc.h **** + 923:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + 924:Drivers/CMSIS/Include/cmsis_gcc.h **** return result; + 925:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 926:Drivers/CMSIS/Include/cmsis_gcc.h **** + 927:Drivers/CMSIS/Include/cmsis_gcc.h **** + 928:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 929:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Reverse byte order (16 bit) + 930:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For exam + 931:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] value Value to reverse + 932:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Reversed value + 933:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 934:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE int16_t __REVSH(int16_t value) + 935:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 936:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + 937:Drivers/CMSIS/Include/cmsis_gcc.h **** return (int16_t)__builtin_bswap16(value); + 938:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 939:Drivers/CMSIS/Include/cmsis_gcc.h **** int16_t result; + 940:Drivers/CMSIS/Include/cmsis_gcc.h **** + 941:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + 942:Drivers/CMSIS/Include/cmsis_gcc.h **** return result; + 943:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 944:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 945:Drivers/CMSIS/Include/cmsis_gcc.h **** + ARM GAS /tmp/cczyIHoC.s page 27 + + + 946:Drivers/CMSIS/Include/cmsis_gcc.h **** + 947:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 948:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Rotate Right in unsigned value (32 bit) + 949:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Rotate Right (immediate) provides the value of the contents of a register rotated by a v + 950:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] op1 Value to rotate + 951:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] op2 Number of Bits to rotate + 952:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Rotated value + 953:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 954:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) + 955:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 956:Drivers/CMSIS/Include/cmsis_gcc.h **** op2 %= 32U; + 957:Drivers/CMSIS/Include/cmsis_gcc.h **** if (op2 == 0U) + 958:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 959:Drivers/CMSIS/Include/cmsis_gcc.h **** return op1; + 960:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 961:Drivers/CMSIS/Include/cmsis_gcc.h **** return (op1 >> op2) | (op1 << (32U - op2)); + 962:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 963:Drivers/CMSIS/Include/cmsis_gcc.h **** + 964:Drivers/CMSIS/Include/cmsis_gcc.h **** + 965:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 966:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Breakpoint + 967:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Causes the processor to enter Debug state. + 968:Drivers/CMSIS/Include/cmsis_gcc.h **** Debug tools can use this to investigate system state when the instruction at a particula + 969:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] value is ignored by the processor. + 970:Drivers/CMSIS/Include/cmsis_gcc.h **** If required, a debugger can use it to store additional information about the break + 971:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 972:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __BKPT(value) __ASM volatile ("bkpt "#value) + 973:Drivers/CMSIS/Include/cmsis_gcc.h **** + 974:Drivers/CMSIS/Include/cmsis_gcc.h **** + 975:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 976:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Reverse bit order of value + 977:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Reverses the bit order of the given value. + 978:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] value Value to reverse + 979:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Reversed value + 980:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __RBIT(uint32_t value) + 199 .loc 2 981 31 view .LVU55 + 200 .LBB169: + 982:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 201 .loc 2 983 3 view .LVU56 + 984:Drivers/CMSIS/Include/cmsis_gcc.h **** + 985:Drivers/CMSIS/Include/cmsis_gcc.h **** #if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + 986:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + 987:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 202 .loc 2 988 4 view .LVU57 + 203 00c2 4FF08072 mov r2, #16777216 + 204 .syntax unified + 205 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 206 00c6 92FAA2F2 rbit r2, r2 + 207 @ 0 "" 2 + 208 .LVL17: + 989:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 990:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */ + 991:Drivers/CMSIS/Include/cmsis_gcc.h **** + 992:Drivers/CMSIS/Include/cmsis_gcc.h **** result = value; /* r will be reversed bits of v; first get LSB of v */ + ARM GAS /tmp/cczyIHoC.s page 28 + + + 993:Drivers/CMSIS/Include/cmsis_gcc.h **** for (value >>= 1U; value != 0U; value >>= 1U) + 994:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 995:Drivers/CMSIS/Include/cmsis_gcc.h **** result <<= 1U; + 996:Drivers/CMSIS/Include/cmsis_gcc.h **** result |= value & 1U; + 997:Drivers/CMSIS/Include/cmsis_gcc.h **** s--; + 998:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 999:Drivers/CMSIS/Include/cmsis_gcc.h **** result <<= s; /* shift when v's highest bits are zero */ +1000:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif +1001:Drivers/CMSIS/Include/cmsis_gcc.h **** return result; + 209 .loc 2 1001 3 view .LVU58 + 210 .loc 2 1001 3 is_stmt 0 view .LVU59 + 211 .thumb + 212 .syntax unified + 213 .LBE169: + 214 .LBE168: + 297:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 215 .loc 1 297 3 view .LVU60 + 216 00ca B2FA82F2 clz r2, r2 + 217 00ce 084B ldr r3, .L18+20 + 218 00d0 1344 add r3, r3, r2 + 219 00d2 9B00 lsls r3, r3, #2 + 220 00d4 0122 movs r2, #1 + 221 00d6 1A60 str r2, [r3] + 299:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 222 .loc 1 299 3 is_stmt 1 view .LVU61 + 299:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 223 .loc 1 299 10 is_stmt 0 view .LVU62 + 224 00d8 A6E7 b .L3 + 225 .L19: + 226 00da 00BF .align 2 + 227 .L18: + 228 00dc 00100240 .word 1073876992 + 229 00e0 0CC0FFF8 .word -117456884 + 230 00e4 00000000 .word SystemCoreClock + 231 00e8 00127A00 .word 8000000 + 232 00ec 00000000 .word uwTickPrio + 233 00f0 20819010 .word 277905696 + 234 .cfi_endproc + 235 .LFE130: + 237 .section .text.HAL_RCC_OscConfig,"ax",%progbits + 238 .align 1 + 239 .global HAL_RCC_OscConfig + 240 .syntax unified + 241 .thumb + 242 .thumb_func + 244 HAL_RCC_OscConfig: + 245 .LVL18: + 246 .LFB131: + 301:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 302:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /** + 303:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @brief Initializes the RCC Oscillators according to the specified parameters in the + 304:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * RCC_OscInitTypeDef. + 305:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @param RCC_OscInitStruct pointer to an RCC_OscInitTypeDef structure that + 306:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * contains the configuration information for the RCC Oscillators. + 307:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @note The PLL is not disabled when used as system clock. + 308:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @note Transitions LSE Bypass to LSE On and LSE On to LSE Bypass are not + 309:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * supported by this macro. User should request a transition to LSE Off + ARM GAS /tmp/cczyIHoC.s page 29 + + + 310:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * first and then LSE On or LSE Bypass. + 311:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @note Transition HSE Bypass to HSE On and HSE On to HSE Bypass are not + 312:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * supported by this macro. User should request a transition to HSE Off + 313:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * first and then HSE On or HSE Bypass. + 314:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @retval HAL status + 315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** */ + 316:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) + 317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 247 .loc 1 317 1 is_stmt 1 view -0 + 248 .cfi_startproc + 249 @ args = 0, pretend = 0, frame = 8 + 250 @ frame_needed = 0, uses_anonymous_args = 0 + 318:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** uint32_t tickstart; + 251 .loc 1 318 3 view .LVU64 + 319:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** uint32_t pll_config; + 252 .loc 1 319 3 view .LVU65 + 320:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** #if defined(RCC_CFGR_PLLSRC_HSI_PREDIV) + 321:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** uint32_t pll_config2; + 322:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** #endif /* RCC_CFGR_PLLSRC_HSI_PREDIV */ + 323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 324:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Check Null pointer */ + 325:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if(RCC_OscInitStruct == NULL) + 253 .loc 1 325 3 view .LVU66 + 254 .loc 1 325 5 is_stmt 0 view .LVU67 + 255 0000 0028 cmp r0, #0 + 256 0002 00F0FF82 beq .L94 + 317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** uint32_t tickstart; + 257 .loc 1 317 1 view .LVU68 + 258 0006 70B5 push {r4, r5, r6, lr} + 259 .cfi_def_cfa_offset 16 + 260 .cfi_offset 4, -16 + 261 .cfi_offset 5, -12 + 262 .cfi_offset 6, -8 + 263 .cfi_offset 14, -4 + 264 0008 82B0 sub sp, sp, #8 + 265 .cfi_def_cfa_offset 24 + 266 000a 0446 mov r4, r0 + 326:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 327:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** return HAL_ERROR; + 328:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 329:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 330:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Check the parameters */ + 331:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** assert_param(IS_RCC_OSCILLATORTYPE(RCC_OscInitStruct->OscillatorType)); + 267 .loc 1 331 3 is_stmt 1 view .LVU69 + 332:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 333:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /*------------------------------- HSE Configuration ------------------------*/ + 334:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE) + 268 .loc 1 334 3 view .LVU70 + 269 .loc 1 334 25 is_stmt 0 view .LVU71 + 270 000c 0368 ldr r3, [r0] + 271 .loc 1 334 5 view .LVU72 + 272 000e 13F0010F tst r3, #1 + 273 0012 3BD0 beq .L22 + 335:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Check the parameters */ + 337:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** assert_param(IS_RCC_HSE(RCC_OscInitStruct->HSEState)); + 274 .loc 1 337 5 is_stmt 1 view .LVU73 + ARM GAS /tmp/cczyIHoC.s page 30 + + + 338:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 339:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* When the HSE is used as system clock or clock source for PLL in these cases it is not allowe + 340:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSE) + 275 .loc 1 340 5 view .LVU74 + 276 .loc 1 340 9 is_stmt 0 view .LVU75 + 277 0014 B44B ldr r3, .L132 + 278 0016 5B68 ldr r3, [r3, #4] + 279 0018 03F00C03 and r3, r3, #12 + 280 .loc 1 340 7 view .LVU76 + 281 001c 042B cmp r3, #4 + 282 001e 1ED0 beq .L23 + 341:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && (__HAL_RCC_GET_PLL_ + 283 .loc 1 341 13 view .LVU77 + 284 0020 B14B ldr r3, .L132 + 285 0022 5B68 ldr r3, [r3, #4] + 286 0024 03F00C03 and r3, r3, #12 + 287 .loc 1 341 8 view .LVU78 + 288 0028 082B cmp r3, #8 + 289 002a 13D0 beq .L118 + 290 .L24: + 342:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) && (RCC_OscInitStruct->HSEState == RCC_HSE_ + 344:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 345:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** return HAL_ERROR; + 346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 347:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 348:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** else + 349:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 350:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Set the new HSE configuration ---------------------------------------*/ + 351:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** __HAL_RCC_HSE_CONFIG(RCC_OscInitStruct->HSEState); + 291 .loc 1 351 7 is_stmt 1 view .LVU79 + 292 .loc 1 351 7 view .LVU80 + 293 002c 6368 ldr r3, [r4, #4] + 294 002e B3F5803F cmp r3, #65536 + 295 0032 68D0 beq .L119 + 296 .loc 1 351 7 discriminator 2 view .LVU81 + 297 0034 002B cmp r3, #0 + 298 0036 40F09280 bne .L29 + 299 .loc 1 351 7 discriminator 4 view .LVU82 + 300 003a 03F18043 add r3, r3, #1073741824 + 301 003e 03F50433 add r3, r3, #135168 + 302 0042 1A68 ldr r2, [r3] + 303 0044 22F48032 bic r2, r2, #65536 + 304 0048 1A60 str r2, [r3] + 305 .loc 1 351 7 discriminator 4 view .LVU83 + 306 004a 1A68 ldr r2, [r3] + 307 004c 22F48022 bic r2, r2, #262144 + 308 0050 1A60 str r2, [r3] + 309 0052 5DE0 b .L28 + 310 .L118: + 341:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && (__HAL_RCC_GET_PLL_ + 311 .loc 1 341 82 is_stmt 0 discriminator 1 view .LVU84 + 312 0054 A44B ldr r3, .L132 + 313 0056 5B68 ldr r3, [r3, #4] + 341:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && (__HAL_RCC_GET_PLL_ + 314 .loc 1 341 78 discriminator 1 view .LVU85 + 315 0058 13F4803F tst r3, #65536 + ARM GAS /tmp/cczyIHoC.s page 31 + + + 316 005c E6D0 beq .L24 + 317 .L23: + 343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 318 .loc 1 343 7 is_stmt 1 view .LVU86 + 319 .LVL19: + 320 .LBB170: + 321 .LBI170: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 322 .loc 2 981 31 view .LVU87 + 323 .LBB171: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 324 .loc 2 983 3 view .LVU88 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 325 .loc 2 988 4 view .LVU89 + 326 005e 4FF40033 mov r3, #131072 + 327 .syntax unified + 328 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 329 0062 93FAA3F3 rbit r3, r3 + 330 @ 0 "" 2 + 331 .loc 2 1001 3 view .LVU90 + 332 .LVL20: + 333 .loc 2 1001 3 is_stmt 0 view .LVU91 + 334 .thumb + 335 .syntax unified + 336 .LBE171: + 337 .LBE170: + 343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 338 .loc 1 343 11 view .LVU92 + 339 0066 A04B ldr r3, .L132 + 340 0068 1968 ldr r1, [r3] + 341 .LVL21: + 342 .LBB172: + 343 .LBI172: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 344 .loc 2 981 31 is_stmt 1 view .LVU93 + 345 .LBB173: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 346 .loc 2 983 3 view .LVU94 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 347 .loc 2 988 4 view .LVU95 + 348 006a 4FF40033 mov r3, #131072 + 349 .syntax unified + 350 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 351 006e 93FAA3F3 rbit r3, r3 + 352 @ 0 "" 2 + 353 .LVL22: + 354 .loc 2 1001 3 view .LVU96 + 355 .loc 2 1001 3 is_stmt 0 view .LVU97 + 356 .thumb + 357 .syntax unified + 358 .LBE173: + 359 .LBE172: + 343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 360 .loc 1 343 11 view .LVU98 + 361 0072 B3FA83F3 clz r3, r3 + 362 0076 03F01F03 and r3, r3, #31 + 363 007a 0122 movs r2, #1 + ARM GAS /tmp/cczyIHoC.s page 32 + + + 364 007c 02FA03F3 lsl r3, r2, r3 + 343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 365 .loc 1 343 9 view .LVU99 + 366 0080 0B42 tst r3, r1 + 367 0082 03D0 beq .L22 + 343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 368 .loc 1 343 78 discriminator 13 view .LVU100 + 369 0084 6368 ldr r3, [r4, #4] + 343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 370 .loc 1 343 57 discriminator 13 view .LVU101 + 371 0086 002B cmp r3, #0 + 372 0088 00F0BE82 beq .L120 + 373 .LVL23: + 374 .L22: + 352:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 353:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** #if defined(RCC_CFGR_PLLSRC_HSI_DIV2) + 354:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Configure the HSE predivision factor --------------------------------*/ + 355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** __HAL_RCC_HSE_PREDIV_CONFIG(RCC_OscInitStruct->HSEPredivValue); + 356:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** #endif /* RCC_CFGR_PLLSRC_HSI_DIV2 */ + 357:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 358:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Check the HSE State */ + 359:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if(RCC_OscInitStruct->HSEState != RCC_HSE_OFF) + 360:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 361:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Get Start Tick */ + 362:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** tickstart = HAL_GetTick(); + 363:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 364:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Wait till HSE is ready */ + 365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) + 366:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 367:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) + 368:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 369:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** return HAL_TIMEOUT; + 370:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 371:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 372:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** else + 374:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 375:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Get Start Tick */ + 376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** tickstart = HAL_GetTick(); + 377:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 378:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Wait till HSE is disabled */ + 379:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) + 380:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 381:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) + 382:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** return HAL_TIMEOUT; + 384:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 387:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 388:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 389:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /*----------------------------- HSI Configuration --------------------------*/ + 390:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI) + 375 .loc 1 390 3 is_stmt 1 view .LVU102 + 376 .loc 1 390 25 is_stmt 0 view .LVU103 + 377 008c 2368 ldr r3, [r4] + 378 .loc 1 390 5 view .LVU104 + ARM GAS /tmp/cczyIHoC.s page 33 + + + 379 008e 13F0020F tst r3, #2 + 380 0092 00F0C480 beq .L40 + 391:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 392:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Check the parameters */ + 393:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** assert_param(IS_RCC_HSI(RCC_OscInitStruct->HSIState)); + 381 .loc 1 393 5 is_stmt 1 view .LVU105 + 394:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** assert_param(IS_RCC_CALIBRATION_VALUE(RCC_OscInitStruct->HSICalibrationValue)); + 382 .loc 1 394 5 view .LVU106 + 395:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 396:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Check if HSI is used as system clock or as PLL source when PLL is selected as system clock * + 397:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSI) + 383 .loc 1 397 5 view .LVU107 + 384 .loc 1 397 9 is_stmt 0 view .LVU108 + 385 0096 944B ldr r3, .L132 + 386 0098 5B68 ldr r3, [r3, #4] + 387 .loc 1 397 7 view .LVU109 + 388 009a 13F00C0F tst r3, #12 + 389 009e 00F09C80 beq .L41 + 398:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && (__HAL_RCC_GET_PLL_ + 390 .loc 1 398 13 view .LVU110 + 391 00a2 914B ldr r3, .L132 + 392 00a4 5B68 ldr r3, [r3, #4] + 393 00a6 03F00C03 and r3, r3, #12 + 394 .loc 1 398 8 view .LVU111 + 395 00aa 082B cmp r3, #8 + 396 00ac 00F08F80 beq .L121 + 397 .L42: + 399:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 400:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* When HSI is used as system clock it will not disabled */ + 401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) && (RCC_OscInitStruct->HSIState != RCC_HSI_ + 402:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 403:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** return HAL_ERROR; + 404:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 405:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Otherwise, just the calibration is allowed */ + 406:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** else + 407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 408:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/ + 409:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); + 410:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 411:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 412:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** else + 413:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 414:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Check the HSI State */ + 415:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if(RCC_OscInitStruct->HSIState != RCC_HSI_OFF) + 398 .loc 1 415 7 is_stmt 1 view .LVU112 + 399 .loc 1 415 27 is_stmt 0 view .LVU113 + 400 00b0 2369 ldr r3, [r4, #16] + 401 .loc 1 415 9 view .LVU114 + 402 00b2 002B cmp r3, #0 + 403 00b4 00F0F080 beq .L46 + 416:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 417:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Enable the Internal High Speed oscillator (HSI). */ + 418:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** __HAL_RCC_HSI_ENABLE(); + 404 .loc 1 418 9 is_stmt 1 view .LVU115 + 405 .LVL24: + 406 .LBB174: + 407 .LBI174: + ARM GAS /tmp/cczyIHoC.s page 34 + + + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 408 .loc 2 981 31 view .LVU116 + 409 .LBB175: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 410 .loc 2 983 3 view .LVU117 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 411 .loc 2 988 4 view .LVU118 + 412 00b8 0122 movs r2, #1 + 413 .syntax unified + 414 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 415 00ba 92FAA2F3 rbit r3, r2 + 416 @ 0 "" 2 + 417 .LVL25: + 418 .loc 2 1001 3 view .LVU119 + 419 .loc 2 1001 3 is_stmt 0 view .LVU120 + 420 .thumb + 421 .syntax unified + 422 .LBE175: + 423 .LBE174: + 424 .loc 1 418 9 view .LVU121 + 425 00be B3FA83F3 clz r3, r3 + 426 00c2 03F18453 add r3, r3, #276824064 + 427 00c6 03F58413 add r3, r3, #1081344 + 428 00ca 9B00 lsls r3, r3, #2 + 429 00cc 1A60 str r2, [r3] + 419:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 420:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Get Start Tick */ + 421:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** tickstart = HAL_GetTick(); + 430 .loc 1 421 9 is_stmt 1 view .LVU122 + 431 .loc 1 421 21 is_stmt 0 view .LVU123 + 432 00ce FFF7FEFF bl HAL_GetTick + 433 .LVL26: + 434 00d2 0546 mov r5, r0 + 435 .LVL27: + 422:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 423:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Wait till HSI is ready */ + 424:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) + 436 .loc 1 424 9 is_stmt 1 view .LVU124 + 437 .L47: + 438 .loc 1 424 51 view .LVU125 + 439 .LBB176: + 440 .LBI176: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 441 .loc 2 981 31 view .LVU126 + 442 .LBB177: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 443 .loc 2 983 3 view .LVU127 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 444 .loc 2 988 4 view .LVU128 + 445 00d4 0223 movs r3, #2 + 446 .syntax unified + 447 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 448 00d6 93FAA3F3 rbit r3, r3 + 449 @ 0 "" 2 + 450 .loc 2 1001 3 view .LVU129 + 451 .LVL28: + 452 .loc 2 1001 3 is_stmt 0 view .LVU130 + ARM GAS /tmp/cczyIHoC.s page 35 + + + 453 .thumb + 454 .syntax unified + 455 .LBE177: + 456 .LBE176: + 457 .loc 1 424 15 view .LVU131 + 458 00da 834B ldr r3, .L132 + 459 00dc 1968 ldr r1, [r3] + 460 .LVL29: + 461 .LBB178: + 462 .LBI178: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 463 .loc 2 981 31 is_stmt 1 view .LVU132 + 464 .LBB179: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 465 .loc 2 983 3 view .LVU133 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 466 .loc 2 988 4 view .LVU134 + 467 00de 0223 movs r3, #2 + 468 .syntax unified + 469 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 470 00e0 93FAA3F3 rbit r3, r3 + 471 @ 0 "" 2 + 472 .LVL30: + 473 .loc 2 1001 3 view .LVU135 + 474 .loc 2 1001 3 is_stmt 0 view .LVU136 + 475 .thumb + 476 .syntax unified + 477 .LBE179: + 478 .LBE178: + 479 .loc 1 424 15 view .LVU137 + 480 00e4 B3FA83F3 clz r3, r3 + 481 00e8 03F01F03 and r3, r3, #31 + 482 00ec 0122 movs r2, #1 + 483 00ee 02FA03F3 lsl r3, r2, r3 + 484 .loc 1 424 51 view .LVU138 + 485 00f2 0B42 tst r3, r1 + 486 00f4 40F0C280 bne .L122 + 425:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 426:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) + 487 .loc 1 426 11 is_stmt 1 view .LVU139 + 488 .loc 1 426 15 is_stmt 0 view .LVU140 + 489 00f8 FFF7FEFF bl HAL_GetTick + 490 .LVL31: + 491 .loc 1 426 29 view .LVU141 + 492 00fc 401B subs r0, r0, r5 + 493 .loc 1 426 13 view .LVU142 + 494 00fe 0228 cmp r0, #2 + 495 0100 E8D9 bls .L47 + 427:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 428:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** return HAL_TIMEOUT; + 496 .loc 1 428 20 view .LVU143 + 497 0102 0320 movs r0, #3 + 498 0104 89E2 b .L21 + 499 .LVL32: + 500 .L119: + 351:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 501 .loc 1 351 7 is_stmt 1 discriminator 1 view .LVU144 + ARM GAS /tmp/cczyIHoC.s page 36 + + + 502 0106 784A ldr r2, .L132 + 503 0108 1368 ldr r3, [r2] + 504 010a 43F48033 orr r3, r3, #65536 + 505 010e 1360 str r3, [r2] + 506 .L28: + 351:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 507 .loc 1 351 7 discriminator 10 view .LVU145 + 355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** #endif /* RCC_CFGR_PLLSRC_HSI_DIV2 */ + 508 .loc 1 355 7 discriminator 10 view .LVU146 + 509 0110 754A ldr r2, .L132 + 510 0112 D36A ldr r3, [r2, #44] + 511 0114 23F00F03 bic r3, r3, #15 + 512 0118 A168 ldr r1, [r4, #8] + 513 011a 0B43 orrs r3, r3, r1 + 514 011c D362 str r3, [r2, #44] + 359:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 515 .loc 1 359 7 discriminator 10 view .LVU147 + 359:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 516 .loc 1 359 27 is_stmt 0 discriminator 10 view .LVU148 + 517 011e 6368 ldr r3, [r4, #4] + 359:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 518 .loc 1 359 9 discriminator 10 view .LVU149 + 519 0120 002B cmp r3, #0 + 520 0122 36D0 beq .L31 + 362:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 521 .loc 1 362 9 is_stmt 1 view .LVU150 + 362:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 522 .loc 1 362 21 is_stmt 0 view .LVU151 + 523 0124 FFF7FEFF bl HAL_GetTick + 524 .LVL33: + 362:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 525 .loc 1 362 21 view .LVU152 + 526 0128 0546 mov r5, r0 + 527 .LVL34: + 365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 528 .loc 1 365 9 is_stmt 1 view .LVU153 + 529 .L32: + 365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 530 .loc 1 365 51 view .LVU154 + 531 .LBB180: + 532 .LBI180: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 533 .loc 2 981 31 view .LVU155 + 534 .LBB181: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 535 .loc 2 983 3 view .LVU156 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 536 .loc 2 988 4 view .LVU157 + 537 012a 4FF40033 mov r3, #131072 + 538 .syntax unified + 539 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 540 012e 93FAA3F3 rbit r3, r3 + 541 @ 0 "" 2 + 542 .loc 2 1001 3 view .LVU158 + 543 .LVL35: + 544 .loc 2 1001 3 is_stmt 0 view .LVU159 + 545 .thumb + ARM GAS /tmp/cczyIHoC.s page 37 + + + 546 .syntax unified + 547 .LBE181: + 548 .LBE180: + 365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 549 .loc 1 365 15 view .LVU160 + 550 0132 6D4B ldr r3, .L132 + 551 0134 1968 ldr r1, [r3] + 552 .LVL36: + 553 .LBB182: + 554 .LBI182: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 555 .loc 2 981 31 is_stmt 1 view .LVU161 + 556 .LBB183: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 557 .loc 2 983 3 view .LVU162 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 558 .loc 2 988 4 view .LVU163 + 559 0136 4FF40033 mov r3, #131072 + 560 .syntax unified + 561 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 562 013a 93FAA3F3 rbit r3, r3 + 563 @ 0 "" 2 + 564 .LVL37: + 565 .loc 2 1001 3 view .LVU164 + 566 .loc 2 1001 3 is_stmt 0 view .LVU165 + 567 .thumb + 568 .syntax unified + 569 .LBE183: + 570 .LBE182: + 365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 571 .loc 1 365 15 view .LVU166 + 572 013e B3FA83F3 clz r3, r3 + 573 0142 03F01F03 and r3, r3, #31 + 574 0146 0122 movs r2, #1 + 575 0148 02FA03F3 lsl r3, r2, r3 + 365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 576 .loc 1 365 51 view .LVU167 + 577 014c 0B42 tst r3, r1 + 578 014e 9DD1 bne .L22 + 367:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 579 .loc 1 367 11 is_stmt 1 view .LVU168 + 367:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 580 .loc 1 367 15 is_stmt 0 view .LVU169 + 581 0150 FFF7FEFF bl HAL_GetTick + 582 .LVL38: + 367:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 583 .loc 1 367 29 view .LVU170 + 584 0154 401B subs r0, r0, r5 + 367:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 585 .loc 1 367 13 view .LVU171 + 586 0156 6428 cmp r0, #100 + 587 0158 E7D9 bls .L32 + 369:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 588 .loc 1 369 20 view .LVU172 + 589 015a 0320 movs r0, #3 + 590 015c 5DE2 b .L21 + 591 .LVL39: + ARM GAS /tmp/cczyIHoC.s page 38 + + + 592 .L29: + 351:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 593 .loc 1 351 7 is_stmt 1 discriminator 5 view .LVU173 + 594 015e B3F5A02F cmp r3, #327680 + 595 0162 09D0 beq .L123 + 351:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 596 .loc 1 351 7 discriminator 8 view .LVU174 + 597 0164 604B ldr r3, .L132 + 598 0166 1A68 ldr r2, [r3] + 599 0168 22F48032 bic r2, r2, #65536 + 600 016c 1A60 str r2, [r3] + 351:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 601 .loc 1 351 7 discriminator 8 view .LVU175 + 602 016e 1A68 ldr r2, [r3] + 603 0170 22F48022 bic r2, r2, #262144 + 604 0174 1A60 str r2, [r3] + 605 0176 CBE7 b .L28 + 606 .L123: + 351:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 607 .loc 1 351 7 discriminator 7 view .LVU176 + 608 0178 03F18043 add r3, r3, #1073741824 + 609 017c A3F53C33 sub r3, r3, #192512 + 610 0180 1A68 ldr r2, [r3] + 611 0182 42F48022 orr r2, r2, #262144 + 612 0186 1A60 str r2, [r3] + 351:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 613 .loc 1 351 7 discriminator 7 view .LVU177 + 614 0188 1A68 ldr r2, [r3] + 615 018a 42F48032 orr r2, r2, #65536 + 616 018e 1A60 str r2, [r3] + 617 0190 BEE7 b .L28 + 618 .L31: + 376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 619 .loc 1 376 9 view .LVU178 + 376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 620 .loc 1 376 21 is_stmt 0 view .LVU179 + 621 0192 FFF7FEFF bl HAL_GetTick + 622 .LVL40: + 376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 623 .loc 1 376 21 view .LVU180 + 624 0196 0546 mov r5, r0 + 625 .LVL41: + 379:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 626 .loc 1 379 9 is_stmt 1 view .LVU181 + 627 .L36: + 379:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 628 .loc 1 379 51 view .LVU182 + 629 .LBB184: + 630 .LBI184: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 631 .loc 2 981 31 view .LVU183 + 632 .LBB185: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 633 .loc 2 983 3 view .LVU184 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 634 .loc 2 988 4 view .LVU185 + 635 0198 4FF40033 mov r3, #131072 + ARM GAS /tmp/cczyIHoC.s page 39 + + + 636 .syntax unified + 637 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 638 019c 93FAA3F3 rbit r3, r3 + 639 @ 0 "" 2 + 640 .loc 2 1001 3 view .LVU186 + 641 .LVL42: + 642 .loc 2 1001 3 is_stmt 0 view .LVU187 + 643 .thumb + 644 .syntax unified + 645 .LBE185: + 646 .LBE184: + 379:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 647 .loc 1 379 15 view .LVU188 + 648 01a0 514B ldr r3, .L132 + 649 01a2 1968 ldr r1, [r3] + 650 .LVL43: + 651 .LBB186: + 652 .LBI186: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 653 .loc 2 981 31 is_stmt 1 view .LVU189 + 654 .LBB187: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 655 .loc 2 983 3 view .LVU190 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 656 .loc 2 988 4 view .LVU191 + 657 01a4 4FF40033 mov r3, #131072 + 658 .syntax unified + 659 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 660 01a8 93FAA3F3 rbit r3, r3 + 661 @ 0 "" 2 + 662 .LVL44: + 663 .loc 2 1001 3 view .LVU192 + 664 .loc 2 1001 3 is_stmt 0 view .LVU193 + 665 .thumb + 666 .syntax unified + 667 .LBE187: + 668 .LBE186: + 379:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 669 .loc 1 379 15 view .LVU194 + 670 01ac B3FA83F3 clz r3, r3 + 671 01b0 03F01F03 and r3, r3, #31 + 672 01b4 0122 movs r2, #1 + 673 01b6 02FA03F3 lsl r3, r2, r3 + 379:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 674 .loc 1 379 51 view .LVU195 + 675 01ba 0B42 tst r3, r1 + 676 01bc 3FF466AF beq .L22 + 381:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 677 .loc 1 381 12 is_stmt 1 view .LVU196 + 381:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 678 .loc 1 381 16 is_stmt 0 view .LVU197 + 679 01c0 FFF7FEFF bl HAL_GetTick + 680 .LVL45: + 381:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 681 .loc 1 381 30 view .LVU198 + 682 01c4 401B subs r0, r0, r5 + 381:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + ARM GAS /tmp/cczyIHoC.s page 40 + + + 683 .loc 1 381 14 view .LVU199 + 684 01c6 6428 cmp r0, #100 + 685 01c8 E6D9 bls .L36 + 383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 686 .loc 1 383 20 view .LVU200 + 687 01ca 0320 movs r0, #3 + 688 01cc 25E2 b .L21 + 689 .LVL46: + 690 .L121: + 398:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 691 .loc 1 398 82 discriminator 1 view .LVU201 + 692 01ce 464B ldr r3, .L132 + 693 01d0 5B68 ldr r3, [r3, #4] + 398:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 694 .loc 1 398 78 discriminator 1 view .LVU202 + 695 01d2 13F4803F tst r3, #65536 + 696 01d6 7FF46BAF bne .L42 + 697 .L41: + 401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 698 .loc 1 401 7 is_stmt 1 view .LVU203 + 699 .LVL47: + 700 .LBB188: + 701 .LBI188: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 702 .loc 2 981 31 view .LVU204 + 703 .LBB189: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 704 .loc 2 983 3 view .LVU205 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 705 .loc 2 988 4 view .LVU206 + 706 01da 0223 movs r3, #2 + 707 .syntax unified + 708 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 709 01dc 93FAA3F3 rbit r3, r3 + 710 @ 0 "" 2 + 711 .loc 2 1001 3 view .LVU207 + 712 .LVL48: + 713 .loc 2 1001 3 is_stmt 0 view .LVU208 + 714 .thumb + 715 .syntax unified + 716 .LBE189: + 717 .LBE188: + 401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 718 .loc 1 401 11 view .LVU209 + 719 01e0 414B ldr r3, .L132 + 720 01e2 1968 ldr r1, [r3] + 721 .LVL49: + 722 .LBB190: + 723 .LBI190: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 724 .loc 2 981 31 is_stmt 1 view .LVU210 + 725 .LBB191: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 726 .loc 2 983 3 view .LVU211 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 727 .loc 2 988 4 view .LVU212 + 728 01e4 0223 movs r3, #2 + ARM GAS /tmp/cczyIHoC.s page 41 + + + 729 .syntax unified + 730 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 731 01e6 93FAA3F3 rbit r3, r3 + 732 @ 0 "" 2 + 733 .LVL50: + 734 .loc 2 1001 3 view .LVU213 + 735 .loc 2 1001 3 is_stmt 0 view .LVU214 + 736 .thumb + 737 .syntax unified + 738 .LBE191: + 739 .LBE190: + 401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 740 .loc 1 401 11 view .LVU215 + 741 01ea B3FA83F3 clz r3, r3 + 742 01ee 03F01F03 and r3, r3, #31 + 743 01f2 0122 movs r2, #1 + 744 01f4 02FA03F3 lsl r3, r2, r3 + 401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 745 .loc 1 401 9 view .LVU216 + 746 01f8 0B42 tst r3, r1 + 747 01fa 03D0 beq .L45 + 401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 748 .loc 1 401 78 discriminator 13 view .LVU217 + 749 01fc 2369 ldr r3, [r4, #16] + 401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 750 .loc 1 401 57 discriminator 13 view .LVU218 + 751 01fe 9342 cmp r3, r2 + 752 0200 40F00482 bne .L98 + 753 .L45: + 409:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 754 .loc 1 409 9 is_stmt 1 view .LVU219 + 755 0204 3848 ldr r0, .L132 + 756 0206 0368 ldr r3, [r0] + 757 0208 23F0F803 bic r3, r3, #248 + 758 020c 6169 ldr r1, [r4, #20] + 759 .LVL51: + 760 .LBB192: + 761 .LBI192: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 762 .loc 2 981 31 view .LVU220 + 763 .LBB193: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 764 .loc 2 983 3 view .LVU221 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 765 .loc 2 988 4 view .LVU222 + 766 020e F822 movs r2, #248 + 767 .syntax unified + 768 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 769 0210 92FAA2F2 rbit r2, r2 + 770 @ 0 "" 2 + 771 .LVL52: + 772 .loc 2 1001 3 view .LVU223 + 773 .loc 2 1001 3 is_stmt 0 view .LVU224 + 774 .thumb + 775 .syntax unified + 776 .LBE193: + 777 .LBE192: + ARM GAS /tmp/cczyIHoC.s page 42 + + + 409:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 778 .loc 1 409 9 view .LVU225 + 779 0214 B2FA82F2 clz r2, r2 + 780 0218 9140 lsls r1, r1, r2 + 781 021a 0B43 orrs r3, r3, r1 + 782 021c 0360 str r3, [r0] + 783 .L40: + 429:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 430:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 431:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 432:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Adjusts the Internal High Speed oscillator (HSI) calibration value.*/ + 433:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST(RCC_OscInitStruct->HSICalibrationValue); + 434:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 435:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** else + 436:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 437:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Disable the Internal High Speed oscillator (HSI). */ + 438:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** __HAL_RCC_HSI_DISABLE(); + 439:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 440:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Get Start Tick */ + 441:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** tickstart = HAL_GetTick(); + 442:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 443:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Wait till HSI is disabled */ + 444:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) + 445:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 446:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) + 447:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 448:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** return HAL_TIMEOUT; + 449:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 450:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 451:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 452:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 453:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 454:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /*------------------------------ LSI Configuration -------------------------*/ + 455:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI) + 784 .loc 1 455 3 is_stmt 1 view .LVU226 + 785 .loc 1 455 25 is_stmt 0 view .LVU227 + 786 021e 2368 ldr r3, [r4] + 787 .loc 1 455 5 view .LVU228 + 788 0220 13F0080F tst r3, #8 + 789 0224 00F08C80 beq .L55 + 456:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 457:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Check the parameters */ + 458:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** assert_param(IS_RCC_LSI(RCC_OscInitStruct->LSIState)); + 790 .loc 1 458 5 is_stmt 1 view .LVU229 + 459:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 460:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Check the LSI State */ + 461:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if(RCC_OscInitStruct->LSIState != RCC_LSI_OFF) + 791 .loc 1 461 5 view .LVU230 + 792 .loc 1 461 25 is_stmt 0 view .LVU231 + 793 0228 A369 ldr r3, [r4, #24] + 794 .loc 1 461 7 view .LVU232 + 795 022a 002B cmp r3, #0 + 796 022c 60D0 beq .L56 + 462:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 463:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Enable the Internal Low Speed oscillator (LSI). */ + 464:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** __HAL_RCC_LSI_ENABLE(); + 797 .loc 1 464 7 is_stmt 1 view .LVU233 + ARM GAS /tmp/cczyIHoC.s page 43 + + + 798 .LVL53: + 799 .LBB194: + 800 .LBI194: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 801 .loc 2 981 31 view .LVU234 + 802 .LBB195: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 803 .loc 2 983 3 view .LVU235 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 804 .loc 2 988 4 view .LVU236 + 805 022e 0121 movs r1, #1 + 806 .syntax unified + 807 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 808 0230 91FAA1F2 rbit r2, r1 + 809 @ 0 "" 2 + 810 .LVL54: + 811 .loc 2 1001 3 view .LVU237 + 812 .loc 2 1001 3 is_stmt 0 view .LVU238 + 813 .thumb + 814 .syntax unified + 815 .LBE195: + 816 .LBE194: + 817 .loc 1 464 7 view .LVU239 + 818 0234 B2FA82F2 clz r2, r2 + 819 0238 2C4B ldr r3, .L132+4 + 820 023a 1344 add r3, r3, r2 + 821 023c 9B00 lsls r3, r3, #2 + 822 023e 1960 str r1, [r3] + 465:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 466:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Get Start Tick */ + 467:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** tickstart = HAL_GetTick(); + 823 .loc 1 467 7 is_stmt 1 view .LVU240 + 824 .loc 1 467 19 is_stmt 0 view .LVU241 + 825 0240 FFF7FEFF bl HAL_GetTick + 826 .LVL55: + 827 0244 0546 mov r5, r0 + 828 .LVL56: + 468:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 469:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Wait till LSI is ready */ + 470:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) + 829 .loc 1 470 7 is_stmt 1 view .LVU242 + 830 .L57: + 831 .loc 1 470 49 view .LVU243 + 832 .LBB196: + 833 .LBI196: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 834 .loc 2 981 31 view .LVU244 + 835 .LBB197: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 836 .loc 2 983 3 view .LVU245 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 837 .loc 2 988 4 view .LVU246 + 838 0246 0223 movs r3, #2 + 839 .syntax unified + 840 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 841 0248 93FAA3F2 rbit r2, r3 + 842 @ 0 "" 2 + ARM GAS /tmp/cczyIHoC.s page 44 + + + 843 .LVL57: + 844 .loc 2 1001 3 view .LVU247 + 845 .loc 2 1001 3 is_stmt 0 view .LVU248 + 846 .thumb + 847 .syntax unified + 848 .LBE197: + 849 .LBE196: + 850 .LBB198: + 851 .LBI198: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 852 .loc 2 981 31 is_stmt 1 view .LVU249 + 853 .LBB199: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 854 .loc 2 983 3 view .LVU250 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 855 .loc 2 988 4 view .LVU251 + 856 .syntax unified + 857 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 858 024c 93FAA3F2 rbit r2, r3 + 859 @ 0 "" 2 + 860 .LVL58: + 861 .loc 2 1001 3 view .LVU252 + 862 .loc 2 1001 3 is_stmt 0 view .LVU253 + 863 .thumb + 864 .syntax unified + 865 .LBE199: + 866 .LBE198: + 867 .LBB200: + 868 .LBI200: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 869 .loc 2 981 31 is_stmt 1 view .LVU254 + 870 .LBB201: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 871 .loc 2 983 3 view .LVU255 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 872 .loc 2 988 4 view .LVU256 + 873 .syntax unified + 874 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 875 0250 93FAA3F2 rbit r2, r3 + 876 @ 0 "" 2 + 877 .LVL59: + 878 .loc 2 1001 3 view .LVU257 + 879 .loc 2 1001 3 is_stmt 0 view .LVU258 + 880 .thumb + 881 .syntax unified + 882 .LBE201: + 883 .LBE200: + 884 .loc 1 470 13 view .LVU259 + 885 0254 244A ldr r2, .L132 + 886 0256 516A ldr r1, [r2, #36] + 887 .LVL60: + 888 .LBB202: + 889 .LBI202: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 890 .loc 2 981 31 is_stmt 1 view .LVU260 + 891 .LBB203: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + ARM GAS /tmp/cczyIHoC.s page 45 + + + 892 .loc 2 983 3 view .LVU261 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 893 .loc 2 988 4 view .LVU262 + 894 .syntax unified + 895 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 896 0258 93FAA3F3 rbit r3, r3 + 897 @ 0 "" 2 + 898 .LVL61: + 899 .loc 2 1001 3 view .LVU263 + 900 .loc 2 1001 3 is_stmt 0 view .LVU264 + 901 .thumb + 902 .syntax unified + 903 .LBE203: + 904 .LBE202: + 905 .loc 1 470 13 view .LVU265 + 906 025c B3FA83F3 clz r3, r3 + 907 0260 03F01F03 and r3, r3, #31 + 908 0264 0122 movs r2, #1 + 909 0266 02FA03F3 lsl r3, r2, r3 + 910 .loc 1 470 49 view .LVU266 + 911 026a 0B42 tst r3, r1 + 912 026c 68D1 bne .L55 + 471:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 472:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) + 913 .loc 1 472 9 is_stmt 1 view .LVU267 + 914 .loc 1 472 13 is_stmt 0 view .LVU268 + 915 026e FFF7FEFF bl HAL_GetTick + 916 .LVL62: + 917 .loc 1 472 27 view .LVU269 + 918 0272 401B subs r0, r0, r5 + 919 .loc 1 472 11 view .LVU270 + 920 0274 0228 cmp r0, #2 + 921 0276 E6D9 bls .L57 + 473:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 474:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** return HAL_TIMEOUT; + 922 .loc 1 474 18 view .LVU271 + 923 0278 0320 movs r0, #3 + 924 027a CEE1 b .L21 + 925 .L122: + 433:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 926 .loc 1 433 9 is_stmt 1 view .LVU272 + 927 027c 1A48 ldr r0, .L132 + 928 027e 0368 ldr r3, [r0] + 929 0280 23F0F803 bic r3, r3, #248 + 930 0284 6169 ldr r1, [r4, #20] + 931 .LVL63: + 932 .LBB204: + 933 .LBI204: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 934 .loc 2 981 31 view .LVU273 + 935 .LBB205: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 936 .loc 2 983 3 view .LVU274 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 937 .loc 2 988 4 view .LVU275 + 938 0286 F822 movs r2, #248 + 939 .syntax unified + ARM GAS /tmp/cczyIHoC.s page 46 + + + 940 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 941 0288 92FAA2F2 rbit r2, r2 + 942 @ 0 "" 2 + 943 .LVL64: + 944 .loc 2 1001 3 view .LVU276 + 945 .loc 2 1001 3 is_stmt 0 view .LVU277 + 946 .thumb + 947 .syntax unified + 948 .LBE205: + 949 .LBE204: + 433:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 950 .loc 1 433 9 view .LVU278 + 951 028c B2FA82F2 clz r2, r2 + 952 0290 9140 lsls r1, r1, r2 + 953 0292 0B43 orrs r3, r3, r1 + 954 0294 0360 str r3, [r0] + 955 0296 C2E7 b .L40 + 956 .LVL65: + 957 .L46: + 438:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 958 .loc 1 438 9 is_stmt 1 view .LVU279 + 959 .LBB206: + 960 .LBI206: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 961 .loc 2 981 31 view .LVU280 + 962 .LBB207: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 963 .loc 2 983 3 view .LVU281 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 964 .loc 2 988 4 view .LVU282 + 965 0298 0123 movs r3, #1 + 966 .syntax unified + 967 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 968 029a 93FAA3F3 rbit r3, r3 + 969 @ 0 "" 2 + 970 .LVL66: + 971 .loc 2 1001 3 view .LVU283 + 972 .loc 2 1001 3 is_stmt 0 view .LVU284 + 973 .thumb + 974 .syntax unified + 975 .LBE207: + 976 .LBE206: + 438:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 977 .loc 1 438 9 view .LVU285 + 978 029e B3FA83F3 clz r3, r3 + 979 02a2 03F18453 add r3, r3, #276824064 + 980 02a6 03F58413 add r3, r3, #1081344 + 981 02aa 9B00 lsls r3, r3, #2 + 982 02ac 0022 movs r2, #0 + 983 02ae 1A60 str r2, [r3] + 441:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 984 .loc 1 441 9 is_stmt 1 view .LVU286 + 441:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 985 .loc 1 441 21 is_stmt 0 view .LVU287 + 986 02b0 FFF7FEFF bl HAL_GetTick + 987 .LVL67: + 988 02b4 0546 mov r5, r0 + ARM GAS /tmp/cczyIHoC.s page 47 + + + 989 .LVL68: + 444:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 990 .loc 1 444 9 is_stmt 1 view .LVU288 + 991 .L51: + 444:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 992 .loc 1 444 51 view .LVU289 + 993 .LBB208: + 994 .LBI208: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 995 .loc 2 981 31 view .LVU290 + 996 .LBB209: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 997 .loc 2 983 3 view .LVU291 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 998 .loc 2 988 4 view .LVU292 + 999 02b6 0223 movs r3, #2 + 1000 .syntax unified + 1001 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 1002 02b8 93FAA3F3 rbit r3, r3 + 1003 @ 0 "" 2 + 1004 .loc 2 1001 3 view .LVU293 + 1005 .LVL69: + 1006 .loc 2 1001 3 is_stmt 0 view .LVU294 + 1007 .thumb + 1008 .syntax unified + 1009 .LBE209: + 1010 .LBE208: + 444:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 1011 .loc 1 444 15 view .LVU295 + 1012 02bc 0A4B ldr r3, .L132 + 1013 02be 1968 ldr r1, [r3] + 1014 .LVL70: + 1015 .LBB210: + 1016 .LBI210: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 1017 .loc 2 981 31 is_stmt 1 view .LVU296 + 1018 .LBB211: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 1019 .loc 2 983 3 view .LVU297 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 1020 .loc 2 988 4 view .LVU298 + 1021 02c0 0223 movs r3, #2 + 1022 .syntax unified + 1023 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 1024 02c2 93FAA3F3 rbit r3, r3 + 1025 @ 0 "" 2 + 1026 .LVL71: + 1027 .loc 2 1001 3 view .LVU299 + 1028 .loc 2 1001 3 is_stmt 0 view .LVU300 + 1029 .thumb + 1030 .syntax unified + 1031 .LBE211: + 1032 .LBE210: + 444:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 1033 .loc 1 444 15 view .LVU301 + 1034 02c6 B3FA83F3 clz r3, r3 + 1035 02ca 03F01F03 and r3, r3, #31 + ARM GAS /tmp/cczyIHoC.s page 48 + + + 1036 02ce 0122 movs r2, #1 + 1037 02d0 02FA03F3 lsl r3, r2, r3 + 444:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 1038 .loc 1 444 51 view .LVU302 + 1039 02d4 0B42 tst r3, r1 + 1040 02d6 A2D0 beq .L40 + 446:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 1041 .loc 1 446 11 is_stmt 1 view .LVU303 + 446:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 1042 .loc 1 446 15 is_stmt 0 view .LVU304 + 1043 02d8 FFF7FEFF bl HAL_GetTick + 1044 .LVL72: + 446:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 1045 .loc 1 446 29 view .LVU305 + 1046 02dc 401B subs r0, r0, r5 + 446:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 1047 .loc 1 446 13 view .LVU306 + 1048 02de 0228 cmp r0, #2 + 1049 02e0 E9D9 bls .L51 + 448:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 1050 .loc 1 448 20 view .LVU307 + 1051 02e2 0320 movs r0, #3 + 1052 02e4 99E1 b .L21 + 1053 .L133: + 1054 02e6 00BF .align 2 + 1055 .L132: + 1056 02e8 00100240 .word 1073876992 + 1057 02ec 20819010 .word 277905696 + 1058 .LVL73: + 1059 .L56: + 475:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 476:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 477:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 478:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** else + 479:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 480:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Disable the Internal Low Speed oscillator (LSI). */ + 481:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** __HAL_RCC_LSI_DISABLE(); + 1060 .loc 1 481 7 is_stmt 1 view .LVU308 + 1061 .LBB212: + 1062 .LBI212: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 1063 .loc 2 981 31 view .LVU309 + 1064 .LBB213: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 1065 .loc 2 983 3 view .LVU310 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 1066 .loc 2 988 4 view .LVU311 + 1067 02f0 0122 movs r2, #1 + 1068 .syntax unified + 1069 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 1070 02f2 92FAA2F2 rbit r2, r2 + 1071 @ 0 "" 2 + 1072 .LVL74: + 1073 .loc 2 1001 3 view .LVU312 + 1074 .loc 2 1001 3 is_stmt 0 view .LVU313 + 1075 .thumb + 1076 .syntax unified + ARM GAS /tmp/cczyIHoC.s page 49 + + + 1077 .LBE213: + 1078 .LBE212: + 1079 .loc 1 481 7 view .LVU314 + 1080 02f6 B2FA82F2 clz r2, r2 + 1081 02fa B74B ldr r3, .L134 + 1082 02fc 1344 add r3, r3, r2 + 1083 02fe 9B00 lsls r3, r3, #2 + 1084 0300 0022 movs r2, #0 + 1085 0302 1A60 str r2, [r3] + 482:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 483:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Get Start Tick */ + 484:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** tickstart = HAL_GetTick(); + 1086 .loc 1 484 7 is_stmt 1 view .LVU315 + 1087 .loc 1 484 19 is_stmt 0 view .LVU316 + 1088 0304 FFF7FEFF bl HAL_GetTick + 1089 .LVL75: + 1090 0308 0546 mov r5, r0 + 1091 .LVL76: + 485:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 486:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Wait till LSI is disabled */ + 487:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET) + 1092 .loc 1 487 7 is_stmt 1 view .LVU317 + 1093 .L59: + 1094 .loc 1 487 49 view .LVU318 + 1095 .LBB214: + 1096 .LBI214: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 1097 .loc 2 981 31 view .LVU319 + 1098 .LBB215: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 1099 .loc 2 983 3 view .LVU320 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 1100 .loc 2 988 4 view .LVU321 + 1101 030a 0223 movs r3, #2 + 1102 .syntax unified + 1103 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 1104 030c 93FAA3F2 rbit r2, r3 + 1105 @ 0 "" 2 + 1106 .LVL77: + 1107 .loc 2 1001 3 view .LVU322 + 1108 .loc 2 1001 3 is_stmt 0 view .LVU323 + 1109 .thumb + 1110 .syntax unified + 1111 .LBE215: + 1112 .LBE214: + 1113 .LBB216: + 1114 .LBI216: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 1115 .loc 2 981 31 is_stmt 1 view .LVU324 + 1116 .LBB217: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 1117 .loc 2 983 3 view .LVU325 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 1118 .loc 2 988 4 view .LVU326 + 1119 .syntax unified + 1120 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 1121 0310 93FAA3F2 rbit r2, r3 + ARM GAS /tmp/cczyIHoC.s page 50 + + + 1122 @ 0 "" 2 + 1123 .LVL78: + 1124 .loc 2 1001 3 view .LVU327 + 1125 .loc 2 1001 3 is_stmt 0 view .LVU328 + 1126 .thumb + 1127 .syntax unified + 1128 .LBE217: + 1129 .LBE216: + 1130 .LBB218: + 1131 .LBI218: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 1132 .loc 2 981 31 is_stmt 1 view .LVU329 + 1133 .LBB219: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 1134 .loc 2 983 3 view .LVU330 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 1135 .loc 2 988 4 view .LVU331 + 1136 .syntax unified + 1137 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 1138 0314 93FAA3F2 rbit r2, r3 + 1139 @ 0 "" 2 + 1140 .LVL79: + 1141 .loc 2 1001 3 view .LVU332 + 1142 .loc 2 1001 3 is_stmt 0 view .LVU333 + 1143 .thumb + 1144 .syntax unified + 1145 .LBE219: + 1146 .LBE218: + 1147 .loc 1 487 13 view .LVU334 + 1148 0318 B04A ldr r2, .L134+4 + 1149 031a 516A ldr r1, [r2, #36] + 1150 .LVL80: + 1151 .LBB220: + 1152 .LBI220: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 1153 .loc 2 981 31 is_stmt 1 view .LVU335 + 1154 .LBB221: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 1155 .loc 2 983 3 view .LVU336 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 1156 .loc 2 988 4 view .LVU337 + 1157 .syntax unified + 1158 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 1159 031c 93FAA3F3 rbit r3, r3 + 1160 @ 0 "" 2 + 1161 .LVL81: + 1162 .loc 2 1001 3 view .LVU338 + 1163 .loc 2 1001 3 is_stmt 0 view .LVU339 + 1164 .thumb + 1165 .syntax unified + 1166 .LBE221: + 1167 .LBE220: + 1168 .loc 1 487 13 view .LVU340 + 1169 0320 B3FA83F3 clz r3, r3 + 1170 0324 03F01F03 and r3, r3, #31 + 1171 0328 0122 movs r2, #1 + 1172 032a 02FA03F3 lsl r3, r2, r3 + ARM GAS /tmp/cczyIHoC.s page 51 + + + 1173 .loc 1 487 49 view .LVU341 + 1174 032e 0B42 tst r3, r1 + 1175 0330 06D0 beq .L55 + 488:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 489:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) + 1176 .loc 1 489 9 is_stmt 1 view .LVU342 + 1177 .loc 1 489 13 is_stmt 0 view .LVU343 + 1178 0332 FFF7FEFF bl HAL_GetTick + 1179 .LVL82: + 1180 .loc 1 489 27 view .LVU344 + 1181 0336 401B subs r0, r0, r5 + 1182 .loc 1 489 11 view .LVU345 + 1183 0338 0228 cmp r0, #2 + 1184 033a E6D9 bls .L59 + 490:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 491:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** return HAL_TIMEOUT; + 1185 .loc 1 491 18 view .LVU346 + 1186 033c 0320 movs r0, #3 + 1187 033e 6CE1 b .L21 + 1188 .LVL83: + 1189 .L55: + 492:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 493:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 494:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 495:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 496:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /*------------------------------ LSE Configuration -------------------------*/ + 497:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE) + 1190 .loc 1 497 3 is_stmt 1 view .LVU347 + 1191 .loc 1 497 25 is_stmt 0 view .LVU348 + 1192 0340 2368 ldr r3, [r4] + 1193 .loc 1 497 5 view .LVU349 + 1194 0342 13F0040F tst r3, #4 + 1195 0346 00F0A980 beq .L61 + 1196 .LBB222: + 498:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 499:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** FlagStatus pwrclkchanged = RESET; + 1197 .loc 1 499 5 is_stmt 1 view .LVU350 + 1198 .LVL84: + 500:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 501:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Check the parameters */ + 502:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** assert_param(IS_RCC_LSE(RCC_OscInitStruct->LSEState)); + 1199 .loc 1 502 5 view .LVU351 + 503:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 504:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Update LSE configuration in Backup Domain control register */ + 505:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Requires to enable write access to Backup Domain of necessary */ + 506:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if(__HAL_RCC_PWR_IS_CLK_DISABLED()) + 1200 .loc 1 506 5 view .LVU352 + 1201 .loc 1 506 8 is_stmt 0 view .LVU353 + 1202 034a A44B ldr r3, .L134+4 + 1203 034c DB69 ldr r3, [r3, #28] + 1204 .loc 1 506 7 view .LVU354 + 1205 034e 13F0805F tst r3, #268435456 + 1206 0352 20D1 bne .L103 + 507:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 508:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** __HAL_RCC_PWR_CLK_ENABLE(); + 1207 .loc 1 508 7 is_stmt 1 view .LVU355 + 1208 .LBB223: + ARM GAS /tmp/cczyIHoC.s page 52 + + + 1209 .loc 1 508 7 view .LVU356 + 1210 .loc 1 508 7 view .LVU357 + 1211 0354 A14B ldr r3, .L134+4 + 1212 0356 DA69 ldr r2, [r3, #28] + 1213 0358 42F08052 orr r2, r2, #268435456 + 1214 035c DA61 str r2, [r3, #28] + 1215 .loc 1 508 7 view .LVU358 + 1216 035e DB69 ldr r3, [r3, #28] + 1217 0360 03F08053 and r3, r3, #268435456 + 1218 0364 0193 str r3, [sp, #4] + 1219 .loc 1 508 7 view .LVU359 + 1220 0366 019B ldr r3, [sp, #4] + 1221 .LBE223: + 1222 .loc 1 508 7 view .LVU360 + 509:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** pwrclkchanged = SET; + 1223 .loc 1 509 7 view .LVU361 + 1224 .LVL85: + 1225 .loc 1 509 21 is_stmt 0 view .LVU362 + 1226 0368 0125 movs r5, #1 + 1227 .LVL86: + 1228 .L62: + 510:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 511:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 512:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if(HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) + 1229 .loc 1 512 5 is_stmt 1 view .LVU363 + 1230 .loc 1 512 8 is_stmt 0 view .LVU364 + 1231 036a 9D4B ldr r3, .L134+8 + 1232 036c 1B68 ldr r3, [r3] + 1233 .loc 1 512 7 view .LVU365 + 1234 036e 13F4807F tst r3, #256 + 1235 0372 12D0 beq .L124 + 1236 .L63: + 513:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 514:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Enable write access to Backup domain */ + 515:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** SET_BIT(PWR->CR, PWR_CR_DBP); + 516:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 517:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Wait for Backup domain Write protection disable */ + 518:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** tickstart = HAL_GetTick(); + 519:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 520:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** while(HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) + 521:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 522:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) + 523:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 524:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** return HAL_TIMEOUT; + 525:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 526:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 527:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 528:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 529:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Set the new LSE configuration -----------------------------------------*/ + 530:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** __HAL_RCC_LSE_CONFIG(RCC_OscInitStruct->LSEState); + 1237 .loc 1 530 5 is_stmt 1 view .LVU366 + 1238 .loc 1 530 5 view .LVU367 + 1239 0374 E368 ldr r3, [r4, #12] + 1240 0376 012B cmp r3, #1 + 1241 0378 23D0 beq .L125 + 1242 .loc 1 530 5 discriminator 2 view .LVU368 + 1243 037a 73BB cbnz r3, .L68 + ARM GAS /tmp/cczyIHoC.s page 53 + + + 1244 .loc 1 530 5 discriminator 4 view .LVU369 + 1245 037c 03F18043 add r3, r3, #1073741824 + 1246 0380 03F50433 add r3, r3, #135168 + 1247 0384 1A6A ldr r2, [r3, #32] + 1248 0386 22F00102 bic r2, r2, #1 + 1249 038a 1A62 str r2, [r3, #32] + 1250 .loc 1 530 5 discriminator 4 view .LVU370 + 1251 038c 1A6A ldr r2, [r3, #32] + 1252 038e 22F00402 bic r2, r2, #4 + 1253 0392 1A62 str r2, [r3, #32] + 1254 0394 1AE0 b .L67 + 1255 .LVL87: + 1256 .L103: + 499:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 1257 .loc 1 499 22 is_stmt 0 view .LVU371 + 1258 0396 0025 movs r5, #0 + 1259 0398 E7E7 b .L62 + 1260 .LVL88: + 1261 .L124: + 515:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 1262 .loc 1 515 7 is_stmt 1 view .LVU372 + 1263 039a 914A ldr r2, .L134+8 + 1264 039c 1368 ldr r3, [r2] + 1265 039e 43F48073 orr r3, r3, #256 + 1266 03a2 1360 str r3, [r2] + 518:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 1267 .loc 1 518 7 view .LVU373 + 518:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 1268 .loc 1 518 19 is_stmt 0 view .LVU374 + 1269 03a4 FFF7FEFF bl HAL_GetTick + 1270 .LVL89: + 1271 03a8 0646 mov r6, r0 + 1272 .LVL90: + 520:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 1273 .loc 1 520 7 is_stmt 1 view .LVU375 + 1274 .L64: + 520:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 1275 .loc 1 520 13 view .LVU376 + 1276 03aa 8D4B ldr r3, .L134+8 + 1277 03ac 1B68 ldr r3, [r3] + 1278 03ae 13F4807F tst r3, #256 + 1279 03b2 DFD1 bne .L63 + 522:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 1280 .loc 1 522 9 view .LVU377 + 522:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 1281 .loc 1 522 13 is_stmt 0 view .LVU378 + 1282 03b4 FFF7FEFF bl HAL_GetTick + 1283 .LVL91: + 522:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 1284 .loc 1 522 27 view .LVU379 + 1285 03b8 801B subs r0, r0, r6 + 522:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 1286 .loc 1 522 11 view .LVU380 + 1287 03ba 6428 cmp r0, #100 + 1288 03bc F5D9 bls .L64 + 524:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 1289 .loc 1 524 18 view .LVU381 + ARM GAS /tmp/cczyIHoC.s page 54 + + + 1290 03be 0320 movs r0, #3 + 1291 03c0 2BE1 b .L21 + 1292 .LVL92: + 1293 .L125: + 1294 .loc 1 530 5 is_stmt 1 discriminator 1 view .LVU382 + 1295 03c2 864A ldr r2, .L134+4 + 1296 03c4 136A ldr r3, [r2, #32] + 1297 03c6 43F00103 orr r3, r3, #1 + 1298 03ca 1362 str r3, [r2, #32] + 1299 .L67: + 1300 .loc 1 530 5 discriminator 10 view .LVU383 + 531:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Check the LSE State */ + 532:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if(RCC_OscInitStruct->LSEState != RCC_LSE_OFF) + 1301 .loc 1 532 5 discriminator 10 view .LVU384 + 1302 .loc 1 532 25 is_stmt 0 discriminator 10 view .LVU385 + 1303 03cc E368 ldr r3, [r4, #12] + 1304 .loc 1 532 7 discriminator 10 view .LVU386 + 1305 03ce 002B cmp r3, #0 + 1306 03d0 3CD0 beq .L70 + 533:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 534:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Get Start Tick */ + 535:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** tickstart = HAL_GetTick(); + 1307 .loc 1 535 7 is_stmt 1 view .LVU387 + 1308 .loc 1 535 19 is_stmt 0 view .LVU388 + 1309 03d2 FFF7FEFF bl HAL_GetTick + 1310 .LVL93: + 1311 03d6 0646 mov r6, r0 + 1312 .LVL94: + 536:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 537:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Wait till LSE is ready */ + 538:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) + 1313 .loc 1 538 7 is_stmt 1 view .LVU389 + 1314 .loc 1 538 12 is_stmt 0 view .LVU390 + 1315 03d8 2EE0 b .L71 + 1316 .LVL95: + 1317 .L68: + 530:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Check the LSE State */ + 1318 .loc 1 530 5 is_stmt 1 discriminator 5 view .LVU391 + 1319 03da 052B cmp r3, #5 + 1320 03dc 09D0 beq .L126 + 530:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Check the LSE State */ + 1321 .loc 1 530 5 discriminator 8 view .LVU392 + 1322 03de 7F4B ldr r3, .L134+4 + 1323 03e0 1A6A ldr r2, [r3, #32] + 1324 03e2 22F00102 bic r2, r2, #1 + 1325 03e6 1A62 str r2, [r3, #32] + 530:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Check the LSE State */ + 1326 .loc 1 530 5 discriminator 8 view .LVU393 + 1327 03e8 1A6A ldr r2, [r3, #32] + 1328 03ea 22F00402 bic r2, r2, #4 + 1329 03ee 1A62 str r2, [r3, #32] + 1330 03f0 ECE7 b .L67 + 1331 .L126: + 530:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Check the LSE State */ + 1332 .loc 1 530 5 discriminator 7 view .LVU394 + 1333 03f2 7A4B ldr r3, .L134+4 + 1334 03f4 1A6A ldr r2, [r3, #32] + ARM GAS /tmp/cczyIHoC.s page 55 + + + 1335 03f6 42F00402 orr r2, r2, #4 + 1336 03fa 1A62 str r2, [r3, #32] + 530:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Check the LSE State */ + 1337 .loc 1 530 5 discriminator 7 view .LVU395 + 1338 03fc 1A6A ldr r2, [r3, #32] + 1339 03fe 42F00102 orr r2, r2, #1 + 1340 0402 1A62 str r2, [r3, #32] + 1341 0404 E2E7 b .L67 + 1342 .LVL96: + 1343 .L72: + 1344 .LBB224: + 1345 .LBI224: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 1346 .loc 2 981 31 view .LVU396 + 1347 .LBB225: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 1348 .loc 2 983 3 view .LVU397 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 1349 .loc 2 988 4 view .LVU398 + 1350 0406 0223 movs r3, #2 + 1351 .syntax unified + 1352 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 1353 0408 93FAA3F3 rbit r3, r3 + 1354 @ 0 "" 2 + 1355 .LVL97: + 1356 .loc 2 1001 3 view .LVU399 + 1357 .loc 2 1001 3 is_stmt 0 view .LVU400 + 1358 .thumb + 1359 .syntax unified + 1360 .LBE225: + 1361 .LBE224: + 1362 .loc 1 538 13 view .LVU401 + 1363 040c 734B ldr r3, .L134+4 + 1364 040e 596A ldr r1, [r3, #36] + 1365 .L73: + 1366 .LVL98: + 1367 .LBB226: + 1368 .LBI226: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 1369 .loc 2 981 31 is_stmt 1 discriminator 11 view .LVU402 + 1370 .LBB227: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 1371 .loc 2 983 3 discriminator 11 view .LVU403 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 1372 .loc 2 988 4 discriminator 11 view .LVU404 + 1373 0410 0223 movs r3, #2 + 1374 .syntax unified + 1375 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 1376 0412 93FAA3F3 rbit r3, r3 + 1377 @ 0 "" 2 + 1378 .LVL99: + 1379 .loc 2 1001 3 discriminator 11 view .LVU405 + 1380 .loc 2 1001 3 is_stmt 0 discriminator 11 view .LVU406 + 1381 .thumb + 1382 .syntax unified + 1383 .LBE227: + 1384 .LBE226: + ARM GAS /tmp/cczyIHoC.s page 56 + + + 1385 .loc 1 538 13 discriminator 11 view .LVU407 + 1386 0416 B3FA83F3 clz r3, r3 + 1387 041a 03F01F03 and r3, r3, #31 + 1388 041e 0122 movs r2, #1 + 1389 0420 02FA03F3 lsl r3, r2, r3 + 1390 .loc 1 538 49 discriminator 11 view .LVU408 + 1391 0424 1942 tst r1, r3 + 1392 0426 38D1 bne .L75 + 539:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 540:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + 1393 .loc 1 540 9 is_stmt 1 view .LVU409 + 1394 .loc 1 540 13 is_stmt 0 view .LVU410 + 1395 0428 FFF7FEFF bl HAL_GetTick + 1396 .LVL100: + 1397 .loc 1 540 27 view .LVU411 + 1398 042c 801B subs r0, r0, r6 + 1399 .loc 1 540 11 view .LVU412 + 1400 042e 41F28833 movw r3, #5000 + 1401 0432 9842 cmp r0, r3 + 1402 0434 00F2EC80 bhi .L105 + 1403 .L71: + 538:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 1404 .loc 1 538 49 is_stmt 1 view .LVU413 + 1405 .LVL101: + 1406 .LBB228: + 1407 .LBI228: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 1408 .loc 2 981 31 view .LVU414 + 1409 .LBB229: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 1410 .loc 2 983 3 view .LVU415 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 1411 .loc 2 988 4 view .LVU416 + 1412 0438 0223 movs r3, #2 + 1413 .syntax unified + 1414 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 1415 043a 93FAA3F2 rbit r2, r3 + 1416 @ 0 "" 2 + 1417 .LVL102: + 1418 .loc 2 1001 3 view .LVU417 + 1419 .loc 2 1001 3 is_stmt 0 view .LVU418 + 1420 .thumb + 1421 .syntax unified + 1422 .LBE229: + 1423 .LBE228: + 1424 .LBB230: + 1425 .LBI230: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 1426 .loc 2 981 31 is_stmt 1 view .LVU419 + 1427 .LBB231: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 1428 .loc 2 983 3 view .LVU420 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 1429 .loc 2 988 4 view .LVU421 + 1430 .syntax unified + 1431 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 1432 043e 93FAA3F3 rbit r3, r3 + ARM GAS /tmp/cczyIHoC.s page 57 + + + 1433 @ 0 "" 2 + 1434 .LVL103: + 1435 .loc 2 1001 3 view .LVU422 + 1436 .loc 2 1001 3 is_stmt 0 view .LVU423 + 1437 .thumb + 1438 .syntax unified + 1439 .LBE231: + 1440 .LBE230: + 538:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 1441 .loc 1 538 13 view .LVU424 + 1442 0442 002B cmp r3, #0 + 1443 0444 DFD0 beq .L72 + 538:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 1444 .loc 1 538 13 discriminator 4 view .LVU425 + 1445 0446 654B ldr r3, .L134+4 + 1446 0448 196A ldr r1, [r3, #32] + 1447 044a E1E7 b .L73 + 1448 .LVL104: + 1449 .L70: + 541:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 542:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** return HAL_TIMEOUT; + 543:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 544:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 545:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 546:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** else + 547:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 548:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Get Start Tick */ + 549:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** tickstart = HAL_GetTick(); + 1450 .loc 1 549 7 is_stmt 1 view .LVU426 + 1451 .loc 1 549 19 is_stmt 0 view .LVU427 + 1452 044c FFF7FEFF bl HAL_GetTick + 1453 .LVL105: + 1454 0450 0646 mov r6, r0 + 1455 .LVL106: + 550:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 551:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Wait till LSE is disabled */ + 552:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) + 1456 .loc 1 552 7 is_stmt 1 view .LVU428 + 1457 .loc 1 552 12 is_stmt 0 view .LVU429 + 1458 0452 18E0 b .L76 + 1459 .LVL107: + 1460 .L77: + 1461 .LBB232: + 1462 .LBI232: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 1463 .loc 2 981 31 is_stmt 1 view .LVU430 + 1464 .LBB233: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 1465 .loc 2 983 3 view .LVU431 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 1466 .loc 2 988 4 view .LVU432 + 1467 0454 0223 movs r3, #2 + 1468 .syntax unified + 1469 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 1470 0456 93FAA3F3 rbit r3, r3 + 1471 @ 0 "" 2 + 1472 .LVL108: + ARM GAS /tmp/cczyIHoC.s page 58 + + + 1473 .loc 2 1001 3 view .LVU433 + 1474 .loc 2 1001 3 is_stmt 0 view .LVU434 + 1475 .thumb + 1476 .syntax unified + 1477 .LBE233: + 1478 .LBE232: + 1479 .loc 1 552 13 view .LVU435 + 1480 045a 604B ldr r3, .L134+4 + 1481 045c 596A ldr r1, [r3, #36] + 1482 .L78: + 1483 .LVL109: + 1484 .LBB234: + 1485 .LBI234: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 1486 .loc 2 981 31 is_stmt 1 discriminator 11 view .LVU436 + 1487 .LBB235: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 1488 .loc 2 983 3 discriminator 11 view .LVU437 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 1489 .loc 2 988 4 discriminator 11 view .LVU438 + 1490 045e 0223 movs r3, #2 + 1491 .syntax unified + 1492 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 1493 0460 93FAA3F3 rbit r3, r3 + 1494 @ 0 "" 2 + 1495 .LVL110: + 1496 .loc 2 1001 3 discriminator 11 view .LVU439 + 1497 .loc 2 1001 3 is_stmt 0 discriminator 11 view .LVU440 + 1498 .thumb + 1499 .syntax unified + 1500 .LBE235: + 1501 .LBE234: + 1502 .loc 1 552 13 discriminator 11 view .LVU441 + 1503 0464 B3FA83F3 clz r3, r3 + 1504 0468 03F01F03 and r3, r3, #31 + 1505 046c 0122 movs r2, #1 + 1506 046e 02FA03F3 lsl r3, r2, r3 + 1507 .loc 1 552 49 discriminator 11 view .LVU442 + 1508 0472 1942 tst r1, r3 + 1509 0474 11D0 beq .L75 + 553:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 554:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + 1510 .loc 1 554 9 is_stmt 1 view .LVU443 + 1511 .loc 1 554 13 is_stmt 0 view .LVU444 + 1512 0476 FFF7FEFF bl HAL_GetTick + 1513 .LVL111: + 1514 .loc 1 554 27 view .LVU445 + 1515 047a 801B subs r0, r0, r6 + 1516 .loc 1 554 11 view .LVU446 + 1517 047c 41F28833 movw r3, #5000 + 1518 0480 9842 cmp r0, r3 + 1519 0482 00F2C780 bhi .L106 + 1520 .L76: + 552:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 1521 .loc 1 552 49 is_stmt 1 view .LVU447 + 1522 .LVL112: + 1523 .LBB236: + ARM GAS /tmp/cczyIHoC.s page 59 + + + 1524 .LBI236: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 1525 .loc 2 981 31 view .LVU448 + 1526 .LBB237: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 1527 .loc 2 983 3 view .LVU449 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 1528 .loc 2 988 4 view .LVU450 + 1529 0486 0223 movs r3, #2 + 1530 .syntax unified + 1531 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 1532 0488 93FAA3F2 rbit r2, r3 + 1533 @ 0 "" 2 + 1534 .LVL113: + 1535 .loc 2 1001 3 view .LVU451 + 1536 .loc 2 1001 3 is_stmt 0 view .LVU452 + 1537 .thumb + 1538 .syntax unified + 1539 .LBE237: + 1540 .LBE236: + 1541 .LBB238: + 1542 .LBI238: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 1543 .loc 2 981 31 is_stmt 1 view .LVU453 + 1544 .LBB239: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 1545 .loc 2 983 3 view .LVU454 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 1546 .loc 2 988 4 view .LVU455 + 1547 .syntax unified + 1548 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 1549 048c 93FAA3F3 rbit r3, r3 + 1550 @ 0 "" 2 + 1551 .LVL114: + 1552 .loc 2 1001 3 view .LVU456 + 1553 .loc 2 1001 3 is_stmt 0 view .LVU457 + 1554 .thumb + 1555 .syntax unified + 1556 .LBE239: + 1557 .LBE238: + 552:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 1558 .loc 1 552 13 view .LVU458 + 1559 0490 002B cmp r3, #0 + 1560 0492 DFD0 beq .L77 + 552:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 1561 .loc 1 552 13 discriminator 4 view .LVU459 + 1562 0494 514B ldr r3, .L134+4 + 1563 0496 196A ldr r1, [r3, #32] + 1564 0498 E1E7 b .L78 + 1565 .L75: + 555:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 556:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** return HAL_TIMEOUT; + 557:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 558:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 559:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 560:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 561:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Require to disable power clock if necessary */ + ARM GAS /tmp/cczyIHoC.s page 60 + + + 562:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if(pwrclkchanged == SET) + 1566 .loc 1 562 5 is_stmt 1 view .LVU460 + 1567 .loc 1 562 7 is_stmt 0 view .LVU461 + 1568 049a B5BB cbnz r5, .L127 + 1569 .LVL115: + 1570 .L61: + 1571 .loc 1 562 7 view .LVU462 + 1572 .LBE222: + 563:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 564:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** __HAL_RCC_PWR_CLK_DISABLE(); + 565:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 566:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 567:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 568:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /*-------------------------------- PLL Configuration -----------------------*/ + 569:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Check the parameters */ + 570:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** assert_param(IS_RCC_PLL(RCC_OscInitStruct->PLL.PLLState)); + 1573 .loc 1 570 3 is_stmt 1 view .LVU463 + 571:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if ((RCC_OscInitStruct->PLL.PLLState) != RCC_PLL_NONE) + 1574 .loc 1 571 3 view .LVU464 + 1575 .loc 1 571 30 is_stmt 0 view .LVU465 + 1576 049c E369 ldr r3, [r4, #28] + 1577 .loc 1 571 6 view .LVU466 + 1578 049e 002B cmp r3, #0 + 1579 04a0 00F0BA80 beq .L107 + 572:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 573:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Check if the PLL is used as system clock or not */ + 574:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if(__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_SYSCLKSOURCE_STATUS_PLLCLK) + 1580 .loc 1 574 5 is_stmt 1 view .LVU467 + 1581 .loc 1 574 8 is_stmt 0 view .LVU468 + 1582 04a4 4D4A ldr r2, .L134+4 + 1583 04a6 5268 ldr r2, [r2, #4] + 1584 04a8 02F00C02 and r2, r2, #12 + 1585 .loc 1 574 7 view .LVU469 + 1586 04ac 082A cmp r2, #8 + 1587 04ae 00F09980 beq .L80 + 575:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 576:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON) + 1588 .loc 1 576 7 is_stmt 1 view .LVU470 + 1589 .loc 1 576 9 is_stmt 0 view .LVU471 + 1590 04b2 022B cmp r3, #2 + 1591 04b4 2FD0 beq .L128 + 577:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 578:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Check the parameters */ + 579:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** assert_param(IS_RCC_PLLSOURCE(RCC_OscInitStruct->PLL.PLLSource)); + 580:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** assert_param(IS_RCC_PLL_MUL(RCC_OscInitStruct->PLL.PLLMUL)); + 581:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** #if defined(RCC_CFGR_PLLSRC_HSI_PREDIV) + 582:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** assert_param(IS_RCC_PREDIV(RCC_OscInitStruct->PLL.PREDIV)); + 583:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** #endif + 584:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 585:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Disable the main PLL. */ + 586:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** __HAL_RCC_PLL_DISABLE(); + 587:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 588:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Get Start Tick */ + 589:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** tickstart = HAL_GetTick(); + 590:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 591:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Wait till PLL is disabled */ + 592:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) + ARM GAS /tmp/cczyIHoC.s page 61 + + + 593:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 594:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + 595:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 596:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** return HAL_TIMEOUT; + 597:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 598:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 599:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 600:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** #if defined(RCC_CFGR_PLLSRC_HSI_PREDIV) + 601:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Configure the main PLL clock source, predivider and multiplication factor. */ + 602:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** __HAL_RCC_PLL_CONFIG(RCC_OscInitStruct->PLL.PLLSource, + 603:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** RCC_OscInitStruct->PLL.PREDIV, + 604:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** RCC_OscInitStruct->PLL.PLLMUL); + 605:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** #else + 606:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Configure the main PLL clock source and multiplication factor. */ + 607:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** __HAL_RCC_PLL_CONFIG(RCC_OscInitStruct->PLL.PLLSource, + 608:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** RCC_OscInitStruct->PLL.PLLMUL); + 609:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** #endif /* RCC_CFGR_PLLSRC_HSI_PREDIV */ + 610:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Enable the main PLL. */ + 611:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** __HAL_RCC_PLL_ENABLE(); + 612:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 613:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Get Start Tick */ + 614:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** tickstart = HAL_GetTick(); + 615:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 616:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Wait till PLL is ready */ + 617:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) + 618:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 619:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + 620:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 621:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** return HAL_TIMEOUT; + 622:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 623:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 624:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 625:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** else + 626:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 627:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Disable the main PLL. */ + 628:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** __HAL_RCC_PLL_DISABLE(); + 1592 .loc 1 628 9 is_stmt 1 view .LVU472 + 1593 .LVL116: + 1594 .LBB240: + 1595 .LBI240: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 1596 .loc 2 981 31 view .LVU473 + 1597 .LBB241: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 1598 .loc 2 983 3 view .LVU474 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 1599 .loc 2 988 4 view .LVU475 + 1600 04b6 4FF08073 mov r3, #16777216 + 1601 .syntax unified + 1602 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 1603 04ba 93FAA3F3 rbit r3, r3 + 1604 @ 0 "" 2 + 1605 .LVL117: + 1606 .loc 2 1001 3 view .LVU476 + 1607 .loc 2 1001 3 is_stmt 0 view .LVU477 + 1608 .thumb + 1609 .syntax unified + ARM GAS /tmp/cczyIHoC.s page 62 + + + 1610 .LBE241: + 1611 .LBE240: + 1612 .loc 1 628 9 view .LVU478 + 1613 04be B3FA83F3 clz r3, r3 + 1614 04c2 03F18453 add r3, r3, #276824064 + 1615 04c6 03F58413 add r3, r3, #1081344 + 1616 04ca 9B00 lsls r3, r3, #2 + 1617 04cc 0022 movs r2, #0 + 1618 04ce 1A60 str r2, [r3] + 629:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 630:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Get Start Tick */ + 631:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** tickstart = HAL_GetTick(); + 1619 .loc 1 631 9 is_stmt 1 view .LVU479 + 1620 .loc 1 631 21 is_stmt 0 view .LVU480 + 1621 04d0 FFF7FEFF bl HAL_GetTick + 1622 .LVL118: + 1623 04d4 0446 mov r4, r0 + 1624 .LVL119: + 632:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 633:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Wait till PLL is disabled */ + 634:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) + 1625 .loc 1 634 9 is_stmt 1 view .LVU481 + 1626 .L90: + 1627 .loc 1 634 52 view .LVU482 + 1628 .LBB242: + 1629 .LBI242: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 1630 .loc 2 981 31 view .LVU483 + 1631 .LBB243: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 1632 .loc 2 983 3 view .LVU484 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 1633 .loc 2 988 4 view .LVU485 + 1634 04d6 4FF00073 mov r3, #33554432 + 1635 .syntax unified + 1636 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 1637 04da 93FAA3F3 rbit r3, r3 + 1638 @ 0 "" 2 + 1639 .loc 2 1001 3 view .LVU486 + 1640 .LVL120: + 1641 .loc 2 1001 3 is_stmt 0 view .LVU487 + 1642 .thumb + 1643 .syntax unified + 1644 .LBE243: + 1645 .LBE242: + 1646 .loc 1 634 15 view .LVU488 + 1647 04de 3F4B ldr r3, .L134+4 + 1648 04e0 1968 ldr r1, [r3] + 1649 .LVL121: + 1650 .LBB244: + 1651 .LBI244: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 1652 .loc 2 981 31 is_stmt 1 view .LVU489 + 1653 .LBB245: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 1654 .loc 2 983 3 view .LVU490 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + ARM GAS /tmp/cczyIHoC.s page 63 + + + 1655 .loc 2 988 4 view .LVU491 + 1656 04e2 4FF00073 mov r3, #33554432 + 1657 .syntax unified + 1658 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 1659 04e6 93FAA3F3 rbit r3, r3 + 1660 @ 0 "" 2 + 1661 .LVL122: + 1662 .loc 2 1001 3 view .LVU492 + 1663 .loc 2 1001 3 is_stmt 0 view .LVU493 + 1664 .thumb + 1665 .syntax unified + 1666 .LBE245: + 1667 .LBE244: + 1668 .loc 1 634 15 view .LVU494 + 1669 04ea B3FA83F3 clz r3, r3 + 1670 04ee 03F01F03 and r3, r3, #31 + 1671 04f2 0122 movs r2, #1 + 1672 04f4 02FA03F3 lsl r3, r2, r3 + 1673 .loc 1 634 52 view .LVU495 + 1674 04f8 1942 tst r1, r3 + 1675 04fa 6BD0 beq .L129 + 635:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 636:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + 1676 .loc 1 636 11 is_stmt 1 view .LVU496 + 1677 .loc 1 636 15 is_stmt 0 view .LVU497 + 1678 04fc FFF7FEFF bl HAL_GetTick + 1679 .LVL123: + 1680 .loc 1 636 29 view .LVU498 + 1681 0500 001B subs r0, r0, r4 + 1682 .loc 1 636 13 view .LVU499 + 1683 0502 0228 cmp r0, #2 + 1684 0504 E7D9 bls .L90 + 637:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 638:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** return HAL_TIMEOUT; + 1685 .loc 1 638 20 view .LVU500 + 1686 0506 0320 movs r0, #3 + 1687 0508 87E0 b .L21 + 1688 .LVL124: + 1689 .L127: + 1690 .LBB246: + 564:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 1691 .loc 1 564 7 is_stmt 1 view .LVU501 + 1692 050a 344A ldr r2, .L134+4 + 1693 050c D369 ldr r3, [r2, #28] + 1694 050e 23F08053 bic r3, r3, #268435456 + 1695 0512 D361 str r3, [r2, #28] + 1696 0514 C2E7 b .L61 + 1697 .LVL125: + 1698 .L128: + 564:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 1699 .loc 1 564 7 is_stmt 0 view .LVU502 + 1700 .LBE246: + 579:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** assert_param(IS_RCC_PLL_MUL(RCC_OscInitStruct->PLL.PLLMUL)); + 1701 .loc 1 579 9 is_stmt 1 view .LVU503 + 580:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** #if defined(RCC_CFGR_PLLSRC_HSI_PREDIV) + 1702 .loc 1 580 9 view .LVU504 + 586:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + ARM GAS /tmp/cczyIHoC.s page 64 + + + 1703 .loc 1 586 9 view .LVU505 + 1704 .LBB247: + 1705 .LBI247: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 1706 .loc 2 981 31 view .LVU506 + 1707 .LBB248: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 1708 .loc 2 983 3 view .LVU507 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 1709 .loc 2 988 4 view .LVU508 + 1710 0516 4FF08073 mov r3, #16777216 + 1711 .syntax unified + 1712 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 1713 051a 93FAA3F3 rbit r3, r3 + 1714 @ 0 "" 2 + 1715 .LVL126: + 1716 .loc 2 1001 3 view .LVU509 + 1717 .loc 2 1001 3 is_stmt 0 view .LVU510 + 1718 .thumb + 1719 .syntax unified + 1720 .LBE248: + 1721 .LBE247: + 586:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 1722 .loc 1 586 9 view .LVU511 + 1723 051e B3FA83F3 clz r3, r3 + 1724 0522 03F18453 add r3, r3, #276824064 + 1725 0526 03F58413 add r3, r3, #1081344 + 1726 052a 9B00 lsls r3, r3, #2 + 1727 052c 0022 movs r2, #0 + 1728 052e 1A60 str r2, [r3] + 589:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 1729 .loc 1 589 9 is_stmt 1 view .LVU512 + 589:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 1730 .loc 1 589 21 is_stmt 0 view .LVU513 + 1731 0530 FFF7FEFF bl HAL_GetTick + 1732 .LVL127: + 1733 0534 0546 mov r5, r0 + 1734 .LVL128: + 592:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 1735 .loc 1 592 9 is_stmt 1 view .LVU514 + 1736 .L82: + 592:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 1737 .loc 1 592 52 view .LVU515 + 1738 .LBB249: + 1739 .LBI249: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 1740 .loc 2 981 31 view .LVU516 + 1741 .LBB250: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 1742 .loc 2 983 3 view .LVU517 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 1743 .loc 2 988 4 view .LVU518 + 1744 0536 4FF00073 mov r3, #33554432 + 1745 .syntax unified + 1746 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 1747 053a 93FAA3F3 rbit r3, r3 + 1748 @ 0 "" 2 + ARM GAS /tmp/cczyIHoC.s page 65 + + + 1749 .loc 2 1001 3 view .LVU519 + 1750 .LVL129: + 1751 .loc 2 1001 3 is_stmt 0 view .LVU520 + 1752 .thumb + 1753 .syntax unified + 1754 .LBE250: + 1755 .LBE249: + 592:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 1756 .loc 1 592 15 view .LVU521 + 1757 053e 274B ldr r3, .L134+4 + 1758 0540 1968 ldr r1, [r3] + 1759 .LVL130: + 1760 .LBB251: + 1761 .LBI251: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 1762 .loc 2 981 31 is_stmt 1 view .LVU522 + 1763 .LBB252: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 1764 .loc 2 983 3 view .LVU523 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 1765 .loc 2 988 4 view .LVU524 + 1766 0542 4FF00073 mov r3, #33554432 + 1767 .syntax unified + 1768 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 1769 0546 93FAA3F3 rbit r3, r3 + 1770 @ 0 "" 2 + 1771 .LVL131: + 1772 .loc 2 1001 3 view .LVU525 + 1773 .loc 2 1001 3 is_stmt 0 view .LVU526 + 1774 .thumb + 1775 .syntax unified + 1776 .LBE252: + 1777 .LBE251: + 592:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 1778 .loc 1 592 15 view .LVU527 + 1779 054a B3FA83F3 clz r3, r3 + 1780 054e 03F01F03 and r3, r3, #31 + 1781 0552 0122 movs r2, #1 + 1782 0554 02FA03F3 lsl r3, r2, r3 + 592:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 1783 .loc 1 592 52 view .LVU528 + 1784 0558 1942 tst r1, r3 + 1785 055a 06D0 beq .L130 + 594:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 1786 .loc 1 594 11 is_stmt 1 view .LVU529 + 594:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 1787 .loc 1 594 15 is_stmt 0 view .LVU530 + 1788 055c FFF7FEFF bl HAL_GetTick + 1789 .LVL132: + 594:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 1790 .loc 1 594 29 view .LVU531 + 1791 0560 401B subs r0, r0, r5 + 594:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 1792 .loc 1 594 13 view .LVU532 + 1793 0562 0228 cmp r0, #2 + 1794 0564 E7D9 bls .L82 + 596:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + ARM GAS /tmp/cczyIHoC.s page 66 + + + 1795 .loc 1 596 20 view .LVU533 + 1796 0566 0320 movs r0, #3 + 1797 0568 57E0 b .L21 + 1798 .L130: + 607:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** RCC_OscInitStruct->PLL.PLLMUL); + 1799 .loc 1 607 7 is_stmt 1 view .LVU534 + 1800 056a 1C49 ldr r1, .L134+4 + 1801 056c 4B68 ldr r3, [r1, #4] + 1802 056e 23F47413 bic r3, r3, #3997696 + 1803 0572 626A ldr r2, [r4, #36] + 1804 0574 206A ldr r0, [r4, #32] + 1805 0576 0243 orrs r2, r2, r0 + 1806 0578 1343 orrs r3, r3, r2 + 1807 057a 4B60 str r3, [r1, #4] + 611:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 1808 .loc 1 611 9 view .LVU535 + 1809 .LVL133: + 1810 .LBB253: + 1811 .LBI253: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 1812 .loc 2 981 31 view .LVU536 + 1813 .LBB254: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 1814 .loc 2 983 3 view .LVU537 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 1815 .loc 2 988 4 view .LVU538 + 1816 057c 4FF08073 mov r3, #16777216 + 1817 .syntax unified + 1818 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 1819 0580 93FAA3F3 rbit r3, r3 + 1820 @ 0 "" 2 + 1821 .LVL134: + 1822 .loc 2 1001 3 view .LVU539 + 1823 .loc 2 1001 3 is_stmt 0 view .LVU540 + 1824 .thumb + 1825 .syntax unified + 1826 .LBE254: + 1827 .LBE253: + 611:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 1828 .loc 1 611 9 view .LVU541 + 1829 0584 B3FA83F3 clz r3, r3 + 1830 0588 03F18453 add r3, r3, #276824064 + 1831 058c 03F58413 add r3, r3, #1081344 + 1832 0590 9B00 lsls r3, r3, #2 + 1833 0592 0122 movs r2, #1 + 1834 0594 1A60 str r2, [r3] + 614:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 1835 .loc 1 614 9 is_stmt 1 view .LVU542 + 614:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 1836 .loc 1 614 21 is_stmt 0 view .LVU543 + 1837 0596 FFF7FEFF bl HAL_GetTick + 1838 .LVL135: + 1839 059a 0446 mov r4, r0 + 1840 .LVL136: + 617:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 1841 .loc 1 617 9 is_stmt 1 view .LVU544 + 1842 .L86: + ARM GAS /tmp/cczyIHoC.s page 67 + + + 617:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 1843 .loc 1 617 52 view .LVU545 + 1844 .LBB255: + 1845 .LBI255: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 1846 .loc 2 981 31 view .LVU546 + 1847 .LBB256: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 1848 .loc 2 983 3 view .LVU547 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 1849 .loc 2 988 4 view .LVU548 + 1850 059c 4FF00073 mov r3, #33554432 + 1851 .syntax unified + 1852 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 1853 05a0 93FAA3F3 rbit r3, r3 + 1854 @ 0 "" 2 + 1855 .loc 2 1001 3 view .LVU549 + 1856 .LVL137: + 1857 .loc 2 1001 3 is_stmt 0 view .LVU550 + 1858 .thumb + 1859 .syntax unified + 1860 .LBE256: + 1861 .LBE255: + 617:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 1862 .loc 1 617 15 view .LVU551 + 1863 05a4 0D4B ldr r3, .L134+4 + 1864 05a6 1968 ldr r1, [r3] + 1865 .LVL138: + 1866 .LBB257: + 1867 .LBI257: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 1868 .loc 2 981 31 is_stmt 1 view .LVU552 + 1869 .LBB258: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 1870 .loc 2 983 3 view .LVU553 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 1871 .loc 2 988 4 view .LVU554 + 1872 05a8 4FF00073 mov r3, #33554432 + 1873 .syntax unified + 1874 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 1875 05ac 93FAA3F3 rbit r3, r3 + 1876 @ 0 "" 2 + 1877 .LVL139: + 1878 .loc 2 1001 3 view .LVU555 + 1879 .loc 2 1001 3 is_stmt 0 view .LVU556 + 1880 .thumb + 1881 .syntax unified + 1882 .LBE258: + 1883 .LBE257: + 617:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 1884 .loc 1 617 15 view .LVU557 + 1885 05b0 B3FA83F3 clz r3, r3 + 1886 05b4 03F01F03 and r3, r3, #31 + 1887 05b8 0122 movs r2, #1 + 1888 05ba 02FA03F3 lsl r3, r2, r3 + 617:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 1889 .loc 1 617 52 view .LVU558 + ARM GAS /tmp/cczyIHoC.s page 68 + + + 1890 05be 1942 tst r1, r3 + 1891 05c0 06D1 bne .L131 + 619:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 1892 .loc 1 619 11 is_stmt 1 view .LVU559 + 619:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 1893 .loc 1 619 15 is_stmt 0 view .LVU560 + 1894 05c2 FFF7FEFF bl HAL_GetTick + 1895 .LVL140: + 619:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 1896 .loc 1 619 29 view .LVU561 + 1897 05c6 001B subs r0, r0, r4 + 619:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 1898 .loc 1 619 13 view .LVU562 + 1899 05c8 0228 cmp r0, #2 + 1900 05ca E7D9 bls .L86 + 621:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 1901 .loc 1 621 20 view .LVU563 + 1902 05cc 0320 movs r0, #3 + 1903 05ce 24E0 b .L21 + 1904 .L131: + 639:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 640:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 641:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 642:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 643:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** else + 644:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 645:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Check if there is a request to disable the PLL used as System clock source */ + 646:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) + 647:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 648:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** return HAL_ERROR; + 649:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 650:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** else + 651:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 652:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Do not return HAL_ERROR if request repeats the current configuration */ + 653:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** pll_config = RCC->CFGR; + 654:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** #if defined(RCC_CFGR_PLLSRC_HSI_PREDIV) + 655:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** pll_config2 = RCC->CFGR2; + 656:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if((READ_BIT(pll_config, RCC_CFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || + 657:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (READ_BIT(pll_config, RCC_CFGR_PLLMUL) != RCC_OscInitStruct->PLL.PLLMUL) || + 658:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (READ_BIT(pll_config2, RCC_CFGR2_PREDIV) != RCC_OscInitStruct->PLL.PREDIV)) + 659:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** #else + 660:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if((READ_BIT(pll_config, RCC_CFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || + 661:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (READ_BIT(pll_config, RCC_CFGR_PLLMUL) != RCC_OscInitStruct->PLL.PLLMUL)) + 662:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** #endif + 663:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 664:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** return HAL_ERROR; + 665:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 666:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 667:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 668:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 669:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 670:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** return HAL_OK; + 1905 .loc 1 670 10 view .LVU564 + 1906 05d0 0020 movs r0, #0 + 1907 05d2 22E0 b .L21 + 1908 .L129: + 1909 .loc 1 670 10 view .LVU565 + ARM GAS /tmp/cczyIHoC.s page 69 + + + 1910 05d4 0020 movs r0, #0 + 1911 05d6 20E0 b .L21 + 1912 .L135: + 1913 .align 2 + 1914 .L134: + 1915 05d8 20819010 .word 277905696 + 1916 05dc 00100240 .word 1073876992 + 1917 05e0 00700040 .word 1073770496 + 1918 .LVL141: + 1919 .L80: + 646:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 1920 .loc 1 646 7 is_stmt 1 view .LVU566 + 646:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 1921 .loc 1 646 9 is_stmt 0 view .LVU567 + 1922 05e4 012B cmp r3, #1 + 1923 05e6 1AD0 beq .L111 + 653:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** #if defined(RCC_CFGR_PLLSRC_HSI_PREDIV) + 1924 .loc 1 653 9 is_stmt 1 view .LVU568 + 653:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** #if defined(RCC_CFGR_PLLSRC_HSI_PREDIV) + 1925 .loc 1 653 20 is_stmt 0 view .LVU569 + 1926 05e8 104B ldr r3, .L136 + 1927 05ea 5B68 ldr r3, [r3, #4] + 1928 .LVL142: + 660:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (READ_BIT(pll_config, RCC_CFGR_PLLMUL) != RCC_OscInitStruct->PLL.PLLMUL)) + 1929 .loc 1 660 9 is_stmt 1 view .LVU570 + 660:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (READ_BIT(pll_config, RCC_CFGR_PLLMUL) != RCC_OscInitStruct->PLL.PLLMUL)) + 1930 .loc 1 660 13 is_stmt 0 view .LVU571 + 1931 05ec 03F48031 and r1, r3, #65536 + 660:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (READ_BIT(pll_config, RCC_CFGR_PLLMUL) != RCC_OscInitStruct->PLL.PLLMUL)) + 1932 .loc 1 660 78 view .LVU572 + 1933 05f0 226A ldr r2, [r4, #32] + 660:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (READ_BIT(pll_config, RCC_CFGR_PLLMUL) != RCC_OscInitStruct->PLL.PLLMUL)) + 1934 .loc 1 660 11 view .LVU573 + 1935 05f2 9142 cmp r1, r2 + 1936 05f4 15D1 bne .L112 + 661:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** #endif + 1937 .loc 1 661 13 discriminator 1 view .LVU574 + 1938 05f6 03F47013 and r3, r3, #3932160 + 1939 .LVL143: + 661:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** #endif + 1940 .loc 1 661 78 discriminator 1 view .LVU575 + 1941 05fa 626A ldr r2, [r4, #36] + 660:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (READ_BIT(pll_config, RCC_CFGR_PLLMUL) != RCC_OscInitStruct->PLL.PLLMUL)) + 1942 .loc 1 660 90 discriminator 1 view .LVU576 + 1943 05fc 9342 cmp r3, r2 + 1944 05fe 12D1 bne .L113 + 1945 .loc 1 670 10 view .LVU577 + 1946 0600 0020 movs r0, #0 + 1947 0602 0AE0 b .L21 + 1948 .LVL144: + 1949 .L94: + 1950 .cfi_def_cfa_offset 0 + 1951 .cfi_restore 4 + 1952 .cfi_restore 5 + 1953 .cfi_restore 6 + 1954 .cfi_restore 14 + 327:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + ARM GAS /tmp/cczyIHoC.s page 70 + + + 1955 .loc 1 327 12 view .LVU578 + 1956 0604 0120 movs r0, #1 + 1957 .LVL145: + 671:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 1958 .loc 1 671 1 view .LVU579 + 1959 0606 7047 bx lr + 1960 .LVL146: + 1961 .L120: + 1962 .cfi_def_cfa_offset 24 + 1963 .cfi_offset 4, -16 + 1964 .cfi_offset 5, -12 + 1965 .cfi_offset 6, -8 + 1966 .cfi_offset 14, -4 + 345:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 1967 .loc 1 345 16 view .LVU580 + 1968 0608 0120 movs r0, #1 + 1969 .LVL147: + 345:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 1970 .loc 1 345 16 view .LVU581 + 1971 060a 06E0 b .L21 + 1972 .L98: + 403:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 1973 .loc 1 403 16 view .LVU582 + 1974 060c 0120 movs r0, #1 + 1975 060e 04E0 b .L21 + 1976 .LVL148: + 1977 .L105: + 1978 .LBB259: + 542:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 1979 .loc 1 542 18 view .LVU583 + 1980 0610 0320 movs r0, #3 + 1981 0612 02E0 b .L21 + 1982 .L106: + 556:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 1983 .loc 1 556 18 view .LVU584 + 1984 0614 0320 movs r0, #3 + 1985 0616 00E0 b .L21 + 1986 .LVL149: + 1987 .L107: + 556:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 1988 .loc 1 556 18 view .LVU585 + 1989 .LBE259: + 670:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 1990 .loc 1 670 10 view .LVU586 + 1991 0618 0020 movs r0, #0 + 1992 .LVL150: + 1993 .L21: + 1994 .loc 1 671 1 view .LVU587 + 1995 061a 02B0 add sp, sp, #8 + 1996 .cfi_remember_state + 1997 .cfi_def_cfa_offset 16 + 1998 @ sp needed + 1999 061c 70BD pop {r4, r5, r6, pc} + 2000 .LVL151: + 2001 .L111: + 2002 .cfi_restore_state + 648:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + ARM GAS /tmp/cczyIHoC.s page 71 + + + 2003 .loc 1 648 16 view .LVU588 + 2004 061e 0120 movs r0, #1 + 2005 0620 FBE7 b .L21 + 2006 .LVL152: + 2007 .L112: + 664:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 2008 .loc 1 664 18 view .LVU589 + 2009 0622 0120 movs r0, #1 + 2010 0624 F9E7 b .L21 + 2011 .LVL153: + 2012 .L113: + 664:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 2013 .loc 1 664 18 view .LVU590 + 2014 0626 0120 movs r0, #1 + 2015 0628 F7E7 b .L21 + 2016 .L137: + 2017 062a 00BF .align 2 + 2018 .L136: + 2019 062c 00100240 .word 1073876992 + 2020 .cfi_endproc + 2021 .LFE131: + 2023 .section .text.HAL_RCC_MCOConfig,"ax",%progbits + 2024 .align 1 + 2025 .global HAL_RCC_MCOConfig + 2026 .syntax unified + 2027 .thumb + 2028 .thumb_func + 2030 HAL_RCC_MCOConfig: + 2031 .LVL154: + 2032 .LFB133: + 672:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 673:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /** + 674:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @brief Initializes the CPU, AHB and APB buses clocks according to the specified + 675:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * parameters in the RCC_ClkInitStruct. + 676:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @param RCC_ClkInitStruct pointer to an RCC_OscInitTypeDef structure that + 677:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * contains the configuration information for the RCC peripheral. + 678:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @param FLatency FLASH Latency + 679:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * The value of this parameter depend on device used within the same series + 680:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @note The SystemCoreClock CMSIS variable is used to store System Clock Frequency + 681:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * and updated by @ref HAL_RCC_GetHCLKFreq() function called within this function + 682:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * + 683:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @note The HSI is used (enabled by hardware) as system clock source after + 684:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * start-up from Reset, wake-up from STOP and STANDBY mode, or in case + 685:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * of failure of the HSE used directly or indirectly as system clock + 686:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * (if the Clock Security System CSS is enabled). + 687:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * + 688:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @note A switch from one clock source to another occurs only if the target + 689:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * clock source is ready (clock stable after start-up delay or PLL locked). + 690:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * If a clock source which is not yet ready is selected, the switch will + 691:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * occur when the clock source will be ready. + 692:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * You can use @ref HAL_RCC_GetClockConfig() function to know which clock is + 693:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * currently used as system clock source. + 694:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @retval HAL status + 695:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** */ + 696:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t FLatency) + 697:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 698:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** uint32_t tickstart = 0U; + ARM GAS /tmp/cczyIHoC.s page 72 + + + 699:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 700:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Check Null pointer */ + 701:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if(RCC_ClkInitStruct == NULL) + 702:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 703:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** return HAL_ERROR; + 704:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 705:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 706:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Check the parameters */ + 707:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** assert_param(IS_RCC_CLOCKTYPE(RCC_ClkInitStruct->ClockType)); + 708:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** assert_param(IS_FLASH_LATENCY(FLatency)); + 709:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 710:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* To correctly read data from FLASH memory, the number of wait states (LATENCY) + 711:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** must be correctly programmed according to the frequency of the CPU clock + 712:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** (HCLK) of the device. */ + 713:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 714:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Increasing the number of wait states because of higher CPU frequency */ + 715:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if(FLatency > __HAL_FLASH_GET_LATENCY()) + 716:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 717:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ + 718:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** __HAL_FLASH_SET_LATENCY(FLatency); + 719:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 720:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Check that the new number of wait states is taken into account to access the Flash + 721:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** memory by reading the FLASH_ACR register */ + 722:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if(__HAL_FLASH_GET_LATENCY() != FLatency) + 723:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 724:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** return HAL_ERROR; + 725:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 726:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 727:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 728:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /*-------------------------- HCLK Configuration --------------------------*/ + 729:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_HCLK) == RCC_CLOCKTYPE_HCLK) + 730:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 731:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** assert_param(IS_RCC_HCLK(RCC_ClkInitStruct->AHBCLKDivider)); + 732:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, RCC_ClkInitStruct->AHBCLKDivider); + 733:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 734:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 735:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /*------------------------- SYSCLK Configuration ---------------------------*/ + 736:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_SYSCLK) == RCC_CLOCKTYPE_SYSCLK) + 737:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 738:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** assert_param(IS_RCC_SYSCLKSOURCE(RCC_ClkInitStruct->SYSCLKSource)); + 739:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 740:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* HSE is selected as System Clock Source */ + 741:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if(RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_HSE) + 742:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 743:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Check the HSE ready flag */ + 744:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) + 745:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 746:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** return HAL_ERROR; + 747:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 748:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 749:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* PLL is selected as System Clock Source */ + 750:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** else if(RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLCLK) + 751:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 752:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Check the PLL ready flag */ + 753:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) + 754:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 755:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** return HAL_ERROR; + ARM GAS /tmp/cczyIHoC.s page 73 + + + 756:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 757:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 758:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* HSI is selected as System Clock Source */ + 759:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** else + 760:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 761:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Check the HSI ready flag */ + 762:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) + 763:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 764:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** return HAL_ERROR; + 765:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 766:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 767:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 768:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** __HAL_RCC_SYSCLK_CONFIG(RCC_ClkInitStruct->SYSCLKSource); + 769:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 770:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Get Start Tick */ + 771:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** tickstart = HAL_GetTick(); + 772:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 773:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** while (__HAL_RCC_GET_SYSCLK_SOURCE() != (RCC_ClkInitStruct->SYSCLKSource << RCC_CFGR_SWS_Pos)) + 774:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 775:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if ((HAL_GetTick() - tickstart) > CLOCKSWITCH_TIMEOUT_VALUE) + 776:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 777:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** return HAL_TIMEOUT; + 778:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 779:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 780:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 781:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Decreasing the number of wait states because of lower CPU frequency */ + 782:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if(FLatency < __HAL_FLASH_GET_LATENCY()) + 783:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 784:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ + 785:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** __HAL_FLASH_SET_LATENCY(FLatency); + 786:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 787:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Check that the new number of wait states is taken into account to access the Flash + 788:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** memory by reading the FLASH_ACR register */ + 789:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if(__HAL_FLASH_GET_LATENCY() != FLatency) + 790:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 791:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** return HAL_ERROR; + 792:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 793:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 794:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 795:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /*-------------------------- PCLK1 Configuration ---------------------------*/ + 796:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) + 797:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 798:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB1CLKDivider)); + 799:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_ClkInitStruct->APB1CLKDivider); + 800:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 801:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 802:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /*-------------------------- PCLK2 Configuration ---------------------------*/ + 803:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) + 804:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 805:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB2CLKDivider)); + 806:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, ((RCC_ClkInitStruct->APB2CLKDivider) << 3U)); + 807:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 808:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 809:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Update the SystemCoreClock global variable */ + 810:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** SystemCoreClock = HAL_RCC_GetSysClockFreq() >> AHBPrescTable[(RCC->CFGR & RCC_CFGR_HPRE)>> RCC_CF + 811:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 812:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Configure the source of time base considering new system clocks settings*/ + ARM GAS /tmp/cczyIHoC.s page 74 + + + 813:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** HAL_InitTick (uwTickPrio); + 814:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 815:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** return HAL_OK; + 816:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 817:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 818:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /** + 819:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @} + 820:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** */ + 821:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 822:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /** @defgroup RCC_Exported_Functions_Group2 Peripheral Control functions + 823:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @brief RCC clocks control functions + 824:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * + 825:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** @verbatim + 826:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** =============================================================================== + 827:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** ##### Peripheral Control functions ##### + 828:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** =============================================================================== + 829:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** [..] + 830:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** This subsection provides a set of functions allowing to control the RCC Clocks + 831:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** frequencies. + 832:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 833:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** @endverbatim + 834:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @{ + 835:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** */ + 836:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 837:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** #if defined(RCC_CFGR_MCOPRE) + 838:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /** + 839:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @brief Selects the clock source to output on MCO pin. + 840:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @note MCO pin should be configured in alternate function mode. + 841:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @param RCC_MCOx specifies the output direction for the clock source. + 842:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * This parameter can be one of the following values: + 843:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @arg @ref RCC_MCO1 Clock source to output on MCO1 pin(PA8). + 844:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @param RCC_MCOSource specifies the clock source to output. + 845:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * This parameter can be one of the following values: + 846:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @arg @ref RCC_MCO1SOURCE_NOCLOCK No clock selected + 847:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @arg @ref RCC_MCO1SOURCE_SYSCLK System Clock selected as MCO clock + 848:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @arg @ref RCC_MCO1SOURCE_HSI HSI selected as MCO clock + 849:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @arg @ref RCC_MCO1SOURCE_HSE HSE selected as MCO clock + 850:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @arg @ref RCC_MCO1SOURCE_LSI LSI selected as MCO clock + 851:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @arg @ref RCC_MCO1SOURCE_LSE LSE selected as MCO clock + 852:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @arg @ref RCC_MCO1SOURCE_PLLCLK PLLCLK selected as MCO clock + 853:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @arg @ref RCC_MCO1SOURCE_PLLCLK_DIV2 PLLCLK Divided by 2 selected as MCO clock + 854:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @param RCC_MCODiv specifies the MCO DIV. + 855:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * This parameter can be one of the following values: + 856:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @arg @ref RCC_MCODIV_1 no division applied to MCO clock + 857:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @arg @ref RCC_MCODIV_2 division by 2 applied to MCO clock + 858:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @arg @ref RCC_MCODIV_4 division by 4 applied to MCO clock + 859:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @arg @ref RCC_MCODIV_8 division by 8 applied to MCO clock + 860:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @arg @ref RCC_MCODIV_16 division by 16 applied to MCO clock + 861:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @arg @ref RCC_MCODIV_32 division by 32 applied to MCO clock + 862:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @arg @ref RCC_MCODIV_64 division by 64 applied to MCO clock + 863:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @arg @ref RCC_MCODIV_128 division by 128 applied to MCO clock + 864:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @retval None + 865:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** */ + 866:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** #else + 867:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /** + 868:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @brief Selects the clock source to output on MCO pin. + 869:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @note MCO pin should be configured in alternate function mode. + ARM GAS /tmp/cczyIHoC.s page 75 + + + 870:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @param RCC_MCOx specifies the output direction for the clock source. + 871:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * This parameter can be one of the following values: + 872:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @arg @ref RCC_MCO1 Clock source to output on MCO1 pin(PA8). + 873:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @param RCC_MCOSource specifies the clock source to output. + 874:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * This parameter can be one of the following values: + 875:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @arg @ref RCC_MCO1SOURCE_NOCLOCK No clock selected as MCO clock + 876:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @arg @ref RCC_MCO1SOURCE_SYSCLK System clock selected as MCO clock + 877:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @arg @ref RCC_MCO1SOURCE_HSI HSI selected as MCO clock + 878:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @arg @ref RCC_MCO1SOURCE_HSE HSE selected as MCO clock + 879:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @arg @ref RCC_MCO1SOURCE_LSI LSI selected as MCO clock + 880:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @arg @ref RCC_MCO1SOURCE_LSE LSE selected as MCO clock + 881:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @arg @ref RCC_MCO1SOURCE_PLLCLK_DIV2 PLLCLK Divided by 2 selected as MCO clock + 882:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @param RCC_MCODiv specifies the MCO DIV. + 883:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * This parameter can be one of the following values: + 884:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @arg @ref RCC_MCODIV_1 no division applied to MCO clock + 885:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @retval None + 886:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** */ + 887:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** #endif + 888:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** void HAL_RCC_MCOConfig(uint32_t RCC_MCOx, uint32_t RCC_MCOSource, uint32_t RCC_MCODiv) + 889:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2033 .loc 1 889 1 is_stmt 1 view -0 + 2034 .cfi_startproc + 2035 @ args = 0, pretend = 0, frame = 24 + 2036 @ frame_needed = 0, uses_anonymous_args = 0 + 2037 .loc 1 889 1 is_stmt 0 view .LVU592 + 2038 0000 30B5 push {r4, r5, lr} + 2039 .cfi_def_cfa_offset 12 + 2040 .cfi_offset 4, -12 + 2041 .cfi_offset 5, -8 + 2042 .cfi_offset 14, -4 + 2043 0002 87B0 sub sp, sp, #28 + 2044 .cfi_def_cfa_offset 40 + 2045 0004 0D46 mov r5, r1 + 890:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** GPIO_InitTypeDef gpio; + 2046 .loc 1 890 3 is_stmt 1 view .LVU593 + 891:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 892:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Check the parameters */ + 893:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** assert_param(IS_RCC_MCO(RCC_MCOx)); + 2047 .loc 1 893 3 view .LVU594 + 894:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** assert_param(IS_RCC_MCODIV(RCC_MCODiv)); + 2048 .loc 1 894 3 view .LVU595 + 895:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** assert_param(IS_RCC_MCO1SOURCE(RCC_MCOSource)); + 2049 .loc 1 895 3 view .LVU596 + 896:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 897:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Configure the MCO1 pin in alternate function mode */ + 898:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** gpio.Mode = GPIO_MODE_AF_PP; + 2050 .loc 1 898 3 view .LVU597 + 2051 .loc 1 898 18 is_stmt 0 view .LVU598 + 2052 0006 0223 movs r3, #2 + 2053 0008 0293 str r3, [sp, #8] + 899:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** gpio.Speed = GPIO_SPEED_FREQ_HIGH; + 2054 .loc 1 899 3 is_stmt 1 view .LVU599 + 2055 .loc 1 899 18 is_stmt 0 view .LVU600 + 2056 000a 0323 movs r3, #3 + 2057 000c 0493 str r3, [sp, #16] + 900:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** gpio.Pull = GPIO_NOPULL; + 2058 .loc 1 900 3 is_stmt 1 view .LVU601 + ARM GAS /tmp/cczyIHoC.s page 76 + + + 2059 .loc 1 900 18 is_stmt 0 view .LVU602 + 2060 000e 0023 movs r3, #0 + 2061 0010 0393 str r3, [sp, #12] + 901:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** gpio.Pin = MCO1_PIN; + 2062 .loc 1 901 3 is_stmt 1 view .LVU603 + 2063 .loc 1 901 18 is_stmt 0 view .LVU604 + 2064 0012 4FF48072 mov r2, #256 + 2065 .LVL155: + 2066 .loc 1 901 18 view .LVU605 + 2067 0016 0192 str r2, [sp, #4] + 902:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** gpio.Alternate = GPIO_AF0_MCO; + 2068 .loc 1 902 3 is_stmt 1 view .LVU606 + 2069 .loc 1 902 18 is_stmt 0 view .LVU607 + 2070 0018 0593 str r3, [sp, #20] + 903:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 904:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* MCO1 Clock Enable */ + 905:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** MCO1_CLK_ENABLE(); + 2071 .loc 1 905 3 is_stmt 1 view .LVU608 + 2072 .LBB260: + 2073 .loc 1 905 3 view .LVU609 + 2074 .loc 1 905 3 view .LVU610 + 2075 001a 0B4C ldr r4, .L140 + 2076 001c 6369 ldr r3, [r4, #20] + 2077 001e 43F40033 orr r3, r3, #131072 + 2078 0022 6361 str r3, [r4, #20] + 2079 .loc 1 905 3 view .LVU611 + 2080 0024 6369 ldr r3, [r4, #20] + 2081 0026 03F40033 and r3, r3, #131072 + 2082 002a 0093 str r3, [sp] + 2083 .loc 1 905 3 view .LVU612 + 2084 002c 009B ldr r3, [sp] + 2085 .LBE260: + 2086 .loc 1 905 3 view .LVU613 + 906:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 907:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** HAL_GPIO_Init(MCO1_GPIO_PORT, &gpio); + 2087 .loc 1 907 3 view .LVU614 + 2088 002e 01A9 add r1, sp, #4 + 2089 .LVL156: + 2090 .loc 1 907 3 is_stmt 0 view .LVU615 + 2091 0030 4FF09040 mov r0, #1207959552 + 2092 .LVL157: + 2093 .loc 1 907 3 view .LVU616 + 2094 0034 FFF7FEFF bl HAL_GPIO_Init + 2095 .LVL158: + 908:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 909:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Configure the MCO clock source */ + 910:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** __HAL_RCC_MCO1_CONFIG(RCC_MCOSource, RCC_MCODiv); + 2096 .loc 1 910 3 is_stmt 1 view .LVU617 + 2097 0038 6368 ldr r3, [r4, #4] + 2098 003a 23F0E063 bic r3, r3, #117440512 + 2099 003e 2B43 orrs r3, r3, r5 + 2100 0040 6360 str r3, [r4, #4] + 911:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 2101 .loc 1 911 1 is_stmt 0 view .LVU618 + 2102 0042 07B0 add sp, sp, #28 + 2103 .cfi_def_cfa_offset 12 + 2104 @ sp needed + ARM GAS /tmp/cczyIHoC.s page 77 + + + 2105 0044 30BD pop {r4, r5, pc} + 2106 .LVL159: + 2107 .L141: + 2108 .loc 1 911 1 view .LVU619 + 2109 0046 00BF .align 2 + 2110 .L140: + 2111 0048 00100240 .word 1073876992 + 2112 .cfi_endproc + 2113 .LFE133: + 2115 .section .text.HAL_RCC_EnableCSS,"ax",%progbits + 2116 .align 1 + 2117 .global HAL_RCC_EnableCSS + 2118 .syntax unified + 2119 .thumb + 2120 .thumb_func + 2122 HAL_RCC_EnableCSS: + 2123 .LFB134: + 912:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 913:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /** + 914:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @brief Enables the Clock Security System. + 915:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @note If a failure is detected on the HSE oscillator clock, this oscillator + 916:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * is automatically disabled and an interrupt is generated to inform the + 917:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * software about the failure (Clock Security System Interrupt, CSSI), + 918:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * allowing the MCU to perform rescue operations. The CSSI is linked to + 919:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * the Cortex-M4 NMI (Non-Maskable Interrupt) exception vector. + 920:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @retval None + 921:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** */ + 922:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** void HAL_RCC_EnableCSS(void) + 923:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2124 .loc 1 923 1 is_stmt 1 view -0 + 2125 .cfi_startproc + 2126 @ args = 0, pretend = 0, frame = 0 + 2127 @ frame_needed = 0, uses_anonymous_args = 0 + 2128 @ link register save eliminated. + 924:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** *(__IO uint32_t *) RCC_CR_CSSON_BB = (uint32_t)ENABLE; + 2129 .loc 1 924 3 view .LVU621 + 2130 .LVL160: + 2131 .LBB261: + 2132 .LBI261: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 2133 .loc 2 981 31 view .LVU622 + 2134 .LBB262: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 2135 .loc 2 983 3 view .LVU623 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 2136 .loc 2 988 4 view .LVU624 + 2137 0000 4FF40023 mov r3, #524288 + 2138 .syntax unified + 2139 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 2140 0004 93FAA3F3 rbit r3, r3 + 2141 @ 0 "" 2 + 2142 .LVL161: + 2143 .loc 2 1001 3 view .LVU625 + 2144 .loc 2 1001 3 is_stmt 0 view .LVU626 + 2145 .thumb + 2146 .syntax unified + 2147 .LBE262: + ARM GAS /tmp/cczyIHoC.s page 78 + + + 2148 .LBE261: + 2149 .loc 1 924 22 view .LVU627 + 2150 0008 B3FA83F3 clz r3, r3 + 2151 000c 03F18453 add r3, r3, #276824064 + 2152 0010 03F58413 add r3, r3, #1081344 + 2153 0014 9B00 lsls r3, r3, #2 + 2154 .loc 1 924 38 view .LVU628 + 2155 0016 0122 movs r2, #1 + 2156 0018 1A60 str r2, [r3] + 925:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 2157 .loc 1 925 1 view .LVU629 + 2158 001a 7047 bx lr + 2159 .cfi_endproc + 2160 .LFE134: + 2162 .section .text.HAL_RCC_DisableCSS,"ax",%progbits + 2163 .align 1 + 2164 .global HAL_RCC_DisableCSS + 2165 .syntax unified + 2166 .thumb + 2167 .thumb_func + 2169 HAL_RCC_DisableCSS: + 2170 .LFB135: + 926:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 927:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /** + 928:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @brief Disables the Clock Security System. + 929:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @retval None + 930:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** */ + 931:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** void HAL_RCC_DisableCSS(void) + 932:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2171 .loc 1 932 1 is_stmt 1 view -0 + 2172 .cfi_startproc + 2173 @ args = 0, pretend = 0, frame = 0 + 2174 @ frame_needed = 0, uses_anonymous_args = 0 + 2175 @ link register save eliminated. + 933:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** *(__IO uint32_t *) RCC_CR_CSSON_BB = (uint32_t)DISABLE; + 2176 .loc 1 933 3 view .LVU631 + 2177 .LVL162: + 2178 .LBB263: + 2179 .LBI263: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 2180 .loc 2 981 31 view .LVU632 + 2181 .LBB264: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 2182 .loc 2 983 3 view .LVU633 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 2183 .loc 2 988 4 view .LVU634 + 2184 0000 4FF40023 mov r3, #524288 + 2185 .syntax unified + 2186 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 2187 0004 93FAA3F3 rbit r3, r3 + 2188 @ 0 "" 2 + 2189 .LVL163: + 2190 .loc 2 1001 3 view .LVU635 + 2191 .loc 2 1001 3 is_stmt 0 view .LVU636 + 2192 .thumb + 2193 .syntax unified + 2194 .LBE264: + ARM GAS /tmp/cczyIHoC.s page 79 + + + 2195 .LBE263: + 2196 .loc 1 933 22 view .LVU637 + 2197 0008 B3FA83F3 clz r3, r3 + 2198 000c 03F18453 add r3, r3, #276824064 + 2199 0010 03F58413 add r3, r3, #1081344 + 2200 0014 9B00 lsls r3, r3, #2 + 2201 .loc 1 933 38 view .LVU638 + 2202 0016 0022 movs r2, #0 + 2203 0018 1A60 str r2, [r3] + 934:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 2204 .loc 1 934 1 view .LVU639 + 2205 001a 7047 bx lr + 2206 .cfi_endproc + 2207 .LFE135: + 2209 .section .text.HAL_RCC_GetSysClockFreq,"ax",%progbits + 2210 .align 1 + 2211 .global HAL_RCC_GetSysClockFreq + 2212 .syntax unified + 2213 .thumb + 2214 .thumb_func + 2216 HAL_RCC_GetSysClockFreq: + 2217 .LFB136: + 935:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 936:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /** + 937:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @brief Returns the SYSCLK frequency + 938:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @note The system frequency computed by this function is not the real + 939:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * frequency in the chip. It is calculated based on the predefined + 940:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * constant and the selected clock source: + 941:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @note If SYSCLK source is HSI, function returns values based on HSI_VALUE(*) + 942:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @note If SYSCLK source is HSE, function returns a value based on HSE_VALUE + 943:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * divided by PREDIV factor(**) + 944:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @note If SYSCLK source is PLL, function returns a value based on HSE_VALUE + 945:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * divided by PREDIV factor(**) or HSI_VALUE(*) multiplied by the PLL factor. + 946:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @note (*) HSI_VALUE is a constant defined in stm32f3xx_hal_conf.h file (default value + 947:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * 8 MHz) but the real value may vary depending on the variations + 948:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * in voltage and temperature. + 949:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @note (**) HSE_VALUE is a constant defined in stm32f3xx_hal_conf.h file (default value + 950:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * 8 MHz), user has to ensure that HSE_VALUE is same as the real + 951:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * frequency of the crystal used. Otherwise, this function may + 952:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * have wrong result. + 953:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * + 954:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @note The result of this function could be not correct when using fractional + 955:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * value for HSE crystal. + 956:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * + 957:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @note This function can be used by the user application to compute the + 958:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * baud-rate for the communication peripherals or configure other parameters. + 959:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * + 960:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @note Each time SYSCLK changes, this function must be called to update the + 961:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * right SYSCLK value. Otherwise, any configuration based on this function will be incorre + 962:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * + 963:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @retval SYSCLK frequency + 964:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** */ + 965:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** uint32_t HAL_RCC_GetSysClockFreq(void) + 966:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2218 .loc 1 966 1 is_stmt 1 view -0 + 2219 .cfi_startproc + 2220 @ args = 0, pretend = 0, frame = 0 + ARM GAS /tmp/cczyIHoC.s page 80 + + + 2221 @ frame_needed = 0, uses_anonymous_args = 0 + 2222 @ link register save eliminated. + 967:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** uint32_t tmpreg = 0U, prediv = 0U, pllclk = 0U, pllmul = 0U; + 2223 .loc 1 967 3 view .LVU641 + 2224 .LVL164: + 968:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** uint32_t sysclockfreq = 0U; + 2225 .loc 1 968 3 view .LVU642 + 969:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 970:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** tmpreg = RCC->CFGR; + 2226 .loc 1 970 3 view .LVU643 + 2227 .loc 1 970 10 is_stmt 0 view .LVU644 + 2228 0000 184B ldr r3, .L149 + 2229 0002 5A68 ldr r2, [r3, #4] + 2230 .LVL165: + 971:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 972:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Get SYSCLK source -------------------------------------------------------*/ + 973:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** switch (tmpreg & RCC_CFGR_SWS) + 2231 .loc 1 973 3 is_stmt 1 view .LVU645 + 2232 .loc 1 973 18 is_stmt 0 view .LVU646 + 2233 0004 02F00C03 and r3, r2, #12 + 2234 .loc 1 973 3 view .LVU647 + 2235 0008 042B cmp r3, #4 + 2236 000a 26D0 beq .L147 + 2237 000c 082B cmp r3, #8 + 2238 000e 26D1 bne .L148 + 974:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 975:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** case RCC_SYSCLKSOURCE_STATUS_HSE: /* HSE used as system clock */ + 976:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 977:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** sysclockfreq = HSE_VALUE; + 978:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** break; + 979:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 980:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** case RCC_SYSCLKSOURCE_STATUS_PLLCLK: /* PLL used as system clock */ + 981:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 982:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** pllmul = aPLLMULFactorTable[(uint32_t)(tmpreg & RCC_CFGR_PLLMUL) >> POSITION_VAL(RCC_CFGR_PLL + 2239 .loc 1 982 7 is_stmt 1 view .LVU648 + 2240 .loc 1 982 35 is_stmt 0 view .LVU649 + 2241 0010 02F47011 and r1, r2, #3932160 + 2242 .LVL166: + 2243 .LBB265: + 2244 .LBI265: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 2245 .loc 2 981 31 is_stmt 1 view .LVU650 + 2246 .LBB266: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 2247 .loc 2 983 3 view .LVU651 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 2248 .loc 2 988 4 view .LVU652 + 2249 0014 4FF47013 mov r3, #3932160 + 2250 .syntax unified + 2251 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 2252 0018 93FAA3F3 rbit r3, r3 + 2253 @ 0 "" 2 + 2254 .LVL167: + 2255 .loc 2 1001 3 view .LVU653 + 2256 .loc 2 1001 3 is_stmt 0 view .LVU654 + 2257 .thumb + 2258 .syntax unified + ARM GAS /tmp/cczyIHoC.s page 81 + + + 2259 .LBE266: + 2260 .LBE265: + 2261 .loc 1 982 72 view .LVU655 + 2262 001c B3FA83F3 clz r3, r3 + 2263 0020 21FA03F3 lsr r3, r1, r3 + 2264 .loc 1 982 34 view .LVU656 + 2265 0024 1049 ldr r1, .L149+4 + 2266 0026 C85C ldrb r0, [r1, r3] @ zero_extendqisi2 + 2267 .LVL168: + 983:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** prediv = aPredivFactorTable[(uint32_t)(RCC->CFGR2 & RCC_CFGR2_PREDIV) >> POSITION_VAL(RCC_CFG + 2268 .loc 1 983 7 is_stmt 1 view .LVU657 + 2269 .loc 1 983 49 is_stmt 0 view .LVU658 + 2270 0028 0E4B ldr r3, .L149 + 2271 002a DB6A ldr r3, [r3, #44] + 2272 .loc 1 983 35 view .LVU659 + 2273 002c 03F00F03 and r3, r3, #15 + 2274 .LVL169: + 2275 .LBB267: + 2276 .LBI267: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 2277 .loc 2 981 31 is_stmt 1 view .LVU660 + 2278 .LBB268: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 2279 .loc 2 983 3 view .LVU661 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 2280 .loc 2 988 4 view .LVU662 + 2281 0030 0F21 movs r1, #15 + 2282 .syntax unified + 2283 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 2284 0032 91FAA1F1 rbit r1, r1 + 2285 @ 0 "" 2 + 2286 .LVL170: + 2287 .loc 2 1001 3 view .LVU663 + 2288 .loc 2 1001 3 is_stmt 0 view .LVU664 + 2289 .thumb + 2290 .syntax unified + 2291 .LBE268: + 2292 .LBE267: + 2293 .loc 1 983 77 view .LVU665 + 2294 0036 B1FA81F1 clz r1, r1 + 2295 003a CB40 lsrs r3, r3, r1 + 2296 .loc 1 983 34 view .LVU666 + 2297 003c 0B49 ldr r1, .L149+8 + 2298 003e C95C ldrb r1, [r1, r3] @ zero_extendqisi2 + 2299 .LVL171: + 984:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** #if defined(RCC_CFGR_PLLSRC_HSI_DIV2) + 985:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if ((tmpreg & RCC_CFGR_PLLSRC) != RCC_PLLSOURCE_HSI) + 2300 .loc 1 985 7 is_stmt 1 view .LVU667 + 2301 .loc 1 985 10 is_stmt 0 view .LVU668 + 2302 0040 12F4803F tst r2, #65536 + 2303 0044 05D0 beq .L146 + 986:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 987:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* HSE used as PLL clock source : PLLCLK = HSE/PREDIV * PLLMUL */ + 988:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** pllclk = (uint32_t)((uint64_t) HSE_VALUE / (uint64_t) (prediv)) * ((uint64_t) pllmul); + 2304 .loc 1 988 9 is_stmt 1 view .LVU669 + 2305 .loc 1 988 18 is_stmt 0 view .LVU670 + 2306 0046 0A4B ldr r3, .L149+12 + ARM GAS /tmp/cczyIHoC.s page 82 + + + 2307 0048 B3FBF1F3 udiv r3, r3, r1 + 2308 .loc 1 988 16 view .LVU671 + 2309 004c 03FB00F0 mul r0, r3, r0 + 2310 .LVL172: + 2311 .loc 1 988 16 view .LVU672 + 2312 0050 7047 bx lr + 2313 .LVL173: + 2314 .L146: + 989:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 990:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** else + 991:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 992:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* HSI used as PLL clock source : PLLCLK = HSI/2 * PLLMUL */ + 993:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** pllclk = (uint32_t)((uint64_t) (HSI_VALUE >> 1U) * ((uint64_t) pllmul)); + 2315 .loc 1 993 9 is_stmt 1 view .LVU673 + 2316 .loc 1 993 16 is_stmt 0 view .LVU674 + 2317 0052 084B ldr r3, .L149+16 + 2318 0054 03FB00F0 mul r0, r3, r0 + 2319 .LVL174: + 2320 .loc 1 993 16 view .LVU675 + 2321 0058 7047 bx lr + 2322 .LVL175: + 2323 .L147: + 973:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2324 .loc 1 973 3 view .LVU676 + 2325 005a 0548 ldr r0, .L149+12 + 2326 005c 7047 bx lr + 2327 .L148: + 994:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 995:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** #else + 996:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if ((tmpreg & RCC_CFGR_PLLSRC_HSE_PREDIV) == RCC_CFGR_PLLSRC_HSE_PREDIV) + 997:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 998:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* HSE used as PLL clock source : PLLCLK = HSE/PREDIV * PLLMUL */ + 999:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** pllclk = (uint32_t)((uint64_t) HSE_VALUE / (uint64_t) (prediv)) * ((uint64_t) pllmul); +1000:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } +1001:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** else +1002:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { +1003:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* HSI used as PLL clock source : PLLCLK = HSI/PREDIV * PLLMUL */ +1004:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** pllclk = (uint32_t)((uint64_t) HSI_VALUE / (uint64_t) (prediv)) * ((uint64_t) pllmul); +1005:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } +1006:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** #endif /* RCC_CFGR_PLLSRC_HSI_DIV2 */ +1007:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** sysclockfreq = pllclk; +1008:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** break; +1009:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } +1010:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** case RCC_SYSCLKSOURCE_STATUS_HSI: /* HSI used as system clock source */ +1011:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** default: /* HSI used as system clock */ +1012:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { +1013:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** sysclockfreq = HSI_VALUE; + 2328 .loc 1 1013 20 view .LVU677 + 2329 005e 0648 ldr r0, .L149+20 + 2330 .LVL176: +1014:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** break; +1015:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } +1016:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } +1017:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** return sysclockfreq; + 2331 .loc 1 1017 3 is_stmt 1 view .LVU678 +1018:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 2332 .loc 1 1018 1 is_stmt 0 view .LVU679 + ARM GAS /tmp/cczyIHoC.s page 83 + + + 2333 0060 7047 bx lr + 2334 .L150: + 2335 0062 00BF .align 2 + 2336 .L149: + 2337 0064 00100240 .word 1073876992 + 2338 0068 00000000 .word aPLLMULFactorTable + 2339 006c 00000000 .word aPredivFactorTable + 2340 0070 0024F400 .word 16000000 + 2341 0074 00093D00 .word 4000000 + 2342 0078 00127A00 .word 8000000 + 2343 .cfi_endproc + 2344 .LFE136: + 2346 .section .text.HAL_RCC_ClockConfig,"ax",%progbits + 2347 .align 1 + 2348 .global HAL_RCC_ClockConfig + 2349 .syntax unified + 2350 .thumb + 2351 .thumb_func + 2353 HAL_RCC_ClockConfig: + 2354 .LVL177: + 2355 .LFB132: + 697:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** uint32_t tickstart = 0U; + 2356 .loc 1 697 1 is_stmt 1 view -0 + 2357 .cfi_startproc + 2358 @ args = 0, pretend = 0, frame = 0 + 2359 @ frame_needed = 0, uses_anonymous_args = 0 + 698:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 2360 .loc 1 698 3 view .LVU681 + 701:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2361 .loc 1 701 3 view .LVU682 + 701:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2362 .loc 1 701 5 is_stmt 0 view .LVU683 + 2363 0000 0028 cmp r0, #0 + 2364 0002 00F0BE80 beq .L170 + 697:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** uint32_t tickstart = 0U; + 2365 .loc 1 697 1 view .LVU684 + 2366 0006 70B5 push {r4, r5, r6, lr} + 2367 .cfi_def_cfa_offset 16 + 2368 .cfi_offset 4, -16 + 2369 .cfi_offset 5, -12 + 2370 .cfi_offset 6, -8 + 2371 .cfi_offset 14, -4 + 2372 0008 0D46 mov r5, r1 + 2373 000a 0446 mov r4, r0 + 707:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** assert_param(IS_FLASH_LATENCY(FLatency)); + 2374 .loc 1 707 3 is_stmt 1 view .LVU685 + 708:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 2375 .loc 1 708 3 view .LVU686 + 715:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2376 .loc 1 715 3 view .LVU687 + 715:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2377 .loc 1 715 17 is_stmt 0 view .LVU688 + 2378 000c 614B ldr r3, .L183 + 2379 000e 1B68 ldr r3, [r3] + 2380 0010 03F00703 and r3, r3, #7 + 715:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2381 .loc 1 715 5 view .LVU689 + ARM GAS /tmp/cczyIHoC.s page 84 + + + 2382 0014 8B42 cmp r3, r1 + 2383 0016 0BD2 bcs .L153 + 718:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 2384 .loc 1 718 5 is_stmt 1 view .LVU690 + 2385 0018 5E4A ldr r2, .L183 + 2386 001a 1368 ldr r3, [r2] + 2387 001c 23F00703 bic r3, r3, #7 + 2388 0020 0B43 orrs r3, r3, r1 + 2389 0022 1360 str r3, [r2] + 722:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2390 .loc 1 722 5 view .LVU691 + 722:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2391 .loc 1 722 8 is_stmt 0 view .LVU692 + 2392 0024 1368 ldr r3, [r2] + 2393 0026 03F00703 and r3, r3, #7 + 722:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2394 .loc 1 722 7 view .LVU693 + 2395 002a 8B42 cmp r3, r1 + 2396 002c 40F0AB80 bne .L171 + 2397 .L153: + 729:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2398 .loc 1 729 3 is_stmt 1 view .LVU694 + 729:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2399 .loc 1 729 25 is_stmt 0 view .LVU695 + 2400 0030 2368 ldr r3, [r4] + 729:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2401 .loc 1 729 5 view .LVU696 + 2402 0032 13F0020F tst r3, #2 + 2403 0036 06D0 beq .L154 + 731:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE, RCC_ClkInitStruct->AHBCLKDivider); + 2404 .loc 1 731 5 is_stmt 1 view .LVU697 + 732:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 2405 .loc 1 732 5 view .LVU698 + 2406 0038 574A ldr r2, .L183+4 + 2407 003a 5368 ldr r3, [r2, #4] + 2408 003c 23F0F003 bic r3, r3, #240 + 2409 0040 A168 ldr r1, [r4, #8] + 2410 .LVL178: + 732:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 2411 .loc 1 732 5 is_stmt 0 view .LVU699 + 2412 0042 0B43 orrs r3, r3, r1 + 2413 0044 5360 str r3, [r2, #4] + 2414 .L154: + 736:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2415 .loc 1 736 3 is_stmt 1 view .LVU700 + 736:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2416 .loc 1 736 25 is_stmt 0 view .LVU701 + 2417 0046 2368 ldr r3, [r4] + 736:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2418 .loc 1 736 5 view .LVU702 + 2419 0048 13F0010F tst r3, #1 + 2420 004c 5AD0 beq .L155 + 738:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 2421 .loc 1 738 5 is_stmt 1 view .LVU703 + 741:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2422 .loc 1 741 5 view .LVU704 + 741:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + ARM GAS /tmp/cczyIHoC.s page 85 + + + 2423 .loc 1 741 25 is_stmt 0 view .LVU705 + 2424 004e 6368 ldr r3, [r4, #4] + 741:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2425 .loc 1 741 7 view .LVU706 + 2426 0050 012B cmp r3, #1 + 2427 0052 2DD0 beq .L181 + 750:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2428 .loc 1 750 10 is_stmt 1 view .LVU707 + 750:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2429 .loc 1 750 12 is_stmt 0 view .LVU708 + 2430 0054 022B cmp r3, #2 + 2431 0056 40D0 beq .L182 + 762:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2432 .loc 1 762 7 is_stmt 1 view .LVU709 + 2433 .LVL179: + 2434 .LBB269: + 2435 .LBI269: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 2436 .loc 2 981 31 view .LVU710 + 2437 .LBB270: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 2438 .loc 2 983 3 view .LVU711 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 2439 .loc 2 988 4 view .LVU712 + 2440 0058 0222 movs r2, #2 + 2441 .syntax unified + 2442 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 2443 005a 92FAA2F2 rbit r2, r2 + 2444 @ 0 "" 2 + 2445 .loc 2 1001 3 view .LVU713 + 2446 .LVL180: + 2447 .loc 2 1001 3 is_stmt 0 view .LVU714 + 2448 .thumb + 2449 .syntax unified + 2450 .LBE270: + 2451 .LBE269: + 762:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2452 .loc 1 762 10 view .LVU715 + 2453 005e 4E4A ldr r2, .L183+4 + 2454 0060 1068 ldr r0, [r2] + 2455 .LVL181: + 2456 .LBB271: + 2457 .LBI271: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 2458 .loc 2 981 31 is_stmt 1 view .LVU716 + 2459 .LBB272: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 2460 .loc 2 983 3 view .LVU717 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 2461 .loc 2 988 4 view .LVU718 + 2462 0062 0222 movs r2, #2 + 2463 .syntax unified + 2464 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 2465 0064 92FAA2F2 rbit r2, r2 + 2466 @ 0 "" 2 + 2467 .LVL182: + 2468 .loc 2 1001 3 view .LVU719 + ARM GAS /tmp/cczyIHoC.s page 86 + + + 2469 .loc 2 1001 3 is_stmt 0 view .LVU720 + 2470 .thumb + 2471 .syntax unified + 2472 .LBE272: + 2473 .LBE271: + 762:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2474 .loc 1 762 10 view .LVU721 + 2475 0068 B2FA82F2 clz r2, r2 + 2476 006c 02F01F02 and r2, r2, #31 + 2477 0070 0121 movs r1, #1 + 2478 0072 01FA02F2 lsl r2, r1, r2 + 762:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2479 .loc 1 762 9 view .LVU722 + 2480 0076 1042 tst r0, r2 + 2481 0078 00F08780 beq .L174 + 2482 .L159: + 768:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 2483 .loc 1 768 5 is_stmt 1 view .LVU723 + 2484 007c 4649 ldr r1, .L183+4 + 2485 007e 4A68 ldr r2, [r1, #4] + 2486 0080 22F00302 bic r2, r2, #3 + 2487 0084 1343 orrs r3, r3, r2 + 2488 0086 4B60 str r3, [r1, #4] + 771:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 2489 .loc 1 771 5 view .LVU724 + 771:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 2490 .loc 1 771 17 is_stmt 0 view .LVU725 + 2491 0088 FFF7FEFF bl HAL_GetTick + 2492 .LVL183: + 2493 008c 0646 mov r6, r0 + 2494 .LVL184: + 773:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2495 .loc 1 773 5 is_stmt 1 view .LVU726 + 2496 .L165: + 773:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2497 .loc 1 773 42 view .LVU727 + 773:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2498 .loc 1 773 12 is_stmt 0 view .LVU728 + 2499 008e 424B ldr r3, .L183+4 + 2500 0090 5B68 ldr r3, [r3, #4] + 2501 0092 03F00C03 and r3, r3, #12 + 773:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2502 .loc 1 773 63 view .LVU729 + 2503 0096 6268 ldr r2, [r4, #4] + 773:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2504 .loc 1 773 42 view .LVU730 + 2505 0098 B3EB820F cmp r3, r2, lsl #2 + 2506 009c 32D0 beq .L155 + 775:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2507 .loc 1 775 7 is_stmt 1 view .LVU731 + 775:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2508 .loc 1 775 12 is_stmt 0 view .LVU732 + 2509 009e FFF7FEFF bl HAL_GetTick + 2510 .LVL185: + 775:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2511 .loc 1 775 26 view .LVU733 + 2512 00a2 801B subs r0, r0, r6 + ARM GAS /tmp/cczyIHoC.s page 87 + + + 775:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2513 .loc 1 775 10 view .LVU734 + 2514 00a4 41F28833 movw r3, #5000 + 2515 00a8 9842 cmp r0, r3 + 2516 00aa F0D9 bls .L165 + 777:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 2517 .loc 1 777 16 view .LVU735 + 2518 00ac 0320 movs r0, #3 + 2519 00ae 67E0 b .L152 + 2520 .LVL186: + 2521 .L181: + 744:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2522 .loc 1 744 7 is_stmt 1 view .LVU736 + 2523 .LBB273: + 2524 .LBI273: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 2525 .loc 2 981 31 view .LVU737 + 2526 .LBB274: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 2527 .loc 2 983 3 view .LVU738 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 2528 .loc 2 988 4 view .LVU739 + 2529 00b0 4FF40032 mov r2, #131072 + 2530 .syntax unified + 2531 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 2532 00b4 92FAA2F2 rbit r2, r2 + 2533 @ 0 "" 2 + 2534 .loc 2 1001 3 view .LVU740 + 2535 .LVL187: + 2536 .loc 2 1001 3 is_stmt 0 view .LVU741 + 2537 .thumb + 2538 .syntax unified + 2539 .LBE274: + 2540 .LBE273: + 744:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2541 .loc 1 744 10 view .LVU742 + 2542 00b8 374A ldr r2, .L183+4 + 2543 00ba 1068 ldr r0, [r2] + 2544 .LVL188: + 2545 .LBB275: + 2546 .LBI275: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 2547 .loc 2 981 31 is_stmt 1 view .LVU743 + 2548 .LBB276: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 2549 .loc 2 983 3 view .LVU744 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 2550 .loc 2 988 4 view .LVU745 + 2551 00bc 4FF40032 mov r2, #131072 + 2552 .syntax unified + 2553 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 2554 00c0 92FAA2F2 rbit r2, r2 + 2555 @ 0 "" 2 + 2556 .LVL189: + 2557 .loc 2 1001 3 view .LVU746 + 2558 .loc 2 1001 3 is_stmt 0 view .LVU747 + 2559 .thumb + ARM GAS /tmp/cczyIHoC.s page 88 + + + 2560 .syntax unified + 2561 .LBE276: + 2562 .LBE275: + 744:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2563 .loc 1 744 10 view .LVU748 + 2564 00c4 B2FA82F2 clz r2, r2 + 2565 00c8 02F01F02 and r2, r2, #31 + 2566 00cc 0121 movs r1, #1 + 2567 00ce 01FA02F2 lsl r2, r1, r2 + 744:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2568 .loc 1 744 9 view .LVU749 + 2569 00d2 0242 tst r2, r0 + 2570 00d4 D2D1 bne .L159 + 746:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 2571 .loc 1 746 16 view .LVU750 + 2572 00d6 0120 movs r0, #1 + 2573 00d8 52E0 b .L152 + 2574 .LVL190: + 2575 .L182: + 753:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2576 .loc 1 753 7 is_stmt 1 view .LVU751 + 2577 .LBB277: + 2578 .LBI277: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 2579 .loc 2 981 31 view .LVU752 + 2580 .LBB278: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 2581 .loc 2 983 3 view .LVU753 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 2582 .loc 2 988 4 view .LVU754 + 2583 00da 4FF00072 mov r2, #33554432 + 2584 .syntax unified + 2585 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 2586 00de 92FAA2F2 rbit r2, r2 + 2587 @ 0 "" 2 + 2588 .loc 2 1001 3 view .LVU755 + 2589 .LVL191: + 2590 .loc 2 1001 3 is_stmt 0 view .LVU756 + 2591 .thumb + 2592 .syntax unified + 2593 .LBE278: + 2594 .LBE277: + 753:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2595 .loc 1 753 10 view .LVU757 + 2596 00e2 2D4A ldr r2, .L183+4 + 2597 00e4 1068 ldr r0, [r2] + 2598 .LVL192: + 2599 .LBB279: + 2600 .LBI279: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 2601 .loc 2 981 31 is_stmt 1 view .LVU758 + 2602 .LBB280: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 2603 .loc 2 983 3 view .LVU759 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 2604 .loc 2 988 4 view .LVU760 + 2605 00e6 4FF00072 mov r2, #33554432 + ARM GAS /tmp/cczyIHoC.s page 89 + + + 2606 .syntax unified + 2607 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 2608 00ea 92FAA2F2 rbit r2, r2 + 2609 @ 0 "" 2 + 2610 .LVL193: + 2611 .loc 2 1001 3 view .LVU761 + 2612 .loc 2 1001 3 is_stmt 0 view .LVU762 + 2613 .thumb + 2614 .syntax unified + 2615 .LBE280: + 2616 .LBE279: + 753:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2617 .loc 1 753 10 view .LVU763 + 2618 00ee B2FA82F2 clz r2, r2 + 2619 00f2 02F01F02 and r2, r2, #31 + 2620 00f6 0121 movs r1, #1 + 2621 00f8 01FA02F2 lsl r2, r1, r2 + 753:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2622 .loc 1 753 9 view .LVU764 + 2623 00fc 1042 tst r0, r2 + 2624 00fe BDD1 bne .L159 + 755:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 2625 .loc 1 755 16 view .LVU765 + 2626 0100 0120 movs r0, #1 + 2627 0102 3DE0 b .L152 + 2628 .LVL194: + 2629 .L155: + 782:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2630 .loc 1 782 3 is_stmt 1 view .LVU766 + 782:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2631 .loc 1 782 17 is_stmt 0 view .LVU767 + 2632 0104 234B ldr r3, .L183 + 2633 0106 1B68 ldr r3, [r3] + 2634 0108 03F00703 and r3, r3, #7 + 782:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2635 .loc 1 782 5 view .LVU768 + 2636 010c AB42 cmp r3, r5 + 2637 010e 0AD9 bls .L167 + 785:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 2638 .loc 1 785 5 is_stmt 1 view .LVU769 + 2639 0110 204A ldr r2, .L183 + 2640 0112 1368 ldr r3, [r2] + 2641 0114 23F00703 bic r3, r3, #7 + 2642 0118 2B43 orrs r3, r3, r5 + 2643 011a 1360 str r3, [r2] + 789:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2644 .loc 1 789 5 view .LVU770 + 789:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2645 .loc 1 789 8 is_stmt 0 view .LVU771 + 2646 011c 1368 ldr r3, [r2] + 2647 011e 03F00703 and r3, r3, #7 + 789:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2648 .loc 1 789 7 view .LVU772 + 2649 0122 AB42 cmp r3, r5 + 2650 0124 33D1 bne .L176 + 2651 .L167: + 796:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + ARM GAS /tmp/cczyIHoC.s page 90 + + + 2652 .loc 1 796 3 is_stmt 1 view .LVU773 + 796:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2653 .loc 1 796 25 is_stmt 0 view .LVU774 + 2654 0126 2368 ldr r3, [r4] + 796:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2655 .loc 1 796 5 view .LVU775 + 2656 0128 13F0040F tst r3, #4 + 2657 012c 06D0 beq .L168 + 798:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_ClkInitStruct->APB1CLKDivider); + 2658 .loc 1 798 5 is_stmt 1 view .LVU776 + 799:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 2659 .loc 1 799 5 view .LVU777 + 2660 012e 1A4A ldr r2, .L183+4 + 2661 0130 5368 ldr r3, [r2, #4] + 2662 0132 23F4E063 bic r3, r3, #1792 + 2663 0136 E168 ldr r1, [r4, #12] + 2664 0138 0B43 orrs r3, r3, r1 + 2665 013a 5360 str r3, [r2, #4] + 2666 .L168: + 803:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2667 .loc 1 803 3 view .LVU778 + 803:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2668 .loc 1 803 25 is_stmt 0 view .LVU779 + 2669 013c 2368 ldr r3, [r4] + 803:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2670 .loc 1 803 5 view .LVU780 + 2671 013e 13F0080F tst r3, #8 + 2672 0142 07D0 beq .L169 + 805:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, ((RCC_ClkInitStruct->APB2CLKDivider) << 3U)); + 2673 .loc 1 805 5 is_stmt 1 view .LVU781 + 806:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 2674 .loc 1 806 5 view .LVU782 + 2675 0144 144A ldr r2, .L183+4 + 2676 0146 5368 ldr r3, [r2, #4] + 2677 0148 23F46053 bic r3, r3, #14336 + 2678 014c 2169 ldr r1, [r4, #16] + 2679 014e 43EAC103 orr r3, r3, r1, lsl #3 + 2680 0152 5360 str r3, [r2, #4] + 2681 .L169: + 810:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 2682 .loc 1 810 3 view .LVU783 + 810:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 2683 .loc 1 810 21 is_stmt 0 view .LVU784 + 2684 0154 FFF7FEFF bl HAL_RCC_GetSysClockFreq + 2685 .LVL195: + 810:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 2686 .loc 1 810 68 view .LVU785 + 2687 0158 0F4B ldr r3, .L183+4 + 2688 015a 5B68 ldr r3, [r3, #4] + 810:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 2689 .loc 1 810 75 view .LVU786 + 2690 015c 03F0F003 and r3, r3, #240 + 2691 .LVL196: + 2692 .LBB281: + 2693 .LBI281: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 2694 .loc 2 981 31 is_stmt 1 view .LVU787 + ARM GAS /tmp/cczyIHoC.s page 91 + + + 2695 .LBB282: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 2696 .loc 2 983 3 view .LVU788 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 2697 .loc 2 988 4 view .LVU789 + 2698 0160 F022 movs r2, #240 + 2699 .syntax unified + 2700 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 2701 0162 92FAA2F2 rbit r2, r2 + 2702 @ 0 "" 2 + 2703 .LVL197: + 2704 .loc 2 1001 3 view .LVU790 + 2705 .loc 2 1001 3 is_stmt 0 view .LVU791 + 2706 .thumb + 2707 .syntax unified + 2708 .LBE282: + 2709 .LBE281: + 810:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 2710 .loc 1 810 91 view .LVU792 + 2711 0166 B2FA82F2 clz r2, r2 + 2712 016a D340 lsrs r3, r3, r2 + 810:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 2713 .loc 1 810 63 view .LVU793 + 2714 016c 0B4A ldr r2, .L183+8 + 2715 016e D35C ldrb r3, [r2, r3] @ zero_extendqisi2 + 810:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 2716 .loc 1 810 47 view .LVU794 + 2717 0170 D840 lsrs r0, r0, r3 + 810:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 2718 .loc 1 810 19 view .LVU795 + 2719 0172 0B4B ldr r3, .L183+12 + 2720 0174 1860 str r0, [r3] + 813:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 2721 .loc 1 813 3 is_stmt 1 view .LVU796 + 2722 0176 0B4B ldr r3, .L183+16 + 2723 0178 1868 ldr r0, [r3] + 2724 017a FFF7FEFF bl HAL_InitTick + 2725 .LVL198: + 815:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 2726 .loc 1 815 3 view .LVU797 + 815:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 2727 .loc 1 815 10 is_stmt 0 view .LVU798 + 2728 017e 0020 movs r0, #0 + 2729 .L152: + 816:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 2730 .loc 1 816 1 view .LVU799 + 2731 0180 70BD pop {r4, r5, r6, pc} + 2732 .LVL199: + 2733 .L170: + 2734 .cfi_def_cfa_offset 0 + 2735 .cfi_restore 4 + 2736 .cfi_restore 5 + 2737 .cfi_restore 6 + 2738 .cfi_restore 14 + 703:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 2739 .loc 1 703 12 view .LVU800 + 2740 0182 0120 movs r0, #1 + ARM GAS /tmp/cczyIHoC.s page 92 + + + 2741 .LVL200: + 816:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 2742 .loc 1 816 1 view .LVU801 + 2743 0184 7047 bx lr + 2744 .LVL201: + 2745 .L171: + 2746 .cfi_def_cfa_offset 16 + 2747 .cfi_offset 4, -16 + 2748 .cfi_offset 5, -12 + 2749 .cfi_offset 6, -8 + 2750 .cfi_offset 14, -4 + 724:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 2751 .loc 1 724 14 view .LVU802 + 2752 0186 0120 movs r0, #1 + 2753 .LVL202: + 724:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 2754 .loc 1 724 14 view .LVU803 + 2755 0188 FAE7 b .L152 + 2756 .LVL203: + 2757 .L174: + 764:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 2758 .loc 1 764 16 view .LVU804 + 2759 018a 0120 movs r0, #1 + 2760 018c F8E7 b .L152 + 2761 .LVL204: + 2762 .L176: + 791:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 2763 .loc 1 791 14 view .LVU805 + 2764 018e 0120 movs r0, #1 + 2765 0190 F6E7 b .L152 + 2766 .L184: + 2767 0192 00BF .align 2 + 2768 .L183: + 2769 0194 00200240 .word 1073881088 + 2770 0198 00100240 .word 1073876992 + 2771 019c 00000000 .word AHBPrescTable + 2772 01a0 00000000 .word SystemCoreClock + 2773 01a4 00000000 .word uwTickPrio + 2774 .cfi_endproc + 2775 .LFE132: + 2777 .section .text.HAL_RCC_GetHCLKFreq,"ax",%progbits + 2778 .align 1 + 2779 .global HAL_RCC_GetHCLKFreq + 2780 .syntax unified + 2781 .thumb + 2782 .thumb_func + 2784 HAL_RCC_GetHCLKFreq: + 2785 .LFB137: +1019:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** +1020:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /** +1021:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @brief Returns the HCLK frequency +1022:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @note Each time HCLK changes, this function must be called to update the +1023:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * right HCLK value. Otherwise, any configuration based on this function will be incorrect +1024:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * +1025:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @note The SystemCoreClock CMSIS variable is used to store System Clock Frequency +1026:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * and updated within this function +1027:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @retval HCLK frequency + ARM GAS /tmp/cczyIHoC.s page 93 + + +1028:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** */ +1029:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** uint32_t HAL_RCC_GetHCLKFreq(void) +1030:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2786 .loc 1 1030 1 is_stmt 1 view -0 + 2787 .cfi_startproc + 2788 @ args = 0, pretend = 0, frame = 0 + 2789 @ frame_needed = 0, uses_anonymous_args = 0 + 2790 @ link register save eliminated. +1031:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** return SystemCoreClock; + 2791 .loc 1 1031 3 view .LVU807 +1032:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 2792 .loc 1 1032 1 is_stmt 0 view .LVU808 + 2793 0000 014B ldr r3, .L186 + 2794 0002 1868 ldr r0, [r3] + 2795 0004 7047 bx lr + 2796 .L187: + 2797 0006 00BF .align 2 + 2798 .L186: + 2799 0008 00000000 .word SystemCoreClock + 2800 .cfi_endproc + 2801 .LFE137: + 2803 .section .text.HAL_RCC_GetPCLK1Freq,"ax",%progbits + 2804 .align 1 + 2805 .global HAL_RCC_GetPCLK1Freq + 2806 .syntax unified + 2807 .thumb + 2808 .thumb_func + 2810 HAL_RCC_GetPCLK1Freq: + 2811 .LFB138: +1033:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** +1034:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /** +1035:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @brief Returns the PCLK1 frequency +1036:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @note Each time PCLK1 changes, this function must be called to update the +1037:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * right PCLK1 value. Otherwise, any configuration based on this function will be incorrec +1038:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @retval PCLK1 frequency +1039:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** */ +1040:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** uint32_t HAL_RCC_GetPCLK1Freq(void) +1041:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2812 .loc 1 1041 1 is_stmt 1 view -0 + 2813 .cfi_startproc + 2814 @ args = 0, pretend = 0, frame = 0 + 2815 @ frame_needed = 0, uses_anonymous_args = 0 + 2816 0000 08B5 push {r3, lr} + 2817 .cfi_def_cfa_offset 8 + 2818 .cfi_offset 3, -8 + 2819 .cfi_offset 14, -4 +1042:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Get HCLK source and Compute PCLK1 frequency ---------------------------*/ +1043:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** return (HAL_RCC_GetHCLKFreq() >> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE1) >> RCC_CFGR_PPRE1_BIT + 2820 .loc 1 1043 3 view .LVU810 + 2821 .loc 1 1043 11 is_stmt 0 view .LVU811 + 2822 0002 FFF7FEFF bl HAL_RCC_GetHCLKFreq + 2823 .LVL205: + 2824 .loc 1 1043 54 view .LVU812 + 2825 0006 074B ldr r3, .L190 + 2826 0008 5B68 ldr r3, [r3, #4] + 2827 .loc 1 1043 61 view .LVU813 + 2828 000a 03F4E063 and r3, r3, #1792 + ARM GAS /tmp/cczyIHoC.s page 94 + + + 2829 .LVL206: + 2830 .LBB283: + 2831 .LBI283: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 2832 .loc 2 981 31 is_stmt 1 view .LVU814 + 2833 .LBB284: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 2834 .loc 2 983 3 view .LVU815 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 2835 .loc 2 988 4 view .LVU816 + 2836 000e 4FF4E062 mov r2, #1792 + 2837 .syntax unified + 2838 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 2839 0012 92FAA2F2 rbit r2, r2 + 2840 @ 0 "" 2 + 2841 .LVL207: + 2842 .loc 2 1001 3 view .LVU817 + 2843 .loc 2 1001 3 is_stmt 0 view .LVU818 + 2844 .thumb + 2845 .syntax unified + 2846 .LBE284: + 2847 .LBE283: + 2848 .loc 1 1043 79 view .LVU819 + 2849 0016 B2FA82F2 clz r2, r2 + 2850 001a D340 lsrs r3, r3, r2 + 2851 .loc 1 1043 49 view .LVU820 + 2852 001c 024A ldr r2, .L190+4 + 2853 001e D35C ldrb r3, [r2, r3] @ zero_extendqisi2 +1044:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 2854 .loc 1 1044 1 view .LVU821 + 2855 0020 D840 lsrs r0, r0, r3 + 2856 0022 08BD pop {r3, pc} + 2857 .L191: + 2858 .align 2 + 2859 .L190: + 2860 0024 00100240 .word 1073876992 + 2861 0028 00000000 .word APBPrescTable + 2862 .cfi_endproc + 2863 .LFE138: + 2865 .section .text.HAL_RCC_GetPCLK2Freq,"ax",%progbits + 2866 .align 1 + 2867 .global HAL_RCC_GetPCLK2Freq + 2868 .syntax unified + 2869 .thumb + 2870 .thumb_func + 2872 HAL_RCC_GetPCLK2Freq: + 2873 .LFB139: +1045:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** +1046:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /** +1047:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @brief Returns the PCLK2 frequency +1048:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @note Each time PCLK2 changes, this function must be called to update the +1049:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * right PCLK2 value. Otherwise, any configuration based on this function will be incorrec +1050:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @retval PCLK2 frequency +1051:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** */ +1052:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** uint32_t HAL_RCC_GetPCLK2Freq(void) +1053:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2874 .loc 1 1053 1 is_stmt 1 view -0 + ARM GAS /tmp/cczyIHoC.s page 95 + + + 2875 .cfi_startproc + 2876 @ args = 0, pretend = 0, frame = 0 + 2877 @ frame_needed = 0, uses_anonymous_args = 0 + 2878 0000 08B5 push {r3, lr} + 2879 .cfi_def_cfa_offset 8 + 2880 .cfi_offset 3, -8 + 2881 .cfi_offset 14, -4 +1054:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Get HCLK source and Compute PCLK2 frequency ---------------------------*/ +1055:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** return (HAL_RCC_GetHCLKFreq()>> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE2) >> RCC_CFGR_PPRE2_BITN + 2882 .loc 1 1055 3 view .LVU823 + 2883 .loc 1 1055 11 is_stmt 0 view .LVU824 + 2884 0002 FFF7FEFF bl HAL_RCC_GetHCLKFreq + 2885 .LVL208: + 2886 .loc 1 1055 53 view .LVU825 + 2887 0006 074B ldr r3, .L194 + 2888 0008 5B68 ldr r3, [r3, #4] + 2889 .loc 1 1055 60 view .LVU826 + 2890 000a 03F46053 and r3, r3, #14336 + 2891 .LVL209: + 2892 .LBB285: + 2893 .LBI285: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 2894 .loc 2 981 31 is_stmt 1 view .LVU827 + 2895 .LBB286: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 2896 .loc 2 983 3 view .LVU828 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 2897 .loc 2 988 4 view .LVU829 + 2898 000e 4FF46052 mov r2, #14336 + 2899 .syntax unified + 2900 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 2901 0012 92FAA2F2 rbit r2, r2 + 2902 @ 0 "" 2 + 2903 .LVL210: + 2904 .loc 2 1001 3 view .LVU830 + 2905 .loc 2 1001 3 is_stmt 0 view .LVU831 + 2906 .thumb + 2907 .syntax unified + 2908 .LBE286: + 2909 .LBE285: + 2910 .loc 1 1055 78 view .LVU832 + 2911 0016 B2FA82F2 clz r2, r2 + 2912 001a D340 lsrs r3, r3, r2 + 2913 .loc 1 1055 48 view .LVU833 + 2914 001c 024A ldr r2, .L194+4 + 2915 001e D35C ldrb r3, [r2, r3] @ zero_extendqisi2 +1056:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 2916 .loc 1 1056 1 view .LVU834 + 2917 0020 D840 lsrs r0, r0, r3 + 2918 0022 08BD pop {r3, pc} + 2919 .L195: + 2920 .align 2 + 2921 .L194: + 2922 0024 00100240 .word 1073876992 + 2923 0028 00000000 .word APBPrescTable + 2924 .cfi_endproc + 2925 .LFE139: + ARM GAS /tmp/cczyIHoC.s page 96 + + + 2927 .section .text.HAL_RCC_GetOscConfig,"ax",%progbits + 2928 .align 1 + 2929 .global HAL_RCC_GetOscConfig + 2930 .syntax unified + 2931 .thumb + 2932 .thumb_func + 2934 HAL_RCC_GetOscConfig: + 2935 .LVL211: + 2936 .LFB140: +1057:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** +1058:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /** +1059:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @brief Configures the RCC_OscInitStruct according to the internal +1060:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * RCC configuration registers. +1061:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @param RCC_OscInitStruct pointer to an RCC_OscInitTypeDef structure that +1062:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * will be configured. +1063:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @retval None +1064:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** */ +1065:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) +1066:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 2937 .loc 1 1066 1 is_stmt 1 view -0 + 2938 .cfi_startproc + 2939 @ args = 0, pretend = 0, frame = 0 + 2940 @ frame_needed = 0, uses_anonymous_args = 0 + 2941 @ link register save eliminated. +1067:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Check the parameters */ +1068:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** assert_param(RCC_OscInitStruct != NULL); + 2942 .loc 1 1068 3 view .LVU836 +1069:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** +1070:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Set all possible values for the Oscillator type parameter ---------------*/ +1071:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** RCC_OscInitStruct->OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI \ + 2943 .loc 1 1071 3 view .LVU837 + 2944 .loc 1 1071 37 is_stmt 0 view .LVU838 + 2945 0000 0F23 movs r3, #15 + 2946 0002 0360 str r3, [r0] +1072:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** | RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI; +1073:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** +1074:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** +1075:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Get the HSE configuration -----------------------------------------------*/ +1076:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if((RCC->CR &RCC_CR_HSEBYP) == RCC_CR_HSEBYP) + 2947 .loc 1 1076 3 is_stmt 1 view .LVU839 + 2948 .loc 1 1076 10 is_stmt 0 view .LVU840 + 2949 0004 2D4B ldr r3, .L209 + 2950 0006 1B68 ldr r3, [r3] + 2951 .loc 1 1076 5 view .LVU841 + 2952 0008 13F4802F tst r3, #262144 + 2953 000c 36D0 beq .L197 +1077:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { +1078:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** RCC_OscInitStruct->HSEState = RCC_HSE_BYPASS; + 2954 .loc 1 1078 5 is_stmt 1 view .LVU842 + 2955 .loc 1 1078 33 is_stmt 0 view .LVU843 + 2956 000e 4FF4A023 mov r3, #327680 + 2957 0012 4360 str r3, [r0, #4] + 2958 .L198: +1079:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } +1080:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** else if((RCC->CR &RCC_CR_HSEON) == RCC_CR_HSEON) +1081:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { +1082:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** RCC_OscInitStruct->HSEState = RCC_HSE_ON; + ARM GAS /tmp/cczyIHoC.s page 97 + + +1083:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } +1084:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** else +1085:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { +1086:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** RCC_OscInitStruct->HSEState = RCC_HSE_OFF; +1087:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } +1088:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** #if defined(RCC_CFGR_PLLSRC_HSI_DIV2) +1089:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** RCC_OscInitStruct->HSEPredivValue = __HAL_RCC_HSE_GET_PREDIV(); + 2959 .loc 1 1089 3 is_stmt 1 view .LVU844 + 2960 .loc 1 1089 39 is_stmt 0 view .LVU845 + 2961 0014 294A ldr r2, .L209 + 2962 0016 D36A ldr r3, [r2, #44] + 2963 0018 03F00F03 and r3, r3, #15 + 2964 .loc 1 1089 37 view .LVU846 + 2965 001c 8360 str r3, [r0, #8] +1090:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** #endif +1091:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** +1092:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Get the HSI configuration -----------------------------------------------*/ +1093:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if((RCC->CR &RCC_CR_HSION) == RCC_CR_HSION) + 2966 .loc 1 1093 3 is_stmt 1 view .LVU847 + 2967 .loc 1 1093 10 is_stmt 0 view .LVU848 + 2968 001e 1368 ldr r3, [r2] + 2969 .loc 1 1093 5 view .LVU849 + 2970 0020 13F0010F tst r3, #1 + 2971 0024 36D0 beq .L200 +1094:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { +1095:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** RCC_OscInitStruct->HSIState = RCC_HSI_ON; + 2972 .loc 1 1095 5 is_stmt 1 view .LVU850 + 2973 .loc 1 1095 33 is_stmt 0 view .LVU851 + 2974 0026 0123 movs r3, #1 + 2975 0028 0361 str r3, [r0, #16] + 2976 .L201: +1096:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } +1097:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** else +1098:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { +1099:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** RCC_OscInitStruct->HSIState = RCC_HSI_OFF; +1100:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } +1101:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** +1102:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** RCC_OscInitStruct->HSICalibrationValue = (uint32_t)((RCC->CR & RCC_CR_HSITRIM) >> POSITION_VAL(RC + 2977 .loc 1 1102 3 is_stmt 1 view .LVU852 + 2978 .loc 1 1102 59 is_stmt 0 view .LVU853 + 2979 002a 2449 ldr r1, .L209 + 2980 002c 0B68 ldr r3, [r1] + 2981 .loc 1 1102 64 view .LVU854 + 2982 002e 03F0F803 and r3, r3, #248 + 2983 .LVL212: + 2984 .LBB287: + 2985 .LBI287: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 2986 .loc 2 981 31 is_stmt 1 view .LVU855 + 2987 .LBB288: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 2988 .loc 2 983 3 view .LVU856 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 2989 .loc 2 988 4 view .LVU857 + 2990 0032 F822 movs r2, #248 + 2991 .syntax unified + 2992 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + ARM GAS /tmp/cczyIHoC.s page 98 + + + 2993 0034 92FAA2F2 rbit r2, r2 + 2994 @ 0 "" 2 + 2995 .LVL213: + 2996 .loc 2 1001 3 view .LVU858 + 2997 .loc 2 1001 3 is_stmt 0 view .LVU859 + 2998 .thumb + 2999 .syntax unified + 3000 .LBE288: + 3001 .LBE287: + 3002 .loc 1 1102 44 view .LVU860 + 3003 0038 B2FA82F2 clz r2, r2 + 3004 003c D340 lsrs r3, r3, r2 + 3005 .loc 1 1102 42 view .LVU861 + 3006 003e 4361 str r3, [r0, #20] +1103:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** +1104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Get the LSE configuration -----------------------------------------------*/ +1105:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if((RCC->BDCR &RCC_BDCR_LSEBYP) == RCC_BDCR_LSEBYP) + 3007 .loc 1 1105 3 is_stmt 1 view .LVU862 + 3008 .loc 1 1105 10 is_stmt 0 view .LVU863 + 3009 0040 0B6A ldr r3, [r1, #32] + 3010 .loc 1 1105 5 view .LVU864 + 3011 0042 13F0040F tst r3, #4 + 3012 0046 28D0 beq .L202 +1106:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { +1107:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** RCC_OscInitStruct->LSEState = RCC_LSE_BYPASS; + 3013 .loc 1 1107 5 is_stmt 1 view .LVU865 + 3014 .loc 1 1107 33 is_stmt 0 view .LVU866 + 3015 0048 0523 movs r3, #5 + 3016 004a C360 str r3, [r0, #12] + 3017 .L203: +1108:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } +1109:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** else if((RCC->BDCR &RCC_BDCR_LSEON) == RCC_BDCR_LSEON) +1110:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { +1111:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** RCC_OscInitStruct->LSEState = RCC_LSE_ON; +1112:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } +1113:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** else +1114:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { +1115:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** RCC_OscInitStruct->LSEState = RCC_LSE_OFF; +1116:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } +1117:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** +1118:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Get the LSI configuration -----------------------------------------------*/ +1119:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if((RCC->CSR &RCC_CSR_LSION) == RCC_CSR_LSION) + 3018 .loc 1 1119 3 is_stmt 1 view .LVU867 + 3019 .loc 1 1119 10 is_stmt 0 view .LVU868 + 3020 004c 1B4B ldr r3, .L209 + 3021 004e 5B6A ldr r3, [r3, #36] + 3022 .loc 1 1119 5 view .LVU869 + 3023 0050 13F0010F tst r3, #1 + 3024 0054 2CD0 beq .L205 +1120:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { +1121:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** RCC_OscInitStruct->LSIState = RCC_LSI_ON; + 3025 .loc 1 1121 5 is_stmt 1 view .LVU870 + 3026 .loc 1 1121 33 is_stmt 0 view .LVU871 + 3027 0056 0123 movs r3, #1 + 3028 0058 8361 str r3, [r0, #24] + 3029 .L206: +1122:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + ARM GAS /tmp/cczyIHoC.s page 99 + + +1123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** else +1124:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { +1125:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** RCC_OscInitStruct->LSIState = RCC_LSI_OFF; +1126:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } +1127:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** +1128:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** +1129:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Get the PLL configuration -----------------------------------------------*/ +1130:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if((RCC->CR &RCC_CR_PLLON) == RCC_CR_PLLON) + 3030 .loc 1 1130 3 is_stmt 1 view .LVU872 + 3031 .loc 1 1130 10 is_stmt 0 view .LVU873 + 3032 005a 184B ldr r3, .L209 + 3033 005c 1B68 ldr r3, [r3] + 3034 .loc 1 1130 5 view .LVU874 + 3035 005e 13F0807F tst r3, #16777216 + 3036 0062 28D0 beq .L207 +1131:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { +1132:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** RCC_OscInitStruct->PLL.PLLState = RCC_PLL_ON; + 3037 .loc 1 1132 5 is_stmt 1 view .LVU875 + 3038 .loc 1 1132 37 is_stmt 0 view .LVU876 + 3039 0064 0223 movs r3, #2 + 3040 0066 C361 str r3, [r0, #28] + 3041 .L208: +1133:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } +1134:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** else +1135:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { +1136:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** RCC_OscInitStruct->PLL.PLLState = RCC_PLL_OFF; +1137:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } +1138:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** RCC_OscInitStruct->PLL.PLLSource = (uint32_t)(RCC->CFGR & RCC_CFGR_PLLSRC); + 3042 .loc 1 1138 3 is_stmt 1 view .LVU877 + 3043 .loc 1 1138 52 is_stmt 0 view .LVU878 + 3044 0068 144A ldr r2, .L209 + 3045 006a 5368 ldr r3, [r2, #4] + 3046 .loc 1 1138 38 view .LVU879 + 3047 006c 03F48033 and r3, r3, #65536 + 3048 .loc 1 1138 36 view .LVU880 + 3049 0070 0362 str r3, [r0, #32] +1139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** RCC_OscInitStruct->PLL.PLLMUL = (uint32_t)(RCC->CFGR & RCC_CFGR_PLLMUL); + 3050 .loc 1 1139 3 is_stmt 1 view .LVU881 + 3051 .loc 1 1139 49 is_stmt 0 view .LVU882 + 3052 0072 5368 ldr r3, [r2, #4] + 3053 .loc 1 1139 35 view .LVU883 + 3054 0074 03F47013 and r3, r3, #3932160 + 3055 .loc 1 1139 33 view .LVU884 + 3056 0078 4362 str r3, [r0, #36] +1140:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** #if defined(RCC_CFGR_PLLSRC_HSI_PREDIV) +1141:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** RCC_OscInitStruct->PLL.PREDIV = (uint32_t)(RCC->CFGR2 & RCC_CFGR2_PREDIV); +1142:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** #endif /* RCC_CFGR_PLLSRC_HSI_PREDIV */ +1143:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 3057 .loc 1 1143 1 view .LVU885 + 3058 007a 7047 bx lr + 3059 .L197: +1080:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 3060 .loc 1 1080 8 is_stmt 1 view .LVU886 +1080:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 3061 .loc 1 1080 15 is_stmt 0 view .LVU887 + 3062 007c 0F4B ldr r3, .L209 + 3063 007e 1B68 ldr r3, [r3] + ARM GAS /tmp/cczyIHoC.s page 100 + + +1080:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 3064 .loc 1 1080 10 view .LVU888 + 3065 0080 13F4803F tst r3, #65536 + 3066 0084 03D0 beq .L199 +1082:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 3067 .loc 1 1082 5 is_stmt 1 view .LVU889 +1082:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 3068 .loc 1 1082 33 is_stmt 0 view .LVU890 + 3069 0086 4FF48033 mov r3, #65536 + 3070 008a 4360 str r3, [r0, #4] + 3071 008c C2E7 b .L198 + 3072 .L199: +1086:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 3073 .loc 1 1086 5 is_stmt 1 view .LVU891 +1086:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 3074 .loc 1 1086 33 is_stmt 0 view .LVU892 + 3075 008e 0023 movs r3, #0 + 3076 0090 4360 str r3, [r0, #4] + 3077 0092 BFE7 b .L198 + 3078 .L200: +1099:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 3079 .loc 1 1099 5 is_stmt 1 view .LVU893 +1099:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 3080 .loc 1 1099 33 is_stmt 0 view .LVU894 + 3081 0094 0023 movs r3, #0 + 3082 0096 0361 str r3, [r0, #16] + 3083 0098 C7E7 b .L201 + 3084 .L202: +1109:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 3085 .loc 1 1109 8 is_stmt 1 view .LVU895 +1109:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 3086 .loc 1 1109 15 is_stmt 0 view .LVU896 + 3087 009a 084B ldr r3, .L209 + 3088 009c 1B6A ldr r3, [r3, #32] +1109:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 3089 .loc 1 1109 10 view .LVU897 + 3090 009e 13F0010F tst r3, #1 + 3091 00a2 02D0 beq .L204 +1111:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 3092 .loc 1 1111 5 is_stmt 1 view .LVU898 +1111:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 3093 .loc 1 1111 33 is_stmt 0 view .LVU899 + 3094 00a4 0123 movs r3, #1 + 3095 00a6 C360 str r3, [r0, #12] + 3096 00a8 D0E7 b .L203 + 3097 .L204: +1115:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 3098 .loc 1 1115 5 is_stmt 1 view .LVU900 +1115:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 3099 .loc 1 1115 33 is_stmt 0 view .LVU901 + 3100 00aa 0023 movs r3, #0 + 3101 00ac C360 str r3, [r0, #12] + 3102 00ae CDE7 b .L203 + 3103 .L205: +1125:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 3104 .loc 1 1125 5 is_stmt 1 view .LVU902 +1125:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + ARM GAS /tmp/cczyIHoC.s page 101 + + + 3105 .loc 1 1125 33 is_stmt 0 view .LVU903 + 3106 00b0 0023 movs r3, #0 + 3107 00b2 8361 str r3, [r0, #24] + 3108 00b4 D1E7 b .L206 + 3109 .L207: +1136:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 3110 .loc 1 1136 5 is_stmt 1 view .LVU904 +1136:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 3111 .loc 1 1136 37 is_stmt 0 view .LVU905 + 3112 00b6 0123 movs r3, #1 + 3113 00b8 C361 str r3, [r0, #28] + 3114 00ba D5E7 b .L208 + 3115 .L210: + 3116 .align 2 + 3117 .L209: + 3118 00bc 00100240 .word 1073876992 + 3119 .cfi_endproc + 3120 .LFE140: + 3122 .section .text.HAL_RCC_GetClockConfig,"ax",%progbits + 3123 .align 1 + 3124 .global HAL_RCC_GetClockConfig + 3125 .syntax unified + 3126 .thumb + 3127 .thumb_func + 3129 HAL_RCC_GetClockConfig: + 3130 .LVL214: + 3131 .LFB141: +1144:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** +1145:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /** +1146:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @brief Get the RCC_ClkInitStruct according to the internal +1147:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * RCC configuration registers. +1148:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @param RCC_ClkInitStruct pointer to an RCC_ClkInitTypeDef structure that +1149:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * contains the current clock configuration. +1150:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @param pFLatency Pointer on the Flash Latency. +1151:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @retval None +1152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** */ +1153:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** void HAL_RCC_GetClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t *pFLatency) +1154:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 3132 .loc 1 1154 1 is_stmt 1 view -0 + 3133 .cfi_startproc + 3134 @ args = 0, pretend = 0, frame = 0 + 3135 @ frame_needed = 0, uses_anonymous_args = 0 + 3136 @ link register save eliminated. +1155:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Check the parameters */ +1156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** assert_param(RCC_ClkInitStruct != NULL); + 3137 .loc 1 1156 3 view .LVU907 +1157:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** assert_param(pFLatency != NULL); + 3138 .loc 1 1157 3 view .LVU908 +1158:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** +1159:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Set all possible values for the Clock type parameter --------------------*/ +1160:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** RCC_ClkInitStruct->ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | + 3139 .loc 1 1160 3 view .LVU909 + 3140 .loc 1 1160 32 is_stmt 0 view .LVU910 + 3141 0000 0F23 movs r3, #15 + 3142 0002 0360 str r3, [r0] +1161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** +1162:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Get the SYSCLK configuration --------------------------------------------*/ + ARM GAS /tmp/cczyIHoC.s page 102 + + +1163:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** RCC_ClkInitStruct->SYSCLKSource = (uint32_t)(RCC->CFGR & RCC_CFGR_SW); + 3143 .loc 1 1163 3 is_stmt 1 view .LVU911 + 3144 .loc 1 1163 51 is_stmt 0 view .LVU912 + 3145 0004 0B4B ldr r3, .L212 + 3146 0006 5A68 ldr r2, [r3, #4] + 3147 .loc 1 1163 37 view .LVU913 + 3148 0008 02F00302 and r2, r2, #3 + 3149 .loc 1 1163 35 view .LVU914 + 3150 000c 4260 str r2, [r0, #4] +1164:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** +1165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Get the HCLK configuration ----------------------------------------------*/ +1166:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** RCC_ClkInitStruct->AHBCLKDivider = (uint32_t)(RCC->CFGR & RCC_CFGR_HPRE); + 3151 .loc 1 1166 3 is_stmt 1 view .LVU915 + 3152 .loc 1 1166 52 is_stmt 0 view .LVU916 + 3153 000e 5A68 ldr r2, [r3, #4] + 3154 .loc 1 1166 38 view .LVU917 + 3155 0010 02F0F002 and r2, r2, #240 + 3156 .loc 1 1166 36 view .LVU918 + 3157 0014 8260 str r2, [r0, #8] +1167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** +1168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Get the APB1 configuration ----------------------------------------------*/ +1169:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** RCC_ClkInitStruct->APB1CLKDivider = (uint32_t)(RCC->CFGR & RCC_CFGR_PPRE1); + 3158 .loc 1 1169 3 is_stmt 1 view .LVU919 + 3159 .loc 1 1169 53 is_stmt 0 view .LVU920 + 3160 0016 5A68 ldr r2, [r3, #4] + 3161 .loc 1 1169 39 view .LVU921 + 3162 0018 02F4E062 and r2, r2, #1792 + 3163 .loc 1 1169 37 view .LVU922 + 3164 001c C260 str r2, [r0, #12] +1170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** +1171:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Get the APB2 configuration ----------------------------------------------*/ +1172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** RCC_ClkInitStruct->APB2CLKDivider = (uint32_t)((RCC->CFGR & RCC_CFGR_PPRE2) >> 3U); + 3165 .loc 1 1172 3 is_stmt 1 view .LVU923 + 3166 .loc 1 1172 54 is_stmt 0 view .LVU924 + 3167 001e 5B68 ldr r3, [r3, #4] + 3168 .loc 1 1172 39 view .LVU925 + 3169 0020 DB08 lsrs r3, r3, #3 + 3170 0022 03F4E063 and r3, r3, #1792 + 3171 .loc 1 1172 37 view .LVU926 + 3172 0026 0361 str r3, [r0, #16] +1173:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** +1174:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Get the Flash Wait State (Latency) configuration ------------------------*/ +1175:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** *pFLatency = (uint32_t)(FLASH->ACR & FLASH_ACR_LATENCY); + 3173 .loc 1 1175 3 is_stmt 1 view .LVU927 + 3174 .loc 1 1175 32 is_stmt 0 view .LVU928 + 3175 0028 034B ldr r3, .L212+4 + 3176 002a 1B68 ldr r3, [r3] + 3177 .loc 1 1175 16 view .LVU929 + 3178 002c 03F00703 and r3, r3, #7 + 3179 .loc 1 1175 14 view .LVU930 + 3180 0030 0B60 str r3, [r1] +1176:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 3181 .loc 1 1176 1 view .LVU931 + 3182 0032 7047 bx lr + 3183 .L213: + 3184 .align 2 + 3185 .L212: + ARM GAS /tmp/cczyIHoC.s page 103 + + + 3186 0034 00100240 .word 1073876992 + 3187 0038 00200240 .word 1073881088 + 3188 .cfi_endproc + 3189 .LFE141: + 3191 .section .text.HAL_RCC_CSSCallback,"ax",%progbits + 3192 .align 1 + 3193 .weak HAL_RCC_CSSCallback + 3194 .syntax unified + 3195 .thumb + 3196 .thumb_func + 3198 HAL_RCC_CSSCallback: + 3199 .LFB143: +1177:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** +1178:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /** +1179:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @brief This function handles the RCC CSS interrupt request. +1180:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @note This API should be called under the NMI_Handler(). +1181:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @retval None +1182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** */ +1183:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** void HAL_RCC_NMI_IRQHandler(void) +1184:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { +1185:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Check RCC CSSF flag */ +1186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** if(__HAL_RCC_GET_IT(RCC_IT_CSS)) +1187:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { +1188:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* RCC Clock Security System interrupt user callback */ +1189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** HAL_RCC_CSSCallback(); +1190:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** +1191:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Clear RCC CSS pending bit */ +1192:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** __HAL_RCC_CLEAR_IT(RCC_IT_CSS); +1193:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } +1194:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } +1195:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** +1196:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /** +1197:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @brief RCC Clock Security System interrupt callback +1198:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** * @retval none +1199:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** */ +1200:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** __weak void HAL_RCC_CSSCallback(void) +1201:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 3200 .loc 1 1201 1 is_stmt 1 view -0 + 3201 .cfi_startproc + 3202 @ args = 0, pretend = 0, frame = 0 + 3203 @ frame_needed = 0, uses_anonymous_args = 0 + 3204 @ link register save eliminated. +1202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* NOTE : This function Should not be modified, when the callback is needed, +1203:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** the HAL_RCC_CSSCallback could be implemented in the user file +1204:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** */ +1205:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 3205 .loc 1 1205 1 view .LVU933 + 3206 0000 7047 bx lr + 3207 .cfi_endproc + 3208 .LFE143: + 3210 .section .text.HAL_RCC_NMI_IRQHandler,"ax",%progbits + 3211 .align 1 + 3212 .global HAL_RCC_NMI_IRQHandler + 3213 .syntax unified + 3214 .thumb + 3215 .thumb_func + 3217 HAL_RCC_NMI_IRQHandler: + ARM GAS /tmp/cczyIHoC.s page 104 + + + 3218 .LFB142: +1184:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** /* Check RCC CSSF flag */ + 3219 .loc 1 1184 1 view -0 + 3220 .cfi_startproc + 3221 @ args = 0, pretend = 0, frame = 0 + 3222 @ frame_needed = 0, uses_anonymous_args = 0 + 3223 0000 08B5 push {r3, lr} + 3224 .cfi_def_cfa_offset 8 + 3225 .cfi_offset 3, -8 + 3226 .cfi_offset 14, -4 +1186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 3227 .loc 1 1186 3 view .LVU935 +1186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 3228 .loc 1 1186 6 is_stmt 0 view .LVU936 + 3229 0002 064B ldr r3, .L219 + 3230 0004 9B68 ldr r3, [r3, #8] +1186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** { + 3231 .loc 1 1186 5 view .LVU937 + 3232 0006 13F0800F tst r3, #128 + 3233 000a 00D1 bne .L218 + 3234 .L215: +1194:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 3235 .loc 1 1194 1 view .LVU938 + 3236 000c 08BD pop {r3, pc} + 3237 .L218: +1189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 3238 .loc 1 1189 5 is_stmt 1 view .LVU939 + 3239 000e FFF7FEFF bl HAL_RCC_CSSCallback + 3240 .LVL215: +1192:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** } + 3241 .loc 1 1192 5 view .LVU940 + 3242 0012 024B ldr r3, .L219 + 3243 0014 8022 movs r2, #128 + 3244 0016 9A72 strb r2, [r3, #10] +1194:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c **** + 3245 .loc 1 1194 1 is_stmt 0 view .LVU941 + 3246 0018 F8E7 b .L215 + 3247 .L220: + 3248 001a 00BF .align 2 + 3249 .L219: + 3250 001c 00100240 .word 1073876992 + 3251 .cfi_endproc + 3252 .LFE142: + 3254 .global aPredivFactorTable + 3255 .section .rodata.aPredivFactorTable,"a" + 3256 .align 2 + 3259 aPredivFactorTable: + 3260 0000 01020304 .ascii "\001\002\003\004\005\006\007\010\011\012\013\014\015" + 3260 05060708 + 3260 090A0B0C + 3260 0D + 3261 000d 0E0F10 .ascii "\016\017\020" + 3262 .global aPLLMULFactorTable + 3263 .section .rodata.aPLLMULFactorTable,"a" + 3264 .align 2 + 3267 aPLLMULFactorTable: + 3268 0000 02030405 .ascii "\002\003\004\005\006\007\010\011\012\013\014\015\016" + ARM GAS /tmp/cczyIHoC.s page 105 + + + 3268 06070809 + 3268 0A0B0C0D + 3268 0E + 3269 000d 0F1010 .ascii "\017\020\020" + 3270 .text + 3271 .Letext0: + 3272 .file 3 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 3273 .file 4 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 3274 .file 5 "Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h" + 3275 .file 6 "Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h" + 3276 .file 7 "Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h" + 3277 .file 8 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h" + 3278 .file 9 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h" + 3279 .file 10 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h" + 3280 .file 11 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h" + ARM GAS /tmp/cczyIHoC.s page 106 + + +DEFINED SYMBOLS + *ABS*:0000000000000000 stm32f3xx_hal_rcc.c + /tmp/cczyIHoC.s:21 .text.HAL_RCC_DeInit:0000000000000000 $t + /tmp/cczyIHoC.s:27 .text.HAL_RCC_DeInit:0000000000000000 HAL_RCC_DeInit + /tmp/cczyIHoC.s:228 .text.HAL_RCC_DeInit:00000000000000dc $d + /tmp/cczyIHoC.s:238 .text.HAL_RCC_OscConfig:0000000000000000 $t + /tmp/cczyIHoC.s:244 .text.HAL_RCC_OscConfig:0000000000000000 HAL_RCC_OscConfig + /tmp/cczyIHoC.s:1056 .text.HAL_RCC_OscConfig:00000000000002e8 $d + /tmp/cczyIHoC.s:1067 .text.HAL_RCC_OscConfig:00000000000002f0 $t + /tmp/cczyIHoC.s:1915 .text.HAL_RCC_OscConfig:00000000000005d8 $d + /tmp/cczyIHoC.s:1922 .text.HAL_RCC_OscConfig:00000000000005e4 $t + /tmp/cczyIHoC.s:2019 .text.HAL_RCC_OscConfig:000000000000062c $d + /tmp/cczyIHoC.s:2024 .text.HAL_RCC_MCOConfig:0000000000000000 $t + /tmp/cczyIHoC.s:2030 .text.HAL_RCC_MCOConfig:0000000000000000 HAL_RCC_MCOConfig + /tmp/cczyIHoC.s:2111 .text.HAL_RCC_MCOConfig:0000000000000048 $d + /tmp/cczyIHoC.s:2116 .text.HAL_RCC_EnableCSS:0000000000000000 $t + /tmp/cczyIHoC.s:2122 .text.HAL_RCC_EnableCSS:0000000000000000 HAL_RCC_EnableCSS + /tmp/cczyIHoC.s:2163 .text.HAL_RCC_DisableCSS:0000000000000000 $t + /tmp/cczyIHoC.s:2169 .text.HAL_RCC_DisableCSS:0000000000000000 HAL_RCC_DisableCSS + /tmp/cczyIHoC.s:2210 .text.HAL_RCC_GetSysClockFreq:0000000000000000 $t + /tmp/cczyIHoC.s:2216 .text.HAL_RCC_GetSysClockFreq:0000000000000000 HAL_RCC_GetSysClockFreq + /tmp/cczyIHoC.s:2337 .text.HAL_RCC_GetSysClockFreq:0000000000000064 $d + /tmp/cczyIHoC.s:3267 .rodata.aPLLMULFactorTable:0000000000000000 aPLLMULFactorTable + /tmp/cczyIHoC.s:3259 .rodata.aPredivFactorTable:0000000000000000 aPredivFactorTable + /tmp/cczyIHoC.s:2347 .text.HAL_RCC_ClockConfig:0000000000000000 $t + /tmp/cczyIHoC.s:2353 .text.HAL_RCC_ClockConfig:0000000000000000 HAL_RCC_ClockConfig + /tmp/cczyIHoC.s:2769 .text.HAL_RCC_ClockConfig:0000000000000194 $d + /tmp/cczyIHoC.s:2778 .text.HAL_RCC_GetHCLKFreq:0000000000000000 $t + /tmp/cczyIHoC.s:2784 .text.HAL_RCC_GetHCLKFreq:0000000000000000 HAL_RCC_GetHCLKFreq + /tmp/cczyIHoC.s:2799 .text.HAL_RCC_GetHCLKFreq:0000000000000008 $d + /tmp/cczyIHoC.s:2804 .text.HAL_RCC_GetPCLK1Freq:0000000000000000 $t + /tmp/cczyIHoC.s:2810 .text.HAL_RCC_GetPCLK1Freq:0000000000000000 HAL_RCC_GetPCLK1Freq + /tmp/cczyIHoC.s:2860 .text.HAL_RCC_GetPCLK1Freq:0000000000000024 $d + /tmp/cczyIHoC.s:2866 .text.HAL_RCC_GetPCLK2Freq:0000000000000000 $t + /tmp/cczyIHoC.s:2872 .text.HAL_RCC_GetPCLK2Freq:0000000000000000 HAL_RCC_GetPCLK2Freq + /tmp/cczyIHoC.s:2922 .text.HAL_RCC_GetPCLK2Freq:0000000000000024 $d + /tmp/cczyIHoC.s:2928 .text.HAL_RCC_GetOscConfig:0000000000000000 $t + /tmp/cczyIHoC.s:2934 .text.HAL_RCC_GetOscConfig:0000000000000000 HAL_RCC_GetOscConfig + /tmp/cczyIHoC.s:3118 .text.HAL_RCC_GetOscConfig:00000000000000bc $d + /tmp/cczyIHoC.s:3123 .text.HAL_RCC_GetClockConfig:0000000000000000 $t + /tmp/cczyIHoC.s:3129 .text.HAL_RCC_GetClockConfig:0000000000000000 HAL_RCC_GetClockConfig + /tmp/cczyIHoC.s:3186 .text.HAL_RCC_GetClockConfig:0000000000000034 $d + /tmp/cczyIHoC.s:3192 .text.HAL_RCC_CSSCallback:0000000000000000 $t + /tmp/cczyIHoC.s:3198 .text.HAL_RCC_CSSCallback:0000000000000000 HAL_RCC_CSSCallback + /tmp/cczyIHoC.s:3211 .text.HAL_RCC_NMI_IRQHandler:0000000000000000 $t + /tmp/cczyIHoC.s:3217 .text.HAL_RCC_NMI_IRQHandler:0000000000000000 HAL_RCC_NMI_IRQHandler + /tmp/cczyIHoC.s:3250 .text.HAL_RCC_NMI_IRQHandler:000000000000001c $d + /tmp/cczyIHoC.s:3256 .rodata.aPredivFactorTable:0000000000000000 $d + /tmp/cczyIHoC.s:3264 .rodata.aPLLMULFactorTable:0000000000000000 $d + +UNDEFINED SYMBOLS +HAL_GetTick +HAL_InitTick +SystemCoreClock +uwTickPrio +HAL_GPIO_Init +AHBPrescTable + ARM GAS /tmp/cczyIHoC.s page 107 + + +APBPrescTable diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_rcc.o b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_rcc.o new file mode 100644 index 0000000000000000000000000000000000000000..9476579c8fb7158b415452ecc6fbbc541e311728 GIT binary patch literal 28924 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 literal 0 HcmV?d00001 diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_rcc_ex.d b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_rcc_ex.d new file mode 100644 index 0000000..2b0b285 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_rcc_ex.d @@ -0,0 +1,58 @@ +build/stm32f3xx_hal_rcc_ex.o: \ + Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h \ + Core/Inc/stm32f3xx_hal_conf.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h \ + Drivers/CMSIS/Include/core_cm4.h Drivers/CMSIS/Include/cmsis_version.h \ + Drivers/CMSIS/Include/cmsis_compiler.h Drivers/CMSIS/Include/cmsis_gcc.h \ + Drivers/CMSIS/Include/mpu_armv7.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h: +Core/Inc/stm32f3xx_hal_conf.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h: +Drivers/CMSIS/Include/core_cm4.h: +Drivers/CMSIS/Include/cmsis_version.h: +Drivers/CMSIS/Include/cmsis_compiler.h: +Drivers/CMSIS/Include/cmsis_gcc.h: +Drivers/CMSIS/Include/mpu_armv7.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h: +Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h: diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_rcc_ex.lst b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_rcc_ex.lst new file mode 100644 index 0000000..12d9789 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_rcc_ex.lst @@ -0,0 +1,4835 @@ +ARM GAS /tmp/ccLRMPc2.s page 1 + + + 1 .cpu cortex-m4 + 2 .arch armv7e-m + 3 .fpu fpv4-sp-d16 + 4 .eabi_attribute 27, 1 + 5 .eabi_attribute 28, 1 + 6 .eabi_attribute 20, 1 + 7 .eabi_attribute 21, 1 + 8 .eabi_attribute 23, 3 + 9 .eabi_attribute 24, 1 + 10 .eabi_attribute 25, 1 + 11 .eabi_attribute 26, 1 + 12 .eabi_attribute 30, 1 + 13 .eabi_attribute 34, 1 + 14 .eabi_attribute 18, 4 + 15 .file "stm32f3xx_hal_rcc_ex.c" + 16 .text + 17 .Ltext0: + 18 .cfi_sections .debug_frame + 19 .file 1 "Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c" + 20 .section .text.RCC_GetPLLCLKFreq,"ax",%progbits + 21 .align 1 + 22 .syntax unified + 23 .thumb + 24 .thumb_func + 26 RCC_GetPLLCLKFreq: + 27 .LFB133: + 1:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /** + 2:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** ****************************************************************************** + 3:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @file stm32f3xx_hal_rcc_ex.c + 4:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @author MCD Application Team + 5:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @brief Extended RCC HAL module driver. + 6:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * This file provides firmware functions to manage the following + 7:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * functionalities RCC extension peripheral: + 8:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * + Extended Peripheral Control functions + 9:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * + 10:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** ****************************************************************************** + 11:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @attention + 12:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * + 13:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** *

    © Copyright (c) 2016 STMicroelectronics. + 14:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * All rights reserved.

    + 15:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * + 16:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * This software component is licensed by ST under BSD 3-Clause license, + 17:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * the "License"; You may not use this file except in compliance with the + 18:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * License. You may obtain a copy of the License at: + 19:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * opensource.org/licenses/BSD-3-Clause + 20:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * + 21:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** ****************************************************************************** + 22:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** */ + 23:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 24:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Includes ------------------------------------------------------------------*/ + 25:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #include "stm32f3xx_hal.h" + 26:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 27:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /** @addtogroup STM32F3xx_HAL_Driver + 28:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @{ + 29:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** */ + 30:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 31:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #ifdef HAL_RCC_MODULE_ENABLED + ARM GAS /tmp/ccLRMPc2.s page 2 + + + 32:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 33:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /** @defgroup RCCEx RCCEx + 34:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @brief RCC Extension HAL module driver. + 35:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @{ + 36:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** */ + 37:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 38:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Private typedef -----------------------------------------------------------*/ + 39:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Private define ------------------------------------------------------------*/ + 40:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Private macro -------------------------------------------------------------*/ + 41:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /** @defgroup RCCEx_Private_Macros RCCEx Private Macros + 42:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @{ + 43:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** */ + 44:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /** + 45:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @} + 46:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** */ + 47:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 48:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Private variables ---------------------------------------------------------*/ + 49:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Private function prototypes -----------------------------------------------*/ + 50:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Private functions ---------------------------------------------------------*/ + 51:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(RCC_CFGR2_ADC1PRES) || defined(RCC_CFGR2_ADCPRE12) || defined(RCC_CFGR2_ADCPRE34) || de + 52:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** || defined(RCC_CFGR3_TIM1SW) || defined(RCC_CFGR3_TIM2SW) || defined(RCC_CFGR3_TIM8SW) || defined( + 53:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** || defined(RCC_CFGR3_TIM16SW) || defined(RCC_CFGR3_TIM17SW) || defined(RCC_CFGR3_TIM20SW) || defin + 54:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** || defined(RCC_CFGR3_HRTIM1SW) + 55:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /** @defgroup RCCEx_Private_Functions RCCEx Private Functions + 56:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @{ + 57:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** */ + 58:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** static uint32_t RCC_GetPLLCLKFreq(void); + 59:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 60:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /** + 61:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @} + 62:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** */ + 63:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* RCC_CFGR2_ADC1PRES || RCC_CFGR2_ADCPRExx || RCC_CFGR3_TIMxSW || RCC_CFGR3_HRTIM1SW || RCC + 64:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 65:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /** @defgroup RCCEx_Exported_Functions RCCEx Exported Functions + 66:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @{ + 67:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** */ + 68:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 69:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /** @defgroup RCCEx_Exported_Functions_Group1 Extended Peripheral Control functions + 70:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @brief Extended Peripheral Control functions + 71:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * + 72:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** @verbatim + 73:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** =============================================================================== + 74:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** ##### Extended Peripheral Control functions ##### + 75:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** =============================================================================== + 76:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** [..] + 77:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** This subsection provides a set of functions allowing to control the RCC Clocks + 78:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequencies. + 79:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** [..] + 80:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** (@) Important note: Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to + 81:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** select the RTC clock source; in this case the Backup domain will be reset in + 82:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** order to modify the RTC Clock source, as consequence RTC registers (including + 83:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** the backup registers) are set to their reset values. + 84:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 85:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** @endverbatim + 86:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @{ + 87:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** */ + 88:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + ARM GAS /tmp/ccLRMPc2.s page 3 + + + 89:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /** + 90:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @brief Initializes the RCC extended peripherals clocks according to the specified + 91:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * parameters in the RCC_PeriphCLKInitTypeDef. + 92:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that + 93:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * contains the configuration information for the Extended Peripherals clocks + 94:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * (ADC, CEC, I2C, I2S, SDADC, HRTIM, TIM, USART, RTC and USB). + 95:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * + 96:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @note Care must be taken when HAL_RCCEx_PeriphCLKConfig() is used to select + 97:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * the RTC clock source; in this case the Backup domain will be reset in + 98:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * order to modify the RTC Clock source, as consequence RTC registers (including + 99:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * the backup registers) and RCC_BDCR register are set to their reset values. + 100:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * + 101:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @note When the TIMx clock source is APB clock, so the TIMx clock is APB clock or + 102:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * APB clock x 2 depending on the APB prescaler. + 103:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * When the TIMx clock source is PLL clock, so the TIMx clock is PLL clock x 2. + 104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * + 105:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @retval HAL status + 106:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** */ + 107:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** HAL_StatusTypeDef HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) + 108:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 109:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** uint32_t tickstart = 0U; + 110:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** uint32_t temp_reg = 0U; + 111:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** FlagStatus pwrclkchanged = RESET; + 112:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 113:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check the parameters */ + 114:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** assert_param(IS_RCC_PERIPHCLOCK(PeriphClkInit->PeriphClockSelection)); + 115:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 116:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /*---------------------------- RTC configuration -------------------------------*/ + 117:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_RTC) == (RCC_PERIPHCLK_RTC)) + 118:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 119:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* check for RTC Parameters used to output RTCCLK */ + 120:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** assert_param(IS_RCC_RTCCLKSOURCE(PeriphClkInit->RTCClockSelection)); + 121:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 122:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* As soon as function is called to change RTC clock source, activation of the + 124:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** power domain is done. */ + 125:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Requires to enable write access to Backup Domain of necessary */ + 126:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if(__HAL_RCC_PWR_IS_CLK_DISABLED()) + 127:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 128:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** __HAL_RCC_PWR_CLK_ENABLE(); + 129:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** pwrclkchanged = SET; + 130:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 131:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 132:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if(HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) + 133:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 134:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Enable write access to Backup domain */ + 135:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** SET_BIT(PWR->CR, PWR_CR_DBP); + 136:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 137:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Wait for Backup domain Write protection disable */ + 138:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** tickstart = HAL_GetTick(); + 139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 140:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** while(HAL_IS_BIT_CLR(PWR->CR, PWR_CR_DBP)) + 141:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 142:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) + 143:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 144:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** return HAL_TIMEOUT; + 145:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + ARM GAS /tmp/ccLRMPc2.s page 4 + + + 146:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 147:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 148:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 149:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Reset the Backup domain only if the RTC Clock source selection is modified from reset value + 150:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** temp_reg = (RCC->BDCR & RCC_BDCR_RTCSEL); + 151:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if((temp_reg != 0x00000000U) && (temp_reg != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSE + 152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 153:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Store the content of BDCR register before the reset of Backup Domain */ + 154:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** temp_reg = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); + 155:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* RTC Clock selection can be changed only if the Backup Domain is reset */ + 156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** __HAL_RCC_BACKUPRESET_FORCE(); + 157:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** __HAL_RCC_BACKUPRESET_RELEASE(); + 158:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Restore the Content of BDCR register */ + 159:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** RCC->BDCR = temp_reg; + 160:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Wait for LSERDY if LSE was enabled */ + 162:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if (HAL_IS_BIT_SET(temp_reg, RCC_BDCR_LSEON)) + 163:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 164:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get Start Tick */ + 165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** tickstart = HAL_GetTick(); + 166:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Wait till LSE is ready */ + 168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) + 169:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) + 171:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** return HAL_TIMEOUT; + 173:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 174:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 175:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 176:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 177:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** __HAL_RCC_RTC_CONFIG(PeriphClkInit->RTCClockSelection); + 178:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 179:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Require to disable power clock if necessary */ + 180:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if(pwrclkchanged == SET) + 181:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** __HAL_RCC_PWR_CLK_DISABLE(); + 183:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 184:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 185:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /*------------------------------- USART1 Configuration ------------------------*/ + 187:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_USART1) == RCC_PERIPHCLK_USART1) + 188:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check the parameters */ + 190:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** assert_param(IS_RCC_USART1CLKSOURCE(PeriphClkInit->Usart1ClockSelection)); + 191:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 192:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Configure the USART1 clock source */ + 193:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** __HAL_RCC_USART1_CONFIG(PeriphClkInit->Usart1ClockSelection); + 194:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 195:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 196:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(RCC_CFGR3_USART2SW) + 197:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /*----------------------------- USART2 Configuration --------------------------*/ + 198:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_USART2) == RCC_PERIPHCLK_USART2) + 199:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 200:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check the parameters */ + 201:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** assert_param(IS_RCC_USART2CLKSOURCE(PeriphClkInit->Usart2ClockSelection)); + 202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + ARM GAS /tmp/ccLRMPc2.s page 5 + + + 203:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Configure the USART2 clock source */ + 204:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** __HAL_RCC_USART2_CONFIG(PeriphClkInit->Usart2ClockSelection); + 205:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 206:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* RCC_CFGR3_USART2SW */ + 207:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 208:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(RCC_CFGR3_USART3SW) + 209:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /*------------------------------ USART3 Configuration ------------------------*/ + 210:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_USART3) == RCC_PERIPHCLK_USART3) + 211:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 212:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check the parameters */ + 213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** assert_param(IS_RCC_USART3CLKSOURCE(PeriphClkInit->Usart3ClockSelection)); + 214:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 215:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Configure the USART3 clock source */ + 216:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** __HAL_RCC_USART3_CONFIG(PeriphClkInit->Usart3ClockSelection); + 217:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 218:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* RCC_CFGR3_USART3SW */ + 219:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 220:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /*------------------------------ I2C1 Configuration ------------------------*/ + 221:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2C1) == RCC_PERIPHCLK_I2C1) + 222:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 223:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check the parameters */ + 224:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** assert_param(IS_RCC_I2C1CLKSOURCE(PeriphClkInit->I2c1ClockSelection)); + 225:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 226:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Configure the I2C1 clock source */ + 227:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** __HAL_RCC_I2C1_CONFIG(PeriphClkInit->I2c1ClockSelection); + 228:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 229:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 230:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(STM32F302xE) || defined(STM32F303xE)\ + 231:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** || defined(STM32F302xC) || defined(STM32F303xC)\ + 232:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** || defined(STM32F302x8) \ + 233:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** || defined(STM32F373xC) + 234:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /*------------------------------ USB Configuration ------------------------*/ + 235:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_USB) == RCC_PERIPHCLK_USB) + 236:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 237:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check the parameters */ + 238:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** assert_param(IS_RCC_USBCLKSOURCE(PeriphClkInit->USBClockSelection)); + 239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 240:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Configure the USB clock source */ + 241:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** __HAL_RCC_USB_CONFIG(PeriphClkInit->USBClockSelection); + 242:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 243:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 244:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* STM32F302xE || STM32F303xE || */ + 245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* STM32F302xC || STM32F303xC || */ + 246:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* STM32F302x8 || */ + 247:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* STM32F373xC */ + 248:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx)\ + 250:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** || defined(STM32F302xC) || defined(STM32F303xC) || defined(STM32F358xx)\ + 251:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** || defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx)\ + 252:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** || defined(STM32F373xC) || defined(STM32F378xx) + 253:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 254:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /*------------------------------ I2C2 Configuration ------------------------*/ + 255:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2C2) == RCC_PERIPHCLK_I2C2) + 256:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 257:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check the parameters */ + 258:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** assert_param(IS_RCC_I2C2CLKSOURCE(PeriphClkInit->I2c2ClockSelection)); + 259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + ARM GAS /tmp/ccLRMPc2.s page 6 + + + 260:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Configure the I2C2 clock source */ + 261:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** __HAL_RCC_I2C2_CONFIG(PeriphClkInit->I2c2ClockSelection); + 262:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 263:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 264:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* STM32F302xE || STM32F303xE || STM32F398xx || */ + 265:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* STM32F302xC || STM32F303xC || STM32F358xx || */ + 266:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* STM32F301x8 || STM32F302x8 || STM32F318xx || */ + 267:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* STM32F373xC || STM32F378xx */ + 268:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 269:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx)\ + 270:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** || defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx) + 271:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 272:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /*------------------------------ I2C3 Configuration ------------------------*/ + 273:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2C3) == RCC_PERIPHCLK_I2C3) + 274:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check the parameters */ + 276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** assert_param(IS_RCC_I2C3CLKSOURCE(PeriphClkInit->I2c3ClockSelection)); + 277:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 278:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Configure the I2C3 clock source */ + 279:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** __HAL_RCC_I2C3_CONFIG(PeriphClkInit->I2c3ClockSelection); + 280:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 281:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* STM32F302xE || STM32F303xE || STM32F398xx || */ + 282:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* STM32F301x8 || STM32F302x8 || STM32F318xx */ + 283:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 284:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx)\ + 285:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** || defined(STM32F302xC) || defined(STM32F303xC) || defined(STM32F358xx) + 286:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 287:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /*------------------------------ UART4 Configuration ------------------------*/ + 288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_UART4) == RCC_PERIPHCLK_UART4) + 289:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 290:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check the parameters */ + 291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** assert_param(IS_RCC_UART4CLKSOURCE(PeriphClkInit->Uart4ClockSelection)); + 292:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 293:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Configure the UART4 clock source */ + 294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** __HAL_RCC_UART4_CONFIG(PeriphClkInit->Uart4ClockSelection); + 295:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 297:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /*------------------------------ UART5 Configuration ------------------------*/ + 298:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_UART5) == RCC_PERIPHCLK_UART5) + 299:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 300:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check the parameters */ + 301:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** assert_param(IS_RCC_UART5CLKSOURCE(PeriphClkInit->Uart5ClockSelection)); + 302:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 303:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Configure the UART5 clock source */ + 304:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** __HAL_RCC_UART5_CONFIG(PeriphClkInit->Uart5ClockSelection); + 305:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 306:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 307:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* STM32F302xE || STM32F303xE || STM32F398xx || */ + 308:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* STM32F302xC || STM32F303xC || STM32F358xx */ + 309:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 310:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx)\ + 311:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** || defined(STM32F302xC) || defined(STM32F303xC) || defined(STM32F358xx)\ + 312:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** || defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx) + 313:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /*------------------------------ I2S Configuration ------------------------*/ + 314:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_I2S) == RCC_PERIPHCLK_I2S) + 315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 316:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check the parameters */ + ARM GAS /tmp/ccLRMPc2.s page 7 + + + 317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** assert_param(IS_RCC_I2SCLKSOURCE(PeriphClkInit->I2sClockSelection)); + 318:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 319:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Configure the I2S clock source */ + 320:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** __HAL_RCC_I2S_CONFIG(PeriphClkInit->I2sClockSelection); + 321:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 322:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* STM32F302xE || STM32F303xE || STM32F398xx || */ + 324:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* STM32F302xC || STM32F303xC || STM32F358xx || */ + 325:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* STM32F301x8 || STM32F302x8 || STM32F318xx */ + 326:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 327:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx) + 328:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 329:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /*------------------------------ ADC1 clock Configuration ------------------*/ + 330:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_ADC1) == RCC_PERIPHCLK_ADC1) + 331:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 332:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check the parameters */ + 333:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** assert_param(IS_RCC_ADC1PLLCLK_DIV(PeriphClkInit->Adc1ClockSelection)); + 334:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 335:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Configure the ADC1 clock source */ + 336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** __HAL_RCC_ADC1_CONFIG(PeriphClkInit->Adc1ClockSelection); + 337:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 338:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 339:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* STM32F301x8 || STM32F302x8 || STM32F318xx */ + 340:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 341:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx)\ + 342:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** || defined(STM32F302xC) || defined(STM32F303xC) || defined(STM32F358xx)\ + 343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** || defined(STM32F303x8) || defined(STM32F334x8) || defined(STM32F328xx) + 344:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 345:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /*------------------------------ ADC1 & ADC2 clock Configuration -------------*/ + 346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_ADC12) == RCC_PERIPHCLK_ADC12) + 347:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 348:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check the parameters */ + 349:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** assert_param(IS_RCC_ADC12PLLCLK_DIV(PeriphClkInit->Adc12ClockSelection)); + 350:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 351:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Configure the ADC12 clock source */ + 352:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** __HAL_RCC_ADC12_CONFIG(PeriphClkInit->Adc12ClockSelection); + 353:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 354:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* STM32F302xE || STM32F303xE || STM32F398xx || */ + 356:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* STM32F302xC || STM32F303xC || STM32F358xx || */ + 357:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* STM32F303x8 || STM32F334x8 || STM32F328xx */ + 358:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 359:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(STM32F303xE) || defined(STM32F398xx)\ + 360:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** || defined(STM32F303xC) || defined(STM32F358xx) + 361:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 362:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /*------------------------------ ADC3 & ADC4 clock Configuration -------------*/ + 363:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_ADC34) == RCC_PERIPHCLK_ADC34) + 364:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check the parameters */ + 366:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** assert_param(IS_RCC_ADC34PLLCLK_DIV(PeriphClkInit->Adc34ClockSelection)); + 367:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 368:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Configure the ADC34 clock source */ + 369:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** __HAL_RCC_ADC34_CONFIG(PeriphClkInit->Adc34ClockSelection); + 370:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 371:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 372:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* STM32F303xE || STM32F398xx || */ + 373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* STM32F303xC || STM32F358xx */ + ARM GAS /tmp/ccLRMPc2.s page 8 + + + 374:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 375:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(STM32F373xC) || defined(STM32F378xx) + 376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 377:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /*------------------------------ ADC1 clock Configuration ------------------*/ + 378:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_ADC1) == RCC_PERIPHCLK_ADC1) + 379:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 380:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check the parameters */ + 381:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** assert_param(IS_RCC_ADC1PCLK2_DIV(PeriphClkInit->Adc1ClockSelection)); + 382:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Configure the ADC1 clock source */ + 384:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** __HAL_RCC_ADC1_CONFIG(PeriphClkInit->Adc1ClockSelection); + 385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 387:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* STM32F373xC || STM32F378xx */ + 388:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 389:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx)\ + 390:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** || defined(STM32F302xC) || defined(STM32F303xC) || defined(STM32F358xx)\ + 391:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** || defined(STM32F303x8) || defined(STM32F334x8) || defined(STM32F328xx)\ + 392:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** || defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx) + 393:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 394:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /*------------------------------ TIM1 clock Configuration ----------------*/ + 395:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM1) == RCC_PERIPHCLK_TIM1) + 396:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 397:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check the parameters */ + 398:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** assert_param(IS_RCC_TIM1CLKSOURCE(PeriphClkInit->Tim1ClockSelection)); + 399:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 400:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Configure the TIM1 clock source */ + 401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** __HAL_RCC_TIM1_CONFIG(PeriphClkInit->Tim1ClockSelection); + 402:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 403:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 404:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* STM32F302xE || STM32F303xE || STM32F398xx || */ + 405:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* STM32F302xC || STM32F303xC || STM32F358xx || */ + 406:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* STM32F303x8 || STM32F334x8 || STM32F328xx || */ + 407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* STM32F301x8 || STM32F302x8 || STM32F318xx */ + 408:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 409:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(STM32F303xE) || defined(STM32F398xx)\ + 410:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** || defined(STM32F303xC) || defined(STM32F358xx) + 411:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 412:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /*------------------------------ TIM8 clock Configuration ----------------*/ + 413:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM8) == RCC_PERIPHCLK_TIM8) + 414:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 415:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check the parameters */ + 416:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** assert_param(IS_RCC_TIM8CLKSOURCE(PeriphClkInit->Tim8ClockSelection)); + 417:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 418:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Configure the TIM8 clock source */ + 419:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** __HAL_RCC_TIM8_CONFIG(PeriphClkInit->Tim8ClockSelection); + 420:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 421:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 422:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* STM32F303xE || STM32F398xx || */ + 423:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* STM32F303xC || STM32F358xx */ + 424:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 425:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx) + 426:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 427:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /*------------------------------ TIM15 clock Configuration ----------------*/ + 428:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM15) == RCC_PERIPHCLK_TIM15) + 429:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 430:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check the parameters */ + ARM GAS /tmp/ccLRMPc2.s page 9 + + + 431:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** assert_param(IS_RCC_TIM15CLKSOURCE(PeriphClkInit->Tim15ClockSelection)); + 432:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 433:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Configure the TIM15 clock source */ + 434:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** __HAL_RCC_TIM15_CONFIG(PeriphClkInit->Tim15ClockSelection); + 435:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 436:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 437:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /*------------------------------ TIM16 clock Configuration ----------------*/ + 438:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM16) == RCC_PERIPHCLK_TIM16) + 439:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 440:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check the parameters */ + 441:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** assert_param(IS_RCC_TIM16CLKSOURCE(PeriphClkInit->Tim16ClockSelection)); + 442:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 443:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Configure the TIM16 clock source */ + 444:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** __HAL_RCC_TIM16_CONFIG(PeriphClkInit->Tim16ClockSelection); + 445:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 446:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 447:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /*------------------------------ TIM17 clock Configuration ----------------*/ + 448:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM17) == RCC_PERIPHCLK_TIM17) + 449:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 450:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check the parameters */ + 451:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** assert_param(IS_RCC_TIM17CLKSOURCE(PeriphClkInit->Tim17ClockSelection)); + 452:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 453:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Configure the TIM17 clock source */ + 454:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** __HAL_RCC_TIM17_CONFIG(PeriphClkInit->Tim17ClockSelection); + 455:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 456:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 457:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* STM32F301x8 || STM32F302x8 || STM32F318xx */ + 458:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 459:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(STM32F334x8) + 460:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 461:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /*------------------------------ HRTIM1 clock Configuration ----------------*/ + 462:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_HRTIM1) == RCC_PERIPHCLK_HRTIM1) + 463:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 464:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check the parameters */ + 465:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** assert_param(IS_RCC_HRTIM1CLKSOURCE(PeriphClkInit->Hrtim1ClockSelection)); + 466:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 467:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Configure the HRTIM1 clock source */ + 468:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** __HAL_RCC_HRTIM1_CONFIG(PeriphClkInit->Hrtim1ClockSelection); + 469:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 470:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 471:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* STM32F334x8 */ + 472:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 473:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(STM32F373xC) || defined(STM32F378xx) + 474:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 475:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /*------------------------------ SDADC clock Configuration -------------------*/ + 476:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_SDADC) == RCC_PERIPHCLK_SDADC) + 477:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 478:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check the parameters */ + 479:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** assert_param(IS_RCC_SDADCSYSCLK_DIV(PeriphClkInit->SdadcClockSelection)); + 480:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 481:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Configure the SDADC clock prescaler */ + 482:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** __HAL_RCC_SDADC_CONFIG(PeriphClkInit->SdadcClockSelection); + 483:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 484:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 485:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /*------------------------------ CEC clock Configuration -------------------*/ + 486:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_CEC) == RCC_PERIPHCLK_CEC) + 487:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + ARM GAS /tmp/ccLRMPc2.s page 10 + + + 488:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check the parameters */ + 489:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** assert_param(IS_RCC_CECCLKSOURCE(PeriphClkInit->CecClockSelection)); + 490:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 491:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Configure the CEC clock source */ + 492:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** __HAL_RCC_CEC_CONFIG(PeriphClkInit->CecClockSelection); + 493:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 494:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 495:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* STM32F373xC || STM32F378xx */ + 496:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 497:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx) + 498:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 499:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /*------------------------------ TIM2 clock Configuration -------------------*/ + 500:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM2) == RCC_PERIPHCLK_TIM2) + 501:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 502:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check the parameters */ + 503:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** assert_param(IS_RCC_TIM2CLKSOURCE(PeriphClkInit->Tim2ClockSelection)); + 504:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 505:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Configure the CEC clock source */ + 506:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** __HAL_RCC_TIM2_CONFIG(PeriphClkInit->Tim2ClockSelection); + 507:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 508:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 509:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /*------------------------------ TIM3 clock Configuration -------------------*/ + 510:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM34) == RCC_PERIPHCLK_TIM34) + 511:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 512:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check the parameters */ + 513:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** assert_param(IS_RCC_TIM3CLKSOURCE(PeriphClkInit->Tim34ClockSelection)); + 514:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 515:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Configure the CEC clock source */ + 516:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** __HAL_RCC_TIM34_CONFIG(PeriphClkInit->Tim34ClockSelection); + 517:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 518:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 519:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /*------------------------------ TIM15 clock Configuration ------------------*/ + 520:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM15) == RCC_PERIPHCLK_TIM15) + 521:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 522:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check the parameters */ + 523:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** assert_param(IS_RCC_TIM15CLKSOURCE(PeriphClkInit->Tim15ClockSelection)); + 524:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 525:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Configure the CEC clock source */ + 526:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** __HAL_RCC_TIM15_CONFIG(PeriphClkInit->Tim15ClockSelection); + 527:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 528:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 529:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /*------------------------------ TIM16 clock Configuration ------------------*/ + 530:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM16) == RCC_PERIPHCLK_TIM16) + 531:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 532:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check the parameters */ + 533:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** assert_param(IS_RCC_TIM16CLKSOURCE(PeriphClkInit->Tim16ClockSelection)); + 534:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 535:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Configure the CEC clock source */ + 536:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** __HAL_RCC_TIM16_CONFIG(PeriphClkInit->Tim16ClockSelection); + 537:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 538:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 539:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /*------------------------------ TIM17 clock Configuration ------------------*/ + 540:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM17) == RCC_PERIPHCLK_TIM17) + 541:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 542:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check the parameters */ + 543:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** assert_param(IS_RCC_TIM17CLKSOURCE(PeriphClkInit->Tim17ClockSelection)); + 544:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + ARM GAS /tmp/ccLRMPc2.s page 11 + + + 545:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Configure the CEC clock source */ + 546:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** __HAL_RCC_TIM17_CONFIG(PeriphClkInit->Tim17ClockSelection); + 547:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 548:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 549:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* STM32F302xE || STM32F303xE || STM32F398xx */ + 550:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 551:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(STM32F303xE) || defined(STM32F398xx) + 552:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /*------------------------------ TIM20 clock Configuration ------------------*/ + 553:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_TIM20) == RCC_PERIPHCLK_TIM20) + 554:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 555:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check the parameters */ + 556:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** assert_param(IS_RCC_TIM20CLKSOURCE(PeriphClkInit->Tim20ClockSelection)); + 557:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 558:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Configure the CEC clock source */ + 559:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** __HAL_RCC_TIM20_CONFIG(PeriphClkInit->Tim20ClockSelection); + 560:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 561:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* STM32F303xE || STM32F398xx */ + 562:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 563:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 564:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** return HAL_OK; + 565:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 566:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 567:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /** + 568:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @brief Get the RCC_ClkInitStruct according to the internal + 569:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * RCC configuration registers. + 570:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @param PeriphClkInit pointer to an RCC_PeriphCLKInitTypeDef structure that + 571:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * returns the configuration information for the Extended Peripherals clocks + 572:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * (ADC, CEC, I2C, I2S, SDADC, HRTIM, TIM, USART, RTC and USB clocks). + 573:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @retval None + 574:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** */ + 575:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** void HAL_RCCEx_GetPeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit) + 576:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 577:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Set all possible values for the extended clock type parameter------------*/ + 578:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Common part first */ + 579:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(RCC_CFGR3_USART2SW) && defined(RCC_CFGR3_USART3SW) + 580:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_USART1 | RCC_PERIPHCLK_USART2 | RCC_PERIPHCLK + 581:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** RCC_PERIPHCLK_I2C1 | RCC_PERIPHCLK_RTC; + 582:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #else + 583:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->PeriphClockSelection = RCC_PERIPHCLK_USART1 | \ + 584:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** RCC_PERIPHCLK_I2C1 | RCC_PERIPHCLK_RTC; + 585:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* RCC_CFGR3_USART2SW && RCC_CFGR3_USART3SW */ + 586:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 587:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the RTC configuration --------------------------------------------*/ + 588:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->RTCClockSelection = __HAL_RCC_GET_RTC_SOURCE(); + 589:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the USART1 clock configuration --------------------------------------------*/ + 590:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->Usart1ClockSelection = __HAL_RCC_GET_USART1_SOURCE(); + 591:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(RCC_CFGR3_USART2SW) + 592:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the USART2 clock configuration -----------------------------------------*/ + 593:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->Usart2ClockSelection = __HAL_RCC_GET_USART2_SOURCE(); + 594:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* RCC_CFGR3_USART2SW */ + 595:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(RCC_CFGR3_USART3SW) + 596:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the USART3 clock configuration -----------------------------------------*/ + 597:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->Usart3ClockSelection = __HAL_RCC_GET_USART3_SOURCE(); + 598:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* RCC_CFGR3_USART3SW */ + 599:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the I2C1 clock configuration -----------------------------------------*/ + 600:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->I2c1ClockSelection = __HAL_RCC_GET_I2C1_SOURCE(); + 601:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + ARM GAS /tmp/ccLRMPc2.s page 12 + + + 602:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(STM32F302xE) || defined(STM32F303xE)\ + 603:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** || defined(STM32F302xC) || defined(STM32F303xC)\ + 604:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** || defined(STM32F302x8) \ + 605:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** || defined(STM32F373xC) + 606:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 607:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_USB; + 608:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the USB clock configuration -----------------------------------------*/ + 609:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->USBClockSelection = __HAL_RCC_GET_USB_SOURCE(); + 610:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 611:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* STM32F302xE || STM32F303xE || */ + 612:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* STM32F302xC || STM32F303xC || */ + 613:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* STM32F302x8 || */ + 614:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* STM32F373xC */ + 615:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 616:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx)\ + 617:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** || defined(STM32F302xC) || defined(STM32F303xC) || defined(STM32F358xx)\ + 618:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** || defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx)\ + 619:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** || defined(STM32F373xC) || defined(STM32F378xx) + 620:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 621:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_I2C2; + 622:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the I2C2 clock configuration -----------------------------------------*/ + 623:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->I2c2ClockSelection = __HAL_RCC_GET_I2C2_SOURCE(); + 624:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 625:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* STM32F302xE || STM32F303xE || STM32F398xx || */ + 626:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* STM32F302xC || STM32F303xC || STM32F358xx || */ + 627:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* STM32F301x8 || STM32F302x8 || STM32F318xx || */ + 628:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* STM32F373xC || STM32F378xx */ + 629:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 630:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx)\ + 631:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** || defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx) + 632:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 633:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_I2C3; + 634:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the I2C3 clock configuration -----------------------------------------*/ + 635:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->I2c3ClockSelection = __HAL_RCC_GET_I2C3_SOURCE(); + 636:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 637:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* STM32F302xE || STM32F303xE || STM32F398xx || */ + 638:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* STM32F301x8 || STM32F302x8 || STM32F318xx */ + 639:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 640:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx)\ + 641:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** || defined(STM32F302xC) || defined(STM32F303xC) ||defined(STM32F358xx) + 642:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 643:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->PeriphClockSelection |= (RCC_PERIPHCLK_UART4 | RCC_PERIPHCLK_UART5); + 644:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the UART4 clock configuration -----------------------------------------*/ + 645:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->Uart4ClockSelection = __HAL_RCC_GET_UART4_SOURCE(); + 646:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the UART5 clock configuration -----------------------------------------*/ + 647:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->Uart5ClockSelection = __HAL_RCC_GET_UART5_SOURCE(); + 648:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 649:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* STM32F302xE || STM32F303xE || STM32F398xx || */ + 650:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* STM32F302xC || STM32F303xC || STM32F358xx */ + 651:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 652:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx)\ + 653:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** || defined(STM32F302xC) || defined(STM32F303xC) || defined(STM32F358xx)\ + 654:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** || defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx) + 655:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 656:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_I2S; + 657:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the I2S clock configuration -----------------------------------------*/ + 658:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->I2sClockSelection = __HAL_RCC_GET_I2S_SOURCE(); + ARM GAS /tmp/ccLRMPc2.s page 13 + + + 659:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 660:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* STM32F302xE || STM32F303xE || STM32F398xx || */ + 661:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* STM32F302xC || STM32F303xC || STM32F358xx || */ + 662:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* STM32F301x8 || STM32F302x8 || STM32F318xx || */ + 663:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 664:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx)\ + 665:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** || defined(STM32F373xC) || defined(STM32F378xx) + 666:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 667:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_ADC1; + 668:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the ADC1 clock configuration -----------------------------------------*/ + 669:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->Adc1ClockSelection = __HAL_RCC_GET_ADC1_SOURCE(); + 670:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 671:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* STM32F301x8 || STM32F302x8 || STM32F318xx || */ + 672:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* STM32F373xC || STM32F378xx */ + 673:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 674:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx)\ + 675:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** || defined(STM32F302xC) || defined(STM32F303xC) || defined(STM32F358xx)\ + 676:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** || defined(STM32F303x8) || defined(STM32F334x8) || defined(STM32F328xx) + 677:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 678:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_ADC12; + 679:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the ADC1 & ADC2 clock configuration -----------------------------------------*/ + 680:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->Adc12ClockSelection = __HAL_RCC_GET_ADC12_SOURCE(); + 681:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 682:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* STM32F302xE || STM32F303xE || STM32F398xx || */ + 683:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* STM32F302xC || STM32F303xC || STM32F358xx || */ + 684:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* STM32F303x8 || STM32F334x8 || STM32F328xx */ + 685:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 686:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(STM32F303xE) || defined(STM32F398xx)\ + 687:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** || defined(STM32F303xC) || defined(STM32F358xx) + 688:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 689:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_ADC34; + 690:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the ADC3 & ADC4 clock configuration -----------------------------------------*/ + 691:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->Adc34ClockSelection = __HAL_RCC_GET_ADC34_SOURCE(); + 692:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 693:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* STM32F303xE || STM32F398xx || */ + 694:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* STM32F303xC || STM32F358xx */ + 695:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 696:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx)\ + 697:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** || defined(STM32F302xC) || defined(STM32F303xC) || defined(STM32F358xx)\ + 698:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** || defined(STM32F303x8) || defined(STM32F334x8) || defined(STM32F328xx)\ + 699:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** || defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx) + 700:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 701:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_TIM1; + 702:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the TIM1 clock configuration -----------------------------------------*/ + 703:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->Tim1ClockSelection = __HAL_RCC_GET_TIM1_SOURCE(); + 704:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 705:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* STM32F302xE || STM32F303xE || STM32F398xx || */ + 706:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* STM32F302xC || STM32F303xC || STM32F358xx || */ + 707:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* STM32F303x8 || STM32F334x8 || STM32F328xx || */ + 708:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* STM32F301x8 || STM32F302x8 || STM32F318xx */ + 709:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 710:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(STM32F303xE) || defined(STM32F398xx)\ + 711:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** || defined(STM32F303xC) || defined(STM32F358xx) + 712:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 713:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_TIM8; + 714:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the TIM8 clock configuration -----------------------------------------*/ + 715:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->Tim8ClockSelection = __HAL_RCC_GET_TIM8_SOURCE(); + ARM GAS /tmp/ccLRMPc2.s page 14 + + + 716:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 717:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* STM32F303xE || STM32F398xx || */ + 718:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* STM32F303xC || STM32F358xx */ + 719:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 720:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(STM32F301x8) || defined(STM32F302x8) || defined(STM32F318xx) + 721:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 722:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->PeriphClockSelection |= (RCC_PERIPHCLK_TIM15 | RCC_PERIPHCLK_TIM16 | RCC_PERIPHCLK + 723:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the TIM15 clock configuration -----------------------------------------*/ + 724:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->Tim15ClockSelection = __HAL_RCC_GET_TIM15_SOURCE(); + 725:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the TIM16 clock configuration -----------------------------------------*/ + 726:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->Tim16ClockSelection = __HAL_RCC_GET_TIM16_SOURCE(); + 727:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the TIM17 clock configuration -----------------------------------------*/ + 728:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->Tim17ClockSelection = __HAL_RCC_GET_TIM17_SOURCE(); + 729:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 730:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* STM32F301x8 || STM32F302x8 || STM32F318xx */ + 731:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 732:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(STM32F334x8) + 733:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 734:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_HRTIM1; + 735:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the HRTIM1 clock configuration -----------------------------------------*/ + 736:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->Hrtim1ClockSelection = __HAL_RCC_GET_HRTIM1_SOURCE(); + 737:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 738:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* STM32F334x8 */ + 739:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 740:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(STM32F373xC) || defined(STM32F378xx) + 741:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 742:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_SDADC; + 743:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the SDADC clock configuration -----------------------------------------*/ + 744:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->SdadcClockSelection = __HAL_RCC_GET_SDADC_SOURCE(); + 745:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 746:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_CEC; + 747:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the CEC clock configuration -----------------------------------------*/ + 748:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->CecClockSelection = __HAL_RCC_GET_CEC_SOURCE(); + 749:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 750:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* STM32F373xC || STM32F378xx */ + 751:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 752:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(STM32F302xE) || defined(STM32F303xE) || defined(STM32F398xx) + 753:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 754:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_TIM2; + 755:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the TIM2 clock configuration -----------------------------------------*/ + 756:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->Tim2ClockSelection = __HAL_RCC_GET_TIM2_SOURCE(); + 757:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 758:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_TIM34; + 759:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the TIM3 clock configuration -----------------------------------------*/ + 760:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->Tim34ClockSelection = __HAL_RCC_GET_TIM34_SOURCE(); + 761:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 762:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_TIM15; + 763:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the TIM15 clock configuration -----------------------------------------*/ + 764:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->Tim15ClockSelection = __HAL_RCC_GET_TIM15_SOURCE(); + 765:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 766:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_TIM16; + 767:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the TIM16 clock configuration -----------------------------------------*/ + 768:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->Tim16ClockSelection = __HAL_RCC_GET_TIM16_SOURCE(); + 769:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 770:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_TIM17; + 771:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the TIM17 clock configuration -----------------------------------------*/ + 772:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->Tim17ClockSelection = __HAL_RCC_GET_TIM17_SOURCE(); + ARM GAS /tmp/ccLRMPc2.s page 15 + + + 773:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 774:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* STM32F302xE || STM32F303xE || STM32F398xx */ + 775:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 776:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined (STM32F303xE) || defined(STM32F398xx) + 777:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->PeriphClockSelection |= RCC_PERIPHCLK_TIM20; + 778:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the TIM20 clock configuration -----------------------------------------*/ + 779:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** PeriphClkInit->Tim20ClockSelection = __HAL_RCC_GET_TIM20_SOURCE(); + 780:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* STM32F303xE || STM32F398xx */ + 781:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 782:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 783:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /** + 784:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @brief Returns the peripheral clock frequency + 785:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @note Returns 0 if peripheral clock is unknown or 0xDEADDEAD if not applicable. + 786:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @param PeriphClk Peripheral clock identifier + 787:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * This parameter can be one of the following values: + 788:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_RTC RTC peripheral clock + 789:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_USART1 USART1 peripheral clock + 790:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_I2C1 I2C1 peripheral clock + 791:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** @if STM32F301x8 + 792:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_I2C2 I2C2 peripheral clock + 793:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_I2C3 I2C3 peripheral clock + 794:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_I2S I2S peripheral clock + 795:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_ADC1 ADC1 peripheral clock + 796:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_TIM1 TIM1 peripheral clock + 797:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_TIM15 TIM15 peripheral clock + 798:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_TIM16 TIM16 peripheral clock + 799:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_TIM17 TIM17 peripheral clock + 800:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** @endif + 801:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** @if STM32F302x8 + 802:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_I2C2 I2C2 peripheral clock + 803:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_I2C3 I2C3 peripheral clock + 804:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_I2S I2S peripheral clock + 805:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_USB USB peripheral clock + 806:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_ADC1 ADC1 peripheral clock + 807:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_TIM1 TIM1 peripheral clock + 808:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_TIM15 TIM15 peripheral clock + 809:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_TIM16 TIM16 peripheral clock + 810:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_TIM17 TIM17 peripheral clock + 811:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** @endif + 812:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** @if STM32F302xC + 813:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_USART2 USART2 peripheral clock + 814:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_USART3 USART3 peripheral clock + 815:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_UART4 UART4 peripheral clock + 816:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_UART5 UART5 peripheral clock + 817:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_I2C2 I2C2 peripheral clock + 818:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_I2S I2S peripheral clock + 819:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_USB USB peripheral clock + 820:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_ADC12 ADC12 peripheral clock + 821:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_TIM1 TIM1 peripheral clock + 822:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** @endif + 823:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** @if STM32F302xE + 824:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_USART2 USART2 peripheral clock + 825:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_USART3 USART3 peripheral clock + 826:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_UART4 UART4 peripheral clock + 827:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_UART5 UART5 peripheral clock + 828:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_I2C2 I2C2 peripheral clock + 829:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_I2C3 I2C3 peripheral clock + ARM GAS /tmp/ccLRMPc2.s page 16 + + + 830:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_I2S I2S peripheral clock + 831:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_USB USB peripheral clock + 832:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_ADC12 ADC12 peripheral clock + 833:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_TIM1 TIM1 peripheral clock + 834:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_TIM2 TIM2 peripheral clock + 835:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_TIM15 TIM15 peripheral clock + 836:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_TIM16 TIM16 peripheral clock + 837:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_TIM17 TIM17 peripheral clock + 838:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_TIM34 TIM34 peripheral clock + 839:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** @endif + 840:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** @if STM32F303x8 + 841:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_ADC12 ADC12 peripheral clock + 842:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_TIM1 TIM1 peripheral clock + 843:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** @endif + 844:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** @if STM32F303xC + 845:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_USART2 USART2 peripheral clock + 846:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_USART3 USART3 peripheral clock + 847:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_UART4 UART4 peripheral clock + 848:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_UART5 UART5 peripheral clock + 849:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_I2C2 I2C2 peripheral clock + 850:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_I2S I2S peripheral clock + 851:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_USB USB peripheral clock + 852:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_ADC12 ADC12 peripheral clock + 853:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_ADC34 ADC34 peripheral clock + 854:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_TIM1 TIM1 peripheral clock + 855:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_TIM8 TIM8 peripheral clock + 856:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** @endif + 857:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** @if STM32F303xE + 858:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_USART2 USART2 peripheral clock + 859:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_USART3 USART3 peripheral clock + 860:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_UART4 UART4 peripheral clock + 861:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_UART5 UART5 peripheral clock + 862:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_I2C2 I2C2 peripheral clock + 863:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_I2C3 I2C3 peripheral clock + 864:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_I2S I2S peripheral clock + 865:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_USB USB peripheral clock + 866:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_ADC12 ADC12 peripheral clock + 867:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_ADC34 ADC34 peripheral clock + 868:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_TIM1 TIM1 peripheral clock + 869:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_TIM2 TIM2 peripheral clock + 870:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_TIM8 TIM8 peripheral clock + 871:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_TIM15 TIM15 peripheral clock + 872:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_TIM16 TIM16 peripheral clock + 873:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_TIM17 TIM17 peripheral clock + 874:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_TIM20 TIM20 peripheral clock + 875:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_TIM34 TIM34 peripheral clock + 876:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** @endif + 877:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** @if STM32F318xx + 878:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_I2C2 I2C2 peripheral clock + 879:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_I2C3 I2C3 peripheral clock + 880:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_I2S I2S peripheral clock + 881:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_ADC1 ADC1 peripheral clock + 882:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_TIM1 TIM1 peripheral clock + 883:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_TIM15 TIM15 peripheral clock + 884:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_TIM16 TIM16 peripheral clock + 885:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_TIM17 TIM17 peripheral clock + 886:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** @endif + ARM GAS /tmp/ccLRMPc2.s page 17 + + + 887:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** @if STM32F328xx + 888:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_I2C2 I2C2 peripheral clock + 889:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_ADC12 ADC12 peripheral clock + 890:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_TIM1 TIM1 peripheral clock + 891:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** @endif + 892:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** @if STM32F334x8 + 893:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_ADC12 ADC12 peripheral clock + 894:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_TIM1 TIM1 peripheral clock + 895:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_HRTIM1 HRTIM1 peripheral clock + 896:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** @endif + 897:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** @if STM32F358xx + 898:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_USART2 USART2 peripheral clock + 899:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_USART3 USART3 peripheral clock + 900:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_UART4 UART4 peripheral clock + 901:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_UART5 UART5 peripheral clock + 902:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_I2S I2S peripheral clock + 903:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_ADC12 ADC12 peripheral clock + 904:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_ADC34 ADC34 peripheral clock + 905:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_TIM1 TIM1 peripheral clock + 906:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_TIM8 TIM8 peripheral clock + 907:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** @endif + 908:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** @if STM32F373xC + 909:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_USART2 USART2 peripheral clock + 910:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_USART3 USART3 peripheral clock + 911:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_I2C2 I2C2 peripheral clock + 912:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_USB USB peripheral clock + 913:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_ADC1 ADC1 peripheral clock + 914:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_SDADC SDADC peripheral clock + 915:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_CEC CEC peripheral clock + 916:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** @endif + 917:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** @if STM32F378xx + 918:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_USART2 USART2 peripheral clock + 919:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_USART3 USART3 peripheral clock + 920:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_I2C2 I2C2 peripheral clock + 921:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_ADC1 ADC1 peripheral clock + 922:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_SDADC SDADC peripheral clock + 923:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_CEC CEC peripheral clock + 924:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** @endif + 925:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** @if STM32F398xx + 926:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_USART2 USART2 peripheral clock + 927:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_USART3 USART3 peripheral clock + 928:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_UART4 UART4 peripheral clock + 929:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_UART5 UART5 peripheral clock + 930:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_I2C2 I2C2 peripheral clock + 931:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_I2C3 I2C3 peripheral clock + 932:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_I2S I2S peripheral clock + 933:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_ADC12 ADC12 peripheral clock + 934:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_ADC34 ADC34 peripheral clock + 935:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_TIM1 TIM1 peripheral clock + 936:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_TIM2 TIM2 peripheral clock + 937:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_TIM8 TIM8 peripheral clock + 938:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_TIM15 TIM15 peripheral clock + 939:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_TIM16 TIM16 peripheral clock + 940:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_TIM17 TIM17 peripheral clock + 941:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_TIM20 TIM20 peripheral clock + 942:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @arg @ref RCC_PERIPHCLK_TIM34 TIM34 peripheral clock + 943:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** @endif + ARM GAS /tmp/ccLRMPc2.s page 18 + + + 944:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @retval Frequency in Hz (0: means that no available frequency for the peripheral) + 945:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** */ + 946:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** uint32_t HAL_RCCEx_GetPeriphCLKFreq(uint32_t PeriphClk) + 947:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 948:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* frequency == 0 : means that no available frequency for the peripheral */ + 949:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** uint32_t frequency = 0U; + 950:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 951:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** uint32_t srcclk = 0U; + 952:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(RCC_CFGR2_ADC1PRES) || defined(RCC_CFGR2_ADCPRE12) || defined(RCC_CFGR2_ADCPRE34) + 953:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** uint16_t adc_pll_prediv_table[16] = { 1U, 2U, 4U, 6U, 8U, 10U, 12U, 16U, 32U, 64U, 128U, 256U, + 954:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* RCC_CFGR2_ADC1PRES || RCC_CFGR2_ADCPRE12 || RCC_CFGR2_ADCPRE34 */ + 955:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(RCC_CFGR_SDPRE) + 956:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** uint8_t sdadc_prescaler_table[16] = { 2U, 4U, 6U, 8U, 10U, 12U, 14U, 16U, 20U, 24U, 28U, 32U, 3 + 957:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* RCC_CFGR_SDPRE */ + 958:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 959:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check the parameters */ + 960:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** assert_param(IS_RCC_PERIPHCLOCK(PeriphClk)); + 961:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 962:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** switch (PeriphClk) + 963:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 964:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** case RCC_PERIPHCLK_RTC: + 965:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 966:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the current RTC source */ + 967:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** srcclk = __HAL_RCC_GET_RTC_SOURCE(); + 968:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 969:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if LSE is ready and if RTC clock selection is LSE */ + 970:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if ((srcclk == RCC_RTCCLKSOURCE_LSE) && (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY))) + 971:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 972:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = LSE_VALUE; + 973:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 974:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if LSI is ready and if RTC clock selection is LSI */ + 975:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** else if ((srcclk == RCC_RTCCLKSOURCE_LSI) && (HAL_IS_BIT_SET(RCC->CSR, RCC_CSR_LSIRDY))) + 976:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 977:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = LSI_VALUE; + 978:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 979:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if HSE is ready and if RTC clock selection is HSI_DIV32*/ + 980:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** else if ((srcclk == RCC_RTCCLKSOURCE_HSE_DIV32) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSERDY))) + 981:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 982:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = HSE_VALUE / 32U; + 983:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 984:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** break; + 985:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 986:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** case RCC_PERIPHCLK_USART1: + 987:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 988:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the current USART1 source */ + 989:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** srcclk = __HAL_RCC_GET_USART1_SOURCE(); + 990:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 991:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if USART1 clock selection is PCLK1 */ + 992:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(RCC_USART1CLKSOURCE_PCLK2) + 993:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if (srcclk == RCC_USART1CLKSOURCE_PCLK2) + 994:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 995:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = HAL_RCC_GetPCLK2Freq(); + 996:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 997:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #else + 998:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if (srcclk == RCC_USART1CLKSOURCE_PCLK1) + 999:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1000:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = HAL_RCC_GetPCLK1Freq(); + ARM GAS /tmp/ccLRMPc2.s page 19 + + +1001:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1002:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* RCC_USART1CLKSOURCE_PCLK2 */ +1003:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if HSI is ready and if USART1 clock selection is HSI */ +1004:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** else if ((srcclk == RCC_USART1CLKSOURCE_HSI) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))) +1005:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1006:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = HSI_VALUE; +1007:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1008:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if USART1 clock selection is SYSCLK */ +1009:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** else if (srcclk == RCC_USART1CLKSOURCE_SYSCLK) +1010:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1011:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = HAL_RCC_GetSysClockFreq(); +1012:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1013:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if LSE is ready and if USART1 clock selection is LSE */ +1014:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** else if ((srcclk == RCC_USART1CLKSOURCE_LSE) && (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY))) +1015:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1016:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = LSE_VALUE; +1017:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1018:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** break; +1019:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1020:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(RCC_CFGR3_USART2SW) +1021:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** case RCC_PERIPHCLK_USART2: +1022:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1023:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the current USART2 source */ +1024:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** srcclk = __HAL_RCC_GET_USART2_SOURCE(); +1025:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** +1026:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if USART2 clock selection is PCLK1 */ +1027:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if (srcclk == RCC_USART2CLKSOURCE_PCLK1) +1028:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1029:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = HAL_RCC_GetPCLK1Freq(); +1030:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1031:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if HSI is ready and if USART2 clock selection is HSI */ +1032:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** else if ((srcclk == RCC_USART2CLKSOURCE_HSI) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))) +1033:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1034:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = HSI_VALUE; +1035:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1036:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if USART2 clock selection is SYSCLK */ +1037:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** else if (srcclk == RCC_USART2CLKSOURCE_SYSCLK) +1038:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1039:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = HAL_RCC_GetSysClockFreq(); +1040:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1041:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if LSE is ready and if USART2 clock selection is LSE */ +1042:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** else if ((srcclk == RCC_USART2CLKSOURCE_LSE) && (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY))) +1043:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1044:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = LSE_VALUE; +1045:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1046:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** break; +1047:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1048:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* RCC_CFGR3_USART2SW */ +1049:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(RCC_CFGR3_USART3SW) +1050:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** case RCC_PERIPHCLK_USART3: +1051:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1052:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the current USART3 source */ +1053:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** srcclk = __HAL_RCC_GET_USART3_SOURCE(); +1054:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** +1055:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if USART3 clock selection is PCLK1 */ +1056:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if (srcclk == RCC_USART3CLKSOURCE_PCLK1) +1057:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + ARM GAS /tmp/ccLRMPc2.s page 20 + + +1058:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = HAL_RCC_GetPCLK1Freq(); +1059:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1060:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if HSI is ready and if USART3 clock selection is HSI */ +1061:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** else if ((srcclk == RCC_USART3CLKSOURCE_HSI) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))) +1062:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1063:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = HSI_VALUE; +1064:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1065:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if USART3 clock selection is SYSCLK */ +1066:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** else if (srcclk == RCC_USART3CLKSOURCE_SYSCLK) +1067:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1068:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = HAL_RCC_GetSysClockFreq(); +1069:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1070:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if LSE is ready and if USART3 clock selection is LSE */ +1071:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** else if ((srcclk == RCC_USART3CLKSOURCE_LSE) && (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY))) +1072:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1073:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = LSE_VALUE; +1074:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1075:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** break; +1076:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1077:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* RCC_CFGR3_USART3SW */ +1078:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(RCC_CFGR3_UART4SW) +1079:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** case RCC_PERIPHCLK_UART4: +1080:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1081:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the current UART4 source */ +1082:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** srcclk = __HAL_RCC_GET_UART4_SOURCE(); +1083:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** +1084:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if UART4 clock selection is PCLK1 */ +1085:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if (srcclk == RCC_UART4CLKSOURCE_PCLK1) +1086:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1087:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = HAL_RCC_GetPCLK1Freq(); +1088:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1089:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if HSI is ready and if UART4 clock selection is HSI */ +1090:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** else if ((srcclk == RCC_UART4CLKSOURCE_HSI) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))) +1091:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1092:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = HSI_VALUE; +1093:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1094:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if UART4 clock selection is SYSCLK */ +1095:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** else if (srcclk == RCC_UART4CLKSOURCE_SYSCLK) +1096:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1097:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = HAL_RCC_GetSysClockFreq(); +1098:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1099:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if LSE is ready and if UART4 clock selection is LSE */ +1100:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** else if ((srcclk == RCC_UART4CLKSOURCE_LSE) && (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY))) +1101:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1102:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = LSE_VALUE; +1103:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** break; +1105:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1106:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* RCC_CFGR3_UART4SW */ +1107:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(RCC_CFGR3_UART5SW) +1108:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** case RCC_PERIPHCLK_UART5: +1109:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1110:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the current UART5 source */ +1111:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** srcclk = __HAL_RCC_GET_UART5_SOURCE(); +1112:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** +1113:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if UART5 clock selection is PCLK1 */ +1114:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if (srcclk == RCC_UART5CLKSOURCE_PCLK1) + ARM GAS /tmp/ccLRMPc2.s page 21 + + +1115:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1116:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = HAL_RCC_GetPCLK1Freq(); +1117:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1118:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if HSI is ready and if UART5 clock selection is HSI */ +1119:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** else if ((srcclk == RCC_UART5CLKSOURCE_HSI) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))) +1120:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1121:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = HSI_VALUE; +1122:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if UART5 clock selection is SYSCLK */ +1124:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** else if (srcclk == RCC_UART5CLKSOURCE_SYSCLK) +1125:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1126:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = HAL_RCC_GetSysClockFreq(); +1127:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1128:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if LSE is ready and if UART5 clock selection is LSE */ +1129:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** else if ((srcclk == RCC_UART5CLKSOURCE_LSE) && (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY))) +1130:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1131:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = LSE_VALUE; +1132:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1133:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** break; +1134:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1135:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* RCC_CFGR3_UART5SW */ +1136:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** case RCC_PERIPHCLK_I2C1: +1137:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1138:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the current I2C1 source */ +1139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** srcclk = __HAL_RCC_GET_I2C1_SOURCE(); +1140:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** +1141:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if HSI is ready and if I2C1 clock selection is HSI */ +1142:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if ((srcclk == RCC_I2C1CLKSOURCE_HSI) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))) +1143:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1144:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = HSI_VALUE; +1145:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1146:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if I2C1 clock selection is SYSCLK */ +1147:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** else if (srcclk == RCC_I2C1CLKSOURCE_SYSCLK) +1148:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1149:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = HAL_RCC_GetSysClockFreq(); +1150:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1151:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** break; +1152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1153:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(RCC_CFGR3_I2C2SW) +1154:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** case RCC_PERIPHCLK_I2C2: +1155:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the current I2C2 source */ +1157:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** srcclk = __HAL_RCC_GET_I2C2_SOURCE(); +1158:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** +1159:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if HSI is ready and if I2C2 clock selection is HSI */ +1160:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if ((srcclk == RCC_I2C2CLKSOURCE_HSI) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))) +1161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1162:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = HSI_VALUE; +1163:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1164:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if I2C2 clock selection is SYSCLK */ +1165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** else if (srcclk == RCC_I2C2CLKSOURCE_SYSCLK) +1166:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = HAL_RCC_GetSysClockFreq(); +1168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1169:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** break; +1170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1171:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* RCC_CFGR3_I2C2SW */ + ARM GAS /tmp/ccLRMPc2.s page 22 + + +1172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(RCC_CFGR3_I2C3SW) +1173:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** case RCC_PERIPHCLK_I2C3: +1174:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1175:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the current I2C3 source */ +1176:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** srcclk = __HAL_RCC_GET_I2C3_SOURCE(); +1177:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** +1178:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if HSI is ready and if I2C3 clock selection is HSI */ +1179:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if ((srcclk == RCC_I2C3CLKSOURCE_HSI) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))) +1180:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1181:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = HSI_VALUE; +1182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1183:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if I2C3 clock selection is SYSCLK */ +1184:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** else if (srcclk == RCC_I2C3CLKSOURCE_SYSCLK) +1185:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = HAL_RCC_GetSysClockFreq(); +1187:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1188:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** break; +1189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1190:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* RCC_CFGR3_I2C3SW */ +1191:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(RCC_CFGR_I2SSRC) +1192:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** case RCC_PERIPHCLK_I2S: +1193:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1194:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the current I2S source */ +1195:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** srcclk = __HAL_RCC_GET_I2S_SOURCE(); +1196:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** +1197:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if I2S clock selection is External clock mapped on the I2S_CKIN pin */ +1198:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if (srcclk == RCC_I2SCLKSOURCE_EXT) +1199:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1200:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* External clock used. Frequency cannot be returned.*/ +1201:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = 0xDEADDEADU; +1202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1203:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if I2S clock selection is SYSCLK */ +1204:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** else if (srcclk == RCC_I2SCLKSOURCE_SYSCLK) +1205:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1206:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = HAL_RCC_GetSysClockFreq(); +1207:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1208:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** break; +1209:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1210:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* RCC_CFGR_I2SSRC */ +1211:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(RCC_CFGR_USBPRE) +1212:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** case RCC_PERIPHCLK_USB: +1213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1214:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if PLL is ready */ +1215:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if (HAL_IS_BIT_SET(RCC->CR, RCC_CR_PLLRDY)) +1216:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1217:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the current USB source */ +1218:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** srcclk = __HAL_RCC_GET_USB_SOURCE(); +1219:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** +1220:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if USB clock selection is not divided */ +1221:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if (srcclk == RCC_USBCLKSOURCE_PLL) +1222:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1223:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = RCC_GetPLLCLKFreq(); +1224:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1225:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if USB clock selection is divided by 1.5 */ +1226:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** else /* RCC_USBCLKSOURCE_PLL_DIV1_5 */ +1227:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1228:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = (RCC_GetPLLCLKFreq() * 3U) / 2U; + ARM GAS /tmp/ccLRMPc2.s page 23 + + +1229:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1230:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1231:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** break; +1232:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1233:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* RCC_CFGR_USBPRE */ +1234:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(RCC_CFGR2_ADC1PRES) || defined(RCC_CFGR_ADCPRE) +1235:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** case RCC_PERIPHCLK_ADC1: +1236:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1237:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the current ADC1 source */ +1238:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** srcclk = __HAL_RCC_GET_ADC1_SOURCE(); +1239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(RCC_CFGR2_ADC1PRES) +1240:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if ADC1 clock selection is AHB */ +1241:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if (srcclk == RCC_ADC1PLLCLK_OFF) +1242:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1243:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = SystemCoreClock; +1244:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* PLL clock has been selected */ +1246:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** else +1247:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1248:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if PLL is ready */ +1249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if (HAL_IS_BIT_SET(RCC->CR, RCC_CR_PLLRDY)) +1250:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1251:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Frequency is the PLL frequency divided by ADC prescaler (1U/2U/4U/6U/8U/10U/12U/16U/32 +1252:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = RCC_GetPLLCLKFreq() / adc_pll_prediv_table[(srcclk >> POSITION_VAL(RCC_CFGR2_ +1253:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1254:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1255:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #else /* RCC_CFGR_ADCPRE */ +1256:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* ADC1 is set to PLCK2 frequency divided by 2U/4U/6U/8U */ +1257:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = HAL_RCC_GetPCLK2Freq() / (((srcclk >> POSITION_VAL(RCC_CFGR_ADCPRE)) + 1U) * 2U) +1258:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* RCC_CFGR2_ADC1PRES */ +1259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** break; +1260:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1261:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* RCC_CFGR2_ADC1PRES || RCC_CFGR_ADCPRE */ +1262:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(RCC_CFGR2_ADCPRE12) +1263:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** case RCC_PERIPHCLK_ADC12: +1264:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1265:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the current ADC12 source */ +1266:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** srcclk = __HAL_RCC_GET_ADC12_SOURCE(); +1267:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if ADC12 clock selection is AHB */ +1268:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if (srcclk == RCC_ADC12PLLCLK_OFF) +1269:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1270:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = SystemCoreClock; +1271:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1272:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* PLL clock has been selected */ +1273:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** else +1274:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if PLL is ready */ +1276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if (HAL_IS_BIT_SET(RCC->CR, RCC_CR_PLLRDY)) +1277:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1278:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Frequency is the PLL frequency divided by ADC prescaler (1U/2U/4U/6/8U/10U/12U/16U/32U +1279:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = RCC_GetPLLCLKFreq() / adc_pll_prediv_table[(srcclk >> POSITION_VAL(RCC_CFGR2_ +1280:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1281:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1282:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** break; +1283:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1284:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* RCC_CFGR2_ADCPRE12 */ +1285:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(RCC_CFGR2_ADCPRE34) + ARM GAS /tmp/ccLRMPc2.s page 24 + + +1286:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** case RCC_PERIPHCLK_ADC34: +1287:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the current ADC34 source */ +1289:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** srcclk = __HAL_RCC_GET_ADC34_SOURCE(); +1290:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if ADC34 clock selection is AHB */ +1291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if (srcclk == RCC_ADC34PLLCLK_OFF) +1292:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1293:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = SystemCoreClock; +1294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1295:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* PLL clock has been selected */ +1296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** else +1297:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1298:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if PLL is ready */ +1299:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if (HAL_IS_BIT_SET(RCC->CR, RCC_CR_PLLRDY)) +1300:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1301:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Frequency is the PLL frequency divided by ADC prescaler (1U/2U/4U/6U/8U/10U/12U/16U/32 +1302:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = RCC_GetPLLCLKFreq() / adc_pll_prediv_table[(srcclk >> POSITION_VAL(RCC_CFGR2_ +1303:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1304:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1305:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** break; +1306:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1307:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* RCC_CFGR2_ADCPRE34 */ +1308:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(RCC_CFGR3_TIM1SW) +1309:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** case RCC_PERIPHCLK_TIM1: +1310:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1311:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the current TIM1 source */ +1312:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** srcclk = __HAL_RCC_GET_TIM1_SOURCE(); +1313:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** +1314:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if PLL is ready and if TIM1 clock selection is PLL */ +1315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if ((srcclk == RCC_TIM1CLK_PLLCLK) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_PLLRDY))) +1316:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = RCC_GetPLLCLKFreq(); +1318:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1319:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if TIM1 clock selection is SYSCLK */ +1320:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** else if (srcclk == RCC_TIM1CLK_HCLK) +1321:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1322:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = SystemCoreClock; +1323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1324:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** break; +1325:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1326:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* RCC_CFGR3_TIM1SW */ +1327:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(RCC_CFGR3_TIM2SW) +1328:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** case RCC_PERIPHCLK_TIM2: +1329:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1330:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the current TIM2 source */ +1331:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** srcclk = __HAL_RCC_GET_TIM2_SOURCE(); +1332:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** +1333:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if PLL is ready and if TIM2 clock selection is PLL */ +1334:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if ((srcclk == RCC_TIM2CLK_PLLCLK) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_PLLRDY))) +1335:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = RCC_GetPLLCLKFreq(); +1337:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1338:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if TIM2 clock selection is SYSCLK */ +1339:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** else if (srcclk == RCC_TIM2CLK_HCLK) +1340:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1341:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = SystemCoreClock; +1342:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + ARM GAS /tmp/ccLRMPc2.s page 25 + + +1343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** break; +1344:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1345:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* RCC_CFGR3_TIM2SW */ +1346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(RCC_CFGR3_TIM8SW) +1347:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** case RCC_PERIPHCLK_TIM8: +1348:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1349:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the current TIM8 source */ +1350:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** srcclk = __HAL_RCC_GET_TIM8_SOURCE(); +1351:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** +1352:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if PLL is ready and if TIM8 clock selection is PLL */ +1353:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if ((srcclk == RCC_TIM8CLK_PLLCLK) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_PLLRDY))) +1354:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = RCC_GetPLLCLKFreq(); +1356:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1357:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if TIM8 clock selection is SYSCLK */ +1358:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** else if (srcclk == RCC_TIM8CLK_HCLK) +1359:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1360:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = SystemCoreClock; +1361:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1362:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** break; +1363:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1364:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* RCC_CFGR3_TIM8SW */ +1365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(RCC_CFGR3_TIM15SW) +1366:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** case RCC_PERIPHCLK_TIM15: +1367:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1368:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the current TIM15 source */ +1369:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** srcclk = __HAL_RCC_GET_TIM15_SOURCE(); +1370:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** +1371:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if PLL is ready and if TIM15 clock selection is PLL */ +1372:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if ((srcclk == RCC_TIM15CLK_PLLCLK) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_PLLRDY))) +1373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1374:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = RCC_GetPLLCLKFreq(); +1375:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if TIM15 clock selection is SYSCLK */ +1377:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** else if (srcclk == RCC_TIM15CLK_HCLK) +1378:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1379:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = SystemCoreClock; +1380:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1381:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** break; +1382:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* RCC_CFGR3_TIM15SW */ +1384:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(RCC_CFGR3_TIM16SW) +1385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** case RCC_PERIPHCLK_TIM16: +1386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1387:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the current TIM16 source */ +1388:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** srcclk = __HAL_RCC_GET_TIM16_SOURCE(); +1389:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** +1390:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if PLL is ready and if TIM16 clock selection is PLL */ +1391:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if ((srcclk == RCC_TIM16CLK_PLLCLK) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_PLLRDY))) +1392:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1393:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = RCC_GetPLLCLKFreq(); +1394:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1395:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if TIM16 clock selection is SYSCLK */ +1396:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** else if (srcclk == RCC_TIM16CLK_HCLK) +1397:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1398:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = SystemCoreClock; +1399:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + ARM GAS /tmp/ccLRMPc2.s page 26 + + +1400:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** break; +1401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1402:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* RCC_CFGR3_TIM16SW */ +1403:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(RCC_CFGR3_TIM17SW) +1404:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** case RCC_PERIPHCLK_TIM17: +1405:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1406:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the current TIM17 source */ +1407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** srcclk = __HAL_RCC_GET_TIM17_SOURCE(); +1408:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** +1409:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if PLL is ready and if TIM17 clock selection is PLL */ +1410:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if ((srcclk == RCC_TIM17CLK_PLLCLK) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_PLLRDY))) +1411:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1412:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = RCC_GetPLLCLKFreq(); +1413:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1414:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if TIM17 clock selection is SYSCLK */ +1415:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** else if (srcclk == RCC_TIM17CLK_HCLK) +1416:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1417:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = SystemCoreClock; +1418:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1419:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** break; +1420:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1421:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* RCC_CFGR3_TIM17SW */ +1422:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(RCC_CFGR3_TIM20SW) +1423:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** case RCC_PERIPHCLK_TIM20: +1424:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1425:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the current TIM20 source */ +1426:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** srcclk = __HAL_RCC_GET_TIM20_SOURCE(); +1427:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** +1428:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if PLL is ready and if TIM20 clock selection is PLL */ +1429:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if ((srcclk == RCC_TIM20CLK_PLLCLK) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_PLLRDY))) +1430:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1431:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = RCC_GetPLLCLKFreq(); +1432:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1433:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if TIM20 clock selection is SYSCLK */ +1434:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** else if (srcclk == RCC_TIM20CLK_HCLK) +1435:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1436:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = SystemCoreClock; +1437:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1438:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** break; +1439:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1440:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* RCC_CFGR3_TIM20SW */ +1441:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(RCC_CFGR3_TIM34SW) +1442:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** case RCC_PERIPHCLK_TIM34: +1443:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1444:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the current TIM34 source */ +1445:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** srcclk = __HAL_RCC_GET_TIM34_SOURCE(); +1446:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** +1447:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if PLL is ready and if TIM34 clock selection is PLL */ +1448:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if ((srcclk == RCC_TIM34CLK_PLLCLK) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_PLLRDY))) +1449:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1450:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = RCC_GetPLLCLKFreq(); +1451:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1452:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if TIM34 clock selection is SYSCLK */ +1453:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** else if (srcclk == RCC_TIM34CLK_HCLK) +1454:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1455:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = SystemCoreClock; +1456:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + ARM GAS /tmp/ccLRMPc2.s page 27 + + +1457:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** break; +1458:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1459:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* RCC_CFGR3_TIM34SW */ +1460:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(RCC_CFGR3_HRTIM1SW) +1461:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** case RCC_PERIPHCLK_HRTIM1: +1462:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1463:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the current HRTIM1 source */ +1464:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** srcclk = __HAL_RCC_GET_HRTIM1_SOURCE(); +1465:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** +1466:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if PLL is ready and if HRTIM1 clock selection is PLL */ +1467:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if ((srcclk == RCC_HRTIM1CLK_PLLCLK) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_PLLRDY))) +1468:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1469:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = RCC_GetPLLCLKFreq(); +1470:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1471:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if HRTIM1 clock selection is SYSCLK */ +1472:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** else if (srcclk == RCC_HRTIM1CLK_HCLK) +1473:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1474:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = SystemCoreClock; +1475:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1476:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** break; +1477:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1478:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* RCC_CFGR3_HRTIM1SW */ +1479:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(RCC_CFGR_SDPRE) +1480:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** case RCC_PERIPHCLK_SDADC: +1481:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1482:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the current SDADC source */ +1483:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** srcclk = __HAL_RCC_GET_SDADC_SOURCE(); +1484:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Frequency is the system frequency divided by SDADC prescaler (2U/4U/6U/8U/10U/12U/14U/16U/ +1485:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = SystemCoreClock / sdadc_prescaler_table[(srcclk >> POSITION_VAL(RCC_CFGR_SDPRE)) +1486:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** break; +1487:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1488:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* RCC_CFGR_SDPRE */ +1489:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(RCC_CFGR3_CECSW) +1490:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** case RCC_PERIPHCLK_CEC: +1491:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1492:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the current CEC source */ +1493:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** srcclk = __HAL_RCC_GET_CEC_SOURCE(); +1494:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** +1495:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if HSI is ready and if CEC clock selection is HSI */ +1496:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if ((srcclk == RCC_CECCLKSOURCE_HSI) && (HAL_IS_BIT_SET(RCC->CR, RCC_CR_HSIRDY))) +1497:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1498:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = HSI_VALUE; +1499:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1500:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if LSE is ready and if CEC clock selection is LSE */ +1501:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** else if ((srcclk == RCC_CECCLKSOURCE_LSE) && (HAL_IS_BIT_SET(RCC->BDCR, RCC_BDCR_LSERDY))) +1502:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1503:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** frequency = LSE_VALUE; +1504:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1505:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** break; +1506:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1507:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* RCC_CFGR3_CECSW */ +1508:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** default: +1509:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1510:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** break; +1511:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1512:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1513:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** return(frequency); + ARM GAS /tmp/ccLRMPc2.s page 28 + + +1514:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1515:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** +1516:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /** +1517:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @} +1518:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** */ +1519:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** +1520:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /** +1521:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @} +1522:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** */ +1523:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** +1524:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** +1525:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(RCC_CFGR2_ADC1PRES) || defined(RCC_CFGR2_ADCPRE12) || defined(RCC_CFGR2_ADCPRE34) || de +1526:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** || defined(RCC_CFGR3_TIM1SW) || defined(RCC_CFGR3_TIM2SW) || defined(RCC_CFGR3_TIM8SW) || defined( +1527:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** || defined(RCC_CFGR3_TIM16SW) || defined(RCC_CFGR3_TIM17SW) || defined(RCC_CFGR3_TIM20SW) || defin +1528:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** || defined(RCC_CFGR3_HRTIM1SW) +1529:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** +1530:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /** @addtogroup RCCEx_Private_Functions +1531:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** * @{ +1532:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** */ +1533:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** static uint32_t RCC_GetPLLCLKFreq(void) +1534:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 28 .loc 1 1534 1 view -0 + 29 .cfi_startproc + 30 @ args = 0, pretend = 0, frame = 0 + 31 @ frame_needed = 0, uses_anonymous_args = 0 + 32 @ link register save eliminated. +1535:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** uint32_t pllmul = 0U, pllsource = 0U, prediv = 0U, pllclk = 0U; + 33 .loc 1 1535 3 view .LVU1 + 34 .LVL0: +1536:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** +1537:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** pllmul = RCC->CFGR & RCC_CFGR_PLLMUL; + 35 .loc 1 1537 3 view .LVU2 + 36 .loc 1 1537 15 is_stmt 0 view .LVU3 + 37 0000 0B4B ldr r3, .L4 + 38 0002 5868 ldr r0, [r3, #4] + 39 .LVL1: +1538:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** pllmul = ( pllmul >> 18U) + 2U; + 40 .loc 1 1538 3 is_stmt 1 view .LVU4 + 41 .loc 1 1538 21 is_stmt 0 view .LVU5 + 42 0004 C0F38340 ubfx r0, r0, #18, #4 + 43 .LVL2: + 44 .loc 1 1538 10 view .LVU6 + 45 0008 0230 adds r0, r0, #2 + 46 .LVL3: +1539:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** pllsource = RCC->CFGR & RCC_CFGR_PLLSRC; + 47 .loc 1 1539 3 is_stmt 1 view .LVU7 + 48 .loc 1 1539 18 is_stmt 0 view .LVU8 + 49 000a 5B68 ldr r3, [r3, #4] + 50 .LVL4: +1540:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(RCC_CFGR_PLLSRC_HSI_DIV2) +1541:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if (pllsource != RCC_PLLSOURCE_HSI) + 51 .loc 1 1541 3 is_stmt 1 view .LVU9 + 52 .loc 1 1541 6 is_stmt 0 view .LVU10 + 53 000c 13F4803F tst r3, #65536 + 54 0010 0AD0 beq .L2 +1542:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1543:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** prediv = (RCC->CFGR2 & RCC_CFGR2_PREDIV) + 1U; + ARM GAS /tmp/ccLRMPc2.s page 29 + + + 55 .loc 1 1543 5 is_stmt 1 view .LVU11 + 56 .loc 1 1543 18 is_stmt 0 view .LVU12 + 57 0012 074B ldr r3, .L4 + 58 .LVL5: + 59 .loc 1 1543 18 view .LVU13 + 60 0014 DB6A ldr r3, [r3, #44] + 61 .loc 1 1543 26 view .LVU14 + 62 0016 03F00F03 and r3, r3, #15 + 63 .loc 1 1543 12 view .LVU15 + 64 001a 0133 adds r3, r3, #1 + 65 .LVL6: +1544:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* HSE used as PLL clock source : PLLCLK = HSE/PREDIV * PLLMUL */ +1545:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** pllclk = (HSE_VALUE/prediv) * pllmul; + 66 .loc 1 1545 5 is_stmt 1 view .LVU16 + 67 .loc 1 1545 24 is_stmt 0 view .LVU17 + 68 001c 054A ldr r2, .L4+4 + 69 001e B2FBF3F3 udiv r3, r2, r3 + 70 .LVL7: + 71 .loc 1 1545 12 view .LVU18 + 72 0022 03FB00F0 mul r0, r3, r0 + 73 .LVL8: + 74 .loc 1 1545 12 view .LVU19 + 75 0026 7047 bx lr + 76 .LVL9: + 77 .L2: +1546:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1547:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** else +1548:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1549:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* HSI used as PLL clock source : PLLCLK = HSI/2U * PLLMUL */ +1550:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** pllclk = (HSI_VALUE >> 1U) * pllmul; + 78 .loc 1 1550 5 is_stmt 1 view .LVU20 + 79 .loc 1 1550 12 is_stmt 0 view .LVU21 + 80 0028 034B ldr r3, .L4+8 + 81 .LVL10: + 82 .loc 1 1550 12 view .LVU22 + 83 002a 03FB00F0 mul r0, r3, r0 + 84 .LVL11: +1551:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1552:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #else +1553:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** prediv = (RCC->CFGR2 & RCC_CFGR2_PREDIV) + 1U; +1554:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if (pllsource == RCC_CFGR_PLLSRC_HSE_PREDIV) +1555:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1556:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* HSE used as PLL clock source : PLLCLK = HSE/PREDIV * PLLMUL */ +1557:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** pllclk = (HSE_VALUE/prediv) * pllmul; +1558:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1559:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** else +1560:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { +1561:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* HSI used as PLL clock source : PLLCLK = HSI/PREDIV * PLLMUL */ +1562:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** pllclk = (HSI_VALUE/prediv) * pllmul; +1563:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } +1564:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* RCC_CFGR_PLLSRC_HSI_DIV2 */ +1565:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** +1566:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** return pllclk; + 85 .loc 1 1566 3 is_stmt 1 view .LVU23 +1567:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 86 .loc 1 1567 1 is_stmt 0 view .LVU24 + 87 002e 7047 bx lr + ARM GAS /tmp/ccLRMPc2.s page 30 + + + 88 .L5: + 89 .align 2 + 90 .L4: + 91 0030 00100240 .word 1073876992 + 92 0034 0024F400 .word 16000000 + 93 0038 00093D00 .word 4000000 + 94 .cfi_endproc + 95 .LFE133: + 97 .section .text.HAL_RCCEx_PeriphCLKConfig,"ax",%progbits + 98 .align 1 + 99 .global HAL_RCCEx_PeriphCLKConfig + 100 .syntax unified + 101 .thumb + 102 .thumb_func + 104 HAL_RCCEx_PeriphCLKConfig: + 105 .LVL12: + 106 .LFB130: + 108:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** uint32_t tickstart = 0U; + 107 .loc 1 108 1 is_stmt 1 view -0 + 108 .cfi_startproc + 109 @ args = 0, pretend = 0, frame = 8 + 110 @ frame_needed = 0, uses_anonymous_args = 0 + 108:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** uint32_t tickstart = 0U; + 111 .loc 1 108 1 is_stmt 0 view .LVU26 + 112 0000 F0B5 push {r4, r5, r6, r7, lr} + 113 .cfi_def_cfa_offset 20 + 114 .cfi_offset 4, -20 + 115 .cfi_offset 5, -16 + 116 .cfi_offset 6, -12 + 117 .cfi_offset 7, -8 + 118 .cfi_offset 14, -4 + 119 0002 83B0 sub sp, sp, #12 + 120 .cfi_def_cfa_offset 32 + 121 0004 0446 mov r4, r0 + 109:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** uint32_t temp_reg = 0U; + 122 .loc 1 109 3 is_stmt 1 view .LVU27 + 123 .LVL13: + 110:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** FlagStatus pwrclkchanged = RESET; + 124 .loc 1 110 3 view .LVU28 + 111:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 125 .loc 1 111 3 view .LVU29 + 114:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 126 .loc 1 114 3 view .LVU30 + 117:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 127 .loc 1 117 3 view .LVU31 + 117:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 128 .loc 1 117 21 is_stmt 0 view .LVU32 + 129 0006 0368 ldr r3, [r0] + 117:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 130 .loc 1 117 5 view .LVU33 + 131 0008 13F4803F tst r3, #65536 + 132 000c 48D0 beq .L7 + 120:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 133 .loc 1 120 5 is_stmt 1 view .LVU34 + 126:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 134 .loc 1 126 5 view .LVU35 + 126:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + ARM GAS /tmp/ccLRMPc2.s page 31 + + + 135 .loc 1 126 8 is_stmt 0 view .LVU36 + 136 000e 864B ldr r3, .L36 + 137 0010 DB69 ldr r3, [r3, #28] + 126:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 138 .loc 1 126 7 view .LVU37 + 139 0012 13F0805F tst r3, #268435456 + 140 0016 40F0BE80 bne .L28 + 128:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** pwrclkchanged = SET; + 141 .loc 1 128 7 is_stmt 1 view .LVU38 + 142 .LBB17: + 128:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** pwrclkchanged = SET; + 143 .loc 1 128 7 view .LVU39 + 128:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** pwrclkchanged = SET; + 144 .loc 1 128 7 view .LVU40 + 145 001a 834B ldr r3, .L36 + 146 001c DA69 ldr r2, [r3, #28] + 147 001e 42F08052 orr r2, r2, #268435456 + 148 0022 DA61 str r2, [r3, #28] + 128:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** pwrclkchanged = SET; + 149 .loc 1 128 7 view .LVU41 + 150 0024 DB69 ldr r3, [r3, #28] + 151 0026 03F08053 and r3, r3, #268435456 + 152 002a 0193 str r3, [sp, #4] + 128:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** pwrclkchanged = SET; + 153 .loc 1 128 7 view .LVU42 + 154 002c 019B ldr r3, [sp, #4] + 155 .LBE17: + 128:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** pwrclkchanged = SET; + 156 .loc 1 128 7 view .LVU43 + 129:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 157 .loc 1 129 7 view .LVU44 + 158 .LVL14: + 129:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 159 .loc 1 129 21 is_stmt 0 view .LVU45 + 160 002e 0125 movs r5, #1 + 161 .LVL15: + 162 .L8: + 132:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 163 .loc 1 132 5 is_stmt 1 view .LVU46 + 132:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 164 .loc 1 132 8 is_stmt 0 view .LVU47 + 165 0030 7E4B ldr r3, .L36+4 + 166 0032 1B68 ldr r3, [r3] + 132:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 167 .loc 1 132 7 view .LVU48 + 168 0034 13F4807F tst r3, #256 + 169 0038 00F0AF80 beq .L33 + 170 .LVL16: + 171 .L9: + 150:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if((temp_reg != 0x00000000U) && (temp_reg != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSE + 172 .loc 1 150 5 is_stmt 1 view .LVU49 + 150:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** if((temp_reg != 0x00000000U) && (temp_reg != (PeriphClkInit->RTCClockSelection & RCC_BDCR_RTCSE + 173 .loc 1 150 20 is_stmt 0 view .LVU50 + 174 003c 7A4B ldr r3, .L36 + 175 003e 1B6A ldr r3, [r3, #32] + 176 .LVL17: + 151:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + ARM GAS /tmp/ccLRMPc2.s page 32 + + + 177 .loc 1 151 5 is_stmt 1 view .LVU51 + 151:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 178 .loc 1 151 7 is_stmt 0 view .LVU52 + 179 0040 13F44073 ands r3, r3, #768 + 180 .LVL18: + 151:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 181 .loc 1 151 7 view .LVU53 + 182 0044 22D0 beq .L13 + 151:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 183 .loc 1 151 64 discriminator 1 view .LVU54 + 184 0046 6268 ldr r2, [r4, #4] + 151:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 185 .loc 1 151 84 discriminator 1 view .LVU55 + 186 0048 02F44072 and r2, r2, #768 + 151:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 187 .loc 1 151 34 discriminator 1 view .LVU56 + 188 004c 9A42 cmp r2, r3 + 189 004e 1DD0 beq .L13 + 154:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* RTC Clock selection can be changed only if the Backup Domain is reset */ + 190 .loc 1 154 7 is_stmt 1 view .LVU57 + 154:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* RTC Clock selection can be changed only if the Backup Domain is reset */ + 191 .loc 1 154 22 is_stmt 0 view .LVU58 + 192 0050 7548 ldr r0, .L36 + 193 0052 016A ldr r1, [r0, #32] + 154:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* RTC Clock selection can be changed only if the Backup Domain is reset */ + 194 .loc 1 154 16 view .LVU59 + 195 0054 21F44076 bic r6, r1, #768 + 196 .LVL19: + 156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** __HAL_RCC_BACKUPRESET_RELEASE(); + 197 .loc 1 156 7 is_stmt 1 view .LVU60 + 198 .LBB18: + 199 .LBI18: + 200 .file 2 "Drivers/CMSIS/Include/cmsis_gcc.h" + 1:Drivers/CMSIS/Include/cmsis_gcc.h **** /**************************************************************************//** + 2:Drivers/CMSIS/Include/cmsis_gcc.h **** * @file cmsis_gcc.h + 3:Drivers/CMSIS/Include/cmsis_gcc.h **** * @brief CMSIS compiler GCC header file + 4:Drivers/CMSIS/Include/cmsis_gcc.h **** * @version V5.0.4 + 5:Drivers/CMSIS/Include/cmsis_gcc.h **** * @date 09. April 2018 + 6:Drivers/CMSIS/Include/cmsis_gcc.h **** ******************************************************************************/ + 7:Drivers/CMSIS/Include/cmsis_gcc.h **** /* + 8:Drivers/CMSIS/Include/cmsis_gcc.h **** * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + 9:Drivers/CMSIS/Include/cmsis_gcc.h **** * + 10:Drivers/CMSIS/Include/cmsis_gcc.h **** * SPDX-License-Identifier: Apache-2.0 + 11:Drivers/CMSIS/Include/cmsis_gcc.h **** * + 12:Drivers/CMSIS/Include/cmsis_gcc.h **** * Licensed under the Apache License, Version 2.0 (the License); you may + 13:Drivers/CMSIS/Include/cmsis_gcc.h **** * not use this file except in compliance with the License. + 14:Drivers/CMSIS/Include/cmsis_gcc.h **** * You may obtain a copy of the License at + 15:Drivers/CMSIS/Include/cmsis_gcc.h **** * + 16:Drivers/CMSIS/Include/cmsis_gcc.h **** * www.apache.org/licenses/LICENSE-2.0 + 17:Drivers/CMSIS/Include/cmsis_gcc.h **** * + 18:Drivers/CMSIS/Include/cmsis_gcc.h **** * Unless required by applicable law or agreed to in writing, software + 19:Drivers/CMSIS/Include/cmsis_gcc.h **** * distributed under the License is distributed on an AS IS BASIS, WITHOUT + 20:Drivers/CMSIS/Include/cmsis_gcc.h **** * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + 21:Drivers/CMSIS/Include/cmsis_gcc.h **** * See the License for the specific language governing permissions and + 22:Drivers/CMSIS/Include/cmsis_gcc.h **** * limitations under the License. + 23:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 24:Drivers/CMSIS/Include/cmsis_gcc.h **** + ARM GAS /tmp/ccLRMPc2.s page 33 + + + 25:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __CMSIS_GCC_H + 26:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __CMSIS_GCC_H + 27:Drivers/CMSIS/Include/cmsis_gcc.h **** + 28:Drivers/CMSIS/Include/cmsis_gcc.h **** /* ignore some GCC warnings */ + 29:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic push + 30:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wsign-conversion" + 31:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wconversion" + 32:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wunused-parameter" + 33:Drivers/CMSIS/Include/cmsis_gcc.h **** + 34:Drivers/CMSIS/Include/cmsis_gcc.h **** /* Fallback for __has_builtin */ + 35:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __has_builtin + 36:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __has_builtin(x) (0) + 37:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 38:Drivers/CMSIS/Include/cmsis_gcc.h **** + 39:Drivers/CMSIS/Include/cmsis_gcc.h **** /* CMSIS compiler specific defines */ + 40:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __ASM + 41:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __ASM __asm + 42:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 43:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __INLINE + 44:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __INLINE inline + 45:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 46:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __STATIC_INLINE + 47:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __STATIC_INLINE static inline + 48:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 49:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __STATIC_FORCEINLINE + 50:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __STATIC_FORCEINLINE __attribute__((always_inline)) static inline + 51:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 52:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __NO_RETURN + 53:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __NO_RETURN __attribute__((__noreturn__)) + 54:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 55:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __USED + 56:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __USED __attribute__((used)) + 57:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 58:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __WEAK + 59:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __WEAK __attribute__((weak)) + 60:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 61:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __PACKED + 62:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __PACKED __attribute__((packed, aligned(1))) + 63:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 64:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __PACKED_STRUCT + 65:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) + 66:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 67:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __PACKED_UNION + 68:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __PACKED_UNION union __attribute__((packed, aligned(1))) + 69:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 70:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __UNALIGNED_UINT32 /* deprecated */ + 71:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic push + 72:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wpacked" + 73:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wattributes" + 74:Drivers/CMSIS/Include/cmsis_gcc.h **** struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + 75:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic pop + 76:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + 77:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 78:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __UNALIGNED_UINT16_WRITE + 79:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic push + 80:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wpacked" + 81:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wattributes" + ARM GAS /tmp/ccLRMPc2.s page 34 + + + 82:Drivers/CMSIS/Include/cmsis_gcc.h **** __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + 83:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic pop + 84:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))- + 85:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 86:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __UNALIGNED_UINT16_READ + 87:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic push + 88:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wpacked" + 89:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wattributes" + 90:Drivers/CMSIS/Include/cmsis_gcc.h **** __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + 91:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic pop + 92:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(add + 93:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 94:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __UNALIGNED_UINT32_WRITE + 95:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic push + 96:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wpacked" + 97:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wattributes" + 98:Drivers/CMSIS/Include/cmsis_gcc.h **** __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + 99:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic pop + 100:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))- + 101:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 102:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __UNALIGNED_UINT32_READ + 103:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic push + 104:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wpacked" + 105:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic ignored "-Wattributes" + 106:Drivers/CMSIS/Include/cmsis_gcc.h **** __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + 107:Drivers/CMSIS/Include/cmsis_gcc.h **** #pragma GCC diagnostic pop + 108:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(add + 109:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 110:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __ALIGNED + 111:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __ALIGNED(x) __attribute__((aligned(x))) + 112:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 113:Drivers/CMSIS/Include/cmsis_gcc.h **** #ifndef __RESTRICT + 114:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __RESTRICT __restrict + 115:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 116:Drivers/CMSIS/Include/cmsis_gcc.h **** + 117:Drivers/CMSIS/Include/cmsis_gcc.h **** + 118:Drivers/CMSIS/Include/cmsis_gcc.h **** /* ########################### Core Function Access ########################### */ + 119:Drivers/CMSIS/Include/cmsis_gcc.h **** /** \ingroup CMSIS_Core_FunctionInterface + 120:Drivers/CMSIS/Include/cmsis_gcc.h **** \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + 121:Drivers/CMSIS/Include/cmsis_gcc.h **** @{ + 122:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 123:Drivers/CMSIS/Include/cmsis_gcc.h **** + 124:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 125:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Enable IRQ Interrupts + 126:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + 127:Drivers/CMSIS/Include/cmsis_gcc.h **** Can only be executed in Privileged modes. + 128:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 129:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __enable_irq(void) + 130:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 131:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("cpsie i" : : : "memory"); + 132:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 133:Drivers/CMSIS/Include/cmsis_gcc.h **** + 134:Drivers/CMSIS/Include/cmsis_gcc.h **** + 135:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 136:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Disable IRQ Interrupts + 137:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Disables IRQ interrupts by setting the I-bit in the CPSR. + 138:Drivers/CMSIS/Include/cmsis_gcc.h **** Can only be executed in Privileged modes. + ARM GAS /tmp/ccLRMPc2.s page 35 + + + 139:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 140:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __disable_irq(void) + 141:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 142:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("cpsid i" : : : "memory"); + 143:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 144:Drivers/CMSIS/Include/cmsis_gcc.h **** + 145:Drivers/CMSIS/Include/cmsis_gcc.h **** + 146:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 147:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Control Register + 148:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the content of the Control Register. + 149:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Control Register value + 150:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 151:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_CONTROL(void) + 152:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 153:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 154:Drivers/CMSIS/Include/cmsis_gcc.h **** + 155:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, control" : "=r" (result) ); + 156:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 157:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 158:Drivers/CMSIS/Include/cmsis_gcc.h **** + 159:Drivers/CMSIS/Include/cmsis_gcc.h **** + 160:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 161:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 162:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Control Register (non-secure) + 163:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the content of the non-secure Control Register when in secure mode. + 164:Drivers/CMSIS/Include/cmsis_gcc.h **** \return non-secure Control Register value + 165:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 166:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) + 167:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 168:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 169:Drivers/CMSIS/Include/cmsis_gcc.h **** + 170:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); + 171:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 172:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 173:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 174:Drivers/CMSIS/Include/cmsis_gcc.h **** + 175:Drivers/CMSIS/Include/cmsis_gcc.h **** + 176:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 177:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Control Register + 178:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Writes the given value to the Control Register. + 179:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] control Control Register value to set + 180:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 181:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) + 182:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 183:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); + 184:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 185:Drivers/CMSIS/Include/cmsis_gcc.h **** + 186:Drivers/CMSIS/Include/cmsis_gcc.h **** + 187:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 188:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 189:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Control Register (non-secure) + 190:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Writes the given value to the non-secure Control Register when in secure state. + 191:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] control Control Register value to set + 192:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 193:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) + 194:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 195:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); + ARM GAS /tmp/ccLRMPc2.s page 36 + + + 196:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 197:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 198:Drivers/CMSIS/Include/cmsis_gcc.h **** + 199:Drivers/CMSIS/Include/cmsis_gcc.h **** + 200:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 201:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get IPSR Register + 202:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the content of the IPSR Register. + 203:Drivers/CMSIS/Include/cmsis_gcc.h **** \return IPSR Register value + 204:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 205:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_IPSR(void) + 206:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 207:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 208:Drivers/CMSIS/Include/cmsis_gcc.h **** + 209:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); + 210:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 211:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 212:Drivers/CMSIS/Include/cmsis_gcc.h **** + 213:Drivers/CMSIS/Include/cmsis_gcc.h **** + 214:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 215:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get APSR Register + 216:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the content of the APSR Register. + 217:Drivers/CMSIS/Include/cmsis_gcc.h **** \return APSR Register value + 218:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 219:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_APSR(void) + 220:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 221:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 222:Drivers/CMSIS/Include/cmsis_gcc.h **** + 223:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, apsr" : "=r" (result) ); + 224:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 225:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 226:Drivers/CMSIS/Include/cmsis_gcc.h **** + 227:Drivers/CMSIS/Include/cmsis_gcc.h **** + 228:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 229:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get xPSR Register + 230:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the content of the xPSR Register. + 231:Drivers/CMSIS/Include/cmsis_gcc.h **** \return xPSR Register value + 232:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 233:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_xPSR(void) + 234:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 235:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 236:Drivers/CMSIS/Include/cmsis_gcc.h **** + 237:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); + 238:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 239:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 240:Drivers/CMSIS/Include/cmsis_gcc.h **** + 241:Drivers/CMSIS/Include/cmsis_gcc.h **** + 242:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 243:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Process Stack Pointer + 244:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the Process Stack Pointer (PSP). + 245:Drivers/CMSIS/Include/cmsis_gcc.h **** \return PSP Register value + 246:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 247:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_PSP(void) + 248:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 249:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 250:Drivers/CMSIS/Include/cmsis_gcc.h **** + 251:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, psp" : "=r" (result) ); + 252:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + ARM GAS /tmp/ccLRMPc2.s page 37 + + + 253:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 254:Drivers/CMSIS/Include/cmsis_gcc.h **** + 255:Drivers/CMSIS/Include/cmsis_gcc.h **** + 256:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 257:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 258:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Process Stack Pointer (non-secure) + 259:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure s + 260:Drivers/CMSIS/Include/cmsis_gcc.h **** \return PSP Register value + 261:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 262:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) + 263:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 264:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 265:Drivers/CMSIS/Include/cmsis_gcc.h **** + 266:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); + 267:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 268:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 269:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 270:Drivers/CMSIS/Include/cmsis_gcc.h **** + 271:Drivers/CMSIS/Include/cmsis_gcc.h **** + 272:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 273:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Process Stack Pointer + 274:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Process Stack Pointer (PSP). + 275:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] topOfProcStack Process Stack Pointer value to set + 276:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 277:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) + 278:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 279:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); + 280:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 281:Drivers/CMSIS/Include/cmsis_gcc.h **** + 282:Drivers/CMSIS/Include/cmsis_gcc.h **** + 283:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 284:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 285:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Process Stack Pointer (non-secure) + 286:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure sta + 287:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] topOfProcStack Process Stack Pointer value to set + 288:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 289:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) + 290:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 291:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); + 292:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 293:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 294:Drivers/CMSIS/Include/cmsis_gcc.h **** + 295:Drivers/CMSIS/Include/cmsis_gcc.h **** + 296:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 297:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Main Stack Pointer + 298:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the Main Stack Pointer (MSP). + 299:Drivers/CMSIS/Include/cmsis_gcc.h **** \return MSP Register value + 300:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 301:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_MSP(void) + 302:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 303:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 304:Drivers/CMSIS/Include/cmsis_gcc.h **** + 305:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, msp" : "=r" (result) ); + 306:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 307:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 308:Drivers/CMSIS/Include/cmsis_gcc.h **** + 309:Drivers/CMSIS/Include/cmsis_gcc.h **** + ARM GAS /tmp/ccLRMPc2.s page 38 + + + 310:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 311:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 312:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Main Stack Pointer (non-secure) + 313:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure stat + 314:Drivers/CMSIS/Include/cmsis_gcc.h **** \return MSP Register value + 315:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 316:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) + 317:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 318:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 319:Drivers/CMSIS/Include/cmsis_gcc.h **** + 320:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); + 321:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 322:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 323:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 324:Drivers/CMSIS/Include/cmsis_gcc.h **** + 325:Drivers/CMSIS/Include/cmsis_gcc.h **** + 326:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 327:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Main Stack Pointer + 328:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Main Stack Pointer (MSP). + 329:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] topOfMainStack Main Stack Pointer value to set + 330:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 331:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) + 332:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 333:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); + 334:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 335:Drivers/CMSIS/Include/cmsis_gcc.h **** + 336:Drivers/CMSIS/Include/cmsis_gcc.h **** + 337:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 338:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 339:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Main Stack Pointer (non-secure) + 340:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. + 341:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] topOfMainStack Main Stack Pointer value to set + 342:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 343:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) + 344:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 345:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); + 346:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 347:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 348:Drivers/CMSIS/Include/cmsis_gcc.h **** + 349:Drivers/CMSIS/Include/cmsis_gcc.h **** + 350:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 351:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 352:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Stack Pointer (non-secure) + 353:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. + 354:Drivers/CMSIS/Include/cmsis_gcc.h **** \return SP Register value + 355:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 356:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) + 357:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 358:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 359:Drivers/CMSIS/Include/cmsis_gcc.h **** + 360:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); + 361:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 362:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 363:Drivers/CMSIS/Include/cmsis_gcc.h **** + 364:Drivers/CMSIS/Include/cmsis_gcc.h **** + 365:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 366:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Stack Pointer (non-secure) + ARM GAS /tmp/ccLRMPc2.s page 39 + + + 367:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. + 368:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] topOfStack Stack Pointer value to set + 369:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 370:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) + 371:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 372:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); + 373:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 374:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 375:Drivers/CMSIS/Include/cmsis_gcc.h **** + 376:Drivers/CMSIS/Include/cmsis_gcc.h **** + 377:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 378:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Priority Mask + 379:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current state of the priority mask bit from the Priority Mask Register. + 380:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Priority Mask value + 381:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 382:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) + 383:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 384:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 385:Drivers/CMSIS/Include/cmsis_gcc.h **** + 386:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, primask" : "=r" (result) :: "memory"); + 387:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 388:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 389:Drivers/CMSIS/Include/cmsis_gcc.h **** + 390:Drivers/CMSIS/Include/cmsis_gcc.h **** + 391:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 392:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 393:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Priority Mask (non-secure) + 394:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current state of the non-secure priority mask bit from the Priority Mask Reg + 395:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Priority Mask value + 396:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 397:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) + 398:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 399:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 400:Drivers/CMSIS/Include/cmsis_gcc.h **** + 401:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, primask_ns" : "=r" (result) :: "memory"); + 402:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 403:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 404:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 405:Drivers/CMSIS/Include/cmsis_gcc.h **** + 406:Drivers/CMSIS/Include/cmsis_gcc.h **** + 407:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 408:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Priority Mask + 409:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Priority Mask Register. + 410:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] priMask Priority Mask + 411:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 412:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) + 413:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 414:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); + 415:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 416:Drivers/CMSIS/Include/cmsis_gcc.h **** + 417:Drivers/CMSIS/Include/cmsis_gcc.h **** + 418:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 419:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 420:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Priority Mask (non-secure) + 421:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the non-secure Priority Mask Register when in secure state. + 422:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] priMask Priority Mask + 423:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + ARM GAS /tmp/ccLRMPc2.s page 40 + + + 424:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) + 425:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 426:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); + 427:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 428:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 429:Drivers/CMSIS/Include/cmsis_gcc.h **** + 430:Drivers/CMSIS/Include/cmsis_gcc.h **** + 431:Drivers/CMSIS/Include/cmsis_gcc.h **** #if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + 432:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + 433:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + 434:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 435:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Enable FIQ + 436:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Enables FIQ interrupts by clearing the F-bit in the CPSR. + 437:Drivers/CMSIS/Include/cmsis_gcc.h **** Can only be executed in Privileged modes. + 438:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 439:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __enable_fault_irq(void) + 440:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 441:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("cpsie f" : : : "memory"); + 442:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 443:Drivers/CMSIS/Include/cmsis_gcc.h **** + 444:Drivers/CMSIS/Include/cmsis_gcc.h **** + 445:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 446:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Disable FIQ + 447:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Disables FIQ interrupts by setting the F-bit in the CPSR. + 448:Drivers/CMSIS/Include/cmsis_gcc.h **** Can only be executed in Privileged modes. + 449:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 450:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __disable_fault_irq(void) + 451:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 452:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("cpsid f" : : : "memory"); + 453:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 454:Drivers/CMSIS/Include/cmsis_gcc.h **** + 455:Drivers/CMSIS/Include/cmsis_gcc.h **** + 456:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 457:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Base Priority + 458:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the Base Priority register. + 459:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Base Priority register value + 460:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 461:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) + 462:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 463:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 464:Drivers/CMSIS/Include/cmsis_gcc.h **** + 465:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, basepri" : "=r" (result) ); + 466:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 467:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 468:Drivers/CMSIS/Include/cmsis_gcc.h **** + 469:Drivers/CMSIS/Include/cmsis_gcc.h **** + 470:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 471:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 472:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Base Priority (non-secure) + 473:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the non-secure Base Priority register when in secure state. + 474:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Base Priority register value + 475:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 476:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) + 477:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 478:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 479:Drivers/CMSIS/Include/cmsis_gcc.h **** + 480:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); + ARM GAS /tmp/ccLRMPc2.s page 41 + + + 481:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 482:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 483:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 484:Drivers/CMSIS/Include/cmsis_gcc.h **** + 485:Drivers/CMSIS/Include/cmsis_gcc.h **** + 486:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 487:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Base Priority + 488:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Base Priority register. + 489:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] basePri Base Priority value to set + 490:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 491:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) + 492:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 493:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); + 494:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 495:Drivers/CMSIS/Include/cmsis_gcc.h **** + 496:Drivers/CMSIS/Include/cmsis_gcc.h **** + 497:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 498:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 499:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Base Priority (non-secure) + 500:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the non-secure Base Priority register when in secure state. + 501:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] basePri Base Priority value to set + 502:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 503:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) + 504:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 505:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); + 506:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 507:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 508:Drivers/CMSIS/Include/cmsis_gcc.h **** + 509:Drivers/CMSIS/Include/cmsis_gcc.h **** + 510:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 511:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Base Priority with condition + 512:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Base Priority register only if BASEPRI masking is disable + 513:Drivers/CMSIS/Include/cmsis_gcc.h **** or the new value increases the BASEPRI priority level. + 514:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] basePri Base Priority value to set + 515:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 516:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) + 517:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 518:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); + 519:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 520:Drivers/CMSIS/Include/cmsis_gcc.h **** + 521:Drivers/CMSIS/Include/cmsis_gcc.h **** + 522:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 523:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Fault Mask + 524:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the Fault Mask register. + 525:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Fault Mask register value + 526:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 527:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) + 528:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 529:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 530:Drivers/CMSIS/Include/cmsis_gcc.h **** + 531:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + 532:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 533:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 534:Drivers/CMSIS/Include/cmsis_gcc.h **** + 535:Drivers/CMSIS/Include/cmsis_gcc.h **** + 536:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 537:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + ARM GAS /tmp/ccLRMPc2.s page 42 + + + 538:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Fault Mask (non-secure) + 539:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the non-secure Fault Mask register when in secure state. + 540:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Fault Mask register value + 541:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 542:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) + 543:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 544:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 545:Drivers/CMSIS/Include/cmsis_gcc.h **** + 546:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); + 547:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 548:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 549:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 550:Drivers/CMSIS/Include/cmsis_gcc.h **** + 551:Drivers/CMSIS/Include/cmsis_gcc.h **** + 552:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 553:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Fault Mask + 554:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Fault Mask register. + 555:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] faultMask Fault Mask value to set + 556:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 557:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) + 558:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 559:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); + 560:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 561:Drivers/CMSIS/Include/cmsis_gcc.h **** + 562:Drivers/CMSIS/Include/cmsis_gcc.h **** + 563:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 564:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 565:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Fault Mask (non-secure) + 566:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the non-secure Fault Mask register when in secure state. + 567:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] faultMask Fault Mask value to set + 568:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 569:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) + 570:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 571:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); + 572:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 573:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 574:Drivers/CMSIS/Include/cmsis_gcc.h **** + 575:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + 576:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + 577:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + 578:Drivers/CMSIS/Include/cmsis_gcc.h **** + 579:Drivers/CMSIS/Include/cmsis_gcc.h **** + 580:Drivers/CMSIS/Include/cmsis_gcc.h **** #if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + 581:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + 582:Drivers/CMSIS/Include/cmsis_gcc.h **** + 583:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 584:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Process Stack Pointer Limit + 585:Drivers/CMSIS/Include/cmsis_gcc.h **** Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + 586:Drivers/CMSIS/Include/cmsis_gcc.h **** Stack Pointer Limit register hence zero is returned always in non-secure + 587:Drivers/CMSIS/Include/cmsis_gcc.h **** mode. + 588:Drivers/CMSIS/Include/cmsis_gcc.h **** + 589:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). + 590:Drivers/CMSIS/Include/cmsis_gcc.h **** \return PSPLIM Register value + 591:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 592:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) + 593:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 594:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + ARM GAS /tmp/ccLRMPc2.s page 43 + + + 595:Drivers/CMSIS/Include/cmsis_gcc.h **** (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + 596:Drivers/CMSIS/Include/cmsis_gcc.h **** // without main extensions, the non-secure PSPLIM is RAZ/WI + 597:Drivers/CMSIS/Include/cmsis_gcc.h **** return 0U; + 598:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 599:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 600:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, psplim" : "=r" (result) ); + 601:Drivers/CMSIS/Include/cmsis_gcc.h **** return result; + 602:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 603:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 604:Drivers/CMSIS/Include/cmsis_gcc.h **** + 605:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)) + 606:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 607:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Process Stack Pointer Limit (non-secure) + 608:Drivers/CMSIS/Include/cmsis_gcc.h **** Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + 609:Drivers/CMSIS/Include/cmsis_gcc.h **** Stack Pointer Limit register hence zero is returned always. + 610:Drivers/CMSIS/Include/cmsis_gcc.h **** + 611:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in + 612:Drivers/CMSIS/Include/cmsis_gcc.h **** \return PSPLIM Register value + 613:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 614:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) + 615:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 616:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + 617:Drivers/CMSIS/Include/cmsis_gcc.h **** // without main extensions, the non-secure PSPLIM is RAZ/WI + 618:Drivers/CMSIS/Include/cmsis_gcc.h **** return 0U; + 619:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 620:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 621:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); + 622:Drivers/CMSIS/Include/cmsis_gcc.h **** return result; + 623:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 624:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 625:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 626:Drivers/CMSIS/Include/cmsis_gcc.h **** + 627:Drivers/CMSIS/Include/cmsis_gcc.h **** + 628:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 629:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Process Stack Pointer Limit + 630:Drivers/CMSIS/Include/cmsis_gcc.h **** Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + 631:Drivers/CMSIS/Include/cmsis_gcc.h **** Stack Pointer Limit register hence the write is silently ignored in non-secure + 632:Drivers/CMSIS/Include/cmsis_gcc.h **** mode. + 633:Drivers/CMSIS/Include/cmsis_gcc.h **** + 634:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). + 635:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + 636:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 637:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) + 638:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 639:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + 640:Drivers/CMSIS/Include/cmsis_gcc.h **** (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + 641:Drivers/CMSIS/Include/cmsis_gcc.h **** // without main extensions, the non-secure PSPLIM is RAZ/WI + 642:Drivers/CMSIS/Include/cmsis_gcc.h **** (void)ProcStackPtrLimit; + 643:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 644:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); + 645:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 646:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 647:Drivers/CMSIS/Include/cmsis_gcc.h **** + 648:Drivers/CMSIS/Include/cmsis_gcc.h **** + 649:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 650:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 651:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Process Stack Pointer (non-secure) + ARM GAS /tmp/ccLRMPc2.s page 44 + + + 652:Drivers/CMSIS/Include/cmsis_gcc.h **** Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + 653:Drivers/CMSIS/Include/cmsis_gcc.h **** Stack Pointer Limit register hence the write is silently ignored. + 654:Drivers/CMSIS/Include/cmsis_gcc.h **** + 655:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in s + 656:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + 657:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 658:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) + 659:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 660:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + 661:Drivers/CMSIS/Include/cmsis_gcc.h **** // without main extensions, the non-secure PSPLIM is RAZ/WI + 662:Drivers/CMSIS/Include/cmsis_gcc.h **** (void)ProcStackPtrLimit; + 663:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 664:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); + 665:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 666:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 667:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 668:Drivers/CMSIS/Include/cmsis_gcc.h **** + 669:Drivers/CMSIS/Include/cmsis_gcc.h **** + 670:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 671:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Main Stack Pointer Limit + 672:Drivers/CMSIS/Include/cmsis_gcc.h **** Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + 673:Drivers/CMSIS/Include/cmsis_gcc.h **** Stack Pointer Limit register hence zero is returned always in non-secure + 674:Drivers/CMSIS/Include/cmsis_gcc.h **** mode. + 675:Drivers/CMSIS/Include/cmsis_gcc.h **** + 676:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). + 677:Drivers/CMSIS/Include/cmsis_gcc.h **** \return MSPLIM Register value + 678:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 679:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) + 680:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 681:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + 682:Drivers/CMSIS/Include/cmsis_gcc.h **** (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + 683:Drivers/CMSIS/Include/cmsis_gcc.h **** // without main extensions, the non-secure MSPLIM is RAZ/WI + 684:Drivers/CMSIS/Include/cmsis_gcc.h **** return 0U; + 685:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 686:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 687:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, msplim" : "=r" (result) ); + 688:Drivers/CMSIS/Include/cmsis_gcc.h **** return result; + 689:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 690:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 691:Drivers/CMSIS/Include/cmsis_gcc.h **** + 692:Drivers/CMSIS/Include/cmsis_gcc.h **** + 693:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 694:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 695:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get Main Stack Pointer Limit (non-secure) + 696:Drivers/CMSIS/Include/cmsis_gcc.h **** Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + 697:Drivers/CMSIS/Include/cmsis_gcc.h **** Stack Pointer Limit register hence zero is returned always. + 698:Drivers/CMSIS/Include/cmsis_gcc.h **** + 699:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in sec + 700:Drivers/CMSIS/Include/cmsis_gcc.h **** \return MSPLIM Register value + 701:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 702:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) + 703:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 704:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + 705:Drivers/CMSIS/Include/cmsis_gcc.h **** // without main extensions, the non-secure MSPLIM is RAZ/WI + 706:Drivers/CMSIS/Include/cmsis_gcc.h **** return 0U; + 707:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 708:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + ARM GAS /tmp/ccLRMPc2.s page 45 + + + 709:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); + 710:Drivers/CMSIS/Include/cmsis_gcc.h **** return result; + 711:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 712:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 713:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 714:Drivers/CMSIS/Include/cmsis_gcc.h **** + 715:Drivers/CMSIS/Include/cmsis_gcc.h **** + 716:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 717:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Main Stack Pointer Limit + 718:Drivers/CMSIS/Include/cmsis_gcc.h **** Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + 719:Drivers/CMSIS/Include/cmsis_gcc.h **** Stack Pointer Limit register hence the write is silently ignored in non-secure + 720:Drivers/CMSIS/Include/cmsis_gcc.h **** mode. + 721:Drivers/CMSIS/Include/cmsis_gcc.h **** + 722:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). + 723:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set + 724:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 725:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) + 726:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 727:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + 728:Drivers/CMSIS/Include/cmsis_gcc.h **** (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + 729:Drivers/CMSIS/Include/cmsis_gcc.h **** // without main extensions, the non-secure MSPLIM is RAZ/WI + 730:Drivers/CMSIS/Include/cmsis_gcc.h **** (void)MainStackPtrLimit; + 731:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 732:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); + 733:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 734:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 735:Drivers/CMSIS/Include/cmsis_gcc.h **** + 736:Drivers/CMSIS/Include/cmsis_gcc.h **** + 737:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) + 738:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 739:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set Main Stack Pointer Limit (non-secure) + 740:Drivers/CMSIS/Include/cmsis_gcc.h **** Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + 741:Drivers/CMSIS/Include/cmsis_gcc.h **** Stack Pointer Limit register hence the write is silently ignored. + 742:Drivers/CMSIS/Include/cmsis_gcc.h **** + 743:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secu + 744:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] MainStackPtrLimit Main Stack Pointer value to set + 745:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 746:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) + 747:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 748:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + 749:Drivers/CMSIS/Include/cmsis_gcc.h **** // without main extensions, the non-secure MSPLIM is RAZ/WI + 750:Drivers/CMSIS/Include/cmsis_gcc.h **** (void)MainStackPtrLimit; + 751:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 752:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); + 753:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 754:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 755:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 756:Drivers/CMSIS/Include/cmsis_gcc.h **** + 757:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + 758:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + 759:Drivers/CMSIS/Include/cmsis_gcc.h **** + 760:Drivers/CMSIS/Include/cmsis_gcc.h **** + 761:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 762:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Get FPSCR + 763:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Returns the current value of the Floating Point Status/Control register. + 764:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Floating Point Status/Control register value + 765:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + ARM GAS /tmp/ccLRMPc2.s page 46 + + + 766:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __get_FPSCR(void) + 767:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 768:Drivers/CMSIS/Include/cmsis_gcc.h **** #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + 769:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + 770:Drivers/CMSIS/Include/cmsis_gcc.h **** #if __has_builtin(__builtin_arm_get_fpscr) + 771:Drivers/CMSIS/Include/cmsis_gcc.h **** // Re-enable using built-in when GCC has been fixed + 772:Drivers/CMSIS/Include/cmsis_gcc.h **** // || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) + 773:Drivers/CMSIS/Include/cmsis_gcc.h **** /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ + 774:Drivers/CMSIS/Include/cmsis_gcc.h **** return __builtin_arm_get_fpscr(); + 775:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 776:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 777:Drivers/CMSIS/Include/cmsis_gcc.h **** + 778:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); + 779:Drivers/CMSIS/Include/cmsis_gcc.h **** return(result); + 780:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 781:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 782:Drivers/CMSIS/Include/cmsis_gcc.h **** return(0U); + 783:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 784:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 785:Drivers/CMSIS/Include/cmsis_gcc.h **** + 786:Drivers/CMSIS/Include/cmsis_gcc.h **** + 787:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 788:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Set FPSCR + 789:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Assigns the given value to the Floating Point Status/Control register. + 790:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] fpscr Floating Point Status/Control value to set + 791:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 792:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __set_FPSCR(uint32_t fpscr) + 793:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 794:Drivers/CMSIS/Include/cmsis_gcc.h **** #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + 795:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + 796:Drivers/CMSIS/Include/cmsis_gcc.h **** #if __has_builtin(__builtin_arm_set_fpscr) + 797:Drivers/CMSIS/Include/cmsis_gcc.h **** // Re-enable using built-in when GCC has been fixed + 798:Drivers/CMSIS/Include/cmsis_gcc.h **** // || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) + 799:Drivers/CMSIS/Include/cmsis_gcc.h **** /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ + 800:Drivers/CMSIS/Include/cmsis_gcc.h **** __builtin_arm_set_fpscr(fpscr); + 801:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 802:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc", "memory"); + 803:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 804:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 805:Drivers/CMSIS/Include/cmsis_gcc.h **** (void)fpscr; + 806:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 807:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 808:Drivers/CMSIS/Include/cmsis_gcc.h **** + 809:Drivers/CMSIS/Include/cmsis_gcc.h **** + 810:Drivers/CMSIS/Include/cmsis_gcc.h **** /*@} end of CMSIS_Core_RegAccFunctions */ + 811:Drivers/CMSIS/Include/cmsis_gcc.h **** + 812:Drivers/CMSIS/Include/cmsis_gcc.h **** + 813:Drivers/CMSIS/Include/cmsis_gcc.h **** /* ########################## Core Instruction Access ######################### */ + 814:Drivers/CMSIS/Include/cmsis_gcc.h **** /** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + 815:Drivers/CMSIS/Include/cmsis_gcc.h **** Access to dedicated instructions + 816:Drivers/CMSIS/Include/cmsis_gcc.h **** @{ + 817:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 818:Drivers/CMSIS/Include/cmsis_gcc.h **** + 819:Drivers/CMSIS/Include/cmsis_gcc.h **** /* Define macros for porting to both thumb1 and thumb2. + 820:Drivers/CMSIS/Include/cmsis_gcc.h **** * For thumb1, use low register (r0-r7), specified by constraint "l" + 821:Drivers/CMSIS/Include/cmsis_gcc.h **** * Otherwise, use general registers, specified by constraint "r" */ + 822:Drivers/CMSIS/Include/cmsis_gcc.h **** #if defined (__thumb__) && !defined (__thumb2__) + ARM GAS /tmp/ccLRMPc2.s page 47 + + + 823:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __CMSIS_GCC_OUT_REG(r) "=l" (r) + 824:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __CMSIS_GCC_RW_REG(r) "+l" (r) + 825:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __CMSIS_GCC_USE_REG(r) "l" (r) + 826:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 827:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __CMSIS_GCC_OUT_REG(r) "=r" (r) + 828:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __CMSIS_GCC_RW_REG(r) "+r" (r) + 829:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __CMSIS_GCC_USE_REG(r) "r" (r) + 830:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 831:Drivers/CMSIS/Include/cmsis_gcc.h **** + 832:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 833:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief No Operation + 834:Drivers/CMSIS/Include/cmsis_gcc.h **** \details No Operation does nothing. This instruction can be used for code alignment purposes. + 835:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 836:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __NOP() __ASM volatile ("nop") + 837:Drivers/CMSIS/Include/cmsis_gcc.h **** + 838:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 839:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Wait For Interrupt + 840:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Wait For Interrupt is a hint instruction that suspends execution until one of a number o + 841:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 842:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __WFI() __ASM volatile ("wfi") + 843:Drivers/CMSIS/Include/cmsis_gcc.h **** + 844:Drivers/CMSIS/Include/cmsis_gcc.h **** + 845:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 846:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Wait For Event + 847:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Wait For Event is a hint instruction that permits the processor to enter + 848:Drivers/CMSIS/Include/cmsis_gcc.h **** a low-power state until one of a number of events occurs. + 849:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 850:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __WFE() __ASM volatile ("wfe") + 851:Drivers/CMSIS/Include/cmsis_gcc.h **** + 852:Drivers/CMSIS/Include/cmsis_gcc.h **** + 853:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 854:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Send Event + 855:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + 856:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 857:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __SEV() __ASM volatile ("sev") + 858:Drivers/CMSIS/Include/cmsis_gcc.h **** + 859:Drivers/CMSIS/Include/cmsis_gcc.h **** + 860:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 861:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Instruction Synchronization Barrier + 862:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Instruction Synchronization Barrier flushes the pipeline in the processor, + 863:Drivers/CMSIS/Include/cmsis_gcc.h **** so that all instructions following the ISB are fetched from cache or memory, + 864:Drivers/CMSIS/Include/cmsis_gcc.h **** after the instruction has been completed. + 865:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 866:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __ISB(void) + 867:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 868:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("isb 0xF":::"memory"); + 869:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 870:Drivers/CMSIS/Include/cmsis_gcc.h **** + 871:Drivers/CMSIS/Include/cmsis_gcc.h **** + 872:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 873:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Data Synchronization Barrier + 874:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Acts as a special kind of Data Memory Barrier. + 875:Drivers/CMSIS/Include/cmsis_gcc.h **** It completes when all explicit memory accesses before this instruction complete. + 876:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 877:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __DSB(void) + 878:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 879:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("dsb 0xF":::"memory"); + ARM GAS /tmp/ccLRMPc2.s page 48 + + + 880:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 881:Drivers/CMSIS/Include/cmsis_gcc.h **** + 882:Drivers/CMSIS/Include/cmsis_gcc.h **** + 883:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 884:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Data Memory Barrier + 885:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Ensures the apparent order of the explicit memory operations before + 886:Drivers/CMSIS/Include/cmsis_gcc.h **** and after the instruction, without ensuring their completion. + 887:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 888:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE void __DMB(void) + 889:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 890:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("dmb 0xF":::"memory"); + 891:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 892:Drivers/CMSIS/Include/cmsis_gcc.h **** + 893:Drivers/CMSIS/Include/cmsis_gcc.h **** + 894:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 895:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Reverse byte order (32 bit) + 896:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x785 + 897:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] value Value to reverse + 898:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Reversed value + 899:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 900:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __REV(uint32_t value) + 901:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 902:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) + 903:Drivers/CMSIS/Include/cmsis_gcc.h **** return __builtin_bswap32(value); + 904:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 905:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 906:Drivers/CMSIS/Include/cmsis_gcc.h **** + 907:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + 908:Drivers/CMSIS/Include/cmsis_gcc.h **** return result; + 909:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 910:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 911:Drivers/CMSIS/Include/cmsis_gcc.h **** + 912:Drivers/CMSIS/Include/cmsis_gcc.h **** + 913:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 914:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Reverse byte order (16 bit) + 915:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes + 916:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] value Value to reverse + 917:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Reversed value + 918:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 919:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __REV16(uint32_t value) + 920:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 921:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 922:Drivers/CMSIS/Include/cmsis_gcc.h **** + 923:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + 924:Drivers/CMSIS/Include/cmsis_gcc.h **** return result; + 925:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 926:Drivers/CMSIS/Include/cmsis_gcc.h **** + 927:Drivers/CMSIS/Include/cmsis_gcc.h **** + 928:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 929:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Reverse byte order (16 bit) + 930:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For exam + 931:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] value Value to reverse + 932:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Reversed value + 933:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 934:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE int16_t __REVSH(int16_t value) + 935:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 936:Drivers/CMSIS/Include/cmsis_gcc.h **** #if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + ARM GAS /tmp/ccLRMPc2.s page 49 + + + 937:Drivers/CMSIS/Include/cmsis_gcc.h **** return (int16_t)__builtin_bswap16(value); + 938:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 939:Drivers/CMSIS/Include/cmsis_gcc.h **** int16_t result; + 940:Drivers/CMSIS/Include/cmsis_gcc.h **** + 941:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + 942:Drivers/CMSIS/Include/cmsis_gcc.h **** return result; + 943:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif + 944:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 945:Drivers/CMSIS/Include/cmsis_gcc.h **** + 946:Drivers/CMSIS/Include/cmsis_gcc.h **** + 947:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 948:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Rotate Right in unsigned value (32 bit) + 949:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Rotate Right (immediate) provides the value of the contents of a register rotated by a v + 950:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] op1 Value to rotate + 951:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] op2 Number of Bits to rotate + 952:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Rotated value + 953:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 954:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) + 955:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 956:Drivers/CMSIS/Include/cmsis_gcc.h **** op2 %= 32U; + 957:Drivers/CMSIS/Include/cmsis_gcc.h **** if (op2 == 0U) + 958:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 959:Drivers/CMSIS/Include/cmsis_gcc.h **** return op1; + 960:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 961:Drivers/CMSIS/Include/cmsis_gcc.h **** return (op1 >> op2) | (op1 << (32U - op2)); + 962:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 963:Drivers/CMSIS/Include/cmsis_gcc.h **** + 964:Drivers/CMSIS/Include/cmsis_gcc.h **** + 965:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 966:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Breakpoint + 967:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Causes the processor to enter Debug state. + 968:Drivers/CMSIS/Include/cmsis_gcc.h **** Debug tools can use this to investigate system state when the instruction at a particula + 969:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] value is ignored by the processor. + 970:Drivers/CMSIS/Include/cmsis_gcc.h **** If required, a debugger can use it to store additional information about the break + 971:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 972:Drivers/CMSIS/Include/cmsis_gcc.h **** #define __BKPT(value) __ASM volatile ("bkpt "#value) + 973:Drivers/CMSIS/Include/cmsis_gcc.h **** + 974:Drivers/CMSIS/Include/cmsis_gcc.h **** + 975:Drivers/CMSIS/Include/cmsis_gcc.h **** /** + 976:Drivers/CMSIS/Include/cmsis_gcc.h **** \brief Reverse bit order of value + 977:Drivers/CMSIS/Include/cmsis_gcc.h **** \details Reverses the bit order of the given value. + 978:Drivers/CMSIS/Include/cmsis_gcc.h **** \param [in] value Value to reverse + 979:Drivers/CMSIS/Include/cmsis_gcc.h **** \return Reversed value + 980:Drivers/CMSIS/Include/cmsis_gcc.h **** */ + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** __STATIC_FORCEINLINE uint32_t __RBIT(uint32_t value) + 201 .loc 2 981 31 view .LVU61 + 202 .LBB19: + 982:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t result; + 203 .loc 2 983 3 view .LVU62 + 984:Drivers/CMSIS/Include/cmsis_gcc.h **** + 985:Drivers/CMSIS/Include/cmsis_gcc.h **** #if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + 986:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + 987:Drivers/CMSIS/Include/cmsis_gcc.h **** (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + 204 .loc 2 988 4 view .LVU63 + 205 0058 4FF48033 mov r3, #65536 + ARM GAS /tmp/ccLRMPc2.s page 50 + + + 206 .syntax unified + 207 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 208 005c 93FAA3F2 rbit r2, r3 + 209 @ 0 "" 2 + 210 .LVL20: + 989:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 990:Drivers/CMSIS/Include/cmsis_gcc.h **** uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */ + 991:Drivers/CMSIS/Include/cmsis_gcc.h **** + 992:Drivers/CMSIS/Include/cmsis_gcc.h **** result = value; /* r will be reversed bits of v; first get LSB of v */ + 993:Drivers/CMSIS/Include/cmsis_gcc.h **** for (value >>= 1U; value != 0U; value >>= 1U) + 994:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 995:Drivers/CMSIS/Include/cmsis_gcc.h **** result <<= 1U; + 996:Drivers/CMSIS/Include/cmsis_gcc.h **** result |= value & 1U; + 997:Drivers/CMSIS/Include/cmsis_gcc.h **** s--; + 998:Drivers/CMSIS/Include/cmsis_gcc.h **** } + 999:Drivers/CMSIS/Include/cmsis_gcc.h **** result <<= s; /* shift when v's highest bits are zero */ +1000:Drivers/CMSIS/Include/cmsis_gcc.h **** #endif +1001:Drivers/CMSIS/Include/cmsis_gcc.h **** return result; + 211 .loc 2 1001 3 view .LVU64 + 212 .loc 2 1001 3 is_stmt 0 view .LVU65 + 213 .thumb + 214 .syntax unified + 215 .LBE19: + 216 .LBE18: + 156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** __HAL_RCC_BACKUPRESET_RELEASE(); + 217 .loc 1 156 7 view .LVU66 + 218 0060 B2FA82F2 clz r2, r2 + 219 0064 724F ldr r7, .L36+8 + 220 0066 3A44 add r2, r2, r7 + 221 0068 9200 lsls r2, r2, #2 + 222 006a 4FF0010C mov ip, #1 + 223 006e C2F800C0 str ip, [r2] + 157:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Restore the Content of BDCR register */ + 224 .loc 1 157 7 is_stmt 1 view .LVU67 + 225 .LVL21: + 226 .LBB20: + 227 .LBI20: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 228 .loc 2 981 31 view .LVU68 + 229 .LBB21: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 230 .loc 2 983 3 view .LVU69 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 231 .loc 2 988 4 view .LVU70 + 232 .syntax unified + 233 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 234 0072 93FAA3F3 rbit r3, r3 + 235 @ 0 "" 2 + 236 .LVL22: + 237 .loc 2 1001 3 view .LVU71 + 238 .loc 2 1001 3 is_stmt 0 view .LVU72 + 239 .thumb + 240 .syntax unified + 241 .LBE21: + 242 .LBE20: + 157:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Restore the Content of BDCR register */ + 243 .loc 1 157 7 view .LVU73 + ARM GAS /tmp/ccLRMPc2.s page 51 + + + 244 0076 B3FA83F3 clz r3, r3 + 245 007a 3B44 add r3, r3, r7 + 246 007c 9B00 lsls r3, r3, #2 + 247 007e 0022 movs r2, #0 + 248 0080 1A60 str r2, [r3] + 159:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 249 .loc 1 159 7 is_stmt 1 view .LVU74 + 159:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 250 .loc 1 159 17 is_stmt 0 view .LVU75 + 251 0082 0662 str r6, [r0, #32] + 162:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 252 .loc 1 162 7 is_stmt 1 view .LVU76 + 162:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 253 .loc 1 162 10 is_stmt 0 view .LVU77 + 254 0084 11F0010F tst r1, #1 + 255 0088 40F09C80 bne .L34 + 256 .LVL23: + 257 .L13: + 177:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 258 .loc 1 177 5 is_stmt 1 view .LVU78 + 259 008c 664A ldr r2, .L36 + 260 008e 136A ldr r3, [r2, #32] + 261 0090 23F44073 bic r3, r3, #768 + 262 0094 6168 ldr r1, [r4, #4] + 263 0096 0B43 orrs r3, r3, r1 + 264 0098 1362 str r3, [r2, #32] + 180:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 265 .loc 1 180 5 view .LVU79 + 180:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 266 .loc 1 180 7 is_stmt 0 view .LVU80 + 267 009a 002D cmp r5, #0 + 268 009c 40F0B980 bne .L35 + 269 .LVL24: + 270 .L7: + 187:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 271 .loc 1 187 3 is_stmt 1 view .LVU81 + 187:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 272 .loc 1 187 21 is_stmt 0 view .LVU82 + 273 00a0 2368 ldr r3, [r4] + 187:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 274 .loc 1 187 5 view .LVU83 + 275 00a2 13F0010F tst r3, #1 + 276 00a6 06D0 beq .L18 + 190:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 277 .loc 1 190 5 is_stmt 1 view .LVU84 + 193:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 278 .loc 1 193 5 view .LVU85 + 279 00a8 5F4A ldr r2, .L36 + 280 00aa 136B ldr r3, [r2, #48] + 281 00ac 23F00303 bic r3, r3, #3 + 282 00b0 A168 ldr r1, [r4, #8] + 283 00b2 0B43 orrs r3, r3, r1 + 284 00b4 1363 str r3, [r2, #48] + 285 .L18: + 198:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 286 .loc 1 198 3 view .LVU86 + 198:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + ARM GAS /tmp/ccLRMPc2.s page 52 + + + 287 .loc 1 198 21 is_stmt 0 view .LVU87 + 288 00b6 2368 ldr r3, [r4] + 198:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 289 .loc 1 198 5 view .LVU88 + 290 00b8 13F0020F tst r3, #2 + 291 00bc 06D0 beq .L19 + 201:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 292 .loc 1 201 5 is_stmt 1 view .LVU89 + 204:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 293 .loc 1 204 5 view .LVU90 + 294 00be 5A4A ldr r2, .L36 + 295 00c0 136B ldr r3, [r2, #48] + 296 00c2 23F44033 bic r3, r3, #196608 + 297 00c6 E168 ldr r1, [r4, #12] + 298 00c8 0B43 orrs r3, r3, r1 + 299 00ca 1363 str r3, [r2, #48] + 300 .L19: + 210:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 301 .loc 1 210 3 view .LVU91 + 210:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 302 .loc 1 210 21 is_stmt 0 view .LVU92 + 303 00cc 2368 ldr r3, [r4] + 210:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 304 .loc 1 210 5 view .LVU93 + 305 00ce 13F0040F tst r3, #4 + 306 00d2 06D0 beq .L20 + 213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 307 .loc 1 213 5 is_stmt 1 view .LVU94 + 216:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 308 .loc 1 216 5 view .LVU95 + 309 00d4 544A ldr r2, .L36 + 310 00d6 136B ldr r3, [r2, #48] + 311 00d8 23F44023 bic r3, r3, #786432 + 312 00dc 2169 ldr r1, [r4, #16] + 313 00de 0B43 orrs r3, r3, r1 + 314 00e0 1363 str r3, [r2, #48] + 315 .L20: + 221:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 316 .loc 1 221 3 view .LVU96 + 221:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 317 .loc 1 221 21 is_stmt 0 view .LVU97 + 318 00e2 2368 ldr r3, [r4] + 221:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 319 .loc 1 221 5 view .LVU98 + 320 00e4 13F0200F tst r3, #32 + 321 00e8 06D0 beq .L21 + 224:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 322 .loc 1 224 5 is_stmt 1 view .LVU99 + 227:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 323 .loc 1 227 5 view .LVU100 + 324 00ea 4F4A ldr r2, .L36 + 325 00ec 136B ldr r3, [r2, #48] + 326 00ee 23F01003 bic r3, r3, #16 + 327 00f2 E169 ldr r1, [r4, #28] + 328 00f4 0B43 orrs r3, r3, r1 + 329 00f6 1363 str r3, [r2, #48] + 330 .L21: + ARM GAS /tmp/ccLRMPc2.s page 53 + + + 235:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 331 .loc 1 235 3 view .LVU101 + 235:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 332 .loc 1 235 21 is_stmt 0 view .LVU102 + 333 00f8 2368 ldr r3, [r4] + 235:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 334 .loc 1 235 5 view .LVU103 + 335 00fa 13F4003F tst r3, #131072 + 336 00fe 06D0 beq .L22 + 238:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 337 .loc 1 238 5 is_stmt 1 view .LVU104 + 241:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 338 .loc 1 241 5 view .LVU105 + 339 0100 494A ldr r2, .L36 + 340 0102 5368 ldr r3, [r2, #4] + 341 0104 23F48003 bic r3, r3, #4194304 + 342 0108 216B ldr r1, [r4, #48] + 343 010a 0B43 orrs r3, r3, r1 + 344 010c 5360 str r3, [r2, #4] + 345 .L22: + 255:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 346 .loc 1 255 3 view .LVU106 + 255:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 347 .loc 1 255 21 is_stmt 0 view .LVU107 + 348 010e 2368 ldr r3, [r4] + 255:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 349 .loc 1 255 5 view .LVU108 + 350 0110 13F0400F tst r3, #64 + 351 0114 06D0 beq .L23 + 258:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 352 .loc 1 258 5 is_stmt 1 view .LVU109 + 261:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 353 .loc 1 261 5 view .LVU110 + 354 0116 444A ldr r2, .L36 + 355 0118 136B ldr r3, [r2, #48] + 356 011a 23F02003 bic r3, r3, #32 + 357 011e 216A ldr r1, [r4, #32] + 358 0120 0B43 orrs r3, r3, r1 + 359 0122 1363 str r3, [r2, #48] + 360 .L23: + 288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 361 .loc 1 288 3 view .LVU111 + 288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 362 .loc 1 288 21 is_stmt 0 view .LVU112 + 363 0124 2368 ldr r3, [r4] + 288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 364 .loc 1 288 5 view .LVU113 + 365 0126 13F0080F tst r3, #8 + 366 012a 06D0 beq .L24 + 291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 367 .loc 1 291 5 is_stmt 1 view .LVU114 + 294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 368 .loc 1 294 5 view .LVU115 + 369 012c 3E4A ldr r2, .L36 + 370 012e 136B ldr r3, [r2, #48] + 371 0130 23F44013 bic r3, r3, #3145728 + 372 0134 6169 ldr r1, [r4, #20] + ARM GAS /tmp/ccLRMPc2.s page 54 + + + 373 0136 0B43 orrs r3, r3, r1 + 374 0138 1363 str r3, [r2, #48] + 375 .L24: + 298:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 376 .loc 1 298 3 view .LVU116 + 298:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 377 .loc 1 298 21 is_stmt 0 view .LVU117 + 378 013a 2368 ldr r3, [r4] + 298:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 379 .loc 1 298 5 view .LVU118 + 380 013c 13F0100F tst r3, #16 + 381 0140 06D0 beq .L25 + 301:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 382 .loc 1 301 5 is_stmt 1 view .LVU119 + 304:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 383 .loc 1 304 5 view .LVU120 + 384 0142 394A ldr r2, .L36 + 385 0144 136B ldr r3, [r2, #48] + 386 0146 23F44003 bic r3, r3, #12582912 + 387 014a A169 ldr r1, [r4, #24] + 388 014c 0B43 orrs r3, r3, r1 + 389 014e 1363 str r3, [r2, #48] + 390 .L25: + 314:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 391 .loc 1 314 3 view .LVU121 + 314:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 392 .loc 1 314 21 is_stmt 0 view .LVU122 + 393 0150 2368 ldr r3, [r4] + 314:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 394 .loc 1 314 5 view .LVU123 + 395 0152 13F4007F tst r3, #512 + 396 0156 06D0 beq .L26 + 317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 397 .loc 1 317 5 is_stmt 1 view .LVU124 + 320:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 398 .loc 1 320 5 view .LVU125 + 399 0158 334A ldr r2, .L36 + 400 015a 5368 ldr r3, [r2, #4] + 401 015c 23F40003 bic r3, r3, #8388608 + 402 0160 A16A ldr r1, [r4, #40] + 403 0162 0B43 orrs r3, r3, r1 + 404 0164 5360 str r3, [r2, #4] + 405 .L26: + 346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 406 .loc 1 346 3 view .LVU126 + 346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 407 .loc 1 346 21 is_stmt 0 view .LVU127 + 408 0166 2368 ldr r3, [r4] + 346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 409 .loc 1 346 5 view .LVU128 + 410 0168 13F0800F tst r3, #128 + 411 016c 06D0 beq .L27 + 349:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 412 .loc 1 349 5 is_stmt 1 view .LVU129 + 352:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 413 .loc 1 352 5 view .LVU130 + 414 016e 2E4A ldr r2, .L36 + ARM GAS /tmp/ccLRMPc2.s page 55 + + + 415 0170 D36A ldr r3, [r2, #44] + 416 0172 23F4F873 bic r3, r3, #496 + 417 0176 616A ldr r1, [r4, #36] + 418 0178 0B43 orrs r3, r3, r1 + 419 017a D362 str r3, [r2, #44] + 420 .L27: + 395:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 421 .loc 1 395 3 view .LVU131 + 395:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 422 .loc 1 395 21 is_stmt 0 view .LVU132 + 423 017c 2368 ldr r3, [r4] + 395:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 424 .loc 1 395 5 view .LVU133 + 425 017e 13F4805F tst r3, #4096 + 426 0182 4DD0 beq .L31 + 398:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 427 .loc 1 398 5 is_stmt 1 view .LVU134 + 401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 428 .loc 1 401 5 view .LVU135 + 429 0184 284A ldr r2, .L36 + 430 0186 136B ldr r3, [r2, #48] + 431 0188 23F48073 bic r3, r3, #256 + 432 018c E16A ldr r1, [r4, #44] + 433 018e 0B43 orrs r3, r3, r1 + 434 0190 1363 str r3, [r2, #48] + 564:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 435 .loc 1 564 10 is_stmt 0 view .LVU136 + 436 0192 0020 movs r0, #0 + 437 0194 45E0 b .L11 + 438 .LVL25: + 439 .L28: + 111:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 440 .loc 1 111 20 view .LVU137 + 441 0196 0025 movs r5, #0 + 442 0198 4AE7 b .L8 + 443 .LVL26: + 444 .L33: + 135:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 445 .loc 1 135 7 is_stmt 1 view .LVU138 + 446 019a 244A ldr r2, .L36+4 + 447 019c 1368 ldr r3, [r2] + 448 019e 43F48073 orr r3, r3, #256 + 449 01a2 1360 str r3, [r2] + 138:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 450 .loc 1 138 7 view .LVU139 + 138:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 451 .loc 1 138 19 is_stmt 0 view .LVU140 + 452 01a4 FFF7FEFF bl HAL_GetTick + 453 .LVL27: + 138:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 454 .loc 1 138 19 view .LVU141 + 455 01a8 0646 mov r6, r0 + 456 .LVL28: + 140:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 457 .loc 1 140 7 is_stmt 1 view .LVU142 + 458 .L10: + 140:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + ARM GAS /tmp/ccLRMPc2.s page 56 + + + 459 .loc 1 140 13 view .LVU143 + 460 01aa 204B ldr r3, .L36+4 + 461 01ac 1B68 ldr r3, [r3] + 462 01ae 13F4807F tst r3, #256 + 463 01b2 7FF443AF bne .L9 + 142:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 464 .loc 1 142 11 view .LVU144 + 142:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 465 .loc 1 142 15 is_stmt 0 view .LVU145 + 466 01b6 FFF7FEFF bl HAL_GetTick + 467 .LVL29: + 142:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 468 .loc 1 142 29 view .LVU146 + 469 01ba 801B subs r0, r0, r6 + 142:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 470 .loc 1 142 13 view .LVU147 + 471 01bc 6428 cmp r0, #100 + 472 01be F4D9 bls .L10 + 144:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 473 .loc 1 144 18 view .LVU148 + 474 01c0 0320 movs r0, #3 + 475 01c2 2EE0 b .L11 + 476 .LVL30: + 477 .L34: + 165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 478 .loc 1 165 9 is_stmt 1 view .LVU149 + 165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 479 .loc 1 165 21 is_stmt 0 view .LVU150 + 480 01c4 FFF7FEFF bl HAL_GetTick + 481 .LVL31: + 482 01c8 0646 mov r6, r0 + 483 .LVL32: + 168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 484 .loc 1 168 9 is_stmt 1 view .LVU151 + 168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 485 .loc 1 168 14 is_stmt 0 view .LVU152 + 486 01ca 18E0 b .L14 + 487 .LVL33: + 488 .L15: + 489 .LBB22: + 490 .LBI22: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 491 .loc 2 981 31 is_stmt 1 view .LVU153 + 492 .LBB23: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 493 .loc 2 983 3 view .LVU154 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 494 .loc 2 988 4 view .LVU155 + 495 01cc 0223 movs r3, #2 + 496 .syntax unified + 497 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 498 01ce 93FAA3F3 rbit r3, r3 + 499 @ 0 "" 2 + 500 .LVL34: + 501 .loc 2 1001 3 view .LVU156 + 502 .loc 2 1001 3 is_stmt 0 view .LVU157 + 503 .thumb + ARM GAS /tmp/ccLRMPc2.s page 57 + + + 504 .syntax unified + 505 .LBE23: + 506 .LBE22: + 168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 507 .loc 1 168 15 view .LVU158 + 508 01d2 154B ldr r3, .L36 + 509 01d4 596A ldr r1, [r3, #36] + 510 .L16: + 511 .LVL35: + 512 .LBB24: + 513 .LBI24: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 514 .loc 2 981 31 is_stmt 1 discriminator 11 view .LVU159 + 515 .LBB25: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 516 .loc 2 983 3 discriminator 11 view .LVU160 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 517 .loc 2 988 4 discriminator 11 view .LVU161 + 518 01d6 0223 movs r3, #2 + 519 .syntax unified + 520 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 521 01d8 93FAA3F3 rbit r3, r3 + 522 @ 0 "" 2 + 523 .LVL36: + 524 .loc 2 1001 3 discriminator 11 view .LVU162 + 525 .loc 2 1001 3 is_stmt 0 discriminator 11 view .LVU163 + 526 .thumb + 527 .syntax unified + 528 .LBE25: + 529 .LBE24: + 168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 530 .loc 1 168 15 discriminator 11 view .LVU164 + 531 01dc B3FA83F3 clz r3, r3 + 532 01e0 03F01F03 and r3, r3, #31 + 533 01e4 0122 movs r2, #1 + 534 01e6 02FA03F3 lsl r3, r2, r3 + 168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 535 .loc 1 168 51 discriminator 11 view .LVU165 + 536 01ea 0B42 tst r3, r1 + 537 01ec 7FF44EAF bne .L13 + 170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 538 .loc 1 170 13 is_stmt 1 view .LVU166 + 170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 539 .loc 1 170 17 is_stmt 0 view .LVU167 + 540 01f0 FFF7FEFF bl HAL_GetTick + 541 .LVL37: + 170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 542 .loc 1 170 31 view .LVU168 + 543 01f4 801B subs r0, r0, r6 + 170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 544 .loc 1 170 15 view .LVU169 + 545 01f6 41F28833 movw r3, #5000 + 546 01fa 9842 cmp r0, r3 + 547 01fc 0ED8 bhi .L30 + 548 .L14: + 168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 549 .loc 1 168 51 is_stmt 1 view .LVU170 + ARM GAS /tmp/ccLRMPc2.s page 58 + + + 550 .LVL38: + 551 .LBB26: + 552 .LBI26: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 553 .loc 2 981 31 view .LVU171 + 554 .LBB27: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 555 .loc 2 983 3 view .LVU172 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 556 .loc 2 988 4 view .LVU173 + 557 01fe 0223 movs r3, #2 + 558 .syntax unified + 559 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 560 0200 93FAA3F2 rbit r2, r3 + 561 @ 0 "" 2 + 562 .LVL39: + 563 .loc 2 1001 3 view .LVU174 + 564 .loc 2 1001 3 is_stmt 0 view .LVU175 + 565 .thumb + 566 .syntax unified + 567 .LBE27: + 568 .LBE26: + 569 .LBB28: + 570 .LBI28: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 571 .loc 2 981 31 is_stmt 1 view .LVU176 + 572 .LBB29: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 573 .loc 2 983 3 view .LVU177 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 574 .loc 2 988 4 view .LVU178 + 575 .syntax unified + 576 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 577 0204 93FAA3F3 rbit r3, r3 + 578 @ 0 "" 2 + 579 .LVL40: + 580 .loc 2 1001 3 view .LVU179 + 581 .loc 2 1001 3 is_stmt 0 view .LVU180 + 582 .thumb + 583 .syntax unified + 584 .LBE29: + 585 .LBE28: + 168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 586 .loc 1 168 15 view .LVU181 + 587 0208 002B cmp r3, #0 + 588 020a DFD0 beq .L15 + 168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 589 .loc 1 168 15 discriminator 4 view .LVU182 + 590 020c 064B ldr r3, .L36 + 591 020e 196A ldr r1, [r3, #32] + 592 0210 E1E7 b .L16 + 593 .LVL41: + 594 .L35: + 182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 595 .loc 1 182 7 is_stmt 1 view .LVU183 + 596 0212 D369 ldr r3, [r2, #28] + 597 0214 23F08053 bic r3, r3, #268435456 + ARM GAS /tmp/ccLRMPc2.s page 59 + + + 598 0218 D361 str r3, [r2, #28] + 599 021a 41E7 b .L7 + 600 .LVL42: + 601 .L30: + 172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 602 .loc 1 172 20 is_stmt 0 view .LVU184 + 603 021c 0320 movs r0, #3 + 604 021e 00E0 b .L11 + 605 .LVL43: + 606 .L31: + 564:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 607 .loc 1 564 10 view .LVU185 + 608 0220 0020 movs r0, #0 + 609 .L11: + 565:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 610 .loc 1 565 1 view .LVU186 + 611 0222 03B0 add sp, sp, #12 + 612 .cfi_def_cfa_offset 20 + 613 @ sp needed + 614 0224 F0BD pop {r4, r5, r6, r7, pc} + 615 .LVL44: + 616 .L37: + 565:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 617 .loc 1 565 1 view .LVU187 + 618 0226 00BF .align 2 + 619 .L36: + 620 0228 00100240 .word 1073876992 + 621 022c 00700040 .word 1073770496 + 622 0230 00819010 .word 277905664 + 623 .cfi_endproc + 624 .LFE130: + 626 .section .text.HAL_RCCEx_GetPeriphCLKConfig,"ax",%progbits + 627 .align 1 + 628 .global HAL_RCCEx_GetPeriphCLKConfig + 629 .syntax unified + 630 .thumb + 631 .thumb_func + 633 HAL_RCCEx_GetPeriphCLKConfig: + 634 .LVL45: + 635 .LFB131: + 576:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Set all possible values for the extended clock type parameter------------*/ + 636 .loc 1 576 1 is_stmt 1 view -0 + 637 .cfi_startproc + 638 @ args = 0, pretend = 0, frame = 0 + 639 @ frame_needed = 0, uses_anonymous_args = 0 + 640 @ link register save eliminated. + 580:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** RCC_PERIPHCLK_I2C1 | RCC_PERIPHCLK_RTC; + 641 .loc 1 580 3 view .LVU189 + 580:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** RCC_PERIPHCLK_I2C1 | RCC_PERIPHCLK_RTC; + 642 .loc 1 580 39 is_stmt 0 view .LVU190 + 643 0000 1F4B ldr r3, .L39 + 644 0002 0360 str r3, [r0] + 588:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the USART1 clock configuration --------------------------------------------*/ + 645 .loc 1 588 3 is_stmt 1 view .LVU191 + 588:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the USART1 clock configuration --------------------------------------------*/ + 646 .loc 1 588 38 is_stmt 0 view .LVU192 + 647 0004 1F4B ldr r3, .L39+4 + ARM GAS /tmp/ccLRMPc2.s page 60 + + + 648 0006 1A6A ldr r2, [r3, #32] + 649 0008 02F44072 and r2, r2, #768 + 588:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the USART1 clock configuration --------------------------------------------*/ + 650 .loc 1 588 36 view .LVU193 + 651 000c 4260 str r2, [r0, #4] + 590:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(RCC_CFGR3_USART2SW) + 652 .loc 1 590 3 is_stmt 1 view .LVU194 + 590:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(RCC_CFGR3_USART2SW) + 653 .loc 1 590 41 is_stmt 0 view .LVU195 + 654 000e 1A6B ldr r2, [r3, #48] + 655 0010 02F00302 and r2, r2, #3 + 590:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(RCC_CFGR3_USART2SW) + 656 .loc 1 590 39 view .LVU196 + 657 0014 8260 str r2, [r0, #8] + 593:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* RCC_CFGR3_USART2SW */ + 658 .loc 1 593 3 is_stmt 1 view .LVU197 + 593:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* RCC_CFGR3_USART2SW */ + 659 .loc 1 593 41 is_stmt 0 view .LVU198 + 660 0016 1A6B ldr r2, [r3, #48] + 661 0018 02F44032 and r2, r2, #196608 + 593:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* RCC_CFGR3_USART2SW */ + 662 .loc 1 593 39 view .LVU199 + 663 001c C260 str r2, [r0, #12] + 597:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* RCC_CFGR3_USART3SW */ + 664 .loc 1 597 3 is_stmt 1 view .LVU200 + 597:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* RCC_CFGR3_USART3SW */ + 665 .loc 1 597 41 is_stmt 0 view .LVU201 + 666 001e 1A6B ldr r2, [r3, #48] + 667 0020 02F44022 and r2, r2, #786432 + 597:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* RCC_CFGR3_USART3SW */ + 668 .loc 1 597 39 view .LVU202 + 669 0024 0261 str r2, [r0, #16] + 600:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 670 .loc 1 600 3 is_stmt 1 view .LVU203 + 600:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 671 .loc 1 600 39 is_stmt 0 view .LVU204 + 672 0026 1A6B ldr r2, [r3, #48] + 673 0028 02F01002 and r2, r2, #16 + 600:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 674 .loc 1 600 37 view .LVU205 + 675 002c C261 str r2, [r0, #28] + 607:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the USB clock configuration -----------------------------------------*/ + 676 .loc 1 607 3 is_stmt 1 view .LVU206 + 607:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the USB clock configuration -----------------------------------------*/ + 677 .loc 1 607 39 is_stmt 0 view .LVU207 + 678 002e 164A ldr r2, .L39+8 + 679 0030 0260 str r2, [r0] + 609:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 680 .loc 1 609 3 is_stmt 1 view .LVU208 + 609:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 681 .loc 1 609 38 is_stmt 0 view .LVU209 + 682 0032 5A68 ldr r2, [r3, #4] + 683 0034 02F48002 and r2, r2, #4194304 + 609:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 684 .loc 1 609 36 view .LVU210 + 685 0038 0263 str r2, [r0, #48] + 621:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the I2C2 clock configuration -----------------------------------------*/ + ARM GAS /tmp/ccLRMPc2.s page 61 + + + 686 .loc 1 621 3 is_stmt 1 view .LVU211 + 621:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the I2C2 clock configuration -----------------------------------------*/ + 687 .loc 1 621 39 is_stmt 0 view .LVU212 + 688 003a 144A ldr r2, .L39+12 + 689 003c 0260 str r2, [r0] + 623:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 690 .loc 1 623 3 is_stmt 1 view .LVU213 + 623:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 691 .loc 1 623 39 is_stmt 0 view .LVU214 + 692 003e 1A6B ldr r2, [r3, #48] + 693 0040 02F02002 and r2, r2, #32 + 623:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 694 .loc 1 623 37 view .LVU215 + 695 0044 0262 str r2, [r0, #32] + 643:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the UART4 clock configuration -----------------------------------------*/ + 696 .loc 1 643 3 is_stmt 1 view .LVU216 + 643:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the UART4 clock configuration -----------------------------------------*/ + 697 .loc 1 643 39 is_stmt 0 view .LVU217 + 698 0046 124A ldr r2, .L39+16 + 699 0048 0260 str r2, [r0] + 645:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the UART5 clock configuration -----------------------------------------*/ + 700 .loc 1 645 3 is_stmt 1 view .LVU218 + 645:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the UART5 clock configuration -----------------------------------------*/ + 701 .loc 1 645 40 is_stmt 0 view .LVU219 + 702 004a 1A6B ldr r2, [r3, #48] + 703 004c 02F44012 and r2, r2, #3145728 + 645:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the UART5 clock configuration -----------------------------------------*/ + 704 .loc 1 645 38 view .LVU220 + 705 0050 4261 str r2, [r0, #20] + 647:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 706 .loc 1 647 3 is_stmt 1 view .LVU221 + 647:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 707 .loc 1 647 40 is_stmt 0 view .LVU222 + 708 0052 1A6B ldr r2, [r3, #48] + 709 0054 02F44002 and r2, r2, #12582912 + 647:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 710 .loc 1 647 38 view .LVU223 + 711 0058 8261 str r2, [r0, #24] + 656:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the I2S clock configuration -----------------------------------------*/ + 712 .loc 1 656 3 is_stmt 1 view .LVU224 + 656:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the I2S clock configuration -----------------------------------------*/ + 713 .loc 1 656 39 is_stmt 0 view .LVU225 + 714 005a 0E4A ldr r2, .L39+20 + 715 005c 0260 str r2, [r0] + 658:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 716 .loc 1 658 3 is_stmt 1 view .LVU226 + 658:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 717 .loc 1 658 38 is_stmt 0 view .LVU227 + 718 005e 5A68 ldr r2, [r3, #4] + 719 0060 02F40002 and r2, r2, #8388608 + 658:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 720 .loc 1 658 36 view .LVU228 + 721 0064 8262 str r2, [r0, #40] + 678:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the ADC1 & ADC2 clock configuration -----------------------------------------*/ + 722 .loc 1 678 3 is_stmt 1 view .LVU229 + 678:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the ADC1 & ADC2 clock configuration -----------------------------------------*/ + 723 .loc 1 678 39 is_stmt 0 view .LVU230 + ARM GAS /tmp/ccLRMPc2.s page 62 + + + 724 0066 0C4A ldr r2, .L39+24 + 725 0068 0260 str r2, [r0] + 680:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 726 .loc 1 680 3 is_stmt 1 view .LVU231 + 680:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 727 .loc 1 680 40 is_stmt 0 view .LVU232 + 728 006a DA6A ldr r2, [r3, #44] + 729 006c 02F4F872 and r2, r2, #496 + 680:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 730 .loc 1 680 38 view .LVU233 + 731 0070 4262 str r2, [r0, #36] + 701:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the TIM1 clock configuration -----------------------------------------*/ + 732 .loc 1 701 3 is_stmt 1 view .LVU234 + 701:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Get the TIM1 clock configuration -----------------------------------------*/ + 733 .loc 1 701 39 is_stmt 0 view .LVU235 + 734 0072 0A4A ldr r2, .L39+28 + 735 0074 0260 str r2, [r0] + 703:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 736 .loc 1 703 3 is_stmt 1 view .LVU236 + 703:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 737 .loc 1 703 39 is_stmt 0 view .LVU237 + 738 0076 1B6B ldr r3, [r3, #48] + 739 0078 03F48073 and r3, r3, #256 + 703:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 740 .loc 1 703 37 view .LVU238 + 741 007c C362 str r3, [r0, #44] + 781:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 742 .loc 1 781 1 view .LVU239 + 743 007e 7047 bx lr + 744 .L40: + 745 .align 2 + 746 .L39: + 747 0080 27000100 .word 65575 + 748 0084 00100240 .word 1073876992 + 749 0088 27000300 .word 196647 + 750 008c 67000300 .word 196711 + 751 0090 7F000300 .word 196735 + 752 0094 7F020300 .word 197247 + 753 0098 FF020300 .word 197375 + 754 009c FF120300 .word 201471 + 755 .cfi_endproc + 756 .LFE131: + 758 .section .text.HAL_RCCEx_GetPeriphCLKFreq,"ax",%progbits + 759 .align 1 + 760 .global HAL_RCCEx_GetPeriphCLKFreq + 761 .syntax unified + 762 .thumb + 763 .thumb_func + 765 HAL_RCCEx_GetPeriphCLKFreq: + 766 .LVL46: + 767 .LFB132: + 947:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* frequency == 0 : means that no available frequency for the peripheral */ + 768 .loc 1 947 1 is_stmt 1 view -0 + 769 .cfi_startproc + 770 @ args = 0, pretend = 0, frame = 32 + 771 @ frame_needed = 0, uses_anonymous_args = 0 + 947:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* frequency == 0 : means that no available frequency for the peripheral */ + ARM GAS /tmp/ccLRMPc2.s page 63 + + + 772 .loc 1 947 1 is_stmt 0 view .LVU241 + 773 0000 30B5 push {r4, r5, lr} + 774 .cfi_def_cfa_offset 12 + 775 .cfi_offset 4, -12 + 776 .cfi_offset 5, -8 + 777 .cfi_offset 14, -4 + 778 0002 89B0 sub sp, sp, #36 + 779 .cfi_def_cfa_offset 48 + 780 0004 0446 mov r4, r0 + 949:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 781 .loc 1 949 3 is_stmt 1 view .LVU242 + 782 .LVL47: + 951:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #if defined(RCC_CFGR2_ADC1PRES) || defined(RCC_CFGR2_ADCPRE12) || defined(RCC_CFGR2_ADCPRE34) + 783 .loc 1 951 3 view .LVU243 + 953:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* RCC_CFGR2_ADC1PRES || RCC_CFGR2_ADCPRE12 || RCC_CFGR2_ADCPRE34 */ + 784 .loc 1 953 3 view .LVU244 + 953:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* RCC_CFGR2_ADC1PRES || RCC_CFGR2_ADCPRE12 || RCC_CFGR2_ADCPRE34 */ + 785 .loc 1 953 12 is_stmt 0 view .LVU245 + 786 0006 EC46 mov ip, sp + 787 0008 9B4D ldr r5, .L131 + 788 000a 0FCD ldmia r5!, {r0, r1, r2, r3} + 789 .LVL48: + 953:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** #endif /* RCC_CFGR2_ADC1PRES || RCC_CFGR2_ADCPRE12 || RCC_CFGR2_ADCPRE34 */ + 790 .loc 1 953 12 view .LVU246 + 791 000c ACE80F00 stmia ip!, {r0, r1, r2, r3} + 792 0010 95E80F00 ldm r5, {r0, r1, r2, r3} + 793 0014 8CE80F00 stm ip, {r0, r1, r2, r3} + 960:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 794 .loc 1 960 3 is_stmt 1 view .LVU247 + 962:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 795 .loc 1 962 3 view .LVU248 + 796 0018 402C cmp r4, #64 + 797 001a 00F05B81 beq .L42 + 798 001e 2BD8 bhi .L43 + 799 0020 202C cmp r4, #32 + 800 0022 00F2A081 bhi .L80 + 801 0026 002C cmp r4, #0 + 802 0028 00F09F81 beq .L81 + 803 002c 013C subs r4, r4, #1 + 804 .LVL49: + 962:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 805 .loc 1 962 3 is_stmt 0 view .LVU249 + 806 002e 1F2C cmp r4, #31 + 807 0030 00F29D81 bhi .L82 + 808 0034 DFE814F0 tbh [pc, r4, lsl #1] + 809 .L46: + 810 0038 7200 .2byte (.L51-.L46)/2 + 811 003a 9500 .2byte (.L50-.L46)/2 + 812 003c 9B01 .2byte (.L82-.L46)/2 + 813 003e BE00 .2byte (.L49-.L46)/2 + 814 0040 9B01 .2byte (.L82-.L46)/2 + 815 0042 9B01 .2byte (.L82-.L46)/2 + 816 0044 9B01 .2byte (.L82-.L46)/2 + 817 0046 E700 .2byte (.L48-.L46)/2 + 818 0048 9B01 .2byte (.L82-.L46)/2 + 819 004a 9B01 .2byte (.L82-.L46)/2 + 820 004c 9B01 .2byte (.L82-.L46)/2 + ARM GAS /tmp/ccLRMPc2.s page 64 + + + 821 004e 9B01 .2byte (.L82-.L46)/2 + 822 0050 9B01 .2byte (.L82-.L46)/2 + 823 0052 9B01 .2byte (.L82-.L46)/2 + 824 0054 9B01 .2byte (.L82-.L46)/2 + 825 0056 0D01 .2byte (.L47-.L46)/2 + 826 0058 9B01 .2byte (.L82-.L46)/2 + 827 005a 9B01 .2byte (.L82-.L46)/2 + 828 005c 9B01 .2byte (.L82-.L46)/2 + 829 005e 9B01 .2byte (.L82-.L46)/2 + 830 0060 9B01 .2byte (.L82-.L46)/2 + 831 0062 9B01 .2byte (.L82-.L46)/2 + 832 0064 9B01 .2byte (.L82-.L46)/2 + 833 0066 9B01 .2byte (.L82-.L46)/2 + 834 0068 9B01 .2byte (.L82-.L46)/2 + 835 006a 9B01 .2byte (.L82-.L46)/2 + 836 006c 9B01 .2byte (.L82-.L46)/2 + 837 006e 9B01 .2byte (.L82-.L46)/2 + 838 0070 9B01 .2byte (.L82-.L46)/2 + 839 0072 9B01 .2byte (.L82-.L46)/2 + 840 0074 9B01 .2byte (.L82-.L46)/2 + 841 0076 3F01 .2byte (.L45-.L46)/2 + 842 .LVL50: + 843 .p2align 1 + 844 .L43: + 962:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 845 .loc 1 962 3 view .LVU250 + 846 0078 B4F5805F cmp r4, #4096 + 847 007c 00F06381 beq .L52 + 848 0080 13D9 bls .L104 + 849 0082 B4F5803F cmp r4, #65536 + 850 0086 22D0 beq .L56 + 851 0088 B4F5003F cmp r4, #131072 + 852 008c 1DD1 bne .L105 +1215:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 853 .loc 1 1215 7 is_stmt 1 view .LVU251 +1215:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 854 .loc 1 1215 11 is_stmt 0 view .LVU252 + 855 008e 7B4B ldr r3, .L131+4 + 856 0090 1868 ldr r0, [r3] +1215:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 857 .loc 1 1215 10 view .LVU253 + 858 0092 10F00070 ands r0, r0, #33554432 + 859 0096 00F06B81 beq .L41 +1218:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 860 .loc 1 1218 9 is_stmt 1 view .LVU254 +1218:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 861 .loc 1 1218 18 is_stmt 0 view .LVU255 + 862 009a 5B68 ldr r3, [r3, #4] + 863 .LVL51: +1221:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 864 .loc 1 1221 9 is_stmt 1 view .LVU256 +1221:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 865 .loc 1 1221 12 is_stmt 0 view .LVU257 + 866 009c 13F4800F tst r3, #4194304 + 867 00a0 00F02A81 beq .L77 +1223:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 868 .loc 1 1223 11 is_stmt 1 view .LVU258 + ARM GAS /tmp/ccLRMPc2.s page 65 + + +1223:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 869 .loc 1 1223 23 is_stmt 0 view .LVU259 + 870 00a4 FFF7FEFF bl RCC_GetPLLCLKFreq + 871 .LVL52: +1223:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 872 .loc 1 1223 23 view .LVU260 + 873 00a8 62E1 b .L41 + 874 .LVL53: + 875 .L104: + 962:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 876 .loc 1 962 3 view .LVU261 + 877 00aa 802C cmp r4, #128 + 878 00ac 00F02A81 beq .L54 + 879 00b0 B4F5007F cmp r4, #512 + 880 00b4 07D1 bne .L106 +1195:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 881 .loc 1 1195 7 is_stmt 1 view .LVU262 +1195:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 882 .loc 1 1195 16 is_stmt 0 view .LVU263 + 883 00b6 714B ldr r3, .L131+4 + 884 00b8 5B68 ldr r3, [r3, #4] + 885 .LVL54: +1198:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 886 .loc 1 1198 7 is_stmt 1 view .LVU264 +1198:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 887 .loc 1 1198 10 is_stmt 0 view .LVU265 + 888 00ba 13F4000F tst r3, #8388608 + 889 00be 00F01881 beq .L107 +1201:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 890 .loc 1 1201 19 view .LVU266 + 891 00c2 6F48 ldr r0, .L131+8 + 892 .LVL55: +1513:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 893 .loc 1 1513 3 is_stmt 1 view .LVU267 +1513:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 894 .loc 1 1513 9 is_stmt 0 view .LVU268 + 895 00c4 54E1 b .L41 + 896 .LVL56: + 897 .L106: + 962:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 898 .loc 1 962 3 view .LVU269 + 899 00c6 0020 movs r0, #0 + 900 00c8 52E1 b .L41 + 901 .L105: + 962:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 902 .loc 1 962 3 view .LVU270 + 903 00ca 0020 movs r0, #0 + 904 00cc 50E1 b .L41 + 905 .L56: + 967:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 906 .loc 1 967 7 is_stmt 1 view .LVU271 + 967:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 907 .loc 1 967 16 is_stmt 0 view .LVU272 + 908 00ce 6B4B ldr r3, .L131+4 + 909 00d0 1B6A ldr r3, [r3, #32] + 967:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 910 .loc 1 967 14 view .LVU273 + ARM GAS /tmp/ccLRMPc2.s page 66 + + + 911 00d2 03F44073 and r3, r3, #768 + 912 .LVL57: + 970:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 913 .loc 1 970 7 is_stmt 1 view .LVU274 + 970:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 914 .loc 1 970 10 is_stmt 0 view .LVU275 + 915 00d6 B3F5807F cmp r3, #256 + 916 00da 07D0 beq .L108 + 917 .L58: + 975:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 918 .loc 1 975 12 is_stmt 1 view .LVU276 + 975:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 919 .loc 1 975 15 is_stmt 0 view .LVU277 + 920 00dc B3F5007F cmp r3, #512 + 921 00e0 0CD0 beq .L109 + 922 .L59: + 980:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 923 .loc 1 980 12 is_stmt 1 view .LVU278 + 980:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 924 .loc 1 980 15 is_stmt 0 view .LVU279 + 925 00e2 B3F5407F cmp r3, #768 + 926 00e6 11D0 beq .L110 + 949:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 927 .loc 1 949 12 view .LVU280 + 928 00e8 0020 movs r0, #0 + 929 00ea 41E1 b .L41 + 930 .L108: + 970:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 931 .loc 1 970 48 discriminator 1 view .LVU281 + 932 00ec 634A ldr r2, .L131+4 + 933 00ee 126A ldr r2, [r2, #32] + 970:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 934 .loc 1 970 44 discriminator 1 view .LVU282 + 935 00f0 12F0020F tst r2, #2 + 936 00f4 F2D0 beq .L58 + 972:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 937 .loc 1 972 19 view .LVU283 + 938 00f6 4FF40040 mov r0, #32768 + 939 00fa 39E1 b .L41 + 940 .L109: + 975:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 941 .loc 1 975 53 discriminator 1 view .LVU284 + 942 00fc 5F4A ldr r2, .L131+4 + 943 00fe 526A ldr r2, [r2, #36] + 975:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 944 .loc 1 975 49 discriminator 1 view .LVU285 + 945 0100 12F0020F tst r2, #2 + 946 0104 EDD0 beq .L59 + 977:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 947 .loc 1 977 19 view .LVU286 + 948 0106 49F64040 movw r0, #40000 + 949 010a 31E1 b .L41 + 950 .L110: + 980:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 951 .loc 1 980 59 discriminator 1 view .LVU287 + 952 010c 5B4B ldr r3, .L131+4 + 953 .LVL58: + ARM GAS /tmp/ccLRMPc2.s page 67 + + + 980:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 954 .loc 1 980 59 discriminator 1 view .LVU288 + 955 010e 1868 ldr r0, [r3] + 980:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 956 .loc 1 980 55 discriminator 1 view .LVU289 + 957 0110 10F40030 ands r0, r0, #131072 + 958 0114 00F02C81 beq .L41 + 982:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 959 .loc 1 982 19 view .LVU290 + 960 0118 5A48 ldr r0, .L131+12 + 961 011a 29E1 b .L41 + 962 .LVL59: + 963 .L51: + 989:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 964 .loc 1 989 7 is_stmt 1 view .LVU291 + 989:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 965 .loc 1 989 16 is_stmt 0 view .LVU292 + 966 011c 574B ldr r3, .L131+4 + 967 011e 1B6B ldr r3, [r3, #48] + 968 .LVL60: + 993:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 969 .loc 1 993 7 is_stmt 1 view .LVU293 + 993:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 970 .loc 1 993 10 is_stmt 0 view .LVU294 + 971 0120 13F00303 ands r3, r3, #3 + 972 .LVL61: + 993:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 973 .loc 1 993 10 view .LVU295 + 974 0124 07D0 beq .L111 +1004:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 975 .loc 1 1004 12 is_stmt 1 view .LVU296 +1004:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 976 .loc 1 1004 15 is_stmt 0 view .LVU297 + 977 0126 032B cmp r3, #3 + 978 0128 08D0 beq .L112 + 979 .L61: +1009:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 980 .loc 1 1009 12 is_stmt 1 view .LVU298 +1009:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 981 .loc 1 1009 15 is_stmt 0 view .LVU299 + 982 012a 012B cmp r3, #1 + 983 012c 0DD0 beq .L113 +1014:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 984 .loc 1 1014 12 is_stmt 1 view .LVU300 +1014:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 985 .loc 1 1014 15 is_stmt 0 view .LVU301 + 986 012e 022B cmp r3, #2 + 987 0130 0ED0 beq .L114 + 949:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 988 .loc 1 949 12 view .LVU302 + 989 0132 0020 movs r0, #0 + 990 0134 1CE1 b .L41 + 991 .L111: + 995:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 992 .loc 1 995 9 is_stmt 1 view .LVU303 + 995:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 993 .loc 1 995 21 is_stmt 0 view .LVU304 + ARM GAS /tmp/ccLRMPc2.s page 68 + + + 994 0136 FFF7FEFF bl HAL_RCC_GetPCLK2Freq + 995 .LVL62: + 995:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 996 .loc 1 995 21 view .LVU305 + 997 013a 19E1 b .L41 + 998 .LVL63: + 999 .L112: +1004:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1000 .loc 1 1004 56 discriminator 1 view .LVU306 + 1001 013c 4F4A ldr r2, .L131+4 + 1002 013e 1268 ldr r2, [r2] +1004:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1003 .loc 1 1004 52 discriminator 1 view .LVU307 + 1004 0140 12F0020F tst r2, #2 + 1005 0144 F1D0 beq .L61 +1006:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1006 .loc 1 1006 19 view .LVU308 + 1007 0146 5048 ldr r0, .L131+16 + 1008 0148 12E1 b .L41 + 1009 .L113: +1011:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1010 .loc 1 1011 9 is_stmt 1 view .LVU309 +1011:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1011 .loc 1 1011 21 is_stmt 0 view .LVU310 + 1012 014a FFF7FEFF bl HAL_RCC_GetSysClockFreq + 1013 .LVL64: +1011:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1014 .loc 1 1011 21 view .LVU311 + 1015 014e 0FE1 b .L41 + 1016 .LVL65: + 1017 .L114: +1014:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1018 .loc 1 1014 56 discriminator 1 view .LVU312 + 1019 0150 4A4B ldr r3, .L131+4 + 1020 .LVL66: +1014:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1021 .loc 1 1014 56 discriminator 1 view .LVU313 + 1022 0152 186A ldr r0, [r3, #32] +1014:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1023 .loc 1 1014 52 discriminator 1 view .LVU314 + 1024 0154 10F00200 ands r0, r0, #2 + 1025 0158 00F00A81 beq .L41 +1016:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1026 .loc 1 1016 19 view .LVU315 + 1027 015c 4FF40040 mov r0, #32768 + 1028 0160 06E1 b .L41 + 1029 .LVL67: + 1030 .L50: +1024:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 1031 .loc 1 1024 7 is_stmt 1 view .LVU316 +1024:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 1032 .loc 1 1024 16 is_stmt 0 view .LVU317 + 1033 0162 464B ldr r3, .L131+4 + 1034 0164 1B6B ldr r3, [r3, #48] + 1035 .LVL68: +1027:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1036 .loc 1 1027 7 is_stmt 1 view .LVU318 + ARM GAS /tmp/ccLRMPc2.s page 69 + + +1027:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1037 .loc 1 1027 10 is_stmt 0 view .LVU319 + 1038 0166 13F44033 ands r3, r3, #196608 + 1039 .LVL69: +1027:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1040 .loc 1 1027 10 view .LVU320 + 1041 016a 0AD0 beq .L115 +1032:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1042 .loc 1 1032 12 is_stmt 1 view .LVU321 +1032:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1043 .loc 1 1032 15 is_stmt 0 view .LVU322 + 1044 016c B3F5403F cmp r3, #196608 + 1045 0170 0AD0 beq .L116 + 1046 .L64: +1037:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1047 .loc 1 1037 12 is_stmt 1 view .LVU323 +1037:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1048 .loc 1 1037 15 is_stmt 0 view .LVU324 + 1049 0172 B3F5803F cmp r3, #65536 + 1050 0176 0ED0 beq .L117 +1042:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1051 .loc 1 1042 12 is_stmt 1 view .LVU325 +1042:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1052 .loc 1 1042 15 is_stmt 0 view .LVU326 + 1053 0178 B3F5003F cmp r3, #131072 + 1054 017c 0ED0 beq .L118 + 949:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 1055 .loc 1 949 12 view .LVU327 + 1056 017e 0020 movs r0, #0 + 1057 0180 F6E0 b .L41 + 1058 .L115: +1029:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1059 .loc 1 1029 9 is_stmt 1 view .LVU328 +1029:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1060 .loc 1 1029 21 is_stmt 0 view .LVU329 + 1061 0182 FFF7FEFF bl HAL_RCC_GetPCLK1Freq + 1062 .LVL70: +1029:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1063 .loc 1 1029 21 view .LVU330 + 1064 0186 F3E0 b .L41 + 1065 .LVL71: + 1066 .L116: +1032:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1067 .loc 1 1032 56 discriminator 1 view .LVU331 + 1068 0188 3C4A ldr r2, .L131+4 + 1069 018a 1268 ldr r2, [r2] +1032:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1070 .loc 1 1032 52 discriminator 1 view .LVU332 + 1071 018c 12F0020F tst r2, #2 + 1072 0190 EFD0 beq .L64 +1034:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1073 .loc 1 1034 19 view .LVU333 + 1074 0192 3D48 ldr r0, .L131+16 + 1075 0194 ECE0 b .L41 + 1076 .L117: +1039:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1077 .loc 1 1039 9 is_stmt 1 view .LVU334 + ARM GAS /tmp/ccLRMPc2.s page 70 + + +1039:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1078 .loc 1 1039 21 is_stmt 0 view .LVU335 + 1079 0196 FFF7FEFF bl HAL_RCC_GetSysClockFreq + 1080 .LVL72: +1039:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1081 .loc 1 1039 21 view .LVU336 + 1082 019a E9E0 b .L41 + 1083 .LVL73: + 1084 .L118: +1042:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1085 .loc 1 1042 56 discriminator 1 view .LVU337 + 1086 019c 03F18043 add r3, r3, #1073741824 + 1087 .LVL74: +1042:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1088 .loc 1 1042 56 discriminator 1 view .LVU338 + 1089 01a0 03F58053 add r3, r3, #4096 + 1090 .LVL75: +1042:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1091 .loc 1 1042 56 discriminator 1 view .LVU339 + 1092 01a4 186A ldr r0, [r3, #32] +1042:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1093 .loc 1 1042 52 discriminator 1 view .LVU340 + 1094 01a6 10F00200 ands r0, r0, #2 + 1095 01aa 00F0E180 beq .L41 +1044:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1096 .loc 1 1044 19 view .LVU341 + 1097 01ae 4FF40040 mov r0, #32768 + 1098 01b2 DDE0 b .L41 + 1099 .LVL76: + 1100 .L49: +1053:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 1101 .loc 1 1053 7 is_stmt 1 view .LVU342 +1053:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 1102 .loc 1 1053 16 is_stmt 0 view .LVU343 + 1103 01b4 314B ldr r3, .L131+4 + 1104 01b6 1B6B ldr r3, [r3, #48] + 1105 .LVL77: +1056:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1106 .loc 1 1056 7 is_stmt 1 view .LVU344 +1056:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1107 .loc 1 1056 10 is_stmt 0 view .LVU345 + 1108 01b8 13F44023 ands r3, r3, #786432 + 1109 .LVL78: +1056:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1110 .loc 1 1056 10 view .LVU346 + 1111 01bc 0AD0 beq .L119 +1061:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1112 .loc 1 1061 12 is_stmt 1 view .LVU347 +1061:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1113 .loc 1 1061 15 is_stmt 0 view .LVU348 + 1114 01be B3F5402F cmp r3, #786432 + 1115 01c2 0AD0 beq .L120 + 1116 .L67: +1066:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1117 .loc 1 1066 12 is_stmt 1 view .LVU349 +1066:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1118 .loc 1 1066 15 is_stmt 0 view .LVU350 + ARM GAS /tmp/ccLRMPc2.s page 71 + + + 1119 01c4 B3F5802F cmp r3, #262144 + 1120 01c8 0ED0 beq .L121 +1071:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1121 .loc 1 1071 12 is_stmt 1 view .LVU351 +1071:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1122 .loc 1 1071 15 is_stmt 0 view .LVU352 + 1123 01ca B3F5002F cmp r3, #524288 + 1124 01ce 0ED0 beq .L122 + 949:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 1125 .loc 1 949 12 view .LVU353 + 1126 01d0 0020 movs r0, #0 + 1127 01d2 CDE0 b .L41 + 1128 .L119: +1058:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1129 .loc 1 1058 9 is_stmt 1 view .LVU354 +1058:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1130 .loc 1 1058 21 is_stmt 0 view .LVU355 + 1131 01d4 FFF7FEFF bl HAL_RCC_GetPCLK1Freq + 1132 .LVL79: +1058:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1133 .loc 1 1058 21 view .LVU356 + 1134 01d8 CAE0 b .L41 + 1135 .LVL80: + 1136 .L120: +1061:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1137 .loc 1 1061 56 discriminator 1 view .LVU357 + 1138 01da 284A ldr r2, .L131+4 + 1139 01dc 1268 ldr r2, [r2] +1061:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1140 .loc 1 1061 52 discriminator 1 view .LVU358 + 1141 01de 12F0020F tst r2, #2 + 1142 01e2 EFD0 beq .L67 +1063:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1143 .loc 1 1063 19 view .LVU359 + 1144 01e4 2848 ldr r0, .L131+16 + 1145 01e6 C3E0 b .L41 + 1146 .L121: +1068:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1147 .loc 1 1068 9 is_stmt 1 view .LVU360 +1068:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1148 .loc 1 1068 21 is_stmt 0 view .LVU361 + 1149 01e8 FFF7FEFF bl HAL_RCC_GetSysClockFreq + 1150 .LVL81: +1068:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1151 .loc 1 1068 21 view .LVU362 + 1152 01ec C0E0 b .L41 + 1153 .LVL82: + 1154 .L122: +1071:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1155 .loc 1 1071 56 discriminator 1 view .LVU363 + 1156 01ee 03F18043 add r3, r3, #1073741824 + 1157 .LVL83: +1071:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1158 .loc 1 1071 56 discriminator 1 view .LVU364 + 1159 01f2 A3F5BE23 sub r3, r3, #389120 + 1160 .LVL84: +1071:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + ARM GAS /tmp/ccLRMPc2.s page 72 + + + 1161 .loc 1 1071 56 discriminator 1 view .LVU365 + 1162 01f6 186A ldr r0, [r3, #32] +1071:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1163 .loc 1 1071 52 discriminator 1 view .LVU366 + 1164 01f8 10F00200 ands r0, r0, #2 + 1165 01fc 00F0B880 beq .L41 +1073:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1166 .loc 1 1073 19 view .LVU367 + 1167 0200 4FF40040 mov r0, #32768 + 1168 0204 B4E0 b .L41 + 1169 .LVL85: + 1170 .L48: +1082:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 1171 .loc 1 1082 7 is_stmt 1 view .LVU368 +1082:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 1172 .loc 1 1082 16 is_stmt 0 view .LVU369 + 1173 0206 1D4B ldr r3, .L131+4 + 1174 0208 1B6B ldr r3, [r3, #48] + 1175 .LVL86: +1085:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1176 .loc 1 1085 7 is_stmt 1 view .LVU370 +1085:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1177 .loc 1 1085 10 is_stmt 0 view .LVU371 + 1178 020a 13F44013 ands r3, r3, #3145728 + 1179 .LVL87: +1085:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1180 .loc 1 1085 10 view .LVU372 + 1181 020e 0AD0 beq .L123 +1090:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1182 .loc 1 1090 12 is_stmt 1 view .LVU373 +1090:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1183 .loc 1 1090 15 is_stmt 0 view .LVU374 + 1184 0210 B3F5401F cmp r3, #3145728 + 1185 0214 0AD0 beq .L124 + 1186 .L70: +1095:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1187 .loc 1 1095 12 is_stmt 1 view .LVU375 +1095:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1188 .loc 1 1095 15 is_stmt 0 view .LVU376 + 1189 0216 B3F5801F cmp r3, #1048576 + 1190 021a 0ED0 beq .L125 +1100:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1191 .loc 1 1100 12 is_stmt 1 view .LVU377 +1100:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1192 .loc 1 1100 15 is_stmt 0 view .LVU378 + 1193 021c B3F5001F cmp r3, #2097152 + 1194 0220 0ED0 beq .L126 + 949:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 1195 .loc 1 949 12 view .LVU379 + 1196 0222 0020 movs r0, #0 + 1197 0224 A4E0 b .L41 + 1198 .L123: +1087:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1199 .loc 1 1087 9 is_stmt 1 view .LVU380 +1087:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1200 .loc 1 1087 21 is_stmt 0 view .LVU381 + 1201 0226 FFF7FEFF bl HAL_RCC_GetPCLK1Freq + ARM GAS /tmp/ccLRMPc2.s page 73 + + + 1202 .LVL88: +1087:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1203 .loc 1 1087 21 view .LVU382 + 1204 022a A1E0 b .L41 + 1205 .LVL89: + 1206 .L124: +1090:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1207 .loc 1 1090 55 discriminator 1 view .LVU383 + 1208 022c 134A ldr r2, .L131+4 + 1209 022e 1268 ldr r2, [r2] +1090:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1210 .loc 1 1090 51 discriminator 1 view .LVU384 + 1211 0230 12F0020F tst r2, #2 + 1212 0234 EFD0 beq .L70 +1092:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1213 .loc 1 1092 19 view .LVU385 + 1214 0236 1448 ldr r0, .L131+16 + 1215 0238 9AE0 b .L41 + 1216 .L125: +1097:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1217 .loc 1 1097 9 is_stmt 1 view .LVU386 +1097:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1218 .loc 1 1097 21 is_stmt 0 view .LVU387 + 1219 023a FFF7FEFF bl HAL_RCC_GetSysClockFreq + 1220 .LVL90: +1097:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1221 .loc 1 1097 21 view .LVU388 + 1222 023e 97E0 b .L41 + 1223 .LVL91: + 1224 .L126: +1100:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1225 .loc 1 1100 55 discriminator 1 view .LVU389 + 1226 0240 0E4B ldr r3, .L131+4 + 1227 .LVL92: +1100:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1228 .loc 1 1100 55 discriminator 1 view .LVU390 + 1229 0242 186A ldr r0, [r3, #32] +1100:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1230 .loc 1 1100 51 discriminator 1 view .LVU391 + 1231 0244 10F00200 ands r0, r0, #2 + 1232 0248 00F09280 beq .L41 +1102:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1233 .loc 1 1102 19 view .LVU392 + 1234 024c 4FF40040 mov r0, #32768 + 1235 0250 8EE0 b .L41 + 1236 .LVL93: + 1237 .L47: +1111:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 1238 .loc 1 1111 7 is_stmt 1 view .LVU393 +1111:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 1239 .loc 1 1111 16 is_stmt 0 view .LVU394 + 1240 0252 0A4B ldr r3, .L131+4 + 1241 0254 1B6B ldr r3, [r3, #48] + 1242 .LVL94: +1114:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1243 .loc 1 1114 7 is_stmt 1 view .LVU395 +1114:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + ARM GAS /tmp/ccLRMPc2.s page 74 + + + 1244 .loc 1 1114 10 is_stmt 0 view .LVU396 + 1245 0256 13F44003 ands r3, r3, #12582912 + 1246 .LVL95: +1114:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1247 .loc 1 1114 10 view .LVU397 + 1248 025a 0AD0 beq .L127 +1119:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1249 .loc 1 1119 12 is_stmt 1 view .LVU398 +1119:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1250 .loc 1 1119 15 is_stmt 0 view .LVU399 + 1251 025c B3F5400F cmp r3, #12582912 + 1252 0260 14D0 beq .L128 + 1253 .L73: +1124:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1254 .loc 1 1124 12 is_stmt 1 view .LVU400 +1124:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1255 .loc 1 1124 15 is_stmt 0 view .LVU401 + 1256 0262 B3F5800F cmp r3, #4194304 + 1257 0266 18D0 beq .L129 +1129:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1258 .loc 1 1129 12 is_stmt 1 view .LVU402 +1129:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1259 .loc 1 1129 15 is_stmt 0 view .LVU403 + 1260 0268 B3F5000F cmp r3, #8388608 + 1261 026c 18D0 beq .L130 + 949:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 1262 .loc 1 949 12 view .LVU404 + 1263 026e 0020 movs r0, #0 + 1264 0270 7EE0 b .L41 + 1265 .L127: +1116:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1266 .loc 1 1116 9 is_stmt 1 view .LVU405 +1116:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1267 .loc 1 1116 21 is_stmt 0 view .LVU406 + 1268 0272 FFF7FEFF bl HAL_RCC_GetPCLK1Freq + 1269 .LVL96: +1116:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1270 .loc 1 1116 21 view .LVU407 + 1271 0276 7BE0 b .L41 + 1272 .L132: + 1273 .align 2 + 1274 .L131: + 1275 0278 00000000 .word .LANCHOR0 + 1276 027c 00100240 .word 1073876992 + 1277 0280 ADDEADDE .word -559030611 + 1278 0284 20A10700 .word 500000 + 1279 0288 00127A00 .word 8000000 + 1280 .LVL97: + 1281 .L128: +1119:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1282 .loc 1 1119 55 discriminator 1 view .LVU408 + 1283 028c 394A ldr r2, .L133 + 1284 028e 1268 ldr r2, [r2] +1119:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1285 .loc 1 1119 51 discriminator 1 view .LVU409 + 1286 0290 12F0020F tst r2, #2 + 1287 0294 E5D0 beq .L73 + ARM GAS /tmp/ccLRMPc2.s page 75 + + +1121:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1288 .loc 1 1121 19 view .LVU410 + 1289 0296 3848 ldr r0, .L133+4 + 1290 0298 6AE0 b .L41 + 1291 .L129: +1126:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1292 .loc 1 1126 9 is_stmt 1 view .LVU411 +1126:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1293 .loc 1 1126 21 is_stmt 0 view .LVU412 + 1294 029a FFF7FEFF bl HAL_RCC_GetSysClockFreq + 1295 .LVL98: +1126:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1296 .loc 1 1126 21 view .LVU413 + 1297 029e 67E0 b .L41 + 1298 .LVL99: + 1299 .L130: +1129:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1300 .loc 1 1129 55 discriminator 1 view .LVU414 + 1301 02a0 03F17E53 add r3, r3, #1065353216 + 1302 .LVL100: +1129:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1303 .loc 1 1129 55 discriminator 1 view .LVU415 + 1304 02a4 03F50433 add r3, r3, #135168 + 1305 .LVL101: +1129:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1306 .loc 1 1129 55 discriminator 1 view .LVU416 + 1307 02a8 186A ldr r0, [r3, #32] +1129:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1308 .loc 1 1129 51 discriminator 1 view .LVU417 + 1309 02aa 10F00200 ands r0, r0, #2 + 1310 02ae 5FD0 beq .L41 +1131:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1311 .loc 1 1131 19 view .LVU418 + 1312 02b0 4FF40040 mov r0, #32768 + 1313 02b4 5CE0 b .L41 + 1314 .LVL102: + 1315 .L45: +1139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 1316 .loc 1 1139 7 is_stmt 1 view .LVU419 +1139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 1317 .loc 1 1139 16 is_stmt 0 view .LVU420 + 1318 02b6 2F4B ldr r3, .L133 + 1319 02b8 1B6B ldr r3, [r3, #48] + 1320 .LVL103: +1142:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1321 .loc 1 1142 7 is_stmt 1 view .LVU421 +1142:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1322 .loc 1 1142 10 is_stmt 0 view .LVU422 + 1323 02ba 13F0100F tst r3, #16 + 1324 02be 06D1 bne .L75 +1142:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1325 .loc 1 1142 49 discriminator 1 view .LVU423 + 1326 02c0 2C4B ldr r3, .L133 + 1327 .LVL104: +1142:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1328 .loc 1 1142 49 discriminator 1 view .LVU424 + 1329 02c2 1868 ldr r0, [r3] + ARM GAS /tmp/ccLRMPc2.s page 76 + + +1142:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1330 .loc 1 1142 45 discriminator 1 view .LVU425 + 1331 02c4 10F00200 ands r0, r0, #2 + 1332 02c8 52D0 beq .L41 +1144:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1333 .loc 1 1144 19 view .LVU426 + 1334 02ca 2B48 ldr r0, .L133+4 + 1335 02cc 50E0 b .L41 + 1336 .LVL105: + 1337 .L75: +1149:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1338 .loc 1 1149 9 is_stmt 1 view .LVU427 +1149:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1339 .loc 1 1149 21 is_stmt 0 view .LVU428 + 1340 02ce FFF7FEFF bl HAL_RCC_GetSysClockFreq + 1341 .LVL106: +1149:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1342 .loc 1 1149 21 view .LVU429 + 1343 02d2 4DE0 b .L41 + 1344 .LVL107: + 1345 .L42: +1157:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 1346 .loc 1 1157 7 is_stmt 1 view .LVU430 +1157:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 1347 .loc 1 1157 16 is_stmt 0 view .LVU431 + 1348 02d4 274B ldr r3, .L133 + 1349 02d6 1B6B ldr r3, [r3, #48] + 1350 .LVL108: +1160:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1351 .loc 1 1160 7 is_stmt 1 view .LVU432 +1160:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1352 .loc 1 1160 10 is_stmt 0 view .LVU433 + 1353 02d8 13F0200F tst r3, #32 + 1354 02dc 06D1 bne .L76 +1160:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1355 .loc 1 1160 49 discriminator 1 view .LVU434 + 1356 02de 254B ldr r3, .L133 + 1357 .LVL109: +1160:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1358 .loc 1 1160 49 discriminator 1 view .LVU435 + 1359 02e0 1868 ldr r0, [r3] +1160:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1360 .loc 1 1160 45 discriminator 1 view .LVU436 + 1361 02e2 10F00200 ands r0, r0, #2 + 1362 02e6 43D0 beq .L41 +1162:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1363 .loc 1 1162 19 view .LVU437 + 1364 02e8 2348 ldr r0, .L133+4 + 1365 02ea 41E0 b .L41 + 1366 .LVL110: + 1367 .L76: +1167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1368 .loc 1 1167 9 is_stmt 1 view .LVU438 +1167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1369 .loc 1 1167 21 is_stmt 0 view .LVU439 + 1370 02ec FFF7FEFF bl HAL_RCC_GetSysClockFreq + 1371 .LVL111: + ARM GAS /tmp/ccLRMPc2.s page 77 + + +1167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1372 .loc 1 1167 21 view .LVU440 + 1373 02f0 3EE0 b .L41 + 1374 .LVL112: + 1375 .L107: +1204:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1376 .loc 1 1204 12 is_stmt 1 view .LVU441 +1206:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1377 .loc 1 1206 9 view .LVU442 +1206:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1378 .loc 1 1206 21 is_stmt 0 view .LVU443 + 1379 02f2 FFF7FEFF bl HAL_RCC_GetSysClockFreq + 1380 .LVL113: +1206:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1381 .loc 1 1206 21 view .LVU444 + 1382 02f6 3BE0 b .L41 + 1383 .LVL114: + 1384 .L77: +1228:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1385 .loc 1 1228 11 is_stmt 1 view .LVU445 +1228:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1386 .loc 1 1228 24 is_stmt 0 view .LVU446 + 1387 02f8 FFF7FEFF bl RCC_GetPLLCLKFreq + 1388 .LVL115: +1228:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1389 .loc 1 1228 44 view .LVU447 + 1390 02fc 00EB4000 add r0, r0, r0, lsl #1 +1228:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1391 .loc 1 1228 21 view .LVU448 + 1392 0300 4008 lsrs r0, r0, #1 + 1393 .LVL116: +1228:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1394 .loc 1 1228 21 view .LVU449 + 1395 0302 35E0 b .L41 + 1396 .LVL117: + 1397 .L54: +1266:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if ADC12 clock selection is AHB */ + 1398 .loc 1 1266 7 is_stmt 1 view .LVU450 +1266:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** /* Check if ADC12 clock selection is AHB */ + 1399 .loc 1 1266 16 is_stmt 0 view .LVU451 + 1400 0304 1B4B ldr r3, .L133 + 1401 0306 DC6A ldr r4, [r3, #44] + 1402 .LVL118: +1268:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1403 .loc 1 1268 7 is_stmt 1 view .LVU452 +1268:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1404 .loc 1 1268 10 is_stmt 0 view .LVU453 + 1405 0308 14F4F874 ands r4, r4, #496 + 1406 .LVL119: +1268:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1407 .loc 1 1268 10 view .LVU454 + 1408 030c 02D1 bne .L78 +1270:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1409 .loc 1 1270 11 is_stmt 1 view .LVU455 +1270:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1410 .loc 1 1270 21 is_stmt 0 view .LVU456 + 1411 030e 1B4B ldr r3, .L133+8 + ARM GAS /tmp/ccLRMPc2.s page 78 + + + 1412 0310 1868 ldr r0, [r3] + 1413 .LVL120: +1270:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1414 .loc 1 1270 21 view .LVU457 + 1415 0312 2DE0 b .L41 + 1416 .LVL121: + 1417 .L78: +1276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1418 .loc 1 1276 9 is_stmt 1 view .LVU458 +1276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1419 .loc 1 1276 13 is_stmt 0 view .LVU459 + 1420 0314 174B ldr r3, .L133 + 1421 0316 1868 ldr r0, [r3] +1276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1422 .loc 1 1276 12 view .LVU460 + 1423 0318 10F00070 ands r0, r0, #33554432 + 1424 031c 28D0 beq .L41 +1279:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1425 .loc 1 1279 11 is_stmt 1 view .LVU461 +1279:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1426 .loc 1 1279 23 is_stmt 0 view .LVU462 + 1427 031e FFF7FEFF bl RCC_GetPLLCLKFreq + 1428 .LVL122: + 1429 .LBB30: + 1430 .LBI30: + 981:Drivers/CMSIS/Include/cmsis_gcc.h **** { + 1431 .loc 2 981 31 is_stmt 1 view .LVU463 + 1432 .LBB31: + 983:Drivers/CMSIS/Include/cmsis_gcc.h **** + 1433 .loc 2 983 3 view .LVU464 + 988:Drivers/CMSIS/Include/cmsis_gcc.h **** #else + 1434 .loc 2 988 4 view .LVU465 + 1435 0322 4FF4F873 mov r3, #496 + 1436 .syntax unified + 1437 @ 988 "Drivers/CMSIS/Include/cmsis_gcc.h" 1 + 1438 0326 93FAA3F3 rbit r3, r3 + 1439 @ 0 "" 2 + 1440 .LVL123: + 1441 .loc 2 1001 3 view .LVU466 + 1442 .loc 2 1001 3 is_stmt 0 view .LVU467 + 1443 .thumb + 1444 .syntax unified + 1445 .LBE31: + 1446 .LBE30: +1279:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1447 .loc 1 1279 74 view .LVU468 + 1448 032a B3FA83F3 clz r3, r3 + 1449 032e 24FA03F3 lsr r3, r4, r3 +1279:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1450 .loc 1 1279 111 view .LVU469 + 1451 0332 03F00F03 and r3, r3, #15 +1279:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1452 .loc 1 1279 65 view .LVU470 + 1453 0336 08AA add r2, sp, #32 + 1454 0338 02EB4303 add r3, r2, r3, lsl #1 + 1455 033c 33F8203C ldrh r3, [r3, #-32] +1279:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + ARM GAS /tmp/ccLRMPc2.s page 79 + + + 1456 .loc 1 1279 21 view .LVU471 + 1457 0340 B0FBF3F0 udiv r0, r0, r3 + 1458 .LVL124: +1279:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1459 .loc 1 1279 21 view .LVU472 + 1460 0344 14E0 b .L41 + 1461 .LVL125: + 1462 .L52: +1312:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 1463 .loc 1 1312 7 is_stmt 1 view .LVU473 +1312:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 1464 .loc 1 1312 16 is_stmt 0 view .LVU474 + 1465 0346 0B4B ldr r3, .L133 + 1466 0348 1B6B ldr r3, [r3, #48] + 1467 .LVL126: +1315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1468 .loc 1 1315 7 is_stmt 1 view .LVU475 +1315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1469 .loc 1 1315 10 is_stmt 0 view .LVU476 + 1470 034a 13F4807F tst r3, #256 + 1471 034e 07D0 beq .L79 +1315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1472 .loc 1 1315 46 discriminator 1 view .LVU477 + 1473 0350 084B ldr r3, .L133 + 1474 .LVL127: +1315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1475 .loc 1 1315 46 discriminator 1 view .LVU478 + 1476 0352 1868 ldr r0, [r3] +1315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1477 .loc 1 1315 42 discriminator 1 view .LVU479 + 1478 0354 10F00070 ands r0, r0, #33554432 + 1479 0358 0AD0 beq .L41 +1317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1480 .loc 1 1317 9 is_stmt 1 view .LVU480 +1317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1481 .loc 1 1317 21 is_stmt 0 view .LVU481 + 1482 035a FFF7FEFF bl RCC_GetPLLCLKFreq + 1483 .LVL128: +1317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1484 .loc 1 1317 19 view .LVU482 + 1485 035e 07E0 b .L41 + 1486 .LVL129: + 1487 .L79: +1322:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1488 .loc 1 1322 9 is_stmt 1 view .LVU483 +1322:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1489 .loc 1 1322 19 is_stmt 0 view .LVU484 + 1490 0360 064B ldr r3, .L133+8 + 1491 .LVL130: +1322:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1492 .loc 1 1322 19 view .LVU485 + 1493 0362 1868 ldr r0, [r3] + 1494 .LVL131: +1322:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** } + 1495 .loc 1 1322 19 view .LVU486 + 1496 0364 04E0 b .L41 + 1497 .LVL132: + ARM GAS /tmp/ccLRMPc2.s page 80 + + + 1498 .L80: + 962:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1499 .loc 1 962 3 view .LVU487 + 1500 0366 0020 movs r0, #0 + 1501 0368 02E0 b .L41 + 1502 .L81: + 1503 036a 0020 movs r0, #0 + 1504 036c 00E0 b .L41 + 1505 .LVL133: + 1506 .L82: + 962:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** { + 1507 .loc 1 962 3 view .LVU488 + 1508 036e 0020 movs r0, #0 + 1509 .LVL134: + 1510 .L41: +1514:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c **** + 1511 .loc 1 1514 1 view .LVU489 + 1512 0370 09B0 add sp, sp, #36 + 1513 .cfi_def_cfa_offset 12 + 1514 @ sp needed + 1515 0372 30BD pop {r4, r5, pc} + 1516 .L134: + 1517 .align 2 + 1518 .L133: + 1519 0374 00100240 .word 1073876992 + 1520 0378 00127A00 .word 8000000 + 1521 037c 00000000 .word SystemCoreClock + 1522 .cfi_endproc + 1523 .LFE132: + 1525 .section .rodata + 1526 .align 2 + 1527 .set .LANCHOR0,. + 0 + 1528 .LC0: + 1529 0000 0100 .short 1 + 1530 0002 0200 .short 2 + 1531 0004 0400 .short 4 + 1532 0006 0600 .short 6 + 1533 0008 0800 .short 8 + 1534 000a 0A00 .short 10 + 1535 000c 0C00 .short 12 + 1536 000e 1000 .short 16 + 1537 0010 2000 .short 32 + 1538 0012 4000 .short 64 + 1539 0014 8000 .short 128 + 1540 0016 0001 .short 256 + 1541 0018 0001 .short 256 + 1542 001a 0001 .short 256 + 1543 001c 0001 .short 256 + 1544 001e 0001 .short 256 + 1545 .text + 1546 .Letext0: + 1547 .file 3 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 1548 .file 4 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 1549 .file 5 "Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h" + 1550 .file 6 "Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h" + 1551 .file 7 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h" + 1552 .file 8 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h" + ARM GAS /tmp/ccLRMPc2.s page 81 + + + 1553 .file 9 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h" + 1554 .file 10 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h" + 1555 .file 11 "Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h" + ARM GAS /tmp/ccLRMPc2.s page 82 + + +DEFINED SYMBOLS + *ABS*:0000000000000000 stm32f3xx_hal_rcc_ex.c + /tmp/ccLRMPc2.s:21 .text.RCC_GetPLLCLKFreq:0000000000000000 $t + /tmp/ccLRMPc2.s:26 .text.RCC_GetPLLCLKFreq:0000000000000000 RCC_GetPLLCLKFreq + /tmp/ccLRMPc2.s:91 .text.RCC_GetPLLCLKFreq:0000000000000030 $d + /tmp/ccLRMPc2.s:98 .text.HAL_RCCEx_PeriphCLKConfig:0000000000000000 $t + /tmp/ccLRMPc2.s:104 .text.HAL_RCCEx_PeriphCLKConfig:0000000000000000 HAL_RCCEx_PeriphCLKConfig + /tmp/ccLRMPc2.s:620 .text.HAL_RCCEx_PeriphCLKConfig:0000000000000228 $d + /tmp/ccLRMPc2.s:627 .text.HAL_RCCEx_GetPeriphCLKConfig:0000000000000000 $t + /tmp/ccLRMPc2.s:633 .text.HAL_RCCEx_GetPeriphCLKConfig:0000000000000000 HAL_RCCEx_GetPeriphCLKConfig + /tmp/ccLRMPc2.s:747 .text.HAL_RCCEx_GetPeriphCLKConfig:0000000000000080 $d + /tmp/ccLRMPc2.s:759 .text.HAL_RCCEx_GetPeriphCLKFreq:0000000000000000 $t + /tmp/ccLRMPc2.s:765 .text.HAL_RCCEx_GetPeriphCLKFreq:0000000000000000 HAL_RCCEx_GetPeriphCLKFreq + /tmp/ccLRMPc2.s:810 .text.HAL_RCCEx_GetPeriphCLKFreq:0000000000000038 $d + /tmp/ccLRMPc2.s:843 .text.HAL_RCCEx_GetPeriphCLKFreq:0000000000000078 $t + /tmp/ccLRMPc2.s:1275 .text.HAL_RCCEx_GetPeriphCLKFreq:0000000000000278 $d + /tmp/ccLRMPc2.s:1283 .text.HAL_RCCEx_GetPeriphCLKFreq:000000000000028c $t + /tmp/ccLRMPc2.s:1519 .text.HAL_RCCEx_GetPeriphCLKFreq:0000000000000374 $d + /tmp/ccLRMPc2.s:1526 .rodata:0000000000000000 $d + +UNDEFINED SYMBOLS +HAL_GetTick +HAL_RCC_GetPCLK2Freq +HAL_RCC_GetSysClockFreq +HAL_RCC_GetPCLK1Freq +SystemCoreClock diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_rcc_ex.o b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_rcc_ex.o new file mode 100644 index 0000000000000000000000000000000000000000..ffdd15007a662f9cd12d57450edb4fafe37b3f34 GIT binary patch literal 14460 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 O7eoK(v(heh^}hf)wd+Cv literal 0 HcmV?d00001 diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_spi.d b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_spi.d new file mode 100644 index 0000000..44e87cf --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_spi.d @@ -0,0 +1,58 @@ +build/stm32f3xx_hal_spi.o: \ + Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h \ + Core/Inc/stm32f3xx_hal_conf.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h \ + Drivers/CMSIS/Include/core_cm4.h Drivers/CMSIS/Include/cmsis_version.h \ + Drivers/CMSIS/Include/cmsis_compiler.h Drivers/CMSIS/Include/cmsis_gcc.h \ + Drivers/CMSIS/Include/mpu_armv7.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h: +Core/Inc/stm32f3xx_hal_conf.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h: +Drivers/CMSIS/Include/core_cm4.h: +Drivers/CMSIS/Include/cmsis_version.h: +Drivers/CMSIS/Include/cmsis_compiler.h: +Drivers/CMSIS/Include/cmsis_gcc.h: +Drivers/CMSIS/Include/mpu_armv7.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h: +Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h: diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_spi.lst b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_spi.lst new file mode 100644 index 0000000..129b0fe --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_spi.lst @@ -0,0 +1,15193 @@ +ARM GAS /tmp/ccywxtmH.s page 1 + + + 1 .cpu cortex-m4 + 2 .arch armv7e-m + 3 .fpu fpv4-sp-d16 + 4 .eabi_attribute 27, 1 + 5 .eabi_attribute 28, 1 + 6 .eabi_attribute 20, 1 + 7 .eabi_attribute 21, 1 + 8 .eabi_attribute 23, 3 + 9 .eabi_attribute 24, 1 + 10 .eabi_attribute 25, 1 + 11 .eabi_attribute 26, 1 + 12 .eabi_attribute 30, 1 + 13 .eabi_attribute 34, 1 + 14 .eabi_attribute 18, 4 + 15 .file "stm32f3xx_hal_spi.c" + 16 .text + 17 .Ltext0: + 18 .cfi_sections .debug_frame + 19 .file 1 "Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c" + 20 .section .text.SPI_WaitFlagStateUntilTimeout,"ax",%progbits + 21 .align 1 + 22 .syntax unified + 23 .thumb + 24 .thumb_func + 26 SPI_WaitFlagStateUntilTimeout: + 27 .LVL0: + 28 .LFB177: + 1:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** + 2:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** ****************************************************************************** + 3:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @file stm32f3xx_hal_spi.c + 4:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @author MCD Application Team + 5:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief SPI HAL module driver. + 6:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * This file provides firmware functions to manage the following + 7:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * functionalities of the Serial Peripheral Interface (SPI) peripheral: + 8:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * + Initialization and de-initialization functions + 9:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * + IO operation functions + 10:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * + Peripheral Control functions + 11:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * + Peripheral State functions + 12:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * + 13:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** @verbatim + 14:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** ============================================================================== + 15:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** ##### How to use this driver ##### + 16:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** ============================================================================== + 17:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** [..] + 18:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** The SPI HAL driver can be used as follows: + 19:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 20:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (#) Declare a SPI_HandleTypeDef handle structure, for example: + 21:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_HandleTypeDef hspi; + 22:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 23:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (#)Initialize the SPI low level resources by implementing the HAL_SPI_MspInit() API: + 24:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (##) Enable the SPIx interface clock + 25:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (##) SPI pins configuration + 26:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (+++) Enable the clock for the SPI GPIOs + 27:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (+++) Configure these SPI pins as alternate function push-pull + 28:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (##) NVIC configuration if you need to use interrupt process + 29:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (+++) Configure the SPIx interrupt priority + 30:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (+++) Enable the NVIC SPI IRQ handle + ARM GAS /tmp/ccywxtmH.s page 2 + + + 31:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (##) DMA Configuration if you need to use DMA process + 32:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (+++) Declare a DMA_HandleTypeDef handle structure for the transmit or receive Stream + 33:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (+++) Enable the DMAx clock + 34:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (+++) Configure the DMA handle parameters + 35:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (+++) Configure the DMA Tx or Rx Stream/Channel + 36:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (+++) Associate the initialized hdma_tx(or _rx) handle to the hspi DMA Tx or Rx hand + 37:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (+++) Configure the priority and enable the NVIC for the transfer complete interrupt + 38:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 39:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (#) Program the Mode, BidirectionalMode , Data size, Baudrate Prescaler, NSS + 40:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** management, Clock polarity and phase, FirstBit and CRC configuration in the hspi Init str + 41:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 42:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (#) Initialize the SPI registers by calling the HAL_SPI_Init() API: + 43:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (++) This API configures also the low level Hardware GPIO, CLOCK, CORTEX...etc) + 44:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** by calling the customized HAL_SPI_MspInit() API. + 45:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** [..] + 46:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** Circular mode restriction: + 47:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (#) The DMA circular mode cannot be used when the SPI is configured in these modes: + 48:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (##) Master 2Lines RxOnly + 49:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (##) Master 1Line Rx + 50:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (#) The CRC feature is not managed when the DMA circular mode is enabled + 51:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (#) When the SPI DMA Pause/Stop features are used, we must use the following APIs + 52:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** the HAL_SPI_DMAPause()/ HAL_SPI_DMAStop() only under the SPI callbacks + 53:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** [..] + 54:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** Master Receive mode restriction: + 55:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (#) In Master unidirectional receive-only mode (MSTR =1, BIDIMODE=0, RXONLY=1) or + 56:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** bidirectional receive mode (MSTR=1, BIDIMODE=1, BIDIOE=0), to ensure that the SPI + 57:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** does not initiate a new transfer the following procedure has to be respected: + 58:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (##) HAL_SPI_DeInit() + 59:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (##) HAL_SPI_Init() + 60:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** [..] + 61:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** Callback registration: + 62:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 63:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (#) The compilation flag USE_HAL_SPI_REGISTER_CALLBACKS when set to 1U + 64:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** allows the user to configure dynamically the driver callbacks. + 65:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** Use Functions HAL_SPI_RegisterCallback() to register an interrupt callback. + 66:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 67:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** Function HAL_SPI_RegisterCallback() allows to register following callbacks: + 68:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (++) TxCpltCallback : SPI Tx Completed callback + 69:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (++) RxCpltCallback : SPI Rx Completed callback + 70:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (++) TxRxCpltCallback : SPI TxRx Completed callback + 71:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (++) TxHalfCpltCallback : SPI Tx Half Completed callback + 72:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (++) RxHalfCpltCallback : SPI Rx Half Completed callback + 73:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (++) TxRxHalfCpltCallback : SPI TxRx Half Completed callback + 74:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (++) ErrorCallback : SPI Error callback + 75:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (++) AbortCpltCallback : SPI Abort callback + 76:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (++) MspInitCallback : SPI Msp Init callback + 77:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (++) MspDeInitCallback : SPI Msp DeInit callback + 78:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** This function takes as parameters the HAL peripheral handle, the Callback ID + 79:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** and a pointer to the user callback function. + 80:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 81:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 82:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (#) Use function HAL_SPI_UnRegisterCallback to reset a callback to the default + 83:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** weak function. + 84:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_SPI_UnRegisterCallback takes as parameters the HAL peripheral handle, + 85:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** and the Callback ID. + 86:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** This function allows to reset following callbacks: + 87:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (++) TxCpltCallback : SPI Tx Completed callback + ARM GAS /tmp/ccywxtmH.s page 3 + + + 88:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (++) RxCpltCallback : SPI Rx Completed callback + 89:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (++) TxRxCpltCallback : SPI TxRx Completed callback + 90:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (++) TxHalfCpltCallback : SPI Tx Half Completed callback + 91:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (++) RxHalfCpltCallback : SPI Rx Half Completed callback + 92:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (++) TxRxHalfCpltCallback : SPI TxRx Half Completed callback + 93:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (++) ErrorCallback : SPI Error callback + 94:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (++) AbortCpltCallback : SPI Abort callback + 95:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (++) MspInitCallback : SPI Msp Init callback + 96:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (++) MspDeInitCallback : SPI Msp DeInit callback + 97:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 98:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** [..] + 99:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** By default, after the HAL_SPI_Init() and when the state is HAL_SPI_STATE_RESET + 100:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** all callbacks are set to the corresponding weak functions: + 101:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** examples HAL_SPI_MasterTxCpltCallback(), HAL_SPI_MasterRxCpltCallback(). + 102:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** Exception done for MspInit and MspDeInit functions that are + 103:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** reset to the legacy weak functions in the HAL_SPI_Init()/ HAL_SPI_DeInit() only when + 104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** these callbacks are null (not registered beforehand). + 105:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** If MspInit or MspDeInit are not null, the HAL_SPI_Init()/ HAL_SPI_DeInit() + 106:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** keep and use the user MspInit/MspDeInit callbacks (registered beforehand) whatever the state + 107:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 108:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** [..] + 109:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** Callbacks can be registered/unregistered in HAL_SPI_STATE_READY state only. + 110:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** Exception done MspInit/MspDeInit functions that can be registered/unregistered + 111:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** in HAL_SPI_STATE_READY or HAL_SPI_STATE_RESET state, + 112:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** thus registered (user) MspInit/DeInit callbacks can be used during the Init/DeInit. + 113:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** Then, the user first registers the MspInit/MspDeInit user callbacks + 114:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** using HAL_SPI_RegisterCallback() before calling HAL_SPI_DeInit() + 115:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** or HAL_SPI_Init() function. + 116:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 117:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** [..] + 118:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** When the compilation define USE_HAL_PPP_REGISTER_CALLBACKS is set to 0 or + 119:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** not defined, the callback registering feature is not available + 120:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** and weak (surcharged) callbacks are used. + 121:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 122:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** [..] + 123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** Using the HAL it is not possible to reach all supported SPI frequency with the different SPI + 124:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** the following table resume the max SPI frequency reached with data size 8bits/16bits, + 125:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** according to frequency of the APBx Peripheral Clock (fPCLK) used by the SPI instance. + 126:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 127:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** @endverbatim + 128:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 129:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** Additional table : + 130:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 131:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** DataSize = SPI_DATASIZE_8BIT: + 132:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +------------------------------------------------------------------------------------------- + 133:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** | | | 2Lines Fullduplex | 2Lines RxOnly | 1Line + 134:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** | Process | Transfer mode |---------------------|----------------------|------------------- + 135:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** | | | Master | Slave | Master | Slave | Master | Slave + 136:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** |=========================================================================================== + 137:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** | T | Polling | Fpclk/4 | Fpclk/8 | NA | NA | NA | NA + 138:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** | X |----------------|----------|----------|-----------|----------|-----------|------- + 139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** | / | Interrupt | Fpclk/4 | Fpclk/16 | NA | NA | NA | NA + 140:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** | R |----------------|----------|----------|-----------|----------|-----------|------- + 141:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** | X | DMA | Fpclk/2 | Fpclk/2 | NA | NA | NA | NA + 142:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** |=========|================|==========|==========|===========|==========|===========|======= + 143:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** | | Polling | Fpclk/4 | Fpclk/8 | Fpclk/16 | Fpclk/8 | Fpclk/8 | Fpclk/ + 144:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** | |----------------|----------|----------|-----------|----------|-----------|------- + ARM GAS /tmp/ccywxtmH.s page 4 + + + 145:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** | R | Interrupt | Fpclk/8 | Fpclk/16 | Fpclk/8 | Fpclk/8 | Fpclk/8 | Fpclk/ + 146:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** | X |----------------|----------|----------|-----------|----------|-----------|------- + 147:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** | | DMA | Fpclk/4 | Fpclk/2 | Fpclk/2 | Fpclk/16 | Fpclk/2 | Fpclk/ + 148:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** |=========|================|==========|==========|===========|==========|===========|======= + 149:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** | | Polling | Fpclk/8 | Fpclk/2 | NA | NA | Fpclk/8 | Fpclk/ + 150:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** | |----------------|----------|----------|-----------|----------|-----------|------- + 151:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** | T | Interrupt | Fpclk/2 | Fpclk/4 | NA | NA | Fpclk/16 | Fpclk/ + 152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** | X |----------------|----------|----------|-----------|----------|-----------|------- + 153:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** | | DMA | Fpclk/2 | Fpclk/2 | NA | NA | Fpclk/8 | Fpclk/ + 154:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +------------------------------------------------------------------------------------------- + 155:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** DataSize = SPI_DATASIZE_16BIT: + 157:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +------------------------------------------------------------------------------------------- + 158:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** | | | 2Lines Fullduplex | 2Lines RxOnly | 1Line + 159:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** | Process | Transfer mode |---------------------|----------------------|------------------- + 160:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** | | | Master | Slave | Master | Slave | Master | Slave + 161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** |=========================================================================================== + 162:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** | T | Polling | Fpclk/4 | Fpclk/8 | NA | NA | NA | NA + 163:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** | X |----------------|----------|----------|-----------|----------|-----------|------- + 164:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** | / | Interrupt | Fpclk/4 | Fpclk/16 | NA | NA | NA | NA + 165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** | R |----------------|----------|----------|-----------|----------|-----------|------- + 166:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** | X | DMA | Fpclk/2 | Fpclk/2 | NA | NA | NA | NA + 167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** |=========|================|==========|==========|===========|==========|===========|======= + 168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** | | Polling | Fpclk/4 | Fpclk/8 | Fpclk/16 | Fpclk/8 | Fpclk/8 | Fpclk/ + 169:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** | |----------------|----------|----------|-----------|----------|-----------|------- + 170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** | R | Interrupt | Fpclk/8 | Fpclk/16 | Fpclk/8 | Fpclk/8 | Fpclk/8 | Fpclk/ + 171:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** | X |----------------|----------|----------|-----------|----------|-----------|------- + 172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** | | DMA | Fpclk/4 | Fpclk/2 | Fpclk/2 | Fpclk/16 | Fpclk/2 | Fpclk/ + 173:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** |=========|================|==========|==========|===========|==========|===========|======= + 174:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** | | Polling | Fpclk/8 | Fpclk/2 | NA | NA | Fpclk/8 | Fpclk/ + 175:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** | |----------------|----------|----------|-----------|----------|-----------|------- + 176:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** | T | Interrupt | Fpclk/2 | Fpclk/4 | NA | NA | Fpclk/16 | Fpclk/ + 177:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** | X |----------------|----------|----------|-----------|----------|-----------|------- + 178:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** | | DMA | Fpclk/2 | Fpclk/2 | NA | NA | Fpclk/8 | Fpclk/ + 179:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +------------------------------------------------------------------------------------------- + 180:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** @note The max SPI frequency depend on SPI data size (4bits, 5bits,..., 8bits,...15bits, 16bi + 181:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI mode(2 Lines fullduplex, 2 lines RxOnly, 1 line TX/RX) and Process mode (Polling, + 182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** @note + 183:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (#) TX/RX processes are HAL_SPI_TransmitReceive(), HAL_SPI_TransmitReceive_IT() and HAL + 184:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (#) RX processes are HAL_SPI_Receive(), HAL_SPI_Receive_IT() and HAL_SPI_Receive_DMA() + 185:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (#) TX processes are HAL_SPI_Transmit(), HAL_SPI_Transmit_IT() and HAL_SPI_Transmit_DMA + 186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 187:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** ****************************************************************************** + 188:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @attention + 189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * + 190:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** *

    © Copyright (c) 2016 STMicroelectronics. + 191:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * All rights reserved.

    + 192:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * + 193:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * This software component is licensed by ST under BSD 3-Clause license, + 194:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the "License"; You may not use this file except in compliance with the + 195:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * License. You may obtain a copy of the License at: + 196:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * opensource.org/licenses/BSD-3-Clause + 197:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * + 198:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** ****************************************************************************** + 199:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ + 200:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 201:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Includes ------------------------------------------------------------------*/ + ARM GAS /tmp/ccywxtmH.s page 5 + + + 202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #include "stm32f3xx_hal.h" + 203:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 204:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** @addtogroup STM32F3xx_HAL_Driver + 205:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @{ + 206:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ + 207:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 208:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** @defgroup SPI SPI + 209:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief SPI HAL module driver + 210:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @{ + 211:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ + 212:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #ifdef HAL_SPI_MODULE_ENABLED + 213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 214:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Private typedef -----------------------------------------------------------*/ + 215:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Private defines -----------------------------------------------------------*/ + 216:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** @defgroup SPI_Private_Constants SPI Private Constants + 217:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @{ + 218:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ + 219:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #define SPI_DEFAULT_TIMEOUT 100U + 220:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** + 221:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @} + 222:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ + 223:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 224:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Private macros ------------------------------------------------------------*/ + 225:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Private variables ---------------------------------------------------------*/ + 226:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Private function prototypes -----------------------------------------------*/ + 227:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** @defgroup SPI_Private_Functions SPI Private Functions + 228:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @{ + 229:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ + 230:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_DMATransmitCplt(DMA_HandleTypeDef *hdma); + 231:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_DMAReceiveCplt(DMA_HandleTypeDef *hdma); + 232:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_DMATransmitReceiveCplt(DMA_HandleTypeDef *hdma); + 233:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_DMAHalfTransmitCplt(DMA_HandleTypeDef *hdma); + 234:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_DMAHalfReceiveCplt(DMA_HandleTypeDef *hdma); + 235:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_DMAHalfTransmitReceiveCplt(DMA_HandleTypeDef *hdma); + 236:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_DMAError(DMA_HandleTypeDef *hdma); + 237:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_DMAAbortOnError(DMA_HandleTypeDef *hdma); + 238:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_DMATxAbortCallback(DMA_HandleTypeDef *hdma); + 239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_DMARxAbortCallback(DMA_HandleTypeDef *hdma); + 240:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static HAL_StatusTypeDef SPI_WaitFlagStateUntilTimeout(SPI_HandleTypeDef *hspi, uint32_t Flag, Flag + 241:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t Timeout, uint32_t Tickstart); + 242:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static HAL_StatusTypeDef SPI_WaitFifoStateUntilTimeout(SPI_HandleTypeDef *hspi, uint32_t Fifo, uint + 243:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t Timeout, uint32_t Tickstart); + 244:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_TxISR_8BIT(struct __SPI_HandleTypeDef *hspi); + 245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_TxISR_16BIT(struct __SPI_HandleTypeDef *hspi); + 246:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_RxISR_8BIT(struct __SPI_HandleTypeDef *hspi); + 247:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_RxISR_16BIT(struct __SPI_HandleTypeDef *hspi); + 248:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_2linesRxISR_8BIT(struct __SPI_HandleTypeDef *hspi); + 249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_2linesTxISR_8BIT(struct __SPI_HandleTypeDef *hspi); + 250:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_2linesTxISR_16BIT(struct __SPI_HandleTypeDef *hspi); + 251:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_2linesRxISR_16BIT(struct __SPI_HandleTypeDef *hspi); + 252:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) + 253:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_RxISR_8BITCRC(struct __SPI_HandleTypeDef *hspi); + 254:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_RxISR_16BITCRC(struct __SPI_HandleTypeDef *hspi); + 255:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_2linesRxISR_8BITCRC(struct __SPI_HandleTypeDef *hspi); + 256:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_2linesRxISR_16BITCRC(struct __SPI_HandleTypeDef *hspi); + 257:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ + 258:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_AbortRx_ISR(SPI_HandleTypeDef *hspi); + ARM GAS /tmp/ccywxtmH.s page 6 + + + 259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_AbortTx_ISR(SPI_HandleTypeDef *hspi); + 260:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_CloseRxTx_ISR(SPI_HandleTypeDef *hspi); + 261:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_CloseRx_ISR(SPI_HandleTypeDef *hspi); + 262:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_CloseTx_ISR(SPI_HandleTypeDef *hspi); + 263:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static HAL_StatusTypeDef SPI_EndRxTransaction(SPI_HandleTypeDef *hspi, uint32_t Timeout, uint32_t T + 264:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static HAL_StatusTypeDef SPI_EndRxTxTransaction(SPI_HandleTypeDef *hspi, uint32_t Timeout, uint32_t + 265:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** + 266:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @} + 267:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ + 268:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 269:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Exported functions --------------------------------------------------------*/ + 270:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** @defgroup SPI_Exported_Functions SPI Exported Functions + 271:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @{ + 272:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ + 273:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 274:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** @defgroup SPI_Exported_Functions_Group1 Initialization and de-initialization functions + 275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Initialization and Configuration functions + 276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * + 277:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** @verbatim + 278:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** =============================================================================== + 279:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** ##### Initialization and de-initialization functions ##### + 280:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** =============================================================================== + 281:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** [..] This subsection provides a set of functions allowing to initialize and + 282:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** de-initialize the SPIx peripheral: + 283:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 284:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (+) User must implement HAL_SPI_MspInit() function in which he configures + 285:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** all related peripherals resources (CLOCK, GPIO, DMA, IT and NVIC ). + 286:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 287:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (+) Call the function HAL_SPI_Init() to configure the selected device with + 288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** the selected configuration: + 289:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (++) Mode + 290:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (++) Direction + 291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (++) Data Size + 292:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (++) Clock Polarity and Phase + 293:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (++) NSS Management + 294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (++) BaudRate Prescaler + 295:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (++) FirstBit + 296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (++) TIMode + 297:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (++) CRC Calculation + 298:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (++) CRC Polynomial if CRC enabled + 299:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (++) CRC Length, used only with Data8 and Data16 + 300:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (++) FIFO reception threshold + 301:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 302:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (+) Call the function HAL_SPI_DeInit() to restore the default configuration + 303:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** of the selected SPIx peripheral. + 304:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 305:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** @endverbatim + 306:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @{ + 307:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ + 308:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 309:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** + 310:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Initialize the SPI according to the specified parameters + 311:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * in the SPI_InitTypeDef and initialize the associated handle. + 312:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains + 313:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for SPI module. + 314:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval HAL status + 315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ + ARM GAS /tmp/ccywxtmH.s page 7 + + + 316:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef HAL_SPI_Init(SPI_HandleTypeDef *hspi) + 317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 318:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t frxth; + 319:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 320:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check the SPI handle allocation */ + 321:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi == NULL) + 322:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return HAL_ERROR; + 324:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 325:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 326:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check the parameters */ + 327:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** assert_param(IS_SPI_ALL_INSTANCE(hspi->Instance)); + 328:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** assert_param(IS_SPI_MODE(hspi->Init.Mode)); + 329:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** assert_param(IS_SPI_DIRECTION(hspi->Init.Direction)); + 330:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** assert_param(IS_SPI_DATASIZE(hspi->Init.DataSize)); + 331:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** assert_param(IS_SPI_NSS(hspi->Init.NSS)); + 332:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** assert_param(IS_SPI_NSSP(hspi->Init.NSSPMode)); + 333:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** assert_param(IS_SPI_BAUDRATE_PRESCALER(hspi->Init.BaudRatePrescaler)); + 334:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** assert_param(IS_SPI_FIRST_BIT(hspi->Init.FirstBit)); + 335:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** assert_param(IS_SPI_TIMODE(hspi->Init.TIMode)); + 336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.TIMode == SPI_TIMODE_DISABLE) + 337:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 338:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** assert_param(IS_SPI_CPOL(hspi->Init.CLKPolarity)); + 339:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** assert_param(IS_SPI_CPHA(hspi->Init.CLKPhase)); + 340:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 341:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.Mode == SPI_MODE_MASTER) + 342:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** assert_param(IS_SPI_BAUDRATE_PRESCALER(hspi->Init.BaudRatePrescaler)); + 344:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 345:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else + 346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 347:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Baudrate prescaler not use in Motoraola Slave mode. force to default value */ + 348:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; + 349:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 350:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 351:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else + 352:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 353:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** assert_param(IS_SPI_BAUDRATE_PRESCALER(hspi->Init.BaudRatePrescaler)); + 354:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Force polarity and phase to TI protocaol requirements */ + 356:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->Init.CLKPolarity = SPI_POLARITY_LOW; + 357:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->Init.CLKPhase = SPI_PHASE_1EDGE; + 358:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 359:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) + 360:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** assert_param(IS_SPI_CRC_CALCULATION(hspi->Init.CRCCalculation)); + 361:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + 362:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 363:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** assert_param(IS_SPI_CRC_POLYNOMIAL(hspi->Init.CRCPolynomial)); + 364:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** assert_param(IS_SPI_CRC_LENGTH(hspi->Init.CRCLength)); + 365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 366:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #else + 367:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + 368:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ + 369:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 370:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->State == HAL_SPI_STATE_RESET) + 371:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 372:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Allocate lock resource and initialize it */ + ARM GAS /tmp/ccywxtmH.s page 8 + + + 373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->Lock = HAL_UNLOCKED; + 374:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 375:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + 376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Init the SPI Callback settings */ + 377:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxCpltCallback = HAL_SPI_TxCpltCallback; /* Legacy weak TxCpltCallback + 378:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxCpltCallback = HAL_SPI_RxCpltCallback; /* Legacy weak RxCpltCallback + 379:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxRxCpltCallback = HAL_SPI_TxRxCpltCallback; /* Legacy weak TxRxCpltCallback + 380:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxHalfCpltCallback = HAL_SPI_TxHalfCpltCallback; /* Legacy weak TxHalfCpltCallback + 381:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxHalfCpltCallback = HAL_SPI_RxHalfCpltCallback; /* Legacy weak RxHalfCpltCallback + 382:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxRxHalfCpltCallback = HAL_SPI_TxRxHalfCpltCallback; /* Legacy weak TxRxHalfCpltCallback + 383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCallback = HAL_SPI_ErrorCallback; /* Legacy weak ErrorCallback + 384:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->AbortCpltCallback = HAL_SPI_AbortCpltCallback; /* Legacy weak AbortCpltCallback + 385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->MspInitCallback == NULL) + 387:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 388:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->MspInitCallback = HAL_SPI_MspInit; /* Legacy weak MspInit */ + 389:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 390:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 391:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Init the low level hardware : GPIO, CLOCK, NVIC... */ + 392:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->MspInitCallback(hspi); + 393:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #else + 394:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Init the low level hardware : GPIO, CLOCK, NVIC... */ + 395:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_SPI_MspInit(hspi); + 396:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + 397:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 398:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 399:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_BUSY; + 400:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable the selected SPI peripheral */ + 402:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_DISABLE(hspi); + 403:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 404:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Align by default the rs fifo threshold on the data size */ + 405:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) + 406:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** frxth = SPI_RXFIFO_THRESHOLD_HF; + 408:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 409:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else + 410:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 411:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** frxth = SPI_RXFIFO_THRESHOLD_QF; + 412:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 413:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 414:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* CRC calculation is valid only for 16Bit and 8 Bit */ + 415:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((hspi->Init.DataSize != SPI_DATASIZE_16BIT) && (hspi->Init.DataSize != SPI_DATASIZE_8BIT)) + 416:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 417:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* CRC must be disabled */ + 418:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + 419:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 420:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 421:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /*----------------------- SPIx CR1 & CR2 Configuration ---------------------*/ + 422:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Configure : SPI Mode, Communication Mode, Clock polarity and phase, NSS management, + 423:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** Communication speed, First bit and CRC calculation state */ + 424:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** WRITE_REG(hspi->Instance->CR1, ((hspi->Init.Mode & (SPI_CR1_MSTR | SPI_CR1_SSI)) | + 425:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (hspi->Init.Direction & (SPI_CR1_RXONLY | SPI_CR1_BIDIMODE)) | + 426:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (hspi->Init.CLKPolarity & SPI_CR1_CPOL) | + 427:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (hspi->Init.CLKPhase & SPI_CR1_CPHA) | + 428:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (hspi->Init.NSS & SPI_CR1_SSM) | + 429:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (hspi->Init.BaudRatePrescaler & SPI_CR1_BR_Msk) | + ARM GAS /tmp/ccywxtmH.s page 9 + + + 430:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (hspi->Init.FirstBit & SPI_CR1_LSBFIRST) | + 431:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (hspi->Init.CRCCalculation & SPI_CR1_CRCEN))); + 432:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) + 433:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /*---------------------------- SPIx CRCL Configuration -------------------*/ + 434:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + 435:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 436:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Align the CRC Length on the data size */ + 437:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.CRCLength == SPI_CRC_LENGTH_DATASIZE) + 438:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 439:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* CRC Length aligned on the data size : value set by default */ + 440:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) + 441:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 442:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->Init.CRCLength = SPI_CRC_LENGTH_16BIT; + 443:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 444:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else + 445:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 446:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->Init.CRCLength = SPI_CRC_LENGTH_8BIT; + 447:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 448:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 449:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 450:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Configure : CRC Length */ + 451:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.CRCLength == SPI_CRC_LENGTH_16BIT) + 452:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 453:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCL); + 454:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 455:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 456:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ + 457:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 458:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Configure : NSS management, TI Mode, NSS Pulse, Data size and Rx Fifo threshold */ + 459:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** WRITE_REG(hspi->Instance->CR2, (((hspi->Init.NSS >> 16U) & SPI_CR2_SSOE) | + 460:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (hspi->Init.TIMode & SPI_CR2_FRF) | + 461:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (hspi->Init.NSSPMode & SPI_CR2_NSSP) | + 462:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (hspi->Init.DataSize & SPI_CR2_DS_Msk) | + 463:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (frxth & SPI_CR2_FRXTH))); + 464:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 465:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) + 466:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /*---------------------------- SPIx CRCPOLY Configuration ------------------*/ + 467:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Configure : CRC Polynomial */ + 468:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + 469:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 470:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** WRITE_REG(hspi->Instance->CRCPR, (hspi->Init.CRCPolynomial & SPI_CRCPR_CRCPOLY_Msk)); + 471:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 472:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ + 473:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 474:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if defined(SPI_I2SCFGR_I2SMOD) + 475:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Activate the SPI mode (Make sure that I2SMOD bit in I2SCFGR register is reset) */ + 476:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** CLEAR_BIT(hspi->Instance->I2SCFGR, SPI_I2SCFGR_I2SMOD); + 477:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* SPI_I2SCFGR_I2SMOD */ + 478:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 479:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_NONE; + 480:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_READY; + 481:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 482:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return HAL_OK; + 483:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 484:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 485:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** + 486:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief De-Initialize the SPI peripheral. + ARM GAS /tmp/ccywxtmH.s page 10 + + + 487:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains + 488:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for SPI module. + 489:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval HAL status + 490:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ + 491:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef HAL_SPI_DeInit(SPI_HandleTypeDef *hspi) + 492:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 493:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check the SPI handle allocation */ + 494:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi == NULL) + 495:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 496:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return HAL_ERROR; + 497:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 498:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 499:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check SPI Instance parameter */ + 500:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** assert_param(IS_SPI_ALL_INSTANCE(hspi->Instance)); + 501:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 502:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_BUSY; + 503:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 504:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable the SPI Peripheral Clock */ + 505:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_DISABLE(hspi); + 506:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 507:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + 508:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->MspDeInitCallback == NULL) + 509:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 510:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->MspDeInitCallback = HAL_SPI_MspDeInit; /* Legacy weak MspDeInit */ + 511:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 512:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 513:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* DeInit the low level hardware: GPIO, CLOCK, NVIC... */ + 514:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->MspDeInitCallback(hspi); + 515:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #else + 516:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* DeInit the low level hardware: GPIO, CLOCK, NVIC... */ + 517:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_SPI_MspDeInit(hspi); + 518:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + 519:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 520:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_NONE; + 521:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_RESET; + 522:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 523:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Release Lock */ + 524:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_UNLOCK(hspi); + 525:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 526:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return HAL_OK; + 527:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 528:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 529:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** + 530:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Initialize the SPI MSP. + 531:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains + 532:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for SPI module. + 533:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval None + 534:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ + 535:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __weak void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi) + 536:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 537:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Prevent unused argument(s) compilation warning */ + 538:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** UNUSED(hspi); + 539:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 540:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* NOTE : This function should not be modified, when the callback is needed, + 541:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** the HAL_SPI_MspInit should be implemented in the user file + 542:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ + 543:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + ARM GAS /tmp/ccywxtmH.s page 11 + + + 544:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 545:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** + 546:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief De-Initialize the SPI MSP. + 547:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains + 548:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for SPI module. + 549:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval None + 550:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ + 551:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __weak void HAL_SPI_MspDeInit(SPI_HandleTypeDef *hspi) + 552:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 553:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Prevent unused argument(s) compilation warning */ + 554:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** UNUSED(hspi); + 555:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 556:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* NOTE : This function should not be modified, when the callback is needed, + 557:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** the HAL_SPI_MspDeInit should be implemented in the user file + 558:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ + 559:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 560:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 561:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) + 562:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** + 563:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Register a User SPI Callback + 564:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * To be used instead of the weak predefined callback + 565:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi Pointer to a SPI_HandleTypeDef structure that contains + 566:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for the specified SPI. + 567:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param CallbackID ID of the callback to be registered + 568:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param pCallback pointer to the Callback function + 569:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval HAL status + 570:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ + 571:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef HAL_SPI_RegisterCallback(SPI_HandleTypeDef *hspi, HAL_SPI_CallbackIDTypeDef Callb + 572:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** pSPI_CallbackTypeDef pCallback) + 573:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 574:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef status = HAL_OK; + 575:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 576:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (pCallback == NULL) + 577:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 578:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Update the error code */ + 579:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode |= HAL_SPI_ERROR_INVALID_CALLBACK; + 580:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 581:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return HAL_ERROR; + 582:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 583:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Process locked */ + 584:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_LOCK(hspi); + 585:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 586:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (HAL_SPI_STATE_READY == hspi->State) + 587:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 588:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** switch (CallbackID) + 589:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 590:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** case HAL_SPI_TX_COMPLETE_CB_ID : + 591:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxCpltCallback = pCallback; + 592:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** break; + 593:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 594:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** case HAL_SPI_RX_COMPLETE_CB_ID : + 595:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxCpltCallback = pCallback; + 596:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** break; + 597:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 598:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** case HAL_SPI_TX_RX_COMPLETE_CB_ID : + 599:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxRxCpltCallback = pCallback; + 600:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** break; + ARM GAS /tmp/ccywxtmH.s page 12 + + + 601:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 602:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** case HAL_SPI_TX_HALF_COMPLETE_CB_ID : + 603:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxHalfCpltCallback = pCallback; + 604:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** break; + 605:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 606:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** case HAL_SPI_RX_HALF_COMPLETE_CB_ID : + 607:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxHalfCpltCallback = pCallback; + 608:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** break; + 609:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 610:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** case HAL_SPI_TX_RX_HALF_COMPLETE_CB_ID : + 611:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxRxHalfCpltCallback = pCallback; + 612:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** break; + 613:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 614:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** case HAL_SPI_ERROR_CB_ID : + 615:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCallback = pCallback; + 616:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** break; + 617:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 618:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** case HAL_SPI_ABORT_CB_ID : + 619:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->AbortCpltCallback = pCallback; + 620:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** break; + 621:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 622:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** case HAL_SPI_MSPINIT_CB_ID : + 623:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->MspInitCallback = pCallback; + 624:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** break; + 625:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 626:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** case HAL_SPI_MSPDEINIT_CB_ID : + 627:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->MspDeInitCallback = pCallback; + 628:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** break; + 629:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 630:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** default : + 631:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Update the error code */ + 632:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK); + 633:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 634:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Return error status */ + 635:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** status = HAL_ERROR; + 636:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** break; + 637:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 638:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 639:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else if (HAL_SPI_STATE_RESET == hspi->State) + 640:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 641:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** switch (CallbackID) + 642:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 643:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** case HAL_SPI_MSPINIT_CB_ID : + 644:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->MspInitCallback = pCallback; + 645:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** break; + 646:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 647:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** case HAL_SPI_MSPDEINIT_CB_ID : + 648:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->MspDeInitCallback = pCallback; + 649:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** break; + 650:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 651:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** default : + 652:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Update the error code */ + 653:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK); + 654:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 655:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Return error status */ + 656:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** status = HAL_ERROR; + 657:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** break; + ARM GAS /tmp/ccywxtmH.s page 13 + + + 658:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 659:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 660:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else + 661:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 662:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Update the error code */ + 663:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK); + 664:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 665:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Return error status */ + 666:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** status = HAL_ERROR; + 667:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 668:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 669:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Release Lock */ + 670:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_UNLOCK(hspi); + 671:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return status; + 672:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 673:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 674:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** + 675:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Unregister an SPI Callback + 676:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * SPI callback is redirected to the weak predefined callback + 677:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi Pointer to a SPI_HandleTypeDef structure that contains + 678:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for the specified SPI. + 679:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param CallbackID ID of the callback to be unregistered + 680:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval HAL status + 681:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ + 682:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef HAL_SPI_UnRegisterCallback(SPI_HandleTypeDef *hspi, HAL_SPI_CallbackIDTypeDef Cal + 683:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 684:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef status = HAL_OK; + 685:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 686:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Process locked */ + 687:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_LOCK(hspi); + 688:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 689:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (HAL_SPI_STATE_READY == hspi->State) + 690:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 691:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** switch (CallbackID) + 692:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 693:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** case HAL_SPI_TX_COMPLETE_CB_ID : + 694:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxCpltCallback = HAL_SPI_TxCpltCallback; /* Legacy weak TxCpltCallback + 695:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** break; + 696:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 697:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** case HAL_SPI_RX_COMPLETE_CB_ID : + 698:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxCpltCallback = HAL_SPI_RxCpltCallback; /* Legacy weak RxCpltCallback + 699:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** break; + 700:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 701:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** case HAL_SPI_TX_RX_COMPLETE_CB_ID : + 702:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxRxCpltCallback = HAL_SPI_TxRxCpltCallback; /* Legacy weak TxRxCpltCallback + 703:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** break; + 704:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 705:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** case HAL_SPI_TX_HALF_COMPLETE_CB_ID : + 706:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxHalfCpltCallback = HAL_SPI_TxHalfCpltCallback; /* Legacy weak TxHalfCpltCallbac + 707:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** break; + 708:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 709:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** case HAL_SPI_RX_HALF_COMPLETE_CB_ID : + 710:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxHalfCpltCallback = HAL_SPI_RxHalfCpltCallback; /* Legacy weak RxHalfCpltCallbac + 711:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** break; + 712:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 713:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** case HAL_SPI_TX_RX_HALF_COMPLETE_CB_ID : + 714:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxRxHalfCpltCallback = HAL_SPI_TxRxHalfCpltCallback; /* Legacy weak TxRxHalfCpltCallb + ARM GAS /tmp/ccywxtmH.s page 14 + + + 715:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** break; + 716:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 717:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** case HAL_SPI_ERROR_CB_ID : + 718:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCallback = HAL_SPI_ErrorCallback; /* Legacy weak ErrorCallback + 719:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** break; + 720:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 721:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** case HAL_SPI_ABORT_CB_ID : + 722:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->AbortCpltCallback = HAL_SPI_AbortCpltCallback; /* Legacy weak AbortCpltCallback + 723:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** break; + 724:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 725:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** case HAL_SPI_MSPINIT_CB_ID : + 726:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->MspInitCallback = HAL_SPI_MspInit; /* Legacy weak MspInit + 727:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** break; + 728:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 729:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** case HAL_SPI_MSPDEINIT_CB_ID : + 730:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->MspDeInitCallback = HAL_SPI_MspDeInit; /* Legacy weak MspDeInit + 731:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** break; + 732:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 733:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** default : + 734:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Update the error code */ + 735:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK); + 736:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 737:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Return error status */ + 738:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** status = HAL_ERROR; + 739:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** break; + 740:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 741:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 742:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else if (HAL_SPI_STATE_RESET == hspi->State) + 743:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 744:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** switch (CallbackID) + 745:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 746:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** case HAL_SPI_MSPINIT_CB_ID : + 747:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->MspInitCallback = HAL_SPI_MspInit; /* Legacy weak MspInit + 748:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** break; + 749:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 750:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** case HAL_SPI_MSPDEINIT_CB_ID : + 751:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->MspDeInitCallback = HAL_SPI_MspDeInit; /* Legacy weak MspDeInit + 752:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** break; + 753:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 754:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** default : + 755:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Update the error code */ + 756:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK); + 757:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 758:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Return error status */ + 759:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** status = HAL_ERROR; + 760:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** break; + 761:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 762:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 763:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else + 764:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 765:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Update the error code */ + 766:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_INVALID_CALLBACK); + 767:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 768:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Return error status */ + 769:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** status = HAL_ERROR; + 770:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 771:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + ARM GAS /tmp/ccywxtmH.s page 15 + + + 772:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Release Lock */ + 773:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_UNLOCK(hspi); + 774:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return status; + 775:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 776:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + 777:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** + 778:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @} + 779:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ + 780:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 781:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** @defgroup SPI_Exported_Functions_Group2 IO operation functions + 782:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Data transfers functions + 783:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * + 784:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** @verbatim + 785:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** ============================================================================== + 786:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** ##### IO operation functions ##### + 787:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** =============================================================================== + 788:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** [..] + 789:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** This subsection provides a set of functions allowing to manage the SPI + 790:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** data transfers. + 791:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 792:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** [..] The SPI supports master and slave mode : + 793:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 794:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (#) There are two modes of transfer: + 795:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (++) Blocking mode: The communication is performed in polling mode. + 796:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** The HAL status of all data processing is returned by the same function + 797:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** after finishing transfer. + 798:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (++) No-Blocking mode: The communication is performed using Interrupts + 799:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** or DMA, These APIs return the HAL status. + 800:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** The end of the data processing will be indicated through the + 801:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** dedicated SPI IRQ when using Interrupt mode or the DMA IRQ when + 802:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** using DMA mode. + 803:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** The HAL_SPI_TxCpltCallback(), HAL_SPI_RxCpltCallback() and HAL_SPI_TxRxCpltCallback() u + 804:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** will be executed respectively at the end of the transmit or Receive process + 805:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** The HAL_SPI_ErrorCallback()user callback will be executed when a communication error is + 806:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 807:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (#) APIs provided for these 2 transfer modes (Blocking mode or Non blocking mode using either I + 808:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** exist for 1Line (simplex) and 2Lines (full duplex) modes. + 809:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 810:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** @endverbatim + 811:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @{ + 812:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ + 813:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 814:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** + 815:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Transmit an amount of data in blocking mode. + 816:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains + 817:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for SPI module. + 818:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param pData pointer to data buffer + 819:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param Size amount of data to be sent + 820:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param Timeout Timeout duration + 821:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval HAL status + 822:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ + 823:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t + 824:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 825:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t tickstart; + 826:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef errorcode = HAL_OK; + 827:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint16_t initial_TxXferCount; + 828:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + ARM GAS /tmp/ccywxtmH.s page 16 + + + 829:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check Direction parameter */ + 830:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE(hspi->Init.Direction)); + 831:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 832:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Process Locked */ + 833:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_LOCK(hspi); + 834:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 835:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Init tickstart for timeout management*/ + 836:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** tickstart = HAL_GetTick(); + 837:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** initial_TxXferCount = Size; + 838:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 839:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->State != HAL_SPI_STATE_READY) + 840:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 841:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_BUSY; + 842:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 843:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 844:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 845:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((pData == NULL) || (Size == 0U)) + 846:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 847:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_ERROR; + 848:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 849:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 850:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 851:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set the transaction information */ + 852:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_BUSY_TX; + 853:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_NONE; + 854:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr = (uint8_t *)pData; + 855:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferSize = Size; + 856:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = Size; + 857:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 858:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /*Init field not used in handle to zero */ + 859:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr = (uint8_t *)NULL; + 860:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferSize = 0U; + 861:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = 0U; + 862:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxISR = NULL; + 863:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxISR = NULL; + 864:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 865:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Configure communication direction : 1Line */ + 866:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.Direction == SPI_DIRECTION_1LINE) + 867:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 868:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */ + 869:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_DISABLE(hspi); + 870:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_1LINE_TX(hspi); + 871:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 872:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 873:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) + 874:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Reset CRC Calculation */ + 875:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + 876:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 877:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_RESET_CRC(hspi); + 878:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 879:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ + 880:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 881:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check if the SPI is already enabled */ + 882:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) + 883:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 884:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Enable SPI peripheral */ + 885:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_ENABLE(hspi); + ARM GAS /tmp/ccywxtmH.s page 17 + + + 886:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 887:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 888:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Transmit data in 16 Bit mode */ + 889:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) + 890:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 891:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U)) + 892:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 893:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr); + 894:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 895:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; + 896:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 897:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Transmit data in 16 Bit mode */ + 898:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** while (hspi->TxXferCount > 0U) + 899:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 900:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Wait until TXE flag is set to send data */ + 901:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE)) + 902:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 903:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr); + 904:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 905:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; + 906:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 907:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else + 908:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 909:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Timeout management */ + 910:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout = + 911:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 912:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_TIMEOUT; + 913:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 914:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 915:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 916:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 917:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 918:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Transmit data in 8 Bit mode */ + 919:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else + 920:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 921:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U)) + 922:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 923:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->TxXferCount > 1U) + 924:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 925:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* write on the data register in packing mode */ + 926:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr); + 927:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 928:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount -= 2U; + 929:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 930:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else + 931:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 932:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** *((__IO uint8_t *)&hspi->Instance->DR) = (*hspi->pTxBuffPtr); + 933:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr ++; + 934:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; + 935:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 936:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 937:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** while (hspi->TxXferCount > 0U) + 938:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 939:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Wait until TXE flag is set to send data */ + 940:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE)) + 941:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 942:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->TxXferCount > 1U) + ARM GAS /tmp/ccywxtmH.s page 18 + + + 943:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 944:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* write on the data register in packing mode */ + 945:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr); + 946:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 947:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount -= 2U; + 948:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 949:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else + 950:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 951:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** *((__IO uint8_t *)&hspi->Instance->DR) = (*hspi->pTxBuffPtr); + 952:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr++; + 953:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; + 954:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 955:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 956:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else + 957:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 958:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Timeout management */ + 959:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout = + 960:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 961:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_TIMEOUT; + 962:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 963:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 964:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 965:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 966:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 967:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) + 968:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Enable CRC Transmission */ + 969:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) + 970:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 971:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); + 972:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 973:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ + 974:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 975:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check the end of the transaction */ + 976:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (SPI_EndRxTxTransaction(hspi, Timeout, tickstart) != HAL_OK) + 977:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 978:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_FLAG; + 979:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 980:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 981:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Clear overrun flag in 2 Lines communication mode because received is not read */ + 982:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.Direction == SPI_DIRECTION_2LINES) + 983:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 984:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_OVRFLAG(hspi); + 985:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 986:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 987:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) + 988:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 989:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_ERROR; + 990:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 991:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 992:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** error: + 993:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_READY; + 994:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Process Unlocked */ + 995:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_UNLOCK(hspi); + 996:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return errorcode; + 997:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 998:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 999:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** + ARM GAS /tmp/ccywxtmH.s page 19 + + +1000:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Receive an amount of data in blocking mode. +1001:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains +1002:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for SPI module. +1003:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param pData pointer to data buffer +1004:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param Size amount of data to be received +1005:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param Timeout Timeout duration +1006:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval HAL status +1007:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +1008:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t +1009:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1010:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) +1011:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __IO uint32_t tmpreg = 0U; +1012:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __IO uint8_t * ptmpreg8; +1013:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __IO uint8_t tmpreg8 = 0; +1014:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ +1015:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t tickstart; +1016:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef errorcode = HAL_OK; +1017:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1018:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((hspi->Init.Mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES)) +1019:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1020:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_BUSY_RX; +1021:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line +1022:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return HAL_SPI_TransmitReceive(hspi, pData, pData, Size, Timeout); +1023:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1024:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1025:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Process Locked */ +1026:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_LOCK(hspi); +1027:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1028:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Init tickstart for timeout management*/ +1029:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** tickstart = HAL_GetTick(); +1030:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1031:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->State != HAL_SPI_STATE_READY) +1032:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1033:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_BUSY; +1034:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; +1035:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1036:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1037:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((pData == NULL) || (Size == 0U)) +1038:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1039:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_ERROR; +1040:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; +1041:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1042:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1043:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set the transaction information */ +1044:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_BUSY_RX; +1045:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_NONE; +1046:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr = (uint8_t *)pData; +1047:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferSize = Size; +1048:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = Size; +1049:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1050:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /*Init field not used in handle to zero */ +1051:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr = (uint8_t *)NULL; +1052:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferSize = 0U; +1053:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = 0U; +1054:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxISR = NULL; +1055:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxISR = NULL; +1056:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + ARM GAS /tmp/ccywxtmH.s page 20 + + +1057:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) +1058:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Reset CRC Calculation */ +1059:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) +1060:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1061:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_RESET_CRC(hspi); +1062:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* this is done to handle the CRCNEXT before the latest data */ +1063:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount--; +1064:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1065:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ +1066:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1067:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set the Rx Fifo threshold */ +1068:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) +1069:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1070:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set RX Fifo threshold according the reception data length: 16bit */ +1071:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); +1072:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1073:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else +1074:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1075:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set RX Fifo threshold according the reception data length: 8bit */ +1076:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); +1077:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1078:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1079:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Configure communication direction: 1Line */ +1080:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.Direction == SPI_DIRECTION_1LINE) +1081:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1082:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */ +1083:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_DISABLE(hspi); +1084:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_1LINE_RX(hspi); +1085:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1086:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1087:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check if the SPI is already enabled */ +1088:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) +1089:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1090:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Enable SPI peripheral */ +1091:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_ENABLE(hspi); +1092:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1093:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1094:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Receive data in 8 Bit mode */ +1095:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.DataSize <= SPI_DATASIZE_8BIT) +1096:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1097:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Transfer loop */ +1098:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** while (hspi->RxXferCount > 0U) +1099:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1100:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check the RXNE flag */ +1101:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE)) +1102:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1103:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* read the received data */ +1104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (* (uint8_t *)hspi->pRxBuffPtr) = *(__IO uint8_t *)&hspi->Instance->DR; +1105:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr += sizeof(uint8_t); +1106:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount--; +1107:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1108:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else +1109:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1110:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Timeout management */ +1111:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout = +1112:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1113:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_TIMEOUT; + ARM GAS /tmp/ccywxtmH.s page 21 + + +1114:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; +1115:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1116:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1117:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1118:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1119:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else +1120:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1121:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Transfer loop */ +1122:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** while (hspi->RxXferCount > 0U) +1123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1124:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check the RXNE flag */ +1125:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE)) +1126:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1127:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)hspi->Instance->DR; +1128:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr += sizeof(uint16_t); +1129:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount--; +1130:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1131:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else +1132:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1133:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Timeout management */ +1134:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) || (Timeout = +1135:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1136:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_TIMEOUT; +1137:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; +1138:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1140:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1141:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1142:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1143:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) +1144:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Handle the CRC Transmission */ +1145:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) +1146:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1147:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* freeze the CRC before the latest data */ +1148:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); +1149:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1150:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Read the latest data */ +1151:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, Timeout, tickstart) != HAL_OK) +1152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1153:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* the latest data has not been received */ +1154:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_TIMEOUT; +1155:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; +1156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1157:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1158:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Receive last data in 16 Bit mode */ +1159:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) +1160:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)hspi->Instance->DR; +1162:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1163:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Receive last data in 8 Bit mode */ +1164:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else +1165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1166:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (*(uint8_t *)hspi->pRxBuffPtr) = *(__IO uint8_t *)&hspi->Instance->DR; +1167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1169:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Wait the CRC data */ +1170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, Timeout, tickstart) != HAL_OK) + ARM GAS /tmp/ccywxtmH.s page 22 + + +1171:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); +1173:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_TIMEOUT; +1174:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; +1175:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1176:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1177:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Read CRC to Flush DR and RXNE flag */ +1178:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.DataSize == SPI_DATASIZE_16BIT) +1179:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1180:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Read 16bit CRC */ +1181:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** tmpreg = READ_REG(hspi->Instance->DR); +1182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* To avoid GCC warning */ +1183:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** UNUSED(tmpreg); +1184:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1185:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else +1186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1187:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Initialize the 8bit temporary pointer */ +1188:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** ptmpreg8 = (__IO uint8_t *)&hspi->Instance->DR; +1189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Read 8bit CRC */ +1190:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** tmpreg8 = *ptmpreg8; +1191:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* To avoid GCC warning */ +1192:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** UNUSED(tmpreg8); +1193:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1194:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((hspi->Init.DataSize == SPI_DATASIZE_8BIT) && (hspi->Init.CRCLength == SPI_CRC_LENGTH_16B +1195:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1196:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, Timeout, tickstart) != HAL_OK) +1197:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1198:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Error on the CRC reception */ +1199:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); +1200:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_TIMEOUT; +1201:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; +1202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1203:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Read 8bit CRC again in case of 16bit CRC in 8bit Data mode */ +1204:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** tmpreg8 = *ptmpreg8; +1205:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* To avoid GCC warning */ +1206:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** UNUSED(tmpreg8); +1207:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1208:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1209:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1210:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ +1211:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1212:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check the end of the transaction */ +1213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (SPI_EndRxTransaction(hspi, Timeout, tickstart) != HAL_OK) +1214:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1215:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_FLAG; +1216:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1217:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1218:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) +1219:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check if CRC error occurred */ +1220:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR)) +1221:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1222:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); +1223:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_CRCERRFLAG(hspi); +1224:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1225:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ +1226:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1227:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) + ARM GAS /tmp/ccywxtmH.s page 23 + + +1228:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1229:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_ERROR; +1230:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1231:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1232:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** error : +1233:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_READY; +1234:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_UNLOCK(hspi); +1235:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return errorcode; +1236:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1237:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1238:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +1239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Transmit and Receive an amount of data in blocking mode. +1240:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains +1241:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for SPI module. +1242:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param pTxData pointer to transmission data buffer +1243:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param pRxData pointer to reception data buffer +1244:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param Size amount of data to be sent and received +1245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param Timeout Timeout duration +1246:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval HAL status +1247:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +1248:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxDa +1249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t Timeout) +1250:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1251:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint16_t initial_TxXferCount; +1252:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint16_t initial_RxXferCount; +1253:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t tmp_mode; +1254:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_SPI_StateTypeDef tmp_state; +1255:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t tickstart; +1256:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) +1257:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __IO uint32_t tmpreg = 0U; +1258:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t spi_cr1; +1259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t spi_cr2; +1260:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __IO uint8_t * ptmpreg8; +1261:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __IO uint8_t tmpreg8 = 0; +1262:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ +1263:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1264:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Variable used to alternate Rx and Tx during transfer */ +1265:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t txallowed = 1U; +1266:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef errorcode = HAL_OK; +1267:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1268:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check Direction parameter */ +1269:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction)); +1270:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1271:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Process Locked */ +1272:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_LOCK(hspi); +1273:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1274:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Init tickstart for timeout management*/ +1275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** tickstart = HAL_GetTick(); +1276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1277:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Init temporary variables */ +1278:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** tmp_state = hspi->State; +1279:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** tmp_mode = hspi->Init.Mode; +1280:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** initial_TxXferCount = Size; +1281:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** initial_RxXferCount = Size; +1282:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) +1283:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** spi_cr1 = READ_REG(hspi->Instance->CR1); +1284:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** spi_cr2 = READ_REG(hspi->Instance->CR2); + ARM GAS /tmp/ccywxtmH.s page 24 + + +1285:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ +1286:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1287:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (!((tmp_state == HAL_SPI_STATE_READY) || \ +1288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** ((tmp_mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES) && (tmp_st +1289:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1290:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_BUSY; +1291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; +1292:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1293:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U)) +1295:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_ERROR; +1297:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; +1298:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1299:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1300:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Don't overwrite in case of HAL_SPI_STATE_BUSY_RX */ +1301:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->State != HAL_SPI_STATE_BUSY_RX) +1302:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1303:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_BUSY_TX_RX; +1304:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1305:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1306:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set the transaction information */ +1307:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_NONE; +1308:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr = (uint8_t *)pRxData; +1309:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = Size; +1310:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferSize = Size; +1311:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr = (uint8_t *)pTxData; +1312:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = Size; +1313:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferSize = Size; +1314:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /*Init field not used in handle to zero */ +1316:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxISR = NULL; +1317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxISR = NULL; +1318:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1319:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) +1320:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Reset CRC Calculation */ +1321:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) +1322:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_RESET_CRC(hspi); +1324:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1325:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ +1326:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1327:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set the Rx Fifo threshold */ +1328:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((hspi->Init.DataSize > SPI_DATASIZE_8BIT) || (initial_RxXferCount > 1U)) +1329:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1330:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set fiforxthreshold according the reception data length: 16bit */ +1331:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); +1332:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1333:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else +1334:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1335:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set fiforxthreshold according the reception data length: 8bit */ +1336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); +1337:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1338:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1339:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check if the SPI is already enabled */ +1340:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) +1341:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + ARM GAS /tmp/ccywxtmH.s page 25 + + +1342:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Enable SPI peripheral */ +1343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_ENABLE(hspi); +1344:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1345:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Transmit and Receive data in 16 Bit mode */ +1347:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) +1348:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1349:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U)) +1350:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1351:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr); +1352:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); +1353:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; +1354:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** while ((hspi->TxXferCount > 0U) || (hspi->RxXferCount > 0U)) +1356:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1357:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check TXE flag */ +1358:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE)) && (hspi->TxXferCount > 0U) && (txallowed == 1U) +1359:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1360:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr); +1361:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); +1362:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; +1363:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Next Data is a reception (Rx). Tx not allowed */ +1364:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** txallowed = 0U; +1365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1366:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) +1367:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Enable CRC Transmission */ +1368:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((hspi->TxXferCount == 0U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)) +1369:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1370:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set NSS Soft to received correctly the CRC on slave mode with NSS pulse activated */ +1371:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((READ_BIT(spi_cr1, SPI_CR1_MSTR) == 0U) && (READ_BIT(spi_cr2, SPI_CR2_NSSP) == SPI_CR +1372:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->Instance->CR1, SPI_CR1_SSM); +1374:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1375:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); +1376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1377:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ +1378:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1379:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1380:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check RXNE flag */ +1381:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE)) && (hspi->RxXferCount > 0U)) +1382:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)hspi->Instance->DR; +1384:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr += sizeof(uint16_t); +1385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount--; +1386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Next Data is a Transmission (Tx). Tx is allowed */ +1387:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** txallowed = 1U; +1388:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1389:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (((HAL_GetTick() - tickstart) >= Timeout) && (Timeout != HAL_MAX_DELAY)) +1390:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1391:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_TIMEOUT; +1392:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; +1393:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1394:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1395:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1396:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Transmit and Receive data in 8 Bit mode */ +1397:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else +1398:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + ARM GAS /tmp/ccywxtmH.s page 26 + + +1399:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((hspi->Init.Mode == SPI_MODE_SLAVE) || (initial_TxXferCount == 0x01U)) +1400:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->TxXferCount > 1U) +1402:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1403:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr); +1404:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); +1405:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount -= 2U; +1406:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else +1408:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1409:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** *(__IO uint8_t *)&hspi->Instance->DR = (*hspi->pTxBuffPtr); +1410:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr++; +1411:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; +1412:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1413:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1414:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** while ((hspi->TxXferCount > 0U) || (hspi->RxXferCount > 0U)) +1415:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1416:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check TXE flag */ +1417:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_TXE)) && (hspi->TxXferCount > 0U) && (txallowed == 1U) +1418:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1419:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->TxXferCount > 1U) +1420:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1421:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr); +1422:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); +1423:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount -= 2U; +1424:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1425:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else +1426:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1427:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** *(__IO uint8_t *)&hspi->Instance->DR = (*hspi->pTxBuffPtr); +1428:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr++; +1429:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; +1430:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1431:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Next Data is a reception (Rx). Tx not allowed */ +1432:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** txallowed = 0U; +1433:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1434:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) +1435:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Enable CRC Transmission */ +1436:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((hspi->TxXferCount == 0U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)) +1437:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1438:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set NSS Soft to received correctly the CRC on slave mode with NSS pulse activated */ +1439:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((READ_BIT(spi_cr1, SPI_CR1_MSTR) == 0U) && (READ_BIT(spi_cr2, SPI_CR2_NSSP) == SPI_CR +1440:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1441:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->Instance->CR1, SPI_CR1_SSM); +1442:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1443:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); +1444:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1445:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ +1446:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1447:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1448:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Wait until RXNE flag is reset */ +1449:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_RXNE)) && (hspi->RxXferCount > 0U)) +1450:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1451:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->RxXferCount > 1U) +1452:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1453:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)hspi->Instance->DR; +1454:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr += sizeof(uint16_t); +1455:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount -= 2U; + ARM GAS /tmp/ccywxtmH.s page 27 + + +1456:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->RxXferCount <= 1U) +1457:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1458:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set RX Fifo threshold before to switch on 8 bit data size */ +1459:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); +1460:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1461:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1462:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else +1463:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1464:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (*(uint8_t *)hspi->pRxBuffPtr) = *(__IO uint8_t *)&hspi->Instance->DR; +1465:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr++; +1466:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount--; +1467:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1468:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Next Data is a Transmission (Tx). Tx is allowed */ +1469:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** txallowed = 1U; +1470:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1471:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((((HAL_GetTick() - tickstart) >= Timeout) && ((Timeout != HAL_MAX_DELAY))) || (Timeout = +1472:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1473:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_TIMEOUT; +1474:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; +1475:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1476:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1477:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1478:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1479:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) +1480:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Read CRC from DR to close CRC calculation process */ +1481:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) +1482:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1483:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Wait until TXE flag */ +1484:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, Timeout, tickstart) != HAL_OK) +1485:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1486:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Error on the CRC reception */ +1487:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); +1488:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_TIMEOUT; +1489:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; +1490:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1491:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Read CRC */ +1492:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.DataSize == SPI_DATASIZE_16BIT) +1493:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1494:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Read 16bit CRC */ +1495:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** tmpreg = READ_REG(hspi->Instance->DR); +1496:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* To avoid GCC warning */ +1497:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** UNUSED(tmpreg); +1498:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1499:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else +1500:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1501:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Initialize the 8bit temporary pointer */ +1502:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** ptmpreg8 = (__IO uint8_t *)&hspi->Instance->DR; +1503:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Read 8bit CRC */ +1504:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** tmpreg8 = *ptmpreg8; +1505:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* To avoid GCC warning */ +1506:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** UNUSED(tmpreg8); +1507:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1508:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.CRCLength == SPI_CRC_LENGTH_16BIT) +1509:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1510:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, Timeout, tickstart) != HAL_OK) +1511:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1512:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Error on the CRC reception */ + ARM GAS /tmp/ccywxtmH.s page 28 + + +1513:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); +1514:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_TIMEOUT; +1515:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; +1516:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1517:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Read 8bit CRC again in case of 16bit CRC in 8bit Data mode */ +1518:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** tmpreg8 = *ptmpreg8; +1519:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* To avoid GCC warning */ +1520:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** UNUSED(tmpreg8); +1521:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1522:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1523:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1524:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1525:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check if CRC error occurred */ +1526:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR)) +1527:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1528:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); +1529:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Clear CRC Flag */ +1530:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_CRCERRFLAG(hspi); +1531:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1532:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_ERROR; +1533:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1534:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ +1535:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1536:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check the end of the transaction */ +1537:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (SPI_EndRxTxTransaction(hspi, Timeout, tickstart) != HAL_OK) +1538:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1539:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_ERROR; +1540:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_FLAG; +1541:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1542:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1543:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** error : +1544:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_READY; +1545:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_UNLOCK(hspi); +1546:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return errorcode; +1547:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1548:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1549:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +1550:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Transmit an amount of data in non-blocking mode with Interrupt. +1551:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains +1552:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for SPI module. +1553:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param pData pointer to data buffer +1554:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param Size amount of data to be sent +1555:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval HAL status +1556:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +1557:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef HAL_SPI_Transmit_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size) +1558:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1559:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef errorcode = HAL_OK; +1560:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1561:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check Direction parameter */ +1562:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE(hspi->Init.Direction)); +1563:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1564:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Process Locked */ +1565:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_LOCK(hspi); +1566:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1567:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((pData == NULL) || (Size == 0U)) +1568:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1569:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_ERROR; + ARM GAS /tmp/ccywxtmH.s page 29 + + +1570:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; +1571:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1572:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1573:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->State != HAL_SPI_STATE_READY) +1574:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1575:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_BUSY; +1576:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; +1577:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1578:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1579:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set the transaction information */ +1580:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_BUSY_TX; +1581:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_NONE; +1582:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr = (uint8_t *)pData; +1583:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferSize = Size; +1584:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = Size; +1585:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1586:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Init field not used in handle to zero */ +1587:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr = (uint8_t *)NULL; +1588:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferSize = 0U; +1589:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = 0U; +1590:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxISR = NULL; +1591:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1592:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set the function for IT treatment */ +1593:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) +1594:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1595:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxISR = SPI_TxISR_16BIT; +1596:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1597:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else +1598:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1599:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxISR = SPI_TxISR_8BIT; +1600:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1601:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1602:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Configure communication direction : 1Line */ +1603:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.Direction == SPI_DIRECTION_1LINE) +1604:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1605:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */ +1606:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_DISABLE(hspi); +1607:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_1LINE_TX(hspi); +1608:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1609:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1610:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) +1611:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Reset CRC Calculation */ +1612:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) +1613:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1614:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_RESET_CRC(hspi); +1615:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1616:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ +1617:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1618:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Enable TXE and ERR interrupt */ +1619:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_ERR)); +1620:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1621:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1622:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check if the SPI is already enabled */ +1623:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) +1624:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1625:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Enable SPI peripheral */ +1626:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_ENABLE(hspi); + ARM GAS /tmp/ccywxtmH.s page 30 + + +1627:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1628:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1629:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** error : +1630:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_UNLOCK(hspi); +1631:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return errorcode; +1632:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1633:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1634:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +1635:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Receive an amount of data in non-blocking mode with Interrupt. +1636:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains +1637:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for SPI module. +1638:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param pData pointer to data buffer +1639:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param Size amount of data to be sent +1640:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval HAL status +1641:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +1642:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef HAL_SPI_Receive_IT(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size) +1643:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1644:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef errorcode = HAL_OK; +1645:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1646:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((hspi->Init.Direction == SPI_DIRECTION_2LINES) && (hspi->Init.Mode == SPI_MODE_MASTER)) +1647:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1648:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_BUSY_RX; +1649:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line +1650:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return HAL_SPI_TransmitReceive_IT(hspi, pData, pData, Size); +1651:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1652:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1653:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Process Locked */ +1654:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_LOCK(hspi); +1655:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1656:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->State != HAL_SPI_STATE_READY) +1657:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1658:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_BUSY; +1659:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; +1660:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1661:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1662:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((pData == NULL) || (Size == 0U)) +1663:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1664:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_ERROR; +1665:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; +1666:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1667:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1668:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set the transaction information */ +1669:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_BUSY_RX; +1670:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_NONE; +1671:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr = (uint8_t *)pData; +1672:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferSize = Size; +1673:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = Size; +1674:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1675:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Init field not used in handle to zero */ +1676:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr = (uint8_t *)NULL; +1677:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferSize = 0U; +1678:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = 0U; +1679:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxISR = NULL; +1680:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1681:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check the data size to adapt Rx threshold and the set the function for IT treatment */ +1682:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) +1683:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + ARM GAS /tmp/ccywxtmH.s page 31 + + +1684:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set RX Fifo threshold according the reception data length: 16 bit */ +1685:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); +1686:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxISR = SPI_RxISR_16BIT; +1687:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1688:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else +1689:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1690:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set RX Fifo threshold according the reception data length: 8 bit */ +1691:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); +1692:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxISR = SPI_RxISR_8BIT; +1693:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1694:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1695:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Configure communication direction : 1Line */ +1696:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.Direction == SPI_DIRECTION_1LINE) +1697:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1698:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */ +1699:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_DISABLE(hspi); +1700:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_1LINE_RX(hspi); +1701:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1702:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1703:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) +1704:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Reset CRC Calculation */ +1705:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) +1706:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1707:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->CRCSize = 1U; +1708:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((hspi->Init.DataSize <= SPI_DATASIZE_8BIT) && (hspi->Init.CRCLength == SPI_CRC_LENGTH_16BIT +1709:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1710:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->CRCSize = 2U; +1711:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1712:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_RESET_CRC(hspi); +1713:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1714:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else +1715:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1716:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->CRCSize = 0U; +1717:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1718:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ +1719:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1720:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Enable TXE and ERR interrupt */ +1721:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR)); +1722:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1723:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Note : The SPI must be enabled after unlocking current process +1724:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** to avoid the risk of SPI interrupt handle execution before current +1725:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** process unlock */ +1726:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1727:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check if the SPI is already enabled */ +1728:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) +1729:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1730:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Enable SPI peripheral */ +1731:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_ENABLE(hspi); +1732:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1733:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1734:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** error : +1735:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Process Unlocked */ +1736:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_UNLOCK(hspi); +1737:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return errorcode; +1738:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1739:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1740:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** + ARM GAS /tmp/ccywxtmH.s page 32 + + +1741:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Transmit and Receive an amount of data in non-blocking mode with Interrupt. +1742:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains +1743:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for SPI module. +1744:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param pTxData pointer to transmission data buffer +1745:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param pRxData pointer to reception data buffer +1746:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param Size amount of data to be sent and received +1747:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval HAL status +1748:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +1749:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef HAL_SPI_TransmitReceive_IT(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pR +1750:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1751:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t tmp_mode; +1752:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_SPI_StateTypeDef tmp_state; +1753:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef errorcode = HAL_OK; +1754:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1755:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check Direction parameter */ +1756:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction)); +1757:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1758:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Process locked */ +1759:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_LOCK(hspi); +1760:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1761:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Init temporary variables */ +1762:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** tmp_state = hspi->State; +1763:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** tmp_mode = hspi->Init.Mode; +1764:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1765:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (!((tmp_state == HAL_SPI_STATE_READY) || \ +1766:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** ((tmp_mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES) && (tmp_st +1767:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1768:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_BUSY; +1769:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; +1770:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1771:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1772:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U)) +1773:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1774:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_ERROR; +1775:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; +1776:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1777:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1778:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Don't overwrite in case of HAL_SPI_STATE_BUSY_RX */ +1779:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->State != HAL_SPI_STATE_BUSY_RX) +1780:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1781:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_BUSY_TX_RX; +1782:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1783:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1784:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set the transaction information */ +1785:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_NONE; +1786:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr = (uint8_t *)pTxData; +1787:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferSize = Size; +1788:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = Size; +1789:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr = (uint8_t *)pRxData; +1790:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferSize = Size; +1791:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = Size; +1792:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1793:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set the function for IT treatment */ +1794:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) +1795:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1796:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxISR = SPI_2linesRxISR_16BIT; +1797:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxISR = SPI_2linesTxISR_16BIT; + ARM GAS /tmp/ccywxtmH.s page 33 + + +1798:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1799:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else +1800:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1801:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxISR = SPI_2linesRxISR_8BIT; +1802:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxISR = SPI_2linesTxISR_8BIT; +1803:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1804:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1805:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) +1806:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Reset CRC Calculation */ +1807:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) +1808:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1809:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->CRCSize = 1U; +1810:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((hspi->Init.DataSize <= SPI_DATASIZE_8BIT) && (hspi->Init.CRCLength == SPI_CRC_LENGTH_16BIT +1811:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1812:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->CRCSize = 2U; +1813:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1814:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_RESET_CRC(hspi); +1815:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1816:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else +1817:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1818:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->CRCSize = 0U; +1819:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1820:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ +1821:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1822:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check if packing mode is enabled and if there is more than 2 data to receive */ +1823:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((hspi->Init.DataSize > SPI_DATASIZE_8BIT) || (Size >= 2U)) +1824:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1825:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set RX Fifo threshold according the reception data length: 16 bit */ +1826:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); +1827:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1828:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else +1829:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1830:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set RX Fifo threshold according the reception data length: 8 bit */ +1831:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); +1832:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1833:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1834:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Enable TXE, RXNE and ERR interrupt */ +1835:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_RXNE | SPI_IT_ERR)); +1836:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1837:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check if the SPI is already enabled */ +1838:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) +1839:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1840:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Enable SPI peripheral */ +1841:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_ENABLE(hspi); +1842:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1843:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1844:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** error : +1845:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Process Unlocked */ +1846:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_UNLOCK(hspi); +1847:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return errorcode; +1848:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1849:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1850:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +1851:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Transmit an amount of data in non-blocking mode with DMA. +1852:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains +1853:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for SPI module. +1854:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param pData pointer to data buffer + ARM GAS /tmp/ccywxtmH.s page 34 + + +1855:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param Size amount of data to be sent +1856:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval HAL status +1857:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +1858:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef HAL_SPI_Transmit_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size) +1859:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1860:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef errorcode = HAL_OK; +1861:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1862:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check tx dma handle */ +1863:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** assert_param(IS_SPI_DMA_HANDLE(hspi->hdmatx)); +1864:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1865:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check Direction parameter */ +1866:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** assert_param(IS_SPI_DIRECTION_2LINES_OR_1LINE(hspi->Init.Direction)); +1867:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1868:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Process Locked */ +1869:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_LOCK(hspi); +1870:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1871:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->State != HAL_SPI_STATE_READY) +1872:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1873:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_BUSY; +1874:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; +1875:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1876:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1877:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((pData == NULL) || (Size == 0U)) +1878:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1879:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_ERROR; +1880:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; +1881:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1882:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1883:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set the transaction information */ +1884:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_BUSY_TX; +1885:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_NONE; +1886:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr = (uint8_t *)pData; +1887:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferSize = Size; +1888:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = Size; +1889:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1890:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Init field not used in handle to zero */ +1891:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr = (uint8_t *)NULL; +1892:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxISR = NULL; +1893:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxISR = NULL; +1894:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferSize = 0U; +1895:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = 0U; +1896:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1897:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Configure communication direction : 1Line */ +1898:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.Direction == SPI_DIRECTION_1LINE) +1899:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1900:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */ +1901:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_DISABLE(hspi); +1902:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_1LINE_TX(hspi); +1903:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1904:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1905:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) +1906:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Reset CRC Calculation */ +1907:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) +1908:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1909:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_RESET_CRC(hspi); +1910:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1911:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ + ARM GAS /tmp/ccywxtmH.s page 35 + + +1912:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1913:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set the SPI TxDMA Half transfer complete callback */ +1914:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmatx->XferHalfCpltCallback = SPI_DMAHalfTransmitCplt; +1915:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1916:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set the SPI TxDMA transfer complete callback */ +1917:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmatx->XferCpltCallback = SPI_DMATransmitCplt; +1918:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1919:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set the DMA error callback */ +1920:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmatx->XferErrorCallback = SPI_DMAError; +1921:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1922:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set the DMA AbortCpltCallback */ +1923:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmatx->XferAbortCallback = NULL; +1924:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1925:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMATX); +1926:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Packing mode is enabled only if the DMA setting is HALWORD */ +1927:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((hspi->Init.DataSize <= SPI_DATASIZE_8BIT) && (hspi->hdmatx->Init.MemDataAlignment == DMA_MDA +1928:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1929:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check the even/odd of the data size + crc if enabled */ +1930:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((hspi->TxXferCount & 0x1U) == 0U) +1931:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1932:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMATX); +1933:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = (hspi->TxXferCount >> 1U); +1934:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1935:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else +1936:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1937:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->Instance->CR2, SPI_CR2_LDMATX); +1938:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = (hspi->TxXferCount >> 1U) + 1U; +1939:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1940:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1941:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1942:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Enable the Tx DMA Stream/Channel */ +1943:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (HAL_OK != HAL_DMA_Start_IT(hspi->hdmatx, (uint32_t)hspi->pTxBuffPtr, (uint32_t)&hspi->Instanc +1944:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount)) +1945:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1946:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Update SPI error code */ +1947:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA); +1948:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_ERROR; +1949:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1950:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_READY; +1951:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; +1952:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1953:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1954:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check if the SPI is already enabled */ +1955:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) +1956:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1957:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Enable SPI peripheral */ +1958:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_ENABLE(hspi); +1959:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1960:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1961:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Enable the SPI Error Interrupt Bit */ +1962:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_ERR)); +1963:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1964:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Enable Tx DMA Request */ +1965:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN); +1966:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1967:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** error : +1968:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Process Unlocked */ + ARM GAS /tmp/ccywxtmH.s page 36 + + +1969:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_UNLOCK(hspi); +1970:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return errorcode; +1971:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +1972:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1973:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +1974:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Receive an amount of data in non-blocking mode with DMA. +1975:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @note In case of MASTER mode and SPI_DIRECTION_2LINES direction, hdmatx shall be defined. +1976:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains +1977:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for SPI module. +1978:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param pData pointer to data buffer +1979:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @note When the CRC feature is enabled the pData Length must be Size + 1. +1980:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param Size amount of data to be sent +1981:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval HAL status +1982:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +1983:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef HAL_SPI_Receive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size) +1984:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1985:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef errorcode = HAL_OK; +1986:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1987:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check rx dma handle */ +1988:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** assert_param(IS_SPI_DMA_HANDLE(hspi->hdmarx)); +1989:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1990:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((hspi->Init.Direction == SPI_DIRECTION_2LINES) && (hspi->Init.Mode == SPI_MODE_MASTER)) +1991:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +1992:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_BUSY_RX; +1993:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1994:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check tx dma handle */ +1995:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** assert_param(IS_SPI_DMA_HANDLE(hspi->hdmatx)); +1996:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +1997:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line +1998:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return HAL_SPI_TransmitReceive_DMA(hspi, pData, pData, Size); +1999:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2000:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2001:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Process Locked */ +2002:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_LOCK(hspi); +2003:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2004:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->State != HAL_SPI_STATE_READY) +2005:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2006:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_BUSY; +2007:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; +2008:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2009:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2010:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((pData == NULL) || (Size == 0U)) +2011:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2012:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_ERROR; +2013:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; +2014:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2015:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2016:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set the transaction information */ +2017:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_BUSY_RX; +2018:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_NONE; +2019:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr = (uint8_t *)pData; +2020:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferSize = Size; +2021:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = Size; +2022:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2023:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /*Init field not used in handle to zero */ +2024:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxISR = NULL; +2025:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxISR = NULL; + ARM GAS /tmp/ccywxtmH.s page 37 + + +2026:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferSize = 0U; +2027:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = 0U; +2028:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2029:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Configure communication direction : 1Line */ +2030:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.Direction == SPI_DIRECTION_1LINE) +2031:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2032:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable SPI Peripheral before set 1Line direction (BIDIOE bit) */ +2033:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_DISABLE(hspi); +2034:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_1LINE_RX(hspi); +2035:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2036:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2037:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) +2038:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Reset CRC Calculation */ +2039:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) +2040:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2041:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_RESET_CRC(hspi); +2042:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2043:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ +2044:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2045:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if defined (STM32F302xC) || defined (STM32F303xC) || defined (STM32F373xC) || defined (STM32F358xx +2046:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Packing mode management is enabled by the DMA settings */ +2047:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((hspi->Init.DataSize <= SPI_DATASIZE_8BIT) && (hspi->hdmarx->Init.MemDataAlignment == DMA_MDA +2048:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2049:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Restriction the DMA data received is not allowed in this mode */ +2050:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_ERROR; +2051:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; +2052:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2053:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* STM32F302xC || STM32F303xC || STM32F373xC || STM32F358xx || STM32F378xx */ +2054:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2055:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMARX); +2056:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) +2057:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2058:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set RX Fifo threshold according the reception data length: 16bit */ +2059:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); +2060:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2061:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else +2062:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2063:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set RX Fifo threshold according the reception data length: 8bit */ +2064:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); +2065:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2066:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->hdmarx->Init.MemDataAlignment == DMA_MDATAALIGN_HALFWORD) +2067:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2068:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set RX Fifo threshold according the reception data length: 16bit */ +2069:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); +2070:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2071:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((hspi->RxXferCount & 0x1U) == 0x0U) +2072:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2073:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMARX); +2074:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = hspi->RxXferCount >> 1U; +2075:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2076:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else +2077:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2078:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->Instance->CR2, SPI_CR2_LDMARX); +2079:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = (hspi->RxXferCount >> 1U) + 1U; +2080:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2081:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2082:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + ARM GAS /tmp/ccywxtmH.s page 38 + + +2083:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2084:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set the SPI RxDMA Half transfer complete callback */ +2085:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmarx->XferHalfCpltCallback = SPI_DMAHalfReceiveCplt; +2086:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2087:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set the SPI Rx DMA transfer complete callback */ +2088:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmarx->XferCpltCallback = SPI_DMAReceiveCplt; +2089:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2090:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set the DMA error callback */ +2091:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmarx->XferErrorCallback = SPI_DMAError; +2092:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2093:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set the DMA AbortCpltCallback */ +2094:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmarx->XferAbortCallback = NULL; +2095:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2096:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Enable the Rx DMA Stream/Channel */ +2097:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (HAL_OK != HAL_DMA_Start_IT(hspi->hdmarx, (uint32_t)&hspi->Instance->DR, (uint32_t)hspi->pRxBu +2098:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount)) +2099:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2100:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Update SPI error code */ +2101:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA); +2102:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_ERROR; +2103:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_READY; +2105:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; +2106:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2107:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2108:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check if the SPI is already enabled */ +2109:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) +2110:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2111:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Enable SPI peripheral */ +2112:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_ENABLE(hspi); +2113:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2114:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2115:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Enable the SPI Error Interrupt Bit */ +2116:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_ERR)); +2117:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2118:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Enable Rx DMA Request */ +2119:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->Instance->CR2, SPI_CR2_RXDMAEN); +2120:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2121:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** error: +2122:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Process Unlocked */ +2123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_UNLOCK(hspi); +2124:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return errorcode; +2125:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2126:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2127:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +2128:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Transmit and Receive an amount of data in non-blocking mode with DMA. +2129:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains +2130:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for SPI module. +2131:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param pTxData pointer to transmission data buffer +2132:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param pRxData pointer to reception data buffer +2133:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @note When the CRC feature is enabled the pRxData Length must be Size + 1 +2134:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param Size amount of data to be sent +2135:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval HAL status +2136:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +2137:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef HAL_SPI_TransmitReceive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *p +2138:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint16_t Size) +2139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + ARM GAS /tmp/ccywxtmH.s page 39 + + +2140:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t tmp_mode; +2141:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_SPI_StateTypeDef tmp_state; +2142:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef errorcode = HAL_OK; +2143:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2144:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check rx & tx dma handles */ +2145:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** assert_param(IS_SPI_DMA_HANDLE(hspi->hdmarx)); +2146:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** assert_param(IS_SPI_DMA_HANDLE(hspi->hdmatx)); +2147:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2148:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check Direction parameter */ +2149:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** assert_param(IS_SPI_DIRECTION_2LINES(hspi->Init.Direction)); +2150:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2151:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Process locked */ +2152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_LOCK(hspi); +2153:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2154:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Init temporary variables */ +2155:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** tmp_state = hspi->State; +2156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** tmp_mode = hspi->Init.Mode; +2157:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2158:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (!((tmp_state == HAL_SPI_STATE_READY) || +2159:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** ((tmp_mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES) && (tmp_st +2160:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_BUSY; +2162:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; +2163:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2164:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U)) +2166:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_ERROR; +2168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; +2169:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2171:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Don't overwrite in case of HAL_SPI_STATE_BUSY_RX */ +2172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->State != HAL_SPI_STATE_BUSY_RX) +2173:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2174:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_BUSY_TX_RX; +2175:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2176:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2177:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set the transaction information */ +2178:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_NONE; +2179:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr = (uint8_t *)pTxData; +2180:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferSize = Size; +2181:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = Size; +2182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr = (uint8_t *)pRxData; +2183:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferSize = Size; +2184:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = Size; +2185:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Init field not used in handle to zero */ +2187:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxISR = NULL; +2188:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxISR = NULL; +2189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2190:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) +2191:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Reset CRC Calculation */ +2192:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) +2193:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2194:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_RESET_CRC(hspi); +2195:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2196:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ + ARM GAS /tmp/ccywxtmH.s page 40 + + +2197:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2198:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if defined (STM32F302xC) || defined (STM32F303xC) || defined (STM32F373xC) || defined (STM32F358xx +2199:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Packing mode management is enabled by the DMA settings */ +2200:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((hspi->Init.DataSize <= SPI_DATASIZE_8BIT) && (hspi->hdmarx->Init.MemDataAlignment == DMA_MDA +2201:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Restriction the DMA data received is not allowed in this mode */ +2203:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_ERROR; +2204:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; +2205:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2206:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* STM32F302xC || STM32F303xC || STM32F373xC || STM32F358xx || STM32F378xx */ +2207:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2208:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Reset the threshold bit */ +2209:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMATX | SPI_CR2_LDMARX); +2210:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2211:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* The packing mode management is enabled by the DMA settings according the spi data size */ +2212:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) +2213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2214:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set fiforxthreshold according the reception data length: 16bit */ +2215:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); +2216:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2217:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else +2218:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2219:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set RX Fifo threshold according the reception data length: 8bit */ +2220:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); +2221:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2222:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->hdmatx->Init.MemDataAlignment == DMA_MDATAALIGN_HALFWORD) +2223:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2224:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((hspi->TxXferSize & 0x1U) == 0x0U) +2225:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2226:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMATX); +2227:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = hspi->TxXferCount >> 1U; +2228:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2229:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else +2230:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2231:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->Instance->CR2, SPI_CR2_LDMATX); +2232:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = (hspi->TxXferCount >> 1U) + 1U; +2233:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2234:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2235:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2236:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->hdmarx->Init.MemDataAlignment == DMA_MDATAALIGN_HALFWORD) +2237:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2238:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set RX Fifo threshold according the reception data length: 16bit */ +2239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); +2240:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2241:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((hspi->RxXferCount & 0x1U) == 0x0U) +2242:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2243:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_LDMARX); +2244:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = hspi->RxXferCount >> 1U; +2245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2246:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else +2247:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2248:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->Instance->CR2, SPI_CR2_LDMARX); +2249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = (hspi->RxXferCount >> 1U) + 1U; +2250:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2251:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2252:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2253:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + ARM GAS /tmp/ccywxtmH.s page 41 + + +2254:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check if we are in Rx only or in Rx/Tx Mode and configure the DMA transfer complete callback * +2255:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->State == HAL_SPI_STATE_BUSY_RX) +2256:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2257:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set the SPI Rx DMA Half transfer complete callback */ +2258:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmarx->XferHalfCpltCallback = SPI_DMAHalfReceiveCplt; +2259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmarx->XferCpltCallback = SPI_DMAReceiveCplt; +2260:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2261:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else +2262:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2263:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set the SPI Tx/Rx DMA Half transfer complete callback */ +2264:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmarx->XferHalfCpltCallback = SPI_DMAHalfTransmitReceiveCplt; +2265:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmarx->XferCpltCallback = SPI_DMATransmitReceiveCplt; +2266:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2267:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2268:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set the DMA error callback */ +2269:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmarx->XferErrorCallback = SPI_DMAError; +2270:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2271:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set the DMA AbortCpltCallback */ +2272:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmarx->XferAbortCallback = NULL; +2273:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2274:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Enable the Rx DMA Stream/Channel */ +2275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (HAL_OK != HAL_DMA_Start_IT(hspi->hdmarx, (uint32_t)&hspi->Instance->DR, (uint32_t)hspi->pRxBu +2276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount)) +2277:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2278:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Update SPI error code */ +2279:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA); +2280:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_ERROR; +2281:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2282:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_READY; +2283:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; +2284:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2285:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2286:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Enable Rx DMA Request */ +2287:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->Instance->CR2, SPI_CR2_RXDMAEN); +2288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2289:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set the SPI Tx DMA transfer complete callback as NULL because the communication closing +2290:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** is performed in DMA reception complete callback */ +2291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmatx->XferHalfCpltCallback = NULL; +2292:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmatx->XferCpltCallback = NULL; +2293:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmatx->XferErrorCallback = NULL; +2294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmatx->XferAbortCallback = NULL; +2295:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Enable the Tx DMA Stream/Channel */ +2297:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (HAL_OK != HAL_DMA_Start_IT(hspi->hdmatx, (uint32_t)hspi->pTxBuffPtr, (uint32_t)&hspi->Instanc +2298:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount)) +2299:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2300:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Update SPI error code */ +2301:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA); +2302:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_ERROR; +2303:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2304:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_READY; +2305:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; +2306:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2307:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2308:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check if the SPI is already enabled */ +2309:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((hspi->Instance->CR1 & SPI_CR1_SPE) != SPI_CR1_SPE) +2310:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + ARM GAS /tmp/ccywxtmH.s page 42 + + +2311:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Enable SPI peripheral */ +2312:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_ENABLE(hspi); +2313:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2314:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Enable the SPI Error Interrupt Bit */ +2315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_ENABLE_IT(hspi, (SPI_IT_ERR)); +2316:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Enable Tx DMA Request */ +2318:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN); +2319:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2320:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** error : +2321:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Process Unlocked */ +2322:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_UNLOCK(hspi); +2323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return errorcode; +2324:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2325:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2326:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +2327:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Abort ongoing transfer (blocking mode). +2328:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi SPI handle. +2329:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @note This procedure could be used for aborting any ongoing transfer (Tx and Rx), +2330:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * started in Interrupt or DMA mode. +2331:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * This procedure performs following operations : +2332:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * - Disable SPI Interrupts (depending of transfer direction) +2333:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * - Disable the DMA transfer in the peripheral register (if enabled) +2334:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * - Abort DMA transfer by calling HAL_DMA_Abort (in case of transfer in DMA mode) +2335:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * - Set handle State to READY +2336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @note This procedure is executed in blocking mode : when exiting function, Abort is considere +2337:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval HAL status +2338:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +2339:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef HAL_SPI_Abort(SPI_HandleTypeDef *hspi) +2340:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2341:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef errorcode; +2342:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __IO uint32_t count; +2343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __IO uint32_t resetcount; +2344:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2345:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Initialized local variable */ +2346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_OK; +2347:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** resetcount = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U); +2348:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** count = resetcount; +2349:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2350:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Clear ERRIE interrupt to avoid error interrupts generation during Abort procedure */ +2351:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_ERRIE); +2352:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2353:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable TXEIE, RXNEIE and ERRIE(mode fault event, overrun error, TI frame error) interrupts */ +2354:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXEIE)) +2355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2356:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxISR = SPI_AbortTx_ISR; +2357:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Wait HAL_SPI_STATE_ABORT state */ +2358:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** do +2359:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2360:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (count == 0U) +2361:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2362:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); +2363:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** break; +2364:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** count--; +2366:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } while (hspi->State != HAL_SPI_STATE_ABORT); +2367:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Reset Timeout Counter */ + ARM GAS /tmp/ccywxtmH.s page 43 + + +2368:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** count = resetcount; +2369:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2370:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2371:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXNEIE)) +2372:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxISR = SPI_AbortRx_ISR; +2374:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Wait HAL_SPI_STATE_ABORT state */ +2375:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** do +2376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2377:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (count == 0U) +2378:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2379:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); +2380:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** break; +2381:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2382:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** count--; +2383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } while (hspi->State != HAL_SPI_STATE_ABORT); +2384:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Reset Timeout Counter */ +2385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** count = resetcount; +2386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2387:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2388:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable the SPI DMA Tx request if enabled */ +2389:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXDMAEN)) +2390:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2391:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Abort the SPI DMA Tx Stream/Channel : use blocking DMA Abort API (no callback) */ +2392:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->hdmatx != NULL) +2393:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2394:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set the SPI DMA Abort callback : +2395:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** will lead to call HAL_SPI_AbortCpltCallback() at end of DMA abort procedure */ +2396:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmatx->XferAbortCallback = NULL; +2397:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2398:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Abort DMA Tx Handle linked to SPI Peripheral */ +2399:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (HAL_DMA_Abort(hspi->hdmatx) != HAL_OK) +2400:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_ABORT; +2402:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2403:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2404:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable Tx DMA Request */ +2405:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_TXDMAEN)); +2406:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK) +2408:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2409:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_ABORT; +2410:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2411:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2412:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable SPI Peripheral */ +2413:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_DISABLE(hspi); +2414:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2415:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Empty the FRLVL fifo */ +2416:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, SPI_DEFAULT_TIMEOUT, +2417:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2418:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_ABORT; +2419:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2420:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2421:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2422:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2423:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable the SPI DMA Rx request if enabled */ +2424:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXDMAEN)) + ARM GAS /tmp/ccywxtmH.s page 44 + + +2425:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2426:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Abort the SPI DMA Rx Stream/Channel : use blocking DMA Abort API (no callback) */ +2427:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->hdmarx != NULL) +2428:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2429:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set the SPI DMA Abort callback : +2430:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** will lead to call HAL_SPI_AbortCpltCallback() at end of DMA abort procedure */ +2431:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmarx->XferAbortCallback = NULL; +2432:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2433:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Abort DMA Rx Handle linked to SPI Peripheral */ +2434:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (HAL_DMA_Abort(hspi->hdmarx) != HAL_OK) +2435:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2436:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_ABORT; +2437:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2438:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2439:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable peripheral */ +2440:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_DISABLE(hspi); +2441:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2442:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Control the BSY flag */ +2443:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_BSY, RESET, SPI_DEFAULT_TIMEOUT, HAL_GetTick +2444:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2445:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_ABORT; +2446:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2447:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2448:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Empty the FRLVL fifo */ +2449:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, SPI_DEFAULT_TIMEOUT, +2450:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2451:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_ABORT; +2452:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2453:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2454:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable Rx DMA Request */ +2455:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_RXDMAEN)); +2456:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2457:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2458:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Reset Tx and Rx transfer counters */ +2459:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = 0U; +2460:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = 0U; +2461:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2462:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check error during Abort procedure */ +2463:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->ErrorCode == HAL_SPI_ERROR_ABORT) +2464:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2465:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* return HAL_Error in case of error during Abort procedure */ +2466:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_ERROR; +2467:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2468:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else +2469:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2470:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Reset errorCode */ +2471:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_NONE; +2472:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2473:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2474:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Clear the Error flags in the SR register */ +2475:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_OVRFLAG(hspi); +2476:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_FREFLAG(hspi); +2477:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2478:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Restore hspi->state to ready */ +2479:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_READY; +2480:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2481:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return errorcode; + ARM GAS /tmp/ccywxtmH.s page 45 + + +2482:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2483:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2484:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +2485:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Abort ongoing transfer (Interrupt mode). +2486:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi SPI handle. +2487:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @note This procedure could be used for aborting any ongoing transfer (Tx and Rx), +2488:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * started in Interrupt or DMA mode. +2489:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * This procedure performs following operations : +2490:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * - Disable SPI Interrupts (depending of transfer direction) +2491:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * - Disable the DMA transfer in the peripheral register (if enabled) +2492:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * - Abort DMA transfer by calling HAL_DMA_Abort_IT (in case of transfer in DMA mode) +2493:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * - Set handle State to READY +2494:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * - At abort completion, call user abort complete callback +2495:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be +2496:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * considered as completed only when user abort complete callback is executed (not when ex +2497:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval HAL status +2498:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +2499:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef HAL_SPI_Abort_IT(SPI_HandleTypeDef *hspi) +2500:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2501:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef errorcode; +2502:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t abortcplt ; +2503:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __IO uint32_t count; +2504:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __IO uint32_t resetcount; +2505:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2506:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Initialized local variable */ +2507:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_OK; +2508:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** abortcplt = 1U; +2509:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** resetcount = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U); +2510:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** count = resetcount; +2511:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2512:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Clear ERRIE interrupt to avoid error interrupts generation during Abort procedure */ +2513:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_ERRIE); +2514:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2515:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Change Rx and Tx Irq Handler to Disable TXEIE, RXNEIE and ERRIE interrupts */ +2516:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXEIE)) +2517:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2518:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxISR = SPI_AbortTx_ISR; +2519:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Wait HAL_SPI_STATE_ABORT state */ +2520:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** do +2521:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2522:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (count == 0U) +2523:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2524:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); +2525:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** break; +2526:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2527:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** count--; +2528:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } while (hspi->State != HAL_SPI_STATE_ABORT); +2529:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Reset Timeout Counter */ +2530:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** count = resetcount; +2531:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2532:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2533:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXNEIE)) +2534:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2535:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxISR = SPI_AbortRx_ISR; +2536:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Wait HAL_SPI_STATE_ABORT state */ +2537:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** do +2538:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + ARM GAS /tmp/ccywxtmH.s page 46 + + +2539:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (count == 0U) +2540:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2541:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); +2542:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** break; +2543:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2544:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** count--; +2545:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } while (hspi->State != HAL_SPI_STATE_ABORT); +2546:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Reset Timeout Counter */ +2547:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** count = resetcount; +2548:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2549:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2550:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* If DMA Tx and/or DMA Rx Handles are associated to SPI Handle, DMA Abort complete callbacks sho +2551:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** before any call to DMA Abort functions */ +2552:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* DMA Tx Handle is valid */ +2553:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->hdmatx != NULL) +2554:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2555:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set DMA Abort Complete callback if UART DMA Tx request if enabled. +2556:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** Otherwise, set it to NULL */ +2557:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXDMAEN)) +2558:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2559:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmatx->XferAbortCallback = SPI_DMATxAbortCallback; +2560:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2561:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else +2562:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2563:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmatx->XferAbortCallback = NULL; +2564:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2565:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2566:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* DMA Rx Handle is valid */ +2567:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->hdmarx != NULL) +2568:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2569:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set DMA Abort Complete callback if UART DMA Rx request if enabled. +2570:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** Otherwise, set it to NULL */ +2571:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXDMAEN)) +2572:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2573:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmarx->XferAbortCallback = SPI_DMARxAbortCallback; +2574:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2575:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else +2576:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2577:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmarx->XferAbortCallback = NULL; +2578:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2579:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2580:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2581:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable the SPI DMA Tx request if enabled */ +2582:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXDMAEN)) +2583:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2584:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Abort the SPI DMA Tx Stream/Channel */ +2585:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->hdmatx != NULL) +2586:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2587:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Abort DMA Tx Handle linked to SPI Peripheral */ +2588:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (HAL_DMA_Abort_IT(hspi->hdmatx) != HAL_OK) +2589:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2590:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmatx->XferAbortCallback = NULL; +2591:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_ABORT; +2592:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2593:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else +2594:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2595:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** abortcplt = 0U; + ARM GAS /tmp/ccywxtmH.s page 47 + + +2596:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2597:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2598:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2599:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable the SPI DMA Rx request if enabled */ +2600:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXDMAEN)) +2601:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2602:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Abort the SPI DMA Rx Stream/Channel */ +2603:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->hdmarx != NULL) +2604:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2605:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Abort DMA Rx Handle linked to SPI Peripheral */ +2606:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (HAL_DMA_Abort_IT(hspi->hdmarx) != HAL_OK) +2607:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2608:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmarx->XferAbortCallback = NULL; +2609:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_ABORT; +2610:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2611:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else +2612:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2613:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** abortcplt = 0U; +2614:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2615:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2616:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2617:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2618:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (abortcplt == 1U) +2619:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2620:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Reset Tx and Rx transfer counters */ +2621:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = 0U; +2622:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = 0U; +2623:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2624:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check error during Abort procedure */ +2625:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->ErrorCode == HAL_SPI_ERROR_ABORT) +2626:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2627:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* return HAL_Error in case of error during Abort procedure */ +2628:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_ERROR; +2629:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2630:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else +2631:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2632:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Reset errorCode */ +2633:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_NONE; +2634:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2635:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2636:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Clear the Error flags in the SR register */ +2637:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_OVRFLAG(hspi); +2638:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_FREFLAG(hspi); +2639:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2640:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Restore hspi->State to Ready */ +2641:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_READY; +2642:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2643:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* As no DMA to be aborted, call directly user Abort complete callback */ +2644:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) +2645:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->AbortCpltCallback(hspi); +2646:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #else +2647:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_SPI_AbortCpltCallback(hspi); +2648:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +2649:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2650:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2651:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return errorcode; +2652:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + ARM GAS /tmp/ccywxtmH.s page 48 + + +2653:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2654:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +2655:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Pause the DMA Transfer. +2656:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains +2657:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for the specified SPI module. +2658:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval HAL status +2659:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +2660:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef HAL_SPI_DMAPause(SPI_HandleTypeDef *hspi) +2661:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2662:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Process Locked */ +2663:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_LOCK(hspi); +2664:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2665:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable the SPI DMA Tx & Rx requests */ +2666:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN); +2667:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2668:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Process Unlocked */ +2669:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_UNLOCK(hspi); +2670:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2671:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return HAL_OK; +2672:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2673:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2674:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +2675:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Resume the DMA Transfer. +2676:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains +2677:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for the specified SPI module. +2678:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval HAL status +2679:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +2680:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef HAL_SPI_DMAResume(SPI_HandleTypeDef *hspi) +2681:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2682:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Process Locked */ +2683:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_LOCK(hspi); +2684:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2685:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Enable the SPI DMA Tx & Rx requests */ +2686:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN); +2687:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2688:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Process Unlocked */ +2689:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_UNLOCK(hspi); +2690:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2691:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return HAL_OK; +2692:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2693:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2694:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +2695:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Stop the DMA Transfer. +2696:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains +2697:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for the specified SPI module. +2698:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval HAL status +2699:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +2700:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef HAL_SPI_DMAStop(SPI_HandleTypeDef *hspi) +2701:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2702:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef errorcode = HAL_OK; +2703:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* The Lock is not implemented on this API to allow the user application +2704:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** to call the HAL SPI API under callbacks HAL_SPI_TxCpltCallback() or HAL_SPI_RxCpltCallback() o +2705:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** when calling HAL_DMA_Abort() API the DMA TX/RX Transfer complete interrupt is generated +2706:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** and the correspond call back is executed HAL_SPI_TxCpltCallback() or HAL_SPI_RxCpltCallback() +2707:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +2708:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2709:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Abort the SPI DMA tx Stream/Channel */ + ARM GAS /tmp/ccywxtmH.s page 49 + + +2710:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->hdmatx != NULL) +2711:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2712:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (HAL_OK != HAL_DMA_Abort(hspi->hdmatx)) +2713:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2714:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA); +2715:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_ERROR; +2716:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2717:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2718:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Abort the SPI DMA rx Stream/Channel */ +2719:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->hdmarx != NULL) +2720:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2721:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (HAL_OK != HAL_DMA_Abort(hspi->hdmarx)) +2722:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2723:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA); +2724:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_ERROR; +2725:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2726:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2727:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2728:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable the SPI DMA Tx & Rx requests */ +2729:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN); +2730:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_READY; +2731:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return errorcode; +2732:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2733:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2734:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +2735:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Handle SPI interrupt request. +2736:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains +2737:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for the specified SPI module. +2738:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval None +2739:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +2740:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** void HAL_SPI_IRQHandler(SPI_HandleTypeDef *hspi) +2741:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2742:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t itsource = hspi->Instance->CR2; +2743:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t itflag = hspi->Instance->SR; +2744:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2745:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* SPI in mode Receiver ----------------------------------------------------*/ +2746:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((SPI_CHECK_FLAG(itflag, SPI_FLAG_OVR) == RESET) && +2747:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (SPI_CHECK_FLAG(itflag, SPI_FLAG_RXNE) != RESET) && (SPI_CHECK_IT_SOURCE(itsource, SPI_IT_RXN +2748:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2749:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxISR(hspi); +2750:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return; +2751:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2752:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2753:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* SPI in mode Transmitter -------------------------------------------------*/ +2754:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((SPI_CHECK_FLAG(itflag, SPI_FLAG_TXE) != RESET) && (SPI_CHECK_IT_SOURCE(itsource, SPI_IT_TXE) +2755:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2756:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxISR(hspi); +2757:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return; +2758:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2759:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2760:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* SPI in Error Treatment --------------------------------------------------*/ +2761:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (((SPI_CHECK_FLAG(itflag, SPI_FLAG_MODF) != RESET) || (SPI_CHECK_FLAG(itflag, SPI_FLAG_OVR) != +2762:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** || (SPI_CHECK_FLAG(itflag, SPI_FLAG_FRE) != RESET)) && (SPI_CHECK_IT_SOURCE(itsource, SPI_IT +2763:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2764:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* SPI Overrun error interrupt occurred ----------------------------------*/ +2765:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (SPI_CHECK_FLAG(itflag, SPI_FLAG_OVR) != RESET) +2766:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + ARM GAS /tmp/ccywxtmH.s page 50 + + +2767:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->State != HAL_SPI_STATE_BUSY_TX) +2768:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2769:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_OVR); +2770:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_OVRFLAG(hspi); +2771:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2772:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else +2773:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2774:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_OVRFLAG(hspi); +2775:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return; +2776:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2777:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2778:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2779:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* SPI Mode Fault error interrupt occurred -------------------------------*/ +2780:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (SPI_CHECK_FLAG(itflag, SPI_FLAG_MODF) != RESET) +2781:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2782:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_MODF); +2783:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_MODFFLAG(hspi); +2784:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2785:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2786:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* SPI Frame error interrupt occurred ------------------------------------*/ +2787:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (SPI_CHECK_FLAG(itflag, SPI_FLAG_FRE) != RESET) +2788:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2789:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FRE); +2790:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_FREFLAG(hspi); +2791:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2792:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2793:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) +2794:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2795:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable all interrupts */ +2796:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_DISABLE_IT(hspi, SPI_IT_RXNE | SPI_IT_TXE | SPI_IT_ERR); +2797:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2798:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_READY; +2799:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable the SPI DMA requests if enabled */ +2800:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((HAL_IS_BIT_SET(itsource, SPI_CR2_TXDMAEN)) || (HAL_IS_BIT_SET(itsource, SPI_CR2_RXDMAEN) +2801:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2802:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN)); +2803:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2804:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Abort the SPI DMA Rx channel */ +2805:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->hdmarx != NULL) +2806:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2807:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set the SPI DMA Abort callback : +2808:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** will lead to call HAL_SPI_ErrorCallback() at end of DMA abort procedure */ +2809:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmarx->XferAbortCallback = SPI_DMAAbortOnError; +2810:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (HAL_OK != HAL_DMA_Abort_IT(hspi->hdmarx)) +2811:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2812:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); +2813:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2814:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2815:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Abort the SPI DMA Tx channel */ +2816:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->hdmatx != NULL) +2817:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2818:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set the SPI DMA Abort callback : +2819:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** will lead to call HAL_SPI_ErrorCallback() at end of DMA abort procedure */ +2820:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmatx->XferAbortCallback = SPI_DMAAbortOnError; +2821:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (HAL_OK != HAL_DMA_Abort_IT(hspi->hdmatx)) +2822:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2823:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); + ARM GAS /tmp/ccywxtmH.s page 51 + + +2824:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2825:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2826:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2827:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else +2828:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2829:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Call user error callback */ +2830:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) +2831:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCallback(hspi); +2832:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #else +2833:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_SPI_ErrorCallback(hspi); +2834:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +2835:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2836:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2837:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return; +2838:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2839:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2840:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2841:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +2842:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Tx Transfer completed callback. +2843:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains +2844:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for SPI module. +2845:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval None +2846:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +2847:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __weak void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi) +2848:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2849:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Prevent unused argument(s) compilation warning */ +2850:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** UNUSED(hspi); +2851:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2852:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* NOTE : This function should not be modified, when the callback is needed, +2853:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** the HAL_SPI_TxCpltCallback should be implemented in the user file +2854:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +2855:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2856:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2857:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +2858:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Rx Transfer completed callback. +2859:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains +2860:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for SPI module. +2861:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval None +2862:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +2863:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __weak void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi) +2864:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2865:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Prevent unused argument(s) compilation warning */ +2866:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** UNUSED(hspi); +2867:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2868:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* NOTE : This function should not be modified, when the callback is needed, +2869:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** the HAL_SPI_RxCpltCallback should be implemented in the user file +2870:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +2871:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2872:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2873:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +2874:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Tx and Rx Transfer completed callback. +2875:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains +2876:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for SPI module. +2877:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval None +2878:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +2879:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __weak void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi) +2880:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + ARM GAS /tmp/ccywxtmH.s page 52 + + +2881:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Prevent unused argument(s) compilation warning */ +2882:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** UNUSED(hspi); +2883:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2884:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* NOTE : This function should not be modified, when the callback is needed, +2885:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** the HAL_SPI_TxRxCpltCallback should be implemented in the user file +2886:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +2887:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2888:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2889:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +2890:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Tx Half Transfer completed callback. +2891:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains +2892:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for SPI module. +2893:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval None +2894:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +2895:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __weak void HAL_SPI_TxHalfCpltCallback(SPI_HandleTypeDef *hspi) +2896:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2897:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Prevent unused argument(s) compilation warning */ +2898:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** UNUSED(hspi); +2899:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2900:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* NOTE : This function should not be modified, when the callback is needed, +2901:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** the HAL_SPI_TxHalfCpltCallback should be implemented in the user file +2902:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +2903:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2904:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2905:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +2906:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Rx Half Transfer completed callback. +2907:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains +2908:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for SPI module. +2909:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval None +2910:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +2911:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __weak void HAL_SPI_RxHalfCpltCallback(SPI_HandleTypeDef *hspi) +2912:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2913:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Prevent unused argument(s) compilation warning */ +2914:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** UNUSED(hspi); +2915:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2916:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* NOTE : This function should not be modified, when the callback is needed, +2917:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** the HAL_SPI_RxHalfCpltCallback() should be implemented in the user file +2918:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +2919:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2920:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2921:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +2922:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Tx and Rx Half Transfer callback. +2923:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains +2924:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for SPI module. +2925:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval None +2926:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +2927:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __weak void HAL_SPI_TxRxHalfCpltCallback(SPI_HandleTypeDef *hspi) +2928:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2929:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Prevent unused argument(s) compilation warning */ +2930:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** UNUSED(hspi); +2931:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2932:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* NOTE : This function should not be modified, when the callback is needed, +2933:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** the HAL_SPI_TxRxHalfCpltCallback() should be implemented in the user file +2934:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +2935:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2936:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2937:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** + ARM GAS /tmp/ccywxtmH.s page 53 + + +2938:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief SPI error callback. +2939:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains +2940:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for SPI module. +2941:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval None +2942:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +2943:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __weak void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi) +2944:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2945:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Prevent unused argument(s) compilation warning */ +2946:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** UNUSED(hspi); +2947:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2948:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* NOTE : This function should not be modified, when the callback is needed, +2949:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** the HAL_SPI_ErrorCallback should be implemented in the user file +2950:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +2951:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* NOTE : The ErrorCode parameter in the hspi handle is updated by the SPI processes +2952:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** and user can use HAL_SPI_GetError() API to check the latest error occurred +2953:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +2954:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2955:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2956:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +2957:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief SPI Abort Complete callback. +2958:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi SPI handle. +2959:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval None +2960:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +2961:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __weak void HAL_SPI_AbortCpltCallback(SPI_HandleTypeDef *hspi) +2962:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2963:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Prevent unused argument(s) compilation warning */ +2964:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** UNUSED(hspi); +2965:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2966:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* NOTE : This function should not be modified, when the callback is needed, +2967:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** the HAL_SPI_AbortCpltCallback can be implemented in the user file. +2968:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +2969:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +2970:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2971:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +2972:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @} +2973:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +2974:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2975:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** @defgroup SPI_Exported_Functions_Group3 Peripheral State and Errors functions +2976:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief SPI control functions +2977:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * +2978:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** @verbatim +2979:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** =============================================================================== +2980:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** ##### Peripheral State and Errors functions ##### +2981:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** =============================================================================== +2982:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** [..] +2983:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** This subsection provides a set of functions allowing to control the SPI. +2984:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (+) HAL_SPI_GetState() API can be helpful to check in run-time the state of the SPI peripheral +2985:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (+) HAL_SPI_GetError() check in run-time Errors occurring during communication +2986:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** @endverbatim +2987:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @{ +2988:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +2989:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +2990:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +2991:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Return the SPI handle state. +2992:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains +2993:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for SPI module. +2994:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval SPI state + ARM GAS /tmp/ccywxtmH.s page 54 + + +2995:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +2996:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_SPI_StateTypeDef HAL_SPI_GetState(SPI_HandleTypeDef *hspi) +2997:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +2998:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Return SPI handle state */ +2999:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return hspi->State; +3000:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3001:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3002:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +3003:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Return the SPI error code. +3004:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains +3005:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for SPI module. +3006:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval SPI error code in bitmap format +3007:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +3008:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t HAL_SPI_GetError(SPI_HandleTypeDef *hspi) +3009:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3010:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Return SPI ErrorCode */ +3011:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return hspi->ErrorCode; +3012:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3013:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3014:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +3015:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @} +3016:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +3017:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3018:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +3019:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @} +3020:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +3021:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3022:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** @addtogroup SPI_Private_Functions +3023:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Private functions +3024:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @{ +3025:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +3026:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3027:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +3028:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief DMA SPI transmit process complete callback. +3029:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hdma pointer to a DMA_HandleTypeDef structure that contains +3030:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for the specified DMA module. +3031:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval None +3032:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +3033:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_DMATransmitCplt(DMA_HandleTypeDef *hdma) +3034:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3035:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogati +3036:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t tickstart; +3037:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3038:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Init tickstart for timeout management*/ +3039:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** tickstart = HAL_GetTick(); +3040:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3041:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* DMA Normal Mode */ +3042:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((hdma->Instance->CCR & DMA_CCR_CIRC) != DMA_CCR_CIRC) +3043:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3044:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable ERR interrupt */ +3045:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_DISABLE_IT(hspi, SPI_IT_ERR); +3046:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3047:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable Tx DMA Request */ +3048:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN); +3049:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3050:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check the end of the transaction */ +3051:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK) + ARM GAS /tmp/ccywxtmH.s page 55 + + +3052:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3053:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); +3054:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3055:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3056:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Clear overrun flag in 2 Lines communication mode because received data is not read */ +3057:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.Direction == SPI_DIRECTION_2LINES) +3058:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3059:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_OVRFLAG(hspi); +3060:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3061:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3062:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = 0U; +3063:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_READY; +3064:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3065:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) +3066:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3067:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Call user error callback */ +3068:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) +3069:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCallback(hspi); +3070:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #else +3071:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_SPI_ErrorCallback(hspi); +3072:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +3073:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return; +3074:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3075:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3076:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Call user Tx complete callback */ +3077:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) +3078:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxCpltCallback(hspi); +3079:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #else +3080:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_SPI_TxCpltCallback(hspi); +3081:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +3082:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3083:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3084:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +3085:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief DMA SPI receive process complete callback. +3086:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hdma pointer to a DMA_HandleTypeDef structure that contains +3087:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for the specified DMA module. +3088:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval None +3089:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +3090:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_DMAReceiveCplt(DMA_HandleTypeDef *hdma) +3091:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3092:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogati +3093:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t tickstart; +3094:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) +3095:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __IO uint32_t tmpreg = 0U; +3096:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __IO uint8_t * ptmpreg8; +3097:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __IO uint8_t tmpreg8 = 0; +3098:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ +3099:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3100:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Init tickstart for timeout management*/ +3101:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** tickstart = HAL_GetTick(); +3102:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3103:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* DMA Normal Mode */ +3104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((hdma->Instance->CCR & DMA_CCR_CIRC) != DMA_CCR_CIRC) +3105:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3106:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable ERR interrupt */ +3107:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_DISABLE_IT(hspi, SPI_IT_ERR); +3108:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + ARM GAS /tmp/ccywxtmH.s page 56 + + +3109:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) +3110:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* CRC handling */ +3111:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) +3112:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3113:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Wait until RXNE flag */ +3114:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, SPI_DEFAULT_TIMEOUT, tickstart) ! +3115:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3116:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Error on the CRC reception */ +3117:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); +3118:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3119:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Read CRC */ +3120:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) +3121:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3122:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Read 16bit CRC */ +3123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** tmpreg = READ_REG(hspi->Instance->DR); +3124:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* To avoid GCC warning */ +3125:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** UNUSED(tmpreg); +3126:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3127:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else +3128:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3129:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Initialize the 8bit temporary pointer */ +3130:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** ptmpreg8 = (__IO uint8_t *)&hspi->Instance->DR; +3131:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Read 8bit CRC */ +3132:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** tmpreg8 = *ptmpreg8; +3133:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* To avoid GCC warning */ +3134:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** UNUSED(tmpreg8); +3135:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3136:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.CRCLength == SPI_CRC_LENGTH_16BIT) +3137:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3138:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_RXNE, SET, SPI_DEFAULT_TIMEOUT, tickstar +3139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3140:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Error on the CRC reception */ +3141:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); +3142:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3143:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Read 8bit CRC again in case of 16bit CRC in 8bit Data mode */ +3144:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** tmpreg8 = *ptmpreg8; +3145:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* To avoid GCC warning */ +3146:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** UNUSED(tmpreg8); +3147:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3148:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3149:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3150:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ +3151:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check if we are in Master RX 2 line mode */ +3153:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((hspi->Init.Direction == SPI_DIRECTION_2LINES) && (hspi->Init.Mode == SPI_MODE_MASTER)) +3154:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3155:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable Rx/Tx DMA Request (done by default to handle the case master rx direction 2 lines) +3156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN); +3157:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3158:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else +3159:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3160:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Normal case */ +3161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_RXDMAEN); +3162:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3163:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3164:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check the end of the transaction */ +3165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (SPI_EndRxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK) + ARM GAS /tmp/ccywxtmH.s page 57 + + +3166:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_FLAG; +3168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3169:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = 0U; +3171:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_READY; +3172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3173:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) +3174:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check if CRC error occurred */ +3175:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR)) +3176:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3177:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); +3178:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_CRCERRFLAG(hspi); +3179:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3180:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ +3181:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) +3183:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3184:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Call user error callback */ +3185:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) +3186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCallback(hspi); +3187:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #else +3188:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_SPI_ErrorCallback(hspi); +3189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +3190:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return; +3191:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3192:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3193:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Call user Rx complete callback */ +3194:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) +3195:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxCpltCallback(hspi); +3196:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #else +3197:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_SPI_RxCpltCallback(hspi); +3198:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +3199:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3200:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3201:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +3202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief DMA SPI transmit receive process complete callback. +3203:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hdma pointer to a DMA_HandleTypeDef structure that contains +3204:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for the specified DMA module. +3205:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval None +3206:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +3207:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_DMATransmitReceiveCplt(DMA_HandleTypeDef *hdma) +3208:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3209:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogati +3210:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t tickstart; +3211:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) +3212:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __IO uint32_t tmpreg = 0U; +3213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __IO uint8_t * ptmpreg8; +3214:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __IO uint8_t tmpreg8 = 0; +3215:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ +3216:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3217:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Init tickstart for timeout management*/ +3218:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** tickstart = HAL_GetTick(); +3219:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3220:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* DMA Normal Mode */ +3221:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((hdma->Instance->CCR & DMA_CCR_CIRC) != DMA_CCR_CIRC) +3222:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + ARM GAS /tmp/ccywxtmH.s page 58 + + +3223:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable ERR interrupt */ +3224:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_DISABLE_IT(hspi, SPI_IT_ERR); +3225:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3226:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) +3227:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* CRC handling */ +3228:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) +3229:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3230:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((hspi->Init.DataSize == SPI_DATASIZE_8BIT) && (hspi->Init.CRCLength == SPI_CRC_LENGTH_8BI +3231:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3232:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_QUARTER_FULL, SPI_DEFAULT +3233:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** tickstart) != HAL_OK) +3234:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3235:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Error on the CRC reception */ +3236:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); +3237:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3238:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Initialize the 8bit temporary pointer */ +3239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** ptmpreg8 = (__IO uint8_t *)&hspi->Instance->DR; +3240:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Read 8bit CRC */ +3241:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** tmpreg8 = *ptmpreg8; +3242:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* To avoid GCC warning */ +3243:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** UNUSED(tmpreg8); +3244:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else +3246:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3247:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_HALF_FULL, SPI_DEFAULT_TI +3248:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Error on the CRC reception */ +3250:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); +3251:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3252:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Read CRC to Flush DR and RXNE flag */ +3253:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** tmpreg = READ_REG(hspi->Instance->DR); +3254:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* To avoid GCC warning */ +3255:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** UNUSED(tmpreg); +3256:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3257:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3258:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ +3259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3260:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check the end of the transaction */ +3261:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK) +3262:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3263:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); +3264:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3265:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3266:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable Rx/Tx DMA Request */ +3267:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN); +3268:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3269:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = 0U; +3270:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = 0U; +3271:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_READY; +3272:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3273:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) +3274:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check if CRC error occurred */ +3275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR)) +3276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3277:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); +3278:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_CRCERRFLAG(hspi); +3279:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + ARM GAS /tmp/ccywxtmH.s page 59 + + +3280:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ +3281:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3282:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) +3283:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3284:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Call user error callback */ +3285:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) +3286:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCallback(hspi); +3287:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #else +3288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_SPI_ErrorCallback(hspi); +3289:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +3290:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return; +3291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3292:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3293:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Call user TxRx complete callback */ +3294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) +3295:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxRxCpltCallback(hspi); +3296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #else +3297:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_SPI_TxRxCpltCallback(hspi); +3298:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +3299:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3300:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3301:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +3302:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief DMA SPI half transmit process complete callback. +3303:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hdma pointer to a DMA_HandleTypeDef structure that contains +3304:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for the specified DMA module. +3305:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval None +3306:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +3307:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_DMAHalfTransmitCplt(DMA_HandleTypeDef *hdma) +3308:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3309:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogati +3310:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3311:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Call user Tx half complete callback */ +3312:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) +3313:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxHalfCpltCallback(hspi); +3314:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #else +3315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_SPI_TxHalfCpltCallback(hspi); +3316:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +3317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3318:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3319:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +3320:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief DMA SPI half receive process complete callback +3321:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hdma pointer to a DMA_HandleTypeDef structure that contains +3322:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for the specified DMA module. +3323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval None +3324:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +3325:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_DMAHalfReceiveCplt(DMA_HandleTypeDef *hdma) +3326:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3327:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogati +3328:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3329:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Call user Rx half complete callback */ +3330:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) +3331:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxHalfCpltCallback(hspi); +3332:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #else +3333:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_SPI_RxHalfCpltCallback(hspi); +3334:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +3335:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + ARM GAS /tmp/ccywxtmH.s page 60 + + +3337:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +3338:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief DMA SPI half transmit receive process complete callback. +3339:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hdma pointer to a DMA_HandleTypeDef structure that contains +3340:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for the specified DMA module. +3341:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval None +3342:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +3343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_DMAHalfTransmitReceiveCplt(DMA_HandleTypeDef *hdma) +3344:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3345:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogati +3346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3347:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Call user TxRx half complete callback */ +3348:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) +3349:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxRxHalfCpltCallback(hspi); +3350:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #else +3351:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_SPI_TxRxHalfCpltCallback(hspi); +3352:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +3353:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3354:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +3356:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief DMA SPI communication error callback. +3357:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hdma pointer to a DMA_HandleTypeDef structure that contains +3358:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for the specified DMA module. +3359:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval None +3360:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +3361:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_DMAError(DMA_HandleTypeDef *hdma) +3362:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3363:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogati +3364:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Stop the disable DMA transfer on SPI side */ +3366:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN); +3367:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3368:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_DMA); +3369:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_READY; +3370:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Call user error callback */ +3371:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) +3372:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCallback(hspi); +3373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #else +3374:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_SPI_ErrorCallback(hspi); +3375:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +3376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3377:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3378:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +3379:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief DMA SPI communication abort callback, when initiated by HAL services on Error +3380:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * (To be called at end of DMA Abort procedure following error occurrence). +3381:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hdma DMA handle. +3382:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval None +3383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +3384:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_DMAAbortOnError(DMA_HandleTypeDef *hdma) +3385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogati +3387:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = 0U; +3388:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = 0U; +3389:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3390:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Call user error callback */ +3391:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) +3392:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCallback(hspi); +3393:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #else + ARM GAS /tmp/ccywxtmH.s page 61 + + +3394:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_SPI_ErrorCallback(hspi); +3395:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +3396:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3397:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3398:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +3399:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief DMA SPI Tx communication abort callback, when initiated by user +3400:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * (To be called at end of DMA Tx Abort procedure following user abort request). +3401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @note When this callback is executed, User Abort complete call back is called only if no +3402:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * Abort still ongoing for Rx DMA Handle. +3403:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hdma DMA handle. +3404:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval None +3405:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +3406:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_DMATxAbortCallback(DMA_HandleTypeDef *hdma) +3407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3408:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogati +3409:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3410:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmatx->XferAbortCallback = NULL; +3411:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3412:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable Tx DMA Request */ +3413:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_TXDMAEN); +3414:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3415:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK) +3416:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3417:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_ABORT; +3418:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3419:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3420:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable SPI Peripheral */ +3421:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_DISABLE(hspi); +3422:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3423:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Empty the FRLVL fifo */ +3424:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, SPI_DEFAULT_TIMEOUT, HAL +3425:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3426:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_ABORT; +3427:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3428:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3429:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check if an Abort process is still ongoing */ +3430:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->hdmarx != NULL) +3431:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3432:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->hdmarx->XferAbortCallback != NULL) +3433:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3434:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return; +3435:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3436:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3437:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3438:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* No Abort process still ongoing : All DMA Stream/Channel are aborted, call user Abort Complete +3439:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = 0U; +3440:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = 0U; +3441:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3442:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check no error during Abort procedure */ +3443:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->ErrorCode != HAL_SPI_ERROR_ABORT) +3444:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3445:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Reset errorCode */ +3446:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_NONE; +3447:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3448:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3449:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Clear the Error flags in the SR register */ +3450:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_OVRFLAG(hspi); + ARM GAS /tmp/ccywxtmH.s page 62 + + +3451:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_FREFLAG(hspi); +3452:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3453:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Restore hspi->State to Ready */ +3454:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_READY; +3455:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3456:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Call user Abort complete callback */ +3457:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) +3458:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->AbortCpltCallback(hspi); +3459:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #else +3460:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_SPI_AbortCpltCallback(hspi); +3461:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +3462:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3463:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3464:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +3465:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief DMA SPI Rx communication abort callback, when initiated by user +3466:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * (To be called at end of DMA Rx Abort procedure following user abort request). +3467:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @note When this callback is executed, User Abort complete call back is called only if no +3468:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * Abort still ongoing for Tx DMA Handle. +3469:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hdma DMA handle. +3470:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval None +3471:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +3472:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_DMARxAbortCallback(DMA_HandleTypeDef *hdma) +3473:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3474:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogati +3475:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3476:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable SPI Peripheral */ +3477:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_DISABLE(hspi); +3478:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3479:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmarx->XferAbortCallback = NULL; +3480:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3481:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable Rx DMA Request */ +3482:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** CLEAR_BIT(hspi->Instance->CR2, SPI_CR2_RXDMAEN); +3483:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3484:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Control the BSY flag */ +3485:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_BSY, RESET, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) +3486:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3487:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_ABORT; +3488:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3489:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3490:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Empty the FRLVL fifo */ +3491:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, SPI_DEFAULT_TIMEOUT, HAL +3492:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3493:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_ABORT; +3494:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3495:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3496:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check if an Abort process is still ongoing */ +3497:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->hdmatx != NULL) +3498:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3499:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->hdmatx->XferAbortCallback != NULL) +3500:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3501:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return; +3502:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3503:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3504:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3505:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* No Abort process still ongoing : All DMA Stream/Channel are aborted, call user Abort Complete +3506:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = 0U; +3507:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = 0U; + ARM GAS /tmp/ccywxtmH.s page 63 + + +3508:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3509:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check no error during Abort procedure */ +3510:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->ErrorCode != HAL_SPI_ERROR_ABORT) +3511:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3512:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Reset errorCode */ +3513:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_NONE; +3514:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3515:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3516:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Clear the Error flags in the SR register */ +3517:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_OVRFLAG(hspi); +3518:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_FREFLAG(hspi); +3519:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3520:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Restore hspi->State to Ready */ +3521:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_READY; +3522:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3523:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Call user Abort complete callback */ +3524:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) +3525:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->AbortCpltCallback(hspi); +3526:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #else +3527:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_SPI_AbortCpltCallback(hspi); +3528:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +3529:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3530:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3531:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +3532:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Rx 8-bit handler for Transmit and Receive in Interrupt mode. +3533:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains +3534:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for SPI module. +3535:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval None +3536:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +3537:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_2linesRxISR_8BIT(struct __SPI_HandleTypeDef *hspi) +3538:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3539:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Receive data in packing mode */ +3540:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->RxXferCount > 1U) +3541:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3542:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)(hspi->Instance->DR); +3543:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr += sizeof(uint16_t); +3544:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount -= 2U; +3545:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->RxXferCount == 1U) +3546:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3547:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set RX Fifo threshold according the reception data length: 8bit */ +3548:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); +3549:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3550:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3551:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Receive data in 8 Bit mode */ +3552:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else +3553:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3554:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** *hspi->pRxBuffPtr = *((__IO uint8_t *)&hspi->Instance->DR); +3555:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr++; +3556:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount--; +3557:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3558:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3559:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check end of the reception */ +3560:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->RxXferCount == 0U) +3561:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3562:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) +3563:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) +3564:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + ARM GAS /tmp/ccywxtmH.s page 64 + + +3565:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD); +3566:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxISR = SPI_2linesRxISR_8BITCRC; +3567:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return; +3568:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3569:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ +3570:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3571:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable RXNE and ERR interrupt */ +3572:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR)); +3573:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3574:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->TxXferCount == 0U) +3575:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3576:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_CloseRxTx_ISR(hspi); +3577:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3578:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3579:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3580:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3581:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) +3582:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +3583:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Rx 8-bit handler for Transmit and Receive in Interrupt mode. +3584:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains +3585:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for SPI module. +3586:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval None +3587:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +3588:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_2linesRxISR_8BITCRC(struct __SPI_HandleTypeDef *hspi) +3589:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3590:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __IO uint8_t * ptmpreg8; +3591:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __IO uint8_t tmpreg8 = 0; +3592:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3593:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Initialize the 8bit temporary pointer */ +3594:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** ptmpreg8 = (__IO uint8_t *)&hspi->Instance->DR; +3595:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Read 8bit CRC to flush Data Register */ +3596:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** tmpreg8 = *ptmpreg8; +3597:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* To avoid GCC warning */ +3598:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** UNUSED(tmpreg8); +3599:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3600:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->CRCSize--; +3601:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3602:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check end of the reception */ +3603:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->CRCSize == 0U) +3604:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3605:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable RXNE and ERR interrupt */ +3606:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR)); +3607:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3608:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->TxXferCount == 0U) +3609:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3610:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_CloseRxTx_ISR(hspi); +3611:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3612:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3613:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3614:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ +3615:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3616:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +3617:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Tx 8-bit handler for Transmit and Receive in Interrupt mode. +3618:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains +3619:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for SPI module. +3620:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval None +3621:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ + ARM GAS /tmp/ccywxtmH.s page 65 + + +3622:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_2linesTxISR_8BIT(struct __SPI_HandleTypeDef *hspi) +3623:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3624:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Transmit data in packing Bit mode */ +3625:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->TxXferCount >= 2U) +3626:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3627:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr); +3628:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); +3629:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount -= 2U; +3630:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3631:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Transmit data in 8 Bit mode */ +3632:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else +3633:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3634:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** *(__IO uint8_t *)&hspi->Instance->DR = (*hspi->pTxBuffPtr); +3635:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr++; +3636:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; +3637:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3638:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3639:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check the end of the transmission */ +3640:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->TxXferCount == 0U) +3641:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3642:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) +3643:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) +3644:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3645:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set CRC Next Bit to send CRC */ +3646:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); +3647:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable TXE interrupt */ +3648:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_DISABLE_IT(hspi, SPI_IT_TXE); +3649:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return; +3650:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3651:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ +3652:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3653:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable TXE interrupt */ +3654:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_DISABLE_IT(hspi, SPI_IT_TXE); +3655:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3656:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->RxXferCount == 0U) +3657:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3658:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_CloseRxTx_ISR(hspi); +3659:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3660:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3661:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3662:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3663:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +3664:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Rx 16-bit handler for Transmit and Receive in Interrupt mode. +3665:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains +3666:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for SPI module. +3667:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval None +3668:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +3669:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_2linesRxISR_16BIT(struct __SPI_HandleTypeDef *hspi) +3670:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3671:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Receive data in 16 Bit mode */ +3672:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)(hspi->Instance->DR); +3673:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr += sizeof(uint16_t); +3674:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount--; +3675:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3676:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->RxXferCount == 0U) +3677:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3678:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) + ARM GAS /tmp/ccywxtmH.s page 66 + + +3679:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) +3680:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3681:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxISR = SPI_2linesRxISR_16BITCRC; +3682:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return; +3683:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3684:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ +3685:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3686:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable RXNE interrupt */ +3687:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_DISABLE_IT(hspi, SPI_IT_RXNE); +3688:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3689:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->TxXferCount == 0U) +3690:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3691:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_CloseRxTx_ISR(hspi); +3692:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3693:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3694:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3695:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3696:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) +3697:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +3698:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Manage the CRC 16-bit receive for Transmit and Receive in Interrupt mode. +3699:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains +3700:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for SPI module. +3701:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval None +3702:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +3703:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_2linesRxISR_16BITCRC(struct __SPI_HandleTypeDef *hspi) +3704:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3705:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __IO uint32_t tmpreg = 0U; +3706:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3707:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Read 16bit CRC to flush Data Register */ +3708:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** tmpreg = READ_REG(hspi->Instance->DR); +3709:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* To avoid GCC warning */ +3710:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** UNUSED(tmpreg); +3711:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3712:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable RXNE interrupt */ +3713:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_DISABLE_IT(hspi, SPI_IT_RXNE); +3714:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3715:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_CloseRxTx_ISR(hspi); +3716:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3717:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ +3718:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3719:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +3720:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Tx 16-bit handler for Transmit and Receive in Interrupt mode. +3721:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains +3722:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for SPI module. +3723:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval None +3724:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +3725:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_2linesTxISR_16BIT(struct __SPI_HandleTypeDef *hspi) +3726:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3727:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Transmit data in 16 Bit mode */ +3728:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr); +3729:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); +3730:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; +3731:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3732:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Enable CRC Transmission */ +3733:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->TxXferCount == 0U) +3734:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3735:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) + ARM GAS /tmp/ccywxtmH.s page 67 + + +3736:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) +3737:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3738:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Set CRC Next Bit to send CRC */ +3739:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); +3740:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable TXE interrupt */ +3741:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_DISABLE_IT(hspi, SPI_IT_TXE); +3742:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return; +3743:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3744:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ +3745:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3746:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable TXE interrupt */ +3747:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_DISABLE_IT(hspi, SPI_IT_TXE); +3748:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3749:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->RxXferCount == 0U) +3750:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3751:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_CloseRxTx_ISR(hspi); +3752:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3753:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3754:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3755:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3756:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) +3757:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +3758:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Manage the CRC 8-bit receive in Interrupt context. +3759:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains +3760:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for SPI module. +3761:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval None +3762:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +3763:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_RxISR_8BITCRC(struct __SPI_HandleTypeDef *hspi) +3764:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3765:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __IO uint8_t * ptmpreg8; +3766:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __IO uint8_t tmpreg8 = 0; +3767:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3768:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Initialize the 8bit temporary pointer */ +3769:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** ptmpreg8 = (__IO uint8_t *)&hspi->Instance->DR; +3770:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Read 8bit CRC to flush Data Register */ +3771:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** tmpreg8 = *ptmpreg8; +3772:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* To avoid GCC warning */ +3773:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** UNUSED(tmpreg8); +3774:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3775:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->CRCSize--; +3776:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3777:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->CRCSize == 0U) +3778:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3779:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_CloseRx_ISR(hspi); +3780:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3781:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3782:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ +3783:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3784:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +3785:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Manage the receive 8-bit in Interrupt context. +3786:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains +3787:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for SPI module. +3788:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval None +3789:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +3790:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_RxISR_8BIT(struct __SPI_HandleTypeDef *hspi) +3791:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3792:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** *hspi->pRxBuffPtr = (*(__IO uint8_t *)&hspi->Instance->DR); + ARM GAS /tmp/ccywxtmH.s page 68 + + +3793:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr++; +3794:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount--; +3795:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3796:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) +3797:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Enable CRC Transmission */ +3798:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((hspi->RxXferCount == 1U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)) +3799:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3800:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); +3801:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3802:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ +3803:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3804:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->RxXferCount == 0U) +3805:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3806:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) +3807:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) +3808:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3809:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxISR = SPI_RxISR_8BITCRC; +3810:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return; +3811:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3812:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ +3813:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_CloseRx_ISR(hspi); +3814:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3815:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3816:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3817:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) +3818:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +3819:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Manage the CRC 16-bit receive in Interrupt context. +3820:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains +3821:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for SPI module. +3822:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval None +3823:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +3824:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_RxISR_16BITCRC(struct __SPI_HandleTypeDef *hspi) +3825:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3826:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __IO uint32_t tmpreg = 0U; +3827:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3828:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Read 16bit CRC to flush Data Register */ +3829:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** tmpreg = READ_REG(hspi->Instance->DR); +3830:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* To avoid GCC warning */ +3831:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** UNUSED(tmpreg); +3832:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3833:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable RXNE and ERR interrupt */ +3834:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR)); +3835:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3836:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_CloseRx_ISR(hspi); +3837:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3838:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ +3839:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3840:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +3841:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Manage the 16-bit receive in Interrupt context. +3842:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains +3843:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for SPI module. +3844:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval None +3845:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +3846:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_RxISR_16BIT(struct __SPI_HandleTypeDef *hspi) +3847:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3848:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)(hspi->Instance->DR); +3849:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr += sizeof(uint16_t); + ARM GAS /tmp/ccywxtmH.s page 69 + + +3850:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount--; +3851:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3852:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) +3853:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Enable CRC Transmission */ +3854:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((hspi->RxXferCount == 1U) && (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE)) +3855:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3856:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); +3857:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3858:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ +3859:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3860:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->RxXferCount == 0U) +3861:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3862:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) +3863:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) +3864:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3865:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxISR = SPI_RxISR_16BITCRC; +3866:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return; +3867:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3868:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ +3869:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_CloseRx_ISR(hspi); +3870:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3871:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3872:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3873:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +3874:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Handle the data 8-bit transmit in Interrupt mode. +3875:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains +3876:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for SPI module. +3877:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval None +3878:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +3879:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_TxISR_8BIT(struct __SPI_HandleTypeDef *hspi) +3880:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3881:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** *(__IO uint8_t *)&hspi->Instance->DR = (*hspi->pTxBuffPtr); +3882:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr++; +3883:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; +3884:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3885:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->TxXferCount == 0U) +3886:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3887:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) +3888:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) +3889:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3890:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Enable CRC Transmission */ +3891:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); +3892:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3893:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ +3894:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_CloseTx_ISR(hspi); +3895:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3896:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3897:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3898:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +3899:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Handle the data 16-bit transmit in Interrupt mode. +3900:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains +3901:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for SPI module. +3902:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval None +3903:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +3904:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_TxISR_16BIT(struct __SPI_HandleTypeDef *hspi) +3905:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3906:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Transmit data in 16 Bit mode */ + ARM GAS /tmp/ccywxtmH.s page 70 + + +3907:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->Instance->DR = *((uint16_t *)hspi->pTxBuffPtr); +3908:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); +3909:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; +3910:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3911:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->TxXferCount == 0U) +3912:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3913:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) +3914:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) +3915:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3916:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Enable CRC Transmission */ +3917:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->Instance->CR1, SPI_CR1_CRCNEXT); +3918:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3919:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ +3920:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_CloseTx_ISR(hspi); +3921:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3922:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3923:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3924:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +3925:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Handle SPI Communication Timeout. +3926:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains +3927:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for SPI module. +3928:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param Flag SPI flag to check +3929:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param State flag state to check +3930:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param Timeout Timeout duration +3931:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param Tickstart tick start value +3932:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval HAL status +3933:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +3934:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static HAL_StatusTypeDef SPI_WaitFlagStateUntilTimeout(SPI_HandleTypeDef *hspi, uint32_t Flag, Flag +3935:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t Timeout, uint32_t Tickstart) +3936:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 29 .loc 1 3936 1 view -0 + 30 .cfi_startproc + 31 @ args = 4, pretend = 0, frame = 8 + 32 @ frame_needed = 0, uses_anonymous_args = 0 + 33 .loc 1 3936 1 is_stmt 0 view .LVU1 + 34 0000 2DE9F047 push {r4, r5, r6, r7, r8, r9, r10, lr} + 35 .cfi_def_cfa_offset 32 + 36 .cfi_offset 4, -32 + 37 .cfi_offset 5, -28 + 38 .cfi_offset 6, -24 + 39 .cfi_offset 7, -20 + 40 .cfi_offset 8, -16 + 41 .cfi_offset 9, -12 + 42 .cfi_offset 10, -8 + 43 .cfi_offset 14, -4 + 44 0004 82B0 sub sp, sp, #8 + 45 .cfi_def_cfa_offset 40 + 46 0006 0546 mov r5, r0 + 47 0008 8846 mov r8, r1 + 48 000a 1746 mov r7, r2 + 49 000c 1E46 mov r6, r3 +3937:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __IO uint32_t count; + 50 .loc 1 3937 3 is_stmt 1 view .LVU2 +3938:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t tmp_timeout; + 51 .loc 1 3938 3 view .LVU3 +3939:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t tmp_tickstart; + 52 .loc 1 3939 3 view .LVU4 + ARM GAS /tmp/ccywxtmH.s page 71 + + +3940:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3941:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Adjust Timeout value in case of end of transfer */ +3942:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** tmp_timeout = Timeout - (HAL_GetTick() - Tickstart); + 53 .loc 1 3942 3 view .LVU5 + 54 .loc 1 3942 30 is_stmt 0 view .LVU6 + 55 000e FFF7FEFF bl HAL_GetTick + 56 .LVL1: + 57 .loc 1 3942 44 view .LVU7 + 58 0012 0A9B ldr r3, [sp, #40] + 59 0014 1B1A subs r3, r3, r0 + 60 .loc 1 3942 17 view .LVU8 + 61 0016 03EB0609 add r9, r3, r6 + 62 .LVL2: +3943:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** tmp_tickstart = HAL_GetTick(); + 63 .loc 1 3943 3 is_stmt 1 view .LVU9 + 64 .loc 1 3943 19 is_stmt 0 view .LVU10 + 65 001a FFF7FEFF bl HAL_GetTick + 66 .LVL3: + 67 001e 8246 mov r10, r0 + 68 .LVL4: +3944:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3945:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Calculate Timeout based on a software loop to avoid blocking issue if Systick is disabled */ +3946:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** count = tmp_timeout * ((SystemCoreClock * 32U) >> 20U); + 69 .loc 1 3946 3 is_stmt 1 view .LVU11 + 70 .loc 1 3946 43 is_stmt 0 view .LVU12 + 71 0020 284B ldr r3, .L16 + 72 0022 1B68 ldr r3, [r3] + 73 .loc 1 3946 50 view .LVU13 + 74 0024 C3F3CB33 ubfx r3, r3, #15, #12 + 75 .loc 1 3946 23 view .LVU14 + 76 0028 09FB03F3 mul r3, r9, r3 + 77 .loc 1 3946 9 view .LVU15 + 78 002c 0193 str r3, [sp, #4] +3947:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3948:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** while ((__HAL_SPI_GET_FLAG(hspi, Flag) ? SET : RESET) != State) + 79 .loc 1 3948 3 is_stmt 1 view .LVU16 + 80 .LVL5: + 81 .L3: + 82 .loc 1 3948 57 view .LVU17 + 83 .loc 1 3948 11 is_stmt 0 view .LVU18 + 84 002e 2B68 ldr r3, [r5] + 85 0030 9C68 ldr r4, [r3, #8] + 86 .loc 1 3948 48 view .LVU19 + 87 0032 38EA0404 bics r4, r8, r4 + 88 0036 0CBF ite eq + 89 0038 0123 moveq r3, #1 + 90 003a 0023 movne r3, #0 + 91 .loc 1 3948 57 view .LVU20 + 92 003c BB42 cmp r3, r7 + 93 003e 3DD0 beq .L12 +3949:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3950:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (Timeout != HAL_MAX_DELAY) + 94 .loc 1 3950 5 is_stmt 1 view .LVU21 + 95 .loc 1 3950 8 is_stmt 0 view .LVU22 + 96 0040 B6F1FF3F cmp r6, #-1 + 97 0044 F3D0 beq .L3 +3951:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + ARM GAS /tmp/ccywxtmH.s page 72 + + +3952:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (((HAL_GetTick() - tmp_tickstart) >= tmp_timeout) || (tmp_timeout == 0U)) + 98 .loc 1 3952 7 is_stmt 1 view .LVU23 + 99 .loc 1 3952 13 is_stmt 0 view .LVU24 + 100 0046 FFF7FEFF bl HAL_GetTick + 101 .LVL6: + 102 .loc 1 3952 27 view .LVU25 + 103 004a A0EB0A00 sub r0, r0, r10 + 104 .loc 1 3952 10 view .LVU26 + 105 004e 4845 cmp r0, r9 + 106 0050 07D2 bcs .L13 +3953:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3954:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable the SPI and reset the CRC: the CRC value should be cleared +3955:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** on both master and slave sides in order to resynchronize the master +3956:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** and slave for their respective CRC calculation */ +3957:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3958:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable TXE, RXNE and ERR interrupts for the interrupt process */ +3959:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_RXNE | SPI_IT_ERR)); +3960:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3961:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((hspi->Init.Mode == SPI_MODE_MASTER) && ((hspi->Init.Direction == SPI_DIRECTION_1LINE) +3962:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** || (hspi->Init.Direction == SPI_DIRECTION_2LIN +3963:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3964:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable SPI peripheral */ +3965:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_DISABLE(hspi); +3966:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3967:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3968:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Reset CRC Calculation */ +3969:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) +3970:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3971:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_RESET_CRC(hspi); +3972:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3973:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3974:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_READY; +3975:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3976:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Process Unlocked */ +3977:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_UNLOCK(hspi); +3978:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3979:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return HAL_TIMEOUT; +3980:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3981:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* If Systick is disabled or not incremented, deactivate timeout to go in disable loop proced +3982:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if(count == 0U) + 107 .loc 1 3982 7 is_stmt 1 view .LVU27 + 108 .loc 1 3982 16 is_stmt 0 view .LVU28 + 109 0052 019A ldr r2, [sp, #4] + 110 .loc 1 3982 9 view .LVU29 + 111 0054 02B1 cbz r2, .L9 + 112 0056 4A46 mov r2, r9 + 113 .L9: + 114 .LVL7: +3983:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +3984:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** tmp_timeout = 0U; +3985:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3986:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** count--; + 115 .loc 1 3986 7 is_stmt 1 view .LVU30 + 116 .loc 1 3986 12 is_stmt 0 view .LVU31 + 117 0058 019B ldr r3, [sp, #4] + 118 005a 013B subs r3, r3, #1 + 119 005c 0193 str r3, [sp, #4] + ARM GAS /tmp/ccywxtmH.s page 73 + + + 120 005e 9146 mov r9, r2 + 121 0060 E5E7 b .L3 + 122 .LVL8: + 123 .L13: +3959:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 124 .loc 1 3959 9 is_stmt 1 view .LVU32 + 125 0062 2A68 ldr r2, [r5] + 126 0064 5368 ldr r3, [r2, #4] + 127 0066 23F0E003 bic r3, r3, #224 + 128 006a 5360 str r3, [r2, #4] +3961:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** || (hspi->Init.Direction == SPI_DIRECTION_2LIN + 129 .loc 1 3961 9 view .LVU33 +3961:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** || (hspi->Init.Direction == SPI_DIRECTION_2LIN + 130 .loc 1 3961 24 is_stmt 0 view .LVU34 + 131 006c 6B68 ldr r3, [r5, #4] +3961:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** || (hspi->Init.Direction == SPI_DIRECTION_2LIN + 132 .loc 1 3961 12 view .LVU35 + 133 006e B3F5827F cmp r3, #260 + 134 0072 0BD0 beq .L14 + 135 .L5: +3969:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 136 .loc 1 3969 9 is_stmt 1 view .LVU36 +3969:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 137 .loc 1 3969 23 is_stmt 0 view .LVU37 + 138 0074 AB6A ldr r3, [r5, #40] +3969:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 139 .loc 1 3969 12 view .LVU38 + 140 0076 B3F5005F cmp r3, #8192 + 141 007a 14D0 beq .L15 + 142 .L7: +3971:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 143 .loc 1 3971 11 is_stmt 1 discriminator 1 view .LVU39 +3974:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 144 .loc 1 3974 9 discriminator 1 view .LVU40 +3974:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 145 .loc 1 3974 21 is_stmt 0 discriminator 1 view .LVU41 + 146 007c 0123 movs r3, #1 + 147 007e 85F85D30 strb r3, [r5, #93] +3977:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 148 .loc 1 3977 9 is_stmt 1 discriminator 1 view .LVU42 +3977:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 149 .loc 1 3977 9 discriminator 1 view .LVU43 + 150 0082 0023 movs r3, #0 + 151 0084 85F85C30 strb r3, [r5, #92] +3977:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 152 .loc 1 3977 9 discriminator 1 view .LVU44 +3979:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 153 .loc 1 3979 9 discriminator 1 view .LVU45 +3979:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 154 .loc 1 3979 16 is_stmt 0 discriminator 1 view .LVU46 + 155 0088 0320 movs r0, #3 + 156 008a 18E0 b .L8 + 157 .L14: +3961:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** || (hspi->Init.Direction == SPI_DIRECTION_2LIN + 158 .loc 1 3961 65 discriminator 1 view .LVU47 + 159 008c AB68 ldr r3, [r5, #8] +3961:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** || (hspi->Init.Direction == SPI_DIRECTION_2LIN + ARM GAS /tmp/ccywxtmH.s page 74 + + + 160 .loc 1 3961 50 discriminator 1 view .LVU48 + 161 008e B3F5004F cmp r3, #32768 + 162 0092 02D0 beq .L6 +3962:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 163 .loc 1 3962 54 view .LVU49 + 164 0094 B3F5806F cmp r3, #1024 + 165 0098 ECD1 bne .L5 + 166 .L6: +3965:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 167 .loc 1 3965 11 is_stmt 1 view .LVU50 + 168 009a 2A68 ldr r2, [r5] + 169 009c 1368 ldr r3, [r2] + 170 009e 23F04003 bic r3, r3, #64 + 171 00a2 1360 str r3, [r2] + 172 00a4 E6E7 b .L5 + 173 .L15: +3971:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 174 .loc 1 3971 11 view .LVU51 +3971:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 175 .loc 1 3971 11 view .LVU52 + 176 00a6 2A68 ldr r2, [r5] + 177 00a8 1368 ldr r3, [r2] + 178 00aa 23F40053 bic r3, r3, #8192 + 179 00ae 1360 str r3, [r2] +3971:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 180 .loc 1 3971 11 view .LVU53 + 181 00b0 2A68 ldr r2, [r5] + 182 00b2 1368 ldr r3, [r2] + 183 00b4 43F40053 orr r3, r3, #8192 + 184 00b8 1360 str r3, [r2] + 185 00ba DFE7 b .L7 + 186 .L12: +3987:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3988:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +3989:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3990:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return HAL_OK; + 187 .loc 1 3990 10 is_stmt 0 view .LVU54 + 188 00bc 0020 movs r0, #0 + 189 .L8: +3991:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 190 .loc 1 3991 1 view .LVU55 + 191 00be 02B0 add sp, sp, #8 + 192 .cfi_def_cfa_offset 32 + 193 @ sp needed + 194 00c0 BDE8F087 pop {r4, r5, r6, r7, r8, r9, r10, pc} + 195 .LVL9: + 196 .L17: + 197 .loc 1 3991 1 view .LVU56 + 198 .align 2 + 199 .L16: + 200 00c4 00000000 .word SystemCoreClock + 201 .cfi_endproc + 202 .LFE177: + 204 .section .text.SPI_WaitFifoStateUntilTimeout,"ax",%progbits + 205 .align 1 + 206 .syntax unified + 207 .thumb + ARM GAS /tmp/ccywxtmH.s page 75 + + + 208 .thumb_func + 210 SPI_WaitFifoStateUntilTimeout: + 211 .LVL10: + 212 .LFB178: +3992:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +3993:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +3994:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Handle SPI FIFO Communication Timeout. +3995:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains +3996:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for SPI module. +3997:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param Fifo Fifo to check +3998:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param State Fifo state to check +3999:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param Timeout Timeout duration +4000:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param Tickstart tick start value +4001:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval HAL status +4002:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +4003:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static HAL_StatusTypeDef SPI_WaitFifoStateUntilTimeout(SPI_HandleTypeDef *hspi, uint32_t Fifo, uint +4004:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t Timeout, uint32_t Tickstart) +4005:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 213 .loc 1 4005 1 is_stmt 1 view -0 + 214 .cfi_startproc + 215 @ args = 4, pretend = 0, frame = 8 + 216 @ frame_needed = 0, uses_anonymous_args = 0 + 217 .loc 1 4005 1 is_stmt 0 view .LVU58 + 218 0000 2DE9F047 push {r4, r5, r6, r7, r8, r9, r10, lr} + 219 .cfi_def_cfa_offset 32 + 220 .cfi_offset 4, -32 + 221 .cfi_offset 5, -28 + 222 .cfi_offset 6, -24 + 223 .cfi_offset 7, -20 + 224 .cfi_offset 8, -16 + 225 .cfi_offset 9, -12 + 226 .cfi_offset 10, -8 + 227 .cfi_offset 14, -4 + 228 0004 82B0 sub sp, sp, #8 + 229 .cfi_def_cfa_offset 40 + 230 0006 0646 mov r6, r0 + 231 0008 0C46 mov r4, r1 + 232 000a 1546 mov r5, r2 + 233 000c 1F46 mov r7, r3 +4006:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __IO uint32_t count; + 234 .loc 1 4006 3 is_stmt 1 view .LVU59 +4007:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t tmp_timeout; + 235 .loc 1 4007 3 view .LVU60 +4008:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t tmp_tickstart; + 236 .loc 1 4008 3 view .LVU61 +4009:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __IO uint8_t * ptmpreg8; + 237 .loc 1 4009 3 view .LVU62 +4010:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __IO uint8_t tmpreg8 = 0; + 238 .loc 1 4010 3 view .LVU63 + 239 .loc 1 4010 17 is_stmt 0 view .LVU64 + 240 000e 0023 movs r3, #0 + 241 .LVL11: + 242 .loc 1 4010 17 view .LVU65 + 243 0010 8DF80330 strb r3, [sp, #3] +4011:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4012:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Adjust Timeout value in case of end of transfer */ +4013:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** tmp_timeout = Timeout - (HAL_GetTick() - Tickstart); + ARM GAS /tmp/ccywxtmH.s page 76 + + + 244 .loc 1 4013 3 is_stmt 1 view .LVU66 + 245 .loc 1 4013 28 is_stmt 0 view .LVU67 + 246 0014 FFF7FEFF bl HAL_GetTick + 247 .LVL12: + 248 .loc 1 4013 42 view .LVU68 + 249 0018 0A9B ldr r3, [sp, #40] + 250 001a 1B1A subs r3, r3, r0 + 251 .loc 1 4013 15 view .LVU69 + 252 001c 03EB0708 add r8, r3, r7 + 253 .LVL13: +4014:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** tmp_tickstart = HAL_GetTick(); + 254 .loc 1 4014 3 is_stmt 1 view .LVU70 + 255 .loc 1 4014 19 is_stmt 0 view .LVU71 + 256 0020 FFF7FEFF bl HAL_GetTick + 257 .LVL14: + 258 0024 8146 mov r9, r0 + 259 .LVL15: +4015:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4016:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Initialize the 8bit temporary pointer */ +4017:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** ptmpreg8 = (__IO uint8_t *)&hspi->Instance->DR; + 260 .loc 1 4017 3 is_stmt 1 view .LVU72 + 261 .loc 1 4017 35 is_stmt 0 view .LVU73 + 262 0026 D6F800A0 ldr r10, [r6] + 263 .LVL16: +4018:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4019:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Calculate Timeout based on a software loop to avoid blocking issue if Systick is disabled */ +4020:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** count = tmp_timeout * ((SystemCoreClock * 35U) >> 20U); + 264 .loc 1 4020 3 is_stmt 1 view .LVU74 + 265 .loc 1 4020 43 is_stmt 0 view .LVU75 + 266 002a 304B ldr r3, .L35 + 267 002c 1B68 ldr r3, [r3] + 268 002e 03EB8303 add r3, r3, r3, lsl #2 + 269 0032 C3EBC303 rsb r3, r3, r3, lsl #3 + 270 .loc 1 4020 50 view .LVU76 + 271 0036 1B0D lsrs r3, r3, #20 + 272 .loc 1 4020 23 view .LVU77 + 273 0038 08FB03F3 mul r3, r8, r3 + 274 .loc 1 4020 9 view .LVU78 + 275 003c 0193 str r3, [sp, #4] +4021:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4022:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** while ((hspi->Instance->SR & Fifo) != State) + 276 .loc 1 4022 3 is_stmt 1 view .LVU79 + 277 .loc 1 4022 9 is_stmt 0 view .LVU80 + 278 003e 02E0 b .L21 + 279 .LVL17: + 280 .L20: +4023:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4024:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((Fifo == SPI_SR_FRLVL) && (State == SPI_FRLVL_EMPTY)) +4025:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4026:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Flush Data Register by a blank read */ +4027:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** tmpreg8 = *ptmpreg8; +4028:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* To avoid GCC warning */ +4029:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** UNUSED(tmpreg8); +4030:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +4031:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4032:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (Timeout != HAL_MAX_DELAY) + 281 .loc 1 4032 5 is_stmt 1 view .LVU81 + ARM GAS /tmp/ccywxtmH.s page 77 + + + 282 .loc 1 4032 8 is_stmt 0 view .LVU82 + 283 0040 B7F1FF3F cmp r7, #-1 + 284 0044 12D1 bne .L30 + 285 .L21: +4022:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 286 .loc 1 4022 38 is_stmt 1 view .LVU83 +4022:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 287 .loc 1 4022 15 is_stmt 0 view .LVU84 + 288 0046 3368 ldr r3, [r6] +4022:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 289 .loc 1 4022 25 view .LVU85 + 290 0048 9B68 ldr r3, [r3, #8] +4022:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 291 .loc 1 4022 30 view .LVU86 + 292 004a 03EA040C and ip, r3, r4 +4022:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 293 .loc 1 4022 38 view .LVU87 + 294 004e AC45 cmp ip, r5 + 295 0050 47D0 beq .L31 +4024:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 296 .loc 1 4024 5 is_stmt 1 view .LVU88 +4024:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 297 .loc 1 4024 8 is_stmt 0 view .LVU89 + 298 0052 B4F5C06F cmp r4, #1536 + 299 0056 F3D1 bne .L20 +4024:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 300 .loc 1 4024 32 discriminator 1 view .LVU90 + 301 0058 002D cmp r5, #0 + 302 005a F1D1 bne .L20 +4027:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* To avoid GCC warning */ + 303 .loc 1 4027 7 is_stmt 1 view .LVU91 +4027:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* To avoid GCC warning */ + 304 .loc 1 4027 17 is_stmt 0 view .LVU92 + 305 005c 9AF80C30 ldrb r3, [r10, #12] @ zero_extendqisi2 + 306 0060 DBB2 uxtb r3, r3 +4027:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* To avoid GCC warning */ + 307 .loc 1 4027 15 view .LVU93 + 308 0062 8DF80330 strb r3, [sp, #3] +4029:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 309 .loc 1 4029 7 is_stmt 1 view .LVU94 + 310 0066 9DF80330 ldrb r3, [sp, #3] @ zero_extendqisi2 + 311 006a E9E7 b .L20 + 312 .L30: +4033:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4034:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (((HAL_GetTick() - tmp_tickstart) >= tmp_timeout) || (tmp_timeout == 0U)) + 313 .loc 1 4034 7 view .LVU95 + 314 .loc 1 4034 13 is_stmt 0 view .LVU96 + 315 006c FFF7FEFF bl HAL_GetTick + 316 .LVL18: + 317 .loc 1 4034 27 view .LVU97 + 318 0070 A0EB0900 sub r0, r0, r9 + 319 .loc 1 4034 10 view .LVU98 + 320 0074 4045 cmp r0, r8 + 321 0076 07D2 bcs .L32 +4035:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4036:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable the SPI and reset the CRC: the CRC value should be cleared +4037:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** on both master and slave sides in order to resynchronize the master + ARM GAS /tmp/ccywxtmH.s page 78 + + +4038:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** and slave for their respective CRC calculation */ +4039:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4040:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable TXE, RXNE and ERR interrupts for the interrupt process */ +4041:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_RXNE | SPI_IT_ERR)); +4042:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4043:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((hspi->Init.Mode == SPI_MODE_MASTER) && ((hspi->Init.Direction == SPI_DIRECTION_1LINE) +4044:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** || (hspi->Init.Direction == SPI_DIRECTION_2LIN +4045:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4046:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable SPI peripheral */ +4047:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_DISABLE(hspi); +4048:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +4049:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4050:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Reset CRC Calculation */ +4051:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.CRCCalculation == SPI_CRCCALCULATION_ENABLE) +4052:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4053:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_RESET_CRC(hspi); +4054:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +4055:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4056:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_READY; +4057:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4058:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Process Unlocked */ +4059:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_UNLOCK(hspi); +4060:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4061:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return HAL_TIMEOUT; +4062:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +4063:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* If Systick is disabled or not incremented, deactivate timeout to go in disable loop proced +4064:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if(count == 0U) + 322 .loc 1 4064 7 is_stmt 1 view .LVU99 + 323 .loc 1 4064 16 is_stmt 0 view .LVU100 + 324 0078 019A ldr r2, [sp, #4] + 325 .loc 1 4064 9 view .LVU101 + 326 007a 02B1 cbz r2, .L27 + 327 007c 4246 mov r2, r8 + 328 .L27: + 329 .LVL19: +4065:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4066:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** tmp_timeout = 0U; +4067:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +4068:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** count--; + 330 .loc 1 4068 7 is_stmt 1 view .LVU102 + 331 .loc 1 4068 12 is_stmt 0 view .LVU103 + 332 007e 019B ldr r3, [sp, #4] + 333 0080 013B subs r3, r3, #1 + 334 0082 0193 str r3, [sp, #4] + 335 0084 9046 mov r8, r2 + 336 0086 DEE7 b .L21 + 337 .LVL20: + 338 .L32: +4041:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 339 .loc 1 4041 9 is_stmt 1 view .LVU104 + 340 0088 3268 ldr r2, [r6] + 341 008a 5368 ldr r3, [r2, #4] + 342 008c 23F0E003 bic r3, r3, #224 + 343 0090 5360 str r3, [r2, #4] +4043:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** || (hspi->Init.Direction == SPI_DIRECTION_2LIN + 344 .loc 1 4043 9 view .LVU105 +4043:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** || (hspi->Init.Direction == SPI_DIRECTION_2LIN + ARM GAS /tmp/ccywxtmH.s page 79 + + + 345 .loc 1 4043 24 is_stmt 0 view .LVU106 + 346 0092 7368 ldr r3, [r6, #4] +4043:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** || (hspi->Init.Direction == SPI_DIRECTION_2LIN + 347 .loc 1 4043 12 view .LVU107 + 348 0094 B3F5827F cmp r3, #260 + 349 0098 0BD0 beq .L33 + 350 .L23: +4051:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 351 .loc 1 4051 9 is_stmt 1 view .LVU108 +4051:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 352 .loc 1 4051 23 is_stmt 0 view .LVU109 + 353 009a B36A ldr r3, [r6, #40] +4051:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 354 .loc 1 4051 12 view .LVU110 + 355 009c B3F5005F cmp r3, #8192 + 356 00a0 14D0 beq .L34 + 357 .L25: +4053:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 358 .loc 1 4053 11 is_stmt 1 discriminator 1 view .LVU111 +4056:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 359 .loc 1 4056 9 discriminator 1 view .LVU112 +4056:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 360 .loc 1 4056 21 is_stmt 0 discriminator 1 view .LVU113 + 361 00a2 0123 movs r3, #1 + 362 00a4 86F85D30 strb r3, [r6, #93] +4059:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 363 .loc 1 4059 9 is_stmt 1 discriminator 1 view .LVU114 +4059:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 364 .loc 1 4059 9 discriminator 1 view .LVU115 + 365 00a8 0023 movs r3, #0 + 366 00aa 86F85C30 strb r3, [r6, #92] +4059:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 367 .loc 1 4059 9 discriminator 1 view .LVU116 +4061:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 368 .loc 1 4061 9 discriminator 1 view .LVU117 +4061:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 369 .loc 1 4061 16 is_stmt 0 discriminator 1 view .LVU118 + 370 00ae 0320 movs r0, #3 + 371 00b0 18E0 b .L26 + 372 .L33: +4043:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** || (hspi->Init.Direction == SPI_DIRECTION_2LIN + 373 .loc 1 4043 65 discriminator 1 view .LVU119 + 374 00b2 B368 ldr r3, [r6, #8] +4043:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** || (hspi->Init.Direction == SPI_DIRECTION_2LIN + 375 .loc 1 4043 50 discriminator 1 view .LVU120 + 376 00b4 B3F5004F cmp r3, #32768 + 377 00b8 02D0 beq .L24 +4044:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 378 .loc 1 4044 54 view .LVU121 + 379 00ba B3F5806F cmp r3, #1024 + 380 00be ECD1 bne .L23 + 381 .L24: +4047:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 382 .loc 1 4047 11 is_stmt 1 view .LVU122 + 383 00c0 3268 ldr r2, [r6] + 384 00c2 1368 ldr r3, [r2] + 385 00c4 23F04003 bic r3, r3, #64 + ARM GAS /tmp/ccywxtmH.s page 80 + + + 386 00c8 1360 str r3, [r2] + 387 00ca E6E7 b .L23 + 388 .L34: +4053:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 389 .loc 1 4053 11 view .LVU123 +4053:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 390 .loc 1 4053 11 view .LVU124 + 391 00cc 3268 ldr r2, [r6] + 392 00ce 1368 ldr r3, [r2] + 393 00d0 23F40053 bic r3, r3, #8192 + 394 00d4 1360 str r3, [r2] +4053:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 395 .loc 1 4053 11 view .LVU125 + 396 00d6 3268 ldr r2, [r6] + 397 00d8 1368 ldr r3, [r2] + 398 00da 43F40053 orr r3, r3, #8192 + 399 00de 1360 str r3, [r2] + 400 00e0 DFE7 b .L25 + 401 .L31: +4069:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +4070:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +4071:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4072:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return HAL_OK; + 402 .loc 1 4072 10 is_stmt 0 view .LVU126 + 403 00e2 0020 movs r0, #0 + 404 .L26: +4073:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 405 .loc 1 4073 1 view .LVU127 + 406 00e4 02B0 add sp, sp, #8 + 407 .cfi_def_cfa_offset 32 + 408 @ sp needed + 409 00e6 BDE8F087 pop {r4, r5, r6, r7, r8, r9, r10, pc} + 410 .LVL21: + 411 .L36: + 412 .loc 1 4073 1 view .LVU128 + 413 00ea 00BF .align 2 + 414 .L35: + 415 00ec 00000000 .word SystemCoreClock + 416 .cfi_endproc + 417 .LFE178: + 419 .section .text.SPI_EndRxTxTransaction,"ax",%progbits + 420 .align 1 + 421 .syntax unified + 422 .thumb + 423 .thumb_func + 425 SPI_EndRxTxTransaction: + 426 .LVL22: + 427 .LFB180: +4074:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4075:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +4076:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Handle the check of the RX transaction complete. +4077:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains +4078:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for SPI module. +4079:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param Timeout Timeout duration +4080:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param Tickstart tick start value +4081:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval HAL status +4082:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ + ARM GAS /tmp/ccywxtmH.s page 81 + + +4083:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static HAL_StatusTypeDef SPI_EndRxTransaction(SPI_HandleTypeDef *hspi, uint32_t Timeout, uint32_t +4084:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4085:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((hspi->Init.Mode == SPI_MODE_MASTER) && ((hspi->Init.Direction == SPI_DIRECTION_1LINE) +4086:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** || (hspi->Init.Direction == SPI_DIRECTION_2LINES_RXO +4087:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4088:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable SPI peripheral */ +4089:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_DISABLE(hspi); +4090:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +4091:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4092:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Control the BSY flag */ +4093:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_BSY, RESET, Timeout, Tickstart) != HAL_OK) +4094:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4095:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); +4096:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return HAL_TIMEOUT; +4097:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +4098:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4099:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((hspi->Init.Mode == SPI_MODE_MASTER) && ((hspi->Init.Direction == SPI_DIRECTION_1LINE) +4100:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** || (hspi->Init.Direction == SPI_DIRECTION_2LINES_RXO +4101:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4102:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Empty the FRLVL fifo */ +4103:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, Timeout, Tickstart) != +4104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4105:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); +4106:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return HAL_TIMEOUT; +4107:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +4108:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +4109:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return HAL_OK; +4110:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +4111:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4112:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +4113:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Handle the check of the RXTX or TX transaction complete. +4114:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi SPI handle +4115:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param Timeout Timeout duration +4116:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param Tickstart tick start value +4117:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval HAL status +4118:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +4119:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static HAL_StatusTypeDef SPI_EndRxTxTransaction(SPI_HandleTypeDef *hspi, uint32_t Timeout, uint32_t +4120:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 428 .loc 1 4120 1 is_stmt 1 view -0 + 429 .cfi_startproc + 430 @ args = 0, pretend = 0, frame = 0 + 431 @ frame_needed = 0, uses_anonymous_args = 0 + 432 .loc 1 4120 1 is_stmt 0 view .LVU130 + 433 0000 70B5 push {r4, r5, r6, lr} + 434 .cfi_def_cfa_offset 16 + 435 .cfi_offset 4, -16 + 436 .cfi_offset 5, -12 + 437 .cfi_offset 6, -8 + 438 .cfi_offset 14, -4 + 439 0002 82B0 sub sp, sp, #8 + 440 .cfi_def_cfa_offset 24 + 441 0004 0446 mov r4, r0 + 442 0006 0D46 mov r5, r1 + 443 0008 1646 mov r6, r2 +4121:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Control if the TX fifo is empty */ +4122:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FTLVL, SPI_FTLVL_EMPTY, Timeout, Tickstart) != H + 444 .loc 1 4122 3 is_stmt 1 view .LVU131 + ARM GAS /tmp/ccywxtmH.s page 82 + + + 445 .loc 1 4122 7 is_stmt 0 view .LVU132 + 446 000a 0092 str r2, [sp] + 447 000c 0B46 mov r3, r1 + 448 000e 0022 movs r2, #0 + 449 .LVL23: + 450 .loc 1 4122 7 view .LVU133 + 451 0010 4FF4C051 mov r1, #6144 + 452 .LVL24: + 453 .loc 1 4122 7 view .LVU134 + 454 0014 FFF7FEFF bl SPI_WaitFifoStateUntilTimeout + 455 .LVL25: + 456 .loc 1 4122 6 view .LVU135 + 457 0018 B0B9 cbnz r0, .L42 +4123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4124:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); +4125:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return HAL_TIMEOUT; +4126:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +4127:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4128:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Control the BSY flag */ +4129:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_BSY, RESET, Timeout, Tickstart) != HAL_OK) + 458 .loc 1 4129 3 is_stmt 1 view .LVU136 + 459 .loc 1 4129 7 is_stmt 0 view .LVU137 + 460 001a 0096 str r6, [sp] + 461 001c 2B46 mov r3, r5 + 462 001e 0022 movs r2, #0 + 463 0020 8021 movs r1, #128 + 464 0022 2046 mov r0, r4 + 465 0024 FFF7FEFF bl SPI_WaitFlagStateUntilTimeout + 466 .LVL26: + 467 .loc 1 4129 6 view .LVU138 + 468 0028 A8B9 cbnz r0, .L43 +4130:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4131:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); +4132:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return HAL_TIMEOUT; +4133:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +4134:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4135:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Control if the RX fifo is empty */ +4136:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, Timeout, Tickstart) != H + 469 .loc 1 4136 3 is_stmt 1 view .LVU139 + 470 .loc 1 4136 7 is_stmt 0 view .LVU140 + 471 002a 0096 str r6, [sp] + 472 002c 2B46 mov r3, r5 + 473 002e 0022 movs r2, #0 + 474 0030 4FF4C061 mov r1, #1536 + 475 0034 2046 mov r0, r4 + 476 0036 FFF7FEFF bl SPI_WaitFifoStateUntilTimeout + 477 .LVL27: + 478 .loc 1 4136 6 view .LVU141 + 479 003a 50B1 cbz r0, .L39 +4137:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4138:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); + 480 .loc 1 4138 5 is_stmt 1 view .LVU142 + 481 003c 236E ldr r3, [r4, #96] + 482 003e 43F02003 orr r3, r3, #32 + 483 0042 2366 str r3, [r4, #96] +4139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return HAL_TIMEOUT; + 484 .loc 1 4139 5 view .LVU143 + ARM GAS /tmp/ccywxtmH.s page 83 + + + 485 .loc 1 4139 12 is_stmt 0 view .LVU144 + 486 0044 0320 movs r0, #3 + 487 0046 04E0 b .L39 + 488 .L42: +4124:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return HAL_TIMEOUT; + 489 .loc 1 4124 5 is_stmt 1 view .LVU145 + 490 0048 236E ldr r3, [r4, #96] + 491 004a 43F02003 orr r3, r3, #32 + 492 004e 2366 str r3, [r4, #96] +4125:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 493 .loc 1 4125 5 view .LVU146 +4125:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 494 .loc 1 4125 12 is_stmt 0 view .LVU147 + 495 0050 0320 movs r0, #3 + 496 .L39: +4140:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +4141:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4142:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return HAL_OK; +4143:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 497 .loc 1 4143 1 view .LVU148 + 498 0052 02B0 add sp, sp, #8 + 499 .cfi_remember_state + 500 .cfi_def_cfa_offset 16 + 501 @ sp needed + 502 0054 70BD pop {r4, r5, r6, pc} + 503 .LVL28: + 504 .L43: + 505 .cfi_restore_state +4131:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return HAL_TIMEOUT; + 506 .loc 1 4131 5 is_stmt 1 view .LVU149 + 507 0056 236E ldr r3, [r4, #96] + 508 0058 43F02003 orr r3, r3, #32 + 509 005c 2366 str r3, [r4, #96] +4132:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 510 .loc 1 4132 5 view .LVU150 +4132:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 511 .loc 1 4132 12 is_stmt 0 view .LVU151 + 512 005e 0320 movs r0, #3 + 513 0060 F7E7 b .L39 + 514 .cfi_endproc + 515 .LFE180: + 517 .section .text.SPI_EndRxTransaction,"ax",%progbits + 518 .align 1 + 519 .syntax unified + 520 .thumb + 521 .thumb_func + 523 SPI_EndRxTransaction: + 524 .LVL29: + 525 .LFB179: +4084:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((hspi->Init.Mode == SPI_MODE_MASTER) && ((hspi->Init.Direction == SPI_DIRECTION_1LINE) + 526 .loc 1 4084 1 is_stmt 1 view -0 + 527 .cfi_startproc + 528 @ args = 0, pretend = 0, frame = 0 + 529 @ frame_needed = 0, uses_anonymous_args = 0 +4084:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if ((hspi->Init.Mode == SPI_MODE_MASTER) && ((hspi->Init.Direction == SPI_DIRECTION_1LINE) + 530 .loc 1 4084 1 is_stmt 0 view .LVU153 + 531 0000 70B5 push {r4, r5, r6, lr} + ARM GAS /tmp/ccywxtmH.s page 84 + + + 532 .cfi_def_cfa_offset 16 + 533 .cfi_offset 4, -16 + 534 .cfi_offset 5, -12 + 535 .cfi_offset 6, -8 + 536 .cfi_offset 14, -4 + 537 0002 82B0 sub sp, sp, #8 + 538 .cfi_def_cfa_offset 24 + 539 0004 0446 mov r4, r0 + 540 0006 0D46 mov r5, r1 + 541 0008 1646 mov r6, r2 +4085:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** || (hspi->Init.Direction == SPI_DIRECTION_2LINES_RXO + 542 .loc 1 4085 3 is_stmt 1 view .LVU154 +4085:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** || (hspi->Init.Direction == SPI_DIRECTION_2LINES_RXO + 543 .loc 1 4085 18 is_stmt 0 view .LVU155 + 544 000a 4368 ldr r3, [r0, #4] +4085:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** || (hspi->Init.Direction == SPI_DIRECTION_2LINES_RXO + 545 .loc 1 4085 6 view .LVU156 + 546 000c B3F5827F cmp r3, #260 + 547 0010 0DD0 beq .L51 + 548 .LVL30: + 549 .L45: +4093:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 550 .loc 1 4093 3 is_stmt 1 view .LVU157 +4093:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 551 .loc 1 4093 7 is_stmt 0 view .LVU158 + 552 0012 0096 str r6, [sp] + 553 0014 2B46 mov r3, r5 + 554 0016 0022 movs r2, #0 + 555 0018 8021 movs r1, #128 + 556 .LVL31: +4093:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 557 .loc 1 4093 7 view .LVU159 + 558 001a 2046 mov r0, r4 + 559 .LVL32: +4093:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 560 .loc 1 4093 7 view .LVU160 + 561 001c FFF7FEFF bl SPI_WaitFlagStateUntilTimeout + 562 .LVL33: +4093:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 563 .loc 1 4093 6 view .LVU161 + 564 0020 90B9 cbnz r0, .L52 +4099:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** || (hspi->Init.Direction == SPI_DIRECTION_2LINES_RXO + 565 .loc 1 4099 3 is_stmt 1 view .LVU162 +4099:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** || (hspi->Init.Direction == SPI_DIRECTION_2LINES_RXO + 566 .loc 1 4099 18 is_stmt 0 view .LVU163 + 567 0022 6368 ldr r3, [r4, #4] +4099:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** || (hspi->Init.Direction == SPI_DIRECTION_2LINES_RXO + 568 .loc 1 4099 6 view .LVU164 + 569 0024 B3F5827F cmp r3, #260 + 570 0028 14D0 beq .L53 + 571 .L48: +4110:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 572 .loc 1 4110 1 view .LVU165 + 573 002a 02B0 add sp, sp, #8 + 574 .cfi_remember_state + 575 .cfi_def_cfa_offset 16 + 576 @ sp needed + ARM GAS /tmp/ccywxtmH.s page 85 + + + 577 002c 70BD pop {r4, r5, r6, pc} + 578 .LVL34: + 579 .L51: + 580 .cfi_restore_state +4085:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** || (hspi->Init.Direction == SPI_DIRECTION_2LINES_RXO + 581 .loc 1 4085 59 discriminator 1 view .LVU166 + 582 002e 8368 ldr r3, [r0, #8] +4085:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** || (hspi->Init.Direction == SPI_DIRECTION_2LINES_RXO + 583 .loc 1 4085 44 discriminator 1 view .LVU167 + 584 0030 B3F5004F cmp r3, #32768 + 585 0034 02D0 beq .L46 +4086:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 586 .loc 1 4086 48 view .LVU168 + 587 0036 B3F5806F cmp r3, #1024 + 588 003a EAD1 bne .L45 + 589 .L46: +4089:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 590 .loc 1 4089 5 is_stmt 1 view .LVU169 + 591 003c 2268 ldr r2, [r4] + 592 .LVL35: +4089:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 593 .loc 1 4089 5 is_stmt 0 view .LVU170 + 594 003e 1368 ldr r3, [r2] + 595 0040 23F04003 bic r3, r3, #64 + 596 0044 1360 str r3, [r2] + 597 0046 E4E7 b .L45 + 598 .LVL36: + 599 .L52: +4095:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return HAL_TIMEOUT; + 600 .loc 1 4095 5 is_stmt 1 view .LVU171 + 601 0048 236E ldr r3, [r4, #96] + 602 004a 43F02003 orr r3, r3, #32 + 603 004e 2366 str r3, [r4, #96] +4096:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 604 .loc 1 4096 5 view .LVU172 +4096:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 605 .loc 1 4096 12 is_stmt 0 view .LVU173 + 606 0050 0320 movs r0, #3 + 607 0052 EAE7 b .L48 + 608 .L53: +4099:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** || (hspi->Init.Direction == SPI_DIRECTION_2LINES_RXO + 609 .loc 1 4099 59 discriminator 1 view .LVU174 + 610 0054 A368 ldr r3, [r4, #8] +4099:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** || (hspi->Init.Direction == SPI_DIRECTION_2LINES_RXO + 611 .loc 1 4099 44 discriminator 1 view .LVU175 + 612 0056 B3F5004F cmp r3, #32768 + 613 005a 02D0 beq .L49 +4100:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 614 .loc 1 4100 48 view .LVU176 + 615 005c B3F5806F cmp r3, #1024 + 616 0060 E3D1 bne .L48 + 617 .L49: +4103:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 618 .loc 1 4103 5 is_stmt 1 view .LVU177 +4103:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 619 .loc 1 4103 9 is_stmt 0 view .LVU178 + 620 0062 0096 str r6, [sp] + ARM GAS /tmp/ccywxtmH.s page 86 + + + 621 0064 2B46 mov r3, r5 + 622 0066 0022 movs r2, #0 + 623 0068 4FF4C061 mov r1, #1536 + 624 006c 2046 mov r0, r4 + 625 006e FFF7FEFF bl SPI_WaitFifoStateUntilTimeout + 626 .LVL37: +4103:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 627 .loc 1 4103 8 view .LVU179 + 628 0072 0028 cmp r0, #0 + 629 0074 D9D0 beq .L48 +4105:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return HAL_TIMEOUT; + 630 .loc 1 4105 7 is_stmt 1 view .LVU180 + 631 0076 236E ldr r3, [r4, #96] + 632 0078 43F02003 orr r3, r3, #32 + 633 007c 2366 str r3, [r4, #96] +4106:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 634 .loc 1 4106 7 view .LVU181 +4106:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 635 .loc 1 4106 14 is_stmt 0 view .LVU182 + 636 007e 0320 movs r0, #3 + 637 0080 D3E7 b .L48 + 638 .cfi_endproc + 639 .LFE179: + 641 .section .text.SPI_AbortRx_ISR,"ax",%progbits + 642 .align 1 + 643 .syntax unified + 644 .thumb + 645 .thumb_func + 647 SPI_AbortRx_ISR: + 648 .LVL38: + 649 .LFB184: +4144:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4145:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +4146:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Handle the end of the RXTX transaction. +4147:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains +4148:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for SPI module. +4149:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval None +4150:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +4151:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_CloseRxTx_ISR(SPI_HandleTypeDef *hspi) +4152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4153:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t tickstart; +4154:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4155:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Init tickstart for timeout management */ +4156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** tickstart = HAL_GetTick(); +4157:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4158:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable ERR interrupt */ +4159:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_DISABLE_IT(hspi, SPI_IT_ERR); +4160:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check the end of the transaction */ +4162:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK) +4163:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4164:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); +4165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +4166:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) +4168:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check if CRC error occurred */ +4169:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR) != RESET) + ARM GAS /tmp/ccywxtmH.s page 87 + + +4170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4171:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_READY; +4172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); +4173:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_CRCERRFLAG(hspi); +4174:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Call user error callback */ +4175:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) +4176:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCallback(hspi); +4177:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #else +4178:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_SPI_ErrorCallback(hspi); +4179:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +4180:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +4181:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else +4182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4183:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ +4184:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->ErrorCode == HAL_SPI_ERROR_NONE) +4185:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->State == HAL_SPI_STATE_BUSY_RX) +4187:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4188:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_READY; +4189:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Call user Rx complete callback */ +4190:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) +4191:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxCpltCallback(hspi); +4192:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #else +4193:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_SPI_RxCpltCallback(hspi); +4194:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +4195:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +4196:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else +4197:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4198:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_READY; +4199:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Call user TxRx complete callback */ +4200:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) +4201:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxRxCpltCallback(hspi); +4202:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #else +4203:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_SPI_TxRxCpltCallback(hspi); +4204:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +4205:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +4206:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +4207:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else +4208:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4209:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_READY; +4210:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Call user error callback */ +4211:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) +4212:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCallback(hspi); +4213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #else +4214:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_SPI_ErrorCallback(hspi); +4215:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +4216:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +4217:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) +4218:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +4219:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ +4220:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +4221:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4222:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +4223:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Handle the end of the RX transaction. +4224:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains +4225:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for SPI module. +4226:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval None + ARM GAS /tmp/ccywxtmH.s page 88 + + +4227:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +4228:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_CloseRx_ISR(SPI_HandleTypeDef *hspi) +4229:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4230:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable RXNE and ERR interrupt */ +4231:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_RXNE | SPI_IT_ERR)); +4232:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4233:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check the end of the transaction */ +4234:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (SPI_EndRxTransaction(hspi, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK) +4235:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4236:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); +4237:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +4238:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_READY; +4239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4240:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) +4241:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check if CRC error occurred */ +4242:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (__HAL_SPI_GET_FLAG(hspi, SPI_FLAG_CRCERR) != RESET) +4243:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4244:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_CRC); +4245:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_CRCERRFLAG(hspi); +4246:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Call user error callback */ +4247:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) +4248:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCallback(hspi); +4249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #else +4250:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_SPI_ErrorCallback(hspi); +4251:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +4252:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +4253:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else +4254:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4255:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ +4256:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->ErrorCode == HAL_SPI_ERROR_NONE) +4257:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4258:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Call user Rx complete callback */ +4259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) +4260:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxCpltCallback(hspi); +4261:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #else +4262:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_SPI_RxCpltCallback(hspi); +4263:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +4264:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +4265:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else +4266:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4267:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Call user error callback */ +4268:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) +4269:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCallback(hspi); +4270:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #else +4271:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_SPI_ErrorCallback(hspi); +4272:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +4273:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +4274:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) +4275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +4276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ +4277:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +4278:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4279:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +4280:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Handle the end of the TX transaction. +4281:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains +4282:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for SPI module. +4283:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval None + ARM GAS /tmp/ccywxtmH.s page 89 + + +4284:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +4285:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_CloseTx_ISR(SPI_HandleTypeDef *hspi) +4286:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4287:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t tickstart; +4288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4289:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Init tickstart for timeout management*/ +4290:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** tickstart = HAL_GetTick(); +4291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4292:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable TXE and ERR interrupt */ +4293:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_DISABLE_IT(hspi, (SPI_IT_TXE | SPI_IT_ERR)); +4294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4295:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check the end of the transaction */ +4296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, tickstart) != HAL_OK) +4297:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4298:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); +4299:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +4300:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4301:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Clear overrun flag in 2 Lines communication mode because received is not read */ +4302:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.Direction == SPI_DIRECTION_2LINES) +4303:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4304:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_OVRFLAG(hspi); +4305:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +4306:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4307:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_READY; +4308:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) +4309:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4310:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Call user error callback */ +4311:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) +4312:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCallback(hspi); +4313:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #else +4314:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_SPI_ErrorCallback(hspi); +4315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +4316:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +4317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** else +4318:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4319:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Call user Rx complete callback */ +4320:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_HAL_SPI_REGISTER_CALLBACKS == 1U) +4321:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxCpltCallback(hspi); +4322:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #else +4323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_SPI_TxCpltCallback(hspi); +4324:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ +4325:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +4326:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +4327:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4328:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +4329:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Handle abort a Rx transaction. +4330:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains +4331:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for SPI module. +4332:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval None +4333:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +4334:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_AbortRx_ISR(SPI_HandleTypeDef *hspi) +4335:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 650 .loc 1 4335 1 is_stmt 1 view -0 + 651 .cfi_startproc + 652 @ args = 0, pretend = 0, frame = 8 + 653 @ frame_needed = 0, uses_anonymous_args = 0 + 654 .loc 1 4335 1 is_stmt 0 view .LVU184 + ARM GAS /tmp/ccywxtmH.s page 90 + + + 655 0000 10B5 push {r4, lr} + 656 .cfi_def_cfa_offset 8 + 657 .cfi_offset 4, -8 + 658 .cfi_offset 14, -4 + 659 0002 84B0 sub sp, sp, #16 + 660 .cfi_def_cfa_offset 24 + 661 0004 0446 mov r4, r0 +4336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __IO uint32_t count; + 662 .loc 1 4336 3 is_stmt 1 view .LVU185 +4337:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4338:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable SPI Peripheral */ +4339:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_DISABLE(hspi); + 663 .loc 1 4339 3 view .LVU186 + 664 0006 0268 ldr r2, [r0] + 665 0008 1368 ldr r3, [r2] + 666 000a 23F04003 bic r3, r3, #64 + 667 000e 1360 str r3, [r2] +4340:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4341:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** count = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U); + 668 .loc 1 4341 3 view .LVU187 + 669 .loc 1 4341 56 is_stmt 0 view .LVU188 + 670 0010 1D4B ldr r3, .L62 + 671 0012 1B68 ldr r3, [r3] + 672 0014 1D4A ldr r2, .L62+4 + 673 0016 A2FB0323 umull r2, r3, r2, r3 + 674 001a 5B0A lsrs r3, r3, #9 + 675 .loc 1 4341 31 view .LVU189 + 676 001c 6422 movs r2, #100 + 677 001e 02FB03F3 mul r3, r2, r3 + 678 .loc 1 4341 9 view .LVU190 + 679 0022 0393 str r3, [sp, #12] +4342:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable RXNEIE interrupt */ +4344:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_RXNEIE)); + 680 .loc 1 4344 3 is_stmt 1 view .LVU191 + 681 0024 0268 ldr r2, [r0] + 682 0026 5368 ldr r3, [r2, #4] + 683 0028 23F04003 bic r3, r3, #64 + 684 002c 5360 str r3, [r2, #4] + 685 .L57: +4345:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check RXNEIE is disabled */ +4347:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** do + 686 .loc 1 4347 3 view .LVU192 +4348:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4349:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (count == 0U) + 687 .loc 1 4349 5 view .LVU193 + 688 .loc 1 4349 15 is_stmt 0 view .LVU194 + 689 002e 039B ldr r3, [sp, #12] + 690 .loc 1 4349 8 view .LVU195 + 691 0030 43B1 cbz r3, .L61 +4350:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4351:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); +4352:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** break; +4353:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +4354:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** count--; + 692 .loc 1 4354 5 is_stmt 1 view .LVU196 + ARM GAS /tmp/ccywxtmH.s page 91 + + + 693 .loc 1 4354 10 is_stmt 0 view .LVU197 + 694 0032 039B ldr r3, [sp, #12] + 695 0034 013B subs r3, r3, #1 + 696 0036 0393 str r3, [sp, #12] +4355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } while (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXNEIE)); + 697 .loc 1 4355 12 is_stmt 1 view .LVU198 + 698 0038 2368 ldr r3, [r4] + 699 003a 5B68 ldr r3, [r3, #4] + 700 003c 13F0400F tst r3, #64 + 701 0040 F5D1 bne .L57 + 702 0042 03E0 b .L56 + 703 .L61: +4351:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** break; + 704 .loc 1 4351 7 view .LVU199 + 705 0044 236E ldr r3, [r4, #96] + 706 0046 43F04003 orr r3, r3, #64 + 707 004a 2366 str r3, [r4, #96] +4352:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 708 .loc 1 4352 7 view .LVU200 + 709 .L56: +4356:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4357:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Control the BSY flag */ +4358:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_BSY, RESET, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) + 710 .loc 1 4358 3 view .LVU201 + 711 .loc 1 4358 7 is_stmt 0 view .LVU202 + 712 004c FFF7FEFF bl HAL_GetTick + 713 .LVL39: + 714 .loc 1 4358 7 view .LVU203 + 715 0050 0090 str r0, [sp] + 716 0052 6423 movs r3, #100 + 717 0054 0022 movs r2, #0 + 718 0056 8021 movs r1, #128 + 719 0058 2046 mov r0, r4 + 720 005a FFF7FEFF bl SPI_WaitFlagStateUntilTimeout + 721 .LVL40: + 722 .loc 1 4358 6 view .LVU204 + 723 005e 08B1 cbz r0, .L58 +4359:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4360:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + 724 .loc 1 4360 5 is_stmt 1 view .LVU205 + 725 .loc 1 4360 21 is_stmt 0 view .LVU206 + 726 0060 4023 movs r3, #64 + 727 0062 2366 str r3, [r4, #96] + 728 .L58: +4361:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +4362:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4363:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Empty the FRLVL fifo */ +4364:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, SPI_DEFAULT_TIMEOUT, HAL + 729 .loc 1 4364 3 is_stmt 1 view .LVU207 + 730 .loc 1 4364 7 is_stmt 0 view .LVU208 + 731 0064 FFF7FEFF bl HAL_GetTick + 732 .LVL41: + 733 0068 0090 str r0, [sp] + 734 006a 6423 movs r3, #100 + 735 006c 0022 movs r2, #0 + 736 006e 4FF4C061 mov r1, #1536 + 737 0072 2046 mov r0, r4 + ARM GAS /tmp/ccywxtmH.s page 92 + + + 738 0074 FFF7FEFF bl SPI_WaitFifoStateUntilTimeout + 739 .LVL42: + 740 .loc 1 4364 6 view .LVU209 + 741 0078 08B1 cbz r0, .L59 +4365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4366:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + 742 .loc 1 4366 5 is_stmt 1 view .LVU210 + 743 .loc 1 4366 21 is_stmt 0 view .LVU211 + 744 007a 4023 movs r3, #64 + 745 007c 2366 str r3, [r4, #96] + 746 .L59: +4367:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +4368:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4369:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_ABORT; + 747 .loc 1 4369 3 is_stmt 1 view .LVU212 + 748 .loc 1 4369 15 is_stmt 0 view .LVU213 + 749 007e 0723 movs r3, #7 + 750 0080 84F85D30 strb r3, [r4, #93] +4370:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 751 .loc 1 4370 1 view .LVU214 + 752 0084 04B0 add sp, sp, #16 + 753 .cfi_def_cfa_offset 8 + 754 @ sp needed + 755 0086 10BD pop {r4, pc} + 756 .LVL43: + 757 .L63: + 758 .loc 1 4370 1 view .LVU215 + 759 .align 2 + 760 .L62: + 761 0088 00000000 .word SystemCoreClock + 762 008c F1197605 .word 91625969 + 763 .cfi_endproc + 764 .LFE184: + 766 .section .text.SPI_AbortTx_ISR,"ax",%progbits + 767 .align 1 + 768 .syntax unified + 769 .thumb + 770 .thumb_func + 772 SPI_AbortTx_ISR: + 773 .LVL44: + 774 .LFB185: +4371:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4372:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /** +4373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @brief Handle abort a Tx or Rx/Tx transaction. +4374:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains +4375:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * the configuration information for SPI module. +4376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** * @retval None +4377:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** */ +4378:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** static void SPI_AbortTx_ISR(SPI_HandleTypeDef *hspi) +4379:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 775 .loc 1 4379 1 is_stmt 1 view -0 + 776 .cfi_startproc + 777 @ args = 0, pretend = 0, frame = 8 + 778 @ frame_needed = 0, uses_anonymous_args = 0 + 779 .loc 1 4379 1 is_stmt 0 view .LVU217 + 780 0000 10B5 push {r4, lr} + 781 .cfi_def_cfa_offset 8 + ARM GAS /tmp/ccywxtmH.s page 93 + + + 782 .cfi_offset 4, -8 + 783 .cfi_offset 14, -4 + 784 0002 84B0 sub sp, sp, #16 + 785 .cfi_def_cfa_offset 24 + 786 0004 0446 mov r4, r0 +4380:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __IO uint32_t count; + 787 .loc 1 4380 3 is_stmt 1 view .LVU218 +4381:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4382:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** count = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U); + 788 .loc 1 4382 3 view .LVU219 + 789 .loc 1 4382 56 is_stmt 0 view .LVU220 + 790 0006 384B ldr r3, .L78 + 791 0008 1B68 ldr r3, [r3] + 792 000a 384A ldr r2, .L78+4 + 793 000c A2FB0323 umull r2, r3, r2, r3 + 794 0010 5B0A lsrs r3, r3, #9 + 795 .loc 1 4382 31 view .LVU221 + 796 0012 6422 movs r2, #100 + 797 0014 02FB03F3 mul r3, r2, r3 + 798 .loc 1 4382 9 view .LVU222 + 799 0018 0393 str r3, [sp, #12] +4383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4384:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable TXEIE interrupt */ +4385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_TXEIE)); + 800 .loc 1 4385 3 is_stmt 1 view .LVU223 + 801 001a 0268 ldr r2, [r0] + 802 001c 5368 ldr r3, [r2, #4] + 803 001e 23F08003 bic r3, r3, #128 + 804 0022 5360 str r3, [r2, #4] + 805 .L67: +4386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4387:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check TXEIE is disabled */ +4388:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** do + 806 .loc 1 4388 3 view .LVU224 +4389:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4390:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (count == 0U) + 807 .loc 1 4390 5 view .LVU225 + 808 .loc 1 4390 15 is_stmt 0 view .LVU226 + 809 0024 039B ldr r3, [sp, #12] + 810 .loc 1 4390 8 view .LVU227 + 811 0026 43B1 cbz r3, .L76 +4391:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4392:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); +4393:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** break; +4394:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +4395:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** count--; + 812 .loc 1 4395 5 is_stmt 1 view .LVU228 + 813 .loc 1 4395 10 is_stmt 0 view .LVU229 + 814 0028 039B ldr r3, [sp, #12] + 815 002a 013B subs r3, r3, #1 + 816 002c 0393 str r3, [sp, #12] +4396:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } while (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_TXEIE)); + 817 .loc 1 4396 12 is_stmt 1 view .LVU230 + 818 002e 2368 ldr r3, [r4] + 819 0030 5B68 ldr r3, [r3, #4] + 820 0032 13F0800F tst r3, #128 + 821 0036 F5D1 bne .L67 + ARM GAS /tmp/ccywxtmH.s page 94 + + + 822 0038 03E0 b .L66 + 823 .L76: +4392:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** break; + 824 .loc 1 4392 7 view .LVU231 + 825 003a 236E ldr r3, [r4, #96] + 826 003c 43F04003 orr r3, r3, #64 + 827 0040 2366 str r3, [r4, #96] +4393:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 828 .loc 1 4393 7 view .LVU232 + 829 .L66: +4397:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4398:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (SPI_EndRxTxTransaction(hspi, SPI_DEFAULT_TIMEOUT, HAL_GetTick()) != HAL_OK) + 830 .loc 1 4398 3 view .LVU233 + 831 .loc 1 4398 7 is_stmt 0 view .LVU234 + 832 0042 FFF7FEFF bl HAL_GetTick + 833 .LVL45: + 834 .loc 1 4398 7 view .LVU235 + 835 0046 0246 mov r2, r0 + 836 0048 6421 movs r1, #100 + 837 004a 2046 mov r0, r4 + 838 004c FFF7FEFF bl SPI_EndRxTxTransaction + 839 .LVL46: + 840 .loc 1 4398 6 view .LVU236 + 841 0050 08B1 cbz r0, .L68 +4399:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4400:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + 842 .loc 1 4400 5 is_stmt 1 view .LVU237 + 843 .loc 1 4400 21 is_stmt 0 view .LVU238 + 844 0052 4023 movs r3, #64 + 845 0054 2366 str r3, [r4, #96] + 846 .L68: +4401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +4402:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4403:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable SPI Peripheral */ +4404:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_DISABLE(hspi); + 847 .loc 1 4404 3 is_stmt 1 view .LVU239 + 848 0056 2268 ldr r2, [r4] + 849 0058 1368 ldr r3, [r2] + 850 005a 23F04003 bic r3, r3, #64 + 851 005e 1360 str r3, [r2] +4405:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4406:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Empty the FRLVL fifo */ +4407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, SPI_DEFAULT_TIMEOUT, HAL + 852 .loc 1 4407 3 view .LVU240 + 853 .loc 1 4407 7 is_stmt 0 view .LVU241 + 854 0060 FFF7FEFF bl HAL_GetTick + 855 .LVL47: + 856 0064 0090 str r0, [sp] + 857 0066 6423 movs r3, #100 + 858 0068 0022 movs r2, #0 + 859 006a 4FF4C061 mov r1, #1536 + 860 006e 2046 mov r0, r4 + 861 0070 FFF7FEFF bl SPI_WaitFifoStateUntilTimeout + 862 .LVL48: + 863 .loc 1 4407 6 view .LVU242 + 864 0074 08B1 cbz r0, .L69 +4408:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + ARM GAS /tmp/ccywxtmH.s page 95 + + +4409:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + 865 .loc 1 4409 5 is_stmt 1 view .LVU243 + 866 .loc 1 4409 21 is_stmt 0 view .LVU244 + 867 0076 4023 movs r3, #64 + 868 0078 2366 str r3, [r4, #96] + 869 .L69: +4410:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +4411:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4412:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check case of Full-Duplex Mode and disable directly RXNEIE interrupt */ +4413:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXNEIE)) + 870 .loc 1 4413 3 is_stmt 1 view .LVU245 + 871 .loc 1 4413 7 is_stmt 0 view .LVU246 + 872 007a 2368 ldr r3, [r4] + 873 007c 5A68 ldr r2, [r3, #4] + 874 .loc 1 4413 6 view .LVU247 + 875 007e 12F0400F tst r2, #64 + 876 0082 2BD0 beq .L70 +4414:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4415:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable RXNEIE interrupt */ +4416:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** CLEAR_BIT(hspi->Instance->CR2, (SPI_CR2_RXNEIE)); + 877 .loc 1 4416 5 is_stmt 1 view .LVU248 + 878 0084 5A68 ldr r2, [r3, #4] + 879 0086 22F04002 bic r2, r2, #64 + 880 008a 5A60 str r2, [r3, #4] + 881 .L73: +4417:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4418:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check RXNEIE is disabled */ +4419:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** do + 882 .loc 1 4419 5 view .LVU249 +4420:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4421:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (count == 0U) + 883 .loc 1 4421 7 view .LVU250 + 884 .loc 1 4421 17 is_stmt 0 view .LVU251 + 885 008c 039B ldr r3, [sp, #12] + 886 .loc 1 4421 10 view .LVU252 + 887 008e 43B1 cbz r3, .L77 +4422:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4423:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_ABORT); +4424:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** break; +4425:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +4426:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** count--; + 888 .loc 1 4426 7 is_stmt 1 view .LVU253 + 889 .loc 1 4426 12 is_stmt 0 view .LVU254 + 890 0090 039B ldr r3, [sp, #12] + 891 0092 013B subs r3, r3, #1 + 892 0094 0393 str r3, [sp, #12] +4427:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } while (HAL_IS_BIT_SET(hspi->Instance->CR2, SPI_CR2_RXNEIE)); + 893 .loc 1 4427 14 is_stmt 1 view .LVU255 + 894 0096 2368 ldr r3, [r4] + 895 0098 5B68 ldr r3, [r3, #4] + 896 009a 13F0400F tst r3, #64 + 897 009e F5D1 bne .L73 + 898 00a0 03E0 b .L72 + 899 .L77: +4423:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** break; + 900 .loc 1 4423 9 view .LVU256 + 901 00a2 236E ldr r3, [r4, #96] + ARM GAS /tmp/ccywxtmH.s page 96 + + + 902 00a4 43F04003 orr r3, r3, #64 + 903 00a8 2366 str r3, [r4, #96] +4424:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 904 .loc 1 4424 9 view .LVU257 + 905 .L72: +4428:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4429:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Control the BSY flag */ +4430:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (SPI_WaitFlagStateUntilTimeout(hspi, SPI_FLAG_BSY, RESET, SPI_DEFAULT_TIMEOUT, HAL_GetTick() + 906 .loc 1 4430 5 view .LVU258 + 907 .loc 1 4430 9 is_stmt 0 view .LVU259 + 908 00aa FFF7FEFF bl HAL_GetTick + 909 .LVL49: + 910 00ae 0090 str r0, [sp] + 911 00b0 6423 movs r3, #100 + 912 00b2 0022 movs r2, #0 + 913 00b4 8021 movs r1, #128 + 914 00b6 2046 mov r0, r4 + 915 00b8 FFF7FEFF bl SPI_WaitFlagStateUntilTimeout + 916 .LVL50: + 917 .loc 1 4430 8 view .LVU260 + 918 00bc 08B1 cbz r0, .L74 +4431:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4432:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + 919 .loc 1 4432 7 is_stmt 1 view .LVU261 + 920 .loc 1 4432 23 is_stmt 0 view .LVU262 + 921 00be 4023 movs r3, #64 + 922 00c0 2366 str r3, [r4, #96] + 923 .L74: +4433:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +4434:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** +4435:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Empty the FRLVL fifo */ +4436:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (SPI_WaitFifoStateUntilTimeout(hspi, SPI_FLAG_FRLVL, SPI_FRLVL_EMPTY, SPI_DEFAULT_TIMEOUT, H + 924 .loc 1 4436 5 is_stmt 1 view .LVU263 + 925 .loc 1 4436 9 is_stmt 0 view .LVU264 + 926 00c2 FFF7FEFF bl HAL_GetTick + 927 .LVL51: + 928 00c6 0090 str r0, [sp] + 929 00c8 6423 movs r3, #100 + 930 00ca 0022 movs r2, #0 + 931 00cc 4FF4C061 mov r1, #1536 + 932 00d0 2046 mov r0, r4 + 933 00d2 FFF7FEFF bl SPI_WaitFifoStateUntilTimeout + 934 .LVL52: + 935 .loc 1 4436 8 view .LVU265 + 936 00d6 08B1 cbz r0, .L70 +4437:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { +4438:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + 937 .loc 1 4438 7 is_stmt 1 view .LVU266 + 938 .loc 1 4438 23 is_stmt 0 view .LVU267 + 939 00d8 4023 movs r3, #64 + 940 00da 2366 str r3, [r4, #96] + 941 .L70: +4439:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +4440:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } +4441:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_ABORT; + 942 .loc 1 4441 3 is_stmt 1 view .LVU268 + 943 .loc 1 4441 15 is_stmt 0 view .LVU269 + ARM GAS /tmp/ccywxtmH.s page 97 + + + 944 00dc 0723 movs r3, #7 + 945 00de 84F85D30 strb r3, [r4, #93] +4442:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 946 .loc 1 4442 1 view .LVU270 + 947 00e2 04B0 add sp, sp, #16 + 948 .cfi_def_cfa_offset 8 + 949 @ sp needed + 950 00e4 10BD pop {r4, pc} + 951 .LVL53: + 952 .L79: + 953 .loc 1 4442 1 view .LVU271 + 954 00e6 00BF .align 2 + 955 .L78: + 956 00e8 00000000 .word SystemCoreClock + 957 00ec F1197605 .word 91625969 + 958 .cfi_endproc + 959 .LFE185: + 961 .section .text.HAL_SPI_MspInit,"ax",%progbits + 962 .align 1 + 963 .weak HAL_SPI_MspInit + 964 .syntax unified + 965 .thumb + 966 .thumb_func + 968 HAL_SPI_MspInit: + 969 .LVL54: + 970 .LFB132: + 536:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Prevent unused argument(s) compilation warning */ + 971 .loc 1 536 1 is_stmt 1 view -0 + 972 .cfi_startproc + 973 @ args = 0, pretend = 0, frame = 0 + 974 @ frame_needed = 0, uses_anonymous_args = 0 + 975 @ link register save eliminated. + 538:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 976 .loc 1 538 3 view .LVU273 + 543:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 977 .loc 1 543 1 is_stmt 0 view .LVU274 + 978 0000 7047 bx lr + 979 .cfi_endproc + 980 .LFE132: + 982 .section .text.HAL_SPI_Init,"ax",%progbits + 983 .align 1 + 984 .global HAL_SPI_Init + 985 .syntax unified + 986 .thumb + 987 .thumb_func + 989 HAL_SPI_Init: + 990 .LVL55: + 991 .LFB130: + 317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t frxth; + 992 .loc 1 317 1 is_stmt 1 view -0 + 993 .cfi_startproc + 994 @ args = 0, pretend = 0, frame = 0 + 995 @ frame_needed = 0, uses_anonymous_args = 0 + 318:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 996 .loc 1 318 3 view .LVU276 + 321:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 997 .loc 1 321 3 view .LVU277 + ARM GAS /tmp/ccywxtmH.s page 98 + + + 321:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 998 .loc 1 321 6 is_stmt 0 view .LVU278 + 999 0000 0028 cmp r0, #0 + 1000 0002 6FD0 beq .L88 + 317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t frxth; + 1001 .loc 1 317 1 view .LVU279 + 1002 0004 10B5 push {r4, lr} + 1003 .cfi_def_cfa_offset 8 + 1004 .cfi_offset 4, -8 + 1005 .cfi_offset 14, -4 + 1006 0006 0446 mov r4, r0 + 327:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** assert_param(IS_SPI_MODE(hspi->Init.Mode)); + 1007 .loc 1 327 3 is_stmt 1 view .LVU280 + 328:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** assert_param(IS_SPI_DIRECTION(hspi->Init.Direction)); + 1008 .loc 1 328 3 view .LVU281 + 329:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** assert_param(IS_SPI_DATASIZE(hspi->Init.DataSize)); + 1009 .loc 1 329 3 view .LVU282 + 330:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** assert_param(IS_SPI_NSS(hspi->Init.NSS)); + 1010 .loc 1 330 3 view .LVU283 + 331:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** assert_param(IS_SPI_NSSP(hspi->Init.NSSPMode)); + 1011 .loc 1 331 3 view .LVU284 + 332:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** assert_param(IS_SPI_BAUDRATE_PRESCALER(hspi->Init.BaudRatePrescaler)); + 1012 .loc 1 332 3 view .LVU285 + 333:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** assert_param(IS_SPI_FIRST_BIT(hspi->Init.FirstBit)); + 1013 .loc 1 333 3 view .LVU286 + 334:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** assert_param(IS_SPI_TIMODE(hspi->Init.TIMode)); + 1014 .loc 1 334 3 view .LVU287 + 335:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.TIMode == SPI_TIMODE_DISABLE) + 1015 .loc 1 335 3 view .LVU288 + 336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1016 .loc 1 336 3 view .LVU289 + 336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1017 .loc 1 336 17 is_stmt 0 view .LVU290 + 1018 0008 436A ldr r3, [r0, #36] + 336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1019 .loc 1 336 6 view .LVU291 + 1020 000a 33B9 cbnz r3, .L83 + 338:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** assert_param(IS_SPI_CPHA(hspi->Init.CLKPhase)); + 1021 .loc 1 338 5 is_stmt 1 view .LVU292 + 339:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1022 .loc 1 339 5 view .LVU293 + 341:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1023 .loc 1 341 5 view .LVU294 + 341:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1024 .loc 1 341 19 is_stmt 0 view .LVU295 + 1025 000c 4368 ldr r3, [r0, #4] + 341:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1026 .loc 1 341 8 view .LVU296 + 1027 000e B3F5827F cmp r3, #260 + 1028 0012 05D0 beq .L84 + 348:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1029 .loc 1 348 7 is_stmt 1 view .LVU297 + 348:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1030 .loc 1 348 36 is_stmt 0 view .LVU298 + 1031 0014 0023 movs r3, #0 + 1032 0016 C361 str r3, [r0, #28] + 1033 0018 02E0 b .L84 + ARM GAS /tmp/ccywxtmH.s page 99 + + + 1034 .L83: + 353:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1035 .loc 1 353 5 is_stmt 1 view .LVU299 + 356:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->Init.CLKPhase = SPI_PHASE_1EDGE; + 1036 .loc 1 356 5 view .LVU300 + 356:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->Init.CLKPhase = SPI_PHASE_1EDGE; + 1037 .loc 1 356 28 is_stmt 0 view .LVU301 + 1038 001a 0023 movs r3, #0 + 1039 001c 0361 str r3, [r0, #16] + 357:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1040 .loc 1 357 5 is_stmt 1 view .LVU302 + 357:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1041 .loc 1 357 28 is_stmt 0 view .LVU303 + 1042 001e 4361 str r3, [r0, #20] + 1043 .L84: + 367:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ + 1044 .loc 1 367 3 is_stmt 1 view .LVU304 + 367:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_SPI_CRC */ + 1045 .loc 1 367 29 is_stmt 0 view .LVU305 + 1046 0020 0023 movs r3, #0 + 1047 0022 A362 str r3, [r4, #40] + 370:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1048 .loc 1 370 3 is_stmt 1 view .LVU306 + 370:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1049 .loc 1 370 11 is_stmt 0 view .LVU307 + 1050 0024 94F85D30 ldrb r3, [r4, #93] @ zero_extendqisi2 + 370:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1051 .loc 1 370 6 view .LVU308 + 1052 0028 002B cmp r3, #0 + 1053 002a 52D0 beq .L94 + 1054 .LVL56: + 1055 .L85: + 399:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1056 .loc 1 399 3 is_stmt 1 view .LVU309 + 399:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1057 .loc 1 399 15 is_stmt 0 view .LVU310 + 1058 002c 0223 movs r3, #2 + 1059 002e 84F85D30 strb r3, [r4, #93] + 402:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1060 .loc 1 402 3 is_stmt 1 view .LVU311 + 1061 0032 2268 ldr r2, [r4] + 1062 0034 1368 ldr r3, [r2] + 1063 0036 23F04003 bic r3, r3, #64 + 1064 003a 1360 str r3, [r2] + 405:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1065 .loc 1 405 3 view .LVU312 + 405:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1066 .loc 1 405 17 is_stmt 0 view .LVU313 + 1067 003c E368 ldr r3, [r4, #12] + 405:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1068 .loc 1 405 6 view .LVU314 + 1069 003e B3F5E06F cmp r3, #1792 + 1070 0042 4CD9 bls .L89 + 407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1071 .loc 1 407 11 view .LVU315 + 1072 0044 0022 movs r2, #0 + 1073 .L86: + ARM GAS /tmp/ccywxtmH.s page 100 + + + 1074 .LVL57: + 415:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1075 .loc 1 415 3 is_stmt 1 view .LVU316 + 415:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1076 .loc 1 415 6 is_stmt 0 view .LVU317 + 1077 0046 B3F5706F cmp r3, #3840 + 1078 004a 04D0 beq .L87 + 415:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1079 .loc 1 415 51 discriminator 1 view .LVU318 + 1080 004c B3F5E06F cmp r3, #1792 + 1081 0050 01D0 beq .L87 + 418:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1082 .loc 1 418 5 is_stmt 1 view .LVU319 + 418:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1083 .loc 1 418 31 is_stmt 0 view .LVU320 + 1084 0052 0023 movs r3, #0 + 1085 0054 A362 str r3, [r4, #40] + 1086 .L87: + 424:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (hspi->Init.Direction & (SPI_CR1_RXONLY | SPI_CR1_BIDIMODE)) | + 1087 .loc 1 424 3 is_stmt 1 view .LVU321 + 1088 0056 6368 ldr r3, [r4, #4] + 1089 0058 03F48273 and r3, r3, #260 + 1090 005c A168 ldr r1, [r4, #8] + 1091 005e 01F40441 and r1, r1, #33792 + 1092 0062 0B43 orrs r3, r3, r1 + 1093 0064 2169 ldr r1, [r4, #16] + 1094 0066 01F00201 and r1, r1, #2 + 1095 006a 0B43 orrs r3, r3, r1 + 1096 006c 6169 ldr r1, [r4, #20] + 1097 006e 01F00101 and r1, r1, #1 + 1098 0072 0B43 orrs r3, r3, r1 + 1099 0074 A169 ldr r1, [r4, #24] + 1100 0076 01F40071 and r1, r1, #512 + 1101 007a 0B43 orrs r3, r3, r1 + 1102 007c E169 ldr r1, [r4, #28] + 1103 007e 01F03801 and r1, r1, #56 + 1104 0082 0B43 orrs r3, r3, r1 + 1105 0084 216A ldr r1, [r4, #32] + 1106 0086 01F08001 and r1, r1, #128 + 1107 008a 0B43 orrs r3, r3, r1 + 1108 008c A16A ldr r1, [r4, #40] + 1109 008e 01F40051 and r1, r1, #8192 + 1110 0092 2068 ldr r0, [r4] + 1111 0094 0B43 orrs r3, r3, r1 + 1112 0096 0360 str r3, [r0] + 459:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (hspi->Init.TIMode & SPI_CR2_FRF) | + 1113 .loc 1 459 3 view .LVU322 + 1114 0098 638B ldrh r3, [r4, #26] + 1115 009a 03F00403 and r3, r3, #4 + 1116 009e 616A ldr r1, [r4, #36] + 1117 00a0 01F01001 and r1, r1, #16 + 1118 00a4 0B43 orrs r3, r3, r1 + 1119 00a6 616B ldr r1, [r4, #52] + 1120 00a8 01F00801 and r1, r1, #8 + 1121 00ac 0B43 orrs r3, r3, r1 + 1122 00ae E168 ldr r1, [r4, #12] + 1123 00b0 01F47061 and r1, r1, #3840 + ARM GAS /tmp/ccywxtmH.s page 101 + + + 1124 00b4 0B43 orrs r3, r3, r1 + 1125 00b6 2168 ldr r1, [r4] + 1126 00b8 1A43 orrs r2, r2, r3 + 1127 .LVL58: + 459:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (hspi->Init.TIMode & SPI_CR2_FRF) | + 1128 .loc 1 459 3 is_stmt 0 view .LVU323 + 1129 00ba 4A60 str r2, [r1, #4] + 476:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* SPI_I2SCFGR_I2SMOD */ + 1130 .loc 1 476 3 is_stmt 1 view .LVU324 + 1131 00bc 2268 ldr r2, [r4] + 1132 00be D369 ldr r3, [r2, #28] + 1133 00c0 23F40063 bic r3, r3, #2048 + 1134 00c4 D361 str r3, [r2, #28] + 479:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_READY; + 1135 .loc 1 479 3 view .LVU325 + 479:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_READY; + 1136 .loc 1 479 19 is_stmt 0 view .LVU326 + 1137 00c6 0020 movs r0, #0 + 1138 00c8 2066 str r0, [r4, #96] + 480:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1139 .loc 1 480 3 is_stmt 1 view .LVU327 + 480:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1140 .loc 1 480 19 is_stmt 0 view .LVU328 + 1141 00ca 0123 movs r3, #1 + 1142 00cc 84F85D30 strb r3, [r4, #93] + 482:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1143 .loc 1 482 3 is_stmt 1 view .LVU329 + 483:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1144 .loc 1 483 1 is_stmt 0 view .LVU330 + 1145 00d0 10BD pop {r4, pc} + 1146 .LVL59: + 1147 .L94: + 373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1148 .loc 1 373 5 is_stmt 1 view .LVU331 + 373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1149 .loc 1 373 16 is_stmt 0 view .LVU332 + 1150 00d2 84F85C30 strb r3, [r4, #92] + 395:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + 1151 .loc 1 395 5 is_stmt 1 view .LVU333 + 1152 00d6 2046 mov r0, r4 + 1153 .LVL60: + 395:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + 1154 .loc 1 395 5 is_stmt 0 view .LVU334 + 1155 00d8 FFF7FEFF bl HAL_SPI_MspInit + 1156 .LVL61: + 1157 00dc A6E7 b .L85 + 1158 .L89: + 411:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1159 .loc 1 411 11 view .LVU335 + 1160 00de 4FF48052 mov r2, #4096 + 1161 00e2 B0E7 b .L86 + 1162 .LVL62: + 1163 .L88: + 1164 .cfi_def_cfa_offset 0 + 1165 .cfi_restore 4 + 1166 .cfi_restore 14 + 323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + ARM GAS /tmp/ccywxtmH.s page 102 + + + 1167 .loc 1 323 12 view .LVU336 + 1168 00e4 0120 movs r0, #1 + 1169 .LVL63: + 483:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1170 .loc 1 483 1 view .LVU337 + 1171 00e6 7047 bx lr + 1172 .cfi_endproc + 1173 .LFE130: + 1175 .section .text.HAL_SPI_MspDeInit,"ax",%progbits + 1176 .align 1 + 1177 .weak HAL_SPI_MspDeInit + 1178 .syntax unified + 1179 .thumb + 1180 .thumb_func + 1182 HAL_SPI_MspDeInit: + 1183 .LVL64: + 1184 .LFB133: + 552:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Prevent unused argument(s) compilation warning */ + 1185 .loc 1 552 1 is_stmt 1 view -0 + 1186 .cfi_startproc + 1187 @ args = 0, pretend = 0, frame = 0 + 1188 @ frame_needed = 0, uses_anonymous_args = 0 + 1189 @ link register save eliminated. + 554:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1190 .loc 1 554 3 view .LVU339 + 559:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1191 .loc 1 559 1 is_stmt 0 view .LVU340 + 1192 0000 7047 bx lr + 1193 .cfi_endproc + 1194 .LFE133: + 1196 .section .text.HAL_SPI_DeInit,"ax",%progbits + 1197 .align 1 + 1198 .global HAL_SPI_DeInit + 1199 .syntax unified + 1200 .thumb + 1201 .thumb_func + 1203 HAL_SPI_DeInit: + 1204 .LVL65: + 1205 .LFB131: + 492:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check the SPI handle allocation */ + 1206 .loc 1 492 1 is_stmt 1 view -0 + 1207 .cfi_startproc + 1208 @ args = 0, pretend = 0, frame = 0 + 1209 @ frame_needed = 0, uses_anonymous_args = 0 + 494:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1210 .loc 1 494 3 view .LVU342 + 494:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1211 .loc 1 494 6 is_stmt 0 view .LVU343 + 1212 0000 90B1 cbz r0, .L98 + 492:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Check the SPI handle allocation */ + 1213 .loc 1 492 1 view .LVU344 + 1214 0002 10B5 push {r4, lr} + 1215 .cfi_def_cfa_offset 8 + 1216 .cfi_offset 4, -8 + 1217 .cfi_offset 14, -4 + 1218 0004 0446 mov r4, r0 + 500:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + ARM GAS /tmp/ccywxtmH.s page 103 + + + 1219 .loc 1 500 3 is_stmt 1 view .LVU345 + 502:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1220 .loc 1 502 3 view .LVU346 + 502:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1221 .loc 1 502 15 is_stmt 0 view .LVU347 + 1222 0006 0223 movs r3, #2 + 1223 0008 80F85D30 strb r3, [r0, #93] + 505:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1224 .loc 1 505 3 is_stmt 1 view .LVU348 + 1225 000c 0268 ldr r2, [r0] + 1226 000e 1368 ldr r3, [r2] + 1227 0010 23F04003 bic r3, r3, #64 + 1228 0014 1360 str r3, [r2] + 517:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + 1229 .loc 1 517 3 view .LVU349 + 1230 0016 FFF7FEFF bl HAL_SPI_MspDeInit + 1231 .LVL66: + 520:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_RESET; + 1232 .loc 1 520 3 view .LVU350 + 520:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_RESET; + 1233 .loc 1 520 19 is_stmt 0 view .LVU351 + 1234 001a 0020 movs r0, #0 + 1235 001c 2066 str r0, [r4, #96] + 521:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1236 .loc 1 521 3 is_stmt 1 view .LVU352 + 521:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1237 .loc 1 521 15 is_stmt 0 view .LVU353 + 1238 001e 84F85D00 strb r0, [r4, #93] + 524:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1239 .loc 1 524 3 is_stmt 1 view .LVU354 + 524:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1240 .loc 1 524 3 view .LVU355 + 1241 0022 84F85C00 strb r0, [r4, #92] + 524:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1242 .loc 1 524 3 view .LVU356 + 526:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1243 .loc 1 526 3 view .LVU357 + 527:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1244 .loc 1 527 1 is_stmt 0 view .LVU358 + 1245 0026 10BD pop {r4, pc} + 1246 .LVL67: + 1247 .L98: + 1248 .cfi_def_cfa_offset 0 + 1249 .cfi_restore 4 + 1250 .cfi_restore 14 + 496:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1251 .loc 1 496 12 view .LVU359 + 1252 0028 0120 movs r0, #1 + 1253 .LVL68: + 527:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1254 .loc 1 527 1 view .LVU360 + 1255 002a 7047 bx lr + 1256 .cfi_endproc + 1257 .LFE131: + 1259 .section .text.HAL_SPI_Transmit,"ax",%progbits + 1260 .align 1 + 1261 .global HAL_SPI_Transmit + ARM GAS /tmp/ccywxtmH.s page 104 + + + 1262 .syntax unified + 1263 .thumb + 1264 .thumb_func + 1266 HAL_SPI_Transmit: + 1267 .LVL69: + 1268 .LFB134: + 824:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t tickstart; + 1269 .loc 1 824 1 is_stmt 1 view -0 + 1270 .cfi_startproc + 1271 @ args = 0, pretend = 0, frame = 8 + 1272 @ frame_needed = 0, uses_anonymous_args = 0 + 824:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t tickstart; + 1273 .loc 1 824 1 is_stmt 0 view .LVU362 + 1274 0000 2DE9F043 push {r4, r5, r6, r7, r8, r9, lr} + 1275 .cfi_def_cfa_offset 28 + 1276 .cfi_offset 4, -28 + 1277 .cfi_offset 5, -24 + 1278 .cfi_offset 6, -20 + 1279 .cfi_offset 7, -16 + 1280 .cfi_offset 8, -12 + 1281 .cfi_offset 9, -8 + 1282 .cfi_offset 14, -4 + 1283 0004 83B0 sub sp, sp, #12 + 1284 .cfi_def_cfa_offset 40 + 1285 0006 1D46 mov r5, r3 + 825:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef errorcode = HAL_OK; + 1286 .loc 1 825 3 is_stmt 1 view .LVU363 + 826:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint16_t initial_TxXferCount; + 1287 .loc 1 826 3 view .LVU364 + 1288 .LVL70: + 827:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1289 .loc 1 827 3 view .LVU365 + 830:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1290 .loc 1 830 3 view .LVU366 + 833:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1291 .loc 1 833 3 view .LVU367 + 833:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1292 .loc 1 833 3 view .LVU368 + 1293 0008 90F85C30 ldrb r3, [r0, #92] @ zero_extendqisi2 + 1294 .LVL71: + 833:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1295 .loc 1 833 3 is_stmt 0 view .LVU369 + 1296 000c 012B cmp r3, #1 + 1297 000e 00F0F680 beq .L128 + 1298 0012 0446 mov r4, r0 + 1299 0014 8846 mov r8, r1 + 1300 0016 9146 mov r9, r2 + 833:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1301 .loc 1 833 3 is_stmt 1 discriminator 2 view .LVU370 + 1302 0018 0123 movs r3, #1 + 1303 001a 80F85C30 strb r3, [r0, #92] + 833:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1304 .loc 1 833 3 discriminator 2 view .LVU371 + 836:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** initial_TxXferCount = Size; + 1305 .loc 1 836 3 discriminator 2 view .LVU372 + 836:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** initial_TxXferCount = Size; + 1306 .loc 1 836 15 is_stmt 0 discriminator 2 view .LVU373 + ARM GAS /tmp/ccywxtmH.s page 105 + + + 1307 001e FFF7FEFF bl HAL_GetTick + 1308 .LVL72: + 836:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** initial_TxXferCount = Size; + 1309 .loc 1 836 15 discriminator 2 view .LVU374 + 1310 0022 0746 mov r7, r0 + 1311 .LVL73: + 837:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1312 .loc 1 837 3 is_stmt 1 discriminator 2 view .LVU375 + 839:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1313 .loc 1 839 3 discriminator 2 view .LVU376 + 839:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1314 .loc 1 839 11 is_stmt 0 discriminator 2 view .LVU377 + 1315 0024 94F85D60 ldrb r6, [r4, #93] @ zero_extendqisi2 + 1316 0028 F6B2 uxtb r6, r6 + 839:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1317 .loc 1 839 6 discriminator 2 view .LVU378 + 1318 002a 012E cmp r6, #1 + 1319 002c 40F0D480 bne .L129 + 845:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1320 .loc 1 845 3 is_stmt 1 view .LVU379 + 845:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1321 .loc 1 845 6 is_stmt 0 view .LVU380 + 1322 0030 B8F1000F cmp r8, #0 + 1323 0034 00F0D180 beq .L105 + 845:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1324 .loc 1 845 23 discriminator 1 view .LVU381 + 1325 0038 B9F1000F cmp r9, #0 + 1326 003c 00F0CD80 beq .L105 + 852:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_NONE; + 1327 .loc 1 852 3 is_stmt 1 view .LVU382 + 852:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_NONE; + 1328 .loc 1 852 21 is_stmt 0 view .LVU383 + 1329 0040 0323 movs r3, #3 + 1330 0042 84F85D30 strb r3, [r4, #93] + 853:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr = (uint8_t *)pData; + 1331 .loc 1 853 3 is_stmt 1 view .LVU384 + 853:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr = (uint8_t *)pData; + 1332 .loc 1 853 21 is_stmt 0 view .LVU385 + 1333 0046 0023 movs r3, #0 + 1334 0048 2366 str r3, [r4, #96] + 854:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferSize = Size; + 1335 .loc 1 854 3 is_stmt 1 view .LVU386 + 854:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferSize = Size; + 1336 .loc 1 854 21 is_stmt 0 view .LVU387 + 1337 004a C4F83880 str r8, [r4, #56] + 855:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = Size; + 1338 .loc 1 855 3 is_stmt 1 view .LVU388 + 855:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = Size; + 1339 .loc 1 855 21 is_stmt 0 view .LVU389 + 1340 004e A4F83C90 strh r9, [r4, #60] @ movhi + 856:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1341 .loc 1 856 3 is_stmt 1 view .LVU390 + 856:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1342 .loc 1 856 21 is_stmt 0 view .LVU391 + 1343 0052 A4F83E90 strh r9, [r4, #62] @ movhi + 859:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferSize = 0U; + 1344 .loc 1 859 3 is_stmt 1 view .LVU392 + ARM GAS /tmp/ccywxtmH.s page 106 + + + 859:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferSize = 0U; + 1345 .loc 1 859 21 is_stmt 0 view .LVU393 + 1346 0056 2364 str r3, [r4, #64] + 860:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = 0U; + 1347 .loc 1 860 3 is_stmt 1 view .LVU394 + 860:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = 0U; + 1348 .loc 1 860 21 is_stmt 0 view .LVU395 + 1349 0058 A4F84430 strh r3, [r4, #68] @ movhi + 861:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxISR = NULL; + 1350 .loc 1 861 3 is_stmt 1 view .LVU396 + 861:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxISR = NULL; + 1351 .loc 1 861 21 is_stmt 0 view .LVU397 + 1352 005c A4F84630 strh r3, [r4, #70] @ movhi + 862:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxISR = NULL; + 1353 .loc 1 862 3 is_stmt 1 view .LVU398 + 862:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxISR = NULL; + 1354 .loc 1 862 21 is_stmt 0 view .LVU399 + 1355 0060 2365 str r3, [r4, #80] + 863:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1356 .loc 1 863 3 is_stmt 1 view .LVU400 + 863:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1357 .loc 1 863 21 is_stmt 0 view .LVU401 + 1358 0062 E364 str r3, [r4, #76] + 866:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1359 .loc 1 866 3 is_stmt 1 view .LVU402 + 866:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1360 .loc 1 866 17 is_stmt 0 view .LVU403 + 1361 0064 A368 ldr r3, [r4, #8] + 866:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1362 .loc 1 866 6 view .LVU404 + 1363 0066 B3F5004F cmp r3, #32768 + 1364 006a 1ED0 beq .L135 + 1365 .L106: + 882:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1366 .loc 1 882 3 is_stmt 1 view .LVU405 + 882:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1367 .loc 1 882 12 is_stmt 0 view .LVU406 + 1368 006c 2368 ldr r3, [r4] + 882:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1369 .loc 1 882 22 view .LVU407 + 1370 006e 1A68 ldr r2, [r3] + 882:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1371 .loc 1 882 6 view .LVU408 + 1372 0070 12F0400F tst r2, #64 + 1373 0074 03D1 bne .L107 + 885:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1374 .loc 1 885 5 is_stmt 1 view .LVU409 + 1375 0076 1A68 ldr r2, [r3] + 1376 0078 42F04002 orr r2, r2, #64 + 1377 007c 1A60 str r2, [r3] + 1378 .L107: + 889:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1379 .loc 1 889 3 view .LVU410 + 889:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1380 .loc 1 889 17 is_stmt 0 view .LVU411 + 1381 007e E368 ldr r3, [r4, #12] + 889:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + ARM GAS /tmp/ccywxtmH.s page 107 + + + 1382 .loc 1 889 6 view .LVU412 + 1383 0080 B3F5E06F cmp r3, #1792 + 1384 0084 42D9 bls .L108 + 891:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1385 .loc 1 891 5 is_stmt 1 view .LVU413 + 891:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1386 .loc 1 891 20 is_stmt 0 view .LVU414 + 1387 0086 6368 ldr r3, [r4, #4] + 891:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1388 .loc 1 891 8 view .LVU415 + 1389 0088 13B1 cbz r3, .L109 + 891:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1390 .loc 1 891 45 discriminator 1 view .LVU416 + 1391 008a B9F1010F cmp r9, #1 + 1392 008e 23D1 bne .L111 + 1393 .L109: + 893:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 1394 .loc 1 893 7 is_stmt 1 view .LVU417 + 893:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 1395 .loc 1 893 46 is_stmt 0 view .LVU418 + 1396 0090 A26B ldr r2, [r4, #56] + 893:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 1397 .loc 1 893 11 view .LVU419 + 1398 0092 2368 ldr r3, [r4] + 893:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 1399 .loc 1 893 28 view .LVU420 + 1400 0094 1288 ldrh r2, [r2] + 893:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 1401 .loc 1 893 26 view .LVU421 + 1402 0096 DA60 str r2, [r3, #12] + 894:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; + 1403 .loc 1 894 7 is_stmt 1 view .LVU422 + 894:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; + 1404 .loc 1 894 11 is_stmt 0 view .LVU423 + 1405 0098 A36B ldr r3, [r4, #56] + 894:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; + 1406 .loc 1 894 24 view .LVU424 + 1407 009a 0233 adds r3, r3, #2 + 1408 009c A363 str r3, [r4, #56] + 895:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1409 .loc 1 895 7 is_stmt 1 view .LVU425 + 895:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1410 .loc 1 895 11 is_stmt 0 view .LVU426 + 1411 009e E38F ldrh r3, [r4, #62] + 1412 00a0 9BB2 uxth r3, r3 + 895:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1413 .loc 1 895 24 view .LVU427 + 1414 00a2 013B subs r3, r3, #1 + 1415 00a4 9BB2 uxth r3, r3 + 1416 00a6 E387 strh r3, [r4, #62] @ movhi + 1417 00a8 16E0 b .L111 + 1418 .L135: + 869:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_1LINE_TX(hspi); + 1419 .loc 1 869 5 is_stmt 1 view .LVU428 + 1420 00aa 2268 ldr r2, [r4] + 1421 00ac 1368 ldr r3, [r2] + 1422 00ae 23F04003 bic r3, r3, #64 + ARM GAS /tmp/ccywxtmH.s page 108 + + + 1423 00b2 1360 str r3, [r2] + 870:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1424 .loc 1 870 5 view .LVU429 + 1425 00b4 2268 ldr r2, [r4] + 1426 00b6 1368 ldr r3, [r2] + 1427 00b8 43F48043 orr r3, r3, #16384 + 1428 00bc 1360 str r3, [r2] + 1429 00be D5E7 b .L106 + 1430 .LVL74: + 1431 .L112: + 910:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1432 .loc 1 910 9 view .LVU430 + 910:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1433 .loc 1 910 16 is_stmt 0 view .LVU431 + 1434 00c0 FFF7FEFF bl HAL_GetTick + 1435 .LVL75: + 910:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1436 .loc 1 910 30 view .LVU432 + 1437 00c4 C01B subs r0, r0, r7 + 910:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1438 .loc 1 910 12 view .LVU433 + 1439 00c6 A842 cmp r0, r5 + 1440 00c8 03D3 bcc .L114 + 910:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1441 .loc 1 910 56 discriminator 1 view .LVU434 + 1442 00ca B5F1FF3F cmp r5, #-1 + 1443 00ce 40F08E80 bne .L130 + 1444 .L114: + 910:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1445 .loc 1 910 87 discriminator 3 view .LVU435 + 1446 00d2 002D cmp r5, #0 + 1447 00d4 00F08D80 beq .L131 + 1448 .L111: + 898:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1449 .loc 1 898 30 is_stmt 1 view .LVU436 + 898:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1450 .loc 1 898 16 is_stmt 0 view .LVU437 + 1451 00d8 E38F ldrh r3, [r4, #62] + 1452 00da 9BB2 uxth r3, r3 + 898:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1453 .loc 1 898 30 view .LVU438 + 1454 00dc 002B cmp r3, #0 + 1455 00de 66D0 beq .L116 + 901:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1456 .loc 1 901 7 is_stmt 1 view .LVU439 + 901:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1457 .loc 1 901 11 is_stmt 0 view .LVU440 + 1458 00e0 2368 ldr r3, [r4] + 1459 00e2 9A68 ldr r2, [r3, #8] + 901:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1460 .loc 1 901 10 view .LVU441 + 1461 00e4 12F0020F tst r2, #2 + 1462 00e8 EAD0 beq .L112 + 903:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 1463 .loc 1 903 9 is_stmt 1 view .LVU442 + 903:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 1464 .loc 1 903 48 is_stmt 0 view .LVU443 + ARM GAS /tmp/ccywxtmH.s page 109 + + + 1465 00ea A26B ldr r2, [r4, #56] + 903:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 1466 .loc 1 903 30 view .LVU444 + 1467 00ec 1288 ldrh r2, [r2] + 903:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 1468 .loc 1 903 28 view .LVU445 + 1469 00ee DA60 str r2, [r3, #12] + 904:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; + 1470 .loc 1 904 9 is_stmt 1 view .LVU446 + 904:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; + 1471 .loc 1 904 13 is_stmt 0 view .LVU447 + 1472 00f0 A36B ldr r3, [r4, #56] + 904:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; + 1473 .loc 1 904 26 view .LVU448 + 1474 00f2 0233 adds r3, r3, #2 + 1475 00f4 A363 str r3, [r4, #56] + 905:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1476 .loc 1 905 9 is_stmt 1 view .LVU449 + 905:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1477 .loc 1 905 13 is_stmt 0 view .LVU450 + 1478 00f6 B4F83EC0 ldrh ip, [r4, #62] + 1479 00fa 1FFA8CFC uxth ip, ip + 905:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1480 .loc 1 905 26 view .LVU451 + 1481 00fe 0CF1FF3C add ip, ip, #-1 + 1482 0102 1FFA8CFC uxth ip, ip + 1483 0106 A4F83EC0 strh ip, [r4, #62] @ movhi + 1484 010a E5E7 b .L111 + 1485 .LVL76: + 1486 .L108: + 921:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1487 .loc 1 921 5 is_stmt 1 view .LVU452 + 921:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1488 .loc 1 921 20 is_stmt 0 view .LVU453 + 1489 010c 6368 ldr r3, [r4, #4] + 921:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1490 .loc 1 921 8 view .LVU454 + 1491 010e 13B1 cbz r3, .L117 + 921:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1492 .loc 1 921 45 discriminator 1 view .LVU455 + 1493 0110 B9F1010F cmp r9, #1 + 1494 0114 33D1 bne .L120 + 1495 .L117: + 923:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1496 .loc 1 923 7 is_stmt 1 view .LVU456 + 923:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1497 .loc 1 923 15 is_stmt 0 view .LVU457 + 1498 0116 E38F ldrh r3, [r4, #62] + 1499 0118 9BB2 uxth r3, r3 + 923:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1500 .loc 1 923 10 view .LVU458 + 1501 011a 012B cmp r3, #1 + 1502 011c 0CD9 bls .L119 + 926:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 1503 .loc 1 926 9 is_stmt 1 view .LVU459 + 926:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 1504 .loc 1 926 48 is_stmt 0 view .LVU460 + ARM GAS /tmp/ccywxtmH.s page 110 + + + 1505 011e A26B ldr r2, [r4, #56] + 926:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 1506 .loc 1 926 13 view .LVU461 + 1507 0120 2368 ldr r3, [r4] + 926:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 1508 .loc 1 926 30 view .LVU462 + 1509 0122 1288 ldrh r2, [r2] + 926:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 1510 .loc 1 926 28 view .LVU463 + 1511 0124 DA60 str r2, [r3, #12] + 927:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount -= 2U; + 1512 .loc 1 927 9 is_stmt 1 view .LVU464 + 927:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount -= 2U; + 1513 .loc 1 927 13 is_stmt 0 view .LVU465 + 1514 0126 A36B ldr r3, [r4, #56] + 927:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount -= 2U; + 1515 .loc 1 927 26 view .LVU466 + 1516 0128 0233 adds r3, r3, #2 + 1517 012a A363 str r3, [r4, #56] + 928:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1518 .loc 1 928 9 is_stmt 1 view .LVU467 + 928:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1519 .loc 1 928 13 is_stmt 0 view .LVU468 + 1520 012c E38F ldrh r3, [r4, #62] + 1521 012e 9BB2 uxth r3, r3 + 928:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1522 .loc 1 928 27 view .LVU469 + 1523 0130 023B subs r3, r3, #2 + 1524 0132 9BB2 uxth r3, r3 + 1525 0134 E387 strh r3, [r4, #62] @ movhi + 1526 0136 22E0 b .L120 + 1527 .L119: + 932:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr ++; + 1528 .loc 1 932 9 is_stmt 1 view .LVU470 + 932:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr ++; + 1529 .loc 1 932 56 is_stmt 0 view .LVU471 + 1530 0138 A26B ldr r2, [r4, #56] + 932:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr ++; + 1531 .loc 1 932 32 view .LVU472 + 1532 013a 2368 ldr r3, [r4] + 932:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr ++; + 1533 .loc 1 932 51 view .LVU473 + 1534 013c 1278 ldrb r2, [r2] @ zero_extendqisi2 + 932:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr ++; + 1535 .loc 1 932 48 view .LVU474 + 1536 013e 1A73 strb r2, [r3, #12] + 933:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; + 1537 .loc 1 933 9 is_stmt 1 view .LVU475 + 933:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; + 1538 .loc 1 933 13 is_stmt 0 view .LVU476 + 1539 0140 A36B ldr r3, [r4, #56] + 933:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; + 1540 .loc 1 933 26 view .LVU477 + 1541 0142 0133 adds r3, r3, #1 + 1542 0144 A363 str r3, [r4, #56] + 934:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1543 .loc 1 934 9 is_stmt 1 view .LVU478 + ARM GAS /tmp/ccywxtmH.s page 111 + + + 934:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1544 .loc 1 934 13 is_stmt 0 view .LVU479 + 1545 0146 E38F ldrh r3, [r4, #62] + 1546 0148 9BB2 uxth r3, r3 + 934:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1547 .loc 1 934 26 view .LVU480 + 1548 014a 013B subs r3, r3, #1 + 1549 014c 9BB2 uxth r3, r3 + 1550 014e E387 strh r3, [r4, #62] @ movhi + 1551 0150 15E0 b .L120 + 1552 .LVL77: + 1553 .L122: + 951:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr++; + 1554 .loc 1 951 11 is_stmt 1 view .LVU481 + 951:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr++; + 1555 .loc 1 951 58 is_stmt 0 view .LVU482 + 1556 0152 A36B ldr r3, [r4, #56] + 951:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr++; + 1557 .loc 1 951 53 view .LVU483 + 1558 0154 1B78 ldrb r3, [r3] @ zero_extendqisi2 + 951:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr++; + 1559 .loc 1 951 50 view .LVU484 + 1560 0156 1373 strb r3, [r2, #12] + 952:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; + 1561 .loc 1 952 11 is_stmt 1 view .LVU485 + 952:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; + 1562 .loc 1 952 15 is_stmt 0 view .LVU486 + 1563 0158 A36B ldr r3, [r4, #56] + 952:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; + 1564 .loc 1 952 27 view .LVU487 + 1565 015a 0133 adds r3, r3, #1 + 1566 015c A363 str r3, [r4, #56] + 953:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1567 .loc 1 953 11 is_stmt 1 view .LVU488 + 953:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1568 .loc 1 953 15 is_stmt 0 view .LVU489 + 1569 015e E38F ldrh r3, [r4, #62] + 1570 0160 9BB2 uxth r3, r3 + 953:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1571 .loc 1 953 28 view .LVU490 + 1572 0162 013B subs r3, r3, #1 + 1573 0164 9BB2 uxth r3, r3 + 1574 0166 E387 strh r3, [r4, #62] @ movhi + 1575 0168 09E0 b .L120 + 1576 .L121: + 959:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1577 .loc 1 959 9 is_stmt 1 view .LVU491 + 959:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1578 .loc 1 959 16 is_stmt 0 view .LVU492 + 1579 016a FFF7FEFF bl HAL_GetTick + 1580 .LVL78: + 959:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1581 .loc 1 959 30 view .LVU493 + 1582 016e C01B subs r0, r0, r7 + 959:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1583 .loc 1 959 12 view .LVU494 + 1584 0170 A842 cmp r0, r5 + ARM GAS /tmp/ccywxtmH.s page 112 + + + 1585 0172 02D3 bcc .L124 + 959:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1586 .loc 1 959 56 discriminator 1 view .LVU495 + 1587 0174 B5F1FF3F cmp r5, #-1 + 1588 0178 3DD1 bne .L132 + 1589 .L124: + 959:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1590 .loc 1 959 87 discriminator 3 view .LVU496 + 1591 017a 002D cmp r5, #0 + 1592 017c 3DD0 beq .L133 + 1593 .L120: + 937:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1594 .loc 1 937 30 is_stmt 1 view .LVU497 + 937:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1595 .loc 1 937 16 is_stmt 0 view .LVU498 + 1596 017e E38F ldrh r3, [r4, #62] + 1597 0180 9BB2 uxth r3, r3 + 937:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1598 .loc 1 937 30 view .LVU499 + 1599 0182 A3B1 cbz r3, .L116 + 940:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1600 .loc 1 940 7 is_stmt 1 view .LVU500 + 940:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1601 .loc 1 940 11 is_stmt 0 view .LVU501 + 1602 0184 2268 ldr r2, [r4] + 1603 0186 9368 ldr r3, [r2, #8] + 940:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1604 .loc 1 940 10 view .LVU502 + 1605 0188 13F0020F tst r3, #2 + 1606 018c EDD0 beq .L121 + 942:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1607 .loc 1 942 9 is_stmt 1 view .LVU503 + 942:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1608 .loc 1 942 17 is_stmt 0 view .LVU504 + 1609 018e E38F ldrh r3, [r4, #62] + 1610 0190 9BB2 uxth r3, r3 + 942:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1611 .loc 1 942 12 view .LVU505 + 1612 0192 012B cmp r3, #1 + 1613 0194 DDD9 bls .L122 + 945:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 1614 .loc 1 945 11 is_stmt 1 view .LVU506 + 945:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 1615 .loc 1 945 50 is_stmt 0 view .LVU507 + 1616 0196 A36B ldr r3, [r4, #56] + 945:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 1617 .loc 1 945 32 view .LVU508 + 1618 0198 1B88 ldrh r3, [r3] + 945:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 1619 .loc 1 945 30 view .LVU509 + 1620 019a D360 str r3, [r2, #12] + 946:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount -= 2U; + 1621 .loc 1 946 11 is_stmt 1 view .LVU510 + 946:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount -= 2U; + 1622 .loc 1 946 15 is_stmt 0 view .LVU511 + 1623 019c A36B ldr r3, [r4, #56] + 946:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount -= 2U; + ARM GAS /tmp/ccywxtmH.s page 113 + + + 1624 .loc 1 946 28 view .LVU512 + 1625 019e 0233 adds r3, r3, #2 + 1626 01a0 A363 str r3, [r4, #56] + 947:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1627 .loc 1 947 11 is_stmt 1 view .LVU513 + 947:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1628 .loc 1 947 15 is_stmt 0 view .LVU514 + 1629 01a2 E38F ldrh r3, [r4, #62] + 1630 01a4 9BB2 uxth r3, r3 + 947:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1631 .loc 1 947 29 view .LVU515 + 1632 01a6 023B subs r3, r3, #2 + 1633 01a8 9BB2 uxth r3, r3 + 1634 01aa E387 strh r3, [r4, #62] @ movhi + 1635 01ac E7E7 b .L120 + 1636 .L116: + 976:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1637 .loc 1 976 3 is_stmt 1 view .LVU516 + 976:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1638 .loc 1 976 7 is_stmt 0 view .LVU517 + 1639 01ae 3A46 mov r2, r7 + 1640 01b0 2946 mov r1, r5 + 1641 01b2 2046 mov r0, r4 + 1642 01b4 FFF7FEFF bl SPI_EndRxTxTransaction + 1643 .LVL79: + 976:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1644 .loc 1 976 6 view .LVU518 + 1645 01b8 08B1 cbz r0, .L126 + 978:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1646 .loc 1 978 5 is_stmt 1 view .LVU519 + 978:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1647 .loc 1 978 21 is_stmt 0 view .LVU520 + 1648 01ba 2023 movs r3, #32 + 1649 01bc 2366 str r3, [r4, #96] + 1650 .L126: + 982:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1651 .loc 1 982 3 is_stmt 1 view .LVU521 + 982:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1652 .loc 1 982 17 is_stmt 0 view .LVU522 + 1653 01be A368 ldr r3, [r4, #8] + 982:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1654 .loc 1 982 6 view .LVU523 + 1655 01c0 33B9 cbnz r3, .L127 + 984:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1656 .loc 1 984 5 is_stmt 1 view .LVU524 + 1657 .LBB2: + 984:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1658 .loc 1 984 5 view .LVU525 + 1659 01c2 0193 str r3, [sp, #4] + 984:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1660 .loc 1 984 5 view .LVU526 + 1661 01c4 2368 ldr r3, [r4] + 1662 01c6 DA68 ldr r2, [r3, #12] + 1663 01c8 0192 str r2, [sp, #4] + 984:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1664 .loc 1 984 5 view .LVU527 + 1665 01ca 9B68 ldr r3, [r3, #8] + ARM GAS /tmp/ccywxtmH.s page 114 + + + 1666 01cc 0193 str r3, [sp, #4] + 984:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1667 .loc 1 984 5 view .LVU528 + 1668 01ce 019B ldr r3, [sp, #4] + 1669 .L127: + 1670 .LBE2: + 984:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1671 .loc 1 984 5 discriminator 1 view .LVU529 + 987:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1672 .loc 1 987 3 discriminator 1 view .LVU530 + 987:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1673 .loc 1 987 11 is_stmt 0 discriminator 1 view .LVU531 + 1674 01d0 236E ldr r3, [r4, #96] + 987:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1675 .loc 1 987 6 discriminator 1 view .LVU532 + 1676 01d2 13B9 cbnz r3, .L105 + 826:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint16_t initial_TxXferCount; + 1677 .loc 1 826 21 view .LVU533 + 1678 01d4 0026 movs r6, #0 + 1679 01d6 00E0 b .L105 + 1680 .LVL80: + 1681 .L129: + 841:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 1682 .loc 1 841 15 view .LVU534 + 1683 01d8 0226 movs r6, #2 + 1684 .LVL81: + 1685 .L105: + 993:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Process Unlocked */ + 1686 .loc 1 993 3 is_stmt 1 view .LVU535 + 993:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Process Unlocked */ + 1687 .loc 1 993 15 is_stmt 0 view .LVU536 + 1688 01da 0123 movs r3, #1 + 1689 01dc 84F85D30 strb r3, [r4, #93] + 995:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return errorcode; + 1690 .loc 1 995 3 is_stmt 1 view .LVU537 + 995:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return errorcode; + 1691 .loc 1 995 3 view .LVU538 + 1692 01e0 0023 movs r3, #0 + 1693 01e2 84F85C30 strb r3, [r4, #92] + 995:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return errorcode; + 1694 .loc 1 995 3 view .LVU539 + 996:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1695 .loc 1 996 3 view .LVU540 + 1696 .LVL82: + 1697 .L104: + 997:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1698 .loc 1 997 1 is_stmt 0 view .LVU541 + 1699 01e6 3046 mov r0, r6 + 1700 01e8 03B0 add sp, sp, #12 + 1701 .cfi_remember_state + 1702 .cfi_def_cfa_offset 28 + 1703 @ sp needed + 1704 01ea BDE8F083 pop {r4, r5, r6, r7, r8, r9, pc} + 1705 .LVL83: + 1706 .L130: + 1707 .cfi_restore_state + 912:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + ARM GAS /tmp/ccywxtmH.s page 115 + + + 1708 .loc 1 912 21 view .LVU542 + 1709 01ee 0326 movs r6, #3 + 1710 01f0 F3E7 b .L105 + 1711 .L131: + 1712 01f2 0326 movs r6, #3 + 1713 01f4 F1E7 b .L105 + 1714 .L132: + 961:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 1715 .loc 1 961 21 view .LVU543 + 1716 01f6 0326 movs r6, #3 + 1717 01f8 EFE7 b .L105 + 1718 .L133: + 1719 01fa 0326 movs r6, #3 + 1720 01fc EDE7 b .L105 + 1721 .LVL84: + 1722 .L128: + 833:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1723 .loc 1 833 3 view .LVU544 + 1724 01fe 0226 movs r6, #2 + 1725 0200 F1E7 b .L104 + 1726 .cfi_endproc + 1727 .LFE134: + 1729 .section .text.HAL_SPI_TransmitReceive,"ax",%progbits + 1730 .align 1 + 1731 .global HAL_SPI_TransmitReceive + 1732 .syntax unified + 1733 .thumb + 1734 .thumb_func + 1736 HAL_SPI_TransmitReceive: + 1737 .LVL85: + 1738 .LFB136: +1250:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint16_t initial_TxXferCount; + 1739 .loc 1 1250 1 is_stmt 1 view -0 + 1740 .cfi_startproc + 1741 @ args = 4, pretend = 0, frame = 0 + 1742 @ frame_needed = 0, uses_anonymous_args = 0 +1250:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint16_t initial_TxXferCount; + 1743 .loc 1 1250 1 is_stmt 0 view .LVU546 + 1744 0000 2DE9F843 push {r3, r4, r5, r6, r7, r8, r9, lr} + 1745 .cfi_def_cfa_offset 32 + 1746 .cfi_offset 3, -32 + 1747 .cfi_offset 4, -28 + 1748 .cfi_offset 5, -24 + 1749 .cfi_offset 6, -20 + 1750 .cfi_offset 7, -16 + 1751 .cfi_offset 8, -12 + 1752 .cfi_offset 9, -8 + 1753 .cfi_offset 14, -4 + 1754 0004 1F46 mov r7, r3 + 1755 0006 089D ldr r5, [sp, #32] +1251:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint16_t initial_RxXferCount; + 1756 .loc 1 1251 3 is_stmt 1 view .LVU547 +1252:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t tmp_mode; + 1757 .loc 1 1252 3 view .LVU548 +1253:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_SPI_StateTypeDef tmp_state; + 1758 .loc 1 1253 3 view .LVU549 +1254:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t tickstart; + ARM GAS /tmp/ccywxtmH.s page 116 + + + 1759 .loc 1 1254 3 view .LVU550 +1255:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) + 1760 .loc 1 1255 3 view .LVU551 +1265:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef errorcode = HAL_OK; + 1761 .loc 1 1265 3 view .LVU552 + 1762 .LVL86: +1266:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1763 .loc 1 1266 3 view .LVU553 +1269:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1764 .loc 1 1269 3 view .LVU554 +1272:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1765 .loc 1 1272 3 view .LVU555 +1272:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1766 .loc 1 1272 3 view .LVU556 + 1767 0008 90F85C30 ldrb r3, [r0, #92] @ zero_extendqisi2 + 1768 .LVL87: +1272:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1769 .loc 1 1272 3 is_stmt 0 view .LVU557 + 1770 000c 012B cmp r3, #1 + 1771 000e 00F06481 beq .L163 + 1772 0012 0446 mov r4, r0 + 1773 0014 8846 mov r8, r1 + 1774 0016 9146 mov r9, r2 +1272:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1775 .loc 1 1272 3 is_stmt 1 discriminator 2 view .LVU558 + 1776 0018 0123 movs r3, #1 + 1777 001a 80F85C30 strb r3, [r0, #92] +1272:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1778 .loc 1 1272 3 discriminator 2 view .LVU559 +1275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1779 .loc 1 1275 3 discriminator 2 view .LVU560 +1275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1780 .loc 1 1275 15 is_stmt 0 discriminator 2 view .LVU561 + 1781 001e FFF7FEFF bl HAL_GetTick + 1782 .LVL88: +1275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1783 .loc 1 1275 15 discriminator 2 view .LVU562 + 1784 0022 0646 mov r6, r0 + 1785 .LVL89: +1278:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** tmp_mode = hspi->Init.Mode; + 1786 .loc 1 1278 3 is_stmt 1 discriminator 2 view .LVU563 +1278:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** tmp_mode = hspi->Init.Mode; + 1787 .loc 1 1278 23 is_stmt 0 discriminator 2 view .LVU564 + 1788 0024 94F85D30 ldrb r3, [r4, #93] @ zero_extendqisi2 + 1789 0028 DBB2 uxtb r3, r3 + 1790 .LVL90: +1279:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** initial_TxXferCount = Size; + 1791 .loc 1 1279 3 is_stmt 1 discriminator 2 view .LVU565 +1279:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** initial_TxXferCount = Size; + 1792 .loc 1 1279 23 is_stmt 0 discriminator 2 view .LVU566 + 1793 002a 6268 ldr r2, [r4, #4] + 1794 .LVL91: +1280:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** initial_RxXferCount = Size; + 1795 .loc 1 1280 3 is_stmt 1 discriminator 2 view .LVU567 +1281:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) + 1796 .loc 1 1281 3 discriminator 2 view .LVU568 +1287:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** ((tmp_mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES) && (tmp_st + ARM GAS /tmp/ccywxtmH.s page 117 + + + 1797 .loc 1 1287 3 discriminator 2 view .LVU569 +1287:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** ((tmp_mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES) && (tmp_st + 1798 .loc 1 1287 6 is_stmt 0 discriminator 2 view .LVU570 + 1799 002c 012B cmp r3, #1 + 1800 002e 0AD0 beq .L138 +1287:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** ((tmp_mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES) && (tmp_st + 1801 .loc 1 1287 7 discriminator 1 view .LVU571 + 1802 0030 B2F5827F cmp r2, #260 + 1803 0034 40F03881 bne .L164 +1288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1804 .loc 1 1288 54 view .LVU572 + 1805 0038 A268 ldr r2, [r4, #8] + 1806 .LVL92: +1288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1807 .loc 1 1288 40 view .LVU573 + 1808 003a 002A cmp r2, #0 + 1809 003c 40F03D81 bne .L165 +1288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1810 .loc 1 1288 90 discriminator 1 view .LVU574 + 1811 0040 042B cmp r3, #4 + 1812 0042 40F03C81 bne .L166 + 1813 .L138: +1294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1814 .loc 1 1294 3 is_stmt 1 view .LVU575 +1294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1815 .loc 1 1294 6 is_stmt 0 view .LVU576 + 1816 0046 B8F1000F cmp r8, #0 + 1817 004a 00F03A81 beq .L167 +1294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1818 .loc 1 1294 25 discriminator 1 view .LVU577 + 1819 004e B9F1000F cmp r9, #0 + 1820 0052 00F03881 beq .L168 +1294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1821 .loc 1 1294 46 discriminator 2 view .LVU578 + 1822 0056 002F cmp r7, #0 + 1823 0058 00F03781 beq .L169 +1301:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1824 .loc 1 1301 3 is_stmt 1 view .LVU579 +1301:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1825 .loc 1 1301 11 is_stmt 0 view .LVU580 + 1826 005c 94F85D30 ldrb r3, [r4, #93] @ zero_extendqisi2 + 1827 .LVL93: +1301:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1828 .loc 1 1301 11 view .LVU581 + 1829 0060 DBB2 uxtb r3, r3 +1301:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1830 .loc 1 1301 6 view .LVU582 + 1831 0062 042B cmp r3, #4 + 1832 0064 02D0 beq .L140 +1303:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1833 .loc 1 1303 5 is_stmt 1 view .LVU583 +1303:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1834 .loc 1 1303 17 is_stmt 0 view .LVU584 + 1835 0066 0523 movs r3, #5 + 1836 0068 84F85D30 strb r3, [r4, #93] + 1837 .L140: +1307:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr = (uint8_t *)pRxData; + ARM GAS /tmp/ccywxtmH.s page 118 + + + 1838 .loc 1 1307 3 is_stmt 1 view .LVU585 +1307:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr = (uint8_t *)pRxData; + 1839 .loc 1 1307 21 is_stmt 0 view .LVU586 + 1840 006c 0023 movs r3, #0 + 1841 006e 2366 str r3, [r4, #96] +1308:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = Size; + 1842 .loc 1 1308 3 is_stmt 1 view .LVU587 +1308:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = Size; + 1843 .loc 1 1308 21 is_stmt 0 view .LVU588 + 1844 0070 C4F84090 str r9, [r4, #64] +1309:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferSize = Size; + 1845 .loc 1 1309 3 is_stmt 1 view .LVU589 +1309:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferSize = Size; + 1846 .loc 1 1309 21 is_stmt 0 view .LVU590 + 1847 0074 A4F84670 strh r7, [r4, #70] @ movhi +1310:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr = (uint8_t *)pTxData; + 1848 .loc 1 1310 3 is_stmt 1 view .LVU591 +1310:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr = (uint8_t *)pTxData; + 1849 .loc 1 1310 21 is_stmt 0 view .LVU592 + 1850 0078 A4F84470 strh r7, [r4, #68] @ movhi +1311:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = Size; + 1851 .loc 1 1311 3 is_stmt 1 view .LVU593 +1311:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = Size; + 1852 .loc 1 1311 21 is_stmt 0 view .LVU594 + 1853 007c C4F83880 str r8, [r4, #56] +1312:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferSize = Size; + 1854 .loc 1 1312 3 is_stmt 1 view .LVU595 +1312:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferSize = Size; + 1855 .loc 1 1312 21 is_stmt 0 view .LVU596 + 1856 0080 E787 strh r7, [r4, #62] @ movhi +1313:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1857 .loc 1 1313 3 is_stmt 1 view .LVU597 +1313:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1858 .loc 1 1313 21 is_stmt 0 view .LVU598 + 1859 0082 A787 strh r7, [r4, #60] @ movhi +1316:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxISR = NULL; + 1860 .loc 1 1316 3 is_stmt 1 view .LVU599 +1316:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxISR = NULL; + 1861 .loc 1 1316 21 is_stmt 0 view .LVU600 + 1862 0084 E364 str r3, [r4, #76] +1317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1863 .loc 1 1317 3 is_stmt 1 view .LVU601 +1317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1864 .loc 1 1317 21 is_stmt 0 view .LVU602 + 1865 0086 2365 str r3, [r4, #80] +1328:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1866 .loc 1 1328 3 is_stmt 1 view .LVU603 +1328:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1867 .loc 1 1328 18 is_stmt 0 view .LVU604 + 1868 0088 E368 ldr r3, [r4, #12] +1328:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1869 .loc 1 1328 6 view .LVU605 + 1870 008a B3F5E06F cmp r3, #1792 + 1871 008e 01D8 bhi .L141 +1328:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1872 .loc 1 1328 49 discriminator 1 view .LVU606 + 1873 0090 012F cmp r7, #1 + ARM GAS /tmp/ccywxtmH.s page 119 + + + 1874 0092 23D9 bls .L142 + 1875 .L141: +1331:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1876 .loc 1 1331 5 is_stmt 1 view .LVU607 + 1877 0094 2268 ldr r2, [r4] + 1878 0096 5368 ldr r3, [r2, #4] + 1879 0098 23F48053 bic r3, r3, #4096 + 1880 009c 5360 str r3, [r2, #4] + 1881 .LVL94: + 1882 .L143: +1340:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1883 .loc 1 1340 3 view .LVU608 +1340:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1884 .loc 1 1340 12 is_stmt 0 view .LVU609 + 1885 009e 2368 ldr r3, [r4] +1340:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1886 .loc 1 1340 22 view .LVU610 + 1887 00a0 1A68 ldr r2, [r3] +1340:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1888 .loc 1 1340 6 view .LVU611 + 1889 00a2 12F0400F tst r2, #64 + 1890 00a6 03D1 bne .L144 +1343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1891 .loc 1 1343 5 is_stmt 1 view .LVU612 + 1892 00a8 1A68 ldr r2, [r3] + 1893 00aa 42F04002 orr r2, r2, #64 + 1894 00ae 1A60 str r2, [r3] + 1895 .L144: +1347:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1896 .loc 1 1347 3 view .LVU613 +1347:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1897 .loc 1 1347 17 is_stmt 0 view .LVU614 + 1898 00b0 E368 ldr r3, [r4, #12] +1347:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1899 .loc 1 1347 6 view .LVU615 + 1900 00b2 B3F5E06F cmp r3, #1792 + 1901 00b6 58D9 bls .L145 +1349:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1902 .loc 1 1349 5 is_stmt 1 view .LVU616 +1349:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1903 .loc 1 1349 20 is_stmt 0 view .LVU617 + 1904 00b8 6368 ldr r3, [r4, #4] +1349:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1905 .loc 1 1349 8 view .LVU618 + 1906 00ba 0BB1 cbz r3, .L146 +1349:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1907 .loc 1 1349 45 discriminator 1 view .LVU619 + 1908 00bc 012F cmp r7, #1 + 1909 00be 0BD1 bne .L147 + 1910 .L146: +1351:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 1911 .loc 1 1351 7 is_stmt 1 view .LVU620 +1351:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 1912 .loc 1 1351 46 is_stmt 0 view .LVU621 + 1913 00c0 A26B ldr r2, [r4, #56] +1351:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 1914 .loc 1 1351 11 view .LVU622 + ARM GAS /tmp/ccywxtmH.s page 120 + + + 1915 00c2 2368 ldr r3, [r4] +1351:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 1916 .loc 1 1351 28 view .LVU623 + 1917 00c4 1288 ldrh r2, [r2] +1351:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 1918 .loc 1 1351 26 view .LVU624 + 1919 00c6 DA60 str r2, [r3, #12] +1352:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; + 1920 .loc 1 1352 7 is_stmt 1 view .LVU625 +1352:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; + 1921 .loc 1 1352 11 is_stmt 0 view .LVU626 + 1922 00c8 A36B ldr r3, [r4, #56] +1352:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; + 1923 .loc 1 1352 24 view .LVU627 + 1924 00ca 0233 adds r3, r3, #2 + 1925 00cc A363 str r3, [r4, #56] +1353:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1926 .loc 1 1353 7 is_stmt 1 view .LVU628 +1353:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1927 .loc 1 1353 11 is_stmt 0 view .LVU629 + 1928 00ce E38F ldrh r3, [r4, #62] + 1929 00d0 9BB2 uxth r3, r3 +1353:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1930 .loc 1 1353 24 view .LVU630 + 1931 00d2 013B subs r3, r3, #1 + 1932 00d4 9BB2 uxth r3, r3 + 1933 00d6 E387 strh r3, [r4, #62] @ movhi + 1934 .L147: +1387:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1935 .loc 1 1387 19 view .LVU631 + 1936 00d8 0127 movs r7, #1 + 1937 .LVL95: +1387:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1938 .loc 1 1387 19 view .LVU632 + 1939 00da 31E0 b .L148 + 1940 .LVL96: + 1941 .L142: +1336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1942 .loc 1 1336 5 is_stmt 1 view .LVU633 + 1943 00dc 2268 ldr r2, [r4] + 1944 00de 5368 ldr r3, [r2, #4] + 1945 00e0 43F48053 orr r3, r3, #4096 + 1946 00e4 5360 str r3, [r2, #4] + 1947 .LVL97: +1336:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 1948 .loc 1 1336 5 is_stmt 0 view .LVU634 + 1949 00e6 DAE7 b .L143 + 1950 .LVL98: + 1951 .L175: +1360:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 1952 .loc 1 1360 9 is_stmt 1 view .LVU635 +1360:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 1953 .loc 1 1360 48 is_stmt 0 view .LVU636 + 1954 00e8 A26B ldr r2, [r4, #56] +1360:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 1955 .loc 1 1360 30 view .LVU637 + 1956 00ea 1288 ldrh r2, [r2] + ARM GAS /tmp/ccywxtmH.s page 121 + + +1360:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 1957 .loc 1 1360 28 view .LVU638 + 1958 00ec DA60 str r2, [r3, #12] +1361:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; + 1959 .loc 1 1361 9 is_stmt 1 view .LVU639 +1361:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; + 1960 .loc 1 1361 13 is_stmt 0 view .LVU640 + 1961 00ee A36B ldr r3, [r4, #56] +1361:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; + 1962 .loc 1 1361 26 view .LVU641 + 1963 00f0 0233 adds r3, r3, #2 + 1964 00f2 A363 str r3, [r4, #56] +1362:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Next Data is a reception (Rx). Tx not allowed */ + 1965 .loc 1 1362 9 is_stmt 1 view .LVU642 +1362:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Next Data is a reception (Rx). Tx not allowed */ + 1966 .loc 1 1362 13 is_stmt 0 view .LVU643 + 1967 00f4 E38F ldrh r3, [r4, #62] + 1968 00f6 9BB2 uxth r3, r3 +1362:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Next Data is a reception (Rx). Tx not allowed */ + 1969 .loc 1 1362 26 view .LVU644 + 1970 00f8 013B subs r3, r3, #1 + 1971 00fa 9BB2 uxth r3, r3 + 1972 00fc E387 strh r3, [r4, #62] @ movhi +1364:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1973 .loc 1 1364 9 is_stmt 1 view .LVU645 + 1974 .LVL99: +1364:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 1975 .loc 1 1364 19 is_stmt 0 view .LVU646 + 1976 00fe 0027 movs r7, #0 + 1977 .LVL100: + 1978 .L149: +1381:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1979 .loc 1 1381 7 is_stmt 1 view .LVU647 +1381:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1980 .loc 1 1381 12 is_stmt 0 view .LVU648 + 1981 0100 2368 ldr r3, [r4] + 1982 0102 9A68 ldr r2, [r3, #8] +1381:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1983 .loc 1 1381 10 view .LVU649 + 1984 0104 12F0010F tst r2, #1 + 1985 0108 11D0 beq .L150 +1381:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1986 .loc 1 1381 61 discriminator 1 view .LVU650 + 1987 010a B4F84620 ldrh r2, [r4, #70] + 1988 010e 92B2 uxth r2, r2 +1381:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 1989 .loc 1 1381 53 discriminator 1 view .LVU651 + 1990 0110 6AB1 cbz r2, .L150 +1383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr += sizeof(uint16_t); + 1991 .loc 1 1383 9 is_stmt 1 view .LVU652 +1383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr += sizeof(uint16_t); + 1992 .loc 1 1383 67 is_stmt 0 view .LVU653 + 1993 0112 DA68 ldr r2, [r3, #12] +1383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr += sizeof(uint16_t); + 1994 .loc 1 1383 27 view .LVU654 + 1995 0114 236C ldr r3, [r4, #64] +1383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr += sizeof(uint16_t); + ARM GAS /tmp/ccywxtmH.s page 122 + + + 1996 .loc 1 1383 41 view .LVU655 + 1997 0116 1A80 strh r2, [r3] @ movhi +1384:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount--; + 1998 .loc 1 1384 9 is_stmt 1 view .LVU656 +1384:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount--; + 1999 .loc 1 1384 13 is_stmt 0 view .LVU657 + 2000 0118 236C ldr r3, [r4, #64] +1384:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount--; + 2001 .loc 1 1384 26 view .LVU658 + 2002 011a 0233 adds r3, r3, #2 + 2003 011c 2364 str r3, [r4, #64] +1385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Next Data is a Transmission (Tx). Tx is allowed */ + 2004 .loc 1 1385 9 is_stmt 1 view .LVU659 +1385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Next Data is a Transmission (Tx). Tx is allowed */ + 2005 .loc 1 1385 13 is_stmt 0 view .LVU660 + 2006 011e B4F84630 ldrh r3, [r4, #70] + 2007 0122 9BB2 uxth r3, r3 +1385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Next Data is a Transmission (Tx). Tx is allowed */ + 2008 .loc 1 1385 26 view .LVU661 + 2009 0124 013B subs r3, r3, #1 + 2010 0126 9BB2 uxth r3, r3 + 2011 0128 A4F84630 strh r3, [r4, #70] @ movhi +1387:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2012 .loc 1 1387 9 is_stmt 1 view .LVU662 + 2013 .LVL101: +1387:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2014 .loc 1 1387 19 is_stmt 0 view .LVU663 + 2015 012c 0127 movs r7, #1 + 2016 .LVL102: + 2017 .L150: +1389:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2018 .loc 1 1389 7 is_stmt 1 view .LVU664 +1389:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2019 .loc 1 1389 13 is_stmt 0 view .LVU665 + 2020 012e FFF7FEFF bl HAL_GetTick + 2021 .LVL103: +1389:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2022 .loc 1 1389 27 view .LVU666 + 2023 0132 831B subs r3, r0, r6 +1389:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2024 .loc 1 1389 10 view .LVU667 + 2025 0134 AB42 cmp r3, r5 + 2026 0136 03D3 bcc .L148 +1389:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2027 .loc 1 1389 53 discriminator 1 view .LVU668 + 2028 0138 B5F1FF3F cmp r5, #-1 + 2029 013c 40F0C780 bne .L170 + 2030 .LVL104: + 2031 .L148: +1355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2032 .loc 1 1355 37 is_stmt 1 view .LVU669 +1355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2033 .loc 1 1355 17 is_stmt 0 view .LVU670 + 2034 0140 E38F ldrh r3, [r4, #62] + 2035 0142 9BB2 uxth r3, r3 +1355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2036 .loc 1 1355 37 view .LVU671 + ARM GAS /tmp/ccywxtmH.s page 123 + + + 2037 0144 2BB9 cbnz r3, .L151 +1355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2038 .loc 1 1355 45 discriminator 1 view .LVU672 + 2039 0146 B4F84630 ldrh r3, [r4, #70] + 2040 014a 9BB2 uxth r3, r3 +1355:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2041 .loc 1 1355 37 discriminator 1 view .LVU673 + 2042 014c 002B cmp r3, #0 + 2043 014e 00F0A180 beq .L152 + 2044 .L151: +1358:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2045 .loc 1 1358 7 is_stmt 1 view .LVU674 +1358:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2046 .loc 1 1358 12 is_stmt 0 view .LVU675 + 2047 0152 2368 ldr r3, [r4] + 2048 0154 9A68 ldr r2, [r3, #8] +1358:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2049 .loc 1 1358 10 view .LVU676 + 2050 0156 12F0020F tst r2, #2 + 2051 015a D1D0 beq .L149 +1358:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2052 .loc 1 1358 60 discriminator 1 view .LVU677 + 2053 015c E28F ldrh r2, [r4, #62] + 2054 015e 92B2 uxth r2, r2 +1358:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2055 .loc 1 1358 52 discriminator 1 view .LVU678 + 2056 0160 002A cmp r2, #0 + 2057 0162 CDD0 beq .L149 +1358:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2058 .loc 1 1358 80 discriminator 2 view .LVU679 + 2059 0164 002F cmp r7, #0 + 2060 0166 CBD0 beq .L149 + 2061 0168 BEE7 b .L175 + 2062 .LVL105: + 2063 .L145: +1399:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2064 .loc 1 1399 5 is_stmt 1 view .LVU680 +1399:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2065 .loc 1 1399 20 is_stmt 0 view .LVU681 + 2066 016a 6368 ldr r3, [r4, #4] +1399:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2067 .loc 1 1399 8 view .LVU682 + 2068 016c 0BB1 cbz r3, .L153 +1399:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2069 .loc 1 1399 45 discriminator 1 view .LVU683 + 2070 016e 012F cmp r7, #1 + 2071 0170 0FD1 bne .L154 + 2072 .L153: +1401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2073 .loc 1 1401 7 is_stmt 1 view .LVU684 +1401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2074 .loc 1 1401 15 is_stmt 0 view .LVU685 + 2075 0172 E38F ldrh r3, [r4, #62] + 2076 0174 9BB2 uxth r3, r3 +1401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2077 .loc 1 1401 10 view .LVU686 + 2078 0176 012B cmp r3, #1 + ARM GAS /tmp/ccywxtmH.s page 124 + + + 2079 0178 0DD9 bls .L155 +1403:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 2080 .loc 1 1403 9 is_stmt 1 view .LVU687 +1403:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 2081 .loc 1 1403 48 is_stmt 0 view .LVU688 + 2082 017a A26B ldr r2, [r4, #56] +1403:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 2083 .loc 1 1403 13 view .LVU689 + 2084 017c 2368 ldr r3, [r4] +1403:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 2085 .loc 1 1403 30 view .LVU690 + 2086 017e 1288 ldrh r2, [r2] +1403:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 2087 .loc 1 1403 28 view .LVU691 + 2088 0180 DA60 str r2, [r3, #12] +1404:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount -= 2U; + 2089 .loc 1 1404 9 is_stmt 1 view .LVU692 +1404:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount -= 2U; + 2090 .loc 1 1404 13 is_stmt 0 view .LVU693 + 2091 0182 A36B ldr r3, [r4, #56] +1404:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount -= 2U; + 2092 .loc 1 1404 26 view .LVU694 + 2093 0184 0233 adds r3, r3, #2 + 2094 0186 A363 str r3, [r4, #56] +1405:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2095 .loc 1 1405 9 is_stmt 1 view .LVU695 +1405:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2096 .loc 1 1405 13 is_stmt 0 view .LVU696 + 2097 0188 E38F ldrh r3, [r4, #62] + 2098 018a 9BB2 uxth r3, r3 +1405:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2099 .loc 1 1405 27 view .LVU697 + 2100 018c 023B subs r3, r3, #2 + 2101 018e 9BB2 uxth r3, r3 + 2102 0190 E387 strh r3, [r4, #62] @ movhi + 2103 .L154: +1469:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2104 .loc 1 1469 19 view .LVU698 + 2105 0192 0127 movs r7, #1 + 2106 .LVL106: +1469:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2107 .loc 1 1469 19 view .LVU699 + 2108 0194 49E0 b .L161 + 2109 .LVL107: + 2110 .L155: +1409:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr++; + 2111 .loc 1 1409 9 is_stmt 1 view .LVU700 +1409:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr++; + 2112 .loc 1 1409 54 is_stmt 0 view .LVU701 + 2113 0196 A26B ldr r2, [r4, #56] +1409:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr++; + 2114 .loc 1 1409 31 view .LVU702 + 2115 0198 2368 ldr r3, [r4] +1409:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr++; + 2116 .loc 1 1409 49 view .LVU703 + 2117 019a 1278 ldrb r2, [r2] @ zero_extendqisi2 +1409:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr++; + ARM GAS /tmp/ccywxtmH.s page 125 + + + 2118 .loc 1 1409 46 view .LVU704 + 2119 019c 1A73 strb r2, [r3, #12] +1410:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; + 2120 .loc 1 1410 9 is_stmt 1 view .LVU705 +1410:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; + 2121 .loc 1 1410 13 is_stmt 0 view .LVU706 + 2122 019e A36B ldr r3, [r4, #56] +1410:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; + 2123 .loc 1 1410 25 view .LVU707 + 2124 01a0 0133 adds r3, r3, #1 + 2125 01a2 A363 str r3, [r4, #56] +1411:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2126 .loc 1 1411 9 is_stmt 1 view .LVU708 +1411:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2127 .loc 1 1411 13 is_stmt 0 view .LVU709 + 2128 01a4 E38F ldrh r3, [r4, #62] + 2129 01a6 9BB2 uxth r3, r3 +1411:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2130 .loc 1 1411 26 view .LVU710 + 2131 01a8 013B subs r3, r3, #1 + 2132 01aa 9BB2 uxth r3, r3 + 2133 01ac E387 strh r3, [r4, #62] @ movhi + 2134 01ae F0E7 b .L154 + 2135 .LVL108: + 2136 .L177: +1419:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2137 .loc 1 1419 9 is_stmt 1 view .LVU711 +1419:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2138 .loc 1 1419 17 is_stmt 0 view .LVU712 + 2139 01b0 E28F ldrh r2, [r4, #62] + 2140 01b2 92B2 uxth r2, r2 +1419:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2141 .loc 1 1419 12 view .LVU713 + 2142 01b4 012A cmp r2, #1 + 2143 01b6 0CD9 bls .L157 +1421:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 2144 .loc 1 1421 11 is_stmt 1 view .LVU714 +1421:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 2145 .loc 1 1421 50 is_stmt 0 view .LVU715 + 2146 01b8 A26B ldr r2, [r4, #56] +1421:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 2147 .loc 1 1421 32 view .LVU716 + 2148 01ba 1288 ldrh r2, [r2] +1421:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 2149 .loc 1 1421 30 view .LVU717 + 2150 01bc DA60 str r2, [r3, #12] +1422:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount -= 2U; + 2151 .loc 1 1422 11 is_stmt 1 view .LVU718 +1422:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount -= 2U; + 2152 .loc 1 1422 15 is_stmt 0 view .LVU719 + 2153 01be A36B ldr r3, [r4, #56] +1422:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount -= 2U; + 2154 .loc 1 1422 28 view .LVU720 + 2155 01c0 0233 adds r3, r3, #2 + 2156 01c2 A363 str r3, [r4, #56] +1423:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2157 .loc 1 1423 11 is_stmt 1 view .LVU721 + ARM GAS /tmp/ccywxtmH.s page 126 + + +1423:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2158 .loc 1 1423 15 is_stmt 0 view .LVU722 + 2159 01c4 E38F ldrh r3, [r4, #62] + 2160 01c6 9BB2 uxth r3, r3 +1423:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2161 .loc 1 1423 29 view .LVU723 + 2162 01c8 023B subs r3, r3, #2 + 2163 01ca 9BB2 uxth r3, r3 + 2164 01cc E387 strh r3, [r4, #62] @ movhi +1432:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 2165 .loc 1 1432 19 view .LVU724 + 2166 01ce 0027 movs r7, #0 + 2167 .LVL109: +1432:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 2168 .loc 1 1432 19 view .LVU725 + 2169 01d0 3DE0 b .L156 + 2170 .LVL110: + 2171 .L157: +1427:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr++; + 2172 .loc 1 1427 11 is_stmt 1 view .LVU726 +1427:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr++; + 2173 .loc 1 1427 56 is_stmt 0 view .LVU727 + 2174 01d2 A26B ldr r2, [r4, #56] +1427:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr++; + 2175 .loc 1 1427 51 view .LVU728 + 2176 01d4 1278 ldrb r2, [r2] @ zero_extendqisi2 +1427:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr++; + 2177 .loc 1 1427 48 view .LVU729 + 2178 01d6 1A73 strb r2, [r3, #12] +1428:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; + 2179 .loc 1 1428 11 is_stmt 1 view .LVU730 +1428:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; + 2180 .loc 1 1428 15 is_stmt 0 view .LVU731 + 2181 01d8 A36B ldr r3, [r4, #56] +1428:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; + 2182 .loc 1 1428 27 view .LVU732 + 2183 01da 0133 adds r3, r3, #1 + 2184 01dc A363 str r3, [r4, #56] +1429:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2185 .loc 1 1429 11 is_stmt 1 view .LVU733 +1429:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2186 .loc 1 1429 15 is_stmt 0 view .LVU734 + 2187 01de E38F ldrh r3, [r4, #62] + 2188 01e0 9BB2 uxth r3, r3 +1429:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2189 .loc 1 1429 28 view .LVU735 + 2190 01e2 013B subs r3, r3, #1 + 2191 01e4 9BB2 uxth r3, r3 + 2192 01e6 E387 strh r3, [r4, #62] @ movhi +1432:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 2193 .loc 1 1432 19 view .LVU736 + 2194 01e8 0027 movs r7, #0 + 2195 .LVL111: +1432:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 2196 .loc 1 1432 19 view .LVU737 + 2197 01ea 30E0 b .L156 + 2198 .LVL112: + ARM GAS /tmp/ccywxtmH.s page 127 + + + 2199 .L178: +1459:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2200 .loc 1 1459 13 is_stmt 1 view .LVU738 + 2201 01ec 2268 ldr r2, [r4] + 2202 01ee 5368 ldr r3, [r2, #4] + 2203 01f0 43F48053 orr r3, r3, #4096 + 2204 01f4 5360 str r3, [r2, #4] +1469:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2205 .loc 1 1469 19 is_stmt 0 view .LVU739 + 2206 01f6 0127 movs r7, #1 + 2207 .LVL113: +1469:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2208 .loc 1 1469 19 view .LVU740 + 2209 01f8 0DE0 b .L158 + 2210 .LVL114: + 2211 .L159: +1464:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr++; + 2212 .loc 1 1464 11 is_stmt 1 view .LVU741 +1464:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr++; + 2213 .loc 1 1464 28 is_stmt 0 view .LVU742 + 2214 01fa 226C ldr r2, [r4, #64] +1464:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr++; + 2215 .loc 1 1464 44 view .LVU743 + 2216 01fc 1B7B ldrb r3, [r3, #12] @ zero_extendqisi2 +1464:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr++; + 2217 .loc 1 1464 42 view .LVU744 + 2218 01fe 1370 strb r3, [r2] +1465:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount--; + 2219 .loc 1 1465 11 is_stmt 1 view .LVU745 +1465:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount--; + 2220 .loc 1 1465 15 is_stmt 0 view .LVU746 + 2221 0200 236C ldr r3, [r4, #64] +1465:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount--; + 2222 .loc 1 1465 27 view .LVU747 + 2223 0202 0133 adds r3, r3, #1 + 2224 0204 2364 str r3, [r4, #64] +1466:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2225 .loc 1 1466 11 is_stmt 1 view .LVU748 +1466:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2226 .loc 1 1466 15 is_stmt 0 view .LVU749 + 2227 0206 B4F84630 ldrh r3, [r4, #70] + 2228 020a 9BB2 uxth r3, r3 +1466:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2229 .loc 1 1466 28 view .LVU750 + 2230 020c 013B subs r3, r3, #1 + 2231 020e 9BB2 uxth r3, r3 + 2232 0210 A4F84630 strh r3, [r4, #70] @ movhi +1469:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2233 .loc 1 1469 19 view .LVU751 + 2234 0214 0127 movs r7, #1 + 2235 .LVL115: + 2236 .L158: +1471:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2237 .loc 1 1471 7 is_stmt 1 view .LVU752 +1471:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2238 .loc 1 1471 14 is_stmt 0 view .LVU753 + 2239 0216 FFF7FEFF bl HAL_GetTick + ARM GAS /tmp/ccywxtmH.s page 128 + + + 2240 .LVL116: +1471:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2241 .loc 1 1471 28 view .LVU754 + 2242 021a 801B subs r0, r0, r6 +1471:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2243 .loc 1 1471 10 view .LVU755 + 2244 021c A842 cmp r0, r5 + 2245 021e 02D3 bcc .L160 +1471:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2246 .loc 1 1471 54 discriminator 1 view .LVU756 + 2247 0220 B5F1FF3F cmp r5, #-1 + 2248 0224 55D1 bne .L172 + 2249 .L160: +1471:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2250 .loc 1 1471 87 discriminator 3 view .LVU757 + 2251 0226 002D cmp r5, #0 + 2252 0228 55D0 beq .L176 + 2253 .LVL117: + 2254 .L161: +1414:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2255 .loc 1 1414 37 is_stmt 1 view .LVU758 +1414:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2256 .loc 1 1414 17 is_stmt 0 view .LVU759 + 2257 022a E38F ldrh r3, [r4, #62] + 2258 022c 9BB2 uxth r3, r3 +1414:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2259 .loc 1 1414 37 view .LVU760 + 2260 022e 23B9 cbnz r3, .L162 +1414:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2261 .loc 1 1414 45 discriminator 1 view .LVU761 + 2262 0230 B4F84630 ldrh r3, [r4, #70] + 2263 0234 9BB2 uxth r3, r3 +1414:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2264 .loc 1 1414 37 discriminator 1 view .LVU762 + 2265 0236 002B cmp r3, #0 + 2266 0238 2CD0 beq .L152 + 2267 .L162: +1417:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2268 .loc 1 1417 7 is_stmt 1 view .LVU763 +1417:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2269 .loc 1 1417 12 is_stmt 0 view .LVU764 + 2270 023a 2368 ldr r3, [r4] + 2271 023c 9A68 ldr r2, [r3, #8] +1417:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2272 .loc 1 1417 10 view .LVU765 + 2273 023e 12F0020F tst r2, #2 + 2274 0242 04D0 beq .L156 +1417:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2275 .loc 1 1417 60 discriminator 1 view .LVU766 + 2276 0244 E28F ldrh r2, [r4, #62] + 2277 0246 92B2 uxth r2, r2 +1417:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2278 .loc 1 1417 52 discriminator 1 view .LVU767 + 2279 0248 0AB1 cbz r2, .L156 +1417:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2280 .loc 1 1417 80 discriminator 2 view .LVU768 + 2281 024a 002F cmp r7, #0 + ARM GAS /tmp/ccywxtmH.s page 129 + + + 2282 024c B0D1 bne .L177 + 2283 .LVL118: + 2284 .L156: +1449:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2285 .loc 1 1449 7 is_stmt 1 view .LVU769 +1449:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2286 .loc 1 1449 12 is_stmt 0 view .LVU770 + 2287 024e 2368 ldr r3, [r4] + 2288 0250 9A68 ldr r2, [r3, #8] +1449:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2289 .loc 1 1449 10 view .LVU771 + 2290 0252 12F0010F tst r2, #1 + 2291 0256 DED0 beq .L158 +1449:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2292 .loc 1 1449 61 discriminator 1 view .LVU772 + 2293 0258 B4F84620 ldrh r2, [r4, #70] + 2294 025c 92B2 uxth r2, r2 +1449:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2295 .loc 1 1449 53 discriminator 1 view .LVU773 + 2296 025e 002A cmp r2, #0 + 2297 0260 D9D0 beq .L158 +1451:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2298 .loc 1 1451 9 is_stmt 1 view .LVU774 +1451:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2299 .loc 1 1451 17 is_stmt 0 view .LVU775 + 2300 0262 B4F84620 ldrh r2, [r4, #70] + 2301 0266 92B2 uxth r2, r2 +1451:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2302 .loc 1 1451 12 view .LVU776 + 2303 0268 012A cmp r2, #1 + 2304 026a C6D9 bls .L159 +1453:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr += sizeof(uint16_t); + 2305 .loc 1 1453 11 is_stmt 1 view .LVU777 +1453:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr += sizeof(uint16_t); + 2306 .loc 1 1453 69 is_stmt 0 view .LVU778 + 2307 026c DA68 ldr r2, [r3, #12] +1453:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr += sizeof(uint16_t); + 2308 .loc 1 1453 29 view .LVU779 + 2309 026e 236C ldr r3, [r4, #64] +1453:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr += sizeof(uint16_t); + 2310 .loc 1 1453 43 view .LVU780 + 2311 0270 1A80 strh r2, [r3] @ movhi +1454:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount -= 2U; + 2312 .loc 1 1454 11 is_stmt 1 view .LVU781 +1454:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount -= 2U; + 2313 .loc 1 1454 15 is_stmt 0 view .LVU782 + 2314 0272 236C ldr r3, [r4, #64] +1454:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount -= 2U; + 2315 .loc 1 1454 28 view .LVU783 + 2316 0274 0233 adds r3, r3, #2 + 2317 0276 2364 str r3, [r4, #64] +1455:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->RxXferCount <= 1U) + 2318 .loc 1 1455 11 is_stmt 1 view .LVU784 +1455:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->RxXferCount <= 1U) + 2319 .loc 1 1455 15 is_stmt 0 view .LVU785 + 2320 0278 B4F84630 ldrh r3, [r4, #70] + 2321 027c 9BB2 uxth r3, r3 + ARM GAS /tmp/ccywxtmH.s page 130 + + +1455:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->RxXferCount <= 1U) + 2322 .loc 1 1455 29 view .LVU786 + 2323 027e 023B subs r3, r3, #2 + 2324 0280 9BB2 uxth r3, r3 + 2325 0282 A4F84630 strh r3, [r4, #70] @ movhi +1456:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2326 .loc 1 1456 11 is_stmt 1 view .LVU787 +1456:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2327 .loc 1 1456 19 is_stmt 0 view .LVU788 + 2328 0286 B4F84630 ldrh r3, [r4, #70] + 2329 028a 9BB2 uxth r3, r3 +1456:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2330 .loc 1 1456 14 view .LVU789 + 2331 028c 012B cmp r3, #1 + 2332 028e ADD9 bls .L178 +1469:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2333 .loc 1 1469 19 view .LVU790 + 2334 0290 0127 movs r7, #1 + 2335 .LVL119: +1469:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2336 .loc 1 1469 19 view .LVU791 + 2337 0292 C0E7 b .L158 + 2338 .LVL120: + 2339 .L152: +1537:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2340 .loc 1 1537 3 is_stmt 1 view .LVU792 +1537:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2341 .loc 1 1537 7 is_stmt 0 view .LVU793 + 2342 0294 3246 mov r2, r6 + 2343 0296 2946 mov r1, r5 + 2344 0298 2046 mov r0, r4 + 2345 029a FFF7FEFF bl SPI_EndRxTxTransaction + 2346 .LVL121: +1537:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2347 .loc 1 1537 6 view .LVU794 + 2348 029e 20B1 cbz r0, .L139 +1539:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_FLAG; + 2349 .loc 1 1539 5 is_stmt 1 view .LVU795 + 2350 .LVL122: +1540:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2351 .loc 1 1540 5 view .LVU796 +1540:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2352 .loc 1 1540 21 is_stmt 0 view .LVU797 + 2353 02a0 2023 movs r3, #32 + 2354 02a2 2366 str r3, [r4, #96] +1539:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_FLAG; + 2355 .loc 1 1539 15 view .LVU798 + 2356 02a4 0120 movs r0, #1 + 2357 02a6 00E0 b .L139 + 2358 .LVL123: + 2359 .L164: +1290:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 2360 .loc 1 1290 15 view .LVU799 + 2361 02a8 0220 movs r0, #2 + 2362 .LVL124: + 2363 .L139: +1544:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_UNLOCK(hspi); + ARM GAS /tmp/ccywxtmH.s page 131 + + + 2364 .loc 1 1544 3 is_stmt 1 view .LVU800 +1544:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_UNLOCK(hspi); + 2365 .loc 1 1544 15 is_stmt 0 view .LVU801 + 2366 02aa 0123 movs r3, #1 + 2367 02ac 84F85D30 strb r3, [r4, #93] +1545:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return errorcode; + 2368 .loc 1 1545 3 is_stmt 1 view .LVU802 +1545:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return errorcode; + 2369 .loc 1 1545 3 view .LVU803 + 2370 02b0 0023 movs r3, #0 + 2371 02b2 84F85C30 strb r3, [r4, #92] +1545:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return errorcode; + 2372 .loc 1 1545 3 view .LVU804 +1546:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2373 .loc 1 1546 3 view .LVU805 + 2374 .LVL125: + 2375 .L137: +1547:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 2376 .loc 1 1547 1 is_stmt 0 view .LVU806 + 2377 02b6 BDE8F883 pop {r3, r4, r5, r6, r7, r8, r9, pc} + 2378 .LVL126: + 2379 .L165: +1290:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 2380 .loc 1 1290 15 view .LVU807 + 2381 02ba 0220 movs r0, #2 + 2382 .LVL127: +1290:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 2383 .loc 1 1290 15 view .LVU808 + 2384 02bc F5E7 b .L139 + 2385 .LVL128: + 2386 .L166: +1290:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 2387 .loc 1 1290 15 view .LVU809 + 2388 02be 0220 movs r0, #2 + 2389 .LVL129: +1290:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 2390 .loc 1 1290 15 view .LVU810 + 2391 02c0 F3E7 b .L139 + 2392 .LVL130: + 2393 .L167: +1296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 2394 .loc 1 1296 15 view .LVU811 + 2395 02c2 0120 movs r0, #1 + 2396 .LVL131: +1296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 2397 .loc 1 1296 15 view .LVU812 + 2398 02c4 F1E7 b .L139 + 2399 .LVL132: + 2400 .L168: +1296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 2401 .loc 1 1296 15 view .LVU813 + 2402 02c6 0120 movs r0, #1 + 2403 .LVL133: +1296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 2404 .loc 1 1296 15 view .LVU814 + 2405 02c8 EFE7 b .L139 + 2406 .LVL134: + ARM GAS /tmp/ccywxtmH.s page 132 + + + 2407 .L169: +1296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 2408 .loc 1 1296 15 view .LVU815 + 2409 02ca 0120 movs r0, #1 + 2410 .LVL135: +1296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 2411 .loc 1 1296 15 view .LVU816 + 2412 02cc EDE7 b .L139 + 2413 .LVL136: + 2414 .L170: +1391:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 2415 .loc 1 1391 19 view .LVU817 + 2416 02ce 0320 movs r0, #3 + 2417 02d0 EBE7 b .L139 + 2418 .L172: +1473:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 2419 .loc 1 1473 19 view .LVU818 + 2420 02d2 0320 movs r0, #3 + 2421 02d4 E9E7 b .L139 + 2422 .L176: + 2423 02d6 0320 movs r0, #3 + 2424 02d8 E7E7 b .L139 + 2425 .LVL137: + 2426 .L163: +1272:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 2427 .loc 1 1272 3 view .LVU819 + 2428 02da 0220 movs r0, #2 + 2429 .LVL138: +1272:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 2430 .loc 1 1272 3 view .LVU820 + 2431 02dc EBE7 b .L137 + 2432 .cfi_endproc + 2433 .LFE136: + 2435 .section .text.HAL_SPI_Receive,"ax",%progbits + 2436 .align 1 + 2437 .global HAL_SPI_Receive + 2438 .syntax unified + 2439 .thumb + 2440 .thumb_func + 2442 HAL_SPI_Receive: + 2443 .LVL139: + 2444 .LFB135: +1009:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) + 2445 .loc 1 1009 1 is_stmt 1 view -0 + 2446 .cfi_startproc + 2447 @ args = 0, pretend = 0, frame = 0 + 2448 @ frame_needed = 0, uses_anonymous_args = 0 +1009:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) + 2449 .loc 1 1009 1 is_stmt 0 view .LVU822 + 2450 0000 2DE9F043 push {r4, r5, r6, r7, r8, r9, lr} + 2451 .cfi_def_cfa_offset 28 + 2452 .cfi_offset 4, -28 + 2453 .cfi_offset 5, -24 + 2454 .cfi_offset 6, -20 + 2455 .cfi_offset 7, -16 + 2456 .cfi_offset 8, -12 + 2457 .cfi_offset 9, -8 + ARM GAS /tmp/ccywxtmH.s page 133 + + + 2458 .cfi_offset 14, -4 + 2459 0004 83B0 sub sp, sp, #12 + 2460 .cfi_def_cfa_offset 40 + 2461 0006 0446 mov r4, r0 + 2462 0008 8846 mov r8, r1 + 2463 000a 9146 mov r9, r2 + 2464 000c 1D46 mov r5, r3 +1015:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef errorcode = HAL_OK; + 2465 .loc 1 1015 3 is_stmt 1 view .LVU823 +1016:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 2466 .loc 1 1016 3 view .LVU824 + 2467 .LVL140: +1018:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2468 .loc 1 1018 3 view .LVU825 +1018:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2469 .loc 1 1018 18 is_stmt 0 view .LVU826 + 2470 000e 4068 ldr r0, [r0, #4] + 2471 .LVL141: +1018:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2472 .loc 1 1018 6 view .LVU827 + 2473 0010 B0F5827F cmp r0, #260 + 2474 0014 43D0 beq .L206 + 2475 .LVL142: + 2476 .L180: +1026:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 2477 .loc 1 1026 3 is_stmt 1 view .LVU828 +1026:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 2478 .loc 1 1026 3 view .LVU829 + 2479 0016 94F85C30 ldrb r3, [r4, #92] @ zero_extendqisi2 + 2480 001a 012B cmp r3, #1 + 2481 001c 00F0C380 beq .L199 +1026:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 2482 .loc 1 1026 3 discriminator 2 view .LVU830 + 2483 0020 0123 movs r3, #1 + 2484 0022 84F85C30 strb r3, [r4, #92] +1026:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 2485 .loc 1 1026 3 discriminator 2 view .LVU831 +1029:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 2486 .loc 1 1029 3 discriminator 2 view .LVU832 +1029:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 2487 .loc 1 1029 15 is_stmt 0 discriminator 2 view .LVU833 + 2488 0026 FFF7FEFF bl HAL_GetTick + 2489 .LVL143: +1029:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 2490 .loc 1 1029 15 discriminator 2 view .LVU834 + 2491 002a 0746 mov r7, r0 + 2492 .LVL144: +1031:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2493 .loc 1 1031 3 is_stmt 1 discriminator 2 view .LVU835 +1031:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2494 .loc 1 1031 11 is_stmt 0 discriminator 2 view .LVU836 + 2495 002c 94F85D60 ldrb r6, [r4, #93] @ zero_extendqisi2 + 2496 0030 F6B2 uxtb r6, r6 +1031:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2497 .loc 1 1031 6 discriminator 2 view .LVU837 + 2498 0032 012E cmp r6, #1 + 2499 0034 40F0A480 bne .L200 + ARM GAS /tmp/ccywxtmH.s page 134 + + +1037:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2500 .loc 1 1037 3 is_stmt 1 view .LVU838 +1037:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2501 .loc 1 1037 6 is_stmt 0 view .LVU839 + 2502 0038 B8F1000F cmp r8, #0 + 2503 003c 00F0A180 beq .L182 +1037:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2504 .loc 1 1037 23 discriminator 1 view .LVU840 + 2505 0040 B9F1000F cmp r9, #0 + 2506 0044 00F09D80 beq .L182 +1044:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_NONE; + 2507 .loc 1 1044 3 is_stmt 1 view .LVU841 +1044:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_NONE; + 2508 .loc 1 1044 21 is_stmt 0 view .LVU842 + 2509 0048 0423 movs r3, #4 + 2510 004a 84F85D30 strb r3, [r4, #93] +1045:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr = (uint8_t *)pData; + 2511 .loc 1 1045 3 is_stmt 1 view .LVU843 +1045:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr = (uint8_t *)pData; + 2512 .loc 1 1045 21 is_stmt 0 view .LVU844 + 2513 004e 0023 movs r3, #0 + 2514 0050 2366 str r3, [r4, #96] +1046:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferSize = Size; + 2515 .loc 1 1046 3 is_stmt 1 view .LVU845 +1046:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferSize = Size; + 2516 .loc 1 1046 21 is_stmt 0 view .LVU846 + 2517 0052 C4F84080 str r8, [r4, #64] +1047:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = Size; + 2518 .loc 1 1047 3 is_stmt 1 view .LVU847 +1047:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = Size; + 2519 .loc 1 1047 21 is_stmt 0 view .LVU848 + 2520 0056 A4F84490 strh r9, [r4, #68] @ movhi +1048:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 2521 .loc 1 1048 3 is_stmt 1 view .LVU849 +1048:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 2522 .loc 1 1048 21 is_stmt 0 view .LVU850 + 2523 005a A4F84690 strh r9, [r4, #70] @ movhi +1051:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferSize = 0U; + 2524 .loc 1 1051 3 is_stmt 1 view .LVU851 +1051:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferSize = 0U; + 2525 .loc 1 1051 21 is_stmt 0 view .LVU852 + 2526 005e A363 str r3, [r4, #56] +1052:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = 0U; + 2527 .loc 1 1052 3 is_stmt 1 view .LVU853 +1052:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = 0U; + 2528 .loc 1 1052 21 is_stmt 0 view .LVU854 + 2529 0060 A387 strh r3, [r4, #60] @ movhi +1053:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxISR = NULL; + 2530 .loc 1 1053 3 is_stmt 1 view .LVU855 +1053:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxISR = NULL; + 2531 .loc 1 1053 21 is_stmt 0 view .LVU856 + 2532 0062 E387 strh r3, [r4, #62] @ movhi +1054:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxISR = NULL; + 2533 .loc 1 1054 3 is_stmt 1 view .LVU857 +1054:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxISR = NULL; + 2534 .loc 1 1054 21 is_stmt 0 view .LVU858 + 2535 0064 E364 str r3, [r4, #76] + ARM GAS /tmp/ccywxtmH.s page 135 + + +1055:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 2536 .loc 1 1055 3 is_stmt 1 view .LVU859 +1055:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 2537 .loc 1 1055 21 is_stmt 0 view .LVU860 + 2538 0066 2365 str r3, [r4, #80] +1068:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2539 .loc 1 1068 3 is_stmt 1 view .LVU861 +1068:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2540 .loc 1 1068 17 is_stmt 0 view .LVU862 + 2541 0068 E368 ldr r3, [r4, #12] +1068:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2542 .loc 1 1068 6 view .LVU863 + 2543 006a B3F5E06F cmp r3, #1792 + 2544 006e 24D9 bls .L183 +1071:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2545 .loc 1 1071 5 is_stmt 1 view .LVU864 + 2546 0070 2268 ldr r2, [r4] + 2547 0072 5368 ldr r3, [r2, #4] + 2548 0074 23F48053 bic r3, r3, #4096 + 2549 0078 5360 str r3, [r2, #4] + 2550 .L184: +1080:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2551 .loc 1 1080 3 view .LVU865 +1080:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2552 .loc 1 1080 17 is_stmt 0 view .LVU866 + 2553 007a A368 ldr r3, [r4, #8] +1080:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2554 .loc 1 1080 6 view .LVU867 + 2555 007c B3F5004F cmp r3, #32768 + 2556 0080 21D0 beq .L207 + 2557 .L185: +1088:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2558 .loc 1 1088 3 is_stmt 1 view .LVU868 +1088:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2559 .loc 1 1088 12 is_stmt 0 view .LVU869 + 2560 0082 2368 ldr r3, [r4] +1088:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2561 .loc 1 1088 22 view .LVU870 + 2562 0084 1A68 ldr r2, [r3] +1088:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2563 .loc 1 1088 6 view .LVU871 + 2564 0086 12F0400F tst r2, #64 + 2565 008a 03D1 bne .L186 +1091:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2566 .loc 1 1091 5 is_stmt 1 view .LVU872 + 2567 008c 1A68 ldr r2, [r3] + 2568 008e 42F04002 orr r2, r2, #64 + 2569 0092 1A60 str r2, [r3] + 2570 .L186: +1095:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2571 .loc 1 1095 3 view .LVU873 +1095:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2572 .loc 1 1095 17 is_stmt 0 view .LVU874 + 2573 0094 E368 ldr r3, [r4, #12] +1095:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2574 .loc 1 1095 6 view .LVU875 + 2575 0096 B3F5E06F cmp r3, #1792 + ARM GAS /tmp/ccywxtmH.s page 136 + + + 2576 009a 29D9 bls .L187 + 2577 009c 4AE0 b .L188 + 2578 .LVL145: + 2579 .L206: +1018:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2580 .loc 1 1018 58 discriminator 1 view .LVU876 + 2581 009e A368 ldr r3, [r4, #8] + 2582 .LVL146: +1018:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2583 .loc 1 1018 44 discriminator 1 view .LVU877 + 2584 00a0 002B cmp r3, #0 + 2585 00a2 B8D1 bne .L180 +1020:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line + 2586 .loc 1 1020 5 is_stmt 1 view .LVU878 +1020:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line + 2587 .loc 1 1020 17 is_stmt 0 view .LVU879 + 2588 00a4 0423 movs r3, #4 + 2589 00a6 84F85D30 strb r3, [r4, #93] +1022:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2590 .loc 1 1022 5 is_stmt 1 view .LVU880 +1022:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2591 .loc 1 1022 12 is_stmt 0 view .LVU881 + 2592 00aa 0095 str r5, [sp] + 2593 00ac 1346 mov r3, r2 + 2594 00ae 0A46 mov r2, r1 + 2595 .LVL147: +1022:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2596 .loc 1 1022 12 view .LVU882 + 2597 00b0 2046 mov r0, r4 + 2598 00b2 FFF7FEFF bl HAL_SPI_TransmitReceive + 2599 .LVL148: +1022:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2600 .loc 1 1022 12 view .LVU883 + 2601 00b6 0646 mov r6, r0 + 2602 00b8 69E0 b .L181 + 2603 .LVL149: + 2604 .L183: +1076:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2605 .loc 1 1076 5 is_stmt 1 view .LVU884 + 2606 00ba 2268 ldr r2, [r4] + 2607 00bc 5368 ldr r3, [r2, #4] + 2608 00be 43F48053 orr r3, r3, #4096 + 2609 00c2 5360 str r3, [r2, #4] + 2610 00c4 D9E7 b .L184 + 2611 .L207: +1083:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_1LINE_RX(hspi); + 2612 .loc 1 1083 5 view .LVU885 + 2613 00c6 2268 ldr r2, [r4] + 2614 00c8 1368 ldr r3, [r2] + 2615 00ca 23F04003 bic r3, r3, #64 + 2616 00ce 1360 str r3, [r2] +1084:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2617 .loc 1 1084 5 view .LVU886 + 2618 00d0 2268 ldr r2, [r4] + 2619 00d2 1368 ldr r3, [r2] + 2620 00d4 23F48043 bic r3, r3, #16384 + 2621 00d8 1360 str r3, [r2] + ARM GAS /tmp/ccywxtmH.s page 137 + + + 2622 00da D2E7 b .L185 + 2623 .LVL150: + 2624 .L189: +1111:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2625 .loc 1 1111 9 view .LVU887 +1111:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2626 .loc 1 1111 16 is_stmt 0 view .LVU888 + 2627 00dc FFF7FEFF bl HAL_GetTick + 2628 .LVL151: +1111:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2629 .loc 1 1111 30 view .LVU889 + 2630 00e0 C01B subs r0, r0, r7 +1111:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2631 .loc 1 1111 12 view .LVU890 + 2632 00e2 A842 cmp r0, r5 + 2633 00e4 02D3 bcc .L191 +1111:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2634 .loc 1 1111 56 discriminator 1 view .LVU891 + 2635 00e6 B5F1FF3F cmp r5, #-1 + 2636 00ea 54D1 bne .L201 + 2637 .L191: +1111:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2638 .loc 1 1111 87 discriminator 3 view .LVU892 + 2639 00ec 002D cmp r5, #0 + 2640 00ee 54D0 beq .L202 + 2641 .L187: +1098:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2642 .loc 1 1098 30 is_stmt 1 view .LVU893 +1098:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2643 .loc 1 1098 16 is_stmt 0 view .LVU894 + 2644 00f0 B4F84630 ldrh r3, [r4, #70] + 2645 00f4 9BB2 uxth r3, r3 +1098:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2646 .loc 1 1098 30 view .LVU895 + 2647 00f6 002B cmp r3, #0 + 2648 00f8 36D0 beq .L193 +1101:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2649 .loc 1 1101 7 is_stmt 1 view .LVU896 +1101:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2650 .loc 1 1101 11 is_stmt 0 view .LVU897 + 2651 00fa 2368 ldr r3, [r4] + 2652 00fc 9A68 ldr r2, [r3, #8] +1101:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2653 .loc 1 1101 10 view .LVU898 + 2654 00fe 12F0010F tst r2, #1 + 2655 0102 EBD0 beq .L189 +1104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr += sizeof(uint8_t); + 2656 .loc 1 1104 9 is_stmt 1 view .LVU899 +1104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr += sizeof(uint8_t); + 2657 .loc 1 1104 27 is_stmt 0 view .LVU900 + 2658 0104 226C ldr r2, [r4, #64] +1104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr += sizeof(uint8_t); + 2659 .loc 1 1104 43 view .LVU901 + 2660 0106 1B7B ldrb r3, [r3, #12] @ zero_extendqisi2 +1104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr += sizeof(uint8_t); + 2661 .loc 1 1104 41 view .LVU902 + 2662 0108 1370 strb r3, [r2] + ARM GAS /tmp/ccywxtmH.s page 138 + + +1105:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount--; + 2663 .loc 1 1105 9 is_stmt 1 view .LVU903 +1105:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount--; + 2664 .loc 1 1105 13 is_stmt 0 view .LVU904 + 2665 010a 236C ldr r3, [r4, #64] +1105:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount--; + 2666 .loc 1 1105 26 view .LVU905 + 2667 010c 0133 adds r3, r3, #1 + 2668 010e 2364 str r3, [r4, #64] +1106:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2669 .loc 1 1106 9 is_stmt 1 view .LVU906 +1106:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2670 .loc 1 1106 13 is_stmt 0 view .LVU907 + 2671 0110 B4F84630 ldrh r3, [r4, #70] + 2672 0114 9BB2 uxth r3, r3 +1106:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2673 .loc 1 1106 26 view .LVU908 + 2674 0116 013B subs r3, r3, #1 + 2675 0118 9BB2 uxth r3, r3 + 2676 011a A4F84630 strh r3, [r4, #70] @ movhi + 2677 011e E7E7 b .L187 + 2678 .L194: +1134:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2679 .loc 1 1134 9 is_stmt 1 view .LVU909 +1134:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2680 .loc 1 1134 16 is_stmt 0 view .LVU910 + 2681 0120 FFF7FEFF bl HAL_GetTick + 2682 .LVL152: +1134:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2683 .loc 1 1134 30 view .LVU911 + 2684 0124 C01B subs r0, r0, r7 +1134:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2685 .loc 1 1134 12 view .LVU912 + 2686 0126 A842 cmp r0, r5 + 2687 0128 02D3 bcc .L196 +1134:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2688 .loc 1 1134 56 discriminator 1 view .LVU913 + 2689 012a B5F1FF3F cmp r5, #-1 + 2690 012e 36D1 bne .L203 + 2691 .L196: +1134:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2692 .loc 1 1134 87 discriminator 3 view .LVU914 + 2693 0130 002D cmp r5, #0 + 2694 0132 36D0 beq .L204 + 2695 .L188: +1122:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2696 .loc 1 1122 30 is_stmt 1 view .LVU915 +1122:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2697 .loc 1 1122 16 is_stmt 0 view .LVU916 + 2698 0134 B4F84630 ldrh r3, [r4, #70] + 2699 0138 9BB2 uxth r3, r3 +1122:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2700 .loc 1 1122 30 view .LVU917 + 2701 013a ABB1 cbz r3, .L193 +1125:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2702 .loc 1 1125 7 is_stmt 1 view .LVU918 +1125:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + ARM GAS /tmp/ccywxtmH.s page 139 + + + 2703 .loc 1 1125 11 is_stmt 0 view .LVU919 + 2704 013c 2368 ldr r3, [r4] + 2705 013e 9A68 ldr r2, [r3, #8] +1125:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2706 .loc 1 1125 10 view .LVU920 + 2707 0140 12F0010F tst r2, #1 + 2708 0144 ECD0 beq .L194 +1127:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr += sizeof(uint16_t); + 2709 .loc 1 1127 9 is_stmt 1 view .LVU921 +1127:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr += sizeof(uint16_t); + 2710 .loc 1 1127 67 is_stmt 0 view .LVU922 + 2711 0146 DA68 ldr r2, [r3, #12] +1127:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr += sizeof(uint16_t); + 2712 .loc 1 1127 27 view .LVU923 + 2713 0148 236C ldr r3, [r4, #64] +1127:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr += sizeof(uint16_t); + 2714 .loc 1 1127 41 view .LVU924 + 2715 014a 1A80 strh r2, [r3] @ movhi +1128:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount--; + 2716 .loc 1 1128 9 is_stmt 1 view .LVU925 +1128:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount--; + 2717 .loc 1 1128 13 is_stmt 0 view .LVU926 + 2718 014c 236C ldr r3, [r4, #64] +1128:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount--; + 2719 .loc 1 1128 26 view .LVU927 + 2720 014e 0233 adds r3, r3, #2 + 2721 0150 2364 str r3, [r4, #64] +1129:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2722 .loc 1 1129 9 is_stmt 1 view .LVU928 +1129:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2723 .loc 1 1129 13 is_stmt 0 view .LVU929 + 2724 0152 B4F846C0 ldrh ip, [r4, #70] + 2725 0156 1FFA8CFC uxth ip, ip +1129:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2726 .loc 1 1129 26 view .LVU930 + 2727 015a 0CF1FF3C add ip, ip, #-1 + 2728 015e 1FFA8CFC uxth ip, ip + 2729 0162 A4F846C0 strh ip, [r4, #70] @ movhi + 2730 0166 E5E7 b .L188 + 2731 .L193: +1213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2732 .loc 1 1213 3 is_stmt 1 view .LVU931 +1213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2733 .loc 1 1213 7 is_stmt 0 view .LVU932 + 2734 0168 3A46 mov r2, r7 + 2735 016a 2946 mov r1, r5 + 2736 016c 2046 mov r0, r4 + 2737 016e FFF7FEFF bl SPI_EndRxTransaction + 2738 .LVL153: +1213:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2739 .loc 1 1213 6 view .LVU933 + 2740 0172 08B1 cbz r0, .L198 +1215:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2741 .loc 1 1215 5 is_stmt 1 view .LVU934 +1215:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2742 .loc 1 1215 21 is_stmt 0 view .LVU935 + 2743 0174 2023 movs r3, #32 + ARM GAS /tmp/ccywxtmH.s page 140 + + + 2744 0176 2366 str r3, [r4, #96] + 2745 .L198: +1227:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2746 .loc 1 1227 3 is_stmt 1 view .LVU936 +1227:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2747 .loc 1 1227 11 is_stmt 0 view .LVU937 + 2748 0178 236E ldr r3, [r4, #96] +1227:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2749 .loc 1 1227 6 view .LVU938 + 2750 017a 13B9 cbnz r3, .L182 +1016:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 2751 .loc 1 1016 21 view .LVU939 + 2752 017c 0026 movs r6, #0 + 2753 017e 00E0 b .L182 + 2754 .LVL154: + 2755 .L200: +1033:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 2756 .loc 1 1033 15 view .LVU940 + 2757 0180 0226 movs r6, #2 + 2758 .LVL155: + 2759 .L182: +1233:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_UNLOCK(hspi); + 2760 .loc 1 1233 3 is_stmt 1 view .LVU941 +1233:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_UNLOCK(hspi); + 2761 .loc 1 1233 15 is_stmt 0 view .LVU942 + 2762 0182 0123 movs r3, #1 + 2763 0184 84F85D30 strb r3, [r4, #93] +1234:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return errorcode; + 2764 .loc 1 1234 3 is_stmt 1 view .LVU943 +1234:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return errorcode; + 2765 .loc 1 1234 3 view .LVU944 + 2766 0188 0023 movs r3, #0 + 2767 018a 84F85C30 strb r3, [r4, #92] +1234:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return errorcode; + 2768 .loc 1 1234 3 view .LVU945 +1235:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2769 .loc 1 1235 3 view .LVU946 + 2770 .LVL156: + 2771 .L181: +1236:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 2772 .loc 1 1236 1 is_stmt 0 view .LVU947 + 2773 018e 3046 mov r0, r6 + 2774 0190 03B0 add sp, sp, #12 + 2775 .cfi_remember_state + 2776 .cfi_def_cfa_offset 28 + 2777 @ sp needed + 2778 0192 BDE8F083 pop {r4, r5, r6, r7, r8, r9, pc} + 2779 .LVL157: + 2780 .L201: + 2781 .cfi_restore_state +1113:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 2782 .loc 1 1113 21 view .LVU948 + 2783 0196 0326 movs r6, #3 + 2784 0198 F3E7 b .L182 + 2785 .L202: + 2786 019a 0326 movs r6, #3 + 2787 019c F1E7 b .L182 + ARM GAS /tmp/ccywxtmH.s page 141 + + + 2788 .L203: +1136:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 2789 .loc 1 1136 21 view .LVU949 + 2790 019e 0326 movs r6, #3 + 2791 01a0 EFE7 b .L182 + 2792 .L204: + 2793 01a2 0326 movs r6, #3 + 2794 01a4 EDE7 b .L182 + 2795 .LVL158: + 2796 .L199: +1026:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 2797 .loc 1 1026 3 view .LVU950 + 2798 01a6 0226 movs r6, #2 + 2799 01a8 F1E7 b .L181 + 2800 .cfi_endproc + 2801 .LFE135: + 2803 .section .text.HAL_SPI_Transmit_IT,"ax",%progbits + 2804 .align 1 + 2805 .global HAL_SPI_Transmit_IT + 2806 .syntax unified + 2807 .thumb + 2808 .thumb_func + 2810 HAL_SPI_Transmit_IT: + 2811 .LVL159: + 2812 .LFB137: +1558:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef errorcode = HAL_OK; + 2813 .loc 1 1558 1 is_stmt 1 view -0 + 2814 .cfi_startproc + 2815 @ args = 0, pretend = 0, frame = 0 + 2816 @ frame_needed = 0, uses_anonymous_args = 0 + 2817 @ link register save eliminated. +1558:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef errorcode = HAL_OK; + 2818 .loc 1 1558 1 is_stmt 0 view .LVU952 + 2819 0000 0346 mov r3, r0 +1559:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 2820 .loc 1 1559 3 is_stmt 1 view .LVU953 + 2821 .LVL160: +1562:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 2822 .loc 1 1562 3 view .LVU954 +1565:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 2823 .loc 1 1565 3 view .LVU955 +1565:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 2824 .loc 1 1565 3 view .LVU956 + 2825 0002 90F85C00 ldrb r0, [r0, #92] @ zero_extendqisi2 + 2826 .LVL161: +1565:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 2827 .loc 1 1565 3 is_stmt 0 view .LVU957 + 2828 0006 0128 cmp r0, #1 + 2829 0008 4CD0 beq .L214 +1565:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 2830 .loc 1 1565 3 is_stmt 1 discriminator 2 view .LVU958 + 2831 000a 0120 movs r0, #1 + 2832 000c 83F85C00 strb r0, [r3, #92] +1565:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 2833 .loc 1 1565 3 discriminator 2 view .LVU959 +1567:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2834 .loc 1 1567 3 discriminator 2 view .LVU960 + ARM GAS /tmp/ccywxtmH.s page 142 + + +1567:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2835 .loc 1 1567 6 is_stmt 0 discriminator 2 view .LVU961 + 2836 0010 0029 cmp r1, #0 + 2837 0012 3CD0 beq .L215 +1567:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2838 .loc 1 1567 23 discriminator 1 view .LVU962 + 2839 0014 002A cmp r2, #0 + 2840 0016 3CD0 beq .L216 +1573:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2841 .loc 1 1573 3 is_stmt 1 view .LVU963 +1573:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2842 .loc 1 1573 11 is_stmt 0 view .LVU964 + 2843 0018 93F85D00 ldrb r0, [r3, #93] @ zero_extendqisi2 + 2844 001c C0B2 uxtb r0, r0 +1573:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2845 .loc 1 1573 6 view .LVU965 + 2846 001e 0128 cmp r0, #1 + 2847 0020 3CD1 bne .L217 +1580:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_NONE; + 2848 .loc 1 1580 3 is_stmt 1 view .LVU966 +1580:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_NONE; + 2849 .loc 1 1580 21 is_stmt 0 view .LVU967 + 2850 0022 0320 movs r0, #3 + 2851 0024 83F85D00 strb r0, [r3, #93] +1581:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr = (uint8_t *)pData; + 2852 .loc 1 1581 3 is_stmt 1 view .LVU968 +1581:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr = (uint8_t *)pData; + 2853 .loc 1 1581 21 is_stmt 0 view .LVU969 + 2854 0028 0020 movs r0, #0 + 2855 002a 1866 str r0, [r3, #96] +1582:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferSize = Size; + 2856 .loc 1 1582 3 is_stmt 1 view .LVU970 +1582:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferSize = Size; + 2857 .loc 1 1582 21 is_stmt 0 view .LVU971 + 2858 002c 9963 str r1, [r3, #56] +1583:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = Size; + 2859 .loc 1 1583 3 is_stmt 1 view .LVU972 +1583:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = Size; + 2860 .loc 1 1583 21 is_stmt 0 view .LVU973 + 2861 002e 9A87 strh r2, [r3, #60] @ movhi +1584:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 2862 .loc 1 1584 3 is_stmt 1 view .LVU974 +1584:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 2863 .loc 1 1584 21 is_stmt 0 view .LVU975 + 2864 0030 DA87 strh r2, [r3, #62] @ movhi +1587:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferSize = 0U; + 2865 .loc 1 1587 3 is_stmt 1 view .LVU976 +1587:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferSize = 0U; + 2866 .loc 1 1587 21 is_stmt 0 view .LVU977 + 2867 0032 1864 str r0, [r3, #64] +1588:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = 0U; + 2868 .loc 1 1588 3 is_stmt 1 view .LVU978 +1588:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = 0U; + 2869 .loc 1 1588 21 is_stmt 0 view .LVU979 + 2870 0034 A3F84400 strh r0, [r3, #68] @ movhi +1589:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxISR = NULL; + 2871 .loc 1 1589 3 is_stmt 1 view .LVU980 + ARM GAS /tmp/ccywxtmH.s page 143 + + +1589:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxISR = NULL; + 2872 .loc 1 1589 21 is_stmt 0 view .LVU981 + 2873 0038 A3F84600 strh r0, [r3, #70] @ movhi +1590:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 2874 .loc 1 1590 3 is_stmt 1 view .LVU982 +1590:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 2875 .loc 1 1590 21 is_stmt 0 view .LVU983 + 2876 003c D864 str r0, [r3, #76] +1593:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2877 .loc 1 1593 3 is_stmt 1 view .LVU984 +1593:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2878 .loc 1 1593 17 is_stmt 0 view .LVU985 + 2879 003e DA68 ldr r2, [r3, #12] + 2880 .LVL162: +1593:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2881 .loc 1 1593 6 view .LVU986 + 2882 0040 B2F5E06F cmp r2, #1792 + 2883 0044 15D9 bls .L211 +1595:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2884 .loc 1 1595 5 is_stmt 1 view .LVU987 +1595:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2885 .loc 1 1595 17 is_stmt 0 view .LVU988 + 2886 0046 184A ldr r2, .L220 + 2887 0048 1A65 str r2, [r3, #80] + 2888 .L212: +1603:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2889 .loc 1 1603 3 is_stmt 1 view .LVU989 +1603:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2890 .loc 1 1603 17 is_stmt 0 view .LVU990 + 2891 004a 9A68 ldr r2, [r3, #8] +1603:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2892 .loc 1 1603 6 view .LVU991 + 2893 004c B2F5004F cmp r2, #32768 + 2894 0050 12D0 beq .L219 + 2895 .LVL163: + 2896 .L213: +1619:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 2897 .loc 1 1619 3 is_stmt 1 view .LVU992 + 2898 0052 1968 ldr r1, [r3] + 2899 0054 4A68 ldr r2, [r1, #4] + 2900 0056 42F0A002 orr r2, r2, #160 + 2901 005a 4A60 str r2, [r1, #4] +1623:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2902 .loc 1 1623 3 view .LVU993 +1623:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2903 .loc 1 1623 12 is_stmt 0 view .LVU994 + 2904 005c 1A68 ldr r2, [r3] +1623:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2905 .loc 1 1623 22 view .LVU995 + 2906 005e 1168 ldr r1, [r2] +1623:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 2907 .loc 1 1623 6 view .LVU996 + 2908 0060 11F0400F tst r1, #64 + 2909 0064 1CD1 bne .L218 +1626:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2910 .loc 1 1626 5 is_stmt 1 view .LVU997 + 2911 0066 1168 ldr r1, [r2] + ARM GAS /tmp/ccywxtmH.s page 144 + + + 2912 0068 41F04001 orr r1, r1, #64 + 2913 006c 1160 str r1, [r2] +1559:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 2914 .loc 1 1559 21 is_stmt 0 view .LVU998 + 2915 006e 0020 movs r0, #0 + 2916 0070 10E0 b .L210 + 2917 .LVL164: + 2918 .L211: +1599:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2919 .loc 1 1599 5 is_stmt 1 view .LVU999 +1599:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2920 .loc 1 1599 17 is_stmt 0 view .LVU1000 + 2921 0072 0E4A ldr r2, .L220+4 + 2922 0074 1A65 str r2, [r3, #80] + 2923 0076 E8E7 b .L212 + 2924 .L219: +1606:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_1LINE_TX(hspi); + 2925 .loc 1 1606 5 is_stmt 1 view .LVU1001 + 2926 0078 1968 ldr r1, [r3] + 2927 .LVL165: +1606:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_1LINE_TX(hspi); + 2928 .loc 1 1606 5 is_stmt 0 view .LVU1002 + 2929 007a 0A68 ldr r2, [r1] + 2930 007c 22F04002 bic r2, r2, #64 + 2931 0080 0A60 str r2, [r1] + 2932 .LVL166: +1607:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2933 .loc 1 1607 5 is_stmt 1 view .LVU1003 + 2934 0082 1968 ldr r1, [r3] + 2935 0084 0A68 ldr r2, [r1] + 2936 0086 42F48042 orr r2, r2, #16384 + 2937 008a 0A60 str r2, [r1] + 2938 008c E1E7 b .L213 + 2939 .LVL167: + 2940 .L215: +1569:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 2941 .loc 1 1569 15 is_stmt 0 view .LVU1004 + 2942 008e 0120 movs r0, #1 + 2943 0090 00E0 b .L210 + 2944 .L216: + 2945 0092 0120 movs r0, #1 + 2946 .LVL168: + 2947 .L210: +1630:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return errorcode; + 2948 .loc 1 1630 3 is_stmt 1 view .LVU1005 +1630:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return errorcode; + 2949 .loc 1 1630 3 view .LVU1006 + 2950 0094 0022 movs r2, #0 + 2951 0096 83F85C20 strb r2, [r3, #92] +1630:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return errorcode; + 2952 .loc 1 1630 3 view .LVU1007 +1631:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2953 .loc 1 1631 3 view .LVU1008 +1631:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 2954 .loc 1 1631 10 is_stmt 0 view .LVU1009 + 2955 009a 7047 bx lr + 2956 .LVL169: + ARM GAS /tmp/ccywxtmH.s page 145 + + + 2957 .L217: +1575:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 2958 .loc 1 1575 15 view .LVU1010 + 2959 009c 0220 movs r0, #2 + 2960 009e F9E7 b .L210 + 2961 .LVL170: + 2962 .L218: +1559:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 2963 .loc 1 1559 21 view .LVU1011 + 2964 00a0 0020 movs r0, #0 + 2965 00a2 F7E7 b .L210 + 2966 .LVL171: + 2967 .L214: +1565:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 2968 .loc 1 1565 3 view .LVU1012 + 2969 00a4 0220 movs r0, #2 +1632:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 2970 .loc 1 1632 1 view .LVU1013 + 2971 00a6 7047 bx lr + 2972 .L221: + 2973 .align 2 + 2974 .L220: + 2975 00a8 00000000 .word SPI_TxISR_16BIT + 2976 00ac 00000000 .word SPI_TxISR_8BIT + 2977 .cfi_endproc + 2978 .LFE137: + 2980 .section .text.HAL_SPI_TransmitReceive_IT,"ax",%progbits + 2981 .align 1 + 2982 .global HAL_SPI_TransmitReceive_IT + 2983 .syntax unified + 2984 .thumb + 2985 .thumb_func + 2987 HAL_SPI_TransmitReceive_IT: + 2988 .LVL172: + 2989 .LFB139: +1750:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t tmp_mode; + 2990 .loc 1 1750 1 is_stmt 1 view -0 + 2991 .cfi_startproc + 2992 @ args = 0, pretend = 0, frame = 0 + 2993 @ frame_needed = 0, uses_anonymous_args = 0 + 2994 @ link register save eliminated. +1750:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t tmp_mode; + 2995 .loc 1 1750 1 is_stmt 0 view .LVU1015 + 2996 0000 8446 mov ip, r0 +1751:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_SPI_StateTypeDef tmp_state; + 2997 .loc 1 1751 3 is_stmt 1 view .LVU1016 +1752:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef errorcode = HAL_OK; + 2998 .loc 1 1752 3 view .LVU1017 +1753:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 2999 .loc 1 1753 3 view .LVU1018 + 3000 .LVL173: +1756:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3001 .loc 1 1756 3 view .LVU1019 +1759:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3002 .loc 1 1759 3 view .LVU1020 +1759:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3003 .loc 1 1759 3 view .LVU1021 + ARM GAS /tmp/ccywxtmH.s page 146 + + + 3004 0002 90F85C00 ldrb r0, [r0, #92] @ zero_extendqisi2 + 3005 .LVL174: +1759:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3006 .loc 1 1759 3 is_stmt 0 view .LVU1022 + 3007 0006 0128 cmp r0, #1 + 3008 0008 79D0 beq .L232 +1750:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t tmp_mode; + 3009 .loc 1 1750 1 discriminator 2 view .LVU1023 + 3010 000a 10B4 push {r4} + 3011 .cfi_def_cfa_offset 4 + 3012 .cfi_offset 4, -4 +1759:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3013 .loc 1 1759 3 is_stmt 1 discriminator 2 view .LVU1024 + 3014 000c 0120 movs r0, #1 + 3015 000e 8CF85C00 strb r0, [ip, #92] +1759:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3016 .loc 1 1759 3 discriminator 2 view .LVU1025 +1762:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** tmp_mode = hspi->Init.Mode; + 3017 .loc 1 1762 3 discriminator 2 view .LVU1026 +1762:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** tmp_mode = hspi->Init.Mode; + 3018 .loc 1 1762 23 is_stmt 0 discriminator 2 view .LVU1027 + 3019 0012 9CF85D00 ldrb r0, [ip, #93] @ zero_extendqisi2 + 3020 0016 C0B2 uxtb r0, r0 + 3021 .LVL175: +1763:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3022 .loc 1 1763 3 is_stmt 1 discriminator 2 view .LVU1028 +1763:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3023 .loc 1 1763 23 is_stmt 0 discriminator 2 view .LVU1029 + 3024 0018 DCF80440 ldr r4, [ip, #4] + 3025 .LVL176: +1765:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** ((tmp_mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES) && (tmp_st + 3026 .loc 1 1765 3 is_stmt 1 discriminator 2 view .LVU1030 +1765:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** ((tmp_mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES) && (tmp_st + 3027 .loc 1 1765 6 is_stmt 0 discriminator 2 view .LVU1031 + 3028 001c 0128 cmp r0, #1 + 3029 001e 08D0 beq .L224 +1765:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** ((tmp_mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES) && (tmp_st + 3030 .loc 1 1765 7 discriminator 1 view .LVU1032 + 3031 0020 B4F5827F cmp r4, #260 + 3032 0024 58D1 bne .L233 +1766:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3033 .loc 1 1766 54 view .LVU1033 + 3034 0026 DCF80840 ldr r4, [ip, #8] + 3035 .LVL177: +1766:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3036 .loc 1 1766 40 view .LVU1034 + 3037 002a 002C cmp r4, #0 + 3038 002c 5BD1 bne .L234 +1766:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3039 .loc 1 1766 90 discriminator 1 view .LVU1035 + 3040 002e 0428 cmp r0, #4 + 3041 0030 5BD1 bne .L235 + 3042 .L224: +1772:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3043 .loc 1 1772 3 is_stmt 1 view .LVU1036 +1772:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3044 .loc 1 1772 6 is_stmt 0 view .LVU1037 + ARM GAS /tmp/ccywxtmH.s page 147 + + + 3045 0032 0029 cmp r1, #0 + 3046 0034 5BD0 beq .L236 +1772:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3047 .loc 1 1772 25 discriminator 1 view .LVU1038 + 3048 0036 002A cmp r2, #0 + 3049 0038 5BD0 beq .L237 +1772:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3050 .loc 1 1772 46 discriminator 2 view .LVU1039 + 3051 003a 002B cmp r3, #0 + 3052 003c 5BD0 beq .L238 +1779:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3053 .loc 1 1779 3 is_stmt 1 view .LVU1040 +1779:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3054 .loc 1 1779 11 is_stmt 0 view .LVU1041 + 3055 003e 9CF85D00 ldrb r0, [ip, #93] @ zero_extendqisi2 + 3056 .LVL178: +1779:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3057 .loc 1 1779 11 view .LVU1042 + 3058 0042 C0B2 uxtb r0, r0 +1779:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3059 .loc 1 1779 6 view .LVU1043 + 3060 0044 0428 cmp r0, #4 + 3061 0046 02D0 beq .L226 +1781:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 3062 .loc 1 1781 5 is_stmt 1 view .LVU1044 +1781:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 3063 .loc 1 1781 17 is_stmt 0 view .LVU1045 + 3064 0048 0520 movs r0, #5 + 3065 004a 8CF85D00 strb r0, [ip, #93] + 3066 .L226: +1785:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr = (uint8_t *)pTxData; + 3067 .loc 1 1785 3 is_stmt 1 view .LVU1046 +1785:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr = (uint8_t *)pTxData; + 3068 .loc 1 1785 21 is_stmt 0 view .LVU1047 + 3069 004e 0020 movs r0, #0 + 3070 0050 CCF86000 str r0, [ip, #96] +1786:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferSize = Size; + 3071 .loc 1 1786 3 is_stmt 1 view .LVU1048 +1786:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferSize = Size; + 3072 .loc 1 1786 21 is_stmt 0 view .LVU1049 + 3073 0054 CCF83810 str r1, [ip, #56] +1787:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = Size; + 3074 .loc 1 1787 3 is_stmt 1 view .LVU1050 +1787:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = Size; + 3075 .loc 1 1787 21 is_stmt 0 view .LVU1051 + 3076 0058 ACF83C30 strh r3, [ip, #60] @ movhi +1788:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr = (uint8_t *)pRxData; + 3077 .loc 1 1788 3 is_stmt 1 view .LVU1052 +1788:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr = (uint8_t *)pRxData; + 3078 .loc 1 1788 21 is_stmt 0 view .LVU1053 + 3079 005c ACF83E30 strh r3, [ip, #62] @ movhi +1789:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferSize = Size; + 3080 .loc 1 1789 3 is_stmt 1 view .LVU1054 +1789:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferSize = Size; + 3081 .loc 1 1789 21 is_stmt 0 view .LVU1055 + 3082 0060 CCF84020 str r2, [ip, #64] +1790:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = Size; + ARM GAS /tmp/ccywxtmH.s page 148 + + + 3083 .loc 1 1790 3 is_stmt 1 view .LVU1056 +1790:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = Size; + 3084 .loc 1 1790 21 is_stmt 0 view .LVU1057 + 3085 0064 ACF84430 strh r3, [ip, #68] @ movhi +1791:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3086 .loc 1 1791 3 is_stmt 1 view .LVU1058 +1791:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3087 .loc 1 1791 21 is_stmt 0 view .LVU1059 + 3088 0068 ACF84630 strh r3, [ip, #70] @ movhi +1794:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3089 .loc 1 1794 3 is_stmt 1 view .LVU1060 +1794:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3090 .loc 1 1794 17 is_stmt 0 view .LVU1061 + 3091 006c DCF80C20 ldr r2, [ip, #12] + 3092 .LVL179: +1794:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3093 .loc 1 1794 6 view .LVU1062 + 3094 0070 B2F5E06F cmp r2, #1792 + 3095 0074 22D9 bls .L227 +1796:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxISR = SPI_2linesTxISR_16BIT; + 3096 .loc 1 1796 5 is_stmt 1 view .LVU1063 +1796:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxISR = SPI_2linesTxISR_16BIT; + 3097 .loc 1 1796 21 is_stmt 0 view .LVU1064 + 3098 0076 2349 ldr r1, .L244 + 3099 .LVL180: +1796:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxISR = SPI_2linesTxISR_16BIT; + 3100 .loc 1 1796 21 view .LVU1065 + 3101 0078 CCF84C10 str r1, [ip, #76] +1797:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 3102 .loc 1 1797 5 is_stmt 1 view .LVU1066 +1797:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 3103 .loc 1 1797 21 is_stmt 0 view .LVU1067 + 3104 007c 2249 ldr r1, .L244+4 + 3105 007e CCF85010 str r1, [ip, #80] + 3106 .L228: +1823:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3107 .loc 1 1823 3 is_stmt 1 view .LVU1068 +1823:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3108 .loc 1 1823 6 is_stmt 0 view .LVU1069 + 3109 0082 B2F5E06F cmp r2, #1792 + 3110 0086 01D8 bhi .L229 +1823:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3111 .loc 1 1823 49 discriminator 1 view .LVU1070 + 3112 0088 012B cmp r3, #1 + 3113 008a 1ED9 bls .L230 + 3114 .L229: +1826:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 3115 .loc 1 1826 5 is_stmt 1 view .LVU1071 + 3116 008c DCF80020 ldr r2, [ip] + 3117 0090 5368 ldr r3, [r2, #4] + 3118 .LVL181: +1826:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 3119 .loc 1 1826 5 is_stmt 0 view .LVU1072 + 3120 0092 23F48053 bic r3, r3, #4096 + 3121 0096 5360 str r3, [r2, #4] + 3122 .LVL182: + 3123 .L231: + ARM GAS /tmp/ccywxtmH.s page 149 + + +1835:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3124 .loc 1 1835 3 is_stmt 1 view .LVU1073 + 3125 0098 DCF80020 ldr r2, [ip] + 3126 009c 5368 ldr r3, [r2, #4] + 3127 009e 43F0E003 orr r3, r3, #224 + 3128 00a2 5360 str r3, [r2, #4] +1838:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3129 .loc 1 1838 3 view .LVU1074 +1838:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3130 .loc 1 1838 12 is_stmt 0 view .LVU1075 + 3131 00a4 DCF80030 ldr r3, [ip] +1838:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3132 .loc 1 1838 22 view .LVU1076 + 3133 00a8 1A68 ldr r2, [r3] +1838:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3134 .loc 1 1838 6 view .LVU1077 + 3135 00aa 12F0400F tst r2, #64 + 3136 00ae 24D1 bne .L239 +1841:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 3137 .loc 1 1841 5 is_stmt 1 view .LVU1078 + 3138 00b0 1A68 ldr r2, [r3] + 3139 00b2 42F04002 orr r2, r2, #64 + 3140 00b6 1A60 str r2, [r3] +1753:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3141 .loc 1 1753 24 is_stmt 0 view .LVU1079 + 3142 00b8 0020 movs r0, #0 + 3143 00ba 0EE0 b .L225 + 3144 .LVL183: + 3145 .L227: +1801:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxISR = SPI_2linesTxISR_8BIT; + 3146 .loc 1 1801 5 is_stmt 1 view .LVU1080 +1801:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxISR = SPI_2linesTxISR_8BIT; + 3147 .loc 1 1801 21 is_stmt 0 view .LVU1081 + 3148 00bc 1349 ldr r1, .L244+8 + 3149 .LVL184: +1801:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxISR = SPI_2linesTxISR_8BIT; + 3150 .loc 1 1801 21 view .LVU1082 + 3151 00be CCF84C10 str r1, [ip, #76] +1802:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 3152 .loc 1 1802 5 is_stmt 1 view .LVU1083 +1802:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 3153 .loc 1 1802 21 is_stmt 0 view .LVU1084 + 3154 00c2 1349 ldr r1, .L244+12 + 3155 00c4 CCF85010 str r1, [ip, #80] + 3156 00c8 DBE7 b .L228 + 3157 .L230: +1831:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 3158 .loc 1 1831 5 is_stmt 1 view .LVU1085 + 3159 00ca DCF80020 ldr r2, [ip] + 3160 00ce 5368 ldr r3, [r2, #4] + 3161 .LVL185: +1831:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 3162 .loc 1 1831 5 is_stmt 0 view .LVU1086 + 3163 00d0 43F48053 orr r3, r3, #4096 + 3164 00d4 5360 str r3, [r2, #4] + 3165 .LVL186: +1831:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + ARM GAS /tmp/ccywxtmH.s page 150 + + + 3166 .loc 1 1831 5 view .LVU1087 + 3167 00d6 DFE7 b .L231 + 3168 .LVL187: + 3169 .L233: +1768:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 3170 .loc 1 1768 15 view .LVU1088 + 3171 00d8 0220 movs r0, #2 + 3172 .LVL188: + 3173 .L225: +1846:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return errorcode; + 3174 .loc 1 1846 3 is_stmt 1 view .LVU1089 +1846:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return errorcode; + 3175 .loc 1 1846 3 view .LVU1090 + 3176 00da 0023 movs r3, #0 + 3177 00dc 8CF85C30 strb r3, [ip, #92] +1846:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return errorcode; + 3178 .loc 1 1846 3 view .LVU1091 +1847:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 3179 .loc 1 1847 3 view .LVU1092 +1848:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3180 .loc 1 1848 1 is_stmt 0 view .LVU1093 + 3181 00e0 5DF8044B ldr r4, [sp], #4 + 3182 .cfi_remember_state + 3183 .cfi_restore 4 + 3184 .cfi_def_cfa_offset 0 + 3185 00e4 7047 bx lr + 3186 .LVL189: + 3187 .L234: + 3188 .cfi_restore_state +1768:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 3189 .loc 1 1768 15 view .LVU1094 + 3190 00e6 0220 movs r0, #2 + 3191 .LVL190: +1768:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 3192 .loc 1 1768 15 view .LVU1095 + 3193 00e8 F7E7 b .L225 + 3194 .LVL191: + 3195 .L235: +1768:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 3196 .loc 1 1768 15 view .LVU1096 + 3197 00ea 0220 movs r0, #2 + 3198 .LVL192: +1768:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 3199 .loc 1 1768 15 view .LVU1097 + 3200 00ec F5E7 b .L225 + 3201 .LVL193: + 3202 .L236: +1774:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 3203 .loc 1 1774 15 view .LVU1098 + 3204 00ee 0120 movs r0, #1 + 3205 .LVL194: +1774:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 3206 .loc 1 1774 15 view .LVU1099 + 3207 00f0 F3E7 b .L225 + 3208 .LVL195: + 3209 .L237: +1774:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + ARM GAS /tmp/ccywxtmH.s page 151 + + + 3210 .loc 1 1774 15 view .LVU1100 + 3211 00f2 0120 movs r0, #1 + 3212 .LVL196: +1774:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 3213 .loc 1 1774 15 view .LVU1101 + 3214 00f4 F1E7 b .L225 + 3215 .LVL197: + 3216 .L238: +1774:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 3217 .loc 1 1774 15 view .LVU1102 + 3218 00f6 0120 movs r0, #1 + 3219 .LVL198: +1774:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 3220 .loc 1 1774 15 view .LVU1103 + 3221 00f8 EFE7 b .L225 + 3222 .LVL199: + 3223 .L239: +1753:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3224 .loc 1 1753 24 view .LVU1104 + 3225 00fa 0020 movs r0, #0 + 3226 00fc EDE7 b .L225 + 3227 .LVL200: + 3228 .L232: + 3229 .cfi_def_cfa_offset 0 + 3230 .cfi_restore 4 +1759:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3231 .loc 1 1759 3 view .LVU1105 + 3232 00fe 0220 movs r0, #2 +1848:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3233 .loc 1 1848 1 view .LVU1106 + 3234 0100 7047 bx lr + 3235 .L245: + 3236 0102 00BF .align 2 + 3237 .L244: + 3238 0104 00000000 .word SPI_2linesRxISR_16BIT + 3239 0108 00000000 .word SPI_2linesTxISR_16BIT + 3240 010c 00000000 .word SPI_2linesRxISR_8BIT + 3241 0110 00000000 .word SPI_2linesTxISR_8BIT + 3242 .cfi_endproc + 3243 .LFE139: + 3245 .section .text.HAL_SPI_Receive_IT,"ax",%progbits + 3246 .align 1 + 3247 .global HAL_SPI_Receive_IT + 3248 .syntax unified + 3249 .thumb + 3250 .thumb_func + 3252 HAL_SPI_Receive_IT: + 3253 .LVL201: + 3254 .LFB138: +1643:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef errorcode = HAL_OK; + 3255 .loc 1 1643 1 is_stmt 1 view -0 + 3256 .cfi_startproc + 3257 @ args = 0, pretend = 0, frame = 0 + 3258 @ frame_needed = 0, uses_anonymous_args = 0 +1643:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef errorcode = HAL_OK; + 3259 .loc 1 1643 1 is_stmt 0 view .LVU1108 + 3260 0000 08B5 push {r3, lr} + ARM GAS /tmp/ccywxtmH.s page 152 + + + 3261 .cfi_def_cfa_offset 8 + 3262 .cfi_offset 3, -8 + 3263 .cfi_offset 14, -4 + 3264 0002 8446 mov ip, r0 +1644:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3265 .loc 1 1644 3 is_stmt 1 view .LVU1109 + 3266 .LVL202: +1646:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3267 .loc 1 1646 3 view .LVU1110 +1646:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3268 .loc 1 1646 18 is_stmt 0 view .LVU1111 + 3269 0004 8368 ldr r3, [r0, #8] +1646:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3270 .loc 1 1646 6 view .LVU1112 + 3271 0006 1BB9 cbnz r3, .L247 +1646:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3272 .loc 1 1646 68 discriminator 1 view .LVU1113 + 3273 0008 4368 ldr r3, [r0, #4] +1646:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3274 .loc 1 1646 54 discriminator 1 view .LVU1114 + 3275 000a B3F5827F cmp r3, #260 + 3276 000e 48D0 beq .L257 + 3277 .L247: +1654:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3278 .loc 1 1654 3 is_stmt 1 view .LVU1115 +1654:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3279 .loc 1 1654 3 view .LVU1116 + 3280 0010 9CF85C30 ldrb r3, [ip, #92] @ zero_extendqisi2 + 3281 0014 012B cmp r3, #1 + 3282 0016 6AD0 beq .L253 +1654:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3283 .loc 1 1654 3 discriminator 2 view .LVU1117 + 3284 0018 0123 movs r3, #1 + 3285 001a 8CF85C30 strb r3, [ip, #92] +1654:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3286 .loc 1 1654 3 discriminator 2 view .LVU1118 +1656:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3287 .loc 1 1656 3 discriminator 2 view .LVU1119 +1656:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3288 .loc 1 1656 11 is_stmt 0 discriminator 2 view .LVU1120 + 3289 001e 9CF85D00 ldrb r0, [ip, #93] @ zero_extendqisi2 + 3290 .LVL203: +1656:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3291 .loc 1 1656 11 discriminator 2 view .LVU1121 + 3292 0022 C0B2 uxtb r0, r0 +1656:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3293 .loc 1 1656 6 discriminator 2 view .LVU1122 + 3294 0024 9842 cmp r0, r3 + 3295 0026 5BD1 bne .L254 +1662:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3296 .loc 1 1662 3 is_stmt 1 view .LVU1123 +1662:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3297 .loc 1 1662 6 is_stmt 0 view .LVU1124 + 3298 0028 0029 cmp r1, #0 + 3299 002a 5AD0 beq .L249 +1662:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3300 .loc 1 1662 23 discriminator 1 view .LVU1125 + ARM GAS /tmp/ccywxtmH.s page 153 + + + 3301 002c 002A cmp r2, #0 + 3302 002e 58D0 beq .L249 +1669:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_NONE; + 3303 .loc 1 1669 3 is_stmt 1 view .LVU1126 +1669:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_NONE; + 3304 .loc 1 1669 21 is_stmt 0 view .LVU1127 + 3305 0030 0423 movs r3, #4 + 3306 0032 8CF85D30 strb r3, [ip, #93] +1670:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr = (uint8_t *)pData; + 3307 .loc 1 1670 3 is_stmt 1 view .LVU1128 +1670:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr = (uint8_t *)pData; + 3308 .loc 1 1670 21 is_stmt 0 view .LVU1129 + 3309 0036 0023 movs r3, #0 + 3310 0038 CCF86030 str r3, [ip, #96] +1671:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferSize = Size; + 3311 .loc 1 1671 3 is_stmt 1 view .LVU1130 +1671:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferSize = Size; + 3312 .loc 1 1671 21 is_stmt 0 view .LVU1131 + 3313 003c CCF84010 str r1, [ip, #64] +1672:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = Size; + 3314 .loc 1 1672 3 is_stmt 1 view .LVU1132 +1672:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = Size; + 3315 .loc 1 1672 21 is_stmt 0 view .LVU1133 + 3316 0040 ACF84420 strh r2, [ip, #68] @ movhi +1673:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3317 .loc 1 1673 3 is_stmt 1 view .LVU1134 +1673:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3318 .loc 1 1673 21 is_stmt 0 view .LVU1135 + 3319 0044 ACF84620 strh r2, [ip, #70] @ movhi +1676:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferSize = 0U; + 3320 .loc 1 1676 3 is_stmt 1 view .LVU1136 +1676:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferSize = 0U; + 3321 .loc 1 1676 21 is_stmt 0 view .LVU1137 + 3322 0048 CCF83830 str r3, [ip, #56] +1677:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = 0U; + 3323 .loc 1 1677 3 is_stmt 1 view .LVU1138 +1677:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = 0U; + 3324 .loc 1 1677 21 is_stmt 0 view .LVU1139 + 3325 004c ACF83C30 strh r3, [ip, #60] @ movhi +1678:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxISR = NULL; + 3326 .loc 1 1678 3 is_stmt 1 view .LVU1140 +1678:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxISR = NULL; + 3327 .loc 1 1678 21 is_stmt 0 view .LVU1141 + 3328 0050 ACF83E30 strh r3, [ip, #62] @ movhi +1679:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3329 .loc 1 1679 3 is_stmt 1 view .LVU1142 +1679:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3330 .loc 1 1679 21 is_stmt 0 view .LVU1143 + 3331 0054 CCF85030 str r3, [ip, #80] +1682:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3332 .loc 1 1682 3 is_stmt 1 view .LVU1144 +1682:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3333 .loc 1 1682 17 is_stmt 0 view .LVU1145 + 3334 0058 DCF80C30 ldr r3, [ip, #12] +1682:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3335 .loc 1 1682 6 view .LVU1146 + 3336 005c B3F5E06F cmp r3, #1792 + ARM GAS /tmp/ccywxtmH.s page 154 + + + 3337 0060 27D9 bls .L250 +1685:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxISR = SPI_RxISR_16BIT; + 3338 .loc 1 1685 5 is_stmt 1 view .LVU1147 + 3339 0062 DCF80020 ldr r2, [ip] + 3340 .LVL204: +1685:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxISR = SPI_RxISR_16BIT; + 3341 .loc 1 1685 5 is_stmt 0 view .LVU1148 + 3342 0066 5368 ldr r3, [r2, #4] + 3343 0068 23F48053 bic r3, r3, #4096 + 3344 006c 5360 str r3, [r2, #4] + 3345 .LVL205: +1686:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 3346 .loc 1 1686 5 is_stmt 1 view .LVU1149 +1686:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 3347 .loc 1 1686 17 is_stmt 0 view .LVU1150 + 3348 006e 214B ldr r3, .L259 + 3349 0070 CCF84C30 str r3, [ip, #76] + 3350 .L251: +1696:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3351 .loc 1 1696 3 is_stmt 1 view .LVU1151 +1696:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3352 .loc 1 1696 17 is_stmt 0 view .LVU1152 + 3353 0074 DCF80830 ldr r3, [ip, #8] +1696:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3354 .loc 1 1696 6 view .LVU1153 + 3355 0078 B3F5004F cmp r3, #32768 + 3356 007c 23D0 beq .L258 + 3357 .L252: +1721:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3358 .loc 1 1721 3 is_stmt 1 view .LVU1154 + 3359 007e DCF80020 ldr r2, [ip] + 3360 0082 5368 ldr r3, [r2, #4] + 3361 0084 43F06003 orr r3, r3, #96 + 3362 0088 5360 str r3, [r2, #4] +1728:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3363 .loc 1 1728 3 view .LVU1155 +1728:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3364 .loc 1 1728 12 is_stmt 0 view .LVU1156 + 3365 008a DCF80030 ldr r3, [ip] +1728:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3366 .loc 1 1728 22 view .LVU1157 + 3367 008e 1A68 ldr r2, [r3] +1728:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3368 .loc 1 1728 6 view .LVU1158 + 3369 0090 12F0400F tst r2, #64 + 3370 0094 29D1 bne .L255 +1731:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 3371 .loc 1 1731 5 is_stmt 1 view .LVU1159 + 3372 0096 1A68 ldr r2, [r3] + 3373 0098 42F04002 orr r2, r2, #64 + 3374 009c 1A60 str r2, [r3] +1644:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3375 .loc 1 1644 21 is_stmt 0 view .LVU1160 + 3376 009e 0020 movs r0, #0 + 3377 00a0 1FE0 b .L249 + 3378 .LVL206: + 3379 .L257: + ARM GAS /tmp/ccywxtmH.s page 155 + + +1648:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line + 3380 .loc 1 1648 5 is_stmt 1 view .LVU1161 +1648:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Call transmit-receive function to send Dummy data on Tx line and generate clock on CLK line + 3381 .loc 1 1648 17 is_stmt 0 view .LVU1162 + 3382 00a2 0423 movs r3, #4 + 3383 00a4 80F85D30 strb r3, [r0, #93] +1650:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 3384 .loc 1 1650 5 is_stmt 1 view .LVU1163 +1650:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 3385 .loc 1 1650 12 is_stmt 0 view .LVU1164 + 3386 00a8 1346 mov r3, r2 + 3387 00aa 0A46 mov r2, r1 + 3388 .LVL207: +1650:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 3389 .loc 1 1650 12 view .LVU1165 + 3390 00ac FFF7FEFF bl HAL_SPI_TransmitReceive_IT + 3391 .LVL208: +1650:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 3392 .loc 1 1650 12 view .LVU1166 + 3393 00b0 1AE0 b .L248 + 3394 .LVL209: + 3395 .L250: +1691:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxISR = SPI_RxISR_8BIT; + 3396 .loc 1 1691 5 is_stmt 1 view .LVU1167 + 3397 00b2 DCF80020 ldr r2, [ip] + 3398 .LVL210: +1691:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxISR = SPI_RxISR_8BIT; + 3399 .loc 1 1691 5 is_stmt 0 view .LVU1168 + 3400 00b6 5368 ldr r3, [r2, #4] + 3401 00b8 43F48053 orr r3, r3, #4096 + 3402 00bc 5360 str r3, [r2, #4] + 3403 .LVL211: +1692:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 3404 .loc 1 1692 5 is_stmt 1 view .LVU1169 +1692:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 3405 .loc 1 1692 17 is_stmt 0 view .LVU1170 + 3406 00be 0E4B ldr r3, .L259+4 + 3407 00c0 CCF84C30 str r3, [ip, #76] + 3408 00c4 D6E7 b .L251 + 3409 .L258: +1699:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_1LINE_RX(hspi); + 3410 .loc 1 1699 5 is_stmt 1 view .LVU1171 + 3411 00c6 DCF80020 ldr r2, [ip] + 3412 00ca 1368 ldr r3, [r2] + 3413 00cc 23F04003 bic r3, r3, #64 + 3414 00d0 1360 str r3, [r2] +1700:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 3415 .loc 1 1700 5 view .LVU1172 + 3416 00d2 DCF80020 ldr r2, [ip] + 3417 00d6 1368 ldr r3, [r2] + 3418 00d8 23F48043 bic r3, r3, #16384 + 3419 00dc 1360 str r3, [r2] + 3420 00de CEE7 b .L252 + 3421 .LVL212: + 3422 .L254: +1658:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 3423 .loc 1 1658 15 is_stmt 0 view .LVU1173 + ARM GAS /tmp/ccywxtmH.s page 156 + + + 3424 00e0 0220 movs r0, #2 + 3425 .LVL213: + 3426 .L249: +1736:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return errorcode; + 3427 .loc 1 1736 3 is_stmt 1 view .LVU1174 +1736:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return errorcode; + 3428 .loc 1 1736 3 view .LVU1175 + 3429 00e2 0023 movs r3, #0 + 3430 00e4 8CF85C30 strb r3, [ip, #92] +1736:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return errorcode; + 3431 .loc 1 1736 3 view .LVU1176 +1737:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 3432 .loc 1 1737 3 view .LVU1177 + 3433 .LVL214: + 3434 .L248: +1738:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3435 .loc 1 1738 1 is_stmt 0 view .LVU1178 + 3436 00e8 08BD pop {r3, pc} + 3437 .LVL215: + 3438 .L255: +1644:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3439 .loc 1 1644 21 view .LVU1179 + 3440 00ea 0020 movs r0, #0 + 3441 00ec F9E7 b .L249 + 3442 .LVL216: + 3443 .L253: +1654:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3444 .loc 1 1654 3 view .LVU1180 + 3445 00ee 0220 movs r0, #2 + 3446 .LVL217: +1654:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3447 .loc 1 1654 3 view .LVU1181 + 3448 00f0 FAE7 b .L248 + 3449 .L260: + 3450 00f2 00BF .align 2 + 3451 .L259: + 3452 00f4 00000000 .word SPI_RxISR_16BIT + 3453 00f8 00000000 .word SPI_RxISR_8BIT + 3454 .cfi_endproc + 3455 .LFE138: + 3457 .section .text.HAL_SPI_Transmit_DMA,"ax",%progbits + 3458 .align 1 + 3459 .global HAL_SPI_Transmit_DMA + 3460 .syntax unified + 3461 .thumb + 3462 .thumb_func + 3464 HAL_SPI_Transmit_DMA: + 3465 .LVL218: + 3466 .LFB140: +1859:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef errorcode = HAL_OK; + 3467 .loc 1 1859 1 is_stmt 1 view -0 + 3468 .cfi_startproc + 3469 @ args = 0, pretend = 0, frame = 0 + 3470 @ frame_needed = 0, uses_anonymous_args = 0 +1859:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef errorcode = HAL_OK; + 3471 .loc 1 1859 1 is_stmt 0 view .LVU1183 + 3472 0000 38B5 push {r3, r4, r5, lr} + ARM GAS /tmp/ccywxtmH.s page 157 + + + 3473 .cfi_def_cfa_offset 16 + 3474 .cfi_offset 3, -16 + 3475 .cfi_offset 4, -12 + 3476 .cfi_offset 5, -8 + 3477 .cfi_offset 14, -4 +1860:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3478 .loc 1 1860 3 is_stmt 1 view .LVU1184 + 3479 .LVL219: +1863:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3480 .loc 1 1863 3 view .LVU1185 +1866:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3481 .loc 1 1866 3 view .LVU1186 +1869:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3482 .loc 1 1869 3 view .LVU1187 +1869:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3483 .loc 1 1869 3 view .LVU1188 + 3484 0002 90F85C30 ldrb r3, [r0, #92] @ zero_extendqisi2 + 3485 0006 012B cmp r3, #1 + 3486 0008 00F08C80 beq .L269 + 3487 000c 0446 mov r4, r0 +1869:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3488 .loc 1 1869 3 discriminator 2 view .LVU1189 + 3489 000e 0123 movs r3, #1 + 3490 0010 80F85C30 strb r3, [r0, #92] +1869:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3491 .loc 1 1869 3 discriminator 2 view .LVU1190 +1871:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3492 .loc 1 1871 3 discriminator 2 view .LVU1191 +1871:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3493 .loc 1 1871 11 is_stmt 0 discriminator 2 view .LVU1192 + 3494 0014 90F85D50 ldrb r5, [r0, #93] @ zero_extendqisi2 + 3495 0018 EDB2 uxtb r5, r5 +1871:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3496 .loc 1 1871 6 discriminator 2 view .LVU1193 + 3497 001a 9D42 cmp r5, r3 + 3498 001c 7CD1 bne .L270 +1877:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3499 .loc 1 1877 3 is_stmt 1 view .LVU1194 +1877:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3500 .loc 1 1877 6 is_stmt 0 view .LVU1195 + 3501 001e 0029 cmp r1, #0 + 3502 0020 7BD0 beq .L263 +1877:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3503 .loc 1 1877 23 discriminator 1 view .LVU1196 + 3504 0022 002A cmp r2, #0 + 3505 0024 79D0 beq .L263 +1884:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_NONE; + 3506 .loc 1 1884 3 is_stmt 1 view .LVU1197 +1884:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_NONE; + 3507 .loc 1 1884 21 is_stmt 0 view .LVU1198 + 3508 0026 0323 movs r3, #3 + 3509 0028 80F85D30 strb r3, [r0, #93] +1885:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr = (uint8_t *)pData; + 3510 .loc 1 1885 3 is_stmt 1 view .LVU1199 +1885:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr = (uint8_t *)pData; + 3511 .loc 1 1885 21 is_stmt 0 view .LVU1200 + 3512 002c 0023 movs r3, #0 + ARM GAS /tmp/ccywxtmH.s page 158 + + + 3513 002e 0366 str r3, [r0, #96] +1886:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferSize = Size; + 3514 .loc 1 1886 3 is_stmt 1 view .LVU1201 +1886:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferSize = Size; + 3515 .loc 1 1886 21 is_stmt 0 view .LVU1202 + 3516 0030 8163 str r1, [r0, #56] +1887:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = Size; + 3517 .loc 1 1887 3 is_stmt 1 view .LVU1203 +1887:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = Size; + 3518 .loc 1 1887 21 is_stmt 0 view .LVU1204 + 3519 0032 8287 strh r2, [r0, #60] @ movhi +1888:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3520 .loc 1 1888 3 is_stmt 1 view .LVU1205 +1888:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3521 .loc 1 1888 21 is_stmt 0 view .LVU1206 + 3522 0034 C287 strh r2, [r0, #62] @ movhi +1891:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxISR = NULL; + 3523 .loc 1 1891 3 is_stmt 1 view .LVU1207 +1891:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxISR = NULL; + 3524 .loc 1 1891 21 is_stmt 0 view .LVU1208 + 3525 0036 0364 str r3, [r0, #64] +1892:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxISR = NULL; + 3526 .loc 1 1892 3 is_stmt 1 view .LVU1209 +1892:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxISR = NULL; + 3527 .loc 1 1892 21 is_stmt 0 view .LVU1210 + 3528 0038 0365 str r3, [r0, #80] +1893:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferSize = 0U; + 3529 .loc 1 1893 3 is_stmt 1 view .LVU1211 +1893:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferSize = 0U; + 3530 .loc 1 1893 21 is_stmt 0 view .LVU1212 + 3531 003a C364 str r3, [r0, #76] +1894:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = 0U; + 3532 .loc 1 1894 3 is_stmt 1 view .LVU1213 +1894:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = 0U; + 3533 .loc 1 1894 21 is_stmt 0 view .LVU1214 + 3534 003c A0F84430 strh r3, [r0, #68] @ movhi +1895:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3535 .loc 1 1895 3 is_stmt 1 view .LVU1215 +1895:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3536 .loc 1 1895 21 is_stmt 0 view .LVU1216 + 3537 0040 A0F84630 strh r3, [r0, #70] @ movhi +1898:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3538 .loc 1 1898 3 is_stmt 1 view .LVU1217 +1898:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3539 .loc 1 1898 17 is_stmt 0 view .LVU1218 + 3540 0044 8368 ldr r3, [r0, #8] +1898:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3541 .loc 1 1898 6 view .LVU1219 + 3542 0046 B3F5004F cmp r3, #32768 + 3543 004a 39D0 beq .L272 + 3544 .LVL220: + 3545 .L264: +1914:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3546 .loc 1 1914 3 is_stmt 1 view .LVU1220 +1914:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3547 .loc 1 1914 7 is_stmt 0 view .LVU1221 + 3548 004c 636D ldr r3, [r4, #84] + ARM GAS /tmp/ccywxtmH.s page 159 + + +1914:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3549 .loc 1 1914 38 view .LVU1222 + 3550 004e 364A ldr r2, .L275 + 3551 0050 DA62 str r2, [r3, #44] +1917:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3552 .loc 1 1917 3 is_stmt 1 view .LVU1223 +1917:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3553 .loc 1 1917 7 is_stmt 0 view .LVU1224 + 3554 0052 636D ldr r3, [r4, #84] +1917:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3555 .loc 1 1917 34 view .LVU1225 + 3556 0054 354A ldr r2, .L275+4 + 3557 0056 9A62 str r2, [r3, #40] +1920:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3558 .loc 1 1920 3 is_stmt 1 view .LVU1226 +1920:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3559 .loc 1 1920 7 is_stmt 0 view .LVU1227 + 3560 0058 636D ldr r3, [r4, #84] +1920:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3561 .loc 1 1920 35 view .LVU1228 + 3562 005a 354A ldr r2, .L275+8 + 3563 005c 1A63 str r2, [r3, #48] +1923:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3564 .loc 1 1923 3 is_stmt 1 view .LVU1229 +1923:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3565 .loc 1 1923 7 is_stmt 0 view .LVU1230 + 3566 005e 636D ldr r3, [r4, #84] +1923:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3567 .loc 1 1923 35 view .LVU1231 + 3568 0060 0022 movs r2, #0 + 3569 0062 5A63 str r2, [r3, #52] +1925:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Packing mode is enabled only if the DMA setting is HALWORD */ + 3570 .loc 1 1925 3 is_stmt 1 view .LVU1232 + 3571 0064 2268 ldr r2, [r4] + 3572 0066 5368 ldr r3, [r2, #4] + 3573 0068 23F48043 bic r3, r3, #16384 + 3574 006c 5360 str r3, [r2, #4] +1927:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3575 .loc 1 1927 3 view .LVU1233 +1927:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3576 .loc 1 1927 18 is_stmt 0 view .LVU1234 + 3577 006e E368 ldr r3, [r4, #12] +1927:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3578 .loc 1 1927 6 view .LVU1235 + 3579 0070 B3F5E06F cmp r3, #1792 + 3580 0074 04D8 bhi .L265 +1927:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3581 .loc 1 1927 58 discriminator 1 view .LVU1236 + 3582 0076 636D ldr r3, [r4, #84] +1927:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3583 .loc 1 1927 72 discriminator 1 view .LVU1237 + 3584 0078 5B69 ldr r3, [r3, #20] +1927:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3585 .loc 1 1927 50 discriminator 1 view .LVU1238 + 3586 007a B3F5806F cmp r3, #1024 + 3587 007e 2AD0 beq .L273 + 3588 .L265: + ARM GAS /tmp/ccywxtmH.s page 160 + + +1943:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount)) + 3589 .loc 1 1943 3 is_stmt 1 view .LVU1239 +1943:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount)) + 3590 .loc 1 1943 91 is_stmt 0 view .LVU1240 + 3591 0080 2268 ldr r2, [r4] +1944:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3592 .loc 1 1944 38 view .LVU1241 + 3593 0082 E38F ldrh r3, [r4, #62] +1943:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount)) + 3594 .loc 1 1943 17 view .LVU1242 + 3595 0084 9BB2 uxth r3, r3 + 3596 0086 0C32 adds r2, r2, #12 + 3597 0088 A16B ldr r1, [r4, #56] + 3598 .LVL221: +1943:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount)) + 3599 .loc 1 1943 17 view .LVU1243 + 3600 008a 606D ldr r0, [r4, #84] + 3601 .LVL222: +1943:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount)) + 3602 .loc 1 1943 17 view .LVU1244 + 3603 008c FFF7FEFF bl HAL_DMA_Start_IT + 3604 .LVL223: +1943:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount)) + 3605 .loc 1 1943 6 view .LVU1245 + 3606 0090 0146 mov r1, r0 + 3607 0092 0028 cmp r0, #0 + 3608 0094 38D1 bne .L274 +1955:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3609 .loc 1 1955 3 is_stmt 1 view .LVU1246 +1955:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3610 .loc 1 1955 12 is_stmt 0 view .LVU1247 + 3611 0096 2368 ldr r3, [r4] +1955:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3612 .loc 1 1955 22 view .LVU1248 + 3613 0098 1A68 ldr r2, [r3] +1955:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3614 .loc 1 1955 6 view .LVU1249 + 3615 009a 12F0400F tst r2, #64 + 3616 009e 03D1 bne .L268 +1958:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 3617 .loc 1 1958 5 is_stmt 1 view .LVU1250 + 3618 00a0 1A68 ldr r2, [r3] + 3619 00a2 42F04002 orr r2, r2, #64 + 3620 00a6 1A60 str r2, [r3] + 3621 .L268: +1962:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3622 .loc 1 1962 3 view .LVU1251 + 3623 00a8 2268 ldr r2, [r4] + 3624 00aa 5368 ldr r3, [r2, #4] + 3625 00ac 43F02003 orr r3, r3, #32 + 3626 00b0 5360 str r3, [r2, #4] +1965:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3627 .loc 1 1965 3 view .LVU1252 + 3628 00b2 2268 ldr r2, [r4] + 3629 00b4 5368 ldr r3, [r2, #4] + 3630 00b6 43F00203 orr r3, r3, #2 + 3631 00ba 5360 str r3, [r2, #4] + ARM GAS /tmp/ccywxtmH.s page 161 + + +1860:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3632 .loc 1 1860 21 is_stmt 0 view .LVU1253 + 3633 00bc 0D46 mov r5, r1 + 3634 00be 2CE0 b .L263 + 3635 .LVL224: + 3636 .L272: +1901:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_1LINE_TX(hspi); + 3637 .loc 1 1901 5 is_stmt 1 view .LVU1254 + 3638 00c0 0268 ldr r2, [r0] + 3639 .LVL225: +1901:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_1LINE_TX(hspi); + 3640 .loc 1 1901 5 is_stmt 0 view .LVU1255 + 3641 00c2 1368 ldr r3, [r2] + 3642 00c4 23F04003 bic r3, r3, #64 + 3643 00c8 1360 str r3, [r2] + 3644 .LVL226: +1902:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 3645 .loc 1 1902 5 is_stmt 1 view .LVU1256 + 3646 00ca 0268 ldr r2, [r0] + 3647 00cc 1368 ldr r3, [r2] + 3648 00ce 43F48043 orr r3, r3, #16384 + 3649 00d2 1360 str r3, [r2] + 3650 00d4 BAE7 b .L264 + 3651 .L273: +1930:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3652 .loc 1 1930 5 view .LVU1257 +1930:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3653 .loc 1 1930 14 is_stmt 0 view .LVU1258 + 3654 00d6 E38F ldrh r3, [r4, #62] +1930:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3655 .loc 1 1930 8 view .LVU1259 + 3656 00d8 13F0010F tst r3, #1 + 3657 00dc 09D1 bne .L266 +1932:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = (hspi->TxXferCount >> 1U); + 3658 .loc 1 1932 7 is_stmt 1 view .LVU1260 + 3659 00de 2268 ldr r2, [r4] + 3660 00e0 5368 ldr r3, [r2, #4] + 3661 00e2 23F48043 bic r3, r3, #16384 + 3662 00e6 5360 str r3, [r2, #4] +1933:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 3663 .loc 1 1933 7 view .LVU1261 +1933:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 3664 .loc 1 1933 32 is_stmt 0 view .LVU1262 + 3665 00e8 E38F ldrh r3, [r4, #62] +1933:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 3666 .loc 1 1933 25 view .LVU1263 + 3667 00ea C3F34E03 ubfx r3, r3, #1, #15 + 3668 00ee E387 strh r3, [r4, #62] @ movhi + 3669 00f0 C6E7 b .L265 + 3670 .L266: +1937:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = (hspi->TxXferCount >> 1U) + 1U; + 3671 .loc 1 1937 7 is_stmt 1 view .LVU1264 + 3672 00f2 2268 ldr r2, [r4] + 3673 00f4 5368 ldr r3, [r2, #4] + 3674 00f6 43F48043 orr r3, r3, #16384 + 3675 00fa 5360 str r3, [r2, #4] +1938:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + ARM GAS /tmp/ccywxtmH.s page 162 + + + 3676 .loc 1 1938 7 view .LVU1265 +1938:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 3677 .loc 1 1938 32 is_stmt 0 view .LVU1266 + 3678 00fc E38F ldrh r3, [r4, #62] +1938:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 3679 .loc 1 1938 53 view .LVU1267 + 3680 00fe C3F34E03 ubfx r3, r3, #1, #15 + 3681 0102 0133 adds r3, r3, #1 +1938:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 3682 .loc 1 1938 25 view .LVU1268 + 3683 0104 E387 strh r3, [r4, #62] @ movhi + 3684 0106 BBE7 b .L265 + 3685 .LVL227: + 3686 .L274: +1947:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_ERROR; + 3687 .loc 1 1947 5 is_stmt 1 view .LVU1269 + 3688 0108 236E ldr r3, [r4, #96] + 3689 010a 43F01003 orr r3, r3, #16 + 3690 010e 2366 str r3, [r4, #96] +1948:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3691 .loc 1 1948 5 view .LVU1270 + 3692 .LVL228: +1950:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 3693 .loc 1 1950 5 view .LVU1271 +1950:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 3694 .loc 1 1950 17 is_stmt 0 view .LVU1272 + 3695 0110 0123 movs r3, #1 + 3696 0112 84F85D30 strb r3, [r4, #93] +1951:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 3697 .loc 1 1951 5 is_stmt 1 view .LVU1273 + 3698 0116 00E0 b .L263 + 3699 .LVL229: + 3700 .L270: +1873:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 3701 .loc 1 1873 15 is_stmt 0 view .LVU1274 + 3702 0118 0225 movs r5, #2 + 3703 .LVL230: + 3704 .L263: +1969:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return errorcode; + 3705 .loc 1 1969 3 is_stmt 1 view .LVU1275 +1969:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return errorcode; + 3706 .loc 1 1969 3 view .LVU1276 + 3707 011a 0023 movs r3, #0 + 3708 011c 84F85C30 strb r3, [r4, #92] +1969:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return errorcode; + 3709 .loc 1 1969 3 view .LVU1277 +1970:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 3710 .loc 1 1970 3 view .LVU1278 + 3711 .LVL231: + 3712 .L262: +1971:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3713 .loc 1 1971 1 is_stmt 0 view .LVU1279 + 3714 0120 2846 mov r0, r5 + 3715 0122 38BD pop {r3, r4, r5, pc} + 3716 .LVL232: + 3717 .L269: +1869:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + ARM GAS /tmp/ccywxtmH.s page 163 + + + 3718 .loc 1 1869 3 view .LVU1280 + 3719 0124 0225 movs r5, #2 + 3720 0126 FBE7 b .L262 + 3721 .L276: + 3722 .align 2 + 3723 .L275: + 3724 0128 00000000 .word SPI_DMAHalfTransmitCplt + 3725 012c 00000000 .word SPI_DMATransmitCplt + 3726 0130 00000000 .word SPI_DMAError + 3727 .cfi_endproc + 3728 .LFE140: + 3730 .section .text.HAL_SPI_TransmitReceive_DMA,"ax",%progbits + 3731 .align 1 + 3732 .global HAL_SPI_TransmitReceive_DMA + 3733 .syntax unified + 3734 .thumb + 3735 .thumb_func + 3737 HAL_SPI_TransmitReceive_DMA: + 3738 .LVL233: + 3739 .LFB142: +2139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t tmp_mode; + 3740 .loc 1 2139 1 is_stmt 1 view -0 + 3741 .cfi_startproc + 3742 @ args = 0, pretend = 0, frame = 0 + 3743 @ frame_needed = 0, uses_anonymous_args = 0 +2139:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t tmp_mode; + 3744 .loc 1 2139 1 is_stmt 0 view .LVU1282 + 3745 0000 38B5 push {r3, r4, r5, lr} + 3746 .cfi_def_cfa_offset 16 + 3747 .cfi_offset 3, -16 + 3748 .cfi_offset 4, -12 + 3749 .cfi_offset 5, -8 + 3750 .cfi_offset 14, -4 + 3751 0002 0446 mov r4, r0 +2140:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_SPI_StateTypeDef tmp_state; + 3752 .loc 1 2140 3 is_stmt 1 view .LVU1283 +2141:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef errorcode = HAL_OK; + 3753 .loc 1 2141 3 view .LVU1284 +2142:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3754 .loc 1 2142 3 view .LVU1285 + 3755 .LVL234: +2145:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** assert_param(IS_SPI_DMA_HANDLE(hspi->hdmatx)); + 3756 .loc 1 2145 3 view .LVU1286 +2146:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3757 .loc 1 2146 3 view .LVU1287 +2149:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3758 .loc 1 2149 3 view .LVU1288 +2152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3759 .loc 1 2152 3 view .LVU1289 +2152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3760 .loc 1 2152 3 view .LVU1290 + 3761 0004 90F85C00 ldrb r0, [r0, #92] @ zero_extendqisi2 + 3762 .LVL235: +2152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3763 .loc 1 2152 3 is_stmt 0 view .LVU1291 + 3764 0008 0128 cmp r0, #1 + 3765 000a 00F00381 beq .L293 + ARM GAS /tmp/ccywxtmH.s page 164 + + +2152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3766 .loc 1 2152 3 is_stmt 1 discriminator 2 view .LVU1292 + 3767 000e 0120 movs r0, #1 + 3768 0010 84F85C00 strb r0, [r4, #92] +2152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3769 .loc 1 2152 3 discriminator 2 view .LVU1293 +2155:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** tmp_mode = hspi->Init.Mode; + 3770 .loc 1 2155 3 discriminator 2 view .LVU1294 +2155:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** tmp_mode = hspi->Init.Mode; + 3771 .loc 1 2155 23 is_stmt 0 discriminator 2 view .LVU1295 + 3772 0014 94F85D00 ldrb r0, [r4, #93] @ zero_extendqisi2 + 3773 0018 C0B2 uxtb r0, r0 + 3774 .LVL236: +2156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3775 .loc 1 2156 3 is_stmt 1 discriminator 2 view .LVU1296 +2156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3776 .loc 1 2156 23 is_stmt 0 discriminator 2 view .LVU1297 + 3777 001a 6568 ldr r5, [r4, #4] + 3778 .LVL237: +2158:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** ((tmp_mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES) && (tmp_st + 3779 .loc 1 2158 3 is_stmt 1 discriminator 2 view .LVU1298 +2158:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** ((tmp_mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES) && (tmp_st + 3780 .loc 1 2158 6 is_stmt 0 discriminator 2 view .LVU1299 + 3781 001c 0128 cmp r0, #1 + 3782 001e 0AD0 beq .L279 +2158:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** ((tmp_mode == SPI_MODE_MASTER) && (hspi->Init.Direction == SPI_DIRECTION_2LINES) && (tmp_st + 3783 .loc 1 2158 7 discriminator 1 view .LVU1300 + 3784 0020 B5F5827F cmp r5, #260 + 3785 0024 40F0E580 bne .L294 +2159:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3786 .loc 1 2159 54 view .LVU1301 + 3787 0028 A568 ldr r5, [r4, #8] + 3788 .LVL238: +2159:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3789 .loc 1 2159 40 view .LVU1302 + 3790 002a 002D cmp r5, #0 + 3791 002c 40F0E680 bne .L295 +2159:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3792 .loc 1 2159 90 discriminator 1 view .LVU1303 + 3793 0030 0428 cmp r0, #4 + 3794 0032 40F0E580 bne .L296 + 3795 .L279: +2165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3796 .loc 1 2165 3 is_stmt 1 view .LVU1304 +2165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3797 .loc 1 2165 6 is_stmt 0 view .LVU1305 + 3798 0036 0029 cmp r1, #0 + 3799 0038 00F0E480 beq .L297 +2165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3800 .loc 1 2165 25 discriminator 1 view .LVU1306 + 3801 003c 002A cmp r2, #0 + 3802 003e 00F0E380 beq .L298 +2165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3803 .loc 1 2165 46 discriminator 2 view .LVU1307 + 3804 0042 002B cmp r3, #0 + 3805 0044 00F0E280 beq .L299 +2172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + ARM GAS /tmp/ccywxtmH.s page 165 + + + 3806 .loc 1 2172 3 is_stmt 1 view .LVU1308 +2172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3807 .loc 1 2172 11 is_stmt 0 view .LVU1309 + 3808 0048 94F85D00 ldrb r0, [r4, #93] @ zero_extendqisi2 + 3809 .LVL239: +2172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3810 .loc 1 2172 11 view .LVU1310 + 3811 004c C0B2 uxtb r0, r0 +2172:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3812 .loc 1 2172 6 view .LVU1311 + 3813 004e 0428 cmp r0, #4 + 3814 0050 02D0 beq .L281 +2174:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 3815 .loc 1 2174 5 is_stmt 1 view .LVU1312 +2174:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 3816 .loc 1 2174 17 is_stmt 0 view .LVU1313 + 3817 0052 0520 movs r0, #5 + 3818 0054 84F85D00 strb r0, [r4, #93] + 3819 .L281: +2178:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr = (uint8_t *)pTxData; + 3820 .loc 1 2178 3 is_stmt 1 view .LVU1314 +2178:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr = (uint8_t *)pTxData; + 3821 .loc 1 2178 21 is_stmt 0 view .LVU1315 + 3822 0058 0020 movs r0, #0 + 3823 005a 2066 str r0, [r4, #96] +2179:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferSize = Size; + 3824 .loc 1 2179 3 is_stmt 1 view .LVU1316 +2179:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferSize = Size; + 3825 .loc 1 2179 21 is_stmt 0 view .LVU1317 + 3826 005c A163 str r1, [r4, #56] +2180:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = Size; + 3827 .loc 1 2180 3 is_stmt 1 view .LVU1318 +2180:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = Size; + 3828 .loc 1 2180 21 is_stmt 0 view .LVU1319 + 3829 005e A387 strh r3, [r4, #60] @ movhi +2181:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr = (uint8_t *)pRxData; + 3830 .loc 1 2181 3 is_stmt 1 view .LVU1320 +2181:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr = (uint8_t *)pRxData; + 3831 .loc 1 2181 21 is_stmt 0 view .LVU1321 + 3832 0060 E387 strh r3, [r4, #62] @ movhi +2182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferSize = Size; + 3833 .loc 1 2182 3 is_stmt 1 view .LVU1322 +2182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferSize = Size; + 3834 .loc 1 2182 21 is_stmt 0 view .LVU1323 + 3835 0062 2264 str r2, [r4, #64] +2183:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = Size; + 3836 .loc 1 2183 3 is_stmt 1 view .LVU1324 +2183:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = Size; + 3837 .loc 1 2183 21 is_stmt 0 view .LVU1325 + 3838 0064 A4F84430 strh r3, [r4, #68] @ movhi +2184:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3839 .loc 1 2184 3 is_stmt 1 view .LVU1326 +2184:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3840 .loc 1 2184 21 is_stmt 0 view .LVU1327 + 3841 0068 A4F84630 strh r3, [r4, #70] @ movhi +2187:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxISR = NULL; + 3842 .loc 1 2187 3 is_stmt 1 view .LVU1328 + ARM GAS /tmp/ccywxtmH.s page 166 + + +2187:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxISR = NULL; + 3843 .loc 1 2187 21 is_stmt 0 view .LVU1329 + 3844 006c E064 str r0, [r4, #76] +2188:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3845 .loc 1 2188 3 is_stmt 1 view .LVU1330 +2188:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3846 .loc 1 2188 21 is_stmt 0 view .LVU1331 + 3847 006e 2065 str r0, [r4, #80] +2200:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3848 .loc 1 2200 3 is_stmt 1 view .LVU1332 +2200:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3849 .loc 1 2200 18 is_stmt 0 view .LVU1333 + 3850 0070 E368 ldr r3, [r4, #12] + 3851 .LVL240: +2200:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3852 .loc 1 2200 6 view .LVU1334 + 3853 0072 B3F5E06F cmp r3, #1792 + 3854 0076 05D8 bhi .L282 +2200:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3855 .loc 1 2200 58 discriminator 1 view .LVU1335 + 3856 0078 A36D ldr r3, [r4, #88] +2200:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3857 .loc 1 2200 72 discriminator 1 view .LVU1336 + 3858 007a 5B69 ldr r3, [r3, #20] +2200:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3859 .loc 1 2200 50 discriminator 1 view .LVU1337 + 3860 007c B3F5806F cmp r3, #1024 + 3861 0080 00F0C680 beq .L300 + 3862 .L282: +2209:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3863 .loc 1 2209 3 is_stmt 1 view .LVU1338 + 3864 0084 2268 ldr r2, [r4] + 3865 .LVL241: +2209:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3866 .loc 1 2209 3 is_stmt 0 view .LVU1339 + 3867 0086 5368 ldr r3, [r2, #4] + 3868 0088 23F4C043 bic r3, r3, #24576 + 3869 008c 5360 str r3, [r2, #4] + 3870 .LVL242: +2212:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3871 .loc 1 2212 3 is_stmt 1 view .LVU1340 +2212:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3872 .loc 1 2212 17 is_stmt 0 view .LVU1341 + 3873 008e E368 ldr r3, [r4, #12] +2212:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3874 .loc 1 2212 6 view .LVU1342 + 3875 0090 B3F5E06F cmp r3, #1792 + 3876 0094 28D9 bls .L283 +2215:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 3877 .loc 1 2215 5 is_stmt 1 view .LVU1343 + 3878 0096 2268 ldr r2, [r4] + 3879 0098 5368 ldr r3, [r2, #4] + 3880 009a 23F48053 bic r3, r3, #4096 + 3881 009e 5360 str r3, [r2, #4] + 3882 .L284: +2255:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3883 .loc 1 2255 3 view .LVU1344 + ARM GAS /tmp/ccywxtmH.s page 167 + + +2255:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3884 .loc 1 2255 11 is_stmt 0 view .LVU1345 + 3885 00a0 94F85D30 ldrb r3, [r4, #93] @ zero_extendqisi2 + 3886 00a4 DBB2 uxtb r3, r3 +2255:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3887 .loc 1 2255 6 view .LVU1346 + 3888 00a6 042B cmp r3, #4 + 3889 00a8 69D0 beq .L302 +2264:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmarx->XferCpltCallback = SPI_DMATransmitReceiveCplt; + 3890 .loc 1 2264 5 is_stmt 1 view .LVU1347 +2264:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmarx->XferCpltCallback = SPI_DMATransmitReceiveCplt; + 3891 .loc 1 2264 9 is_stmt 0 view .LVU1348 + 3892 00aa A36D ldr r3, [r4, #88] +2264:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmarx->XferCpltCallback = SPI_DMATransmitReceiveCplt; + 3893 .loc 1 2264 40 view .LVU1349 + 3894 00ac 5A4A ldr r2, .L305 + 3895 00ae DA62 str r2, [r3, #44] +2265:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 3896 .loc 1 2265 5 is_stmt 1 view .LVU1350 +2265:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 3897 .loc 1 2265 9 is_stmt 0 view .LVU1351 + 3898 00b0 A36D ldr r3, [r4, #88] +2265:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 3899 .loc 1 2265 40 view .LVU1352 + 3900 00b2 5A4A ldr r2, .L305+4 + 3901 00b4 9A62 str r2, [r3, #40] + 3902 .L289: +2269:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3903 .loc 1 2269 3 is_stmt 1 view .LVU1353 +2269:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3904 .loc 1 2269 7 is_stmt 0 view .LVU1354 + 3905 00b6 A36D ldr r3, [r4, #88] +2269:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3906 .loc 1 2269 35 view .LVU1355 + 3907 00b8 594A ldr r2, .L305+8 + 3908 00ba 1A63 str r2, [r3, #48] +2272:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3909 .loc 1 2272 3 is_stmt 1 view .LVU1356 +2272:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3910 .loc 1 2272 7 is_stmt 0 view .LVU1357 + 3911 00bc A36D ldr r3, [r4, #88] +2272:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3912 .loc 1 2272 35 view .LVU1358 + 3913 00be 0022 movs r2, #0 + 3914 00c0 5A63 str r2, [r3, #52] +2275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount)) + 3915 .loc 1 2275 3 is_stmt 1 view .LVU1359 +2275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount)) + 3916 .loc 1 2275 63 is_stmt 0 view .LVU1360 + 3917 00c2 2168 ldr r1, [r4] + 3918 .LVL243: +2276:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3919 .loc 1 2276 38 view .LVU1361 + 3920 00c4 B4F84630 ldrh r3, [r4, #70] +2275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount)) + 3921 .loc 1 2275 17 view .LVU1362 + 3922 00c8 9BB2 uxth r3, r3 + ARM GAS /tmp/ccywxtmH.s page 168 + + + 3923 00ca 226C ldr r2, [r4, #64] + 3924 00cc 0C31 adds r1, r1, #12 + 3925 00ce A06D ldr r0, [r4, #88] + 3926 00d0 FFF7FEFF bl HAL_DMA_Start_IT + 3927 .LVL244: +2275:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount)) + 3928 .loc 1 2275 6 view .LVU1363 + 3929 00d4 0028 cmp r0, #0 + 3930 00d6 59D0 beq .L290 +2279:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_ERROR; + 3931 .loc 1 2279 5 is_stmt 1 view .LVU1364 + 3932 00d8 236E ldr r3, [r4, #96] + 3933 00da 43F01003 orr r3, r3, #16 + 3934 00de 2366 str r3, [r4, #96] +2280:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3935 .loc 1 2280 5 view .LVU1365 + 3936 .LVL245: +2282:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 3937 .loc 1 2282 5 view .LVU1366 +2282:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 3938 .loc 1 2282 17 is_stmt 0 view .LVU1367 + 3939 00e0 0120 movs r0, #1 + 3940 00e2 84F85D00 strb r0, [r4, #93] +2283:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 3941 .loc 1 2283 5 is_stmt 1 view .LVU1368 + 3942 00e6 85E0 b .L280 + 3943 .LVL246: + 3944 .L283: +2220:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3945 .loc 1 2220 5 view .LVU1369 + 3946 00e8 2268 ldr r2, [r4] + 3947 00ea 5368 ldr r3, [r2, #4] + 3948 00ec 43F48053 orr r3, r3, #4096 + 3949 00f0 5360 str r3, [r2, #4] +2222:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3950 .loc 1 2222 5 view .LVU1370 +2222:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3951 .loc 1 2222 13 is_stmt 0 view .LVU1371 + 3952 00f2 636D ldr r3, [r4, #84] +2222:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3953 .loc 1 2222 27 view .LVU1372 + 3954 00f4 5B69 ldr r3, [r3, #20] +2222:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3955 .loc 1 2222 8 view .LVU1373 + 3956 00f6 B3F5806F cmp r3, #1024 + 3957 00fa 1AD0 beq .L303 + 3958 .L285: +2236:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3959 .loc 1 2236 5 is_stmt 1 view .LVU1374 +2236:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3960 .loc 1 2236 13 is_stmt 0 view .LVU1375 + 3961 00fc A36D ldr r3, [r4, #88] +2236:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3962 .loc 1 2236 27 view .LVU1376 + 3963 00fe 5B69 ldr r3, [r3, #20] +2236:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3964 .loc 1 2236 8 view .LVU1377 + ARM GAS /tmp/ccywxtmH.s page 169 + + + 3965 0100 B3F5806F cmp r3, #1024 + 3966 0104 CCD1 bne .L284 +2239:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 3967 .loc 1 2239 7 is_stmt 1 view .LVU1378 + 3968 0106 2268 ldr r2, [r4] + 3969 0108 5368 ldr r3, [r2, #4] + 3970 010a 23F48053 bic r3, r3, #4096 + 3971 010e 5360 str r3, [r2, #4] +2241:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3972 .loc 1 2241 7 view .LVU1379 +2241:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3973 .loc 1 2241 16 is_stmt 0 view .LVU1380 + 3974 0110 B4F84630 ldrh r3, [r4, #70] +2241:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3975 .loc 1 2241 10 view .LVU1381 + 3976 0114 13F0010F tst r3, #1 + 3977 0118 24D1 bne .L287 +2243:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = hspi->RxXferCount >> 1U; + 3978 .loc 1 2243 9 is_stmt 1 view .LVU1382 + 3979 011a 2268 ldr r2, [r4] + 3980 011c 5368 ldr r3, [r2, #4] + 3981 011e 23F40053 bic r3, r3, #8192 + 3982 0122 5360 str r3, [r2, #4] +2244:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 3983 .loc 1 2244 9 view .LVU1383 +2244:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 3984 .loc 1 2244 33 is_stmt 0 view .LVU1384 + 3985 0124 B4F84630 ldrh r3, [r4, #70] +2244:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 3986 .loc 1 2244 27 view .LVU1385 + 3987 0128 C3F34E03 ubfx r3, r3, #1, #15 + 3988 012c A4F84630 strh r3, [r4, #70] @ movhi + 3989 0130 B6E7 b .L284 + 3990 .L303: +2224:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3991 .loc 1 2224 7 is_stmt 1 view .LVU1386 +2224:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3992 .loc 1 2224 16 is_stmt 0 view .LVU1387 + 3993 0132 A38F ldrh r3, [r4, #60] +2224:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 3994 .loc 1 2224 10 view .LVU1388 + 3995 0134 13F0010F tst r3, #1 + 3996 0138 09D1 bne .L286 +2226:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = hspi->TxXferCount >> 1U; + 3997 .loc 1 2226 9 is_stmt 1 view .LVU1389 + 3998 013a 2268 ldr r2, [r4] + 3999 013c 5368 ldr r3, [r2, #4] + 4000 013e 23F48043 bic r3, r3, #16384 + 4001 0142 5360 str r3, [r2, #4] +2227:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4002 .loc 1 2227 9 view .LVU1390 +2227:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4003 .loc 1 2227 33 is_stmt 0 view .LVU1391 + 4004 0144 E38F ldrh r3, [r4, #62] +2227:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4005 .loc 1 2227 27 view .LVU1392 + 4006 0146 C3F34E03 ubfx r3, r3, #1, #15 + ARM GAS /tmp/ccywxtmH.s page 170 + + + 4007 014a E387 strh r3, [r4, #62] @ movhi + 4008 014c D6E7 b .L285 + 4009 .L286: +2231:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = (hspi->TxXferCount >> 1U) + 1U; + 4010 .loc 1 2231 9 is_stmt 1 view .LVU1393 + 4011 014e 2268 ldr r2, [r4] + 4012 0150 5368 ldr r3, [r2, #4] + 4013 0152 43F48043 orr r3, r3, #16384 + 4014 0156 5360 str r3, [r2, #4] +2232:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4015 .loc 1 2232 9 view .LVU1394 +2232:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4016 .loc 1 2232 34 is_stmt 0 view .LVU1395 + 4017 0158 E38F ldrh r3, [r4, #62] +2232:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4018 .loc 1 2232 55 view .LVU1396 + 4019 015a C3F34E03 ubfx r3, r3, #1, #15 + 4020 015e 0133 adds r3, r3, #1 +2232:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4021 .loc 1 2232 27 view .LVU1397 + 4022 0160 E387 strh r3, [r4, #62] @ movhi + 4023 0162 CBE7 b .L285 + 4024 .L287: +2248:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = (hspi->RxXferCount >> 1U) + 1U; + 4025 .loc 1 2248 9 is_stmt 1 view .LVU1398 + 4026 0164 2268 ldr r2, [r4] + 4027 0166 5368 ldr r3, [r2, #4] + 4028 0168 43F40053 orr r3, r3, #8192 + 4029 016c 5360 str r3, [r2, #4] +2249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4030 .loc 1 2249 9 view .LVU1399 +2249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4031 .loc 1 2249 34 is_stmt 0 view .LVU1400 + 4032 016e B4F84630 ldrh r3, [r4, #70] +2249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4033 .loc 1 2249 55 view .LVU1401 + 4034 0172 C3F34E03 ubfx r3, r3, #1, #15 + 4035 0176 0133 adds r3, r3, #1 +2249:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4036 .loc 1 2249 27 view .LVU1402 + 4037 0178 A4F84630 strh r3, [r4, #70] @ movhi + 4038 017c 90E7 b .L284 + 4039 .L302: +2258:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmarx->XferCpltCallback = SPI_DMAReceiveCplt; + 4040 .loc 1 2258 5 is_stmt 1 view .LVU1403 +2258:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmarx->XferCpltCallback = SPI_DMAReceiveCplt; + 4041 .loc 1 2258 9 is_stmt 0 view .LVU1404 + 4042 017e A36D ldr r3, [r4, #88] +2258:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmarx->XferCpltCallback = SPI_DMAReceiveCplt; + 4043 .loc 1 2258 40 view .LVU1405 + 4044 0180 284A ldr r2, .L305+12 + 4045 0182 DA62 str r2, [r3, #44] +2259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4046 .loc 1 2259 5 is_stmt 1 view .LVU1406 +2259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4047 .loc 1 2259 9 is_stmt 0 view .LVU1407 + 4048 0184 A36D ldr r3, [r4, #88] + ARM GAS /tmp/ccywxtmH.s page 171 + + +2259:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4049 .loc 1 2259 40 view .LVU1408 + 4050 0186 284A ldr r2, .L305+16 + 4051 0188 9A62 str r2, [r3, #40] + 4052 018a 94E7 b .L289 + 4053 .LVL247: + 4054 .L290: +2287:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4055 .loc 1 2287 3 is_stmt 1 view .LVU1409 + 4056 018c 2268 ldr r2, [r4] + 4057 018e 5368 ldr r3, [r2, #4] + 4058 0190 43F00103 orr r3, r3, #1 + 4059 0194 5360 str r3, [r2, #4] +2291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmatx->XferCpltCallback = NULL; + 4060 .loc 1 2291 3 view .LVU1410 +2291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmatx->XferCpltCallback = NULL; + 4061 .loc 1 2291 7 is_stmt 0 view .LVU1411 + 4062 0196 626D ldr r2, [r4, #84] +2291:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmatx->XferCpltCallback = NULL; + 4063 .loc 1 2291 38 view .LVU1412 + 4064 0198 0023 movs r3, #0 + 4065 019a D362 str r3, [r2, #44] +2292:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmatx->XferErrorCallback = NULL; + 4066 .loc 1 2292 3 is_stmt 1 view .LVU1413 +2292:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmatx->XferErrorCallback = NULL; + 4067 .loc 1 2292 7 is_stmt 0 view .LVU1414 + 4068 019c 626D ldr r2, [r4, #84] +2292:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmatx->XferErrorCallback = NULL; + 4069 .loc 1 2292 38 view .LVU1415 + 4070 019e 9362 str r3, [r2, #40] +2293:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmatx->XferAbortCallback = NULL; + 4071 .loc 1 2293 3 is_stmt 1 view .LVU1416 +2293:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmatx->XferAbortCallback = NULL; + 4072 .loc 1 2293 7 is_stmt 0 view .LVU1417 + 4073 01a0 626D ldr r2, [r4, #84] +2293:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->hdmatx->XferAbortCallback = NULL; + 4074 .loc 1 2293 38 view .LVU1418 + 4075 01a2 1363 str r3, [r2, #48] +2294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4076 .loc 1 2294 3 is_stmt 1 view .LVU1419 +2294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4077 .loc 1 2294 7 is_stmt 0 view .LVU1420 + 4078 01a4 626D ldr r2, [r4, #84] +2294:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4079 .loc 1 2294 38 view .LVU1421 + 4080 01a6 5363 str r3, [r2, #52] +2297:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount)) + 4081 .loc 1 2297 3 is_stmt 1 view .LVU1422 +2297:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount)) + 4082 .loc 1 2297 91 is_stmt 0 view .LVU1423 + 4083 01a8 2268 ldr r2, [r4] +2298:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4084 .loc 1 2298 38 view .LVU1424 + 4085 01aa E38F ldrh r3, [r4, #62] +2297:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount)) + 4086 .loc 1 2297 17 view .LVU1425 + 4087 01ac 9BB2 uxth r3, r3 + ARM GAS /tmp/ccywxtmH.s page 172 + + + 4088 01ae 0C32 adds r2, r2, #12 + 4089 01b0 A16B ldr r1, [r4, #56] + 4090 01b2 606D ldr r0, [r4, #84] + 4091 01b4 FFF7FEFF bl HAL_DMA_Start_IT + 4092 .LVL248: +2297:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount)) + 4093 .loc 1 2297 6 view .LVU1426 + 4094 01b8 98B9 cbnz r0, .L304 +2309:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4095 .loc 1 2309 3 is_stmt 1 view .LVU1427 +2309:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4096 .loc 1 2309 12 is_stmt 0 view .LVU1428 + 4097 01ba 2368 ldr r3, [r4] +2309:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4098 .loc 1 2309 22 view .LVU1429 + 4099 01bc 1A68 ldr r2, [r3] +2309:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4100 .loc 1 2309 6 view .LVU1430 + 4101 01be 12F0400F tst r2, #64 + 4102 01c2 03D1 bne .L292 +2312:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4103 .loc 1 2312 5 is_stmt 1 view .LVU1431 + 4104 01c4 1A68 ldr r2, [r3] + 4105 01c6 42F04002 orr r2, r2, #64 + 4106 01ca 1A60 str r2, [r3] + 4107 .L292: +2315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4108 .loc 1 2315 3 view .LVU1432 + 4109 01cc 2268 ldr r2, [r4] + 4110 01ce 5368 ldr r3, [r2, #4] + 4111 01d0 43F02003 orr r3, r3, #32 + 4112 01d4 5360 str r3, [r2, #4] +2318:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4113 .loc 1 2318 3 view .LVU1433 + 4114 01d6 2268 ldr r2, [r4] + 4115 01d8 5368 ldr r3, [r2, #4] + 4116 01da 43F00203 orr r3, r3, #2 + 4117 01de 5360 str r3, [r2, #4] + 4118 01e0 08E0 b .L280 + 4119 .L304: +2301:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_ERROR; + 4120 .loc 1 2301 5 view .LVU1434 + 4121 01e2 236E ldr r3, [r4, #96] + 4122 01e4 43F01003 orr r3, r3, #16 + 4123 01e8 2366 str r3, [r4, #96] +2302:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4124 .loc 1 2302 5 view .LVU1435 + 4125 .LVL249: +2304:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 4126 .loc 1 2304 5 view .LVU1436 +2304:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 4127 .loc 1 2304 17 is_stmt 0 view .LVU1437 + 4128 01ea 0120 movs r0, #1 + 4129 01ec 84F85D00 strb r0, [r4, #93] +2305:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4130 .loc 1 2305 5 is_stmt 1 view .LVU1438 + 4131 01f0 00E0 b .L280 + ARM GAS /tmp/ccywxtmH.s page 173 + + + 4132 .LVL250: + 4133 .L294: +2161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 4134 .loc 1 2161 15 is_stmt 0 view .LVU1439 + 4135 01f2 0220 movs r0, #2 + 4136 .LVL251: + 4137 .L280: +2322:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return errorcode; + 4138 .loc 1 2322 3 is_stmt 1 view .LVU1440 +2322:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return errorcode; + 4139 .loc 1 2322 3 view .LVU1441 + 4140 01f4 0023 movs r3, #0 + 4141 01f6 84F85C30 strb r3, [r4, #92] +2322:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return errorcode; + 4142 .loc 1 2322 3 view .LVU1442 +2323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4143 .loc 1 2323 3 view .LVU1443 + 4144 .LVL252: + 4145 .L278: +2324:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4146 .loc 1 2324 1 is_stmt 0 view .LVU1444 + 4147 01fa 38BD pop {r3, r4, r5, pc} + 4148 .LVL253: + 4149 .L295: +2161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 4150 .loc 1 2161 15 view .LVU1445 + 4151 01fc 0220 movs r0, #2 + 4152 .LVL254: +2161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 4153 .loc 1 2161 15 view .LVU1446 + 4154 01fe F9E7 b .L280 + 4155 .LVL255: + 4156 .L296: +2161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 4157 .loc 1 2161 15 view .LVU1447 + 4158 0200 0220 movs r0, #2 + 4159 .LVL256: +2161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 4160 .loc 1 2161 15 view .LVU1448 + 4161 0202 F7E7 b .L280 + 4162 .LVL257: + 4163 .L297: +2167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 4164 .loc 1 2167 15 view .LVU1449 + 4165 0204 0120 movs r0, #1 + 4166 .LVL258: +2167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 4167 .loc 1 2167 15 view .LVU1450 + 4168 0206 F5E7 b .L280 + 4169 .LVL259: + 4170 .L298: +2167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 4171 .loc 1 2167 15 view .LVU1451 + 4172 0208 0120 movs r0, #1 + 4173 .LVL260: +2167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 4174 .loc 1 2167 15 view .LVU1452 + ARM GAS /tmp/ccywxtmH.s page 174 + + + 4175 020a F3E7 b .L280 + 4176 .LVL261: + 4177 .L299: +2167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 4178 .loc 1 2167 15 view .LVU1453 + 4179 020c 0120 movs r0, #1 + 4180 .LVL262: +2167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 4181 .loc 1 2167 15 view .LVU1454 + 4182 020e F1E7 b .L280 + 4183 .LVL263: + 4184 .L300: +2203:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 4185 .loc 1 2203 15 view .LVU1455 + 4186 0210 0120 movs r0, #1 + 4187 0212 EFE7 b .L280 + 4188 .LVL264: + 4189 .L293: +2152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4190 .loc 1 2152 3 view .LVU1456 + 4191 0214 0220 movs r0, #2 + 4192 0216 F0E7 b .L278 + 4193 .L306: + 4194 .align 2 + 4195 .L305: + 4196 0218 00000000 .word SPI_DMAHalfTransmitReceiveCplt + 4197 021c 00000000 .word SPI_DMATransmitReceiveCplt + 4198 0220 00000000 .word SPI_DMAError + 4199 0224 00000000 .word SPI_DMAHalfReceiveCplt + 4200 0228 00000000 .word SPI_DMAReceiveCplt + 4201 .cfi_endproc + 4202 .LFE142: + 4204 .section .text.HAL_SPI_Receive_DMA,"ax",%progbits + 4205 .align 1 + 4206 .global HAL_SPI_Receive_DMA + 4207 .syntax unified + 4208 .thumb + 4209 .thumb_func + 4211 HAL_SPI_Receive_DMA: + 4212 .LVL265: + 4213 .LFB141: +1984:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef errorcode = HAL_OK; + 4214 .loc 1 1984 1 is_stmt 1 view -0 + 4215 .cfi_startproc + 4216 @ args = 0, pretend = 0, frame = 0 + 4217 @ frame_needed = 0, uses_anonymous_args = 0 +1984:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef errorcode = HAL_OK; + 4218 .loc 1 1984 1 is_stmt 0 view .LVU1458 + 4219 0000 38B5 push {r3, r4, r5, lr} + 4220 .cfi_def_cfa_offset 16 + 4221 .cfi_offset 3, -16 + 4222 .cfi_offset 4, -12 + 4223 .cfi_offset 5, -8 + 4224 .cfi_offset 14, -4 + 4225 0002 0446 mov r4, r0 +1985:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4226 .loc 1 1985 3 is_stmt 1 view .LVU1459 + ARM GAS /tmp/ccywxtmH.s page 175 + + + 4227 .LVL266: +1988:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4228 .loc 1 1988 3 view .LVU1460 +1990:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4229 .loc 1 1990 3 view .LVU1461 +1990:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4230 .loc 1 1990 18 is_stmt 0 view .LVU1462 + 4231 0004 8368 ldr r3, [r0, #8] +1990:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4232 .loc 1 1990 6 view .LVU1463 + 4233 0006 1BB9 cbnz r3, .L308 +1990:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4234 .loc 1 1990 68 discriminator 1 view .LVU1464 + 4235 0008 4068 ldr r0, [r0, #4] + 4236 .LVL267: +1990:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4237 .loc 1 1990 54 discriminator 1 view .LVU1465 + 4238 000a B0F5827F cmp r0, #260 + 4239 000e 69D0 beq .L321 + 4240 .L308: +2002:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4241 .loc 1 2002 3 is_stmt 1 view .LVU1466 +2002:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4242 .loc 1 2002 3 view .LVU1467 + 4243 0010 94F85C00 ldrb r0, [r4, #92] @ zero_extendqisi2 + 4244 0014 0128 cmp r0, #1 + 4245 0016 00F0B580 beq .L318 +2002:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4246 .loc 1 2002 3 discriminator 2 view .LVU1468 + 4247 001a 0120 movs r0, #1 + 4248 001c 84F85C00 strb r0, [r4, #92] +2002:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4249 .loc 1 2002 3 discriminator 2 view .LVU1469 +2004:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4250 .loc 1 2004 3 discriminator 2 view .LVU1470 +2004:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4251 .loc 1 2004 11 is_stmt 0 discriminator 2 view .LVU1471 + 4252 0020 94F85D50 ldrb r5, [r4, #93] @ zero_extendqisi2 + 4253 0024 EDB2 uxtb r5, r5 +2004:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4254 .loc 1 2004 6 discriminator 2 view .LVU1472 + 4255 0026 8542 cmp r5, r0 + 4256 0028 40F0A680 bne .L319 +2010:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4257 .loc 1 2010 3 is_stmt 1 view .LVU1473 +2010:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4258 .loc 1 2010 6 is_stmt 0 view .LVU1474 + 4259 002c 0029 cmp r1, #0 + 4260 002e 00F0A480 beq .L310 +2010:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4261 .loc 1 2010 23 discriminator 1 view .LVU1475 + 4262 0032 002A cmp r2, #0 + 4263 0034 00F0A180 beq .L310 +2017:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_NONE; + 4264 .loc 1 2017 3 is_stmt 1 view .LVU1476 +2017:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_NONE; + 4265 .loc 1 2017 21 is_stmt 0 view .LVU1477 + ARM GAS /tmp/ccywxtmH.s page 176 + + + 4266 0038 0420 movs r0, #4 + 4267 003a 84F85D00 strb r0, [r4, #93] +2018:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr = (uint8_t *)pData; + 4268 .loc 1 2018 3 is_stmt 1 view .LVU1478 +2018:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr = (uint8_t *)pData; + 4269 .loc 1 2018 21 is_stmt 0 view .LVU1479 + 4270 003e 0020 movs r0, #0 + 4271 0040 2066 str r0, [r4, #96] +2019:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferSize = Size; + 4272 .loc 1 2019 3 is_stmt 1 view .LVU1480 +2019:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferSize = Size; + 4273 .loc 1 2019 21 is_stmt 0 view .LVU1481 + 4274 0042 2164 str r1, [r4, #64] +2020:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = Size; + 4275 .loc 1 2020 3 is_stmt 1 view .LVU1482 +2020:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = Size; + 4276 .loc 1 2020 21 is_stmt 0 view .LVU1483 + 4277 0044 A4F84420 strh r2, [r4, #68] @ movhi +2021:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4278 .loc 1 2021 3 is_stmt 1 view .LVU1484 +2021:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4279 .loc 1 2021 21 is_stmt 0 view .LVU1485 + 4280 0048 A4F84620 strh r2, [r4, #70] @ movhi +2024:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxISR = NULL; + 4281 .loc 1 2024 3 is_stmt 1 view .LVU1486 +2024:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxISR = NULL; + 4282 .loc 1 2024 21 is_stmt 0 view .LVU1487 + 4283 004c E064 str r0, [r4, #76] +2025:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferSize = 0U; + 4284 .loc 1 2025 3 is_stmt 1 view .LVU1488 +2025:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferSize = 0U; + 4285 .loc 1 2025 21 is_stmt 0 view .LVU1489 + 4286 004e 2065 str r0, [r4, #80] +2026:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = 0U; + 4287 .loc 1 2026 3 is_stmt 1 view .LVU1490 +2026:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = 0U; + 4288 .loc 1 2026 21 is_stmt 0 view .LVU1491 + 4289 0050 A087 strh r0, [r4, #60] @ movhi +2027:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4290 .loc 1 2027 3 is_stmt 1 view .LVU1492 +2027:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4291 .loc 1 2027 21 is_stmt 0 view .LVU1493 + 4292 0052 E087 strh r0, [r4, #62] @ movhi +2030:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4293 .loc 1 2030 3 is_stmt 1 view .LVU1494 +2030:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4294 .loc 1 2030 6 is_stmt 0 view .LVU1495 + 4295 0054 B3F5004F cmp r3, #32768 + 4296 0058 4ED0 beq .L322 + 4297 .LVL268: + 4298 .L311: +2047:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4299 .loc 1 2047 3 is_stmt 1 view .LVU1496 +2047:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4300 .loc 1 2047 18 is_stmt 0 view .LVU1497 + 4301 005a E368 ldr r3, [r4, #12] +2047:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + ARM GAS /tmp/ccywxtmH.s page 177 + + + 4302 .loc 1 2047 6 view .LVU1498 + 4303 005c B3F5E06F cmp r3, #1792 + 4304 0060 05D8 bhi .L312 +2047:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4305 .loc 1 2047 58 discriminator 1 view .LVU1499 + 4306 0062 A36D ldr r3, [r4, #88] +2047:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4307 .loc 1 2047 72 discriminator 1 view .LVU1500 + 4308 0064 5B69 ldr r3, [r3, #20] +2047:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4309 .loc 1 2047 50 discriminator 1 view .LVU1501 + 4310 0066 B3F5806F cmp r3, #1024 + 4311 006a 00F08680 beq .L310 + 4312 .L312: +2055:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->Init.DataSize > SPI_DATASIZE_8BIT) + 4313 .loc 1 2055 3 is_stmt 1 view .LVU1502 + 4314 006e 2268 ldr r2, [r4] + 4315 0070 5368 ldr r3, [r2, #4] + 4316 0072 23F40053 bic r3, r3, #8192 + 4317 0076 5360 str r3, [r2, #4] +2056:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4318 .loc 1 2056 3 view .LVU1503 +2056:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4319 .loc 1 2056 17 is_stmt 0 view .LVU1504 + 4320 0078 E368 ldr r3, [r4, #12] +2056:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4321 .loc 1 2056 6 view .LVU1505 + 4322 007a B3F5E06F cmp r3, #1792 + 4323 007e 46D9 bls .L313 +2059:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4324 .loc 1 2059 5 is_stmt 1 view .LVU1506 + 4325 0080 2268 ldr r2, [r4] + 4326 0082 5368 ldr r3, [r2, #4] + 4327 0084 23F48053 bic r3, r3, #4096 + 4328 0088 5360 str r3, [r2, #4] + 4329 .L314: +2085:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4330 .loc 1 2085 3 view .LVU1507 +2085:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4331 .loc 1 2085 7 is_stmt 0 view .LVU1508 + 4332 008a A36D ldr r3, [r4, #88] +2085:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4333 .loc 1 2085 38 view .LVU1509 + 4334 008c 3E4A ldr r2, .L324 + 4335 008e DA62 str r2, [r3, #44] +2088:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4336 .loc 1 2088 3 is_stmt 1 view .LVU1510 +2088:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4337 .loc 1 2088 7 is_stmt 0 view .LVU1511 + 4338 0090 A36D ldr r3, [r4, #88] +2088:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4339 .loc 1 2088 34 view .LVU1512 + 4340 0092 3E4A ldr r2, .L324+4 + 4341 0094 9A62 str r2, [r3, #40] +2091:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4342 .loc 1 2091 3 is_stmt 1 view .LVU1513 +2091:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + ARM GAS /tmp/ccywxtmH.s page 178 + + + 4343 .loc 1 2091 7 is_stmt 0 view .LVU1514 + 4344 0096 A36D ldr r3, [r4, #88] +2091:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4345 .loc 1 2091 35 view .LVU1515 + 4346 0098 3D4A ldr r2, .L324+8 + 4347 009a 1A63 str r2, [r3, #48] +2094:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4348 .loc 1 2094 3 is_stmt 1 view .LVU1516 +2094:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4349 .loc 1 2094 7 is_stmt 0 view .LVU1517 + 4350 009c A36D ldr r3, [r4, #88] +2094:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4351 .loc 1 2094 35 view .LVU1518 + 4352 009e 0022 movs r2, #0 + 4353 00a0 5A63 str r2, [r3, #52] +2097:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount)) + 4354 .loc 1 2097 3 is_stmt 1 view .LVU1519 +2097:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount)) + 4355 .loc 1 2097 63 is_stmt 0 view .LVU1520 + 4356 00a2 2168 ldr r1, [r4] + 4357 .LVL269: +2098:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4358 .loc 1 2098 38 view .LVU1521 + 4359 00a4 B4F84630 ldrh r3, [r4, #70] +2097:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount)) + 4360 .loc 1 2097 17 view .LVU1522 + 4361 00a8 9BB2 uxth r3, r3 + 4362 00aa 226C ldr r2, [r4, #64] + 4363 00ac 0C31 adds r1, r1, #12 + 4364 00ae A06D ldr r0, [r4, #88] + 4365 00b0 FFF7FEFF bl HAL_DMA_Start_IT + 4366 .LVL270: +2097:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount)) + 4367 .loc 1 2097 6 view .LVU1523 + 4368 00b4 0146 mov r1, r0 + 4369 00b6 0028 cmp r0, #0 + 4370 00b8 56D1 bne .L323 +2109:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4371 .loc 1 2109 3 is_stmt 1 view .LVU1524 +2109:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4372 .loc 1 2109 12 is_stmt 0 view .LVU1525 + 4373 00ba 2368 ldr r3, [r4] +2109:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4374 .loc 1 2109 22 view .LVU1526 + 4375 00bc 1A68 ldr r2, [r3] +2109:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4376 .loc 1 2109 6 view .LVU1527 + 4377 00be 12F0400F tst r2, #64 + 4378 00c2 03D1 bne .L317 +2112:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4379 .loc 1 2112 5 is_stmt 1 view .LVU1528 + 4380 00c4 1A68 ldr r2, [r3] + 4381 00c6 42F04002 orr r2, r2, #64 + 4382 00ca 1A60 str r2, [r3] + 4383 .L317: +2116:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4384 .loc 1 2116 3 view .LVU1529 + ARM GAS /tmp/ccywxtmH.s page 179 + + + 4385 00cc 2268 ldr r2, [r4] + 4386 00ce 5368 ldr r3, [r2, #4] + 4387 00d0 43F02003 orr r3, r3, #32 + 4388 00d4 5360 str r3, [r2, #4] +2119:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4389 .loc 1 2119 3 view .LVU1530 + 4390 00d6 2268 ldr r2, [r4] + 4391 00d8 5368 ldr r3, [r2, #4] + 4392 00da 43F00103 orr r3, r3, #1 + 4393 00de 5360 str r3, [r2, #4] +1985:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4394 .loc 1 1985 21 is_stmt 0 view .LVU1531 + 4395 00e0 0D46 mov r5, r1 + 4396 00e2 4AE0 b .L310 + 4397 .LVL271: + 4398 .L321: +1992:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4399 .loc 1 1992 5 is_stmt 1 view .LVU1532 +1992:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4400 .loc 1 1992 17 is_stmt 0 view .LVU1533 + 4401 00e4 0423 movs r3, #4 + 4402 00e6 84F85D30 strb r3, [r4, #93] +1995:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4403 .loc 1 1995 5 is_stmt 1 view .LVU1534 +1998:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4404 .loc 1 1998 5 view .LVU1535 +1998:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4405 .loc 1 1998 12 is_stmt 0 view .LVU1536 + 4406 00ea 1346 mov r3, r2 + 4407 00ec 0A46 mov r2, r1 + 4408 .LVL272: +1998:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4409 .loc 1 1998 12 view .LVU1537 + 4410 00ee 2046 mov r0, r4 + 4411 00f0 FFF7FEFF bl HAL_SPI_TransmitReceive_DMA + 4412 .LVL273: +1998:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4413 .loc 1 1998 12 view .LVU1538 + 4414 00f4 0546 mov r5, r0 + 4415 00f6 43E0 b .L309 + 4416 .LVL274: + 4417 .L322: +2033:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_1LINE_RX(hspi); + 4418 .loc 1 2033 5 is_stmt 1 view .LVU1539 + 4419 00f8 2268 ldr r2, [r4] + 4420 .LVL275: +2033:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_1LINE_RX(hspi); + 4421 .loc 1 2033 5 is_stmt 0 view .LVU1540 + 4422 00fa 1368 ldr r3, [r2] + 4423 00fc 23F04003 bic r3, r3, #64 + 4424 0100 1360 str r3, [r2] + 4425 .LVL276: +2034:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4426 .loc 1 2034 5 is_stmt 1 view .LVU1541 + 4427 0102 2268 ldr r2, [r4] + 4428 0104 1368 ldr r3, [r2] + 4429 0106 23F48043 bic r3, r3, #16384 + ARM GAS /tmp/ccywxtmH.s page 180 + + + 4430 010a 1360 str r3, [r2] + 4431 010c A5E7 b .L311 + 4432 .L313: +2064:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4433 .loc 1 2064 5 view .LVU1542 + 4434 010e 2268 ldr r2, [r4] + 4435 0110 5368 ldr r3, [r2, #4] + 4436 0112 43F48053 orr r3, r3, #4096 + 4437 0116 5360 str r3, [r2, #4] +2066:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4438 .loc 1 2066 5 view .LVU1543 +2066:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4439 .loc 1 2066 13 is_stmt 0 view .LVU1544 + 4440 0118 A36D ldr r3, [r4, #88] +2066:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4441 .loc 1 2066 27 view .LVU1545 + 4442 011a 5B69 ldr r3, [r3, #20] +2066:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4443 .loc 1 2066 8 view .LVU1546 + 4444 011c B3F5806F cmp r3, #1024 + 4445 0120 B3D1 bne .L314 +2069:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4446 .loc 1 2069 7 is_stmt 1 view .LVU1547 + 4447 0122 2268 ldr r2, [r4] + 4448 0124 5368 ldr r3, [r2, #4] + 4449 0126 23F48053 bic r3, r3, #4096 + 4450 012a 5360 str r3, [r2, #4] +2071:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4451 .loc 1 2071 7 view .LVU1548 +2071:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4452 .loc 1 2071 16 is_stmt 0 view .LVU1549 + 4453 012c B4F84630 ldrh r3, [r4, #70] +2071:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4454 .loc 1 2071 10 view .LVU1550 + 4455 0130 13F0010F tst r3, #1 + 4456 0134 0BD1 bne .L315 +2073:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = hspi->RxXferCount >> 1U; + 4457 .loc 1 2073 9 is_stmt 1 view .LVU1551 + 4458 0136 2268 ldr r2, [r4] + 4459 0138 5368 ldr r3, [r2, #4] + 4460 013a 23F40053 bic r3, r3, #8192 + 4461 013e 5360 str r3, [r2, #4] +2074:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4462 .loc 1 2074 9 view .LVU1552 +2074:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4463 .loc 1 2074 33 is_stmt 0 view .LVU1553 + 4464 0140 B4F84630 ldrh r3, [r4, #70] +2074:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4465 .loc 1 2074 27 view .LVU1554 + 4466 0144 C3F34E03 ubfx r3, r3, #1, #15 + 4467 0148 A4F84630 strh r3, [r4, #70] @ movhi + 4468 014c 9DE7 b .L314 + 4469 .L315: +2078:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = (hspi->RxXferCount >> 1U) + 1U; + 4470 .loc 1 2078 9 is_stmt 1 view .LVU1555 + 4471 014e 2268 ldr r2, [r4] + 4472 0150 5368 ldr r3, [r2, #4] + ARM GAS /tmp/ccywxtmH.s page 181 + + + 4473 0152 43F40053 orr r3, r3, #8192 + 4474 0156 5360 str r3, [r2, #4] +2079:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4475 .loc 1 2079 9 view .LVU1556 +2079:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4476 .loc 1 2079 34 is_stmt 0 view .LVU1557 + 4477 0158 B4F84630 ldrh r3, [r4, #70] +2079:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4478 .loc 1 2079 55 view .LVU1558 + 4479 015c C3F34E03 ubfx r3, r3, #1, #15 + 4480 0160 0133 adds r3, r3, #1 +2079:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4481 .loc 1 2079 27 view .LVU1559 + 4482 0162 A4F84630 strh r3, [r4, #70] @ movhi + 4483 0166 90E7 b .L314 + 4484 .LVL277: + 4485 .L323: +2101:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_ERROR; + 4486 .loc 1 2101 5 is_stmt 1 view .LVU1560 + 4487 0168 236E ldr r3, [r4, #96] + 4488 016a 43F01003 orr r3, r3, #16 + 4489 016e 2366 str r3, [r4, #96] +2102:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4490 .loc 1 2102 5 view .LVU1561 + 4491 .LVL278: +2104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 4492 .loc 1 2104 5 view .LVU1562 +2104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 4493 .loc 1 2104 17 is_stmt 0 view .LVU1563 + 4494 0170 0123 movs r3, #1 + 4495 0172 84F85D30 strb r3, [r4, #93] +2105:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4496 .loc 1 2105 5 is_stmt 1 view .LVU1564 + 4497 0176 00E0 b .L310 + 4498 .LVL279: + 4499 .L319: +2006:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** goto error; + 4500 .loc 1 2006 15 is_stmt 0 view .LVU1565 + 4501 0178 0225 movs r5, #2 + 4502 .LVL280: + 4503 .L310: +2123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return errorcode; + 4504 .loc 1 2123 3 is_stmt 1 view .LVU1566 +2123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return errorcode; + 4505 .loc 1 2123 3 view .LVU1567 + 4506 017a 0023 movs r3, #0 + 4507 017c 84F85C30 strb r3, [r4, #92] +2123:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return errorcode; + 4508 .loc 1 2123 3 view .LVU1568 +2124:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4509 .loc 1 2124 3 view .LVU1569 + 4510 .LVL281: + 4511 .L309: +2125:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4512 .loc 1 2125 1 is_stmt 0 view .LVU1570 + 4513 0180 2846 mov r0, r5 + 4514 0182 38BD pop {r3, r4, r5, pc} + ARM GAS /tmp/ccywxtmH.s page 182 + + + 4515 .LVL282: + 4516 .L318: +2002:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4517 .loc 1 2002 3 view .LVU1571 + 4518 0184 0225 movs r5, #2 + 4519 0186 FBE7 b .L309 + 4520 .L325: + 4521 .align 2 + 4522 .L324: + 4523 0188 00000000 .word SPI_DMAHalfReceiveCplt + 4524 018c 00000000 .word SPI_DMAReceiveCplt + 4525 0190 00000000 .word SPI_DMAError + 4526 .cfi_endproc + 4527 .LFE141: + 4529 .section .text.HAL_SPI_Abort,"ax",%progbits + 4530 .align 1 + 4531 .global HAL_SPI_Abort + 4532 .syntax unified + 4533 .thumb + 4534 .thumb_func + 4536 HAL_SPI_Abort: + 4537 .LVL283: + 4538 .LFB143: +2340:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef errorcode; + 4539 .loc 1 2340 1 is_stmt 1 view -0 + 4540 .cfi_startproc + 4541 @ args = 0, pretend = 0, frame = 16 + 4542 @ frame_needed = 0, uses_anonymous_args = 0 +2340:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef errorcode; + 4543 .loc 1 2340 1 is_stmt 0 view .LVU1573 + 4544 0000 10B5 push {r4, lr} + 4545 .cfi_def_cfa_offset 8 + 4546 .cfi_offset 4, -8 + 4547 .cfi_offset 14, -4 + 4548 0002 86B0 sub sp, sp, #24 + 4549 .cfi_def_cfa_offset 32 + 4550 0004 0446 mov r4, r0 +2341:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __IO uint32_t count; + 4551 .loc 1 2341 3 is_stmt 1 view .LVU1574 +2342:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __IO uint32_t resetcount; + 4552 .loc 1 2342 3 view .LVU1575 +2343:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4553 .loc 1 2343 3 view .LVU1576 +2346:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** resetcount = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U); + 4554 .loc 1 2346 3 view .LVU1577 + 4555 .LVL284: +2347:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** count = resetcount; + 4556 .loc 1 2347 3 view .LVU1578 +2347:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** count = resetcount; + 4557 .loc 1 2347 61 is_stmt 0 view .LVU1579 + 4558 0006 5E4B ldr r3, .L347 + 4559 0008 1B68 ldr r3, [r3] + 4560 000a 5E4A ldr r2, .L347+4 + 4561 000c A2FB0323 umull r2, r3, r2, r3 + 4562 0010 5B0A lsrs r3, r3, #9 +2347:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** count = resetcount; + 4563 .loc 1 2347 36 view .LVU1580 + ARM GAS /tmp/ccywxtmH.s page 183 + + + 4564 0012 6422 movs r2, #100 + 4565 0014 02FB03F3 mul r3, r2, r3 +2347:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** count = resetcount; + 4566 .loc 1 2347 14 view .LVU1581 + 4567 0018 0493 str r3, [sp, #16] +2348:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4568 .loc 1 2348 3 is_stmt 1 view .LVU1582 +2348:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4569 .loc 1 2348 9 is_stmt 0 view .LVU1583 + 4570 001a 049B ldr r3, [sp, #16] + 4571 001c 0593 str r3, [sp, #20] +2351:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4572 .loc 1 2351 3 is_stmt 1 view .LVU1584 + 4573 001e 0268 ldr r2, [r0] + 4574 0020 5368 ldr r3, [r2, #4] + 4575 0022 23F02003 bic r3, r3, #32 + 4576 0026 5360 str r3, [r2, #4] +2354:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4577 .loc 1 2354 3 view .LVU1585 +2354:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4578 .loc 1 2354 7 is_stmt 0 view .LVU1586 + 4579 0028 0268 ldr r2, [r0] + 4580 002a 5368 ldr r3, [r2, #4] +2354:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4581 .loc 1 2354 6 view .LVU1587 + 4582 002c 13F0800F tst r3, #128 + 4583 0030 12D0 beq .L327 +2356:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Wait HAL_SPI_STATE_ABORT state */ + 4584 .loc 1 2356 5 is_stmt 1 view .LVU1588 +2356:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Wait HAL_SPI_STATE_ABORT state */ + 4585 .loc 1 2356 17 is_stmt 0 view .LVU1589 + 4586 0032 554B ldr r3, .L347+8 + 4587 0034 0365 str r3, [r0, #80] + 4588 .L330: +2358:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4589 .loc 1 2358 5 is_stmt 1 view .LVU1590 +2360:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4590 .loc 1 2360 7 view .LVU1591 +2360:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4591 .loc 1 2360 17 is_stmt 0 view .LVU1592 + 4592 0036 059B ldr r3, [sp, #20] +2360:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4593 .loc 1 2360 10 view .LVU1593 + 4594 0038 43B1 cbz r3, .L345 +2365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } while (hspi->State != HAL_SPI_STATE_ABORT); + 4595 .loc 1 2365 7 is_stmt 1 view .LVU1594 +2365:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } while (hspi->State != HAL_SPI_STATE_ABORT); + 4596 .loc 1 2365 12 is_stmt 0 view .LVU1595 + 4597 003a 059B ldr r3, [sp, #20] + 4598 003c 013B subs r3, r3, #1 + 4599 003e 0593 str r3, [sp, #20] +2366:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Reset Timeout Counter */ + 4600 .loc 1 2366 26 is_stmt 1 view .LVU1596 +2366:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Reset Timeout Counter */ + 4601 .loc 1 2366 18 is_stmt 0 view .LVU1597 + 4602 0040 94F85D30 ldrb r3, [r4, #93] @ zero_extendqisi2 + 4603 0044 DBB2 uxtb r3, r3 + ARM GAS /tmp/ccywxtmH.s page 184 + + +2366:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Reset Timeout Counter */ + 4604 .loc 1 2366 26 view .LVU1598 + 4605 0046 072B cmp r3, #7 + 4606 0048 F5D1 bne .L330 + 4607 004a 03E0 b .L329 + 4608 .L345: +2362:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** break; + 4609 .loc 1 2362 9 is_stmt 1 view .LVU1599 + 4610 004c 236E ldr r3, [r4, #96] + 4611 004e 43F04003 orr r3, r3, #64 + 4612 0052 2366 str r3, [r4, #96] +2363:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4613 .loc 1 2363 9 view .LVU1600 + 4614 .L329: +2368:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4615 .loc 1 2368 5 view .LVU1601 +2368:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4616 .loc 1 2368 11 is_stmt 0 view .LVU1602 + 4617 0054 049B ldr r3, [sp, #16] + 4618 0056 0593 str r3, [sp, #20] + 4619 .L327: +2371:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4620 .loc 1 2371 3 is_stmt 1 view .LVU1603 +2371:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4621 .loc 1 2371 7 is_stmt 0 view .LVU1604 + 4622 0058 5368 ldr r3, [r2, #4] +2371:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4623 .loc 1 2371 6 view .LVU1605 + 4624 005a 13F0400F tst r3, #64 + 4625 005e 12D0 beq .L331 +2373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Wait HAL_SPI_STATE_ABORT state */ + 4626 .loc 1 2373 5 is_stmt 1 view .LVU1606 +2373:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Wait HAL_SPI_STATE_ABORT state */ + 4627 .loc 1 2373 17 is_stmt 0 view .LVU1607 + 4628 0060 4A4B ldr r3, .L347+12 + 4629 0062 E364 str r3, [r4, #76] + 4630 .L334: +2375:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4631 .loc 1 2375 5 is_stmt 1 view .LVU1608 +2377:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4632 .loc 1 2377 7 view .LVU1609 +2377:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4633 .loc 1 2377 17 is_stmt 0 view .LVU1610 + 4634 0064 059B ldr r3, [sp, #20] +2377:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4635 .loc 1 2377 10 view .LVU1611 + 4636 0066 43B1 cbz r3, .L346 +2382:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } while (hspi->State != HAL_SPI_STATE_ABORT); + 4637 .loc 1 2382 7 is_stmt 1 view .LVU1612 +2382:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } while (hspi->State != HAL_SPI_STATE_ABORT); + 4638 .loc 1 2382 12 is_stmt 0 view .LVU1613 + 4639 0068 059B ldr r3, [sp, #20] + 4640 006a 013B subs r3, r3, #1 + 4641 006c 0593 str r3, [sp, #20] +2383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Reset Timeout Counter */ + 4642 .loc 1 2383 26 is_stmt 1 view .LVU1614 +2383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Reset Timeout Counter */ + ARM GAS /tmp/ccywxtmH.s page 185 + + + 4643 .loc 1 2383 18 is_stmt 0 view .LVU1615 + 4644 006e 94F85D30 ldrb r3, [r4, #93] @ zero_extendqisi2 + 4645 0072 DBB2 uxtb r3, r3 +2383:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Reset Timeout Counter */ + 4646 .loc 1 2383 26 view .LVU1616 + 4647 0074 072B cmp r3, #7 + 4648 0076 F5D1 bne .L334 + 4649 0078 03E0 b .L333 + 4650 .L346: +2379:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** break; + 4651 .loc 1 2379 9 is_stmt 1 view .LVU1617 + 4652 007a 236E ldr r3, [r4, #96] + 4653 007c 43F04003 orr r3, r3, #64 + 4654 0080 2366 str r3, [r4, #96] +2380:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4655 .loc 1 2380 9 view .LVU1618 + 4656 .L333: +2385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4657 .loc 1 2385 5 view .LVU1619 +2385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4658 .loc 1 2385 11 is_stmt 0 view .LVU1620 + 4659 0082 049B ldr r3, [sp, #16] + 4660 0084 0593 str r3, [sp, #20] + 4661 .L331: +2389:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4662 .loc 1 2389 3 is_stmt 1 view .LVU1621 +2389:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4663 .loc 1 2389 7 is_stmt 0 view .LVU1622 + 4664 0086 5368 ldr r3, [r2, #4] +2389:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4665 .loc 1 2389 6 view .LVU1623 + 4666 0088 13F0020F tst r3, #2 + 4667 008c 2AD0 beq .L335 +2392:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4668 .loc 1 2392 5 is_stmt 1 view .LVU1624 +2392:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4669 .loc 1 2392 13 is_stmt 0 view .LVU1625 + 4670 008e 636D ldr r3, [r4, #84] +2392:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4671 .loc 1 2392 8 view .LVU1626 + 4672 0090 43B3 cbz r3, .L335 +2396:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4673 .loc 1 2396 7 is_stmt 1 view .LVU1627 +2396:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4674 .loc 1 2396 39 is_stmt 0 view .LVU1628 + 4675 0092 0022 movs r2, #0 + 4676 0094 5A63 str r2, [r3, #52] +2399:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4677 .loc 1 2399 7 is_stmt 1 view .LVU1629 +2399:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4678 .loc 1 2399 11 is_stmt 0 view .LVU1630 + 4679 0096 606D ldr r0, [r4, #84] + 4680 .LVL285: +2399:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4681 .loc 1 2399 11 view .LVU1631 + 4682 0098 FFF7FEFF bl HAL_DMA_Abort + 4683 .LVL286: + ARM GAS /tmp/ccywxtmH.s page 186 + + +2399:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4684 .loc 1 2399 10 view .LVU1632 + 4685 009c 08B1 cbz r0, .L336 +2401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4686 .loc 1 2401 9 is_stmt 1 view .LVU1633 +2401:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4687 .loc 1 2401 25 is_stmt 0 view .LVU1634 + 4688 009e 4023 movs r3, #64 + 4689 00a0 2366 str r3, [r4, #96] + 4690 .L336: +2405:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4691 .loc 1 2405 7 is_stmt 1 view .LVU1635 + 4692 00a2 2268 ldr r2, [r4] + 4693 00a4 5368 ldr r3, [r2, #4] + 4694 00a6 23F00203 bic r3, r3, #2 + 4695 00aa 5360 str r3, [r2, #4] +2407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4696 .loc 1 2407 7 view .LVU1636 +2407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4697 .loc 1 2407 11 is_stmt 0 view .LVU1637 + 4698 00ac FFF7FEFF bl HAL_GetTick + 4699 .LVL287: + 4700 00b0 0246 mov r2, r0 + 4701 00b2 6421 movs r1, #100 + 4702 00b4 2046 mov r0, r4 + 4703 00b6 FFF7FEFF bl SPI_EndRxTxTransaction + 4704 .LVL288: +2407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4705 .loc 1 2407 10 view .LVU1638 + 4706 00ba 08B1 cbz r0, .L337 +2409:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4707 .loc 1 2409 9 is_stmt 1 view .LVU1639 +2409:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4708 .loc 1 2409 25 is_stmt 0 view .LVU1640 + 4709 00bc 4023 movs r3, #64 + 4710 00be 2366 str r3, [r4, #96] + 4711 .L337: +2413:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4712 .loc 1 2413 7 is_stmt 1 view .LVU1641 + 4713 00c0 2268 ldr r2, [r4] + 4714 00c2 1368 ldr r3, [r2] + 4715 00c4 23F04003 bic r3, r3, #64 + 4716 00c8 1360 str r3, [r2] +2416:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4717 .loc 1 2416 7 view .LVU1642 +2416:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4718 .loc 1 2416 11 is_stmt 0 view .LVU1643 + 4719 00ca FFF7FEFF bl HAL_GetTick + 4720 .LVL289: + 4721 00ce 0090 str r0, [sp] + 4722 00d0 6423 movs r3, #100 + 4723 00d2 0022 movs r2, #0 + 4724 00d4 4FF4C061 mov r1, #1536 + 4725 00d8 2046 mov r0, r4 + 4726 00da FFF7FEFF bl SPI_WaitFifoStateUntilTimeout + 4727 .LVL290: +2416:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + ARM GAS /tmp/ccywxtmH.s page 187 + + + 4728 .loc 1 2416 10 view .LVU1644 + 4729 00de 08B1 cbz r0, .L335 +2418:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4730 .loc 1 2418 9 is_stmt 1 view .LVU1645 +2418:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4731 .loc 1 2418 25 is_stmt 0 view .LVU1646 + 4732 00e0 4023 movs r3, #64 + 4733 00e2 2366 str r3, [r4, #96] + 4734 .L335: +2424:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4735 .loc 1 2424 3 is_stmt 1 view .LVU1647 +2424:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4736 .loc 1 2424 7 is_stmt 0 view .LVU1648 + 4737 00e4 2368 ldr r3, [r4] + 4738 00e6 5B68 ldr r3, [r3, #4] +2424:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4739 .loc 1 2424 6 view .LVU1649 + 4740 00e8 13F0010F tst r3, #1 + 4741 00ec 2CD0 beq .L338 +2427:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4742 .loc 1 2427 5 is_stmt 1 view .LVU1650 +2427:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4743 .loc 1 2427 13 is_stmt 0 view .LVU1651 + 4744 00ee A36D ldr r3, [r4, #88] +2427:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4745 .loc 1 2427 8 view .LVU1652 + 4746 00f0 53B3 cbz r3, .L338 +2431:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4747 .loc 1 2431 7 is_stmt 1 view .LVU1653 +2431:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4748 .loc 1 2431 39 is_stmt 0 view .LVU1654 + 4749 00f2 0022 movs r2, #0 + 4750 00f4 5A63 str r2, [r3, #52] +2434:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4751 .loc 1 2434 7 is_stmt 1 view .LVU1655 +2434:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4752 .loc 1 2434 11 is_stmt 0 view .LVU1656 + 4753 00f6 A06D ldr r0, [r4, #88] + 4754 00f8 FFF7FEFF bl HAL_DMA_Abort + 4755 .LVL291: +2434:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4756 .loc 1 2434 10 view .LVU1657 + 4757 00fc 08B1 cbz r0, .L339 +2436:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4758 .loc 1 2436 9 is_stmt 1 view .LVU1658 +2436:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4759 .loc 1 2436 25 is_stmt 0 view .LVU1659 + 4760 00fe 4023 movs r3, #64 + 4761 0100 2366 str r3, [r4, #96] + 4762 .L339: +2440:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4763 .loc 1 2440 7 is_stmt 1 view .LVU1660 + 4764 0102 2268 ldr r2, [r4] + 4765 0104 1368 ldr r3, [r2] + 4766 0106 23F04003 bic r3, r3, #64 + 4767 010a 1360 str r3, [r2] +2443:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + ARM GAS /tmp/ccywxtmH.s page 188 + + + 4768 .loc 1 2443 7 view .LVU1661 +2443:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4769 .loc 1 2443 11 is_stmt 0 view .LVU1662 + 4770 010c FFF7FEFF bl HAL_GetTick + 4771 .LVL292: + 4772 0110 0090 str r0, [sp] + 4773 0112 6423 movs r3, #100 + 4774 0114 0022 movs r2, #0 + 4775 0116 8021 movs r1, #128 + 4776 0118 2046 mov r0, r4 + 4777 011a FFF7FEFF bl SPI_WaitFlagStateUntilTimeout + 4778 .LVL293: +2443:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4779 .loc 1 2443 10 view .LVU1663 + 4780 011e 08B1 cbz r0, .L340 +2445:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4781 .loc 1 2445 9 is_stmt 1 view .LVU1664 +2445:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4782 .loc 1 2445 25 is_stmt 0 view .LVU1665 + 4783 0120 4023 movs r3, #64 + 4784 0122 2366 str r3, [r4, #96] + 4785 .L340: +2449:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4786 .loc 1 2449 7 is_stmt 1 view .LVU1666 +2449:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4787 .loc 1 2449 11 is_stmt 0 view .LVU1667 + 4788 0124 FFF7FEFF bl HAL_GetTick + 4789 .LVL294: + 4790 0128 0090 str r0, [sp] + 4791 012a 6423 movs r3, #100 + 4792 012c 0022 movs r2, #0 + 4793 012e 4FF4C061 mov r1, #1536 + 4794 0132 2046 mov r0, r4 + 4795 0134 FFF7FEFF bl SPI_WaitFifoStateUntilTimeout + 4796 .LVL295: +2449:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4797 .loc 1 2449 10 view .LVU1668 + 4798 0138 08B1 cbz r0, .L341 +2451:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4799 .loc 1 2451 9 is_stmt 1 view .LVU1669 +2451:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4800 .loc 1 2451 25 is_stmt 0 view .LVU1670 + 4801 013a 4023 movs r3, #64 + 4802 013c 2366 str r3, [r4, #96] + 4803 .L341: +2455:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4804 .loc 1 2455 7 is_stmt 1 view .LVU1671 + 4805 013e 2268 ldr r2, [r4] + 4806 0140 5368 ldr r3, [r2, #4] + 4807 0142 23F00103 bic r3, r3, #1 + 4808 0146 5360 str r3, [r2, #4] + 4809 .L338: +2459:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = 0U; + 4810 .loc 1 2459 3 view .LVU1672 +2459:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = 0U; + 4811 .loc 1 2459 21 is_stmt 0 view .LVU1673 + 4812 0148 0023 movs r3, #0 + ARM GAS /tmp/ccywxtmH.s page 189 + + + 4813 014a A4F84630 strh r3, [r4, #70] @ movhi +2460:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4814 .loc 1 2460 3 is_stmt 1 view .LVU1674 +2460:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4815 .loc 1 2460 21 is_stmt 0 view .LVU1675 + 4816 014e E387 strh r3, [r4, #62] @ movhi +2463:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4817 .loc 1 2463 3 is_stmt 1 view .LVU1676 +2463:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4818 .loc 1 2463 11 is_stmt 0 view .LVU1677 + 4819 0150 236E ldr r3, [r4, #96] +2463:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 4820 .loc 1 2463 6 view .LVU1678 + 4821 0152 402B cmp r3, #64 + 4822 0154 12D0 beq .L343 +2471:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4823 .loc 1 2471 5 is_stmt 1 view .LVU1679 +2471:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4824 .loc 1 2471 21 is_stmt 0 view .LVU1680 + 4825 0156 0020 movs r0, #0 + 4826 0158 2066 str r0, [r4, #96] + 4827 .L342: + 4828 .LVL296: +2475:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_FREFLAG(hspi); + 4829 .loc 1 2475 3 is_stmt 1 view .LVU1681 + 4830 .LBB3: +2475:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_FREFLAG(hspi); + 4831 .loc 1 2475 3 view .LVU1682 + 4832 015a 0022 movs r2, #0 + 4833 015c 0292 str r2, [sp, #8] +2475:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_FREFLAG(hspi); + 4834 .loc 1 2475 3 view .LVU1683 + 4835 015e 2368 ldr r3, [r4] + 4836 0160 D968 ldr r1, [r3, #12] + 4837 0162 0291 str r1, [sp, #8] +2475:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_FREFLAG(hspi); + 4838 .loc 1 2475 3 view .LVU1684 + 4839 0164 9968 ldr r1, [r3, #8] + 4840 0166 0291 str r1, [sp, #8] +2475:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_FREFLAG(hspi); + 4841 .loc 1 2475 3 view .LVU1685 + 4842 0168 0299 ldr r1, [sp, #8] + 4843 .LBE3: +2475:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_FREFLAG(hspi); + 4844 .loc 1 2475 3 view .LVU1686 +2476:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4845 .loc 1 2476 3 view .LVU1687 + 4846 .LBB4: +2476:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4847 .loc 1 2476 3 view .LVU1688 + 4848 016a 0392 str r2, [sp, #12] +2476:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4849 .loc 1 2476 3 view .LVU1689 + 4850 016c 9B68 ldr r3, [r3, #8] + 4851 016e 0393 str r3, [sp, #12] +2476:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4852 .loc 1 2476 3 view .LVU1690 + ARM GAS /tmp/ccywxtmH.s page 190 + + + 4853 0170 039B ldr r3, [sp, #12] + 4854 .LBE4: +2476:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4855 .loc 1 2476 3 view .LVU1691 +2479:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4856 .loc 1 2479 3 view .LVU1692 +2479:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4857 .loc 1 2479 15 is_stmt 0 view .LVU1693 + 4858 0172 0123 movs r3, #1 + 4859 0174 84F85D30 strb r3, [r4, #93] +2481:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4860 .loc 1 2481 3 is_stmt 1 view .LVU1694 +2482:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4861 .loc 1 2482 1 is_stmt 0 view .LVU1695 + 4862 0178 06B0 add sp, sp, #24 + 4863 .cfi_remember_state + 4864 .cfi_def_cfa_offset 8 + 4865 @ sp needed + 4866 017a 10BD pop {r4, pc} + 4867 .LVL297: + 4868 .L343: + 4869 .cfi_restore_state +2466:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4870 .loc 1 2466 15 view .LVU1696 + 4871 017c 0120 movs r0, #1 + 4872 017e ECE7 b .L342 + 4873 .L348: + 4874 .align 2 + 4875 .L347: + 4876 0180 00000000 .word SystemCoreClock + 4877 0184 F1197605 .word 91625969 + 4878 0188 00000000 .word SPI_AbortTx_ISR + 4879 018c 00000000 .word SPI_AbortRx_ISR + 4880 .cfi_endproc + 4881 .LFE143: + 4883 .section .text.HAL_SPI_DMAPause,"ax",%progbits + 4884 .align 1 + 4885 .global HAL_SPI_DMAPause + 4886 .syntax unified + 4887 .thumb + 4888 .thumb_func + 4890 HAL_SPI_DMAPause: + 4891 .LVL298: + 4892 .LFB145: +2661:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Process Locked */ + 4893 .loc 1 2661 1 is_stmt 1 view -0 + 4894 .cfi_startproc + 4895 @ args = 0, pretend = 0, frame = 0 + 4896 @ frame_needed = 0, uses_anonymous_args = 0 + 4897 @ link register save eliminated. +2663:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4898 .loc 1 2663 3 view .LVU1698 +2663:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4899 .loc 1 2663 3 view .LVU1699 + 4900 0000 90F85C30 ldrb r3, [r0, #92] @ zero_extendqisi2 + 4901 0004 012B cmp r3, #1 + 4902 0006 0CD0 beq .L351 + ARM GAS /tmp/ccywxtmH.s page 191 + + +2663:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4903 .loc 1 2663 3 discriminator 2 view .LVU1700 + 4904 0008 0123 movs r3, #1 + 4905 000a 80F85C30 strb r3, [r0, #92] +2663:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4906 .loc 1 2663 3 discriminator 2 view .LVU1701 +2666:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4907 .loc 1 2666 3 discriminator 2 view .LVU1702 + 4908 000e 0268 ldr r2, [r0] + 4909 0010 5368 ldr r3, [r2, #4] + 4910 0012 23F00303 bic r3, r3, #3 + 4911 0016 5360 str r3, [r2, #4] +2669:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4912 .loc 1 2669 3 discriminator 2 view .LVU1703 +2669:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4913 .loc 1 2669 3 discriminator 2 view .LVU1704 + 4914 0018 0023 movs r3, #0 + 4915 001a 80F85C30 strb r3, [r0, #92] +2669:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4916 .loc 1 2669 3 discriminator 2 view .LVU1705 +2671:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4917 .loc 1 2671 3 discriminator 2 view .LVU1706 +2671:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4918 .loc 1 2671 10 is_stmt 0 discriminator 2 view .LVU1707 + 4919 001e 1846 mov r0, r3 + 4920 .LVL299: +2671:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4921 .loc 1 2671 10 discriminator 2 view .LVU1708 + 4922 0020 7047 bx lr + 4923 .LVL300: + 4924 .L351: +2663:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4925 .loc 1 2663 3 view .LVU1709 + 4926 0022 0220 movs r0, #2 + 4927 .LVL301: +2672:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4928 .loc 1 2672 1 view .LVU1710 + 4929 0024 7047 bx lr + 4930 .cfi_endproc + 4931 .LFE145: + 4933 .section .text.HAL_SPI_DMAResume,"ax",%progbits + 4934 .align 1 + 4935 .global HAL_SPI_DMAResume + 4936 .syntax unified + 4937 .thumb + 4938 .thumb_func + 4940 HAL_SPI_DMAResume: + 4941 .LVL302: + 4942 .LFB146: +2681:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Process Locked */ + 4943 .loc 1 2681 1 is_stmt 1 view -0 + 4944 .cfi_startproc + 4945 @ args = 0, pretend = 0, frame = 0 + 4946 @ frame_needed = 0, uses_anonymous_args = 0 + 4947 @ link register save eliminated. +2683:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4948 .loc 1 2683 3 view .LVU1712 + ARM GAS /tmp/ccywxtmH.s page 192 + + +2683:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4949 .loc 1 2683 3 view .LVU1713 + 4950 0000 90F85C30 ldrb r3, [r0, #92] @ zero_extendqisi2 + 4951 0004 012B cmp r3, #1 + 4952 0006 0CD0 beq .L354 +2683:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4953 .loc 1 2683 3 discriminator 2 view .LVU1714 + 4954 0008 0123 movs r3, #1 + 4955 000a 80F85C30 strb r3, [r0, #92] +2683:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4956 .loc 1 2683 3 discriminator 2 view .LVU1715 +2686:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4957 .loc 1 2686 3 discriminator 2 view .LVU1716 + 4958 000e 0268 ldr r2, [r0] + 4959 0010 5368 ldr r3, [r2, #4] + 4960 0012 43F00303 orr r3, r3, #3 + 4961 0016 5360 str r3, [r2, #4] +2689:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4962 .loc 1 2689 3 discriminator 2 view .LVU1717 +2689:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4963 .loc 1 2689 3 discriminator 2 view .LVU1718 + 4964 0018 0023 movs r3, #0 + 4965 001a 80F85C30 strb r3, [r0, #92] +2689:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4966 .loc 1 2689 3 discriminator 2 view .LVU1719 +2691:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4967 .loc 1 2691 3 discriminator 2 view .LVU1720 +2691:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4968 .loc 1 2691 10 is_stmt 0 discriminator 2 view .LVU1721 + 4969 001e 1846 mov r0, r3 + 4970 .LVL303: +2691:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 4971 .loc 1 2691 10 discriminator 2 view .LVU1722 + 4972 0020 7047 bx lr + 4973 .LVL304: + 4974 .L354: +2683:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4975 .loc 1 2683 3 view .LVU1723 + 4976 0022 0220 movs r0, #2 + 4977 .LVL305: +2692:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 4978 .loc 1 2692 1 view .LVU1724 + 4979 0024 7047 bx lr + 4980 .cfi_endproc + 4981 .LFE146: + 4983 .section .text.HAL_SPI_DMAStop,"ax",%progbits + 4984 .align 1 + 4985 .global HAL_SPI_DMAStop + 4986 .syntax unified + 4987 .thumb + 4988 .thumb_func + 4990 HAL_SPI_DMAStop: + 4991 .LVL306: + 4992 .LFB147: +2701:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef errorcode = HAL_OK; + 4993 .loc 1 2701 1 is_stmt 1 view -0 + 4994 .cfi_startproc + ARM GAS /tmp/ccywxtmH.s page 193 + + + 4995 @ args = 0, pretend = 0, frame = 0 + 4996 @ frame_needed = 0, uses_anonymous_args = 0 +2701:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef errorcode = HAL_OK; + 4997 .loc 1 2701 1 is_stmt 0 view .LVU1726 + 4998 0000 38B5 push {r3, r4, r5, lr} + 4999 .cfi_def_cfa_offset 16 + 5000 .cfi_offset 3, -16 + 5001 .cfi_offset 4, -12 + 5002 .cfi_offset 5, -8 + 5003 .cfi_offset 14, -4 + 5004 0002 0446 mov r4, r0 +2702:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* The Lock is not implemented on this API to allow the user application + 5005 .loc 1 2702 3 is_stmt 1 view .LVU1727 + 5006 .LVL307: +2710:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5007 .loc 1 2710 3 view .LVU1728 +2710:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5008 .loc 1 2710 11 is_stmt 0 view .LVU1729 + 5009 0004 406D ldr r0, [r0, #84] + 5010 .LVL308: +2710:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5011 .loc 1 2710 6 view .LVU1730 + 5012 0006 48B1 cbz r0, .L358 +2712:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5013 .loc 1 2712 5 is_stmt 1 view .LVU1731 +2712:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5014 .loc 1 2712 19 is_stmt 0 view .LVU1732 + 5015 0008 FFF7FEFF bl HAL_DMA_Abort + 5016 .LVL309: +2712:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5017 .loc 1 2712 8 view .LVU1733 + 5018 000c 0546 mov r5, r0 + 5019 000e 30B1 cbz r0, .L356 +2714:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_ERROR; + 5020 .loc 1 2714 7 is_stmt 1 view .LVU1734 + 5021 0010 236E ldr r3, [r4, #96] + 5022 0012 43F01003 orr r3, r3, #16 + 5023 0016 2366 str r3, [r4, #96] +2715:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 5024 .loc 1 2715 7 view .LVU1735 + 5025 .LVL310: +2715:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 5026 .loc 1 2715 17 is_stmt 0 view .LVU1736 + 5027 0018 0125 movs r5, #1 + 5028 001a 00E0 b .L356 + 5029 .LVL311: + 5030 .L358: +2702:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* The Lock is not implemented on this API to allow the user application + 5031 .loc 1 2702 21 view .LVU1737 + 5032 001c 0025 movs r5, #0 + 5033 .LVL312: + 5034 .L356: +2719:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5035 .loc 1 2719 3 is_stmt 1 view .LVU1738 +2719:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5036 .loc 1 2719 11 is_stmt 0 view .LVU1739 + 5037 001e A06D ldr r0, [r4, #88] + ARM GAS /tmp/ccywxtmH.s page 194 + + +2719:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5038 .loc 1 2719 6 view .LVU1740 + 5039 0020 38B1 cbz r0, .L357 +2721:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5040 .loc 1 2721 5 is_stmt 1 view .LVU1741 +2721:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5041 .loc 1 2721 19 is_stmt 0 view .LVU1742 + 5042 0022 FFF7FEFF bl HAL_DMA_Abort + 5043 .LVL313: +2721:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5044 .loc 1 2721 8 view .LVU1743 + 5045 0026 20B1 cbz r0, .L357 +2723:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** errorcode = HAL_ERROR; + 5046 .loc 1 2723 7 is_stmt 1 view .LVU1744 + 5047 0028 236E ldr r3, [r4, #96] + 5048 002a 43F01003 orr r3, r3, #16 + 5049 002e 2366 str r3, [r4, #96] +2724:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 5050 .loc 1 2724 7 view .LVU1745 + 5051 .LVL314: +2724:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 5052 .loc 1 2724 17 is_stmt 0 view .LVU1746 + 5053 0030 0125 movs r5, #1 + 5054 .LVL315: + 5055 .L357: +2729:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_READY; + 5056 .loc 1 2729 3 is_stmt 1 view .LVU1747 + 5057 0032 2268 ldr r2, [r4] + 5058 0034 5368 ldr r3, [r2, #4] + 5059 0036 23F00303 bic r3, r3, #3 + 5060 003a 5360 str r3, [r2, #4] +2730:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return errorcode; + 5061 .loc 1 2730 3 view .LVU1748 +2730:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return errorcode; + 5062 .loc 1 2730 15 is_stmt 0 view .LVU1749 + 5063 003c 0123 movs r3, #1 + 5064 003e 84F85D30 strb r3, [r4, #93] +2731:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 5065 .loc 1 2731 3 is_stmt 1 view .LVU1750 +2732:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5066 .loc 1 2732 1 is_stmt 0 view .LVU1751 + 5067 0042 2846 mov r0, r5 + 5068 0044 38BD pop {r3, r4, r5, pc} +2732:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5069 .loc 1 2732 1 view .LVU1752 + 5070 .cfi_endproc + 5071 .LFE147: + 5073 .section .text.HAL_SPI_TxCpltCallback,"ax",%progbits + 5074 .align 1 + 5075 .weak HAL_SPI_TxCpltCallback + 5076 .syntax unified + 5077 .thumb + 5078 .thumb_func + 5080 HAL_SPI_TxCpltCallback: + 5081 .LVL316: + 5082 .LFB149: +2848:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Prevent unused argument(s) compilation warning */ + ARM GAS /tmp/ccywxtmH.s page 195 + + + 5083 .loc 1 2848 1 is_stmt 1 view -0 + 5084 .cfi_startproc + 5085 @ args = 0, pretend = 0, frame = 0 + 5086 @ frame_needed = 0, uses_anonymous_args = 0 + 5087 @ link register save eliminated. +2850:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5088 .loc 1 2850 3 view .LVU1754 +2855:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5089 .loc 1 2855 1 is_stmt 0 view .LVU1755 + 5090 0000 7047 bx lr + 5091 .cfi_endproc + 5092 .LFE149: + 5094 .section .text.HAL_SPI_RxCpltCallback,"ax",%progbits + 5095 .align 1 + 5096 .weak HAL_SPI_RxCpltCallback + 5097 .syntax unified + 5098 .thumb + 5099 .thumb_func + 5101 HAL_SPI_RxCpltCallback: + 5102 .LVL317: + 5103 .LFB150: +2864:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Prevent unused argument(s) compilation warning */ + 5104 .loc 1 2864 1 is_stmt 1 view -0 + 5105 .cfi_startproc + 5106 @ args = 0, pretend = 0, frame = 0 + 5107 @ frame_needed = 0, uses_anonymous_args = 0 + 5108 @ link register save eliminated. +2866:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5109 .loc 1 2866 3 view .LVU1757 +2871:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5110 .loc 1 2871 1 is_stmt 0 view .LVU1758 + 5111 0000 7047 bx lr + 5112 .cfi_endproc + 5113 .LFE150: + 5115 .section .text.HAL_SPI_TxRxCpltCallback,"ax",%progbits + 5116 .align 1 + 5117 .weak HAL_SPI_TxRxCpltCallback + 5118 .syntax unified + 5119 .thumb + 5120 .thumb_func + 5122 HAL_SPI_TxRxCpltCallback: + 5123 .LVL318: + 5124 .LFB151: +2880:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Prevent unused argument(s) compilation warning */ + 5125 .loc 1 2880 1 is_stmt 1 view -0 + 5126 .cfi_startproc + 5127 @ args = 0, pretend = 0, frame = 0 + 5128 @ frame_needed = 0, uses_anonymous_args = 0 + 5129 @ link register save eliminated. +2882:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5130 .loc 1 2882 3 view .LVU1760 +2887:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5131 .loc 1 2887 1 is_stmt 0 view .LVU1761 + 5132 0000 7047 bx lr + 5133 .cfi_endproc + 5134 .LFE151: + 5136 .section .text.HAL_SPI_TxHalfCpltCallback,"ax",%progbits + ARM GAS /tmp/ccywxtmH.s page 196 + + + 5137 .align 1 + 5138 .weak HAL_SPI_TxHalfCpltCallback + 5139 .syntax unified + 5140 .thumb + 5141 .thumb_func + 5143 HAL_SPI_TxHalfCpltCallback: + 5144 .LVL319: + 5145 .LFB152: +2896:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Prevent unused argument(s) compilation warning */ + 5146 .loc 1 2896 1 is_stmt 1 view -0 + 5147 .cfi_startproc + 5148 @ args = 0, pretend = 0, frame = 0 + 5149 @ frame_needed = 0, uses_anonymous_args = 0 + 5150 @ link register save eliminated. +2898:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5151 .loc 1 2898 3 view .LVU1763 +2903:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5152 .loc 1 2903 1 is_stmt 0 view .LVU1764 + 5153 0000 7047 bx lr + 5154 .cfi_endproc + 5155 .LFE152: + 5157 .section .text.SPI_DMAHalfTransmitCplt,"ax",%progbits + 5158 .align 1 + 5159 .syntax unified + 5160 .thumb + 5161 .thumb_func + 5163 SPI_DMAHalfTransmitCplt: + 5164 .LVL320: + 5165 .LFB162: +3308:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogati + 5166 .loc 1 3308 1 is_stmt 1 view -0 + 5167 .cfi_startproc + 5168 @ args = 0, pretend = 0, frame = 0 + 5169 @ frame_needed = 0, uses_anonymous_args = 0 +3308:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogati + 5170 .loc 1 3308 1 is_stmt 0 view .LVU1766 + 5171 0000 08B5 push {r3, lr} + 5172 .cfi_def_cfa_offset 8 + 5173 .cfi_offset 3, -8 + 5174 .cfi_offset 14, -4 +3309:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5175 .loc 1 3309 3 is_stmt 1 view .LVU1767 + 5176 .LVL321: +3315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + 5177 .loc 1 3315 3 view .LVU1768 + 5178 0002 406A ldr r0, [r0, #36] + 5179 .LVL322: +3315:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + 5180 .loc 1 3315 3 is_stmt 0 view .LVU1769 + 5181 0004 FFF7FEFF bl HAL_SPI_TxHalfCpltCallback + 5182 .LVL323: +3317:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5183 .loc 1 3317 1 view .LVU1770 + 5184 0008 08BD pop {r3, pc} + 5185 .cfi_endproc + 5186 .LFE162: + 5188 .section .text.HAL_SPI_RxHalfCpltCallback,"ax",%progbits + ARM GAS /tmp/ccywxtmH.s page 197 + + + 5189 .align 1 + 5190 .weak HAL_SPI_RxHalfCpltCallback + 5191 .syntax unified + 5192 .thumb + 5193 .thumb_func + 5195 HAL_SPI_RxHalfCpltCallback: + 5196 .LVL324: + 5197 .LFB153: +2912:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Prevent unused argument(s) compilation warning */ + 5198 .loc 1 2912 1 is_stmt 1 view -0 + 5199 .cfi_startproc + 5200 @ args = 0, pretend = 0, frame = 0 + 5201 @ frame_needed = 0, uses_anonymous_args = 0 + 5202 @ link register save eliminated. +2914:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5203 .loc 1 2914 3 view .LVU1772 +2919:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5204 .loc 1 2919 1 is_stmt 0 view .LVU1773 + 5205 0000 7047 bx lr + 5206 .cfi_endproc + 5207 .LFE153: + 5209 .section .text.SPI_DMAHalfReceiveCplt,"ax",%progbits + 5210 .align 1 + 5211 .syntax unified + 5212 .thumb + 5213 .thumb_func + 5215 SPI_DMAHalfReceiveCplt: + 5216 .LVL325: + 5217 .LFB163: +3326:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogati + 5218 .loc 1 3326 1 is_stmt 1 view -0 + 5219 .cfi_startproc + 5220 @ args = 0, pretend = 0, frame = 0 + 5221 @ frame_needed = 0, uses_anonymous_args = 0 +3326:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogati + 5222 .loc 1 3326 1 is_stmt 0 view .LVU1775 + 5223 0000 08B5 push {r3, lr} + 5224 .cfi_def_cfa_offset 8 + 5225 .cfi_offset 3, -8 + 5226 .cfi_offset 14, -4 +3327:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5227 .loc 1 3327 3 is_stmt 1 view .LVU1776 + 5228 .LVL326: +3333:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + 5229 .loc 1 3333 3 view .LVU1777 + 5230 0002 406A ldr r0, [r0, #36] + 5231 .LVL327: +3333:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + 5232 .loc 1 3333 3 is_stmt 0 view .LVU1778 + 5233 0004 FFF7FEFF bl HAL_SPI_RxHalfCpltCallback + 5234 .LVL328: +3335:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5235 .loc 1 3335 1 view .LVU1779 + 5236 0008 08BD pop {r3, pc} + 5237 .cfi_endproc + 5238 .LFE163: + 5240 .section .text.HAL_SPI_TxRxHalfCpltCallback,"ax",%progbits + ARM GAS /tmp/ccywxtmH.s page 198 + + + 5241 .align 1 + 5242 .weak HAL_SPI_TxRxHalfCpltCallback + 5243 .syntax unified + 5244 .thumb + 5245 .thumb_func + 5247 HAL_SPI_TxRxHalfCpltCallback: + 5248 .LVL329: + 5249 .LFB154: +2928:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Prevent unused argument(s) compilation warning */ + 5250 .loc 1 2928 1 is_stmt 1 view -0 + 5251 .cfi_startproc + 5252 @ args = 0, pretend = 0, frame = 0 + 5253 @ frame_needed = 0, uses_anonymous_args = 0 + 5254 @ link register save eliminated. +2930:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5255 .loc 1 2930 3 view .LVU1781 +2935:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5256 .loc 1 2935 1 is_stmt 0 view .LVU1782 + 5257 0000 7047 bx lr + 5258 .cfi_endproc + 5259 .LFE154: + 5261 .section .text.SPI_DMAHalfTransmitReceiveCplt,"ax",%progbits + 5262 .align 1 + 5263 .syntax unified + 5264 .thumb + 5265 .thumb_func + 5267 SPI_DMAHalfTransmitReceiveCplt: + 5268 .LVL330: + 5269 .LFB164: +3344:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogati + 5270 .loc 1 3344 1 is_stmt 1 view -0 + 5271 .cfi_startproc + 5272 @ args = 0, pretend = 0, frame = 0 + 5273 @ frame_needed = 0, uses_anonymous_args = 0 +3344:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogati + 5274 .loc 1 3344 1 is_stmt 0 view .LVU1784 + 5275 0000 08B5 push {r3, lr} + 5276 .cfi_def_cfa_offset 8 + 5277 .cfi_offset 3, -8 + 5278 .cfi_offset 14, -4 +3345:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5279 .loc 1 3345 3 is_stmt 1 view .LVU1785 + 5280 .LVL331: +3351:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + 5281 .loc 1 3351 3 view .LVU1786 + 5282 0002 406A ldr r0, [r0, #36] + 5283 .LVL332: +3351:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + 5284 .loc 1 3351 3 is_stmt 0 view .LVU1787 + 5285 0004 FFF7FEFF bl HAL_SPI_TxRxHalfCpltCallback + 5286 .LVL333: +3353:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5287 .loc 1 3353 1 view .LVU1788 + 5288 0008 08BD pop {r3, pc} + 5289 .cfi_endproc + 5290 .LFE164: + 5292 .section .text.HAL_SPI_ErrorCallback,"ax",%progbits + ARM GAS /tmp/ccywxtmH.s page 199 + + + 5293 .align 1 + 5294 .weak HAL_SPI_ErrorCallback + 5295 .syntax unified + 5296 .thumb + 5297 .thumb_func + 5299 HAL_SPI_ErrorCallback: + 5300 .LVL334: + 5301 .LFB155: +2944:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Prevent unused argument(s) compilation warning */ + 5302 .loc 1 2944 1 is_stmt 1 view -0 + 5303 .cfi_startproc + 5304 @ args = 0, pretend = 0, frame = 0 + 5305 @ frame_needed = 0, uses_anonymous_args = 0 + 5306 @ link register save eliminated. +2946:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5307 .loc 1 2946 3 view .LVU1790 +2954:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5308 .loc 1 2954 1 is_stmt 0 view .LVU1791 + 5309 0000 7047 bx lr + 5310 .cfi_endproc + 5311 .LFE155: + 5313 .section .text.SPI_CloseTx_ISR,"ax",%progbits + 5314 .align 1 + 5315 .syntax unified + 5316 .thumb + 5317 .thumb_func + 5319 SPI_CloseTx_ISR: + 5320 .LVL335: + 5321 .LFB183: +4286:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t tickstart; + 5322 .loc 1 4286 1 is_stmt 1 view -0 + 5323 .cfi_startproc + 5324 @ args = 0, pretend = 0, frame = 8 + 5325 @ frame_needed = 0, uses_anonymous_args = 0 +4286:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t tickstart; + 5326 .loc 1 4286 1 is_stmt 0 view .LVU1793 + 5327 0000 10B5 push {r4, lr} + 5328 .cfi_def_cfa_offset 8 + 5329 .cfi_offset 4, -8 + 5330 .cfi_offset 14, -4 + 5331 0002 82B0 sub sp, sp, #8 + 5332 .cfi_def_cfa_offset 16 + 5333 0004 0446 mov r4, r0 +4287:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5334 .loc 1 4287 3 is_stmt 1 view .LVU1794 +4290:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5335 .loc 1 4290 3 view .LVU1795 +4290:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5336 .loc 1 4290 15 is_stmt 0 view .LVU1796 + 5337 0006 FFF7FEFF bl HAL_GetTick + 5338 .LVL336: +4290:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5339 .loc 1 4290 15 view .LVU1797 + 5340 000a 0246 mov r2, r0 + 5341 .LVL337: +4293:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5342 .loc 1 4293 3 is_stmt 1 view .LVU1798 + ARM GAS /tmp/ccywxtmH.s page 200 + + + 5343 000c 2168 ldr r1, [r4] + 5344 000e 4B68 ldr r3, [r1, #4] + 5345 0010 23F0A003 bic r3, r3, #160 + 5346 0014 4B60 str r3, [r1, #4] +4296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5347 .loc 1 4296 3 view .LVU1799 +4296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5348 .loc 1 4296 7 is_stmt 0 view .LVU1800 + 5349 0016 6421 movs r1, #100 + 5350 0018 2046 mov r0, r4 + 5351 .LVL338: +4296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5352 .loc 1 4296 7 view .LVU1801 + 5353 001a FFF7FEFF bl SPI_EndRxTxTransaction + 5354 .LVL339: +4296:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5355 .loc 1 4296 6 view .LVU1802 + 5356 001e 18B1 cbz r0, .L374 +4298:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 5357 .loc 1 4298 5 is_stmt 1 view .LVU1803 + 5358 0020 236E ldr r3, [r4, #96] + 5359 0022 43F02003 orr r3, r3, #32 + 5360 0026 2366 str r3, [r4, #96] + 5361 .L374: +4302:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5362 .loc 1 4302 3 view .LVU1804 +4302:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5363 .loc 1 4302 17 is_stmt 0 view .LVU1805 + 5364 0028 A368 ldr r3, [r4, #8] +4302:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5365 .loc 1 4302 6 view .LVU1806 + 5366 002a 33B9 cbnz r3, .L375 +4304:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 5367 .loc 1 4304 5 is_stmt 1 view .LVU1807 + 5368 .LBB5: +4304:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 5369 .loc 1 4304 5 view .LVU1808 + 5370 002c 0193 str r3, [sp, #4] +4304:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 5371 .loc 1 4304 5 view .LVU1809 + 5372 002e 2368 ldr r3, [r4] + 5373 0030 DA68 ldr r2, [r3, #12] + 5374 0032 0192 str r2, [sp, #4] +4304:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 5375 .loc 1 4304 5 view .LVU1810 + 5376 0034 9B68 ldr r3, [r3, #8] + 5377 0036 0193 str r3, [sp, #4] +4304:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 5378 .loc 1 4304 5 view .LVU1811 + 5379 0038 019B ldr r3, [sp, #4] + 5380 .L375: + 5381 .LBE5: +4304:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 5382 .loc 1 4304 5 discriminator 1 view .LVU1812 +4307:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) + 5383 .loc 1 4307 3 discriminator 1 view .LVU1813 +4307:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->ErrorCode != HAL_SPI_ERROR_NONE) + ARM GAS /tmp/ccywxtmH.s page 201 + + + 5384 .loc 1 4307 15 is_stmt 0 discriminator 1 view .LVU1814 + 5385 003a 0123 movs r3, #1 + 5386 003c 84F85D30 strb r3, [r4, #93] +4308:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5387 .loc 1 4308 3 is_stmt 1 discriminator 1 view .LVU1815 +4308:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5388 .loc 1 4308 11 is_stmt 0 discriminator 1 view .LVU1816 + 5389 0040 236E ldr r3, [r4, #96] +4308:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5390 .loc 1 4308 6 discriminator 1 view .LVU1817 + 5391 0042 23B1 cbz r3, .L376 +4314:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + 5392 .loc 1 4314 5 is_stmt 1 view .LVU1818 + 5393 0044 2046 mov r0, r4 + 5394 0046 FFF7FEFF bl HAL_SPI_ErrorCallback + 5395 .LVL340: + 5396 .L373: +4326:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5397 .loc 1 4326 1 is_stmt 0 view .LVU1819 + 5398 004a 02B0 add sp, sp, #8 + 5399 .cfi_remember_state + 5400 .cfi_def_cfa_offset 8 + 5401 @ sp needed + 5402 004c 10BD pop {r4, pc} + 5403 .LVL341: + 5404 .L376: + 5405 .cfi_restore_state +4323:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + 5406 .loc 1 4323 5 is_stmt 1 view .LVU1820 + 5407 004e 2046 mov r0, r4 + 5408 0050 FFF7FEFF bl HAL_SPI_TxCpltCallback + 5409 .LVL342: +4326:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5410 .loc 1 4326 1 is_stmt 0 view .LVU1821 + 5411 0054 F9E7 b .L373 + 5412 .cfi_endproc + 5413 .LFE183: + 5415 .section .text.SPI_TxISR_8BIT,"ax",%progbits + 5416 .align 1 + 5417 .syntax unified + 5418 .thumb + 5419 .thumb_func + 5421 SPI_TxISR_8BIT: + 5422 .LVL343: + 5423 .LFB175: +3880:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** *(__IO uint8_t *)&hspi->Instance->DR = (*hspi->pTxBuffPtr); + 5424 .loc 1 3880 1 is_stmt 1 view -0 + 5425 .cfi_startproc + 5426 @ args = 0, pretend = 0, frame = 0 + 5427 @ frame_needed = 0, uses_anonymous_args = 0 +3880:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** *(__IO uint8_t *)&hspi->Instance->DR = (*hspi->pTxBuffPtr); + 5428 .loc 1 3880 1 is_stmt 0 view .LVU1823 + 5429 0000 08B5 push {r3, lr} + 5430 .cfi_def_cfa_offset 8 + 5431 .cfi_offset 3, -8 + 5432 .cfi_offset 14, -4 +3881:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr++; + ARM GAS /tmp/ccywxtmH.s page 202 + + + 5433 .loc 1 3881 3 is_stmt 1 view .LVU1824 +3881:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr++; + 5434 .loc 1 3881 48 is_stmt 0 view .LVU1825 + 5435 0002 826B ldr r2, [r0, #56] +3881:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr++; + 5436 .loc 1 3881 25 view .LVU1826 + 5437 0004 0368 ldr r3, [r0] +3881:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr++; + 5438 .loc 1 3881 43 view .LVU1827 + 5439 0006 1278 ldrb r2, [r2] @ zero_extendqisi2 +3881:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr++; + 5440 .loc 1 3881 40 view .LVU1828 + 5441 0008 1A73 strb r2, [r3, #12] +3882:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; + 5442 .loc 1 3882 3 is_stmt 1 view .LVU1829 +3882:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; + 5443 .loc 1 3882 7 is_stmt 0 view .LVU1830 + 5444 000a 836B ldr r3, [r0, #56] +3882:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; + 5445 .loc 1 3882 19 view .LVU1831 + 5446 000c 0133 adds r3, r3, #1 + 5447 000e 8363 str r3, [r0, #56] +3883:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5448 .loc 1 3883 3 is_stmt 1 view .LVU1832 +3883:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5449 .loc 1 3883 7 is_stmt 0 view .LVU1833 + 5450 0010 C38F ldrh r3, [r0, #62] + 5451 0012 9BB2 uxth r3, r3 +3883:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5452 .loc 1 3883 20 view .LVU1834 + 5453 0014 013B subs r3, r3, #1 + 5454 0016 9BB2 uxth r3, r3 + 5455 0018 C387 strh r3, [r0, #62] @ movhi +3885:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5456 .loc 1 3885 3 is_stmt 1 view .LVU1835 +3885:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5457 .loc 1 3885 11 is_stmt 0 view .LVU1836 + 5458 001a C38F ldrh r3, [r0, #62] + 5459 001c 9BB2 uxth r3, r3 +3885:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5460 .loc 1 3885 6 view .LVU1837 + 5461 001e 03B1 cbz r3, .L382 + 5462 .LVL344: + 5463 .L379: +3896:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5464 .loc 1 3896 1 view .LVU1838 + 5465 0020 08BD pop {r3, pc} + 5466 .LVL345: + 5467 .L382: +3894:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 5468 .loc 1 3894 5 is_stmt 1 view .LVU1839 + 5469 0022 FFF7FEFF bl SPI_CloseTx_ISR + 5470 .LVL346: +3896:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5471 .loc 1 3896 1 is_stmt 0 view .LVU1840 + 5472 0026 FBE7 b .L379 + 5473 .cfi_endproc + ARM GAS /tmp/ccywxtmH.s page 203 + + + 5474 .LFE175: + 5476 .section .text.SPI_TxISR_16BIT,"ax",%progbits + 5477 .align 1 + 5478 .syntax unified + 5479 .thumb + 5480 .thumb_func + 5482 SPI_TxISR_16BIT: + 5483 .LVL347: + 5484 .LFB176: +3905:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Transmit data in 16 Bit mode */ + 5485 .loc 1 3905 1 is_stmt 1 view -0 + 5486 .cfi_startproc + 5487 @ args = 0, pretend = 0, frame = 0 + 5488 @ frame_needed = 0, uses_anonymous_args = 0 +3905:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Transmit data in 16 Bit mode */ + 5489 .loc 1 3905 1 is_stmt 0 view .LVU1842 + 5490 0000 08B5 push {r3, lr} + 5491 .cfi_def_cfa_offset 8 + 5492 .cfi_offset 3, -8 + 5493 .cfi_offset 14, -4 +3907:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 5494 .loc 1 3907 3 is_stmt 1 view .LVU1843 +3907:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 5495 .loc 1 3907 42 is_stmt 0 view .LVU1844 + 5496 0002 826B ldr r2, [r0, #56] +3907:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 5497 .loc 1 3907 7 view .LVU1845 + 5498 0004 0368 ldr r3, [r0] +3907:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 5499 .loc 1 3907 24 view .LVU1846 + 5500 0006 1288 ldrh r2, [r2] +3907:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 5501 .loc 1 3907 22 view .LVU1847 + 5502 0008 DA60 str r2, [r3, #12] +3908:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; + 5503 .loc 1 3908 3 is_stmt 1 view .LVU1848 +3908:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; + 5504 .loc 1 3908 7 is_stmt 0 view .LVU1849 + 5505 000a 836B ldr r3, [r0, #56] +3908:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; + 5506 .loc 1 3908 20 view .LVU1850 + 5507 000c 0233 adds r3, r3, #2 + 5508 000e 8363 str r3, [r0, #56] +3909:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5509 .loc 1 3909 3 is_stmt 1 view .LVU1851 +3909:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5510 .loc 1 3909 7 is_stmt 0 view .LVU1852 + 5511 0010 C38F ldrh r3, [r0, #62] + 5512 0012 9BB2 uxth r3, r3 +3909:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5513 .loc 1 3909 20 view .LVU1853 + 5514 0014 013B subs r3, r3, #1 + 5515 0016 9BB2 uxth r3, r3 + 5516 0018 C387 strh r3, [r0, #62] @ movhi +3911:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5517 .loc 1 3911 3 is_stmt 1 view .LVU1854 +3911:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + ARM GAS /tmp/ccywxtmH.s page 204 + + + 5518 .loc 1 3911 11 is_stmt 0 view .LVU1855 + 5519 001a C38F ldrh r3, [r0, #62] + 5520 001c 9BB2 uxth r3, r3 +3911:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5521 .loc 1 3911 6 view .LVU1856 + 5522 001e 03B1 cbz r3, .L386 + 5523 .LVL348: + 5524 .L383: +3922:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5525 .loc 1 3922 1 view .LVU1857 + 5526 0020 08BD pop {r3, pc} + 5527 .LVL349: + 5528 .L386: +3920:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 5529 .loc 1 3920 5 is_stmt 1 view .LVU1858 + 5530 0022 FFF7FEFF bl SPI_CloseTx_ISR + 5531 .LVL350: +3922:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5532 .loc 1 3922 1 is_stmt 0 view .LVU1859 + 5533 0026 FBE7 b .L383 + 5534 .cfi_endproc + 5535 .LFE176: + 5537 .section .text.SPI_CloseRx_ISR,"ax",%progbits + 5538 .align 1 + 5539 .syntax unified + 5540 .thumb + 5541 .thumb_func + 5543 SPI_CloseRx_ISR: + 5544 .LVL351: + 5545 .LFB182: +4229:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable RXNE and ERR interrupt */ + 5546 .loc 1 4229 1 is_stmt 1 view -0 + 5547 .cfi_startproc + 5548 @ args = 0, pretend = 0, frame = 0 + 5549 @ frame_needed = 0, uses_anonymous_args = 0 +4229:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable RXNE and ERR interrupt */ + 5550 .loc 1 4229 1 is_stmt 0 view .LVU1861 + 5551 0000 10B5 push {r4, lr} + 5552 .cfi_def_cfa_offset 8 + 5553 .cfi_offset 4, -8 + 5554 .cfi_offset 14, -4 + 5555 0002 0446 mov r4, r0 +4231:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5556 .loc 1 4231 3 is_stmt 1 view .LVU1862 + 5557 0004 0268 ldr r2, [r0] + 5558 0006 5368 ldr r3, [r2, #4] + 5559 0008 23F06003 bic r3, r3, #96 + 5560 000c 5360 str r3, [r2, #4] +4234:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5561 .loc 1 4234 3 view .LVU1863 +4234:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5562 .loc 1 4234 7 is_stmt 0 view .LVU1864 + 5563 000e FFF7FEFF bl HAL_GetTick + 5564 .LVL352: +4234:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5565 .loc 1 4234 7 view .LVU1865 + 5566 0012 0246 mov r2, r0 + ARM GAS /tmp/ccywxtmH.s page 205 + + + 5567 0014 6421 movs r1, #100 + 5568 0016 2046 mov r0, r4 + 5569 0018 FFF7FEFF bl SPI_EndRxTransaction + 5570 .LVL353: +4234:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5571 .loc 1 4234 6 view .LVU1866 + 5572 001c 18B1 cbz r0, .L388 +4236:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 5573 .loc 1 4236 5 is_stmt 1 view .LVU1867 + 5574 001e 236E ldr r3, [r4, #96] + 5575 0020 43F02003 orr r3, r3, #32 + 5576 0024 2366 str r3, [r4, #96] + 5577 .L388: +4238:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5578 .loc 1 4238 3 view .LVU1868 +4238:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5579 .loc 1 4238 15 is_stmt 0 view .LVU1869 + 5580 0026 0123 movs r3, #1 + 5581 0028 84F85D30 strb r3, [r4, #93] +4256:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5582 .loc 1 4256 5 is_stmt 1 view .LVU1870 +4256:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5583 .loc 1 4256 13 is_stmt 0 view .LVU1871 + 5584 002c 236E ldr r3, [r4, #96] +4256:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5585 .loc 1 4256 8 view .LVU1872 + 5586 002e 1BB9 cbnz r3, .L389 +4262:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + 5587 .loc 1 4262 7 is_stmt 1 view .LVU1873 + 5588 0030 2046 mov r0, r4 + 5589 0032 FFF7FEFF bl HAL_SPI_RxCpltCallback + 5590 .LVL354: + 5591 .L387: +4277:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5592 .loc 1 4277 1 is_stmt 0 view .LVU1874 + 5593 0036 10BD pop {r4, pc} + 5594 .LVL355: + 5595 .L389: +4271:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + 5596 .loc 1 4271 7 is_stmt 1 view .LVU1875 + 5597 0038 2046 mov r0, r4 + 5598 003a FFF7FEFF bl HAL_SPI_ErrorCallback + 5599 .LVL356: +4277:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5600 .loc 1 4277 1 is_stmt 0 view .LVU1876 + 5601 003e FAE7 b .L387 + 5602 .cfi_endproc + 5603 .LFE182: + 5605 .section .text.SPI_RxISR_8BIT,"ax",%progbits + 5606 .align 1 + 5607 .syntax unified + 5608 .thumb + 5609 .thumb_func + 5611 SPI_RxISR_8BIT: + 5612 .LVL357: + 5613 .LFB173: +3791:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** *hspi->pRxBuffPtr = (*(__IO uint8_t *)&hspi->Instance->DR); + ARM GAS /tmp/ccywxtmH.s page 206 + + + 5614 .loc 1 3791 1 is_stmt 1 view -0 + 5615 .cfi_startproc + 5616 @ args = 0, pretend = 0, frame = 0 + 5617 @ frame_needed = 0, uses_anonymous_args = 0 +3791:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** *hspi->pRxBuffPtr = (*(__IO uint8_t *)&hspi->Instance->DR); + 5618 .loc 1 3791 1 is_stmt 0 view .LVU1878 + 5619 0000 08B5 push {r3, lr} + 5620 .cfi_def_cfa_offset 8 + 5621 .cfi_offset 3, -8 + 5622 .cfi_offset 14, -4 +3792:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr++; + 5623 .loc 1 3792 3 is_stmt 1 view .LVU1879 +3792:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr++; + 5624 .loc 1 3792 46 is_stmt 0 view .LVU1880 + 5625 0002 0268 ldr r2, [r0] +3792:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr++; + 5626 .loc 1 3792 8 view .LVU1881 + 5627 0004 036C ldr r3, [r0, #64] +3792:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr++; + 5628 .loc 1 3792 24 view .LVU1882 + 5629 0006 127B ldrb r2, [r2, #12] @ zero_extendqisi2 +3792:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr++; + 5630 .loc 1 3792 21 view .LVU1883 + 5631 0008 1A70 strb r2, [r3] +3793:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount--; + 5632 .loc 1 3793 3 is_stmt 1 view .LVU1884 +3793:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount--; + 5633 .loc 1 3793 7 is_stmt 0 view .LVU1885 + 5634 000a 036C ldr r3, [r0, #64] +3793:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount--; + 5635 .loc 1 3793 19 view .LVU1886 + 5636 000c 0133 adds r3, r3, #1 + 5637 000e 0364 str r3, [r0, #64] +3794:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5638 .loc 1 3794 3 is_stmt 1 view .LVU1887 +3794:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5639 .loc 1 3794 7 is_stmt 0 view .LVU1888 + 5640 0010 B0F84630 ldrh r3, [r0, #70] + 5641 0014 9BB2 uxth r3, r3 +3794:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5642 .loc 1 3794 20 view .LVU1889 + 5643 0016 013B subs r3, r3, #1 + 5644 0018 9BB2 uxth r3, r3 + 5645 001a A0F84630 strh r3, [r0, #70] @ movhi +3804:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5646 .loc 1 3804 3 is_stmt 1 view .LVU1890 +3804:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5647 .loc 1 3804 11 is_stmt 0 view .LVU1891 + 5648 001e B0F84630 ldrh r3, [r0, #70] + 5649 0022 9BB2 uxth r3, r3 +3804:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5650 .loc 1 3804 6 view .LVU1892 + 5651 0024 03B1 cbz r3, .L395 + 5652 .LVL358: + 5653 .L392: +3815:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5654 .loc 1 3815 1 view .LVU1893 + ARM GAS /tmp/ccywxtmH.s page 207 + + + 5655 0026 08BD pop {r3, pc} + 5656 .LVL359: + 5657 .L395: +3813:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 5658 .loc 1 3813 5 is_stmt 1 view .LVU1894 + 5659 0028 FFF7FEFF bl SPI_CloseRx_ISR + 5660 .LVL360: +3815:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5661 .loc 1 3815 1 is_stmt 0 view .LVU1895 + 5662 002c FBE7 b .L392 + 5663 .cfi_endproc + 5664 .LFE173: + 5666 .section .text.SPI_RxISR_16BIT,"ax",%progbits + 5667 .align 1 + 5668 .syntax unified + 5669 .thumb + 5670 .thumb_func + 5672 SPI_RxISR_16BIT: + 5673 .LVL361: + 5674 .LFB174: +3847:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)(hspi->Instance->DR); + 5675 .loc 1 3847 1 is_stmt 1 view -0 + 5676 .cfi_startproc + 5677 @ args = 0, pretend = 0, frame = 0 + 5678 @ frame_needed = 0, uses_anonymous_args = 0 +3847:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** *((uint16_t *)hspi->pRxBuffPtr) = (uint16_t)(hspi->Instance->DR); + 5679 .loc 1 3847 1 is_stmt 0 view .LVU1897 + 5680 0000 08B5 push {r3, lr} + 5681 .cfi_def_cfa_offset 8 + 5682 .cfi_offset 3, -8 + 5683 .cfi_offset 14, -4 +3848:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr += sizeof(uint16_t); + 5684 .loc 1 3848 3 is_stmt 1 view .LVU1898 +3848:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr += sizeof(uint16_t); + 5685 .loc 1 3848 52 is_stmt 0 view .LVU1899 + 5686 0002 0368 ldr r3, [r0] +3848:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr += sizeof(uint16_t); + 5687 .loc 1 3848 62 view .LVU1900 + 5688 0004 DA68 ldr r2, [r3, #12] +3848:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr += sizeof(uint16_t); + 5689 .loc 1 3848 21 view .LVU1901 + 5690 0006 036C ldr r3, [r0, #64] +3848:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr += sizeof(uint16_t); + 5691 .loc 1 3848 35 view .LVU1902 + 5692 0008 1A80 strh r2, [r3] @ movhi +3849:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount--; + 5693 .loc 1 3849 3 is_stmt 1 view .LVU1903 +3849:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount--; + 5694 .loc 1 3849 7 is_stmt 0 view .LVU1904 + 5695 000a 036C ldr r3, [r0, #64] +3849:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount--; + 5696 .loc 1 3849 20 view .LVU1905 + 5697 000c 0233 adds r3, r3, #2 + 5698 000e 0364 str r3, [r0, #64] +3850:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5699 .loc 1 3850 3 is_stmt 1 view .LVU1906 +3850:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + ARM GAS /tmp/ccywxtmH.s page 208 + + + 5700 .loc 1 3850 7 is_stmt 0 view .LVU1907 + 5701 0010 B0F84630 ldrh r3, [r0, #70] + 5702 0014 9BB2 uxth r3, r3 +3850:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5703 .loc 1 3850 20 view .LVU1908 + 5704 0016 013B subs r3, r3, #1 + 5705 0018 9BB2 uxth r3, r3 + 5706 001a A0F84630 strh r3, [r0, #70] @ movhi +3860:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5707 .loc 1 3860 3 is_stmt 1 view .LVU1909 +3860:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5708 .loc 1 3860 11 is_stmt 0 view .LVU1910 + 5709 001e B0F84630 ldrh r3, [r0, #70] + 5710 0022 9BB2 uxth r3, r3 +3860:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5711 .loc 1 3860 6 view .LVU1911 + 5712 0024 03B1 cbz r3, .L399 + 5713 .LVL362: + 5714 .L396: +3871:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5715 .loc 1 3871 1 view .LVU1912 + 5716 0026 08BD pop {r3, pc} + 5717 .LVL363: + 5718 .L399: +3869:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 5719 .loc 1 3869 5 is_stmt 1 view .LVU1913 + 5720 0028 FFF7FEFF bl SPI_CloseRx_ISR + 5721 .LVL364: +3871:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5722 .loc 1 3871 1 is_stmt 0 view .LVU1914 + 5723 002c FBE7 b .L396 + 5724 .cfi_endproc + 5725 .LFE174: + 5727 .section .text.SPI_CloseRxTx_ISR,"ax",%progbits + 5728 .align 1 + 5729 .syntax unified + 5730 .thumb + 5731 .thumb_func + 5733 SPI_CloseRxTx_ISR: + 5734 .LVL365: + 5735 .LFB181: +4152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t tickstart; + 5736 .loc 1 4152 1 is_stmt 1 view -0 + 5737 .cfi_startproc + 5738 @ args = 0, pretend = 0, frame = 0 + 5739 @ frame_needed = 0, uses_anonymous_args = 0 +4152:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t tickstart; + 5740 .loc 1 4152 1 is_stmt 0 view .LVU1916 + 5741 0000 10B5 push {r4, lr} + 5742 .cfi_def_cfa_offset 8 + 5743 .cfi_offset 4, -8 + 5744 .cfi_offset 14, -4 + 5745 0002 0446 mov r4, r0 +4153:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5746 .loc 1 4153 3 is_stmt 1 view .LVU1917 +4156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5747 .loc 1 4156 3 view .LVU1918 + ARM GAS /tmp/ccywxtmH.s page 209 + + +4156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5748 .loc 1 4156 15 is_stmt 0 view .LVU1919 + 5749 0004 FFF7FEFF bl HAL_GetTick + 5750 .LVL366: +4156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5751 .loc 1 4156 15 view .LVU1920 + 5752 0008 0246 mov r2, r0 + 5753 .LVL367: +4159:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5754 .loc 1 4159 3 is_stmt 1 view .LVU1921 + 5755 000a 2168 ldr r1, [r4] + 5756 000c 4B68 ldr r3, [r1, #4] + 5757 000e 23F02003 bic r3, r3, #32 + 5758 0012 4B60 str r3, [r1, #4] +4162:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5759 .loc 1 4162 3 view .LVU1922 +4162:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5760 .loc 1 4162 7 is_stmt 0 view .LVU1923 + 5761 0014 6421 movs r1, #100 + 5762 0016 2046 mov r0, r4 + 5763 .LVL368: +4162:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5764 .loc 1 4162 7 view .LVU1924 + 5765 0018 FFF7FEFF bl SPI_EndRxTxTransaction + 5766 .LVL369: +4162:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5767 .loc 1 4162 6 view .LVU1925 + 5768 001c 18B1 cbz r0, .L401 +4164:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 5769 .loc 1 4164 5 is_stmt 1 view .LVU1926 + 5770 001e 236E ldr r3, [r4, #96] + 5771 0020 43F02003 orr r3, r3, #32 + 5772 0024 2366 str r3, [r4, #96] + 5773 .L401: +4184:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5774 .loc 1 4184 5 view .LVU1927 +4184:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5775 .loc 1 4184 13 is_stmt 0 view .LVU1928 + 5776 0026 236E ldr r3, [r4, #96] +4184:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5777 .loc 1 4184 8 view .LVU1929 + 5778 0028 93B9 cbnz r3, .L402 +4186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5779 .loc 1 4186 7 is_stmt 1 view .LVU1930 +4186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5780 .loc 1 4186 15 is_stmt 0 view .LVU1931 + 5781 002a 94F85D30 ldrb r3, [r4, #93] @ zero_extendqisi2 + 5782 002e DBB2 uxtb r3, r3 +4186:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5783 .loc 1 4186 10 view .LVU1932 + 5784 0030 042B cmp r3, #4 + 5785 0032 06D0 beq .L406 +4198:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Call user TxRx complete callback */ + 5786 .loc 1 4198 9 is_stmt 1 view .LVU1933 +4198:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Call user TxRx complete callback */ + 5787 .loc 1 4198 21 is_stmt 0 view .LVU1934 + 5788 0034 0123 movs r3, #1 + ARM GAS /tmp/ccywxtmH.s page 210 + + + 5789 0036 84F85D30 strb r3, [r4, #93] +4203:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + 5790 .loc 1 4203 9 is_stmt 1 view .LVU1935 + 5791 003a 2046 mov r0, r4 + 5792 003c FFF7FEFF bl HAL_SPI_TxRxCpltCallback + 5793 .LVL370: + 5794 .L400: +4220:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5795 .loc 1 4220 1 is_stmt 0 view .LVU1936 + 5796 0040 10BD pop {r4, pc} + 5797 .LVL371: + 5798 .L406: +4188:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Call user Rx complete callback */ + 5799 .loc 1 4188 9 is_stmt 1 view .LVU1937 +4188:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Call user Rx complete callback */ + 5800 .loc 1 4188 21 is_stmt 0 view .LVU1938 + 5801 0042 0123 movs r3, #1 + 5802 0044 84F85D30 strb r3, [r4, #93] +4193:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + 5803 .loc 1 4193 9 is_stmt 1 view .LVU1939 + 5804 0048 2046 mov r0, r4 + 5805 004a FFF7FEFF bl HAL_SPI_RxCpltCallback + 5806 .LVL372: + 5807 004e F7E7 b .L400 + 5808 .L402: +4209:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Call user error callback */ + 5809 .loc 1 4209 7 view .LVU1940 +4209:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Call user error callback */ + 5810 .loc 1 4209 19 is_stmt 0 view .LVU1941 + 5811 0050 0123 movs r3, #1 + 5812 0052 84F85D30 strb r3, [r4, #93] +4214:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + 5813 .loc 1 4214 7 is_stmt 1 view .LVU1942 + 5814 0056 2046 mov r0, r4 + 5815 0058 FFF7FEFF bl HAL_SPI_ErrorCallback + 5816 .LVL373: +4220:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5817 .loc 1 4220 1 is_stmt 0 view .LVU1943 + 5818 005c F0E7 b .L400 + 5819 .cfi_endproc + 5820 .LFE181: + 5822 .section .text.SPI_2linesTxISR_8BIT,"ax",%progbits + 5823 .align 1 + 5824 .syntax unified + 5825 .thumb + 5826 .thumb_func + 5828 SPI_2linesTxISR_8BIT: + 5829 .LVL374: + 5830 .LFB170: +3623:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Transmit data in packing Bit mode */ + 5831 .loc 1 3623 1 is_stmt 1 view -0 + 5832 .cfi_startproc + 5833 @ args = 0, pretend = 0, frame = 0 + 5834 @ frame_needed = 0, uses_anonymous_args = 0 +3623:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Transmit data in packing Bit mode */ + 5835 .loc 1 3623 1 is_stmt 0 view .LVU1945 + 5836 0000 08B5 push {r3, lr} + ARM GAS /tmp/ccywxtmH.s page 211 + + + 5837 .cfi_def_cfa_offset 8 + 5838 .cfi_offset 3, -8 + 5839 .cfi_offset 14, -4 +3625:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5840 .loc 1 3625 3 is_stmt 1 view .LVU1946 +3625:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5841 .loc 1 3625 11 is_stmt 0 view .LVU1947 + 5842 0002 C38F ldrh r3, [r0, #62] + 5843 0004 9BB2 uxth r3, r3 +3625:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5844 .loc 1 3625 6 view .LVU1948 + 5845 0006 012B cmp r3, #1 + 5846 0008 18D9 bls .L408 +3627:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 5847 .loc 1 3627 5 is_stmt 1 view .LVU1949 +3627:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 5848 .loc 1 3627 44 is_stmt 0 view .LVU1950 + 5849 000a 826B ldr r2, [r0, #56] +3627:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 5850 .loc 1 3627 9 view .LVU1951 + 5851 000c 0368 ldr r3, [r0] +3627:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 5852 .loc 1 3627 26 view .LVU1952 + 5853 000e 1288 ldrh r2, [r2] +3627:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 5854 .loc 1 3627 24 view .LVU1953 + 5855 0010 DA60 str r2, [r3, #12] +3628:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount -= 2U; + 5856 .loc 1 3628 5 is_stmt 1 view .LVU1954 +3628:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount -= 2U; + 5857 .loc 1 3628 9 is_stmt 0 view .LVU1955 + 5858 0012 836B ldr r3, [r0, #56] +3628:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount -= 2U; + 5859 .loc 1 3628 22 view .LVU1956 + 5860 0014 0233 adds r3, r3, #2 + 5861 0016 8363 str r3, [r0, #56] +3629:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 5862 .loc 1 3629 5 is_stmt 1 view .LVU1957 +3629:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 5863 .loc 1 3629 9 is_stmt 0 view .LVU1958 + 5864 0018 C38F ldrh r3, [r0, #62] + 5865 001a 9BB2 uxth r3, r3 +3629:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 5866 .loc 1 3629 23 view .LVU1959 + 5867 001c 023B subs r3, r3, #2 + 5868 001e 9BB2 uxth r3, r3 + 5869 0020 C387 strh r3, [r0, #62] @ movhi + 5870 .L409: +3640:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5871 .loc 1 3640 3 is_stmt 1 view .LVU1960 +3640:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5872 .loc 1 3640 11 is_stmt 0 view .LVU1961 + 5873 0022 C38F ldrh r3, [r0, #62] + 5874 0024 9BB2 uxth r3, r3 +3640:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5875 .loc 1 3640 6 view .LVU1962 + 5876 0026 43B9 cbnz r3, .L407 + ARM GAS /tmp/ccywxtmH.s page 212 + + +3654:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5877 .loc 1 3654 5 is_stmt 1 view .LVU1963 + 5878 0028 0268 ldr r2, [r0] + 5879 002a 5368 ldr r3, [r2, #4] + 5880 002c 23F08003 bic r3, r3, #128 + 5881 0030 5360 str r3, [r2, #4] +3656:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5882 .loc 1 3656 5 view .LVU1964 +3656:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5883 .loc 1 3656 13 is_stmt 0 view .LVU1965 + 5884 0032 B0F84630 ldrh r3, [r0, #70] + 5885 0036 9BB2 uxth r3, r3 +3656:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5886 .loc 1 3656 8 view .LVU1966 + 5887 0038 6BB1 cbz r3, .L412 + 5888 .LVL375: + 5889 .L407: +3661:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5890 .loc 1 3661 1 view .LVU1967 + 5891 003a 08BD pop {r3, pc} + 5892 .LVL376: + 5893 .L408: +3634:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr++; + 5894 .loc 1 3634 5 is_stmt 1 view .LVU1968 +3634:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr++; + 5895 .loc 1 3634 50 is_stmt 0 view .LVU1969 + 5896 003c 826B ldr r2, [r0, #56] +3634:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr++; + 5897 .loc 1 3634 27 view .LVU1970 + 5898 003e 0368 ldr r3, [r0] +3634:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr++; + 5899 .loc 1 3634 45 view .LVU1971 + 5900 0040 1278 ldrb r2, [r2] @ zero_extendqisi2 +3634:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr++; + 5901 .loc 1 3634 42 view .LVU1972 + 5902 0042 1A73 strb r2, [r3, #12] +3635:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; + 5903 .loc 1 3635 5 is_stmt 1 view .LVU1973 +3635:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; + 5904 .loc 1 3635 9 is_stmt 0 view .LVU1974 + 5905 0044 836B ldr r3, [r0, #56] +3635:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; + 5906 .loc 1 3635 21 view .LVU1975 + 5907 0046 0133 adds r3, r3, #1 + 5908 0048 8363 str r3, [r0, #56] +3636:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 5909 .loc 1 3636 5 is_stmt 1 view .LVU1976 +3636:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 5910 .loc 1 3636 9 is_stmt 0 view .LVU1977 + 5911 004a C38F ldrh r3, [r0, #62] + 5912 004c 9BB2 uxth r3, r3 +3636:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 5913 .loc 1 3636 22 view .LVU1978 + 5914 004e 013B subs r3, r3, #1 + 5915 0050 9BB2 uxth r3, r3 + 5916 0052 C387 strh r3, [r0, #62] @ movhi + 5917 0054 E5E7 b .L409 + ARM GAS /tmp/ccywxtmH.s page 213 + + + 5918 .L412: +3658:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 5919 .loc 1 3658 7 is_stmt 1 view .LVU1979 + 5920 0056 FFF7FEFF bl SPI_CloseRxTx_ISR + 5921 .LVL377: +3661:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 5922 .loc 1 3661 1 is_stmt 0 view .LVU1980 + 5923 005a EEE7 b .L407 + 5924 .cfi_endproc + 5925 .LFE170: + 5927 .section .text.SPI_2linesRxISR_8BIT,"ax",%progbits + 5928 .align 1 + 5929 .syntax unified + 5930 .thumb + 5931 .thumb_func + 5933 SPI_2linesRxISR_8BIT: + 5934 .LVL378: + 5935 .LFB169: +3538:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Receive data in packing mode */ + 5936 .loc 1 3538 1 is_stmt 1 view -0 + 5937 .cfi_startproc + 5938 @ args = 0, pretend = 0, frame = 0 + 5939 @ frame_needed = 0, uses_anonymous_args = 0 +3538:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Receive data in packing mode */ + 5940 .loc 1 3538 1 is_stmt 0 view .LVU1982 + 5941 0000 08B5 push {r3, lr} + 5942 .cfi_def_cfa_offset 8 + 5943 .cfi_offset 3, -8 + 5944 .cfi_offset 14, -4 +3540:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5945 .loc 1 3540 3 is_stmt 1 view .LVU1983 +3540:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5946 .loc 1 3540 11 is_stmt 0 view .LVU1984 + 5947 0002 B0F84630 ldrh r3, [r0, #70] + 5948 0006 9BB2 uxth r3, r3 +3540:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5949 .loc 1 3540 6 view .LVU1985 + 5950 0008 012B cmp r3, #1 + 5951 000a 18D9 bls .L414 +3542:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr += sizeof(uint16_t); + 5952 .loc 1 3542 5 is_stmt 1 view .LVU1986 +3542:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr += sizeof(uint16_t); + 5953 .loc 1 3542 54 is_stmt 0 view .LVU1987 + 5954 000c 0368 ldr r3, [r0] +3542:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr += sizeof(uint16_t); + 5955 .loc 1 3542 64 view .LVU1988 + 5956 000e DA68 ldr r2, [r3, #12] +3542:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr += sizeof(uint16_t); + 5957 .loc 1 3542 23 view .LVU1989 + 5958 0010 036C ldr r3, [r0, #64] +3542:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr += sizeof(uint16_t); + 5959 .loc 1 3542 37 view .LVU1990 + 5960 0012 1A80 strh r2, [r3] @ movhi +3543:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount -= 2U; + 5961 .loc 1 3543 5 is_stmt 1 view .LVU1991 +3543:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount -= 2U; + 5962 .loc 1 3543 9 is_stmt 0 view .LVU1992 + ARM GAS /tmp/ccywxtmH.s page 214 + + + 5963 0014 036C ldr r3, [r0, #64] +3543:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount -= 2U; + 5964 .loc 1 3543 22 view .LVU1993 + 5965 0016 0233 adds r3, r3, #2 + 5966 0018 0364 str r3, [r0, #64] +3544:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->RxXferCount == 1U) + 5967 .loc 1 3544 5 is_stmt 1 view .LVU1994 +3544:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->RxXferCount == 1U) + 5968 .loc 1 3544 9 is_stmt 0 view .LVU1995 + 5969 001a B0F84630 ldrh r3, [r0, #70] + 5970 001e 9BB2 uxth r3, r3 +3544:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (hspi->RxXferCount == 1U) + 5971 .loc 1 3544 23 view .LVU1996 + 5972 0020 023B subs r3, r3, #2 + 5973 0022 9BB2 uxth r3, r3 + 5974 0024 A0F84630 strh r3, [r0, #70] @ movhi +3545:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5975 .loc 1 3545 5 is_stmt 1 view .LVU1997 +3545:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5976 .loc 1 3545 13 is_stmt 0 view .LVU1998 + 5977 0028 B0F84630 ldrh r3, [r0, #70] + 5978 002c 9BB2 uxth r3, r3 +3545:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 5979 .loc 1 3545 8 view .LVU1999 + 5980 002e 012B cmp r3, #1 + 5981 0030 13D1 bne .L415 +3548:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 5982 .loc 1 3548 7 is_stmt 1 view .LVU2000 + 5983 0032 0268 ldr r2, [r0] + 5984 0034 5368 ldr r3, [r2, #4] + 5985 0036 43F48053 orr r3, r3, #4096 + 5986 003a 5360 str r3, [r2, #4] + 5987 003c 0DE0 b .L415 + 5988 .L414: +3554:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr++; + 5989 .loc 1 3554 5 view .LVU2001 +3554:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr++; + 5990 .loc 1 3554 48 is_stmt 0 view .LVU2002 + 5991 003e 0268 ldr r2, [r0] +3554:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr++; + 5992 .loc 1 3554 10 view .LVU2003 + 5993 0040 036C ldr r3, [r0, #64] +3554:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr++; + 5994 .loc 1 3554 25 view .LVU2004 + 5995 0042 127B ldrb r2, [r2, #12] @ zero_extendqisi2 +3554:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr++; + 5996 .loc 1 3554 23 view .LVU2005 + 5997 0044 1A70 strb r2, [r3] +3555:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount--; + 5998 .loc 1 3555 5 is_stmt 1 view .LVU2006 +3555:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount--; + 5999 .loc 1 3555 9 is_stmt 0 view .LVU2007 + 6000 0046 036C ldr r3, [r0, #64] +3555:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount--; + 6001 .loc 1 3555 21 view .LVU2008 + 6002 0048 0133 adds r3, r3, #1 + 6003 004a 0364 str r3, [r0, #64] + ARM GAS /tmp/ccywxtmH.s page 215 + + +3556:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6004 .loc 1 3556 5 is_stmt 1 view .LVU2009 +3556:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6005 .loc 1 3556 9 is_stmt 0 view .LVU2010 + 6006 004c B0F84630 ldrh r3, [r0, #70] + 6007 0050 9BB2 uxth r3, r3 +3556:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6008 .loc 1 3556 22 view .LVU2011 + 6009 0052 013B subs r3, r3, #1 + 6010 0054 9BB2 uxth r3, r3 + 6011 0056 A0F84630 strh r3, [r0, #70] @ movhi + 6012 .L415: +3560:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6013 .loc 1 3560 3 is_stmt 1 view .LVU2012 +3560:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6014 .loc 1 3560 11 is_stmt 0 view .LVU2013 + 6015 005a B0F84630 ldrh r3, [r0, #70] + 6016 005e 9BB2 uxth r3, r3 +3560:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6017 .loc 1 3560 6 view .LVU2014 + 6018 0060 3BB9 cbnz r3, .L413 +3572:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6019 .loc 1 3572 5 is_stmt 1 view .LVU2015 + 6020 0062 0268 ldr r2, [r0] + 6021 0064 5368 ldr r3, [r2, #4] + 6022 0066 23F06003 bic r3, r3, #96 + 6023 006a 5360 str r3, [r2, #4] +3574:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6024 .loc 1 3574 5 view .LVU2016 +3574:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6025 .loc 1 3574 13 is_stmt 0 view .LVU2017 + 6026 006c C38F ldrh r3, [r0, #62] + 6027 006e 9BB2 uxth r3, r3 +3574:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6028 .loc 1 3574 8 view .LVU2018 + 6029 0070 03B1 cbz r3, .L418 + 6030 .LVL379: + 6031 .L413: +3579:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6032 .loc 1 3579 1 view .LVU2019 + 6033 0072 08BD pop {r3, pc} + 6034 .LVL380: + 6035 .L418: +3576:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6036 .loc 1 3576 7 is_stmt 1 view .LVU2020 + 6037 0074 FFF7FEFF bl SPI_CloseRxTx_ISR + 6038 .LVL381: +3579:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6039 .loc 1 3579 1 is_stmt 0 view .LVU2021 + 6040 0078 FBE7 b .L413 + 6041 .cfi_endproc + 6042 .LFE169: + 6044 .section .text.SPI_2linesTxISR_16BIT,"ax",%progbits + 6045 .align 1 + 6046 .syntax unified + 6047 .thumb + 6048 .thumb_func + ARM GAS /tmp/ccywxtmH.s page 216 + + + 6050 SPI_2linesTxISR_16BIT: + 6051 .LVL382: + 6052 .LFB172: +3726:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Transmit data in 16 Bit mode */ + 6053 .loc 1 3726 1 is_stmt 1 view -0 + 6054 .cfi_startproc + 6055 @ args = 0, pretend = 0, frame = 0 + 6056 @ frame_needed = 0, uses_anonymous_args = 0 +3726:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Transmit data in 16 Bit mode */ + 6057 .loc 1 3726 1 is_stmt 0 view .LVU2023 + 6058 0000 08B5 push {r3, lr} + 6059 .cfi_def_cfa_offset 8 + 6060 .cfi_offset 3, -8 + 6061 .cfi_offset 14, -4 +3728:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 6062 .loc 1 3728 3 is_stmt 1 view .LVU2024 +3728:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 6063 .loc 1 3728 42 is_stmt 0 view .LVU2025 + 6064 0002 826B ldr r2, [r0, #56] +3728:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 6065 .loc 1 3728 7 view .LVU2026 + 6066 0004 0368 ldr r3, [r0] +3728:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 6067 .loc 1 3728 24 view .LVU2027 + 6068 0006 1288 ldrh r2, [r2] +3728:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pTxBuffPtr += sizeof(uint16_t); + 6069 .loc 1 3728 22 view .LVU2028 + 6070 0008 DA60 str r2, [r3, #12] +3729:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; + 6071 .loc 1 3729 3 is_stmt 1 view .LVU2029 +3729:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; + 6072 .loc 1 3729 7 is_stmt 0 view .LVU2030 + 6073 000a 836B ldr r3, [r0, #56] +3729:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount--; + 6074 .loc 1 3729 20 view .LVU2031 + 6075 000c 0233 adds r3, r3, #2 + 6076 000e 8363 str r3, [r0, #56] +3730:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6077 .loc 1 3730 3 is_stmt 1 view .LVU2032 +3730:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6078 .loc 1 3730 7 is_stmt 0 view .LVU2033 + 6079 0010 C38F ldrh r3, [r0, #62] + 6080 0012 9BB2 uxth r3, r3 +3730:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6081 .loc 1 3730 20 view .LVU2034 + 6082 0014 013B subs r3, r3, #1 + 6083 0016 9BB2 uxth r3, r3 + 6084 0018 C387 strh r3, [r0, #62] @ movhi +3733:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6085 .loc 1 3733 3 is_stmt 1 view .LVU2035 +3733:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6086 .loc 1 3733 11 is_stmt 0 view .LVU2036 + 6087 001a C38F ldrh r3, [r0, #62] + 6088 001c 9BB2 uxth r3, r3 +3733:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6089 .loc 1 3733 6 view .LVU2037 + 6090 001e 43B9 cbnz r3, .L419 + ARM GAS /tmp/ccywxtmH.s page 217 + + +3747:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6091 .loc 1 3747 5 is_stmt 1 view .LVU2038 + 6092 0020 0268 ldr r2, [r0] + 6093 0022 5368 ldr r3, [r2, #4] + 6094 0024 23F08003 bic r3, r3, #128 + 6095 0028 5360 str r3, [r2, #4] +3749:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6096 .loc 1 3749 5 view .LVU2039 +3749:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6097 .loc 1 3749 13 is_stmt 0 view .LVU2040 + 6098 002a B0F84630 ldrh r3, [r0, #70] + 6099 002e 9BB2 uxth r3, r3 +3749:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6100 .loc 1 3749 8 view .LVU2041 + 6101 0030 03B1 cbz r3, .L422 + 6102 .LVL383: + 6103 .L419: +3754:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6104 .loc 1 3754 1 view .LVU2042 + 6105 0032 08BD pop {r3, pc} + 6106 .LVL384: + 6107 .L422: +3751:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6108 .loc 1 3751 7 is_stmt 1 view .LVU2043 + 6109 0034 FFF7FEFF bl SPI_CloseRxTx_ISR + 6110 .LVL385: +3754:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6111 .loc 1 3754 1 is_stmt 0 view .LVU2044 + 6112 0038 FBE7 b .L419 + 6113 .cfi_endproc + 6114 .LFE172: + 6116 .section .text.SPI_2linesRxISR_16BIT,"ax",%progbits + 6117 .align 1 + 6118 .syntax unified + 6119 .thumb + 6120 .thumb_func + 6122 SPI_2linesRxISR_16BIT: + 6123 .LVL386: + 6124 .LFB171: +3670:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Receive data in 16 Bit mode */ + 6125 .loc 1 3670 1 is_stmt 1 view -0 + 6126 .cfi_startproc + 6127 @ args = 0, pretend = 0, frame = 0 + 6128 @ frame_needed = 0, uses_anonymous_args = 0 +3670:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Receive data in 16 Bit mode */ + 6129 .loc 1 3670 1 is_stmt 0 view .LVU2046 + 6130 0000 08B5 push {r3, lr} + 6131 .cfi_def_cfa_offset 8 + 6132 .cfi_offset 3, -8 + 6133 .cfi_offset 14, -4 +3672:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr += sizeof(uint16_t); + 6134 .loc 1 3672 3 is_stmt 1 view .LVU2047 +3672:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr += sizeof(uint16_t); + 6135 .loc 1 3672 52 is_stmt 0 view .LVU2048 + 6136 0002 0368 ldr r3, [r0] +3672:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr += sizeof(uint16_t); + 6137 .loc 1 3672 62 view .LVU2049 + ARM GAS /tmp/ccywxtmH.s page 218 + + + 6138 0004 DA68 ldr r2, [r3, #12] +3672:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr += sizeof(uint16_t); + 6139 .loc 1 3672 21 view .LVU2050 + 6140 0006 036C ldr r3, [r0, #64] +3672:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->pRxBuffPtr += sizeof(uint16_t); + 6141 .loc 1 3672 35 view .LVU2051 + 6142 0008 1A80 strh r2, [r3] @ movhi +3673:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount--; + 6143 .loc 1 3673 3 is_stmt 1 view .LVU2052 +3673:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount--; + 6144 .loc 1 3673 7 is_stmt 0 view .LVU2053 + 6145 000a 036C ldr r3, [r0, #64] +3673:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount--; + 6146 .loc 1 3673 20 view .LVU2054 + 6147 000c 0233 adds r3, r3, #2 + 6148 000e 0364 str r3, [r0, #64] +3674:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6149 .loc 1 3674 3 is_stmt 1 view .LVU2055 +3674:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6150 .loc 1 3674 7 is_stmt 0 view .LVU2056 + 6151 0010 B0F84630 ldrh r3, [r0, #70] + 6152 0014 9BB2 uxth r3, r3 +3674:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6153 .loc 1 3674 20 view .LVU2057 + 6154 0016 013B subs r3, r3, #1 + 6155 0018 9BB2 uxth r3, r3 + 6156 001a A0F84630 strh r3, [r0, #70] @ movhi +3676:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6157 .loc 1 3676 3 is_stmt 1 view .LVU2058 +3676:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6158 .loc 1 3676 11 is_stmt 0 view .LVU2059 + 6159 001e B0F84630 ldrh r3, [r0, #70] + 6160 0022 9BB2 uxth r3, r3 +3676:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6161 .loc 1 3676 6 view .LVU2060 + 6162 0024 3BB9 cbnz r3, .L423 +3687:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6163 .loc 1 3687 5 is_stmt 1 view .LVU2061 + 6164 0026 0268 ldr r2, [r0] + 6165 0028 5368 ldr r3, [r2, #4] + 6166 002a 23F04003 bic r3, r3, #64 + 6167 002e 5360 str r3, [r2, #4] +3689:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6168 .loc 1 3689 5 view .LVU2062 +3689:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6169 .loc 1 3689 13 is_stmt 0 view .LVU2063 + 6170 0030 C38F ldrh r3, [r0, #62] + 6171 0032 9BB2 uxth r3, r3 +3689:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6172 .loc 1 3689 8 view .LVU2064 + 6173 0034 03B1 cbz r3, .L426 + 6174 .LVL387: + 6175 .L423: +3694:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6176 .loc 1 3694 1 view .LVU2065 + 6177 0036 08BD pop {r3, pc} + 6178 .LVL388: + ARM GAS /tmp/ccywxtmH.s page 219 + + + 6179 .L426: +3691:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6180 .loc 1 3691 7 is_stmt 1 view .LVU2066 + 6181 0038 FFF7FEFF bl SPI_CloseRxTx_ISR + 6182 .LVL389: +3694:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6183 .loc 1 3694 1 is_stmt 0 view .LVU2067 + 6184 003c FBE7 b .L423 + 6185 .cfi_endproc + 6186 .LFE171: + 6188 .section .text.SPI_DMAError,"ax",%progbits + 6189 .align 1 + 6190 .syntax unified + 6191 .thumb + 6192 .thumb_func + 6194 SPI_DMAError: + 6195 .LVL390: + 6196 .LFB165: +3362:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogati + 6197 .loc 1 3362 1 is_stmt 1 view -0 + 6198 .cfi_startproc + 6199 @ args = 0, pretend = 0, frame = 0 + 6200 @ frame_needed = 0, uses_anonymous_args = 0 +3362:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogati + 6201 .loc 1 3362 1 is_stmt 0 view .LVU2069 + 6202 0000 08B5 push {r3, lr} + 6203 .cfi_def_cfa_offset 8 + 6204 .cfi_offset 3, -8 + 6205 .cfi_offset 14, -4 +3363:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6206 .loc 1 3363 3 is_stmt 1 view .LVU2070 +3363:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6207 .loc 1 3363 22 is_stmt 0 view .LVU2071 + 6208 0002 406A ldr r0, [r0, #36] + 6209 .LVL391: +3366:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6210 .loc 1 3366 3 is_stmt 1 view .LVU2072 + 6211 0004 0268 ldr r2, [r0] + 6212 0006 5368 ldr r3, [r2, #4] + 6213 0008 23F00303 bic r3, r3, #3 + 6214 000c 5360 str r3, [r2, #4] +3368:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_READY; + 6215 .loc 1 3368 3 view .LVU2073 + 6216 000e 036E ldr r3, [r0, #96] + 6217 0010 43F01003 orr r3, r3, #16 + 6218 0014 0366 str r3, [r0, #96] +3369:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Call user error callback */ + 6219 .loc 1 3369 3 view .LVU2074 +3369:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Call user error callback */ + 6220 .loc 1 3369 15 is_stmt 0 view .LVU2075 + 6221 0016 0123 movs r3, #1 + 6222 0018 80F85D30 strb r3, [r0, #93] +3374:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + 6223 .loc 1 3374 3 is_stmt 1 view .LVU2076 + 6224 001c FFF7FEFF bl HAL_SPI_ErrorCallback + 6225 .LVL392: +3376:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + ARM GAS /tmp/ccywxtmH.s page 220 + + + 6226 .loc 1 3376 1 is_stmt 0 view .LVU2077 + 6227 0020 08BD pop {r3, pc} + 6228 .cfi_endproc + 6229 .LFE165: + 6231 .section .text.SPI_DMATransmitCplt,"ax",%progbits + 6232 .align 1 + 6233 .syntax unified + 6234 .thumb + 6235 .thumb_func + 6237 SPI_DMATransmitCplt: + 6238 .LVL393: + 6239 .LFB159: +3034:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogati + 6240 .loc 1 3034 1 is_stmt 1 view -0 + 6241 .cfi_startproc + 6242 @ args = 0, pretend = 0, frame = 8 + 6243 @ frame_needed = 0, uses_anonymous_args = 0 +3034:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogati + 6244 .loc 1 3034 1 is_stmt 0 view .LVU2079 + 6245 0000 30B5 push {r4, r5, lr} + 6246 .cfi_def_cfa_offset 12 + 6247 .cfi_offset 4, -12 + 6248 .cfi_offset 5, -8 + 6249 .cfi_offset 14, -4 + 6250 0002 83B0 sub sp, sp, #12 + 6251 .cfi_def_cfa_offset 24 + 6252 0004 0546 mov r5, r0 +3035:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t tickstart; + 6253 .loc 1 3035 3 is_stmt 1 view .LVU2080 +3035:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t tickstart; + 6254 .loc 1 3035 22 is_stmt 0 view .LVU2081 + 6255 0006 446A ldr r4, [r0, #36] + 6256 .LVL394: +3036:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6257 .loc 1 3036 3 is_stmt 1 view .LVU2082 +3039:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6258 .loc 1 3039 3 view .LVU2083 +3039:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6259 .loc 1 3039 15 is_stmt 0 view .LVU2084 + 6260 0008 FFF7FEFF bl HAL_GetTick + 6261 .LVL395: +3042:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6262 .loc 1 3042 3 is_stmt 1 view .LVU2085 +3042:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6263 .loc 1 3042 12 is_stmt 0 view .LVU2086 + 6264 000c 2B68 ldr r3, [r5] +3042:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6265 .loc 1 3042 22 view .LVU2087 + 6266 000e 1B68 ldr r3, [r3] +3042:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6267 .loc 1 3042 6 view .LVU2088 + 6268 0010 13F0200F tst r3, #32 + 6269 0014 23D1 bne .L430 + 6270 0016 0246 mov r2, r0 +3045:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6271 .loc 1 3045 5 is_stmt 1 view .LVU2089 + 6272 0018 2168 ldr r1, [r4] + ARM GAS /tmp/ccywxtmH.s page 221 + + + 6273 001a 4B68 ldr r3, [r1, #4] + 6274 001c 23F02003 bic r3, r3, #32 + 6275 0020 4B60 str r3, [r1, #4] +3048:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6276 .loc 1 3048 5 view .LVU2090 + 6277 0022 2168 ldr r1, [r4] + 6278 0024 4B68 ldr r3, [r1, #4] + 6279 0026 23F00203 bic r3, r3, #2 + 6280 002a 4B60 str r3, [r1, #4] +3051:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6281 .loc 1 3051 5 view .LVU2091 +3051:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6282 .loc 1 3051 9 is_stmt 0 view .LVU2092 + 6283 002c 6421 movs r1, #100 + 6284 002e 2046 mov r0, r4 + 6285 .LVL396: +3051:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6286 .loc 1 3051 9 view .LVU2093 + 6287 0030 FFF7FEFF bl SPI_EndRxTxTransaction + 6288 .LVL397: +3051:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6289 .loc 1 3051 8 view .LVU2094 + 6290 0034 18B1 cbz r0, .L431 +3053:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6291 .loc 1 3053 7 is_stmt 1 view .LVU2095 + 6292 0036 236E ldr r3, [r4, #96] + 6293 0038 43F02003 orr r3, r3, #32 + 6294 003c 2366 str r3, [r4, #96] + 6295 .L431: +3057:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6296 .loc 1 3057 5 view .LVU2096 +3057:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6297 .loc 1 3057 19 is_stmt 0 view .LVU2097 + 6298 003e A368 ldr r3, [r4, #8] +3057:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6299 .loc 1 3057 8 view .LVU2098 + 6300 0040 33B9 cbnz r3, .L432 +3059:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6301 .loc 1 3059 7 is_stmt 1 view .LVU2099 + 6302 .LBB6: +3059:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6303 .loc 1 3059 7 view .LVU2100 + 6304 0042 0193 str r3, [sp, #4] +3059:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6305 .loc 1 3059 7 view .LVU2101 + 6306 0044 2368 ldr r3, [r4] + 6307 0046 DA68 ldr r2, [r3, #12] + 6308 0048 0192 str r2, [sp, #4] +3059:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6309 .loc 1 3059 7 view .LVU2102 + 6310 004a 9B68 ldr r3, [r3, #8] + 6311 004c 0193 str r3, [sp, #4] +3059:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6312 .loc 1 3059 7 view .LVU2103 + 6313 004e 019B ldr r3, [sp, #4] + 6314 .L432: + 6315 .LBE6: + ARM GAS /tmp/ccywxtmH.s page 222 + + +3059:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6316 .loc 1 3059 7 discriminator 1 view .LVU2104 +3062:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_READY; + 6317 .loc 1 3062 5 discriminator 1 view .LVU2105 +3062:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_READY; + 6318 .loc 1 3062 23 is_stmt 0 discriminator 1 view .LVU2106 + 6319 0050 0023 movs r3, #0 + 6320 0052 E387 strh r3, [r4, #62] @ movhi +3063:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6321 .loc 1 3063 5 is_stmt 1 discriminator 1 view .LVU2107 +3063:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6322 .loc 1 3063 17 is_stmt 0 discriminator 1 view .LVU2108 + 6323 0054 0123 movs r3, #1 + 6324 0056 84F85D30 strb r3, [r4, #93] +3065:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6325 .loc 1 3065 5 is_stmt 1 discriminator 1 view .LVU2109 +3065:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6326 .loc 1 3065 13 is_stmt 0 discriminator 1 view .LVU2110 + 6327 005a 236E ldr r3, [r4, #96] +3065:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6328 .loc 1 3065 8 discriminator 1 view .LVU2111 + 6329 005c 23B9 cbnz r3, .L435 + 6330 .L430: +3080:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + 6331 .loc 1 3080 3 is_stmt 1 view .LVU2112 + 6332 005e 2046 mov r0, r4 + 6333 0060 FFF7FEFF bl HAL_SPI_TxCpltCallback + 6334 .LVL398: + 6335 .L429: +3082:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6336 .loc 1 3082 1 is_stmt 0 view .LVU2113 + 6337 0064 03B0 add sp, sp, #12 + 6338 .cfi_remember_state + 6339 .cfi_def_cfa_offset 12 + 6340 @ sp needed + 6341 0066 30BD pop {r4, r5, pc} + 6342 .LVL399: + 6343 .L435: + 6344 .cfi_restore_state +3071:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + 6345 .loc 1 3071 7 is_stmt 1 view .LVU2114 + 6346 0068 2046 mov r0, r4 + 6347 006a FFF7FEFF bl HAL_SPI_ErrorCallback + 6348 .LVL400: +3073:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6349 .loc 1 3073 7 view .LVU2115 + 6350 006e F9E7 b .L429 + 6351 .cfi_endproc + 6352 .LFE159: + 6354 .section .text.SPI_DMAReceiveCplt,"ax",%progbits + 6355 .align 1 + 6356 .syntax unified + 6357 .thumb + 6358 .thumb_func + 6360 SPI_DMAReceiveCplt: + 6361 .LVL401: + 6362 .LFB160: + ARM GAS /tmp/ccywxtmH.s page 223 + + +3091:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogati + 6363 .loc 1 3091 1 view -0 + 6364 .cfi_startproc + 6365 @ args = 0, pretend = 0, frame = 0 + 6366 @ frame_needed = 0, uses_anonymous_args = 0 +3091:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogati + 6367 .loc 1 3091 1 is_stmt 0 view .LVU2117 + 6368 0000 38B5 push {r3, r4, r5, lr} + 6369 .cfi_def_cfa_offset 16 + 6370 .cfi_offset 3, -16 + 6371 .cfi_offset 4, -12 + 6372 .cfi_offset 5, -8 + 6373 .cfi_offset 14, -4 + 6374 0002 0546 mov r5, r0 +3092:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t tickstart; + 6375 .loc 1 3092 3 is_stmt 1 view .LVU2118 +3092:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t tickstart; + 6376 .loc 1 3092 22 is_stmt 0 view .LVU2119 + 6377 0004 446A ldr r4, [r0, #36] + 6378 .LVL402: +3093:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) + 6379 .loc 1 3093 3 is_stmt 1 view .LVU2120 +3101:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6380 .loc 1 3101 3 view .LVU2121 +3101:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6381 .loc 1 3101 15 is_stmt 0 view .LVU2122 + 6382 0006 FFF7FEFF bl HAL_GetTick + 6383 .LVL403: +3104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6384 .loc 1 3104 3 is_stmt 1 view .LVU2123 +3104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6385 .loc 1 3104 12 is_stmt 0 view .LVU2124 + 6386 000a 2B68 ldr r3, [r5] +3104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6387 .loc 1 3104 22 view .LVU2125 + 6388 000c 1B68 ldr r3, [r3] +3104:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6389 .loc 1 3104 6 view .LVU2126 + 6390 000e 13F0200F tst r3, #32 + 6391 0012 1FD1 bne .L437 + 6392 0014 0246 mov r2, r0 +3107:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6393 .loc 1 3107 5 is_stmt 1 view .LVU2127 + 6394 0016 2168 ldr r1, [r4] + 6395 0018 4B68 ldr r3, [r1, #4] + 6396 001a 23F02003 bic r3, r3, #32 + 6397 001e 4B60 str r3, [r1, #4] +3153:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6398 .loc 1 3153 5 view .LVU2128 +3153:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6399 .loc 1 3153 20 is_stmt 0 view .LVU2129 + 6400 0020 A368 ldr r3, [r4, #8] +3153:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6401 .loc 1 3153 8 view .LVU2130 + 6402 0022 1BB9 cbnz r3, .L438 +3153:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6403 .loc 1 3153 70 discriminator 1 view .LVU2131 + ARM GAS /tmp/ccywxtmH.s page 224 + + + 6404 0024 6368 ldr r3, [r4, #4] +3153:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6405 .loc 1 3153 56 discriminator 1 view .LVU2132 + 6406 0026 B3F5827F cmp r3, #260 + 6407 002a 17D0 beq .L443 + 6408 .L438: +3161:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6409 .loc 1 3161 7 is_stmt 1 view .LVU2133 + 6410 002c 2168 ldr r1, [r4] + 6411 002e 4B68 ldr r3, [r1, #4] + 6412 0030 23F00103 bic r3, r3, #1 + 6413 0034 4B60 str r3, [r1, #4] + 6414 .L439: +3165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6415 .loc 1 3165 5 view .LVU2134 +3165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6416 .loc 1 3165 9 is_stmt 0 view .LVU2135 + 6417 0036 6421 movs r1, #100 + 6418 0038 2046 mov r0, r4 + 6419 .LVL404: +3165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6420 .loc 1 3165 9 view .LVU2136 + 6421 003a FFF7FEFF bl SPI_EndRxTransaction + 6422 .LVL405: +3165:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6423 .loc 1 3165 8 view .LVU2137 + 6424 003e 08B1 cbz r0, .L440 +3167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6425 .loc 1 3167 7 is_stmt 1 view .LVU2138 +3167:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6426 .loc 1 3167 23 is_stmt 0 view .LVU2139 + 6427 0040 2023 movs r3, #32 + 6428 0042 2366 str r3, [r4, #96] + 6429 .L440: +3170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_READY; + 6430 .loc 1 3170 5 is_stmt 1 view .LVU2140 +3170:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_READY; + 6431 .loc 1 3170 23 is_stmt 0 view .LVU2141 + 6432 0044 0023 movs r3, #0 + 6433 0046 A4F84630 strh r3, [r4, #70] @ movhi +3171:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6434 .loc 1 3171 5 is_stmt 1 view .LVU2142 +3171:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6435 .loc 1 3171 17 is_stmt 0 view .LVU2143 + 6436 004a 0123 movs r3, #1 + 6437 004c 84F85D30 strb r3, [r4, #93] +3182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6438 .loc 1 3182 5 is_stmt 1 view .LVU2144 +3182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6439 .loc 1 3182 13 is_stmt 0 view .LVU2145 + 6440 0050 236E ldr r3, [r4, #96] +3182:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6441 .loc 1 3182 8 view .LVU2146 + 6442 0052 4BB9 cbnz r3, .L444 + 6443 .L437: +3197:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + 6444 .loc 1 3197 3 is_stmt 1 view .LVU2147 + ARM GAS /tmp/ccywxtmH.s page 225 + + + 6445 0054 2046 mov r0, r4 + 6446 0056 FFF7FEFF bl HAL_SPI_RxCpltCallback + 6447 .LVL406: + 6448 .L436: +3199:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6449 .loc 1 3199 1 is_stmt 0 view .LVU2148 + 6450 005a 38BD pop {r3, r4, r5, pc} + 6451 .LVL407: + 6452 .L443: +3156:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6453 .loc 1 3156 7 is_stmt 1 view .LVU2149 + 6454 005c 2168 ldr r1, [r4] + 6455 005e 4B68 ldr r3, [r1, #4] + 6456 0060 23F00303 bic r3, r3, #3 + 6457 0064 4B60 str r3, [r1, #4] + 6458 0066 E6E7 b .L439 + 6459 .LVL408: + 6460 .L444: +3188:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + 6461 .loc 1 3188 7 view .LVU2150 + 6462 0068 2046 mov r0, r4 + 6463 006a FFF7FEFF bl HAL_SPI_ErrorCallback + 6464 .LVL409: +3190:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6465 .loc 1 3190 7 view .LVU2151 + 6466 006e F4E7 b .L436 + 6467 .cfi_endproc + 6468 .LFE160: + 6470 .section .text.SPI_DMATransmitReceiveCplt,"ax",%progbits + 6471 .align 1 + 6472 .syntax unified + 6473 .thumb + 6474 .thumb_func + 6476 SPI_DMATransmitReceiveCplt: + 6477 .LVL410: + 6478 .LFB161: +3208:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogati + 6479 .loc 1 3208 1 view -0 + 6480 .cfi_startproc + 6481 @ args = 0, pretend = 0, frame = 0 + 6482 @ frame_needed = 0, uses_anonymous_args = 0 +3208:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogati + 6483 .loc 1 3208 1 is_stmt 0 view .LVU2153 + 6484 0000 38B5 push {r3, r4, r5, lr} + 6485 .cfi_def_cfa_offset 16 + 6486 .cfi_offset 3, -16 + 6487 .cfi_offset 4, -12 + 6488 .cfi_offset 5, -8 + 6489 .cfi_offset 14, -4 + 6490 0002 0546 mov r5, r0 +3209:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t tickstart; + 6491 .loc 1 3209 3 is_stmt 1 view .LVU2154 +3209:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t tickstart; + 6492 .loc 1 3209 22 is_stmt 0 view .LVU2155 + 6493 0004 446A ldr r4, [r0, #36] + 6494 .LVL411: +3210:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #if (USE_SPI_CRC != 0U) + ARM GAS /tmp/ccywxtmH.s page 226 + + + 6495 .loc 1 3210 3 is_stmt 1 view .LVU2156 +3218:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6496 .loc 1 3218 3 view .LVU2157 +3218:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6497 .loc 1 3218 15 is_stmt 0 view .LVU2158 + 6498 0006 FFF7FEFF bl HAL_GetTick + 6499 .LVL412: +3221:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6500 .loc 1 3221 3 is_stmt 1 view .LVU2159 +3221:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6501 .loc 1 3221 12 is_stmt 0 view .LVU2160 + 6502 000a 2B68 ldr r3, [r5] +3221:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6503 .loc 1 3221 22 view .LVU2161 + 6504 000c 1B68 ldr r3, [r3] +3221:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6505 .loc 1 3221 6 view .LVU2162 + 6506 000e 13F0200F tst r3, #32 + 6507 0012 1CD1 bne .L446 + 6508 0014 0246 mov r2, r0 +3224:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6509 .loc 1 3224 5 is_stmt 1 view .LVU2163 + 6510 0016 2168 ldr r1, [r4] + 6511 0018 4B68 ldr r3, [r1, #4] + 6512 001a 23F02003 bic r3, r3, #32 + 6513 001e 4B60 str r3, [r1, #4] +3261:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6514 .loc 1 3261 5 view .LVU2164 +3261:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6515 .loc 1 3261 9 is_stmt 0 view .LVU2165 + 6516 0020 6421 movs r1, #100 + 6517 0022 2046 mov r0, r4 + 6518 .LVL413: +3261:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6519 .loc 1 3261 9 view .LVU2166 + 6520 0024 FFF7FEFF bl SPI_EndRxTxTransaction + 6521 .LVL414: +3261:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6522 .loc 1 3261 8 view .LVU2167 + 6523 0028 18B1 cbz r0, .L447 +3263:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6524 .loc 1 3263 7 is_stmt 1 view .LVU2168 + 6525 002a 236E ldr r3, [r4, #96] + 6526 002c 43F02003 orr r3, r3, #32 + 6527 0030 2366 str r3, [r4, #96] + 6528 .L447: +3267:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6529 .loc 1 3267 5 view .LVU2169 + 6530 0032 2268 ldr r2, [r4] + 6531 0034 5368 ldr r3, [r2, #4] + 6532 0036 23F00303 bic r3, r3, #3 + 6533 003a 5360 str r3, [r2, #4] +3269:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = 0U; + 6534 .loc 1 3269 5 view .LVU2170 +3269:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = 0U; + 6535 .loc 1 3269 23 is_stmt 0 view .LVU2171 + 6536 003c 0023 movs r3, #0 + ARM GAS /tmp/ccywxtmH.s page 227 + + + 6537 003e E387 strh r3, [r4, #62] @ movhi +3270:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_READY; + 6538 .loc 1 3270 5 is_stmt 1 view .LVU2172 +3270:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->State = HAL_SPI_STATE_READY; + 6539 .loc 1 3270 23 is_stmt 0 view .LVU2173 + 6540 0040 A4F84630 strh r3, [r4, #70] @ movhi +3271:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6541 .loc 1 3271 5 is_stmt 1 view .LVU2174 +3271:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6542 .loc 1 3271 17 is_stmt 0 view .LVU2175 + 6543 0044 0123 movs r3, #1 + 6544 0046 84F85D30 strb r3, [r4, #93] +3282:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6545 .loc 1 3282 5 is_stmt 1 view .LVU2176 +3282:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6546 .loc 1 3282 13 is_stmt 0 view .LVU2177 + 6547 004a 236E ldr r3, [r4, #96] +3282:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6548 .loc 1 3282 8 view .LVU2178 + 6549 004c 1BB9 cbnz r3, .L450 + 6550 .L446: +3297:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + 6551 .loc 1 3297 3 is_stmt 1 view .LVU2179 + 6552 004e 2046 mov r0, r4 + 6553 0050 FFF7FEFF bl HAL_SPI_TxRxCpltCallback + 6554 .LVL415: + 6555 .L445: +3299:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6556 .loc 1 3299 1 is_stmt 0 view .LVU2180 + 6557 0054 38BD pop {r3, r4, r5, pc} + 6558 .LVL416: + 6559 .L450: +3288:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + 6560 .loc 1 3288 7 is_stmt 1 view .LVU2181 + 6561 0056 2046 mov r0, r4 + 6562 0058 FFF7FEFF bl HAL_SPI_ErrorCallback + 6563 .LVL417: +3290:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6564 .loc 1 3290 7 view .LVU2182 + 6565 005c FAE7 b .L445 + 6566 .cfi_endproc + 6567 .LFE161: + 6569 .section .text.HAL_SPI_IRQHandler,"ax",%progbits + 6570 .align 1 + 6571 .global HAL_SPI_IRQHandler + 6572 .syntax unified + 6573 .thumb + 6574 .thumb_func + 6576 HAL_SPI_IRQHandler: + 6577 .LVL418: + 6578 .LFB148: +2741:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t itsource = hspi->Instance->CR2; + 6579 .loc 1 2741 1 view -0 + 6580 .cfi_startproc + 6581 @ args = 0, pretend = 0, frame = 16 + 6582 @ frame_needed = 0, uses_anonymous_args = 0 +2741:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t itsource = hspi->Instance->CR2; + ARM GAS /tmp/ccywxtmH.s page 228 + + + 6583 .loc 1 2741 1 is_stmt 0 view .LVU2184 + 6584 0000 10B5 push {r4, lr} + 6585 .cfi_def_cfa_offset 8 + 6586 .cfi_offset 4, -8 + 6587 .cfi_offset 14, -4 + 6588 0002 84B0 sub sp, sp, #16 + 6589 .cfi_def_cfa_offset 24 + 6590 0004 0446 mov r4, r0 +2742:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t itflag = hspi->Instance->SR; + 6591 .loc 1 2742 3 is_stmt 1 view .LVU2185 +2742:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t itflag = hspi->Instance->SR; + 6592 .loc 1 2742 27 is_stmt 0 view .LVU2186 + 6593 0006 0268 ldr r2, [r0] +2742:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t itflag = hspi->Instance->SR; + 6594 .loc 1 2742 12 view .LVU2187 + 6595 0008 5168 ldr r1, [r2, #4] + 6596 .LVL419: +2743:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6597 .loc 1 2743 3 is_stmt 1 view .LVU2188 +2743:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6598 .loc 1 2743 12 is_stmt 0 view .LVU2189 + 6599 000a 9368 ldr r3, [r2, #8] + 6600 .LVL420: +2746:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (SPI_CHECK_FLAG(itflag, SPI_FLAG_RXNE) != RESET) && (SPI_CHECK_IT_SOURCE(itsource, SPI_IT_RXN + 6601 .loc 1 2746 3 is_stmt 1 view .LVU2190 +2746:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (SPI_CHECK_FLAG(itflag, SPI_FLAG_RXNE) != RESET) && (SPI_CHECK_IT_SOURCE(itsource, SPI_IT_RXN + 6602 .loc 1 2746 55 is_stmt 0 view .LVU2191 + 6603 000c 03F04100 and r0, r3, #65 + 6604 .LVL421: +2746:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** (SPI_CHECK_FLAG(itflag, SPI_FLAG_RXNE) != RESET) && (SPI_CHECK_IT_SOURCE(itsource, SPI_IT_RXN + 6605 .loc 1 2746 6 view .LVU2192 + 6606 0010 0128 cmp r0, #1 + 6607 0012 67D0 beq .L463 + 6608 .L452: +2754:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6609 .loc 1 2754 3 is_stmt 1 view .LVU2193 +2754:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6610 .loc 1 2754 6 is_stmt 0 view .LVU2194 + 6611 0014 13F0020F tst r3, #2 + 6612 0018 02D0 beq .L454 +2754:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6613 .loc 1 2754 55 discriminator 1 view .LVU2195 + 6614 001a 11F0800F tst r1, #128 + 6615 001e 68D1 bne .L464 + 6616 .L454: +2761:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** || (SPI_CHECK_FLAG(itflag, SPI_FLAG_FRE) != RESET)) && (SPI_CHECK_IT_SOURCE(itsource, SPI_IT + 6617 .loc 1 2761 3 is_stmt 1 view .LVU2196 +2761:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** || (SPI_CHECK_FLAG(itflag, SPI_FLAG_FRE) != RESET)) && (SPI_CHECK_IT_SOURCE(itsource, SPI_IT + 6618 .loc 1 2761 6 is_stmt 0 view .LVU2197 + 6619 0020 13F4B07F tst r3, #352 + 6620 0024 68D0 beq .L451 +2762:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6621 .loc 1 2762 60 view .LVU2198 + 6622 0026 11F0200F tst r1, #32 + 6623 002a 65D0 beq .L451 +2765:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6624 .loc 1 2765 5 is_stmt 1 view .LVU2199 + ARM GAS /tmp/ccywxtmH.s page 229 + + +2765:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6625 .loc 1 2765 8 is_stmt 0 view .LVU2200 + 6626 002c 13F0400F tst r3, #64 + 6627 0030 0FD0 beq .L455 +2767:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6628 .loc 1 2767 7 is_stmt 1 view .LVU2201 +2767:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6629 .loc 1 2767 15 is_stmt 0 view .LVU2202 + 6630 0032 94F85D00 ldrb r0, [r4, #93] @ zero_extendqisi2 + 6631 0036 C0B2 uxtb r0, r0 +2767:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6632 .loc 1 2767 10 view .LVU2203 + 6633 0038 0328 cmp r0, #3 + 6634 003a 5FD0 beq .L456 +2769:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_OVRFLAG(hspi); + 6635 .loc 1 2769 9 is_stmt 1 view .LVU2204 + 6636 003c 206E ldr r0, [r4, #96] + 6637 003e 40F00400 orr r0, r0, #4 + 6638 0042 2066 str r0, [r4, #96] +2770:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6639 .loc 1 2770 9 view .LVU2205 + 6640 .LBB7: +2770:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6641 .loc 1 2770 9 view .LVU2206 + 6642 0044 0020 movs r0, #0 + 6643 0046 0090 str r0, [sp] +2770:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6644 .loc 1 2770 9 view .LVU2207 + 6645 0048 D068 ldr r0, [r2, #12] + 6646 004a 0090 str r0, [sp] +2770:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6647 .loc 1 2770 9 view .LVU2208 + 6648 004c 9068 ldr r0, [r2, #8] + 6649 004e 0090 str r0, [sp] +2770:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6650 .loc 1 2770 9 view .LVU2209 + 6651 0050 0098 ldr r0, [sp] + 6652 .LBE7: +2770:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6653 .loc 1 2770 9 view .LVU2210 + 6654 .L455: +2780:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6655 .loc 1 2780 5 view .LVU2211 +2780:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6656 .loc 1 2780 8 is_stmt 0 view .LVU2212 + 6657 0052 13F0200F tst r3, #32 + 6658 0056 0CD0 beq .L457 +2782:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_MODFFLAG(hspi); + 6659 .loc 1 2782 7 is_stmt 1 view .LVU2213 + 6660 0058 206E ldr r0, [r4, #96] + 6661 005a 40F00100 orr r0, r0, #1 + 6662 005e 2066 str r0, [r4, #96] +2783:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6663 .loc 1 2783 7 view .LVU2214 + 6664 .LBB8: +2783:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6665 .loc 1 2783 7 view .LVU2215 + ARM GAS /tmp/ccywxtmH.s page 230 + + + 6666 0060 0020 movs r0, #0 + 6667 0062 0290 str r0, [sp, #8] +2783:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6668 .loc 1 2783 7 view .LVU2216 + 6669 0064 9068 ldr r0, [r2, #8] + 6670 0066 0290 str r0, [sp, #8] +2783:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6671 .loc 1 2783 7 view .LVU2217 + 6672 0068 1068 ldr r0, [r2] + 6673 006a 20F04000 bic r0, r0, #64 + 6674 006e 1060 str r0, [r2] +2783:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6675 .loc 1 2783 7 view .LVU2218 + 6676 0070 029A ldr r2, [sp, #8] + 6677 .L457: +2783:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6678 .loc 1 2783 7 is_stmt 0 view .LVU2219 + 6679 .LBE8: +2783:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6680 .loc 1 2783 7 is_stmt 1 discriminator 1 view .LVU2220 +2787:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6681 .loc 1 2787 5 discriminator 1 view .LVU2221 +2787:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6682 .loc 1 2787 8 is_stmt 0 discriminator 1 view .LVU2222 + 6683 0072 13F4807F tst r3, #256 + 6684 0076 09D0 beq .L458 +2789:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_FREFLAG(hspi); + 6685 .loc 1 2789 7 is_stmt 1 view .LVU2223 + 6686 0078 236E ldr r3, [r4, #96] + 6687 .LVL422: +2789:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_FREFLAG(hspi); + 6688 .loc 1 2789 7 is_stmt 0 view .LVU2224 + 6689 007a 43F00803 orr r3, r3, #8 + 6690 007e 2366 str r3, [r4, #96] +2790:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6691 .loc 1 2790 7 is_stmt 1 view .LVU2225 + 6692 .LBB9: +2790:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6693 .loc 1 2790 7 view .LVU2226 + 6694 0080 0023 movs r3, #0 + 6695 0082 0393 str r3, [sp, #12] +2790:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6696 .loc 1 2790 7 view .LVU2227 + 6697 0084 2368 ldr r3, [r4] + 6698 0086 9B68 ldr r3, [r3, #8] + 6699 0088 0393 str r3, [sp, #12] +2790:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6700 .loc 1 2790 7 view .LVU2228 + 6701 008a 039B ldr r3, [sp, #12] + 6702 .L458: +2790:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6703 .loc 1 2790 7 is_stmt 0 view .LVU2229 + 6704 .LBE9: +2790:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6705 .loc 1 2790 7 is_stmt 1 discriminator 1 view .LVU2230 +2793:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6706 .loc 1 2793 5 discriminator 1 view .LVU2231 + ARM GAS /tmp/ccywxtmH.s page 231 + + +2793:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6707 .loc 1 2793 13 is_stmt 0 discriminator 1 view .LVU2232 + 6708 008c 236E ldr r3, [r4, #96] +2793:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6709 .loc 1 2793 8 discriminator 1 view .LVU2233 + 6710 008e 002B cmp r3, #0 + 6711 0090 32D0 beq .L451 +2796:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6712 .loc 1 2796 7 is_stmt 1 view .LVU2234 + 6713 0092 2268 ldr r2, [r4] + 6714 0094 5368 ldr r3, [r2, #4] + 6715 0096 23F0E003 bic r3, r3, #224 + 6716 009a 5360 str r3, [r2, #4] +2798:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable the SPI DMA requests if enabled */ + 6717 .loc 1 2798 7 view .LVU2235 +2798:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Disable the SPI DMA requests if enabled */ + 6718 .loc 1 2798 19 is_stmt 0 view .LVU2236 + 6719 009c 0123 movs r3, #1 + 6720 009e 84F85D30 strb r3, [r4, #93] +2800:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6721 .loc 1 2800 7 is_stmt 1 view .LVU2237 +2800:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6722 .loc 1 2800 10 is_stmt 0 view .LVU2238 + 6723 00a2 11F0030F tst r1, #3 + 6724 00a6 31D0 beq .L460 +2802:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6725 .loc 1 2802 9 is_stmt 1 view .LVU2239 + 6726 00a8 2268 ldr r2, [r4] + 6727 00aa 5368 ldr r3, [r2, #4] + 6728 00ac 23F00303 bic r3, r3, #3 + 6729 00b0 5360 str r3, [r2, #4] +2805:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6730 .loc 1 2805 9 view .LVU2240 +2805:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6731 .loc 1 2805 17 is_stmt 0 view .LVU2241 + 6732 00b2 A36D ldr r3, [r4, #88] +2805:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6733 .loc 1 2805 12 view .LVU2242 + 6734 00b4 4BB1 cbz r3, .L461 +2809:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (HAL_OK != HAL_DMA_Abort_IT(hspi->hdmarx)) + 6735 .loc 1 2809 11 is_stmt 1 view .LVU2243 +2809:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (HAL_OK != HAL_DMA_Abort_IT(hspi->hdmarx)) + 6736 .loc 1 2809 43 is_stmt 0 view .LVU2244 + 6737 00b6 174A ldr r2, .L465 + 6738 00b8 5A63 str r2, [r3, #52] +2810:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6739 .loc 1 2810 11 is_stmt 1 view .LVU2245 +2810:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6740 .loc 1 2810 25 is_stmt 0 view .LVU2246 + 6741 00ba A06D ldr r0, [r4, #88] + 6742 00bc FFF7FEFF bl HAL_DMA_Abort_IT + 6743 .LVL423: +2810:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6744 .loc 1 2810 14 view .LVU2247 + 6745 00c0 18B1 cbz r0, .L461 +2812:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6746 .loc 1 2812 13 is_stmt 1 view .LVU2248 + ARM GAS /tmp/ccywxtmH.s page 232 + + + 6747 00c2 236E ldr r3, [r4, #96] + 6748 00c4 43F04003 orr r3, r3, #64 + 6749 00c8 2366 str r3, [r4, #96] + 6750 .L461: +2816:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6751 .loc 1 2816 9 view .LVU2249 +2816:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6752 .loc 1 2816 17 is_stmt 0 view .LVU2250 + 6753 00ca 636D ldr r3, [r4, #84] +2816:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6754 .loc 1 2816 12 view .LVU2251 + 6755 00cc A3B1 cbz r3, .L451 +2820:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (HAL_OK != HAL_DMA_Abort_IT(hspi->hdmatx)) + 6756 .loc 1 2820 11 is_stmt 1 view .LVU2252 +2820:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** if (HAL_OK != HAL_DMA_Abort_IT(hspi->hdmatx)) + 6757 .loc 1 2820 43 is_stmt 0 view .LVU2253 + 6758 00ce 114A ldr r2, .L465 + 6759 00d0 5A63 str r2, [r3, #52] +2821:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6760 .loc 1 2821 11 is_stmt 1 view .LVU2254 +2821:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6761 .loc 1 2821 25 is_stmt 0 view .LVU2255 + 6762 00d2 606D ldr r0, [r4, #84] + 6763 00d4 FFF7FEFF bl HAL_DMA_Abort_IT + 6764 .LVL424: +2821:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6765 .loc 1 2821 14 view .LVU2256 + 6766 00d8 70B1 cbz r0, .L451 +2823:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6767 .loc 1 2823 13 is_stmt 1 view .LVU2257 + 6768 00da 236E ldr r3, [r4, #96] + 6769 00dc 43F04003 orr r3, r3, #64 + 6770 00e0 2366 str r3, [r4, #96] + 6771 00e2 09E0 b .L451 + 6772 .LVL425: + 6773 .L463: +2747:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6774 .loc 1 2747 56 is_stmt 0 view .LVU2258 + 6775 00e4 11F0400F tst r1, #64 + 6776 00e8 94D0 beq .L452 +2749:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return; + 6777 .loc 1 2749 5 is_stmt 1 view .LVU2259 +2749:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return; + 6778 .loc 1 2749 9 is_stmt 0 view .LVU2260 + 6779 00ea E36C ldr r3, [r4, #76] + 6780 .LVL426: +2749:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return; + 6781 .loc 1 2749 5 view .LVU2261 + 6782 00ec 2046 mov r0, r4 + 6783 00ee 9847 blx r3 + 6784 .LVL427: +2750:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6785 .loc 1 2750 5 is_stmt 1 view .LVU2262 + 6786 00f0 02E0 b .L451 + 6787 .LVL428: + 6788 .L464: +2756:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return; + ARM GAS /tmp/ccywxtmH.s page 233 + + + 6789 .loc 1 2756 5 view .LVU2263 +2756:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return; + 6790 .loc 1 2756 9 is_stmt 0 view .LVU2264 + 6791 00f2 236D ldr r3, [r4, #80] + 6792 .LVL429: +2756:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return; + 6793 .loc 1 2756 5 view .LVU2265 + 6794 00f4 2046 mov r0, r4 + 6795 00f6 9847 blx r3 + 6796 .LVL430: +2757:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6797 .loc 1 2757 5 is_stmt 1 view .LVU2266 + 6798 .L451: +2839:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6799 .loc 1 2839 1 is_stmt 0 view .LVU2267 + 6800 00f8 04B0 add sp, sp, #16 + 6801 .cfi_remember_state + 6802 .cfi_def_cfa_offset 8 + 6803 @ sp needed + 6804 00fa 10BD pop {r4, pc} + 6805 .LVL431: + 6806 .L456: + 6807 .cfi_restore_state +2774:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return; + 6808 .loc 1 2774 9 is_stmt 1 view .LVU2268 + 6809 .LBB10: +2774:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return; + 6810 .loc 1 2774 9 view .LVU2269 + 6811 00fc 0023 movs r3, #0 + 6812 .LVL432: +2774:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return; + 6813 .loc 1 2774 9 is_stmt 0 view .LVU2270 + 6814 00fe 0193 str r3, [sp, #4] +2774:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return; + 6815 .loc 1 2774 9 is_stmt 1 view .LVU2271 + 6816 0100 D368 ldr r3, [r2, #12] + 6817 0102 0193 str r3, [sp, #4] +2774:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return; + 6818 .loc 1 2774 9 view .LVU2272 + 6819 0104 9368 ldr r3, [r2, #8] + 6820 0106 0193 str r3, [sp, #4] +2774:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return; + 6821 .loc 1 2774 9 view .LVU2273 + 6822 0108 019B ldr r3, [sp, #4] + 6823 .LBE10: +2774:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** return; + 6824 .loc 1 2774 9 view .LVU2274 +2775:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6825 .loc 1 2775 9 view .LVU2275 + 6826 010a F5E7 b .L451 + 6827 .L460: +2833:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + 6828 .loc 1 2833 9 view .LVU2276 + 6829 010c 2046 mov r0, r4 + 6830 010e FFF7FEFF bl HAL_SPI_ErrorCallback + 6831 .LVL433: +2837:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + ARM GAS /tmp/ccywxtmH.s page 234 + + + 6832 .loc 1 2837 5 view .LVU2277 + 6833 0112 F1E7 b .L451 + 6834 .L466: + 6835 .align 2 + 6836 .L465: + 6837 0114 00000000 .word SPI_DMAAbortOnError + 6838 .cfi_endproc + 6839 .LFE148: + 6841 .section .text.SPI_DMAAbortOnError,"ax",%progbits + 6842 .align 1 + 6843 .syntax unified + 6844 .thumb + 6845 .thumb_func + 6847 SPI_DMAAbortOnError: + 6848 .LVL434: + 6849 .LFB166: +3385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogati + 6850 .loc 1 3385 1 view -0 + 6851 .cfi_startproc + 6852 @ args = 0, pretend = 0, frame = 0 + 6853 @ frame_needed = 0, uses_anonymous_args = 0 +3385:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogati + 6854 .loc 1 3385 1 is_stmt 0 view .LVU2279 + 6855 0000 08B5 push {r3, lr} + 6856 .cfi_def_cfa_offset 8 + 6857 .cfi_offset 3, -8 + 6858 .cfi_offset 14, -4 +3386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = 0U; + 6859 .loc 1 3386 3 is_stmt 1 view .LVU2280 +3386:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->RxXferCount = 0U; + 6860 .loc 1 3386 22 is_stmt 0 view .LVU2281 + 6861 0002 406A ldr r0, [r0, #36] + 6862 .LVL435: +3387:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = 0U; + 6863 .loc 1 3387 3 is_stmt 1 view .LVU2282 +3387:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = 0U; + 6864 .loc 1 3387 21 is_stmt 0 view .LVU2283 + 6865 0004 0023 movs r3, #0 + 6866 0006 A0F84630 strh r3, [r0, #70] @ movhi +3388:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6867 .loc 1 3388 3 is_stmt 1 view .LVU2284 +3388:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6868 .loc 1 3388 21 is_stmt 0 view .LVU2285 + 6869 000a C387 strh r3, [r0, #62] @ movhi +3394:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + 6870 .loc 1 3394 3 is_stmt 1 view .LVU2286 + 6871 000c FFF7FEFF bl HAL_SPI_ErrorCallback + 6872 .LVL436: +3396:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6873 .loc 1 3396 1 is_stmt 0 view .LVU2287 + 6874 0010 08BD pop {r3, pc} + 6875 .cfi_endproc + 6876 .LFE166: + 6878 .section .text.HAL_SPI_AbortCpltCallback,"ax",%progbits + 6879 .align 1 + 6880 .weak HAL_SPI_AbortCpltCallback + 6881 .syntax unified + ARM GAS /tmp/ccywxtmH.s page 235 + + + 6882 .thumb + 6883 .thumb_func + 6885 HAL_SPI_AbortCpltCallback: + 6886 .LVL437: + 6887 .LFB156: +2962:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Prevent unused argument(s) compilation warning */ + 6888 .loc 1 2962 1 is_stmt 1 view -0 + 6889 .cfi_startproc + 6890 @ args = 0, pretend = 0, frame = 0 + 6891 @ frame_needed = 0, uses_anonymous_args = 0 + 6892 @ link register save eliminated. +2964:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6893 .loc 1 2964 3 view .LVU2289 +2969:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6894 .loc 1 2969 1 is_stmt 0 view .LVU2290 + 6895 0000 7047 bx lr + 6896 .cfi_endproc + 6897 .LFE156: + 6899 .section .text.HAL_SPI_Abort_IT,"ax",%progbits + 6900 .align 1 + 6901 .global HAL_SPI_Abort_IT + 6902 .syntax unified + 6903 .thumb + 6904 .thumb_func + 6906 HAL_SPI_Abort_IT: + 6907 .LVL438: + 6908 .LFB144: +2500:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef errorcode; + 6909 .loc 1 2500 1 is_stmt 1 view -0 + 6910 .cfi_startproc + 6911 @ args = 0, pretend = 0, frame = 16 + 6912 @ frame_needed = 0, uses_anonymous_args = 0 +2500:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** HAL_StatusTypeDef errorcode; + 6913 .loc 1 2500 1 is_stmt 0 view .LVU2292 + 6914 0000 70B5 push {r4, r5, r6, lr} + 6915 .cfi_def_cfa_offset 16 + 6916 .cfi_offset 4, -16 + 6917 .cfi_offset 5, -12 + 6918 .cfi_offset 6, -8 + 6919 .cfi_offset 14, -4 + 6920 0002 84B0 sub sp, sp, #16 + 6921 .cfi_def_cfa_offset 32 + 6922 0004 0446 mov r4, r0 +2501:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** uint32_t abortcplt ; + 6923 .loc 1 2501 3 is_stmt 1 view .LVU2293 +2502:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __IO uint32_t count; + 6924 .loc 1 2502 3 view .LVU2294 +2503:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __IO uint32_t resetcount; + 6925 .loc 1 2503 3 view .LVU2295 +2504:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6926 .loc 1 2504 3 view .LVU2296 +2507:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** abortcplt = 1U; + 6927 .loc 1 2507 3 view .LVU2297 + 6928 .LVL439: +2508:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** resetcount = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U); + 6929 .loc 1 2508 3 view .LVU2298 +2509:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** count = resetcount; + ARM GAS /tmp/ccywxtmH.s page 236 + + + 6930 .loc 1 2509 3 view .LVU2299 +2509:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** count = resetcount; + 6931 .loc 1 2509 61 is_stmt 0 view .LVU2300 + 6932 0006 504B ldr r3, .L496 + 6933 0008 1B68 ldr r3, [r3] + 6934 000a 504A ldr r2, .L496+4 + 6935 000c A2FB0323 umull r2, r3, r2, r3 + 6936 0010 5B0A lsrs r3, r3, #9 +2509:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** count = resetcount; + 6937 .loc 1 2509 36 view .LVU2301 + 6938 0012 6422 movs r2, #100 + 6939 0014 02FB03F3 mul r3, r2, r3 +2509:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** count = resetcount; + 6940 .loc 1 2509 14 view .LVU2302 + 6941 0018 0293 str r3, [sp, #8] +2510:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6942 .loc 1 2510 3 is_stmt 1 view .LVU2303 +2510:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6943 .loc 1 2510 9 is_stmt 0 view .LVU2304 + 6944 001a 029B ldr r3, [sp, #8] + 6945 001c 0393 str r3, [sp, #12] +2513:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 6946 .loc 1 2513 3 is_stmt 1 view .LVU2305 + 6947 001e 0268 ldr r2, [r0] + 6948 0020 5368 ldr r3, [r2, #4] + 6949 0022 23F02003 bic r3, r3, #32 + 6950 0026 5360 str r3, [r2, #4] +2516:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6951 .loc 1 2516 3 view .LVU2306 +2516:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6952 .loc 1 2516 7 is_stmt 0 view .LVU2307 + 6953 0028 0268 ldr r2, [r0] + 6954 002a 5368 ldr r3, [r2, #4] +2516:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6955 .loc 1 2516 6 view .LVU2308 + 6956 002c 13F0800F tst r3, #128 + 6957 0030 12D0 beq .L471 +2518:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Wait HAL_SPI_STATE_ABORT state */ + 6958 .loc 1 2518 5 is_stmt 1 view .LVU2309 +2518:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Wait HAL_SPI_STATE_ABORT state */ + 6959 .loc 1 2518 17 is_stmt 0 view .LVU2310 + 6960 0032 474B ldr r3, .L496+8 + 6961 0034 0365 str r3, [r0, #80] + 6962 .L474: +2520:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6963 .loc 1 2520 5 is_stmt 1 view .LVU2311 +2522:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6964 .loc 1 2522 7 view .LVU2312 +2522:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6965 .loc 1 2522 17 is_stmt 0 view .LVU2313 + 6966 0036 039B ldr r3, [sp, #12] +2522:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6967 .loc 1 2522 10 view .LVU2314 + 6968 0038 43B1 cbz r3, .L493 +2527:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } while (hspi->State != HAL_SPI_STATE_ABORT); + 6969 .loc 1 2527 7 is_stmt 1 view .LVU2315 +2527:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } while (hspi->State != HAL_SPI_STATE_ABORT); + ARM GAS /tmp/ccywxtmH.s page 237 + + + 6970 .loc 1 2527 12 is_stmt 0 view .LVU2316 + 6971 003a 039B ldr r3, [sp, #12] + 6972 003c 013B subs r3, r3, #1 + 6973 003e 0393 str r3, [sp, #12] +2528:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Reset Timeout Counter */ + 6974 .loc 1 2528 26 is_stmt 1 view .LVU2317 +2528:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Reset Timeout Counter */ + 6975 .loc 1 2528 18 is_stmt 0 view .LVU2318 + 6976 0040 94F85D30 ldrb r3, [r4, #93] @ zero_extendqisi2 + 6977 0044 DBB2 uxtb r3, r3 +2528:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Reset Timeout Counter */ + 6978 .loc 1 2528 26 view .LVU2319 + 6979 0046 072B cmp r3, #7 + 6980 0048 F5D1 bne .L474 + 6981 004a 03E0 b .L473 + 6982 .L493: +2524:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** break; + 6983 .loc 1 2524 9 is_stmt 1 view .LVU2320 + 6984 004c 236E ldr r3, [r4, #96] + 6985 004e 43F04003 orr r3, r3, #64 + 6986 0052 2366 str r3, [r4, #96] +2525:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6987 .loc 1 2525 9 view .LVU2321 + 6988 .L473: +2530:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6989 .loc 1 2530 5 view .LVU2322 +2530:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 6990 .loc 1 2530 11 is_stmt 0 view .LVU2323 + 6991 0054 029B ldr r3, [sp, #8] + 6992 0056 0393 str r3, [sp, #12] + 6993 .L471: +2533:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6994 .loc 1 2533 3 is_stmt 1 view .LVU2324 +2533:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6995 .loc 1 2533 7 is_stmt 0 view .LVU2325 + 6996 0058 5368 ldr r3, [r2, #4] +2533:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 6997 .loc 1 2533 6 view .LVU2326 + 6998 005a 13F0400F tst r3, #64 + 6999 005e 12D0 beq .L475 +2535:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Wait HAL_SPI_STATE_ABORT state */ + 7000 .loc 1 2535 5 is_stmt 1 view .LVU2327 +2535:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Wait HAL_SPI_STATE_ABORT state */ + 7001 .loc 1 2535 17 is_stmt 0 view .LVU2328 + 7002 0060 3C4B ldr r3, .L496+12 + 7003 0062 E364 str r3, [r4, #76] + 7004 .L478: +2537:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7005 .loc 1 2537 5 is_stmt 1 view .LVU2329 +2539:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7006 .loc 1 2539 7 view .LVU2330 +2539:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7007 .loc 1 2539 17 is_stmt 0 view .LVU2331 + 7008 0064 039B ldr r3, [sp, #12] +2539:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7009 .loc 1 2539 10 view .LVU2332 + 7010 0066 43B1 cbz r3, .L494 + ARM GAS /tmp/ccywxtmH.s page 238 + + +2544:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } while (hspi->State != HAL_SPI_STATE_ABORT); + 7011 .loc 1 2544 7 is_stmt 1 view .LVU2333 +2544:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } while (hspi->State != HAL_SPI_STATE_ABORT); + 7012 .loc 1 2544 12 is_stmt 0 view .LVU2334 + 7013 0068 039B ldr r3, [sp, #12] + 7014 006a 013B subs r3, r3, #1 + 7015 006c 0393 str r3, [sp, #12] +2545:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Reset Timeout Counter */ + 7016 .loc 1 2545 26 is_stmt 1 view .LVU2335 +2545:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Reset Timeout Counter */ + 7017 .loc 1 2545 18 is_stmt 0 view .LVU2336 + 7018 006e 94F85D30 ldrb r3, [r4, #93] @ zero_extendqisi2 + 7019 0072 DBB2 uxtb r3, r3 +2545:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Reset Timeout Counter */ + 7020 .loc 1 2545 26 view .LVU2337 + 7021 0074 072B cmp r3, #7 + 7022 0076 F5D1 bne .L478 + 7023 0078 03E0 b .L477 + 7024 .L494: +2541:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** break; + 7025 .loc 1 2541 9 is_stmt 1 view .LVU2338 + 7026 007a 236E ldr r3, [r4, #96] + 7027 007c 43F04003 orr r3, r3, #64 + 7028 0080 2366 str r3, [r4, #96] +2542:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 7029 .loc 1 2542 9 view .LVU2339 + 7030 .L477: +2547:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 7031 .loc 1 2547 5 view .LVU2340 +2547:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 7032 .loc 1 2547 11 is_stmt 0 view .LVU2341 + 7033 0082 029B ldr r3, [sp, #8] + 7034 0084 0393 str r3, [sp, #12] + 7035 .L475: +2553:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7036 .loc 1 2553 3 is_stmt 1 view .LVU2342 +2553:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7037 .loc 1 2553 11 is_stmt 0 view .LVU2343 + 7038 0086 636D ldr r3, [r4, #84] +2553:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7039 .loc 1 2553 6 view .LVU2344 + 7040 0088 2BB1 cbz r3, .L479 +2557:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7041 .loc 1 2557 5 is_stmt 1 view .LVU2345 +2557:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7042 .loc 1 2557 9 is_stmt 0 view .LVU2346 + 7043 008a 5268 ldr r2, [r2, #4] +2557:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7044 .loc 1 2557 8 view .LVU2347 + 7045 008c 12F0020F tst r2, #2 + 7046 0090 1BD0 beq .L480 +2559:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 7047 .loc 1 2559 7 is_stmt 1 view .LVU2348 +2559:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 7048 .loc 1 2559 39 is_stmt 0 view .LVU2349 + 7049 0092 314A ldr r2, .L496+16 + 7050 0094 5A63 str r2, [r3, #52] + ARM GAS /tmp/ccywxtmH.s page 239 + + + 7051 .L479: +2567:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7052 .loc 1 2567 3 is_stmt 1 view .LVU2350 +2567:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7053 .loc 1 2567 11 is_stmt 0 view .LVU2351 + 7054 0096 A36D ldr r3, [r4, #88] +2567:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7055 .loc 1 2567 6 view .LVU2352 + 7056 0098 33B1 cbz r3, .L481 +2571:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7057 .loc 1 2571 5 is_stmt 1 view .LVU2353 +2571:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7058 .loc 1 2571 9 is_stmt 0 view .LVU2354 + 7059 009a 2268 ldr r2, [r4] + 7060 009c 5268 ldr r2, [r2, #4] +2571:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7061 .loc 1 2571 8 view .LVU2355 + 7062 009e 12F0010F tst r2, #1 + 7063 00a2 15D0 beq .L482 +2573:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 7064 .loc 1 2573 7 is_stmt 1 view .LVU2356 +2573:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 7065 .loc 1 2573 39 is_stmt 0 view .LVU2357 + 7066 00a4 2D4A ldr r2, .L496+20 + 7067 00a6 5A63 str r2, [r3, #52] + 7068 .L481: +2582:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7069 .loc 1 2582 3 is_stmt 1 view .LVU2358 +2582:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7070 .loc 1 2582 7 is_stmt 0 view .LVU2359 + 7071 00a8 2368 ldr r3, [r4] + 7072 00aa 5B68 ldr r3, [r3, #4] +2582:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7073 .loc 1 2582 6 view .LVU2360 + 7074 00ac 13F0020F tst r3, #2 + 7075 00b0 11D0 beq .L487 +2585:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7076 .loc 1 2585 5 is_stmt 1 view .LVU2361 +2585:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7077 .loc 1 2585 13 is_stmt 0 view .LVU2362 + 7078 00b2 606D ldr r0, [r4, #84] + 7079 .LVL440: +2585:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7080 .loc 1 2585 8 view .LVU2363 + 7081 00b4 28B3 cbz r0, .L488 +2588:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7082 .loc 1 2588 7 is_stmt 1 view .LVU2364 +2588:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7083 .loc 1 2588 11 is_stmt 0 view .LVU2365 + 7084 00b6 FFF7FEFF bl HAL_DMA_Abort_IT + 7085 .LVL441: +2588:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7086 .loc 1 2588 10 view .LVU2366 + 7087 00ba 20B3 cbz r0, .L489 +2590:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + 7088 .loc 1 2590 9 is_stmt 1 view .LVU2367 +2590:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + ARM GAS /tmp/ccywxtmH.s page 240 + + + 7089 .loc 1 2590 13 is_stmt 0 view .LVU2368 + 7090 00bc 636D ldr r3, [r4, #84] +2590:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + 7091 .loc 1 2590 41 view .LVU2369 + 7092 00be 0022 movs r2, #0 + 7093 00c0 5A63 str r2, [r3, #52] +2591:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 7094 .loc 1 2591 9 is_stmt 1 view .LVU2370 +2591:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 7095 .loc 1 2591 25 is_stmt 0 view .LVU2371 + 7096 00c2 4023 movs r3, #64 + 7097 00c4 2366 str r3, [r4, #96] +2508:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** resetcount = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U); + 7098 .loc 1 2508 13 view .LVU2372 + 7099 00c6 0126 movs r6, #1 + 7100 00c8 06E0 b .L483 + 7101 .LVL442: + 7102 .L480: +2563:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 7103 .loc 1 2563 7 is_stmt 1 view .LVU2373 +2563:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 7104 .loc 1 2563 39 is_stmt 0 view .LVU2374 + 7105 00ca 0022 movs r2, #0 + 7106 00cc 5A63 str r2, [r3, #52] + 7107 00ce E2E7 b .L479 + 7108 .L482: +2577:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 7109 .loc 1 2577 7 is_stmt 1 view .LVU2375 +2577:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 7110 .loc 1 2577 39 is_stmt 0 view .LVU2376 + 7111 00d0 0022 movs r2, #0 + 7112 00d2 5A63 str r2, [r3, #52] + 7113 00d4 E8E7 b .L481 + 7114 .L487: +2508:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** resetcount = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U); + 7115 .loc 1 2508 13 view .LVU2377 + 7116 00d6 0126 movs r6, #1 + 7117 .LVL443: + 7118 .L483: +2600:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7119 .loc 1 2600 3 is_stmt 1 view .LVU2378 +2600:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7120 .loc 1 2600 7 is_stmt 0 view .LVU2379 + 7121 00d8 2368 ldr r3, [r4] + 7122 00da 5B68 ldr r3, [r3, #4] +2600:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7123 .loc 1 2600 6 view .LVU2380 + 7124 00dc 13F0010F tst r3, #1 + 7125 00e0 0AD0 beq .L484 +2603:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7126 .loc 1 2603 5 is_stmt 1 view .LVU2381 +2603:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7127 .loc 1 2603 13 is_stmt 0 view .LVU2382 + 7128 00e2 A06D ldr r0, [r4, #88] +2603:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7129 .loc 1 2603 8 view .LVU2383 + 7130 00e4 40B1 cbz r0, .L484 + ARM GAS /tmp/ccywxtmH.s page 241 + + +2606:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7131 .loc 1 2606 7 is_stmt 1 view .LVU2384 +2606:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7132 .loc 1 2606 11 is_stmt 0 view .LVU2385 + 7133 00e6 FFF7FEFF bl HAL_DMA_Abort_IT + 7134 .LVL444: +2606:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7135 .loc 1 2606 10 view .LVU2386 + 7136 00ea 0546 mov r5, r0 + 7137 00ec 30B1 cbz r0, .L485 +2608:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + 7138 .loc 1 2608 9 is_stmt 1 view .LVU2387 +2608:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + 7139 .loc 1 2608 13 is_stmt 0 view .LVU2388 + 7140 00ee A36D ldr r3, [r4, #88] +2608:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->ErrorCode = HAL_SPI_ERROR_ABORT; + 7141 .loc 1 2608 41 view .LVU2389 + 7142 00f0 0022 movs r2, #0 + 7143 00f2 5A63 str r2, [r3, #52] +2609:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 7144 .loc 1 2609 9 is_stmt 1 view .LVU2390 +2609:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 7145 .loc 1 2609 25 is_stmt 0 view .LVU2391 + 7146 00f4 4023 movs r3, #64 + 7147 00f6 2366 str r3, [r4, #96] + 7148 .L484: +2618:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7149 .loc 1 2618 3 is_stmt 1 view .LVU2392 +2618:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7150 .loc 1 2618 6 is_stmt 0 view .LVU2393 + 7151 00f8 3EB9 cbnz r6, .L495 +2507:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** abortcplt = 1U; + 7152 .loc 1 2507 13 view .LVU2394 + 7153 00fa 0025 movs r5, #0 + 7154 .LVL445: + 7155 .L485: +2651:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 7156 .loc 1 2651 3 is_stmt 1 view .LVU2395 +2652:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7157 .loc 1 2652 1 is_stmt 0 view .LVU2396 + 7158 00fc 2846 mov r0, r5 + 7159 00fe 04B0 add sp, sp, #16 + 7160 .cfi_remember_state + 7161 .cfi_def_cfa_offset 16 + 7162 @ sp needed + 7163 0100 70BD pop {r4, r5, r6, pc} + 7164 .LVL446: + 7165 .L488: + 7166 .cfi_restore_state +2508:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** resetcount = SPI_DEFAULT_TIMEOUT * (SystemCoreClock / 24U / 1000U); + 7167 .loc 1 2508 13 view .LVU2397 + 7168 0102 0126 movs r6, #1 + 7169 0104 E8E7 b .L483 + 7170 .L489: +2595:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 7171 .loc 1 2595 19 view .LVU2398 + 7172 0106 0026 movs r6, #0 + ARM GAS /tmp/ccywxtmH.s page 242 + + + 7173 0108 E6E7 b .L483 + 7174 .LVL447: + 7175 .L495: +2621:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = 0U; + 7176 .loc 1 2621 5 is_stmt 1 view .LVU2399 +2621:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = 0U; + 7177 .loc 1 2621 23 is_stmt 0 view .LVU2400 + 7178 010a 0023 movs r3, #0 + 7179 010c A4F84630 strh r3, [r4, #70] @ movhi +2622:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7180 .loc 1 2622 5 is_stmt 1 view .LVU2401 +2622:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7181 .loc 1 2622 23 is_stmt 0 view .LVU2402 + 7182 0110 E387 strh r3, [r4, #62] @ movhi +2625:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7183 .loc 1 2625 5 is_stmt 1 view .LVU2403 +2625:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7184 .loc 1 2625 13 is_stmt 0 view .LVU2404 + 7185 0112 236E ldr r3, [r4, #96] +2625:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7186 .loc 1 2625 8 view .LVU2405 + 7187 0114 402B cmp r3, #64 + 7188 0116 14D0 beq .L491 +2633:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 7189 .loc 1 2633 7 is_stmt 1 view .LVU2406 +2633:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 7190 .loc 1 2633 23 is_stmt 0 view .LVU2407 + 7191 0118 0025 movs r5, #0 + 7192 011a 2566 str r5, [r4, #96] + 7193 .L486: + 7194 .LVL448: +2637:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_FREFLAG(hspi); + 7195 .loc 1 2637 5 is_stmt 1 view .LVU2408 + 7196 .LBB11: +2637:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_FREFLAG(hspi); + 7197 .loc 1 2637 5 view .LVU2409 + 7198 011c 0022 movs r2, #0 + 7199 011e 0092 str r2, [sp] +2637:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_FREFLAG(hspi); + 7200 .loc 1 2637 5 view .LVU2410 + 7201 0120 2368 ldr r3, [r4] + 7202 0122 D968 ldr r1, [r3, #12] + 7203 0124 0091 str r1, [sp] +2637:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_FREFLAG(hspi); + 7204 .loc 1 2637 5 view .LVU2411 + 7205 0126 9968 ldr r1, [r3, #8] + 7206 0128 0091 str r1, [sp] +2637:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_FREFLAG(hspi); + 7207 .loc 1 2637 5 view .LVU2412 + 7208 012a 0099 ldr r1, [sp] + 7209 .LBE11: +2637:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_FREFLAG(hspi); + 7210 .loc 1 2637 5 view .LVU2413 +2638:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7211 .loc 1 2638 5 view .LVU2414 + 7212 .LBB12: +2638:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + ARM GAS /tmp/ccywxtmH.s page 243 + + + 7213 .loc 1 2638 5 view .LVU2415 + 7214 012c 0192 str r2, [sp, #4] +2638:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7215 .loc 1 2638 5 view .LVU2416 + 7216 012e 9B68 ldr r3, [r3, #8] + 7217 0130 0193 str r3, [sp, #4] +2638:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7218 .loc 1 2638 5 view .LVU2417 + 7219 0132 019B ldr r3, [sp, #4] + 7220 .LBE12: +2638:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7221 .loc 1 2638 5 view .LVU2418 +2641:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7222 .loc 1 2641 5 view .LVU2419 +2641:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7223 .loc 1 2641 17 is_stmt 0 view .LVU2420 + 7224 0134 0123 movs r3, #1 + 7225 0136 84F85D30 strb r3, [r4, #93] +2647:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + 7226 .loc 1 2647 5 is_stmt 1 view .LVU2421 + 7227 013a 2046 mov r0, r4 + 7228 013c FFF7FEFF bl HAL_SPI_AbortCpltCallback + 7229 .LVL449: + 7230 0140 DCE7 b .L485 + 7231 .LVL450: + 7232 .L491: +2628:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 7233 .loc 1 2628 17 is_stmt 0 view .LVU2422 + 7234 0142 0125 movs r5, #1 + 7235 0144 EAE7 b .L486 + 7236 .L497: + 7237 0146 00BF .align 2 + 7238 .L496: + 7239 0148 00000000 .word SystemCoreClock + 7240 014c F1197605 .word 91625969 + 7241 0150 00000000 .word SPI_AbortTx_ISR + 7242 0154 00000000 .word SPI_AbortRx_ISR + 7243 0158 00000000 .word SPI_DMATxAbortCallback + 7244 015c 00000000 .word SPI_DMARxAbortCallback + 7245 .cfi_endproc + 7246 .LFE144: + 7248 .section .text.SPI_DMARxAbortCallback,"ax",%progbits + 7249 .align 1 + 7250 .syntax unified + 7251 .thumb + 7252 .thumb_func + 7254 SPI_DMARxAbortCallback: + 7255 .LVL451: + 7256 .LFB168: +3473:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogati + 7257 .loc 1 3473 1 is_stmt 1 view -0 + 7258 .cfi_startproc + 7259 @ args = 0, pretend = 0, frame = 8 + 7260 @ frame_needed = 0, uses_anonymous_args = 0 +3473:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogati + 7261 .loc 1 3473 1 is_stmt 0 view .LVU2424 + 7262 0000 30B5 push {r4, r5, lr} + ARM GAS /tmp/ccywxtmH.s page 244 + + + 7263 .cfi_def_cfa_offset 12 + 7264 .cfi_offset 4, -12 + 7265 .cfi_offset 5, -8 + 7266 .cfi_offset 14, -4 + 7267 0002 85B0 sub sp, sp, #20 + 7268 .cfi_def_cfa_offset 32 +3474:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7269 .loc 1 3474 3 is_stmt 1 view .LVU2425 +3474:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7270 .loc 1 3474 22 is_stmt 0 view .LVU2426 + 7271 0004 446A ldr r4, [r0, #36] + 7272 .LVL452: +3477:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7273 .loc 1 3477 3 is_stmt 1 view .LVU2427 + 7274 0006 2268 ldr r2, [r4] + 7275 0008 1368 ldr r3, [r2] + 7276 000a 23F04003 bic r3, r3, #64 + 7277 000e 1360 str r3, [r2] +3479:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7278 .loc 1 3479 3 view .LVU2428 +3479:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7279 .loc 1 3479 7 is_stmt 0 view .LVU2429 + 7280 0010 A36D ldr r3, [r4, #88] +3479:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7281 .loc 1 3479 35 view .LVU2430 + 7282 0012 0025 movs r5, #0 + 7283 0014 5D63 str r5, [r3, #52] +3482:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7284 .loc 1 3482 3 is_stmt 1 view .LVU2431 + 7285 0016 2268 ldr r2, [r4] + 7286 0018 5368 ldr r3, [r2, #4] + 7287 001a 23F00103 bic r3, r3, #1 + 7288 001e 5360 str r3, [r2, #4] +3485:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7289 .loc 1 3485 3 view .LVU2432 +3485:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7290 .loc 1 3485 7 is_stmt 0 view .LVU2433 + 7291 0020 FFF7FEFF bl HAL_GetTick + 7292 .LVL453: +3485:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7293 .loc 1 3485 7 view .LVU2434 + 7294 0024 0090 str r0, [sp] + 7295 0026 6423 movs r3, #100 + 7296 0028 2A46 mov r2, r5 + 7297 002a 8021 movs r1, #128 + 7298 002c 2046 mov r0, r4 + 7299 002e FFF7FEFF bl SPI_WaitFlagStateUntilTimeout + 7300 .LVL454: +3485:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7301 .loc 1 3485 6 view .LVU2435 + 7302 0032 08B1 cbz r0, .L499 +3487:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 7303 .loc 1 3487 5 is_stmt 1 view .LVU2436 +3487:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 7304 .loc 1 3487 21 is_stmt 0 view .LVU2437 + 7305 0034 4023 movs r3, #64 + 7306 0036 2366 str r3, [r4, #96] + ARM GAS /tmp/ccywxtmH.s page 245 + + + 7307 .L499: +3491:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7308 .loc 1 3491 3 is_stmt 1 view .LVU2438 +3491:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7309 .loc 1 3491 7 is_stmt 0 view .LVU2439 + 7310 0038 FFF7FEFF bl HAL_GetTick + 7311 .LVL455: + 7312 003c 0090 str r0, [sp] + 7313 003e 6423 movs r3, #100 + 7314 0040 0022 movs r2, #0 + 7315 0042 4FF4C061 mov r1, #1536 + 7316 0046 2046 mov r0, r4 + 7317 0048 FFF7FEFF bl SPI_WaitFifoStateUntilTimeout + 7318 .LVL456: +3491:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7319 .loc 1 3491 6 view .LVU2440 + 7320 004c 08B1 cbz r0, .L500 +3493:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 7321 .loc 1 3493 5 is_stmt 1 view .LVU2441 +3493:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 7322 .loc 1 3493 21 is_stmt 0 view .LVU2442 + 7323 004e 4023 movs r3, #64 + 7324 0050 2366 str r3, [r4, #96] + 7325 .L500: +3497:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7326 .loc 1 3497 3 is_stmt 1 view .LVU2443 +3497:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7327 .loc 1 3497 11 is_stmt 0 view .LVU2444 + 7328 0052 636D ldr r3, [r4, #84] +3497:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7329 .loc 1 3497 6 view .LVU2445 + 7330 0054 0BB1 cbz r3, .L501 +3499:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7331 .loc 1 3499 5 is_stmt 1 view .LVU2446 +3499:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7332 .loc 1 3499 21 is_stmt 0 view .LVU2447 + 7333 0056 5B6B ldr r3, [r3, #52] +3499:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7334 .loc 1 3499 8 view .LVU2448 + 7335 0058 D3B9 cbnz r3, .L498 + 7336 .L501: +3506:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = 0U; + 7337 .loc 1 3506 3 is_stmt 1 view .LVU2449 +3506:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = 0U; + 7338 .loc 1 3506 21 is_stmt 0 view .LVU2450 + 7339 005a 0023 movs r3, #0 + 7340 005c A4F84630 strh r3, [r4, #70] @ movhi +3507:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7341 .loc 1 3507 3 is_stmt 1 view .LVU2451 +3507:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7342 .loc 1 3507 21 is_stmt 0 view .LVU2452 + 7343 0060 E387 strh r3, [r4, #62] @ movhi +3510:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7344 .loc 1 3510 3 is_stmt 1 view .LVU2453 +3510:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7345 .loc 1 3510 11 is_stmt 0 view .LVU2454 + 7346 0062 236E ldr r3, [r4, #96] + ARM GAS /tmp/ccywxtmH.s page 246 + + +3510:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7347 .loc 1 3510 6 view .LVU2455 + 7348 0064 402B cmp r3, #64 + 7349 0066 01D0 beq .L503 +3513:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 7350 .loc 1 3513 5 is_stmt 1 view .LVU2456 +3513:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 7351 .loc 1 3513 21 is_stmt 0 view .LVU2457 + 7352 0068 0023 movs r3, #0 + 7353 006a 2366 str r3, [r4, #96] + 7354 .L503: +3517:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_FREFLAG(hspi); + 7355 .loc 1 3517 3 is_stmt 1 view .LVU2458 + 7356 .LBB13: +3517:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_FREFLAG(hspi); + 7357 .loc 1 3517 3 view .LVU2459 + 7358 006c 0022 movs r2, #0 + 7359 006e 0292 str r2, [sp, #8] +3517:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_FREFLAG(hspi); + 7360 .loc 1 3517 3 view .LVU2460 + 7361 0070 2368 ldr r3, [r4] + 7362 0072 D968 ldr r1, [r3, #12] + 7363 0074 0291 str r1, [sp, #8] +3517:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_FREFLAG(hspi); + 7364 .loc 1 3517 3 view .LVU2461 + 7365 0076 9968 ldr r1, [r3, #8] + 7366 0078 0291 str r1, [sp, #8] +3517:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_FREFLAG(hspi); + 7367 .loc 1 3517 3 view .LVU2462 + 7368 007a 0299 ldr r1, [sp, #8] + 7369 .LBE13: +3517:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_FREFLAG(hspi); + 7370 .loc 1 3517 3 view .LVU2463 +3518:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7371 .loc 1 3518 3 view .LVU2464 + 7372 .LBB14: +3518:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7373 .loc 1 3518 3 view .LVU2465 + 7374 007c 0392 str r2, [sp, #12] +3518:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7375 .loc 1 3518 3 view .LVU2466 + 7376 007e 9B68 ldr r3, [r3, #8] + 7377 0080 0393 str r3, [sp, #12] +3518:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7378 .loc 1 3518 3 view .LVU2467 + 7379 0082 039B ldr r3, [sp, #12] + 7380 .LBE14: +3518:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7381 .loc 1 3518 3 view .LVU2468 +3521:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7382 .loc 1 3521 3 view .LVU2469 +3521:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7383 .loc 1 3521 16 is_stmt 0 view .LVU2470 + 7384 0084 0123 movs r3, #1 + 7385 0086 84F85D30 strb r3, [r4, #93] +3527:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + 7386 .loc 1 3527 3 is_stmt 1 view .LVU2471 + ARM GAS /tmp/ccywxtmH.s page 247 + + + 7387 008a 2046 mov r0, r4 + 7388 008c FFF7FEFF bl HAL_SPI_AbortCpltCallback + 7389 .LVL457: + 7390 .L498: +3529:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7391 .loc 1 3529 1 is_stmt 0 view .LVU2472 + 7392 0090 05B0 add sp, sp, #20 + 7393 .cfi_def_cfa_offset 12 + 7394 @ sp needed + 7395 0092 30BD pop {r4, r5, pc} +3529:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7396 .loc 1 3529 1 view .LVU2473 + 7397 .cfi_endproc + 7398 .LFE168: + 7400 .section .text.SPI_DMATxAbortCallback,"ax",%progbits + 7401 .align 1 + 7402 .syntax unified + 7403 .thumb + 7404 .thumb_func + 7406 SPI_DMATxAbortCallback: + 7407 .LVL458: + 7408 .LFB167: +3407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogati + 7409 .loc 1 3407 1 is_stmt 1 view -0 + 7410 .cfi_startproc + 7411 @ args = 0, pretend = 0, frame = 8 + 7412 @ frame_needed = 0, uses_anonymous_args = 0 +3407:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)(((DMA_HandleTypeDef *)hdma)->Parent); /* Derogati + 7413 .loc 1 3407 1 is_stmt 0 view .LVU2475 + 7414 0000 10B5 push {r4, lr} + 7415 .cfi_def_cfa_offset 8 + 7416 .cfi_offset 4, -8 + 7417 .cfi_offset 14, -4 + 7418 0002 84B0 sub sp, sp, #16 + 7419 .cfi_def_cfa_offset 24 +3408:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7420 .loc 1 3408 3 is_stmt 1 view .LVU2476 +3408:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7421 .loc 1 3408 22 is_stmt 0 view .LVU2477 + 7422 0004 446A ldr r4, [r0, #36] + 7423 .LVL459: +3410:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7424 .loc 1 3410 3 is_stmt 1 view .LVU2478 +3410:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7425 .loc 1 3410 7 is_stmt 0 view .LVU2479 + 7426 0006 636D ldr r3, [r4, #84] +3410:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7427 .loc 1 3410 35 view .LVU2480 + 7428 0008 0022 movs r2, #0 + 7429 000a 5A63 str r2, [r3, #52] +3413:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7430 .loc 1 3413 3 is_stmt 1 view .LVU2481 + 7431 000c 2268 ldr r2, [r4] + 7432 000e 5368 ldr r3, [r2, #4] + 7433 0010 23F00203 bic r3, r3, #2 + 7434 0014 5360 str r3, [r2, #4] +3415:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + ARM GAS /tmp/ccywxtmH.s page 248 + + + 7435 .loc 1 3415 3 view .LVU2482 +3415:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7436 .loc 1 3415 7 is_stmt 0 view .LVU2483 + 7437 0016 FFF7FEFF bl HAL_GetTick + 7438 .LVL460: +3415:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7439 .loc 1 3415 7 view .LVU2484 + 7440 001a 0246 mov r2, r0 + 7441 001c 6421 movs r1, #100 + 7442 001e 2046 mov r0, r4 + 7443 0020 FFF7FEFF bl SPI_EndRxTxTransaction + 7444 .LVL461: +3415:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7445 .loc 1 3415 6 view .LVU2485 + 7446 0024 08B1 cbz r0, .L506 +3417:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 7447 .loc 1 3417 5 is_stmt 1 view .LVU2486 +3417:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 7448 .loc 1 3417 21 is_stmt 0 view .LVU2487 + 7449 0026 4023 movs r3, #64 + 7450 0028 2366 str r3, [r4, #96] + 7451 .L506: +3421:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7452 .loc 1 3421 3 is_stmt 1 view .LVU2488 + 7453 002a 2268 ldr r2, [r4] + 7454 002c 1368 ldr r3, [r2] + 7455 002e 23F04003 bic r3, r3, #64 + 7456 0032 1360 str r3, [r2] +3424:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7457 .loc 1 3424 3 view .LVU2489 +3424:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7458 .loc 1 3424 7 is_stmt 0 view .LVU2490 + 7459 0034 FFF7FEFF bl HAL_GetTick + 7460 .LVL462: + 7461 0038 0090 str r0, [sp] + 7462 003a 6423 movs r3, #100 + 7463 003c 0022 movs r2, #0 + 7464 003e 4FF4C061 mov r1, #1536 + 7465 0042 2046 mov r0, r4 + 7466 0044 FFF7FEFF bl SPI_WaitFifoStateUntilTimeout + 7467 .LVL463: +3424:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7468 .loc 1 3424 6 view .LVU2491 + 7469 0048 08B1 cbz r0, .L507 +3426:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 7470 .loc 1 3426 5 is_stmt 1 view .LVU2492 +3426:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 7471 .loc 1 3426 21 is_stmt 0 view .LVU2493 + 7472 004a 4023 movs r3, #64 + 7473 004c 2366 str r3, [r4, #96] + 7474 .L507: +3430:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7475 .loc 1 3430 3 is_stmt 1 view .LVU2494 +3430:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7476 .loc 1 3430 11 is_stmt 0 view .LVU2495 + 7477 004e A36D ldr r3, [r4, #88] +3430:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + ARM GAS /tmp/ccywxtmH.s page 249 + + + 7478 .loc 1 3430 6 view .LVU2496 + 7479 0050 0BB1 cbz r3, .L508 +3432:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7480 .loc 1 3432 5 is_stmt 1 view .LVU2497 +3432:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7481 .loc 1 3432 21 is_stmt 0 view .LVU2498 + 7482 0052 5B6B ldr r3, [r3, #52] +3432:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7483 .loc 1 3432 8 view .LVU2499 + 7484 0054 D3B9 cbnz r3, .L505 + 7485 .L508: +3439:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = 0U; + 7486 .loc 1 3439 3 is_stmt 1 view .LVU2500 +3439:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** hspi->TxXferCount = 0U; + 7487 .loc 1 3439 21 is_stmt 0 view .LVU2501 + 7488 0056 0023 movs r3, #0 + 7489 0058 A4F84630 strh r3, [r4, #70] @ movhi +3440:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7490 .loc 1 3440 3 is_stmt 1 view .LVU2502 +3440:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7491 .loc 1 3440 21 is_stmt 0 view .LVU2503 + 7492 005c E387 strh r3, [r4, #62] @ movhi +3443:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7493 .loc 1 3443 3 is_stmt 1 view .LVU2504 +3443:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7494 .loc 1 3443 11 is_stmt 0 view .LVU2505 + 7495 005e 236E ldr r3, [r4, #96] +3443:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** { + 7496 .loc 1 3443 6 view .LVU2506 + 7497 0060 402B cmp r3, #64 + 7498 0062 01D0 beq .L510 +3446:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 7499 .loc 1 3446 5 is_stmt 1 view .LVU2507 +3446:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 7500 .loc 1 3446 21 is_stmt 0 view .LVU2508 + 7501 0064 0023 movs r3, #0 + 7502 0066 2366 str r3, [r4, #96] + 7503 .L510: +3450:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_FREFLAG(hspi); + 7504 .loc 1 3450 3 is_stmt 1 view .LVU2509 + 7505 .LBB15: +3450:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_FREFLAG(hspi); + 7506 .loc 1 3450 3 view .LVU2510 + 7507 0068 0022 movs r2, #0 + 7508 006a 0292 str r2, [sp, #8] +3450:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_FREFLAG(hspi); + 7509 .loc 1 3450 3 view .LVU2511 + 7510 006c 2368 ldr r3, [r4] + 7511 006e D968 ldr r1, [r3, #12] + 7512 0070 0291 str r1, [sp, #8] +3450:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_FREFLAG(hspi); + 7513 .loc 1 3450 3 view .LVU2512 + 7514 0072 9968 ldr r1, [r3, #8] + 7515 0074 0291 str r1, [sp, #8] +3450:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_FREFLAG(hspi); + 7516 .loc 1 3450 3 view .LVU2513 + 7517 0076 0299 ldr r1, [sp, #8] + ARM GAS /tmp/ccywxtmH.s page 250 + + + 7518 .LBE15: +3450:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** __HAL_SPI_CLEAR_FREFLAG(hspi); + 7519 .loc 1 3450 3 view .LVU2514 +3451:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7520 .loc 1 3451 3 view .LVU2515 + 7521 .LBB16: +3451:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7522 .loc 1 3451 3 view .LVU2516 + 7523 0078 0392 str r2, [sp, #12] +3451:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7524 .loc 1 3451 3 view .LVU2517 + 7525 007a 9B68 ldr r3, [r3, #8] + 7526 007c 0393 str r3, [sp, #12] +3451:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7527 .loc 1 3451 3 view .LVU2518 + 7528 007e 039B ldr r3, [sp, #12] + 7529 .LBE16: +3451:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7530 .loc 1 3451 3 view .LVU2519 +3454:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7531 .loc 1 3454 3 view .LVU2520 +3454:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7532 .loc 1 3454 16 is_stmt 0 view .LVU2521 + 7533 0080 0123 movs r3, #1 + 7534 0082 84F85D30 strb r3, [r4, #93] +3460:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** #endif /* USE_HAL_SPI_REGISTER_CALLBACKS */ + 7535 .loc 1 3460 3 is_stmt 1 view .LVU2522 + 7536 0086 2046 mov r0, r4 + 7537 0088 FFF7FEFF bl HAL_SPI_AbortCpltCallback + 7538 .LVL464: + 7539 .L505: +3462:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7540 .loc 1 3462 1 is_stmt 0 view .LVU2523 + 7541 008c 04B0 add sp, sp, #16 + 7542 .cfi_def_cfa_offset 8 + 7543 @ sp needed + 7544 008e 10BD pop {r4, pc} +3462:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7545 .loc 1 3462 1 view .LVU2524 + 7546 .cfi_endproc + 7547 .LFE167: + 7549 .section .text.HAL_SPI_GetState,"ax",%progbits + 7550 .align 1 + 7551 .global HAL_SPI_GetState + 7552 .syntax unified + 7553 .thumb + 7554 .thumb_func + 7556 HAL_SPI_GetState: + 7557 .LVL465: + 7558 .LFB157: +2997:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Return SPI handle state */ + 7559 .loc 1 2997 1 is_stmt 1 view -0 + 7560 .cfi_startproc + 7561 @ args = 0, pretend = 0, frame = 0 + 7562 @ frame_needed = 0, uses_anonymous_args = 0 + 7563 @ link register save eliminated. +2999:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + ARM GAS /tmp/ccywxtmH.s page 251 + + + 7564 .loc 1 2999 3 view .LVU2526 +2999:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 7565 .loc 1 2999 14 is_stmt 0 view .LVU2527 + 7566 0000 90F85D00 ldrb r0, [r0, #93] @ zero_extendqisi2 + 7567 .LVL466: +3000:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7568 .loc 1 3000 1 view .LVU2528 + 7569 0004 7047 bx lr + 7570 .cfi_endproc + 7571 .LFE157: + 7573 .section .text.HAL_SPI_GetError,"ax",%progbits + 7574 .align 1 + 7575 .global HAL_SPI_GetError + 7576 .syntax unified + 7577 .thumb + 7578 .thumb_func + 7580 HAL_SPI_GetError: + 7581 .LVL467: + 7582 .LFB158: +3009:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** /* Return SPI ErrorCode */ + 7583 .loc 1 3009 1 is_stmt 1 view -0 + 7584 .cfi_startproc + 7585 @ args = 0, pretend = 0, frame = 0 + 7586 @ frame_needed = 0, uses_anonymous_args = 0 + 7587 @ link register save eliminated. +3011:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 7588 .loc 1 3011 3 view .LVU2530 +3011:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** } + 7589 .loc 1 3011 14 is_stmt 0 view .LVU2531 + 7590 0000 006E ldr r0, [r0, #96] + 7591 .LVL468: +3012:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi.c **** + 7592 .loc 1 3012 1 view .LVU2532 + 7593 0002 7047 bx lr + 7594 .cfi_endproc + 7595 .LFE158: + 7597 .text + 7598 .Letext0: + 7599 .file 2 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 7600 .file 3 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 7601 .file 4 "Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h" + 7602 .file 5 "Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h" + 7603 .file 6 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h" + 7604 .file 7 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h" + 7605 .file 8 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h" + 7606 .file 9 "Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h" + 7607 .file 10 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h" + ARM GAS /tmp/ccywxtmH.s page 252 + + +DEFINED SYMBOLS + *ABS*:0000000000000000 stm32f3xx_hal_spi.c + /tmp/ccywxtmH.s:21 .text.SPI_WaitFlagStateUntilTimeout:0000000000000000 $t + /tmp/ccywxtmH.s:26 .text.SPI_WaitFlagStateUntilTimeout:0000000000000000 SPI_WaitFlagStateUntilTimeout + /tmp/ccywxtmH.s:200 .text.SPI_WaitFlagStateUntilTimeout:00000000000000c4 $d + /tmp/ccywxtmH.s:205 .text.SPI_WaitFifoStateUntilTimeout:0000000000000000 $t + /tmp/ccywxtmH.s:210 .text.SPI_WaitFifoStateUntilTimeout:0000000000000000 SPI_WaitFifoStateUntilTimeout + /tmp/ccywxtmH.s:415 .text.SPI_WaitFifoStateUntilTimeout:00000000000000ec $d + /tmp/ccywxtmH.s:420 .text.SPI_EndRxTxTransaction:0000000000000000 $t + /tmp/ccywxtmH.s:425 .text.SPI_EndRxTxTransaction:0000000000000000 SPI_EndRxTxTransaction + /tmp/ccywxtmH.s:518 .text.SPI_EndRxTransaction:0000000000000000 $t + /tmp/ccywxtmH.s:523 .text.SPI_EndRxTransaction:0000000000000000 SPI_EndRxTransaction + /tmp/ccywxtmH.s:642 .text.SPI_AbortRx_ISR:0000000000000000 $t + /tmp/ccywxtmH.s:647 .text.SPI_AbortRx_ISR:0000000000000000 SPI_AbortRx_ISR + /tmp/ccywxtmH.s:761 .text.SPI_AbortRx_ISR:0000000000000088 $d + /tmp/ccywxtmH.s:767 .text.SPI_AbortTx_ISR:0000000000000000 $t + /tmp/ccywxtmH.s:772 .text.SPI_AbortTx_ISR:0000000000000000 SPI_AbortTx_ISR + /tmp/ccywxtmH.s:956 .text.SPI_AbortTx_ISR:00000000000000e8 $d + /tmp/ccywxtmH.s:962 .text.HAL_SPI_MspInit:0000000000000000 $t + /tmp/ccywxtmH.s:968 .text.HAL_SPI_MspInit:0000000000000000 HAL_SPI_MspInit + /tmp/ccywxtmH.s:983 .text.HAL_SPI_Init:0000000000000000 $t + /tmp/ccywxtmH.s:989 .text.HAL_SPI_Init:0000000000000000 HAL_SPI_Init + /tmp/ccywxtmH.s:1176 .text.HAL_SPI_MspDeInit:0000000000000000 $t + /tmp/ccywxtmH.s:1182 .text.HAL_SPI_MspDeInit:0000000000000000 HAL_SPI_MspDeInit + /tmp/ccywxtmH.s:1197 .text.HAL_SPI_DeInit:0000000000000000 $t + /tmp/ccywxtmH.s:1203 .text.HAL_SPI_DeInit:0000000000000000 HAL_SPI_DeInit + /tmp/ccywxtmH.s:1260 .text.HAL_SPI_Transmit:0000000000000000 $t + /tmp/ccywxtmH.s:1266 .text.HAL_SPI_Transmit:0000000000000000 HAL_SPI_Transmit + /tmp/ccywxtmH.s:1730 .text.HAL_SPI_TransmitReceive:0000000000000000 $t + /tmp/ccywxtmH.s:1736 .text.HAL_SPI_TransmitReceive:0000000000000000 HAL_SPI_TransmitReceive + /tmp/ccywxtmH.s:2436 .text.HAL_SPI_Receive:0000000000000000 $t + /tmp/ccywxtmH.s:2442 .text.HAL_SPI_Receive:0000000000000000 HAL_SPI_Receive + /tmp/ccywxtmH.s:2804 .text.HAL_SPI_Transmit_IT:0000000000000000 $t + /tmp/ccywxtmH.s:2810 .text.HAL_SPI_Transmit_IT:0000000000000000 HAL_SPI_Transmit_IT + /tmp/ccywxtmH.s:2975 .text.HAL_SPI_Transmit_IT:00000000000000a8 $d + /tmp/ccywxtmH.s:5482 .text.SPI_TxISR_16BIT:0000000000000000 SPI_TxISR_16BIT + /tmp/ccywxtmH.s:5421 .text.SPI_TxISR_8BIT:0000000000000000 SPI_TxISR_8BIT + /tmp/ccywxtmH.s:2981 .text.HAL_SPI_TransmitReceive_IT:0000000000000000 $t + /tmp/ccywxtmH.s:2987 .text.HAL_SPI_TransmitReceive_IT:0000000000000000 HAL_SPI_TransmitReceive_IT + /tmp/ccywxtmH.s:3238 .text.HAL_SPI_TransmitReceive_IT:0000000000000104 $d + /tmp/ccywxtmH.s:6122 .text.SPI_2linesRxISR_16BIT:0000000000000000 SPI_2linesRxISR_16BIT + /tmp/ccywxtmH.s:6050 .text.SPI_2linesTxISR_16BIT:0000000000000000 SPI_2linesTxISR_16BIT + /tmp/ccywxtmH.s:5933 .text.SPI_2linesRxISR_8BIT:0000000000000000 SPI_2linesRxISR_8BIT + /tmp/ccywxtmH.s:5828 .text.SPI_2linesTxISR_8BIT:0000000000000000 SPI_2linesTxISR_8BIT + /tmp/ccywxtmH.s:3246 .text.HAL_SPI_Receive_IT:0000000000000000 $t + /tmp/ccywxtmH.s:3252 .text.HAL_SPI_Receive_IT:0000000000000000 HAL_SPI_Receive_IT + /tmp/ccywxtmH.s:3452 .text.HAL_SPI_Receive_IT:00000000000000f4 $d + /tmp/ccywxtmH.s:5672 .text.SPI_RxISR_16BIT:0000000000000000 SPI_RxISR_16BIT + /tmp/ccywxtmH.s:5611 .text.SPI_RxISR_8BIT:0000000000000000 SPI_RxISR_8BIT + /tmp/ccywxtmH.s:3458 .text.HAL_SPI_Transmit_DMA:0000000000000000 $t + /tmp/ccywxtmH.s:3464 .text.HAL_SPI_Transmit_DMA:0000000000000000 HAL_SPI_Transmit_DMA + /tmp/ccywxtmH.s:3724 .text.HAL_SPI_Transmit_DMA:0000000000000128 $d + /tmp/ccywxtmH.s:5163 .text.SPI_DMAHalfTransmitCplt:0000000000000000 SPI_DMAHalfTransmitCplt + /tmp/ccywxtmH.s:6237 .text.SPI_DMATransmitCplt:0000000000000000 SPI_DMATransmitCplt + /tmp/ccywxtmH.s:6194 .text.SPI_DMAError:0000000000000000 SPI_DMAError + /tmp/ccywxtmH.s:3731 .text.HAL_SPI_TransmitReceive_DMA:0000000000000000 $t + /tmp/ccywxtmH.s:3737 .text.HAL_SPI_TransmitReceive_DMA:0000000000000000 HAL_SPI_TransmitReceive_DMA + ARM GAS /tmp/ccywxtmH.s page 253 + + + /tmp/ccywxtmH.s:4196 .text.HAL_SPI_TransmitReceive_DMA:0000000000000218 $d + /tmp/ccywxtmH.s:5267 .text.SPI_DMAHalfTransmitReceiveCplt:0000000000000000 SPI_DMAHalfTransmitReceiveCplt + /tmp/ccywxtmH.s:6476 .text.SPI_DMATransmitReceiveCplt:0000000000000000 SPI_DMATransmitReceiveCplt + /tmp/ccywxtmH.s:5215 .text.SPI_DMAHalfReceiveCplt:0000000000000000 SPI_DMAHalfReceiveCplt + /tmp/ccywxtmH.s:6360 .text.SPI_DMAReceiveCplt:0000000000000000 SPI_DMAReceiveCplt + /tmp/ccywxtmH.s:4205 .text.HAL_SPI_Receive_DMA:0000000000000000 $t + /tmp/ccywxtmH.s:4211 .text.HAL_SPI_Receive_DMA:0000000000000000 HAL_SPI_Receive_DMA + /tmp/ccywxtmH.s:4523 .text.HAL_SPI_Receive_DMA:0000000000000188 $d + /tmp/ccywxtmH.s:4530 .text.HAL_SPI_Abort:0000000000000000 $t + /tmp/ccywxtmH.s:4536 .text.HAL_SPI_Abort:0000000000000000 HAL_SPI_Abort + /tmp/ccywxtmH.s:4876 .text.HAL_SPI_Abort:0000000000000180 $d + /tmp/ccywxtmH.s:4884 .text.HAL_SPI_DMAPause:0000000000000000 $t + /tmp/ccywxtmH.s:4890 .text.HAL_SPI_DMAPause:0000000000000000 HAL_SPI_DMAPause + /tmp/ccywxtmH.s:4934 .text.HAL_SPI_DMAResume:0000000000000000 $t + /tmp/ccywxtmH.s:4940 .text.HAL_SPI_DMAResume:0000000000000000 HAL_SPI_DMAResume + /tmp/ccywxtmH.s:4984 .text.HAL_SPI_DMAStop:0000000000000000 $t + /tmp/ccywxtmH.s:4990 .text.HAL_SPI_DMAStop:0000000000000000 HAL_SPI_DMAStop + /tmp/ccywxtmH.s:5074 .text.HAL_SPI_TxCpltCallback:0000000000000000 $t + /tmp/ccywxtmH.s:5080 .text.HAL_SPI_TxCpltCallback:0000000000000000 HAL_SPI_TxCpltCallback + /tmp/ccywxtmH.s:5095 .text.HAL_SPI_RxCpltCallback:0000000000000000 $t + /tmp/ccywxtmH.s:5101 .text.HAL_SPI_RxCpltCallback:0000000000000000 HAL_SPI_RxCpltCallback + /tmp/ccywxtmH.s:5116 .text.HAL_SPI_TxRxCpltCallback:0000000000000000 $t + /tmp/ccywxtmH.s:5122 .text.HAL_SPI_TxRxCpltCallback:0000000000000000 HAL_SPI_TxRxCpltCallback + /tmp/ccywxtmH.s:5137 .text.HAL_SPI_TxHalfCpltCallback:0000000000000000 $t + /tmp/ccywxtmH.s:5143 .text.HAL_SPI_TxHalfCpltCallback:0000000000000000 HAL_SPI_TxHalfCpltCallback + /tmp/ccywxtmH.s:5158 .text.SPI_DMAHalfTransmitCplt:0000000000000000 $t + /tmp/ccywxtmH.s:5189 .text.HAL_SPI_RxHalfCpltCallback:0000000000000000 $t + /tmp/ccywxtmH.s:5195 .text.HAL_SPI_RxHalfCpltCallback:0000000000000000 HAL_SPI_RxHalfCpltCallback + /tmp/ccywxtmH.s:5210 .text.SPI_DMAHalfReceiveCplt:0000000000000000 $t + /tmp/ccywxtmH.s:5241 .text.HAL_SPI_TxRxHalfCpltCallback:0000000000000000 $t + /tmp/ccywxtmH.s:5247 .text.HAL_SPI_TxRxHalfCpltCallback:0000000000000000 HAL_SPI_TxRxHalfCpltCallback + /tmp/ccywxtmH.s:5262 .text.SPI_DMAHalfTransmitReceiveCplt:0000000000000000 $t + /tmp/ccywxtmH.s:5293 .text.HAL_SPI_ErrorCallback:0000000000000000 $t + /tmp/ccywxtmH.s:5299 .text.HAL_SPI_ErrorCallback:0000000000000000 HAL_SPI_ErrorCallback + /tmp/ccywxtmH.s:5314 .text.SPI_CloseTx_ISR:0000000000000000 $t + /tmp/ccywxtmH.s:5319 .text.SPI_CloseTx_ISR:0000000000000000 SPI_CloseTx_ISR + /tmp/ccywxtmH.s:5416 .text.SPI_TxISR_8BIT:0000000000000000 $t + /tmp/ccywxtmH.s:5477 .text.SPI_TxISR_16BIT:0000000000000000 $t + /tmp/ccywxtmH.s:5538 .text.SPI_CloseRx_ISR:0000000000000000 $t + /tmp/ccywxtmH.s:5543 .text.SPI_CloseRx_ISR:0000000000000000 SPI_CloseRx_ISR + /tmp/ccywxtmH.s:5606 .text.SPI_RxISR_8BIT:0000000000000000 $t + /tmp/ccywxtmH.s:5667 .text.SPI_RxISR_16BIT:0000000000000000 $t + /tmp/ccywxtmH.s:5728 .text.SPI_CloseRxTx_ISR:0000000000000000 $t + /tmp/ccywxtmH.s:5733 .text.SPI_CloseRxTx_ISR:0000000000000000 SPI_CloseRxTx_ISR + /tmp/ccywxtmH.s:5823 .text.SPI_2linesTxISR_8BIT:0000000000000000 $t + /tmp/ccywxtmH.s:5928 .text.SPI_2linesRxISR_8BIT:0000000000000000 $t + /tmp/ccywxtmH.s:6045 .text.SPI_2linesTxISR_16BIT:0000000000000000 $t + /tmp/ccywxtmH.s:6117 .text.SPI_2linesRxISR_16BIT:0000000000000000 $t + /tmp/ccywxtmH.s:6189 .text.SPI_DMAError:0000000000000000 $t + /tmp/ccywxtmH.s:6232 .text.SPI_DMATransmitCplt:0000000000000000 $t + /tmp/ccywxtmH.s:6355 .text.SPI_DMAReceiveCplt:0000000000000000 $t + /tmp/ccywxtmH.s:6471 .text.SPI_DMATransmitReceiveCplt:0000000000000000 $t + /tmp/ccywxtmH.s:6570 .text.HAL_SPI_IRQHandler:0000000000000000 $t + /tmp/ccywxtmH.s:6576 .text.HAL_SPI_IRQHandler:0000000000000000 HAL_SPI_IRQHandler + /tmp/ccywxtmH.s:6837 .text.HAL_SPI_IRQHandler:0000000000000114 $d + /tmp/ccywxtmH.s:6847 .text.SPI_DMAAbortOnError:0000000000000000 SPI_DMAAbortOnError + /tmp/ccywxtmH.s:6842 .text.SPI_DMAAbortOnError:0000000000000000 $t + ARM GAS /tmp/ccywxtmH.s page 254 + + + /tmp/ccywxtmH.s:6879 .text.HAL_SPI_AbortCpltCallback:0000000000000000 $t + /tmp/ccywxtmH.s:6885 .text.HAL_SPI_AbortCpltCallback:0000000000000000 HAL_SPI_AbortCpltCallback + /tmp/ccywxtmH.s:6900 .text.HAL_SPI_Abort_IT:0000000000000000 $t + /tmp/ccywxtmH.s:6906 .text.HAL_SPI_Abort_IT:0000000000000000 HAL_SPI_Abort_IT + /tmp/ccywxtmH.s:7239 .text.HAL_SPI_Abort_IT:0000000000000148 $d + /tmp/ccywxtmH.s:7406 .text.SPI_DMATxAbortCallback:0000000000000000 SPI_DMATxAbortCallback + /tmp/ccywxtmH.s:7254 .text.SPI_DMARxAbortCallback:0000000000000000 SPI_DMARxAbortCallback + /tmp/ccywxtmH.s:7249 .text.SPI_DMARxAbortCallback:0000000000000000 $t + /tmp/ccywxtmH.s:7401 .text.SPI_DMATxAbortCallback:0000000000000000 $t + /tmp/ccywxtmH.s:7550 .text.HAL_SPI_GetState:0000000000000000 $t + /tmp/ccywxtmH.s:7556 .text.HAL_SPI_GetState:0000000000000000 HAL_SPI_GetState + /tmp/ccywxtmH.s:7574 .text.HAL_SPI_GetError:0000000000000000 $t + /tmp/ccywxtmH.s:7580 .text.HAL_SPI_GetError:0000000000000000 HAL_SPI_GetError + +UNDEFINED SYMBOLS +HAL_GetTick +SystemCoreClock +HAL_DMA_Start_IT +HAL_DMA_Abort +HAL_DMA_Abort_IT diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_spi.o b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_spi.o new file mode 100644 index 0000000000000000000000000000000000000000..74dc7ab4bf5e87223295d6661ebd7615cad87be4 GIT binary patch literal 60336 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 literal 0 HcmV?d00001 diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_spi_ex.d b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_spi_ex.d new file mode 100644 index 0000000..6c6c151 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_spi_ex.d @@ -0,0 +1,58 @@ +build/stm32f3xx_hal_spi_ex.o: \ + Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h \ + Core/Inc/stm32f3xx_hal_conf.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h \ + Drivers/CMSIS/Include/core_cm4.h Drivers/CMSIS/Include/cmsis_version.h \ + Drivers/CMSIS/Include/cmsis_compiler.h Drivers/CMSIS/Include/cmsis_gcc.h \ + Drivers/CMSIS/Include/mpu_armv7.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h: +Core/Inc/stm32f3xx_hal_conf.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h: +Drivers/CMSIS/Include/core_cm4.h: +Drivers/CMSIS/Include/cmsis_version.h: +Drivers/CMSIS/Include/cmsis_compiler.h: +Drivers/CMSIS/Include/cmsis_gcc.h: +Drivers/CMSIS/Include/mpu_armv7.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h: +Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h: diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_spi_ex.lst b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_spi_ex.lst new file mode 100644 index 0000000..30c6381 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_spi_ex.lst @@ -0,0 +1,236 @@ +ARM GAS /tmp/ccqmlNi8.s page 1 + + + 1 .cpu cortex-m4 + 2 .arch armv7e-m + 3 .fpu fpv4-sp-d16 + 4 .eabi_attribute 27, 1 + 5 .eabi_attribute 28, 1 + 6 .eabi_attribute 20, 1 + 7 .eabi_attribute 21, 1 + 8 .eabi_attribute 23, 3 + 9 .eabi_attribute 24, 1 + 10 .eabi_attribute 25, 1 + 11 .eabi_attribute 26, 1 + 12 .eabi_attribute 30, 1 + 13 .eabi_attribute 34, 1 + 14 .eabi_attribute 18, 4 + 15 .file "stm32f3xx_hal_spi_ex.c" + 16 .text + 17 .Ltext0: + 18 .cfi_sections .debug_frame + 19 .file 1 "Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c" + 20 .section .text.HAL_SPIEx_FlushRxFifo,"ax",%progbits + 21 .align 1 + 22 .global HAL_SPIEx_FlushRxFifo + 23 .syntax unified + 24 .thumb + 25 .thumb_func + 27 HAL_SPIEx_FlushRxFifo: + 28 .LVL0: + 29 .LFB130: + 1:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** /** + 2:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** ****************************************************************************** + 3:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** * @file stm32f3xx_hal_spi_ex.c + 4:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** * @author MCD Application Team + 5:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** * @brief Extended SPI HAL module driver. + 6:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** * This file provides firmware functions to manage the following + 7:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** * SPI peripheral extended functionalities : + 8:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** * + IO operation functions + 9:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** * + 10:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** ****************************************************************************** + 11:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** * @attention + 12:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** * + 13:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** *

    © Copyright (c) 2016 STMicroelectronics. + 14:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** * All rights reserved.

    + 15:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** * + 16:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** * This software component is licensed by ST under BSD 3-Clause license, + 17:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** * the "License"; You may not use this file except in compliance with the + 18:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** * License. You may obtain a copy of the License at: + 19:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** * opensource.org/licenses/BSD-3-Clause + 20:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** * + 21:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** ****************************************************************************** + 22:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** */ + 23:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** + 24:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** /* Includes ------------------------------------------------------------------*/ + 25:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** #include "stm32f3xx_hal.h" + 26:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** + 27:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** /** @addtogroup STM32F3xx_HAL_Driver + 28:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** * @{ + 29:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** */ + ARM GAS /tmp/ccqmlNi8.s page 2 + + + 30:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** + 31:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** /** @defgroup SPIEx SPIEx + 32:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** * @brief SPI Extended HAL module driver + 33:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** * @{ + 34:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** */ + 35:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** #ifdef HAL_SPI_MODULE_ENABLED + 36:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** + 37:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** /* Private typedef -----------------------------------------------------------*/ + 38:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** /* Private defines -----------------------------------------------------------*/ + 39:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** /** @defgroup SPIEx_Private_Constants SPIEx Private Constants + 40:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** * @{ + 41:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** */ + 42:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** #define SPI_FIFO_SIZE 4UL + 43:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** /** + 44:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** * @} + 45:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** */ + 46:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** + 47:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** /* Private macros ------------------------------------------------------------*/ + 48:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** /* Private variables ---------------------------------------------------------*/ + 49:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** /* Private function prototypes -----------------------------------------------*/ + 50:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** /* Exported functions --------------------------------------------------------*/ + 51:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** + 52:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** /** @defgroup SPIEx_Exported_Functions SPIEx Exported Functions + 53:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** * @{ + 54:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** */ + 55:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** + 56:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** /** @defgroup SPIEx_Exported_Functions_Group1 IO operation functions + 57:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** * @brief Data transfers functions + 58:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** * + 59:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** @verbatim + 60:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** ============================================================================== + 61:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** ##### IO operation functions ##### + 62:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** =============================================================================== + 63:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** [..] + 64:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** This subsection provides a set of extended functions to manage the SPI + 65:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** data transfers. + 66:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** + 67:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** (#) Rx data flush function: + 68:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** (++) HAL_SPIEx_FlushRxFifo() + 69:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** + 70:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** @endverbatim + 71:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** * @{ + 72:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** */ + 73:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** + 74:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** /** + 75:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** * @brief Flush the RX fifo. + 76:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** * @param hspi pointer to a SPI_HandleTypeDef structure that contains + 77:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** * the configuration information for the specified SPI module. + 78:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** * @retval HAL status + 79:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** */ + 80:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** HAL_StatusTypeDef HAL_SPIEx_FlushRxFifo(SPI_HandleTypeDef *hspi) + 81:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** { + 30 .loc 1 81 1 view -0 + 31 .cfi_startproc + 32 @ args = 0, pretend = 0, frame = 8 + 33 @ frame_needed = 0, uses_anonymous_args = 0 + 34 @ link register save eliminated. + ARM GAS /tmp/ccqmlNi8.s page 3 + + + 82:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** __IO uint32_t tmpreg; + 35 .loc 1 82 3 view .LVU1 + 83:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** uint8_t count = 0U; + 36 .loc 1 83 3 view .LVU2 + 84:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** while ((hspi->Instance->SR & SPI_FLAG_FRLVL) != SPI_FRLVL_EMPTY) + 37 .loc 1 84 3 view .LVU3 + 83:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** uint8_t count = 0U; + 38 .loc 1 83 12 is_stmt 0 view .LVU4 + 39 0000 0023 movs r3, #0 + 40 .LVL1: + 41 .loc 1 84 48 is_stmt 1 view .LVU5 + 42 .loc 1 84 15 is_stmt 0 view .LVU6 + 43 0002 0268 ldr r2, [r0] + 44 .loc 1 84 25 view .LVU7 + 45 0004 9168 ldr r1, [r2, #8] + 46 .loc 1 84 48 view .LVU8 + 47 0006 11F4C06F tst r1, #1536 + 48 000a 12D0 beq .L10 + 81:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** __IO uint32_t tmpreg; + 49 .loc 1 81 1 view .LVU9 + 50 000c 82B0 sub sp, sp, #8 + 51 .cfi_def_cfa_offset 8 + 52 000e 04E0 b .L4 + 53 .L12: + 54 .loc 1 84 48 is_stmt 1 view .LVU10 + 55 .loc 1 84 15 is_stmt 0 view .LVU11 + 56 0010 0268 ldr r2, [r0] + 57 .loc 1 84 25 view .LVU12 + 58 0012 9168 ldr r1, [r2, #8] + 59 .loc 1 84 48 view .LVU13 + 60 0014 11F4C06F tst r1, #1536 + 61 0018 09D0 beq .L11 + 62 .L4: + 85:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** { + 86:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** count++; + 63 .loc 1 86 5 is_stmt 1 view .LVU14 + 64 .loc 1 86 10 is_stmt 0 view .LVU15 + 65 001a 0133 adds r3, r3, #1 + 66 .LVL2: + 67 .loc 1 86 10 view .LVU16 + 68 001c DBB2 uxtb r3, r3 + 69 .LVL3: + 87:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** tmpreg = hspi->Instance->DR; + 70 .loc 1 87 5 is_stmt 1 view .LVU17 + 71 .loc 1 87 28 is_stmt 0 view .LVU18 + 72 001e D268 ldr r2, [r2, #12] + 73 .loc 1 87 12 view .LVU19 + 74 0020 0192 str r2, [sp, #4] + 88:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** UNUSED(tmpreg); /* To avoid GCC warning */ + 75 .loc 1 88 5 is_stmt 1 view .LVU20 + 76 0022 019A ldr r2, [sp, #4] + 89:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** if (count == SPI_FIFO_SIZE) + 77 .loc 1 89 5 view .LVU21 + 78 .loc 1 89 8 is_stmt 0 view .LVU22 + 79 0024 042B cmp r3, #4 + 80 0026 F3D1 bne .L12 + 90:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** { + ARM GAS /tmp/ccqmlNi8.s page 4 + + + 91:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** return HAL_TIMEOUT; + 81 .loc 1 91 14 view .LVU23 + 82 0028 0320 movs r0, #3 + 83 .LVL4: + 84 .L3: + 92:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** } + 93:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** } + 94:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** return HAL_OK; + 95:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** } + 85 .loc 1 95 1 view .LVU24 + 86 002a 02B0 add sp, sp, #8 + 87 .cfi_remember_state + 88 .cfi_def_cfa_offset 0 + 89 @ sp needed + 90 002c 7047 bx lr + 91 .LVL5: + 92 .L11: + 93 .cfi_restore_state + 94:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** } + 94 .loc 1 94 10 view .LVU25 + 95 002e 0020 movs r0, #0 + 96 .LVL6: + 94:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** } + 97 .loc 1 94 10 view .LVU26 + 98 0030 FBE7 b .L3 + 99 .LVL7: + 100 .L10: + 101 .cfi_def_cfa_offset 0 + 94:Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_spi_ex.c **** } + 102 .loc 1 94 10 view .LVU27 + 103 0032 0020 movs r0, #0 + 104 .LVL8: + 105 .loc 1 95 1 view .LVU28 + 106 0034 7047 bx lr + 107 .cfi_endproc + 108 .LFE130: + 110 .text + 111 .Letext0: + 112 .file 2 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 113 .file 3 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 114 .file 4 "Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h" + 115 .file 5 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h" + 116 .file 6 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h" + 117 .file 7 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h" + ARM GAS /tmp/ccqmlNi8.s page 5 + + +DEFINED SYMBOLS + *ABS*:0000000000000000 stm32f3xx_hal_spi_ex.c + /tmp/ccqmlNi8.s:21 .text.HAL_SPIEx_FlushRxFifo:0000000000000000 $t + /tmp/ccqmlNi8.s:27 .text.HAL_SPIEx_FlushRxFifo:0000000000000000 HAL_SPIEx_FlushRxFifo + +NO UNDEFINED SYMBOLS diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_spi_ex.o b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_spi_ex.o new file mode 100644 index 0000000000000000000000000000000000000000..907928e9bbb0a9ad3c02cdd1699a38b178056cff GIT binary patch literal 7056 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 literal 0 HcmV?d00001 diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_tim.d b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_tim.d new file mode 100644 index 0000000..5b33d2c --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_tim.d @@ -0,0 +1,58 @@ +build/stm32f3xx_hal_tim.o: \ + Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.c \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h \ + Core/Inc/stm32f3xx_hal_conf.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h \ + Drivers/CMSIS/Include/core_cm4.h Drivers/CMSIS/Include/cmsis_version.h \ + Drivers/CMSIS/Include/cmsis_compiler.h Drivers/CMSIS/Include/cmsis_gcc.h \ + Drivers/CMSIS/Include/mpu_armv7.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h: +Core/Inc/stm32f3xx_hal_conf.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h: +Drivers/CMSIS/Include/core_cm4.h: +Drivers/CMSIS/Include/cmsis_version.h: +Drivers/CMSIS/Include/cmsis_compiler.h: +Drivers/CMSIS/Include/cmsis_gcc.h: +Drivers/CMSIS/Include/mpu_armv7.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h: +Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h: diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_tim.lst b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_tim.lst new file mode 100644 index 0000000..a986401 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_tim.lst @@ -0,0 +1,30 @@ +ARM GAS /tmp/cc9anR1t.s page 1 + + + 1 .cpu cortex-m4 + 2 .arch armv7e-m + 3 .fpu fpv4-sp-d16 + 4 .eabi_attribute 27, 1 + 5 .eabi_attribute 28, 1 + 6 .eabi_attribute 20, 1 + 7 .eabi_attribute 21, 1 + 8 .eabi_attribute 23, 3 + 9 .eabi_attribute 24, 1 + 10 .eabi_attribute 25, 1 + 11 .eabi_attribute 26, 1 + 12 .eabi_attribute 30, 1 + 13 .eabi_attribute 34, 1 + 14 .eabi_attribute 18, 4 + 15 .file "stm32f3xx_hal_tim.c" + 16 .text + 17 .Ltext0: + 18 .cfi_sections .debug_frame + 19 .file 1 "Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim.c" + 20 .Letext0: + ARM GAS /tmp/cc9anR1t.s page 2 + + +DEFINED SYMBOLS + *ABS*:0000000000000000 stm32f3xx_hal_tim.c + +NO UNDEFINED SYMBOLS diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_tim.o b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_tim.o new file mode 100644 index 0000000000000000000000000000000000000000..7d401d1fa690959fe27a0f31d9367fbade13f4e2 GIT binary patch literal 1968 zcma)7O>^5s7~Yla*lkEiLrY7;hsr>k4oHgSkaRkP!K6t$P`9*hdt;0~R+a`!@<_5V z2Zjq*&T#C7zrk?gzz<+JG5iJ29N>B7UB@wPH&_9BbG>x|dPq`iTk*Y0D=pQJ)KU-_wm<_%c6R{xDOt??~swfb=d zjWseh>)(^sY+M28wR)VE2x-6tW9`=p-(st)AFS%@NOg|Cz5WvD*80Xp#7j>TVdpV4 z3TM@(Dn>sKFm(0_el`C0`Wp6D9hH*a%HxU13%mEI+jfrI(`o-s=Wc&ywR^eGSWzZz zCnQhg4*O-CSblXioSpX!Gx0~` z13$}4F*TE2=w&ocJYWcWIGXI5#mEd=dt@1AZfUw+d=R;L0E3(R(Se&MlYL<(?}Q`6 z9N;hb(#=EQAiy&BVF?4bbj?EeWt^o2^l+S3d~RcM?>-iuZ9d4x-cYb2!p^EA*-@4V zJ8&m)V0XGbyBN9?VV0sOJ(2p6>9p;Sy1o7*WvH}X7M9qJ=s#)Ami_O=%x~!=H{Ia# z3SmF14zu0PSDaU(%1Ro$eRz1&*q(ms`d=7Sl1`o&M~Nqb0F{H&nBLgy@9kb+t`qCD z(JrpQyRun3&oA(c`X&Afzs$GztNeBTCi-bv7ELww*FTGX z{nQJi4xRO`iqTF6l2kyW0^(uS-KZdaoLm z-IVyU#LI*Tx+3*$iMGT&i3bvINvz%^)_W-R&m|5d(g`*C_E^PNN$GmPGM{0j7#>o| zENXdXc}2mjTnw#1c;i7oPQwhYio2edi^-zb&E0e$Fku!jj8maF)@GKUC5b>2S)GSn z%Pq@1_QvRc?B;*V79yz!RHbI$&y(q@;&g8mrz*Z2M?R8k7*vbr#qA(Q%>iY!-jIkC z<$D)8b;*a)Zs5Z?1*baGH=z!%=-fp zQ69=mU99qc2Cn9SvOh2$6Op2PF?8Z|Zjv^XAC(h2Q5yInoQnG$1-J>D5*7C~47lTw zvTs6JtchBhP}PuP?;!4HApTD=yr$|L8$dd%su?J2;(!;3NKxyZgT5H|6mj3FAfSr- E7k?}fPXGV_ literal 0 HcmV?d00001 diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_tim_ex.d b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_tim_ex.d new file mode 100644 index 0000000..edd3fc6 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_tim_ex.d @@ -0,0 +1,58 @@ +build/stm32f3xx_hal_tim_ex.o: \ + Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.c \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h \ + Core/Inc/stm32f3xx_hal_conf.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h \ + Drivers/CMSIS/Include/core_cm4.h Drivers/CMSIS/Include/cmsis_version.h \ + Drivers/CMSIS/Include/cmsis_compiler.h Drivers/CMSIS/Include/cmsis_gcc.h \ + Drivers/CMSIS/Include/mpu_armv7.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h: +Core/Inc/stm32f3xx_hal_conf.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h: +Drivers/CMSIS/Include/core_cm4.h: +Drivers/CMSIS/Include/cmsis_version.h: +Drivers/CMSIS/Include/cmsis_compiler.h: +Drivers/CMSIS/Include/cmsis_gcc.h: +Drivers/CMSIS/Include/mpu_armv7.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h: +Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h: diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_tim_ex.lst b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_tim_ex.lst new file mode 100644 index 0000000..927bbd2 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_tim_ex.lst @@ -0,0 +1,30 @@ +ARM GAS /tmp/ccs2Pp9d.s page 1 + + + 1 .cpu cortex-m4 + 2 .arch armv7e-m + 3 .fpu fpv4-sp-d16 + 4 .eabi_attribute 27, 1 + 5 .eabi_attribute 28, 1 + 6 .eabi_attribute 20, 1 + 7 .eabi_attribute 21, 1 + 8 .eabi_attribute 23, 3 + 9 .eabi_attribute 24, 1 + 10 .eabi_attribute 25, 1 + 11 .eabi_attribute 26, 1 + 12 .eabi_attribute 30, 1 + 13 .eabi_attribute 34, 1 + 14 .eabi_attribute 18, 4 + 15 .file "stm32f3xx_hal_tim_ex.c" + 16 .text + 17 .Ltext0: + 18 .cfi_sections .debug_frame + 19 .file 1 "Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_tim_ex.c" + 20 .Letext0: + ARM GAS /tmp/ccs2Pp9d.s page 2 + + +DEFINED SYMBOLS + *ABS*:0000000000000000 stm32f3xx_hal_tim_ex.c + +NO UNDEFINED SYMBOLS diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_tim_ex.o b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_hal_tim_ex.o new file mode 100644 index 0000000000000000000000000000000000000000..98cb32dcba97b1451a0d184dde06698dc6031167 GIT binary patch literal 1972 zcma)7OLN;)6uwuo(Jiab;<+B#$H; zvjCQ?_yY_J7A*J`3@aA=0G6Hpg|1n^cjS8=$Fx(<`0D%4<37*1*WVo;-R7J#C7kWB z6OFM}we(b5CG4u;P5vdT)SAHvDbp$Kds(+ED)xIaKQvJ4s z+Bz9mt3Q&qTDt$^1US(@*@2%+@nCd)#W8-8TN}P?u)7Am8UaK@@S9<-=Gx_(_~nG0exX1in)^W-h!UN|PLVFiuK7w=ubP4+GB@@26vTC|Dk1W#yLa zFpY)nJCn$_JKdh051olH3y~MDNW9Q&H0=+%z5cN>lv*zh3am!-KdsM({qMm%>(K3| zoca88Pu5H)KU?tJIZsA8F=_11!NE;qXZnfbeQ8iuI$3NS#;)*vBo9twdZXQMx2`Xz ziglVO8b{##8NUu%-8(e9Y-PRHJ)@mnxlp;tU*MPYE&dX}%(wZ={8j!ss_L{X8Y=AZ zKZ{=d)Gebboz<_3(P3E>eW|i_wzB9(ba`#&Hl3ZBb0RuByQHrz>F1tW@pQv9Oh|`5z9{iBA%d<*eMh1#u`O|5;w_1HCEl0#g~WkG+M!18kClHN7mf=ovKfYo;U*Q# zqMB!xo9E2R#L)7EJ0A3-BuL>Zx#PN-m@Imo%t;0U9cBT;C=rTdY-V|B91E0?)w$ob zoTA7gcZ>^w)%to8FyM?w z%Dx3SxR+@^9Ln?TyD${8p-hYddIT+T1W{erk3sDl(W@4xab B6_@}3 literal 0 HcmV?d00001 diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_it.d b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_it.d new file mode 100644 index 0000000..0b67161 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_it.d @@ -0,0 +1,60 @@ +build/stm32f3xx_it.o: Core/Src/stm32f3xx_it.c Core/Inc/main.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h \ + Core/Inc/stm32f3xx_hal_conf.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h \ + Drivers/CMSIS/Include/core_cm4.h Drivers/CMSIS/Include/cmsis_version.h \ + Drivers/CMSIS/Include/cmsis_compiler.h Drivers/CMSIS/Include/cmsis_gcc.h \ + Drivers/CMSIS/Include/mpu_armv7.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h \ + Core/Inc/stm32f3xx_it.h +Core/Inc/main.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h: +Core/Inc/stm32f3xx_hal_conf.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h: +Drivers/CMSIS/Include/core_cm4.h: +Drivers/CMSIS/Include/cmsis_version.h: +Drivers/CMSIS/Include/cmsis_compiler.h: +Drivers/CMSIS/Include/cmsis_gcc.h: +Drivers/CMSIS/Include/mpu_armv7.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h: +Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h: +Core/Inc/stm32f3xx_it.h: diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_it.lst b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_it.lst new file mode 100644 index 0000000..fb1a7f0 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_it.lst @@ -0,0 +1,507 @@ +ARM GAS /tmp/ccmKlJMS.s page 1 + + + 1 .cpu cortex-m4 + 2 .arch armv7e-m + 3 .fpu fpv4-sp-d16 + 4 .eabi_attribute 27, 1 + 5 .eabi_attribute 28, 1 + 6 .eabi_attribute 20, 1 + 7 .eabi_attribute 21, 1 + 8 .eabi_attribute 23, 3 + 9 .eabi_attribute 24, 1 + 10 .eabi_attribute 25, 1 + 11 .eabi_attribute 26, 1 + 12 .eabi_attribute 30, 1 + 13 .eabi_attribute 34, 1 + 14 .eabi_attribute 18, 4 + 15 .file "stm32f3xx_it.c" + 16 .text + 17 .Ltext0: + 18 .cfi_sections .debug_frame + 19 .file 1 "Core/Src/stm32f3xx_it.c" + 20 .section .text.NMI_Handler,"ax",%progbits + 21 .align 1 + 22 .global NMI_Handler + 23 .syntax unified + 24 .thumb + 25 .thumb_func + 27 NMI_Handler: + 28 .LFB130: + 1:Core/Src/stm32f3xx_it.c **** /* USER CODE BEGIN Header */ + 2:Core/Src/stm32f3xx_it.c **** /** + 3:Core/Src/stm32f3xx_it.c **** ****************************************************************************** + 4:Core/Src/stm32f3xx_it.c **** * @file stm32f3xx_it.c + 5:Core/Src/stm32f3xx_it.c **** * @brief Interrupt Service Routines. + 6:Core/Src/stm32f3xx_it.c **** ****************************************************************************** + 7:Core/Src/stm32f3xx_it.c **** * @attention + 8:Core/Src/stm32f3xx_it.c **** * + 9:Core/Src/stm32f3xx_it.c **** * Copyright (c) 2023 STMicroelectronics. + 10:Core/Src/stm32f3xx_it.c **** * All rights reserved. + 11:Core/Src/stm32f3xx_it.c **** * + 12:Core/Src/stm32f3xx_it.c **** * This software is licensed under terms that can be found in the LICENSE file + 13:Core/Src/stm32f3xx_it.c **** * in the root directory of this software component. + 14:Core/Src/stm32f3xx_it.c **** * If no LICENSE file comes with this software, it is provided AS-IS. + 15:Core/Src/stm32f3xx_it.c **** * + 16:Core/Src/stm32f3xx_it.c **** ****************************************************************************** + 17:Core/Src/stm32f3xx_it.c **** */ + 18:Core/Src/stm32f3xx_it.c **** /* USER CODE END Header */ + 19:Core/Src/stm32f3xx_it.c **** + 20:Core/Src/stm32f3xx_it.c **** /* Includes ------------------------------------------------------------------*/ + 21:Core/Src/stm32f3xx_it.c **** #include "main.h" + 22:Core/Src/stm32f3xx_it.c **** #include "stm32f3xx_it.h" + 23:Core/Src/stm32f3xx_it.c **** /* Private includes ----------------------------------------------------------*/ + 24:Core/Src/stm32f3xx_it.c **** /* USER CODE BEGIN Includes */ + 25:Core/Src/stm32f3xx_it.c **** /* USER CODE END Includes */ + 26:Core/Src/stm32f3xx_it.c **** + 27:Core/Src/stm32f3xx_it.c **** /* Private typedef -----------------------------------------------------------*/ + 28:Core/Src/stm32f3xx_it.c **** /* USER CODE BEGIN TD */ + 29:Core/Src/stm32f3xx_it.c **** + 30:Core/Src/stm32f3xx_it.c **** /* USER CODE END TD */ + ARM GAS /tmp/ccmKlJMS.s page 2 + + + 31:Core/Src/stm32f3xx_it.c **** + 32:Core/Src/stm32f3xx_it.c **** /* Private define ------------------------------------------------------------*/ + 33:Core/Src/stm32f3xx_it.c **** /* USER CODE BEGIN PD */ + 34:Core/Src/stm32f3xx_it.c **** + 35:Core/Src/stm32f3xx_it.c **** /* USER CODE END PD */ + 36:Core/Src/stm32f3xx_it.c **** + 37:Core/Src/stm32f3xx_it.c **** /* Private macro -------------------------------------------------------------*/ + 38:Core/Src/stm32f3xx_it.c **** /* USER CODE BEGIN PM */ + 39:Core/Src/stm32f3xx_it.c **** + 40:Core/Src/stm32f3xx_it.c **** /* USER CODE END PM */ + 41:Core/Src/stm32f3xx_it.c **** + 42:Core/Src/stm32f3xx_it.c **** /* Private variables ---------------------------------------------------------*/ + 43:Core/Src/stm32f3xx_it.c **** /* USER CODE BEGIN PV */ + 44:Core/Src/stm32f3xx_it.c **** + 45:Core/Src/stm32f3xx_it.c **** /* USER CODE END PV */ + 46:Core/Src/stm32f3xx_it.c **** + 47:Core/Src/stm32f3xx_it.c **** /* Private function prototypes -----------------------------------------------*/ + 48:Core/Src/stm32f3xx_it.c **** /* USER CODE BEGIN PFP */ + 49:Core/Src/stm32f3xx_it.c **** + 50:Core/Src/stm32f3xx_it.c **** /* USER CODE END PFP */ + 51:Core/Src/stm32f3xx_it.c **** + 52:Core/Src/stm32f3xx_it.c **** /* Private user code ---------------------------------------------------------*/ + 53:Core/Src/stm32f3xx_it.c **** /* USER CODE BEGIN 0 */ + 54:Core/Src/stm32f3xx_it.c **** + 55:Core/Src/stm32f3xx_it.c **** /* USER CODE END 0 */ + 56:Core/Src/stm32f3xx_it.c **** + 57:Core/Src/stm32f3xx_it.c **** /* External variables --------------------------------------------------------*/ + 58:Core/Src/stm32f3xx_it.c **** extern CAN_HandleTypeDef hcan; + 59:Core/Src/stm32f3xx_it.c **** /* USER CODE BEGIN EV */ + 60:Core/Src/stm32f3xx_it.c **** + 61:Core/Src/stm32f3xx_it.c **** /* USER CODE END EV */ + 62:Core/Src/stm32f3xx_it.c **** + 63:Core/Src/stm32f3xx_it.c **** /******************************************************************************/ + 64:Core/Src/stm32f3xx_it.c **** /* Cortex-M4 Processor Interruption and Exception Handlers */ + 65:Core/Src/stm32f3xx_it.c **** /******************************************************************************/ + 66:Core/Src/stm32f3xx_it.c **** /** + 67:Core/Src/stm32f3xx_it.c **** * @brief This function handles Non maskable interrupt. + 68:Core/Src/stm32f3xx_it.c **** */ + 69:Core/Src/stm32f3xx_it.c **** void NMI_Handler(void) + 70:Core/Src/stm32f3xx_it.c **** { + 29 .loc 1 70 1 view -0 + 30 .cfi_startproc + 31 @ Volatile: function does not return. + 32 @ args = 0, pretend = 0, frame = 0 + 33 @ frame_needed = 0, uses_anonymous_args = 0 + 34 @ link register save eliminated. + 35 .L2: + 71:Core/Src/stm32f3xx_it.c **** /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ + 72:Core/Src/stm32f3xx_it.c **** + 73:Core/Src/stm32f3xx_it.c **** /* USER CODE END NonMaskableInt_IRQn 0 */ + 74:Core/Src/stm32f3xx_it.c **** /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ + 75:Core/Src/stm32f3xx_it.c **** while (1) + 36 .loc 1 75 3 discriminator 1 view .LVU1 + 76:Core/Src/stm32f3xx_it.c **** { + 77:Core/Src/stm32f3xx_it.c **** } + 37 .loc 1 77 3 discriminator 1 view .LVU2 + 75:Core/Src/stm32f3xx_it.c **** { + ARM GAS /tmp/ccmKlJMS.s page 3 + + + 38 .loc 1 75 9 discriminator 1 view .LVU3 + 39 0000 FEE7 b .L2 + 40 .cfi_endproc + 41 .LFE130: + 43 .section .text.HardFault_Handler,"ax",%progbits + 44 .align 1 + 45 .global HardFault_Handler + 46 .syntax unified + 47 .thumb + 48 .thumb_func + 50 HardFault_Handler: + 51 .LFB131: + 78:Core/Src/stm32f3xx_it.c **** /* USER CODE END NonMaskableInt_IRQn 1 */ + 79:Core/Src/stm32f3xx_it.c **** } + 80:Core/Src/stm32f3xx_it.c **** + 81:Core/Src/stm32f3xx_it.c **** /** + 82:Core/Src/stm32f3xx_it.c **** * @brief This function handles Hard fault interrupt. + 83:Core/Src/stm32f3xx_it.c **** */ + 84:Core/Src/stm32f3xx_it.c **** void HardFault_Handler(void) + 85:Core/Src/stm32f3xx_it.c **** { + 52 .loc 1 85 1 view -0 + 53 .cfi_startproc + 54 @ Volatile: function does not return. + 55 @ args = 0, pretend = 0, frame = 0 + 56 @ frame_needed = 0, uses_anonymous_args = 0 + 57 @ link register save eliminated. + 58 .L4: + 86:Core/Src/stm32f3xx_it.c **** /* USER CODE BEGIN HardFault_IRQn 0 */ + 87:Core/Src/stm32f3xx_it.c **** + 88:Core/Src/stm32f3xx_it.c **** /* USER CODE END HardFault_IRQn 0 */ + 89:Core/Src/stm32f3xx_it.c **** while (1) + 59 .loc 1 89 3 discriminator 1 view .LVU5 + 90:Core/Src/stm32f3xx_it.c **** { + 91:Core/Src/stm32f3xx_it.c **** /* USER CODE BEGIN W1_HardFault_IRQn 0 */ + 92:Core/Src/stm32f3xx_it.c **** /* USER CODE END W1_HardFault_IRQn 0 */ + 93:Core/Src/stm32f3xx_it.c **** } + 60 .loc 1 93 3 discriminator 1 view .LVU6 + 89:Core/Src/stm32f3xx_it.c **** { + 61 .loc 1 89 9 discriminator 1 view .LVU7 + 62 0000 FEE7 b .L4 + 63 .cfi_endproc + 64 .LFE131: + 66 .section .text.MemManage_Handler,"ax",%progbits + 67 .align 1 + 68 .global MemManage_Handler + 69 .syntax unified + 70 .thumb + 71 .thumb_func + 73 MemManage_Handler: + 74 .LFB132: + 94:Core/Src/stm32f3xx_it.c **** } + 95:Core/Src/stm32f3xx_it.c **** + 96:Core/Src/stm32f3xx_it.c **** /** + 97:Core/Src/stm32f3xx_it.c **** * @brief This function handles Memory management fault. + 98:Core/Src/stm32f3xx_it.c **** */ + 99:Core/Src/stm32f3xx_it.c **** void MemManage_Handler(void) + 100:Core/Src/stm32f3xx_it.c **** { + ARM GAS /tmp/ccmKlJMS.s page 4 + + + 75 .loc 1 100 1 view -0 + 76 .cfi_startproc + 77 @ Volatile: function does not return. + 78 @ args = 0, pretend = 0, frame = 0 + 79 @ frame_needed = 0, uses_anonymous_args = 0 + 80 @ link register save eliminated. + 81 .L6: + 101:Core/Src/stm32f3xx_it.c **** /* USER CODE BEGIN MemoryManagement_IRQn 0 */ + 102:Core/Src/stm32f3xx_it.c **** + 103:Core/Src/stm32f3xx_it.c **** /* USER CODE END MemoryManagement_IRQn 0 */ + 104:Core/Src/stm32f3xx_it.c **** while (1) + 82 .loc 1 104 3 discriminator 1 view .LVU9 + 105:Core/Src/stm32f3xx_it.c **** { + 106:Core/Src/stm32f3xx_it.c **** /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */ + 107:Core/Src/stm32f3xx_it.c **** /* USER CODE END W1_MemoryManagement_IRQn 0 */ + 108:Core/Src/stm32f3xx_it.c **** } + 83 .loc 1 108 3 discriminator 1 view .LVU10 + 104:Core/Src/stm32f3xx_it.c **** { + 84 .loc 1 104 9 discriminator 1 view .LVU11 + 85 0000 FEE7 b .L6 + 86 .cfi_endproc + 87 .LFE132: + 89 .section .text.BusFault_Handler,"ax",%progbits + 90 .align 1 + 91 .global BusFault_Handler + 92 .syntax unified + 93 .thumb + 94 .thumb_func + 96 BusFault_Handler: + 97 .LFB133: + 109:Core/Src/stm32f3xx_it.c **** } + 110:Core/Src/stm32f3xx_it.c **** + 111:Core/Src/stm32f3xx_it.c **** /** + 112:Core/Src/stm32f3xx_it.c **** * @brief This function handles Pre-fetch fault, memory access fault. + 113:Core/Src/stm32f3xx_it.c **** */ + 114:Core/Src/stm32f3xx_it.c **** void BusFault_Handler(void) + 115:Core/Src/stm32f3xx_it.c **** { + 98 .loc 1 115 1 view -0 + 99 .cfi_startproc + 100 @ Volatile: function does not return. + 101 @ args = 0, pretend = 0, frame = 0 + 102 @ frame_needed = 0, uses_anonymous_args = 0 + 103 @ link register save eliminated. + 104 .L8: + 116:Core/Src/stm32f3xx_it.c **** /* USER CODE BEGIN BusFault_IRQn 0 */ + 117:Core/Src/stm32f3xx_it.c **** + 118:Core/Src/stm32f3xx_it.c **** /* USER CODE END BusFault_IRQn 0 */ + 119:Core/Src/stm32f3xx_it.c **** while (1) + 105 .loc 1 119 3 discriminator 1 view .LVU13 + 120:Core/Src/stm32f3xx_it.c **** { + 121:Core/Src/stm32f3xx_it.c **** /* USER CODE BEGIN W1_BusFault_IRQn 0 */ + 122:Core/Src/stm32f3xx_it.c **** /* USER CODE END W1_BusFault_IRQn 0 */ + 123:Core/Src/stm32f3xx_it.c **** } + 106 .loc 1 123 3 discriminator 1 view .LVU14 + 119:Core/Src/stm32f3xx_it.c **** { + 107 .loc 1 119 9 discriminator 1 view .LVU15 + 108 0000 FEE7 b .L8 + ARM GAS /tmp/ccmKlJMS.s page 5 + + + 109 .cfi_endproc + 110 .LFE133: + 112 .section .text.UsageFault_Handler,"ax",%progbits + 113 .align 1 + 114 .global UsageFault_Handler + 115 .syntax unified + 116 .thumb + 117 .thumb_func + 119 UsageFault_Handler: + 120 .LFB134: + 124:Core/Src/stm32f3xx_it.c **** } + 125:Core/Src/stm32f3xx_it.c **** + 126:Core/Src/stm32f3xx_it.c **** /** + 127:Core/Src/stm32f3xx_it.c **** * @brief This function handles Undefined instruction or illegal state. + 128:Core/Src/stm32f3xx_it.c **** */ + 129:Core/Src/stm32f3xx_it.c **** void UsageFault_Handler(void) + 130:Core/Src/stm32f3xx_it.c **** { + 121 .loc 1 130 1 view -0 + 122 .cfi_startproc + 123 @ Volatile: function does not return. + 124 @ args = 0, pretend = 0, frame = 0 + 125 @ frame_needed = 0, uses_anonymous_args = 0 + 126 @ link register save eliminated. + 127 .L10: + 131:Core/Src/stm32f3xx_it.c **** /* USER CODE BEGIN UsageFault_IRQn 0 */ + 132:Core/Src/stm32f3xx_it.c **** + 133:Core/Src/stm32f3xx_it.c **** /* USER CODE END UsageFault_IRQn 0 */ + 134:Core/Src/stm32f3xx_it.c **** while (1) + 128 .loc 1 134 3 discriminator 1 view .LVU17 + 135:Core/Src/stm32f3xx_it.c **** { + 136:Core/Src/stm32f3xx_it.c **** /* USER CODE BEGIN W1_UsageFault_IRQn 0 */ + 137:Core/Src/stm32f3xx_it.c **** /* USER CODE END W1_UsageFault_IRQn 0 */ + 138:Core/Src/stm32f3xx_it.c **** } + 129 .loc 1 138 3 discriminator 1 view .LVU18 + 134:Core/Src/stm32f3xx_it.c **** { + 130 .loc 1 134 9 discriminator 1 view .LVU19 + 131 0000 FEE7 b .L10 + 132 .cfi_endproc + 133 .LFE134: + 135 .section .text.SVC_Handler,"ax",%progbits + 136 .align 1 + 137 .global SVC_Handler + 138 .syntax unified + 139 .thumb + 140 .thumb_func + 142 SVC_Handler: + 143 .LFB135: + 139:Core/Src/stm32f3xx_it.c **** } + 140:Core/Src/stm32f3xx_it.c **** + 141:Core/Src/stm32f3xx_it.c **** /** + 142:Core/Src/stm32f3xx_it.c **** * @brief This function handles System service call via SWI instruction. + 143:Core/Src/stm32f3xx_it.c **** */ + 144:Core/Src/stm32f3xx_it.c **** void SVC_Handler(void) + 145:Core/Src/stm32f3xx_it.c **** { + 144 .loc 1 145 1 view -0 + 145 .cfi_startproc + 146 @ args = 0, pretend = 0, frame = 0 + ARM GAS /tmp/ccmKlJMS.s page 6 + + + 147 @ frame_needed = 0, uses_anonymous_args = 0 + 148 @ link register save eliminated. + 146:Core/Src/stm32f3xx_it.c **** /* USER CODE BEGIN SVCall_IRQn 0 */ + 147:Core/Src/stm32f3xx_it.c **** + 148:Core/Src/stm32f3xx_it.c **** /* USER CODE END SVCall_IRQn 0 */ + 149:Core/Src/stm32f3xx_it.c **** /* USER CODE BEGIN SVCall_IRQn 1 */ + 150:Core/Src/stm32f3xx_it.c **** + 151:Core/Src/stm32f3xx_it.c **** /* USER CODE END SVCall_IRQn 1 */ + 152:Core/Src/stm32f3xx_it.c **** } + 149 .loc 1 152 1 view .LVU21 + 150 0000 7047 bx lr + 151 .cfi_endproc + 152 .LFE135: + 154 .section .text.DebugMon_Handler,"ax",%progbits + 155 .align 1 + 156 .global DebugMon_Handler + 157 .syntax unified + 158 .thumb + 159 .thumb_func + 161 DebugMon_Handler: + 162 .LFB136: + 153:Core/Src/stm32f3xx_it.c **** + 154:Core/Src/stm32f3xx_it.c **** /** + 155:Core/Src/stm32f3xx_it.c **** * @brief This function handles Debug monitor. + 156:Core/Src/stm32f3xx_it.c **** */ + 157:Core/Src/stm32f3xx_it.c **** void DebugMon_Handler(void) + 158:Core/Src/stm32f3xx_it.c **** { + 163 .loc 1 158 1 view -0 + 164 .cfi_startproc + 165 @ args = 0, pretend = 0, frame = 0 + 166 @ frame_needed = 0, uses_anonymous_args = 0 + 167 @ link register save eliminated. + 159:Core/Src/stm32f3xx_it.c **** /* USER CODE BEGIN DebugMonitor_IRQn 0 */ + 160:Core/Src/stm32f3xx_it.c **** + 161:Core/Src/stm32f3xx_it.c **** /* USER CODE END DebugMonitor_IRQn 0 */ + 162:Core/Src/stm32f3xx_it.c **** /* USER CODE BEGIN DebugMonitor_IRQn 1 */ + 163:Core/Src/stm32f3xx_it.c **** + 164:Core/Src/stm32f3xx_it.c **** /* USER CODE END DebugMonitor_IRQn 1 */ + 165:Core/Src/stm32f3xx_it.c **** } + 168 .loc 1 165 1 view .LVU23 + 169 0000 7047 bx lr + 170 .cfi_endproc + 171 .LFE136: + 173 .section .text.PendSV_Handler,"ax",%progbits + 174 .align 1 + 175 .global PendSV_Handler + 176 .syntax unified + 177 .thumb + 178 .thumb_func + 180 PendSV_Handler: + 181 .LFB137: + 166:Core/Src/stm32f3xx_it.c **** + 167:Core/Src/stm32f3xx_it.c **** /** + 168:Core/Src/stm32f3xx_it.c **** * @brief This function handles Pendable request for system service. + 169:Core/Src/stm32f3xx_it.c **** */ + 170:Core/Src/stm32f3xx_it.c **** void PendSV_Handler(void) + 171:Core/Src/stm32f3xx_it.c **** { + ARM GAS /tmp/ccmKlJMS.s page 7 + + + 182 .loc 1 171 1 view -0 + 183 .cfi_startproc + 184 @ args = 0, pretend = 0, frame = 0 + 185 @ frame_needed = 0, uses_anonymous_args = 0 + 186 @ link register save eliminated. + 172:Core/Src/stm32f3xx_it.c **** /* USER CODE BEGIN PendSV_IRQn 0 */ + 173:Core/Src/stm32f3xx_it.c **** + 174:Core/Src/stm32f3xx_it.c **** /* USER CODE END PendSV_IRQn 0 */ + 175:Core/Src/stm32f3xx_it.c **** /* USER CODE BEGIN PendSV_IRQn 1 */ + 176:Core/Src/stm32f3xx_it.c **** + 177:Core/Src/stm32f3xx_it.c **** /* USER CODE END PendSV_IRQn 1 */ + 178:Core/Src/stm32f3xx_it.c **** } + 187 .loc 1 178 1 view .LVU25 + 188 0000 7047 bx lr + 189 .cfi_endproc + 190 .LFE137: + 192 .section .text.SysTick_Handler,"ax",%progbits + 193 .align 1 + 194 .global SysTick_Handler + 195 .syntax unified + 196 .thumb + 197 .thumb_func + 199 SysTick_Handler: + 200 .LFB138: + 179:Core/Src/stm32f3xx_it.c **** + 180:Core/Src/stm32f3xx_it.c **** /** + 181:Core/Src/stm32f3xx_it.c **** * @brief This function handles System tick timer. + 182:Core/Src/stm32f3xx_it.c **** */ + 183:Core/Src/stm32f3xx_it.c **** void SysTick_Handler(void) + 184:Core/Src/stm32f3xx_it.c **** { + 201 .loc 1 184 1 view -0 + 202 .cfi_startproc + 203 @ args = 0, pretend = 0, frame = 0 + 204 @ frame_needed = 0, uses_anonymous_args = 0 + 205 0000 08B5 push {r3, lr} + 206 .cfi_def_cfa_offset 8 + 207 .cfi_offset 3, -8 + 208 .cfi_offset 14, -4 + 185:Core/Src/stm32f3xx_it.c **** /* USER CODE BEGIN SysTick_IRQn 0 */ + 186:Core/Src/stm32f3xx_it.c **** + 187:Core/Src/stm32f3xx_it.c **** /* USER CODE END SysTick_IRQn 0 */ + 188:Core/Src/stm32f3xx_it.c **** HAL_IncTick(); + 209 .loc 1 188 3 view .LVU27 + 210 0002 FFF7FEFF bl HAL_IncTick + 211 .LVL0: + 189:Core/Src/stm32f3xx_it.c **** /* USER CODE BEGIN SysTick_IRQn 1 */ + 190:Core/Src/stm32f3xx_it.c **** + 191:Core/Src/stm32f3xx_it.c **** /* USER CODE END SysTick_IRQn 1 */ + 192:Core/Src/stm32f3xx_it.c **** } + 212 .loc 1 192 1 is_stmt 0 view .LVU28 + 213 0006 08BD pop {r3, pc} + 214 .cfi_endproc + 215 .LFE138: + 217 .section .text.USB_LP_CAN_RX0_IRQHandler,"ax",%progbits + 218 .align 1 + 219 .global USB_LP_CAN_RX0_IRQHandler + 220 .syntax unified + ARM GAS /tmp/ccmKlJMS.s page 8 + + + 221 .thumb + 222 .thumb_func + 224 USB_LP_CAN_RX0_IRQHandler: + 225 .LFB139: + 193:Core/Src/stm32f3xx_it.c **** + 194:Core/Src/stm32f3xx_it.c **** /******************************************************************************/ + 195:Core/Src/stm32f3xx_it.c **** /* STM32F3xx Peripheral Interrupt Handlers */ + 196:Core/Src/stm32f3xx_it.c **** /* Add here the Interrupt Handlers for the used peripherals. */ + 197:Core/Src/stm32f3xx_it.c **** /* For the available peripheral interrupt handler names, */ + 198:Core/Src/stm32f3xx_it.c **** /* please refer to the startup file (startup_stm32f3xx.s). */ + 199:Core/Src/stm32f3xx_it.c **** /******************************************************************************/ + 200:Core/Src/stm32f3xx_it.c **** + 201:Core/Src/stm32f3xx_it.c **** /** + 202:Core/Src/stm32f3xx_it.c **** * @brief This function handles USB low priority or CAN_RX0 interrupts. + 203:Core/Src/stm32f3xx_it.c **** */ + 204:Core/Src/stm32f3xx_it.c **** void USB_LP_CAN_RX0_IRQHandler(void) + 205:Core/Src/stm32f3xx_it.c **** { + 226 .loc 1 205 1 is_stmt 1 view -0 + 227 .cfi_startproc + 228 @ args = 0, pretend = 0, frame = 0 + 229 @ frame_needed = 0, uses_anonymous_args = 0 + 230 0000 08B5 push {r3, lr} + 231 .cfi_def_cfa_offset 8 + 232 .cfi_offset 3, -8 + 233 .cfi_offset 14, -4 + 206:Core/Src/stm32f3xx_it.c **** /* USER CODE BEGIN USB_LP_CAN_RX0_IRQn 0 */ + 207:Core/Src/stm32f3xx_it.c **** + 208:Core/Src/stm32f3xx_it.c **** /* USER CODE END USB_LP_CAN_RX0_IRQn 0 */ + 209:Core/Src/stm32f3xx_it.c **** HAL_CAN_IRQHandler(&hcan); + 234 .loc 1 209 3 view .LVU30 + 235 0002 0248 ldr r0, .L18 + 236 0004 FFF7FEFF bl HAL_CAN_IRQHandler + 237 .LVL1: + 210:Core/Src/stm32f3xx_it.c **** /* USER CODE BEGIN USB_LP_CAN_RX0_IRQn 1 */ + 211:Core/Src/stm32f3xx_it.c **** + 212:Core/Src/stm32f3xx_it.c **** /* USER CODE END USB_LP_CAN_RX0_IRQn 1 */ + 213:Core/Src/stm32f3xx_it.c **** } + 238 .loc 1 213 1 is_stmt 0 view .LVU31 + 239 0008 08BD pop {r3, pc} + 240 .L19: + 241 000a 00BF .align 2 + 242 .L18: + 243 000c 00000000 .word hcan + 244 .cfi_endproc + 245 .LFE139: + 247 .text + 248 .Letext0: + 249 .file 2 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 250 .file 3 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 251 .file 4 "Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h" + 252 .file 5 "Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h" + 253 .file 6 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h" + 254 .file 7 "Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h" + ARM GAS /tmp/ccmKlJMS.s page 9 + + +DEFINED SYMBOLS + *ABS*:0000000000000000 stm32f3xx_it.c + /tmp/ccmKlJMS.s:21 .text.NMI_Handler:0000000000000000 $t + /tmp/ccmKlJMS.s:27 .text.NMI_Handler:0000000000000000 NMI_Handler + /tmp/ccmKlJMS.s:44 .text.HardFault_Handler:0000000000000000 $t + /tmp/ccmKlJMS.s:50 .text.HardFault_Handler:0000000000000000 HardFault_Handler + /tmp/ccmKlJMS.s:67 .text.MemManage_Handler:0000000000000000 $t + /tmp/ccmKlJMS.s:73 .text.MemManage_Handler:0000000000000000 MemManage_Handler + /tmp/ccmKlJMS.s:90 .text.BusFault_Handler:0000000000000000 $t + /tmp/ccmKlJMS.s:96 .text.BusFault_Handler:0000000000000000 BusFault_Handler + /tmp/ccmKlJMS.s:113 .text.UsageFault_Handler:0000000000000000 $t + /tmp/ccmKlJMS.s:119 .text.UsageFault_Handler:0000000000000000 UsageFault_Handler + /tmp/ccmKlJMS.s:136 .text.SVC_Handler:0000000000000000 $t + /tmp/ccmKlJMS.s:142 .text.SVC_Handler:0000000000000000 SVC_Handler + /tmp/ccmKlJMS.s:155 .text.DebugMon_Handler:0000000000000000 $t + /tmp/ccmKlJMS.s:161 .text.DebugMon_Handler:0000000000000000 DebugMon_Handler + /tmp/ccmKlJMS.s:174 .text.PendSV_Handler:0000000000000000 $t + /tmp/ccmKlJMS.s:180 .text.PendSV_Handler:0000000000000000 PendSV_Handler + /tmp/ccmKlJMS.s:193 .text.SysTick_Handler:0000000000000000 $t + /tmp/ccmKlJMS.s:199 .text.SysTick_Handler:0000000000000000 SysTick_Handler + /tmp/ccmKlJMS.s:218 .text.USB_LP_CAN_RX0_IRQHandler:0000000000000000 $t + /tmp/ccmKlJMS.s:224 .text.USB_LP_CAN_RX0_IRQHandler:0000000000000000 USB_LP_CAN_RX0_IRQHandler + /tmp/ccmKlJMS.s:243 .text.USB_LP_CAN_RX0_IRQHandler:000000000000000c $d + +UNDEFINED SYMBOLS +HAL_IncTick +HAL_CAN_IRQHandler +hcan diff --git a/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_it.o b/BMS_Testbench/BMS_Software_V1/build/stm32f3xx_it.o new file mode 100644 index 0000000000000000000000000000000000000000..70ec12d3c9cb7b3148efba60a82bebdb670e9474 GIT binary patch literal 8340 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 literal 0 HcmV?d00001 diff --git a/BMS_Testbench/BMS_Software_V1/build/syscalls.d b/BMS_Testbench/BMS_Software_V1/build/syscalls.d new file mode 100644 index 0000000..8efb132 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/syscalls.d @@ -0,0 +1 @@ +build/syscalls.o: Core/Src/syscalls.c diff --git a/BMS_Testbench/BMS_Software_V1/build/syscalls.lst b/BMS_Testbench/BMS_Software_V1/build/syscalls.lst new file mode 100644 index 0000000..2165cc6 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/syscalls.lst @@ -0,0 +1,861 @@ +ARM GAS /tmp/cccbubnS.s page 1 + + + 1 .cpu cortex-m4 + 2 .arch armv7e-m + 3 .fpu fpv4-sp-d16 + 4 .eabi_attribute 27, 1 + 5 .eabi_attribute 28, 1 + 6 .eabi_attribute 20, 1 + 7 .eabi_attribute 21, 1 + 8 .eabi_attribute 23, 3 + 9 .eabi_attribute 24, 1 + 10 .eabi_attribute 25, 1 + 11 .eabi_attribute 26, 1 + 12 .eabi_attribute 30, 1 + 13 .eabi_attribute 34, 1 + 14 .eabi_attribute 18, 4 + 15 .file "syscalls.c" + 16 .text + 17 .Ltext0: + 18 .cfi_sections .debug_frame + 19 .file 1 "Core/Src/syscalls.c" + 20 .section .text.initialise_monitor_handles,"ax",%progbits + 21 .align 1 + 22 .global initialise_monitor_handles + 23 .syntax unified + 24 .thumb + 25 .thumb_func + 27 initialise_monitor_handles: + 28 .LFB25: + 1:Core/Src/syscalls.c **** /** + 2:Core/Src/syscalls.c **** ****************************************************************************** + 3:Core/Src/syscalls.c **** * @file syscalls.c + 4:Core/Src/syscalls.c **** * @author Auto-generated by STM32CubeIDE + 5:Core/Src/syscalls.c **** * @brief STM32CubeIDE Minimal System calls file + 6:Core/Src/syscalls.c **** * + 7:Core/Src/syscalls.c **** * For more information about which c-functions + 8:Core/Src/syscalls.c **** * need which of these lowlevel functions + 9:Core/Src/syscalls.c **** * please consult the Newlib libc-manual + 10:Core/Src/syscalls.c **** ****************************************************************************** + 11:Core/Src/syscalls.c **** * @attention + 12:Core/Src/syscalls.c **** * + 13:Core/Src/syscalls.c **** * Copyright (c) 2020-2022 STMicroelectronics. + 14:Core/Src/syscalls.c **** * All rights reserved. + 15:Core/Src/syscalls.c **** * + 16:Core/Src/syscalls.c **** * This software is licensed under terms that can be found in the LICENSE file + 17:Core/Src/syscalls.c **** * in the root directory of this software component. + 18:Core/Src/syscalls.c **** * If no LICENSE file comes with this software, it is provided AS-IS. + 19:Core/Src/syscalls.c **** * + 20:Core/Src/syscalls.c **** ****************************************************************************** + 21:Core/Src/syscalls.c **** */ + 22:Core/Src/syscalls.c **** + 23:Core/Src/syscalls.c **** /* Includes */ + 24:Core/Src/syscalls.c **** #include + 25:Core/Src/syscalls.c **** #include + 26:Core/Src/syscalls.c **** #include + 27:Core/Src/syscalls.c **** #include + 28:Core/Src/syscalls.c **** #include + 29:Core/Src/syscalls.c **** #include + 30:Core/Src/syscalls.c **** #include + ARM GAS /tmp/cccbubnS.s page 2 + + + 31:Core/Src/syscalls.c **** #include + 32:Core/Src/syscalls.c **** + 33:Core/Src/syscalls.c **** + 34:Core/Src/syscalls.c **** /* Variables */ + 35:Core/Src/syscalls.c **** extern int __io_putchar(int ch) __attribute__((weak)); + 36:Core/Src/syscalls.c **** extern int __io_getchar(void) __attribute__((weak)); + 37:Core/Src/syscalls.c **** + 38:Core/Src/syscalls.c **** + 39:Core/Src/syscalls.c **** char *__env[1] = { 0 }; + 40:Core/Src/syscalls.c **** char **environ = __env; + 41:Core/Src/syscalls.c **** + 42:Core/Src/syscalls.c **** + 43:Core/Src/syscalls.c **** /* Functions */ + 44:Core/Src/syscalls.c **** void initialise_monitor_handles() + 45:Core/Src/syscalls.c **** { + 29 .loc 1 45 1 view -0 + 30 .cfi_startproc + 31 @ args = 0, pretend = 0, frame = 0 + 32 @ frame_needed = 0, uses_anonymous_args = 0 + 33 @ link register save eliminated. + 46:Core/Src/syscalls.c **** } + 34 .loc 1 46 1 view .LVU1 + 35 0000 7047 bx lr + 36 .cfi_endproc + 37 .LFE25: + 39 .section .text._getpid,"ax",%progbits + 40 .align 1 + 41 .global _getpid + 42 .syntax unified + 43 .thumb + 44 .thumb_func + 46 _getpid: + 47 .LFB26: + 47:Core/Src/syscalls.c **** + 48:Core/Src/syscalls.c **** int _getpid(void) + 49:Core/Src/syscalls.c **** { + 48 .loc 1 49 1 view -0 + 49 .cfi_startproc + 50 @ args = 0, pretend = 0, frame = 0 + 51 @ frame_needed = 0, uses_anonymous_args = 0 + 52 @ link register save eliminated. + 50:Core/Src/syscalls.c **** return 1; + 53 .loc 1 50 3 view .LVU3 + 51:Core/Src/syscalls.c **** } + 54 .loc 1 51 1 is_stmt 0 view .LVU4 + 55 0000 0120 movs r0, #1 + 56 0002 7047 bx lr + 57 .cfi_endproc + 58 .LFE26: + 60 .section .text._kill,"ax",%progbits + 61 .align 1 + 62 .global _kill + 63 .syntax unified + 64 .thumb + 65 .thumb_func + 67 _kill: + 68 .LVL0: + ARM GAS /tmp/cccbubnS.s page 3 + + + 69 .LFB27: + 52:Core/Src/syscalls.c **** + 53:Core/Src/syscalls.c **** int _kill(int pid, int sig) + 54:Core/Src/syscalls.c **** { + 70 .loc 1 54 1 is_stmt 1 view -0 + 71 .cfi_startproc + 72 @ args = 0, pretend = 0, frame = 0 + 73 @ frame_needed = 0, uses_anonymous_args = 0 + 74 .loc 1 54 1 is_stmt 0 view .LVU6 + 75 0000 08B5 push {r3, lr} + 76 .cfi_def_cfa_offset 8 + 77 .cfi_offset 3, -8 + 78 .cfi_offset 14, -4 + 55:Core/Src/syscalls.c **** (void)pid; + 79 .loc 1 55 3 is_stmt 1 view .LVU7 + 56:Core/Src/syscalls.c **** (void)sig; + 80 .loc 1 56 3 view .LVU8 + 57:Core/Src/syscalls.c **** errno = EINVAL; + 81 .loc 1 57 3 view .LVU9 + 82 0002 FFF7FEFF bl __errno + 83 .LVL1: + 84 .loc 1 57 9 is_stmt 0 view .LVU10 + 85 0006 1623 movs r3, #22 + 86 0008 0360 str r3, [r0] + 58:Core/Src/syscalls.c **** return -1; + 87 .loc 1 58 3 is_stmt 1 view .LVU11 + 59:Core/Src/syscalls.c **** } + 88 .loc 1 59 1 is_stmt 0 view .LVU12 + 89 000a 4FF0FF30 mov r0, #-1 + 90 000e 08BD pop {r3, pc} + 91 .cfi_endproc + 92 .LFE27: + 94 .section .text._exit,"ax",%progbits + 95 .align 1 + 96 .global _exit + 97 .syntax unified + 98 .thumb + 99 .thumb_func + 101 _exit: + 102 .LVL2: + 103 .LFB28: + 60:Core/Src/syscalls.c **** + 61:Core/Src/syscalls.c **** void _exit (int status) + 62:Core/Src/syscalls.c **** { + 104 .loc 1 62 1 is_stmt 1 view -0 + 105 .cfi_startproc + 106 @ Volatile: function does not return. + 107 @ args = 0, pretend = 0, frame = 0 + 108 @ frame_needed = 0, uses_anonymous_args = 0 + 109 .loc 1 62 1 is_stmt 0 view .LVU14 + 110 0000 08B5 push {r3, lr} + 111 .cfi_def_cfa_offset 8 + 112 .cfi_offset 3, -8 + 113 .cfi_offset 14, -4 + 63:Core/Src/syscalls.c **** _kill(status, -1); + 114 .loc 1 63 3 is_stmt 1 view .LVU15 + 115 0002 4FF0FF31 mov r1, #-1 + ARM GAS /tmp/cccbubnS.s page 4 + + + 116 0006 FFF7FEFF bl _kill + 117 .LVL3: + 118 .L6: + 64:Core/Src/syscalls.c **** while (1) {} /* Make sure we hang here */ + 119 .loc 1 64 3 discriminator 1 view .LVU16 + 120 .loc 1 64 14 discriminator 1 view .LVU17 + 121 .loc 1 64 9 discriminator 1 view .LVU18 + 122 000a FEE7 b .L6 + 123 .cfi_endproc + 124 .LFE28: + 126 .section .text._read,"ax",%progbits + 127 .align 1 + 128 .weak _read + 129 .syntax unified + 130 .thumb + 131 .thumb_func + 133 _read: + 134 .LVL4: + 135 .LFB29: + 65:Core/Src/syscalls.c **** } + 66:Core/Src/syscalls.c **** + 67:Core/Src/syscalls.c **** __attribute__((weak)) int _read(int file, char *ptr, int len) + 68:Core/Src/syscalls.c **** { + 136 .loc 1 68 1 view -0 + 137 .cfi_startproc + 138 @ args = 0, pretend = 0, frame = 0 + 139 @ frame_needed = 0, uses_anonymous_args = 0 + 140 .loc 1 68 1 is_stmt 0 view .LVU20 + 141 0000 70B5 push {r4, r5, r6, lr} + 142 .cfi_def_cfa_offset 16 + 143 .cfi_offset 4, -16 + 144 .cfi_offset 5, -12 + 145 .cfi_offset 6, -8 + 146 .cfi_offset 14, -4 + 147 0002 0C46 mov r4, r1 + 148 0004 1646 mov r6, r2 + 69:Core/Src/syscalls.c **** (void)file; + 149 .loc 1 69 3 is_stmt 1 view .LVU21 + 70:Core/Src/syscalls.c **** int DataIdx; + 150 .loc 1 70 3 view .LVU22 + 71:Core/Src/syscalls.c **** + 72:Core/Src/syscalls.c **** for (DataIdx = 0; DataIdx < len; DataIdx++) + 151 .loc 1 72 3 view .LVU23 + 152 .LVL5: + 153 .loc 1 72 16 is_stmt 0 view .LVU24 + 154 0006 0025 movs r5, #0 + 155 .loc 1 72 3 view .LVU25 + 156 0008 06E0 b .L9 + 157 .LVL6: + 158 .L10: + 73:Core/Src/syscalls.c **** { + 74:Core/Src/syscalls.c **** *ptr++ = __io_getchar(); + 159 .loc 1 74 5 is_stmt 1 discriminator 3 view .LVU26 + 160 .loc 1 74 14 is_stmt 0 discriminator 3 view .LVU27 + 161 000a FFF7FEFF bl __io_getchar + 162 .LVL7: + 163 .loc 1 74 9 discriminator 3 view .LVU28 + ARM GAS /tmp/cccbubnS.s page 5 + + + 164 000e 2146 mov r1, r4 + 165 .LVL8: + 166 .loc 1 74 12 discriminator 3 view .LVU29 + 167 0010 01F8010B strb r0, [r1], #1 + 168 .LVL9: + 72:Core/Src/syscalls.c **** { + 169 .loc 1 72 43 is_stmt 1 discriminator 3 view .LVU30 + 170 0014 0135 adds r5, r5, #1 + 171 .LVL10: + 172 .loc 1 74 9 is_stmt 0 discriminator 3 view .LVU31 + 173 0016 0C46 mov r4, r1 + 174 .LVL11: + 175 .L9: + 72:Core/Src/syscalls.c **** { + 176 .loc 1 72 29 is_stmt 1 discriminator 1 view .LVU32 + 177 0018 B542 cmp r5, r6 + 178 001a F6DB blt .L10 + 75:Core/Src/syscalls.c **** } + 76:Core/Src/syscalls.c **** + 77:Core/Src/syscalls.c **** return len; + 179 .loc 1 77 3 view .LVU33 + 78:Core/Src/syscalls.c **** } + 180 .loc 1 78 1 is_stmt 0 view .LVU34 + 181 001c 3046 mov r0, r6 + 182 001e 70BD pop {r4, r5, r6, pc} + 183 .loc 1 78 1 view .LVU35 + 184 .cfi_endproc + 185 .LFE29: + 187 .section .text._write,"ax",%progbits + 188 .align 1 + 189 .weak _write + 190 .syntax unified + 191 .thumb + 192 .thumb_func + 194 _write: + 195 .LVL12: + 196 .LFB30: + 79:Core/Src/syscalls.c **** + 80:Core/Src/syscalls.c **** __attribute__((weak)) int _write(int file, char *ptr, int len) + 81:Core/Src/syscalls.c **** { + 197 .loc 1 81 1 is_stmt 1 view -0 + 198 .cfi_startproc + 199 @ args = 0, pretend = 0, frame = 0 + 200 @ frame_needed = 0, uses_anonymous_args = 0 + 201 .loc 1 81 1 is_stmt 0 view .LVU37 + 202 0000 70B5 push {r4, r5, r6, lr} + 203 .cfi_def_cfa_offset 16 + 204 .cfi_offset 4, -16 + 205 .cfi_offset 5, -12 + 206 .cfi_offset 6, -8 + 207 .cfi_offset 14, -4 + 208 0002 0C46 mov r4, r1 + 209 0004 1646 mov r6, r2 + 82:Core/Src/syscalls.c **** (void)file; + 210 .loc 1 82 3 is_stmt 1 view .LVU38 + 83:Core/Src/syscalls.c **** int DataIdx; + 211 .loc 1 83 3 view .LVU39 + ARM GAS /tmp/cccbubnS.s page 6 + + + 84:Core/Src/syscalls.c **** + 85:Core/Src/syscalls.c **** for (DataIdx = 0; DataIdx < len; DataIdx++) + 212 .loc 1 85 3 view .LVU40 + 213 .LVL13: + 214 .loc 1 85 16 is_stmt 0 view .LVU41 + 215 0006 0025 movs r5, #0 + 216 .loc 1 85 3 view .LVU42 + 217 0008 04E0 b .L13 + 218 .LVL14: + 219 .L14: + 86:Core/Src/syscalls.c **** { + 87:Core/Src/syscalls.c **** __io_putchar(*ptr++); + 220 .loc 1 87 5 is_stmt 1 discriminator 3 view .LVU43 + 221 .loc 1 87 5 is_stmt 0 discriminator 3 view .LVU44 + 222 000a 14F8010B ldrb r0, [r4], #1 @ zero_extendqisi2 + 223 .LVL15: + 224 .loc 1 87 5 discriminator 3 view .LVU45 + 225 000e FFF7FEFF bl __io_putchar + 226 .LVL16: + 85:Core/Src/syscalls.c **** { + 227 .loc 1 85 43 is_stmt 1 discriminator 3 view .LVU46 + 228 0012 0135 adds r5, r5, #1 + 229 .LVL17: + 230 .L13: + 85:Core/Src/syscalls.c **** { + 231 .loc 1 85 29 discriminator 1 view .LVU47 + 232 0014 B542 cmp r5, r6 + 233 0016 F8DB blt .L14 + 88:Core/Src/syscalls.c **** } + 89:Core/Src/syscalls.c **** return len; + 234 .loc 1 89 3 view .LVU48 + 90:Core/Src/syscalls.c **** } + 235 .loc 1 90 1 is_stmt 0 view .LVU49 + 236 0018 3046 mov r0, r6 + 237 001a 70BD pop {r4, r5, r6, pc} + 238 .loc 1 90 1 view .LVU50 + 239 .cfi_endproc + 240 .LFE30: + 242 .section .text._close,"ax",%progbits + 243 .align 1 + 244 .global _close + 245 .syntax unified + 246 .thumb + 247 .thumb_func + 249 _close: + 250 .LVL18: + 251 .LFB31: + 91:Core/Src/syscalls.c **** + 92:Core/Src/syscalls.c **** int _close(int file) + 93:Core/Src/syscalls.c **** { + 252 .loc 1 93 1 is_stmt 1 view -0 + 253 .cfi_startproc + 254 @ args = 0, pretend = 0, frame = 0 + 255 @ frame_needed = 0, uses_anonymous_args = 0 + 256 @ link register save eliminated. + 94:Core/Src/syscalls.c **** (void)file; + 257 .loc 1 94 3 view .LVU52 + ARM GAS /tmp/cccbubnS.s page 7 + + + 95:Core/Src/syscalls.c **** return -1; + 258 .loc 1 95 3 view .LVU53 + 96:Core/Src/syscalls.c **** } + 259 .loc 1 96 1 is_stmt 0 view .LVU54 + 260 0000 4FF0FF30 mov r0, #-1 + 261 .LVL19: + 262 .loc 1 96 1 view .LVU55 + 263 0004 7047 bx lr + 264 .cfi_endproc + 265 .LFE31: + 267 .section .text._fstat,"ax",%progbits + 268 .align 1 + 269 .global _fstat + 270 .syntax unified + 271 .thumb + 272 .thumb_func + 274 _fstat: + 275 .LVL20: + 276 .LFB32: + 97:Core/Src/syscalls.c **** + 98:Core/Src/syscalls.c **** + 99:Core/Src/syscalls.c **** int _fstat(int file, struct stat *st) + 100:Core/Src/syscalls.c **** { + 277 .loc 1 100 1 is_stmt 1 view -0 + 278 .cfi_startproc + 279 @ args = 0, pretend = 0, frame = 0 + 280 @ frame_needed = 0, uses_anonymous_args = 0 + 281 @ link register save eliminated. + 101:Core/Src/syscalls.c **** (void)file; + 282 .loc 1 101 3 view .LVU57 + 102:Core/Src/syscalls.c **** st->st_mode = S_IFCHR; + 283 .loc 1 102 3 view .LVU58 + 284 .loc 1 102 15 is_stmt 0 view .LVU59 + 285 0000 4FF40053 mov r3, #8192 + 286 0004 4B60 str r3, [r1, #4] + 103:Core/Src/syscalls.c **** return 0; + 287 .loc 1 103 3 is_stmt 1 view .LVU60 + 104:Core/Src/syscalls.c **** } + 288 .loc 1 104 1 is_stmt 0 view .LVU61 + 289 0006 0020 movs r0, #0 + 290 .LVL21: + 291 .loc 1 104 1 view .LVU62 + 292 0008 7047 bx lr + 293 .cfi_endproc + 294 .LFE32: + 296 .section .text._isatty,"ax",%progbits + 297 .align 1 + 298 .global _isatty + 299 .syntax unified + 300 .thumb + 301 .thumb_func + 303 _isatty: + 304 .LVL22: + 305 .LFB33: + 105:Core/Src/syscalls.c **** + 106:Core/Src/syscalls.c **** int _isatty(int file) + 107:Core/Src/syscalls.c **** { + ARM GAS /tmp/cccbubnS.s page 8 + + + 306 .loc 1 107 1 is_stmt 1 view -0 + 307 .cfi_startproc + 308 @ args = 0, pretend = 0, frame = 0 + 309 @ frame_needed = 0, uses_anonymous_args = 0 + 310 @ link register save eliminated. + 108:Core/Src/syscalls.c **** (void)file; + 311 .loc 1 108 3 view .LVU64 + 109:Core/Src/syscalls.c **** return 1; + 312 .loc 1 109 3 view .LVU65 + 110:Core/Src/syscalls.c **** } + 313 .loc 1 110 1 is_stmt 0 view .LVU66 + 314 0000 0120 movs r0, #1 + 315 .LVL23: + 316 .loc 1 110 1 view .LVU67 + 317 0002 7047 bx lr + 318 .cfi_endproc + 319 .LFE33: + 321 .section .text._lseek,"ax",%progbits + 322 .align 1 + 323 .global _lseek + 324 .syntax unified + 325 .thumb + 326 .thumb_func + 328 _lseek: + 329 .LVL24: + 330 .LFB34: + 111:Core/Src/syscalls.c **** + 112:Core/Src/syscalls.c **** int _lseek(int file, int ptr, int dir) + 113:Core/Src/syscalls.c **** { + 331 .loc 1 113 1 is_stmt 1 view -0 + 332 .cfi_startproc + 333 @ args = 0, pretend = 0, frame = 0 + 334 @ frame_needed = 0, uses_anonymous_args = 0 + 335 @ link register save eliminated. + 114:Core/Src/syscalls.c **** (void)file; + 336 .loc 1 114 3 view .LVU69 + 115:Core/Src/syscalls.c **** (void)ptr; + 337 .loc 1 115 3 view .LVU70 + 116:Core/Src/syscalls.c **** (void)dir; + 338 .loc 1 116 3 view .LVU71 + 117:Core/Src/syscalls.c **** return 0; + 339 .loc 1 117 3 view .LVU72 + 118:Core/Src/syscalls.c **** } + 340 .loc 1 118 1 is_stmt 0 view .LVU73 + 341 0000 0020 movs r0, #0 + 342 .LVL25: + 343 .loc 1 118 1 view .LVU74 + 344 0002 7047 bx lr + 345 .cfi_endproc + 346 .LFE34: + 348 .section .text._open,"ax",%progbits + 349 .align 1 + 350 .global _open + 351 .syntax unified + 352 .thumb + 353 .thumb_func + 355 _open: + ARM GAS /tmp/cccbubnS.s page 9 + + + 356 .LVL26: + 357 .LFB35: + 119:Core/Src/syscalls.c **** + 120:Core/Src/syscalls.c **** int _open(char *path, int flags, ...) + 121:Core/Src/syscalls.c **** { + 358 .loc 1 121 1 is_stmt 1 view -0 + 359 .cfi_startproc + 360 @ args = 4, pretend = 12, frame = 0 + 361 @ frame_needed = 0, uses_anonymous_args = 1 + 362 @ link register save eliminated. + 363 .loc 1 121 1 is_stmt 0 view .LVU76 + 364 0000 0EB4 push {r1, r2, r3} + 365 .cfi_def_cfa_offset 12 + 366 .cfi_offset 1, -12 + 367 .cfi_offset 2, -8 + 368 .cfi_offset 3, -4 + 122:Core/Src/syscalls.c **** (void)path; + 369 .loc 1 122 3 is_stmt 1 view .LVU77 + 123:Core/Src/syscalls.c **** (void)flags; + 370 .loc 1 123 3 view .LVU78 + 124:Core/Src/syscalls.c **** /* Pretend like we always fail */ + 125:Core/Src/syscalls.c **** return -1; + 371 .loc 1 125 3 view .LVU79 + 126:Core/Src/syscalls.c **** } + 372 .loc 1 126 1 is_stmt 0 view .LVU80 + 373 0002 4FF0FF30 mov r0, #-1 + 374 .LVL27: + 375 .loc 1 126 1 view .LVU81 + 376 0006 03B0 add sp, sp, #12 + 377 .cfi_restore 3 + 378 .cfi_restore 2 + 379 .cfi_restore 1 + 380 .cfi_def_cfa_offset 0 + 381 0008 7047 bx lr + 382 .cfi_endproc + 383 .LFE35: + 385 .section .text._wait,"ax",%progbits + 386 .align 1 + 387 .global _wait + 388 .syntax unified + 389 .thumb + 390 .thumb_func + 392 _wait: + 393 .LVL28: + 394 .LFB36: + 127:Core/Src/syscalls.c **** + 128:Core/Src/syscalls.c **** int _wait(int *status) + 129:Core/Src/syscalls.c **** { + 395 .loc 1 129 1 is_stmt 1 view -0 + 396 .cfi_startproc + 397 @ args = 0, pretend = 0, frame = 0 + 398 @ frame_needed = 0, uses_anonymous_args = 0 + 399 .loc 1 129 1 is_stmt 0 view .LVU83 + 400 0000 08B5 push {r3, lr} + 401 .cfi_def_cfa_offset 8 + 402 .cfi_offset 3, -8 + 403 .cfi_offset 14, -4 + ARM GAS /tmp/cccbubnS.s page 10 + + + 130:Core/Src/syscalls.c **** (void)status; + 404 .loc 1 130 3 is_stmt 1 view .LVU84 + 131:Core/Src/syscalls.c **** errno = ECHILD; + 405 .loc 1 131 3 view .LVU85 + 406 0002 FFF7FEFF bl __errno + 407 .LVL29: + 408 .loc 1 131 9 is_stmt 0 view .LVU86 + 409 0006 0A23 movs r3, #10 + 410 0008 0360 str r3, [r0] + 132:Core/Src/syscalls.c **** return -1; + 411 .loc 1 132 3 is_stmt 1 view .LVU87 + 133:Core/Src/syscalls.c **** } + 412 .loc 1 133 1 is_stmt 0 view .LVU88 + 413 000a 4FF0FF30 mov r0, #-1 + 414 000e 08BD pop {r3, pc} + 415 .cfi_endproc + 416 .LFE36: + 418 .section .text._unlink,"ax",%progbits + 419 .align 1 + 420 .global _unlink + 421 .syntax unified + 422 .thumb + 423 .thumb_func + 425 _unlink: + 426 .LVL30: + 427 .LFB37: + 134:Core/Src/syscalls.c **** + 135:Core/Src/syscalls.c **** int _unlink(char *name) + 136:Core/Src/syscalls.c **** { + 428 .loc 1 136 1 is_stmt 1 view -0 + 429 .cfi_startproc + 430 @ args = 0, pretend = 0, frame = 0 + 431 @ frame_needed = 0, uses_anonymous_args = 0 + 432 .loc 1 136 1 is_stmt 0 view .LVU90 + 433 0000 08B5 push {r3, lr} + 434 .cfi_def_cfa_offset 8 + 435 .cfi_offset 3, -8 + 436 .cfi_offset 14, -4 + 137:Core/Src/syscalls.c **** (void)name; + 437 .loc 1 137 3 is_stmt 1 view .LVU91 + 138:Core/Src/syscalls.c **** errno = ENOENT; + 438 .loc 1 138 3 view .LVU92 + 439 0002 FFF7FEFF bl __errno + 440 .LVL31: + 441 .loc 1 138 9 is_stmt 0 view .LVU93 + 442 0006 0223 movs r3, #2 + 443 0008 0360 str r3, [r0] + 139:Core/Src/syscalls.c **** return -1; + 444 .loc 1 139 3 is_stmt 1 view .LVU94 + 140:Core/Src/syscalls.c **** } + 445 .loc 1 140 1 is_stmt 0 view .LVU95 + 446 000a 4FF0FF30 mov r0, #-1 + 447 000e 08BD pop {r3, pc} + 448 .cfi_endproc + 449 .LFE37: + 451 .section .text._times,"ax",%progbits + 452 .align 1 + ARM GAS /tmp/cccbubnS.s page 11 + + + 453 .global _times + 454 .syntax unified + 455 .thumb + 456 .thumb_func + 458 _times: + 459 .LVL32: + 460 .LFB38: + 141:Core/Src/syscalls.c **** + 142:Core/Src/syscalls.c **** int _times(struct tms *buf) + 143:Core/Src/syscalls.c **** { + 461 .loc 1 143 1 is_stmt 1 view -0 + 462 .cfi_startproc + 463 @ args = 0, pretend = 0, frame = 0 + 464 @ frame_needed = 0, uses_anonymous_args = 0 + 465 @ link register save eliminated. + 144:Core/Src/syscalls.c **** (void)buf; + 466 .loc 1 144 3 view .LVU97 + 145:Core/Src/syscalls.c **** return -1; + 467 .loc 1 145 3 view .LVU98 + 146:Core/Src/syscalls.c **** } + 468 .loc 1 146 1 is_stmt 0 view .LVU99 + 469 0000 4FF0FF30 mov r0, #-1 + 470 .LVL33: + 471 .loc 1 146 1 view .LVU100 + 472 0004 7047 bx lr + 473 .cfi_endproc + 474 .LFE38: + 476 .section .text._stat,"ax",%progbits + 477 .align 1 + 478 .global _stat + 479 .syntax unified + 480 .thumb + 481 .thumb_func + 483 _stat: + 484 .LVL34: + 485 .LFB39: + 147:Core/Src/syscalls.c **** + 148:Core/Src/syscalls.c **** int _stat(char *file, struct stat *st) + 149:Core/Src/syscalls.c **** { + 486 .loc 1 149 1 is_stmt 1 view -0 + 487 .cfi_startproc + 488 @ args = 0, pretend = 0, frame = 0 + 489 @ frame_needed = 0, uses_anonymous_args = 0 + 490 @ link register save eliminated. + 150:Core/Src/syscalls.c **** (void)file; + 491 .loc 1 150 3 view .LVU102 + 151:Core/Src/syscalls.c **** st->st_mode = S_IFCHR; + 492 .loc 1 151 3 view .LVU103 + 493 .loc 1 151 15 is_stmt 0 view .LVU104 + 494 0000 4FF40053 mov r3, #8192 + 495 0004 4B60 str r3, [r1, #4] + 152:Core/Src/syscalls.c **** return 0; + 496 .loc 1 152 3 is_stmt 1 view .LVU105 + 153:Core/Src/syscalls.c **** } + 497 .loc 1 153 1 is_stmt 0 view .LVU106 + 498 0006 0020 movs r0, #0 + 499 .LVL35: + ARM GAS /tmp/cccbubnS.s page 12 + + + 500 .loc 1 153 1 view .LVU107 + 501 0008 7047 bx lr + 502 .cfi_endproc + 503 .LFE39: + 505 .section .text._link,"ax",%progbits + 506 .align 1 + 507 .global _link + 508 .syntax unified + 509 .thumb + 510 .thumb_func + 512 _link: + 513 .LVL36: + 514 .LFB40: + 154:Core/Src/syscalls.c **** + 155:Core/Src/syscalls.c **** int _link(char *old, char *new) + 156:Core/Src/syscalls.c **** { + 515 .loc 1 156 1 is_stmt 1 view -0 + 516 .cfi_startproc + 517 @ args = 0, pretend = 0, frame = 0 + 518 @ frame_needed = 0, uses_anonymous_args = 0 + 519 .loc 1 156 1 is_stmt 0 view .LVU109 + 520 0000 08B5 push {r3, lr} + 521 .cfi_def_cfa_offset 8 + 522 .cfi_offset 3, -8 + 523 .cfi_offset 14, -4 + 157:Core/Src/syscalls.c **** (void)old; + 524 .loc 1 157 3 is_stmt 1 view .LVU110 + 158:Core/Src/syscalls.c **** (void)new; + 525 .loc 1 158 3 view .LVU111 + 159:Core/Src/syscalls.c **** errno = EMLINK; + 526 .loc 1 159 3 view .LVU112 + 527 0002 FFF7FEFF bl __errno + 528 .LVL37: + 529 .loc 1 159 9 is_stmt 0 view .LVU113 + 530 0006 1F23 movs r3, #31 + 531 0008 0360 str r3, [r0] + 160:Core/Src/syscalls.c **** return -1; + 532 .loc 1 160 3 is_stmt 1 view .LVU114 + 161:Core/Src/syscalls.c **** } + 533 .loc 1 161 1 is_stmt 0 view .LVU115 + 534 000a 4FF0FF30 mov r0, #-1 + 535 000e 08BD pop {r3, pc} + 536 .cfi_endproc + 537 .LFE40: + 539 .section .text._fork,"ax",%progbits + 540 .align 1 + 541 .global _fork + 542 .syntax unified + 543 .thumb + 544 .thumb_func + 546 _fork: + 547 .LFB41: + 162:Core/Src/syscalls.c **** + 163:Core/Src/syscalls.c **** int _fork(void) + 164:Core/Src/syscalls.c **** { + 548 .loc 1 164 1 is_stmt 1 view -0 + 549 .cfi_startproc + ARM GAS /tmp/cccbubnS.s page 13 + + + 550 @ args = 0, pretend = 0, frame = 0 + 551 @ frame_needed = 0, uses_anonymous_args = 0 + 552 0000 08B5 push {r3, lr} + 553 .cfi_def_cfa_offset 8 + 554 .cfi_offset 3, -8 + 555 .cfi_offset 14, -4 + 165:Core/Src/syscalls.c **** errno = EAGAIN; + 556 .loc 1 165 3 view .LVU117 + 557 0002 FFF7FEFF bl __errno + 558 .LVL38: + 559 .loc 1 165 9 is_stmt 0 view .LVU118 + 560 0006 0B23 movs r3, #11 + 561 0008 0360 str r3, [r0] + 166:Core/Src/syscalls.c **** return -1; + 562 .loc 1 166 3 is_stmt 1 view .LVU119 + 167:Core/Src/syscalls.c **** } + 563 .loc 1 167 1 is_stmt 0 view .LVU120 + 564 000a 4FF0FF30 mov r0, #-1 + 565 000e 08BD pop {r3, pc} + 566 .cfi_endproc + 567 .LFE41: + 569 .section .text._execve,"ax",%progbits + 570 .align 1 + 571 .global _execve + 572 .syntax unified + 573 .thumb + 574 .thumb_func + 576 _execve: + 577 .LVL39: + 578 .LFB42: + 168:Core/Src/syscalls.c **** + 169:Core/Src/syscalls.c **** int _execve(char *name, char **argv, char **env) + 170:Core/Src/syscalls.c **** { + 579 .loc 1 170 1 is_stmt 1 view -0 + 580 .cfi_startproc + 581 @ args = 0, pretend = 0, frame = 0 + 582 @ frame_needed = 0, uses_anonymous_args = 0 + 583 .loc 1 170 1 is_stmt 0 view .LVU122 + 584 0000 08B5 push {r3, lr} + 585 .cfi_def_cfa_offset 8 + 586 .cfi_offset 3, -8 + 587 .cfi_offset 14, -4 + 171:Core/Src/syscalls.c **** (void)name; + 588 .loc 1 171 3 is_stmt 1 view .LVU123 + 172:Core/Src/syscalls.c **** (void)argv; + 589 .loc 1 172 3 view .LVU124 + 173:Core/Src/syscalls.c **** (void)env; + 590 .loc 1 173 3 view .LVU125 + 174:Core/Src/syscalls.c **** errno = ENOMEM; + 591 .loc 1 174 3 view .LVU126 + 592 0002 FFF7FEFF bl __errno + 593 .LVL40: + 594 .loc 1 174 9 is_stmt 0 view .LVU127 + 595 0006 0C23 movs r3, #12 + 596 0008 0360 str r3, [r0] + 175:Core/Src/syscalls.c **** return -1; + 597 .loc 1 175 3 is_stmt 1 view .LVU128 + ARM GAS /tmp/cccbubnS.s page 14 + + + 176:Core/Src/syscalls.c **** } + 598 .loc 1 176 1 is_stmt 0 view .LVU129 + 599 000a 4FF0FF30 mov r0, #-1 + 600 000e 08BD pop {r3, pc} + 601 .cfi_endproc + 602 .LFE42: + 604 .global environ + 605 .section .data.environ,"aw" + 606 .align 2 + 609 environ: + 610 0000 00000000 .word __env + 611 .global __env + 612 .section .bss.__env,"aw",%nobits + 613 .align 2 + 616 __env: + 617 0000 00000000 .space 4 + 618 .weak __io_putchar + 619 .weak __io_getchar + 620 .text + 621 .Letext0: + 622 .file 2 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 623 .file 3 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 624 .file 4 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 625 .file 5 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 626 .file 6 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 627 .file 7 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 628 .file 8 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 629 .file 9 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + ARM GAS /tmp/cccbubnS.s page 15 + + +DEFINED SYMBOLS + *ABS*:0000000000000000 syscalls.c + /tmp/cccbubnS.s:21 .text.initialise_monitor_handles:0000000000000000 $t + /tmp/cccbubnS.s:27 .text.initialise_monitor_handles:0000000000000000 initialise_monitor_handles + /tmp/cccbubnS.s:40 .text._getpid:0000000000000000 $t + /tmp/cccbubnS.s:46 .text._getpid:0000000000000000 _getpid + /tmp/cccbubnS.s:61 .text._kill:0000000000000000 $t + /tmp/cccbubnS.s:67 .text._kill:0000000000000000 _kill + /tmp/cccbubnS.s:95 .text._exit:0000000000000000 $t + /tmp/cccbubnS.s:101 .text._exit:0000000000000000 _exit + /tmp/cccbubnS.s:127 .text._read:0000000000000000 $t + /tmp/cccbubnS.s:133 .text._read:0000000000000000 _read + /tmp/cccbubnS.s:188 .text._write:0000000000000000 $t + /tmp/cccbubnS.s:194 .text._write:0000000000000000 _write + /tmp/cccbubnS.s:243 .text._close:0000000000000000 $t + /tmp/cccbubnS.s:249 .text._close:0000000000000000 _close + /tmp/cccbubnS.s:268 .text._fstat:0000000000000000 $t + /tmp/cccbubnS.s:274 .text._fstat:0000000000000000 _fstat + /tmp/cccbubnS.s:297 .text._isatty:0000000000000000 $t + /tmp/cccbubnS.s:303 .text._isatty:0000000000000000 _isatty + /tmp/cccbubnS.s:322 .text._lseek:0000000000000000 $t + /tmp/cccbubnS.s:328 .text._lseek:0000000000000000 _lseek + /tmp/cccbubnS.s:349 .text._open:0000000000000000 $t + /tmp/cccbubnS.s:355 .text._open:0000000000000000 _open + /tmp/cccbubnS.s:386 .text._wait:0000000000000000 $t + /tmp/cccbubnS.s:392 .text._wait:0000000000000000 _wait + /tmp/cccbubnS.s:419 .text._unlink:0000000000000000 $t + /tmp/cccbubnS.s:425 .text._unlink:0000000000000000 _unlink + /tmp/cccbubnS.s:452 .text._times:0000000000000000 $t + /tmp/cccbubnS.s:458 .text._times:0000000000000000 _times + /tmp/cccbubnS.s:477 .text._stat:0000000000000000 $t + /tmp/cccbubnS.s:483 .text._stat:0000000000000000 _stat + /tmp/cccbubnS.s:506 .text._link:0000000000000000 $t + /tmp/cccbubnS.s:512 .text._link:0000000000000000 _link + /tmp/cccbubnS.s:540 .text._fork:0000000000000000 $t + /tmp/cccbubnS.s:546 .text._fork:0000000000000000 _fork + /tmp/cccbubnS.s:570 .text._execve:0000000000000000 $t + /tmp/cccbubnS.s:576 .text._execve:0000000000000000 _execve + /tmp/cccbubnS.s:609 .data.environ:0000000000000000 environ + /tmp/cccbubnS.s:606 .data.environ:0000000000000000 $d + /tmp/cccbubnS.s:616 .bss.__env:0000000000000000 __env + /tmp/cccbubnS.s:613 .bss.__env:0000000000000000 $d + +UNDEFINED SYMBOLS +__errno +__io_getchar +__io_putchar diff --git a/BMS_Testbench/BMS_Software_V1/build/syscalls.o b/BMS_Testbench/BMS_Software_V1/build/syscalls.o new file mode 100644 index 0000000000000000000000000000000000000000..d47faf60fe3d6760f0f01f423957dcb3e72107e9 GIT binary patch literal 12744 zcmd5?d5~PidG9xGW_EUVwc6d$v8w}Sbr=b0W)Gbl0!a%x0HKuxgaGj{JIC&z*_mNx zcD0y8ayS&g97!-Xk!&z>*(gPfOd&{2aJUk1NQ%R_iV7G+#RXK1ZE(P-;>61D*YE4u zH%~|4zjSTCUw=n`{q@)Vy8HF)&T}tVXIYjq$x;i{1f|rjg<29=s$qdzrk1MGdMjF5 zA3AvCvp*b}HrKv#^G8Q|LQjPb0(;5(!~3O!&FiMEQ}cs|NO!HX4qHvuvgUOM*Z%I! zo^_?CjNE@{3MACAmK|JsSj%Xww0`p^YTNl&DzwA4h%Jv%VjnOqhg~hxg0DtDy7@Ke;W zPik2U1?w&_>^V+(J{We~Dc?+;m6JJ4*265H*>MKT@3DNgQ&udW@09-u4%nAX*+`u` z$j`R!WBGmZf2MUpAv$S=o}v#gLFhlV{VG6sAM{%T-D@HCoef5yr*SgM%C{Vvf!+o> z8dBERp%zR|xgC_X4v%1V>Ni*pvAjLPfLJf1UhvlTpR&Az`g_`c$+91og7>#S!g2>5 z!F}ydvV4I2@3+6e@({~Uw!g#j+blmF`3&XoW3Y2+!_4c!@?8x^!|d=4+PzueG@KO9 z(r@42L95~9@Pi=yzH2FoHvIrZ$k$FuSNJv%Vc$RC*)S)3FQ6GpAm(aoExs7l=7r0U zwEFhYz^Rd$AUb@9Ni5RD0^cR9vse==eYewEtnEU;2H$&Bi#Icj7x>oGT2CXL9#Bnd zQRxm8o3BT~QjzLNMYV?7LN9~odj_hZ_V8t>r+gt25l#4gi@^y^(L~7iGsr_zHPNh^ zY*6nQi%L!UGE`4#puGSrfYFM_f{+EmVT4#?$`;Vp+~zR|XQ4Qi1=X?;)vS4%+wwNp zjgd)90U=856?p6qXhoE0*4oRd;6DO``y(_UBC~NQOFy!A!fi`p_N~9VqRdvri3au?F^ds1_58-iVtu}jL?akAT!O^U` zvxCLI0`p#E72;6aFQFg1Yc-s>eV^?yZo75dehB5iL3Vi=M%7)OT0dv4{S>rvSYAYp z=j&_T1mSqCmeaQx0o3|7^v8AI_*%V*JncN_TH`Z0puRt^PRB}wQmIxMZJ}#PR%R$l ztyKIS@^6tFOVzR}%^=I#(wNSHn5&7c%Kiv;ukx6=)0nxcjcSw7^G0N4kK>W5DLW3o zV3bq3&3RCavH}JpHCG11ejKe_QLE^T!zZTV6}sXXsI)@2!qsg+_Y?&+3)$K`h&sAw z17D&`TcOC;H^`n1^l|QtAZN(RX9{ZI3~Jp0@>b-@Uq(E)k@Fo;-$HI^2N48U*>mAq zf33ABSk~TGOl$q~S?h7scobQ;*5Aw4UPb;1S!}KUbZT+$`4zHmZ5=rQju~=83kbfr zsw0huwTc1Iub#EH4Lh8kC98C-XFz=#awmgJS*tZ*@3RJ4tu4OBBXIX0!CzL3q%%J+ zgI=(dORHs**=#TB$B=`S+>lzhiPM#(F($M&XEMw=^|r&$>cvtI4u9 zMp$U>QX3=P@NLpkck5?&`cSVWuC%|pM|AhhPK?=vVpl`W&(@8~*Kq^tw6$6DTOx3H zX3NFX+pJdfp&KB|z#nM!V{YBA`8D@VhE7`DT+YPR+9U7{Gaw)n$g z>mq-+#jaZS`&(vN7rCPxwzi_GbqUXcD#%KHoPT=m_xq<=+!w**!>@E3(OMg18qp-Q zF{u@8v`(?FMjKP2*!Em<-A43SZOo`|qY?dRY@TSNHWQ8+=m474^9B>-yJ(Kf1U)s$ zp(i+8qL|EqJ*p{ZU1w3Z2IPXrWGoppd}GI;x1Qm9kv2z>%`1Sl5>D%vIvl5#^K@&v`K_veUfAl#SX6!1?^`A*eB+^vv!t^6i{(uBwsJ~! z4;M!=-Rb05F5MkZ6${ziPhA4}_r-f-y?p9Ms+mHy zUavb>NaaUiZX}r+&J{BM@BFGZ`Ov)im9Y`wGWL21`Kto_=%H=}QDPpnIn>hw^u@&)I7{>`tj}@>Z z_ympke0BU~RuGb4S0oZ>48~FF)=GAr(kf9>KEHK-poL%s8Z~&Dc}_X1t0GeZt+X5s z1fXXJ=jduSSgdEq1I>hJV3C$CcDT@*4cZEx6tI`jk9eIMuN>F7He&G^uUXWVq5-?_ zXhUx)Mni`q?&-k4i)gYA%PQ85dQ|>nqPAD`kt1?UdxeL^{Vv3Yee;aOF3SwX2}WY~ z=TW*7qjQ|@-6NtCbZ<|si4#qUeKgc{0#El(m^s=`rJ5*XB~Yn+F||EWRrrw0m5T*6 znoEO9JqOKCkE)Jg5v8%hf0^WD*HH6ZuTCQeD0jlJyr}9PRI25p`C# zXkSlXUvFQ}vS@51RT^EDLbc3zY-B0u>hS2uATSGlwluahRw>2Oz01kT7n9W(*2z`F z$#NQuWH~jw3M=T?icD-|QMMF~4dE{h*RsH&G|X%UC!0=IlQG1qnkyD6ptGX|U9RyM z8HuCH6>`;FGM}qt5+g;Fi{->{vXIVaDk@(r3`O;WT|}KB9OM&FOSAL2LJ?0rP!(sO z_^d#okk1u3z@r5m^9z}DG=&bRLK1_C@qi$)BZ*Pcmea-2L5vHG!=6f%Gf6g)D<+0A zRb36kUf{U9O=a`RA-8+AhUllbSI2{S?G&b0313CY@(`wl2>~2}JgFxUJqMMnj#d$ zY3>B6t|3ZFn2k%FIF&}7IGuw*-N~r0?O|9?mKRvo&d;kZ4C|`#) z<&o&QBZHZA8Z!dI==jRziRDWddfyQoLU_<=S=LF`9G)fXlAGaIALGJcBH`dML7-&I(cLg@9(r8K z#;CjdK5;a6lx!TS>*cu6aU~l^`+B)KvYYxLkDOQ16UoLWL4AGmDd6bXkk-rVDO)h8MA)59b`z-I<&k%J zf-Va(J&2^|9@53^o zIaAs(|M}yON#yk-Q=j9~j$dc=4?ieJk>_B(Zw8taMS;IYQJ-tt9MnnyO^TvWLZ+N= zRy*eV4x#y`v?IDV2<`aSs&1*H+teL(`t9m3g?9XpsQc>Zsp>mIJMB$Z57pK0P(P^C z?^KV~(KFSL>gd_(Sl=5)K1Mj);PzigxQ!#;+-iU-&fV z(j&YImy)EhRWmvaZ$rxf1^%6kM?2=YfB z^3N4KPw-N~gkV;1yWlRt-GW~e{HEY{1rG@Rz2J+2uL~X${7~?)U=t=c{c07QCAdIv znP9)*X2Ht^hXgBvI|ca*AnkrbaG&5Kf=>#*Ao#lAyMn(K{JmfZ14VmN1?LEM3!W*s zQScJMlwe7aKVZ_%LxKkd`4cwzhXg+)V*EcA`hSQQ;C>%lIQ3==E)+an@EjtR$!$Xa z2@%U)QZOt0lF(Jb8wGa@evJq__Y%?G14Jyxj|lQ-UGkqJ&Qe0Dd7(ZmPLLY5!=%3LVsQ4_X&PmAhh>J12ek>DQ_VK*i65h50?>x90Ah<0uhyif33f)5KG5IjgkJ3kis zS-}^Gu=}dW-yq_Lp!bFTn22^h75p!ew>LQUc=PLP#4l__=$$6GLGS{>Ekx*DPJ|y> zBJ$Njj}s9~o(TD#ED*#JujxyOnC~NkHxV)4_Yg6kA0=Ym{)CA6c!P#XU+eSp33xfF6()5FZPY@BG*93nn807i^{!Aj`)kj4C^m+wEn3ON({L29Q z#gioa8zn-n`-ggZUxA&KV7RE!k=Cu{8>RnC2YOgpME0z*+_(u z%|!TfF%kY;PK41U5&jGj&G?~_3TgQBuNDyTd54Jjd`3ik_&+a<>pCKw=D$bKAH9yl zAH8nFpHpq{5ubC3@Mn++f4)kDKi?z5AO4pD{dtcFe;T>|%vGwJ2!95M@Q2@;zNIo= z@N1sXdc5EtL|U%L3w~k?(X<{X_?s45j}QFbCG<^1_`g@^2Z-p$!$Kb*qCa}SMwlMwd~-qDdF<4s^YxnQ}Mw{Ma9X8pWr6XQ81^_csY|7jy{jN zXni7e(fVxaqMeIXsqEa03E^C_3L!UNLOD0PLg))Pw?$qBx@bAQineox6+)k6U8?#_ z>!S5_my4E*W6fc(;^xH5pv9eIuOrM1jt=2=E?Y!YbvZdWSjN?{ONu)^T#{B1Y(`JC z%E`hIt~_0=a$)EwHTan^hB1T+Kc$U~;8!kpy=T%t}vY=Lr-~+sa^cSBJItH{&x`^zy$M1(`WRpz0+re<#`^aUF zc8tB9D7)=(zl==}hFkAJ&}_>jqxU=*ZoTh;K9=6A9=*Q?eXMrh z_2@kYx)s?Z)9%l~aK|O&iVK$cT3kLx+3g?wJ(j&+dF-{i>|vXz**oH~_d4if#km=c zy4(FX=pC!S{C;%n{Q`Q&@{jwCyT2VS|9Hk=%sDT(AGz&)avXd7UUl1xy6kaHG4{Bh zx$XHu9Lv9z9(xO1_V5bS>|H4K%=*Iplx>-0%IA6P^|#K+n_xsrG>RjEiB4{BJ)~rrs5p z1ecph4BE(UM#0_g8*`n1&}6$fCe+&H{|cHqV5=vv2t34sBqO`eWAA}^&KZ^VxW=1) z9Prpn;7oOmF$OgD9`@K<38(Icoc0zX8+*@t?7abd{Ps1;*n8Sz??sorMJ{`Csy`&G{!`saDhbK=cg13cb5&K$3Cw7vQW)Z#S~( z@2Aj%JEdCvj`}^=m?pZ0U9E)PAsAT#KF|KN$M=eDy1J)2@bbI@o=L_Yj<$7r;}}%_ Kcc)24?|%Ve==xy* literal 0 HcmV?d00001 diff --git a/BMS_Testbench/BMS_Software_V1/build/sysmem.d b/BMS_Testbench/BMS_Software_V1/build/sysmem.d new file mode 100644 index 0000000..5d0bd84 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/sysmem.d @@ -0,0 +1 @@ +build/sysmem.o: Core/Src/sysmem.c diff --git a/BMS_Testbench/BMS_Software_V1/build/sysmem.lst b/BMS_Testbench/BMS_Software_V1/build/sysmem.lst new file mode 100644 index 0000000..a21f46d --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/sysmem.lst @@ -0,0 +1,230 @@ +ARM GAS /tmp/ccisrOc0.s page 1 + + + 1 .cpu cortex-m4 + 2 .arch armv7e-m + 3 .fpu fpv4-sp-d16 + 4 .eabi_attribute 27, 1 + 5 .eabi_attribute 28, 1 + 6 .eabi_attribute 20, 1 + 7 .eabi_attribute 21, 1 + 8 .eabi_attribute 23, 3 + 9 .eabi_attribute 24, 1 + 10 .eabi_attribute 25, 1 + 11 .eabi_attribute 26, 1 + 12 .eabi_attribute 30, 1 + 13 .eabi_attribute 34, 1 + 14 .eabi_attribute 18, 4 + 15 .file "sysmem.c" + 16 .text + 17 .Ltext0: + 18 .cfi_sections .debug_frame + 19 .file 1 "Core/Src/sysmem.c" + 20 .section .text._sbrk,"ax",%progbits + 21 .align 1 + 22 .global _sbrk + 23 .syntax unified + 24 .thumb + 25 .thumb_func + 27 _sbrk: + 28 .LVL0: + 29 .LFB0: + 1:Core/Src/sysmem.c **** /** + 2:Core/Src/sysmem.c **** ****************************************************************************** + 3:Core/Src/sysmem.c **** * @file sysmem.c + 4:Core/Src/sysmem.c **** * @author Generated by STM32CubeIDE + 5:Core/Src/sysmem.c **** * @brief STM32CubeIDE System Memory calls file + 6:Core/Src/sysmem.c **** * + 7:Core/Src/sysmem.c **** * For more information about which C functions + 8:Core/Src/sysmem.c **** * need which of these lowlevel functions + 9:Core/Src/sysmem.c **** * please consult the newlib libc manual + 10:Core/Src/sysmem.c **** ****************************************************************************** + 11:Core/Src/sysmem.c **** * @attention + 12:Core/Src/sysmem.c **** * + 13:Core/Src/sysmem.c **** * Copyright (c) 2022 STMicroelectronics. + 14:Core/Src/sysmem.c **** * All rights reserved. + 15:Core/Src/sysmem.c **** * + 16:Core/Src/sysmem.c **** * This software is licensed under terms that can be found in the LICENSE file + 17:Core/Src/sysmem.c **** * in the root directory of this software component. + 18:Core/Src/sysmem.c **** * If no LICENSE file comes with this software, it is provided AS-IS. + 19:Core/Src/sysmem.c **** * + 20:Core/Src/sysmem.c **** ****************************************************************************** + 21:Core/Src/sysmem.c **** */ + 22:Core/Src/sysmem.c **** + 23:Core/Src/sysmem.c **** /* Includes */ + 24:Core/Src/sysmem.c **** #include + 25:Core/Src/sysmem.c **** #include + 26:Core/Src/sysmem.c **** + 27:Core/Src/sysmem.c **** /** + 28:Core/Src/sysmem.c **** * Pointer to the current high watermark of the heap usage + 29:Core/Src/sysmem.c **** */ + ARM GAS /tmp/ccisrOc0.s page 2 + + + 30:Core/Src/sysmem.c **** static uint8_t *__sbrk_heap_end = NULL; + 31:Core/Src/sysmem.c **** + 32:Core/Src/sysmem.c **** /** + 33:Core/Src/sysmem.c **** * @brief _sbrk() allocates memory to the newlib heap and is used by malloc + 34:Core/Src/sysmem.c **** * and others from the C library + 35:Core/Src/sysmem.c **** * + 36:Core/Src/sysmem.c **** * @verbatim + 37:Core/Src/sysmem.c **** * ############################################################################ + 38:Core/Src/sysmem.c **** * # .data # .bss # newlib heap # MSP stack # + 39:Core/Src/sysmem.c **** * # # # # Reserved by _Min_Stack_Size # + 40:Core/Src/sysmem.c **** * ############################################################################ + 41:Core/Src/sysmem.c **** * ^-- RAM start ^-- _end _estack, RAM end --^ + 42:Core/Src/sysmem.c **** * @endverbatim + 43:Core/Src/sysmem.c **** * + 44:Core/Src/sysmem.c **** * This implementation starts allocating at the '_end' linker symbol + 45:Core/Src/sysmem.c **** * The '_Min_Stack_Size' linker symbol reserves a memory for the MSP stack + 46:Core/Src/sysmem.c **** * The implementation considers '_estack' linker symbol to be RAM end + 47:Core/Src/sysmem.c **** * NOTE: If the MSP stack, at any point during execution, grows larger than the + 48:Core/Src/sysmem.c **** * reserved size, please increase the '_Min_Stack_Size'. + 49:Core/Src/sysmem.c **** * + 50:Core/Src/sysmem.c **** * @param incr Memory size + 51:Core/Src/sysmem.c **** * @return Pointer to allocated memory + 52:Core/Src/sysmem.c **** */ + 53:Core/Src/sysmem.c **** void *_sbrk(ptrdiff_t incr) + 54:Core/Src/sysmem.c **** { + 30 .loc 1 54 1 view -0 + 31 .cfi_startproc + 32 @ args = 0, pretend = 0, frame = 0 + 33 @ frame_needed = 0, uses_anonymous_args = 0 + 34 .loc 1 54 1 is_stmt 0 view .LVU1 + 35 0000 10B5 push {r4, lr} + 36 .cfi_def_cfa_offset 8 + 37 .cfi_offset 4, -8 + 38 .cfi_offset 14, -4 + 39 0002 0346 mov r3, r0 + 55:Core/Src/sysmem.c **** extern uint8_t _end; /* Symbol defined in the linker script */ + 40 .loc 1 55 3 is_stmt 1 view .LVU2 + 56:Core/Src/sysmem.c **** extern uint8_t _estack; /* Symbol defined in the linker script */ + 41 .loc 1 56 3 view .LVU3 + 57:Core/Src/sysmem.c **** extern uint32_t _Min_Stack_Size; /* Symbol defined in the linker script */ + 42 .loc 1 57 3 view .LVU4 + 58:Core/Src/sysmem.c **** const uint32_t stack_limit = (uint32_t)&_estack - (uint32_t)&_Min_Stack_Size; + 43 .loc 1 58 3 view .LVU5 + 44 .loc 1 58 18 is_stmt 0 view .LVU6 + 45 0004 0C4A ldr r2, .L8 + 46 0006 0D49 ldr r1, .L8+4 + 47 .LVL1: + 59:Core/Src/sysmem.c **** const uint8_t *max_heap = (uint8_t *)stack_limit; + 48 .loc 1 59 3 is_stmt 1 view .LVU7 + 60:Core/Src/sysmem.c **** uint8_t *prev_heap_end; + 49 .loc 1 60 3 view .LVU8 + 61:Core/Src/sysmem.c **** + 62:Core/Src/sysmem.c **** /* Initialize heap end at first call */ + 63:Core/Src/sysmem.c **** if (NULL == __sbrk_heap_end) + 50 .loc 1 63 3 view .LVU9 + 51 .loc 1 63 12 is_stmt 0 view .LVU10 + 52 0008 0D48 ldr r0, .L8+8 + ARM GAS /tmp/ccisrOc0.s page 3 + + + 53 .LVL2: + 54 .loc 1 63 12 view .LVU11 + 55 000a 0068 ldr r0, [r0] + 56 .loc 1 63 6 view .LVU12 + 57 000c 40B1 cbz r0, .L6 + 58 .L2: + 64:Core/Src/sysmem.c **** { + 65:Core/Src/sysmem.c **** __sbrk_heap_end = &_end; + 66:Core/Src/sysmem.c **** } + 67:Core/Src/sysmem.c **** + 68:Core/Src/sysmem.c **** /* Protect heap from growing into the reserved MSP stack */ + 69:Core/Src/sysmem.c **** if (__sbrk_heap_end + incr > max_heap) + 59 .loc 1 69 3 is_stmt 1 view .LVU13 + 60 .loc 1 69 23 is_stmt 0 view .LVU14 + 61 000e 0C48 ldr r0, .L8+8 + 62 0010 0068 ldr r0, [r0] + 63 0012 0344 add r3, r3, r0 + 64 .LVL3: + 65 .loc 1 69 6 view .LVU15 + 66 0014 521A subs r2, r2, r1 + 67 0016 9342 cmp r3, r2 + 68 0018 06D8 bhi .L7 + 70:Core/Src/sysmem.c **** { + 71:Core/Src/sysmem.c **** errno = ENOMEM; + 72:Core/Src/sysmem.c **** return (void *)-1; + 73:Core/Src/sysmem.c **** } + 74:Core/Src/sysmem.c **** + 75:Core/Src/sysmem.c **** prev_heap_end = __sbrk_heap_end; + 69 .loc 1 75 3 is_stmt 1 view .LVU16 + 70 .LVL4: + 76:Core/Src/sysmem.c **** __sbrk_heap_end += incr; + 71 .loc 1 76 3 view .LVU17 + 72 .loc 1 76 19 is_stmt 0 view .LVU18 + 73 001a 094A ldr r2, .L8+8 + 74 001c 1360 str r3, [r2] + 77:Core/Src/sysmem.c **** + 78:Core/Src/sysmem.c **** return (void *)prev_heap_end; + 75 .loc 1 78 3 is_stmt 1 view .LVU19 + 76 .LVL5: + 77 .L1: + 79:Core/Src/sysmem.c **** } + 78 .loc 1 79 1 is_stmt 0 view .LVU20 + 79 001e 10BD pop {r4, pc} + 80 .LVL6: + 81 .L6: + 65:Core/Src/sysmem.c **** } + 82 .loc 1 65 5 is_stmt 1 view .LVU21 + 65:Core/Src/sysmem.c **** } + 83 .loc 1 65 21 is_stmt 0 view .LVU22 + 84 0020 0748 ldr r0, .L8+8 + 85 0022 084C ldr r4, .L8+12 + 86 0024 0460 str r4, [r0] + 87 0026 F2E7 b .L2 + 88 .LVL7: + 89 .L7: + 71:Core/Src/sysmem.c **** return (void *)-1; + 90 .loc 1 71 5 is_stmt 1 view .LVU23 + ARM GAS /tmp/ccisrOc0.s page 4 + + + 91 0028 FFF7FEFF bl __errno + 92 .LVL8: + 71:Core/Src/sysmem.c **** return (void *)-1; + 93 .loc 1 71 11 is_stmt 0 view .LVU24 + 94 002c 0C23 movs r3, #12 + 95 002e 0360 str r3, [r0] + 72:Core/Src/sysmem.c **** } + 96 .loc 1 72 5 is_stmt 1 view .LVU25 + 72:Core/Src/sysmem.c **** } + 97 .loc 1 72 12 is_stmt 0 view .LVU26 + 98 0030 4FF0FF30 mov r0, #-1 + 99 0034 F3E7 b .L1 + 100 .L9: + 101 0036 00BF .align 2 + 102 .L8: + 103 0038 00000000 .word _estack + 104 003c 00000000 .word _Min_Stack_Size + 105 0040 00000000 .word __sbrk_heap_end + 106 0044 00000000 .word _end + 107 .cfi_endproc + 108 .LFE0: + 110 .section .bss.__sbrk_heap_end,"aw",%nobits + 111 .align 2 + 114 __sbrk_heap_end: + 115 0000 00000000 .space 4 + 116 .text + 117 .Letext0: + 118 .file 2 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 119 .file 3 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 120 .file 4 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 121 .file 5 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + ARM GAS /tmp/ccisrOc0.s page 5 + + +DEFINED SYMBOLS + *ABS*:0000000000000000 sysmem.c + /tmp/ccisrOc0.s:21 .text._sbrk:0000000000000000 $t + /tmp/ccisrOc0.s:27 .text._sbrk:0000000000000000 _sbrk + /tmp/ccisrOc0.s:103 .text._sbrk:0000000000000038 $d + /tmp/ccisrOc0.s:114 .bss.__sbrk_heap_end:0000000000000000 __sbrk_heap_end + /tmp/ccisrOc0.s:111 .bss.__sbrk_heap_end:0000000000000000 $d + +UNDEFINED SYMBOLS +__errno +_estack +_Min_Stack_Size +_end diff --git a/BMS_Testbench/BMS_Software_V1/build/sysmem.o b/BMS_Testbench/BMS_Software_V1/build/sysmem.o new file mode 100644 index 0000000000000000000000000000000000000000..6658f7f3003758e7961b3caf57178d37ef98f61e GIT binary patch literal 4384 zcmd5WFaTMIyk!0Cc6e-cgc4QO9YE&EgP{y-6vlqNG zvz?h$<&ZRm7D}NMilHtg5SPA`k`xjsfkNm*DSZnev?S?6TPUre7n-Kf6be#U|PC_ti_qD}$E@ zH(6u#wIX`;!n0Gi*K_Y3xl+0@{APZ0;A!o~hxhhB`p16pW9p5oAMDTm{G$W|I(mTiH;myt_gjFnj7~j0 z;gE(8yi6KJA65wRLnPGnx5@4gpw+9BUrt5&64?#p9|j!JFz$6Sxr0udC|!ezeixnc z6B5jhy#QK&4c*ZNxj zJ37X9v@t{bHs5|(GiJcdY^Dq)%@mpOZFWBpJ55~LQ%6T9+c6L_N}hz9>^AIGb{f6H z|2{MbZ|UX20r8D6@~oYx%B)7{dzS0$HeIV+4TD;gPAapIquH)~;J?#5NJTit6r)tjd4?V3p#wqnbPd@~3G&-9#1)2vsk*4%t~zC35n zQJ)4$ydbe!&5A|ZK6_znHG^ua<9h$Y>Ge-b%*XPbYNHwa|II7D6*Gp;_xy5|ie{X+ zu2(BJC}(U?PN$XF$*r~*Lx$>L!vLiW4ARMqq9E*&Oy^8b^GrREn>*mO-wU^ipautMgn**K=xQ=*J<^bK80$R|Z-%QYj({TVYT)(vE6r z+z6w@=mc@I9(b-nBHN1-5=gyI&6*`HDv|MR8kqdznRU0cf>D}|5>7TB(4YQ6v_p?q^ z1J+%*xe7_mbrQ#ny=u}7gBX0R6Qp!c#@dm$Yd1WnZF_;sd}l9Zm~D5kqBHY$!rDpX zHfuFd^72`|150o~?r+sT8fVJ$L&ZThChKBa2^m`(8u+5}RnFGVK;TemVw`@r_460aEtVV1 zZyiyN=0>$Kew>f16MT|S@e}-h{vdw{x2eBn1sePFepajYy;!LJrkAN_qSEEdG?jh> zGCY-cdgd(lWEvY5G!=f%(jShVRt4XE7D>@zefnb{m56?%M-!nQimvv(cSuj~l!K=B zX493aZ1g}0O6}Wu;^`;wps9FS7+`4+>E~+{>pcaOjn-P043Kzwj>$&+3CRG{z3JVf zlL|O-xx`4qqUK*Ct*Fc=*uXEBIMoCd4CQl@Qx@fe`NlyeAkcS-S7a z2(1A;klsv$^pmaN_xK?~Opw+?^3)%2L-1DwenQ}Nfv&)t0waO91b$B7R|MV`_>#bH z34C4Pj|9F=h;{s2@V^)MS3*2rQTo$)4ih4&#sp3Z`ALD6z$Jkf1U@71Q-m1*X@M0& z_{Wx}_=G^pR0XdxIz!S^9uqF%$`H~WRD- z)51s z7aMy?*bqov2s#`0S0cwLE~e0n`=!hnkn90$xIu(y(%%=rXZ?MU@rN?h^Y=~Aatygx zfxm3^mAbD(m-R;_pZ1;RN7Y{L%lAObF(BDC{N0hsl+k?`bk^TM#vk2n>F)<(4CM{A zd${9Mhx}2zALApGb{vyi0xuis=zB+?lrO_>MlwK|FK>a)&Tkm=qj}MKsm93p{Sq{m z*aoD{g}>|_p_tSNGt*|@fZbgPsZJfoNB+n^#e~0JTg2i2yL`bfj9i E3DnGtuK)l5 literal 0 HcmV?d00001 diff --git a/BMS_Testbench/BMS_Software_V1/build/system_stm32f3xx.d b/BMS_Testbench/BMS_Software_V1/build/system_stm32f3xx.d new file mode 100644 index 0000000..2b9f782 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/system_stm32f3xx.d @@ -0,0 +1,57 @@ +build/system_stm32f3xx.o: Core/Src/system_stm32f3xx.c \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h \ + Drivers/CMSIS/Include/core_cm4.h Drivers/CMSIS/Include/cmsis_version.h \ + Drivers/CMSIS/Include/cmsis_compiler.h Drivers/CMSIS/Include/cmsis_gcc.h \ + Drivers/CMSIS/Include/mpu_armv7.h \ + Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h \ + Core/Inc/stm32f3xx_hal_conf.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h \ + Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h +Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h: +Drivers/CMSIS/Include/core_cm4.h: +Drivers/CMSIS/Include/cmsis_version.h: +Drivers/CMSIS/Include/cmsis_compiler.h: +Drivers/CMSIS/Include/cmsis_gcc.h: +Drivers/CMSIS/Include/mpu_armv7.h: +Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h: +Core/Inc/stm32f3xx_hal_conf.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h: +Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h: +Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h: diff --git a/BMS_Testbench/BMS_Software_V1/build/system_stm32f3xx.lst b/BMS_Testbench/BMS_Software_V1/build/system_stm32f3xx.lst new file mode 100644 index 0000000..1aed0ed --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/build/system_stm32f3xx.lst @@ -0,0 +1,575 @@ +ARM GAS /tmp/ccIBrQzE.s page 1 + + + 1 .cpu cortex-m4 + 2 .arch armv7e-m + 3 .fpu fpv4-sp-d16 + 4 .eabi_attribute 27, 1 + 5 .eabi_attribute 28, 1 + 6 .eabi_attribute 20, 1 + 7 .eabi_attribute 21, 1 + 8 .eabi_attribute 23, 3 + 9 .eabi_attribute 24, 1 + 10 .eabi_attribute 25, 1 + 11 .eabi_attribute 26, 1 + 12 .eabi_attribute 30, 1 + 13 .eabi_attribute 34, 1 + 14 .eabi_attribute 18, 4 + 15 .file "system_stm32f3xx.c" + 16 .text + 17 .Ltext0: + 18 .cfi_sections .debug_frame + 19 .file 1 "Core/Src/system_stm32f3xx.c" + 20 .section .text.SystemInit,"ax",%progbits + 21 .align 1 + 22 .global SystemInit + 23 .syntax unified + 24 .thumb + 25 .thumb_func + 27 SystemInit: + 28 .LFB130: + 1:Core/Src/system_stm32f3xx.c **** /** + 2:Core/Src/system_stm32f3xx.c **** ****************************************************************************** + 3:Core/Src/system_stm32f3xx.c **** * @file system_stm32f3xx.c + 4:Core/Src/system_stm32f3xx.c **** * @author MCD Application Team + 5:Core/Src/system_stm32f3xx.c **** * @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File. + 6:Core/Src/system_stm32f3xx.c **** * + 7:Core/Src/system_stm32f3xx.c **** * 1. This file provides two functions and one global variable to be called from + 8:Core/Src/system_stm32f3xx.c **** * user application: + 9:Core/Src/system_stm32f3xx.c **** * - SystemInit(): This function is called at startup just after reset and + 10:Core/Src/system_stm32f3xx.c **** * before branch to main program. This call is made inside + 11:Core/Src/system_stm32f3xx.c **** * the "startup_stm32f3xx.s" file. + 12:Core/Src/system_stm32f3xx.c **** * + 13:Core/Src/system_stm32f3xx.c **** * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used + 14:Core/Src/system_stm32f3xx.c **** * by the user application to setup the SysTick + 15:Core/Src/system_stm32f3xx.c **** * timer or configure other parameters. + 16:Core/Src/system_stm32f3xx.c **** * + 17:Core/Src/system_stm32f3xx.c **** * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must + 18:Core/Src/system_stm32f3xx.c **** * be called whenever the core clock is changed + 19:Core/Src/system_stm32f3xx.c **** * during program execution. + 20:Core/Src/system_stm32f3xx.c **** * + 21:Core/Src/system_stm32f3xx.c **** * 2. After each device reset the HSI (8 MHz) is used as system clock source. + 22:Core/Src/system_stm32f3xx.c **** * Then SystemInit() function is called, in "startup_stm32f3xx.s" file, to + 23:Core/Src/system_stm32f3xx.c **** * configure the system clock before to branch to main program. + 24:Core/Src/system_stm32f3xx.c **** * + 25:Core/Src/system_stm32f3xx.c **** * 3. This file configures the system clock as follows: + 26:Core/Src/system_stm32f3xx.c **** *============================================================================= + 27:Core/Src/system_stm32f3xx.c **** * Supported STM32F3xx device + 28:Core/Src/system_stm32f3xx.c **** *----------------------------------------------------------------------------- + 29:Core/Src/system_stm32f3xx.c **** * System Clock source | HSI + 30:Core/Src/system_stm32f3xx.c **** *----------------------------------------------------------------------------- + ARM GAS /tmp/ccIBrQzE.s page 2 + + + 31:Core/Src/system_stm32f3xx.c **** * SYSCLK(Hz) | 8000000 + 32:Core/Src/system_stm32f3xx.c **** *----------------------------------------------------------------------------- + 33:Core/Src/system_stm32f3xx.c **** * HCLK(Hz) | 8000000 + 34:Core/Src/system_stm32f3xx.c **** *----------------------------------------------------------------------------- + 35:Core/Src/system_stm32f3xx.c **** * AHB Prescaler | 1 + 36:Core/Src/system_stm32f3xx.c **** *----------------------------------------------------------------------------- + 37:Core/Src/system_stm32f3xx.c **** * APB2 Prescaler | 1 + 38:Core/Src/system_stm32f3xx.c **** *----------------------------------------------------------------------------- + 39:Core/Src/system_stm32f3xx.c **** * APB1 Prescaler | 1 + 40:Core/Src/system_stm32f3xx.c **** *----------------------------------------------------------------------------- + 41:Core/Src/system_stm32f3xx.c **** * USB Clock | DISABLE + 42:Core/Src/system_stm32f3xx.c **** *----------------------------------------------------------------------------- + 43:Core/Src/system_stm32f3xx.c **** *============================================================================= + 44:Core/Src/system_stm32f3xx.c **** ****************************************************************************** + 45:Core/Src/system_stm32f3xx.c **** * @attention + 46:Core/Src/system_stm32f3xx.c **** * + 47:Core/Src/system_stm32f3xx.c **** *

    © Copyright (c) 2016 STMicroelectronics. + 48:Core/Src/system_stm32f3xx.c **** * All rights reserved.

    + 49:Core/Src/system_stm32f3xx.c **** * + 50:Core/Src/system_stm32f3xx.c **** * This software component is licensed by ST under BSD 3-Clause license, + 51:Core/Src/system_stm32f3xx.c **** * the "License"; You may not use this file except in compliance with the + 52:Core/Src/system_stm32f3xx.c **** * License. You may obtain a copy of the License at: + 53:Core/Src/system_stm32f3xx.c **** * opensource.org/licenses/BSD-3-Clause + 54:Core/Src/system_stm32f3xx.c **** * + 55:Core/Src/system_stm32f3xx.c **** ****************************************************************************** + 56:Core/Src/system_stm32f3xx.c **** */ + 57:Core/Src/system_stm32f3xx.c **** + 58:Core/Src/system_stm32f3xx.c **** /** @addtogroup CMSIS + 59:Core/Src/system_stm32f3xx.c **** * @{ + 60:Core/Src/system_stm32f3xx.c **** */ + 61:Core/Src/system_stm32f3xx.c **** + 62:Core/Src/system_stm32f3xx.c **** /** @addtogroup stm32f3xx_system + 63:Core/Src/system_stm32f3xx.c **** * @{ + 64:Core/Src/system_stm32f3xx.c **** */ + 65:Core/Src/system_stm32f3xx.c **** + 66:Core/Src/system_stm32f3xx.c **** /** @addtogroup STM32F3xx_System_Private_Includes + 67:Core/Src/system_stm32f3xx.c **** * @{ + 68:Core/Src/system_stm32f3xx.c **** */ + 69:Core/Src/system_stm32f3xx.c **** + 70:Core/Src/system_stm32f3xx.c **** #include "stm32f3xx.h" + 71:Core/Src/system_stm32f3xx.c **** + 72:Core/Src/system_stm32f3xx.c **** /** + 73:Core/Src/system_stm32f3xx.c **** * @} + 74:Core/Src/system_stm32f3xx.c **** */ + 75:Core/Src/system_stm32f3xx.c **** + 76:Core/Src/system_stm32f3xx.c **** /** @addtogroup STM32F3xx_System_Private_TypesDefinitions + 77:Core/Src/system_stm32f3xx.c **** * @{ + 78:Core/Src/system_stm32f3xx.c **** */ + 79:Core/Src/system_stm32f3xx.c **** + 80:Core/Src/system_stm32f3xx.c **** /** + 81:Core/Src/system_stm32f3xx.c **** * @} + 82:Core/Src/system_stm32f3xx.c **** */ + 83:Core/Src/system_stm32f3xx.c **** + 84:Core/Src/system_stm32f3xx.c **** /** @addtogroup STM32F3xx_System_Private_Defines + 85:Core/Src/system_stm32f3xx.c **** * @{ + 86:Core/Src/system_stm32f3xx.c **** */ + 87:Core/Src/system_stm32f3xx.c **** #if !defined (HSE_VALUE) + ARM GAS /tmp/ccIBrQzE.s page 3 + + + 88:Core/Src/system_stm32f3xx.c **** #define HSE_VALUE ((uint32_t)8000000) /*!< Default value of the External oscillator in Hz. + 89:Core/Src/system_stm32f3xx.c **** This value can be provided and adapted by the user + 90:Core/Src/system_stm32f3xx.c **** #endif /* HSE_VALUE */ + 91:Core/Src/system_stm32f3xx.c **** + 92:Core/Src/system_stm32f3xx.c **** #if !defined (HSI_VALUE) + 93:Core/Src/system_stm32f3xx.c **** #define HSI_VALUE ((uint32_t)8000000) /*!< Default value of the Internal oscillator in Hz. + 94:Core/Src/system_stm32f3xx.c **** This value can be provided and adapted by the user + 95:Core/Src/system_stm32f3xx.c **** #endif /* HSI_VALUE */ + 96:Core/Src/system_stm32f3xx.c **** + 97:Core/Src/system_stm32f3xx.c **** /* Note: Following vector table addresses must be defined in line with linker + 98:Core/Src/system_stm32f3xx.c **** configuration. */ + 99:Core/Src/system_stm32f3xx.c **** /*!< Uncomment the following line if you need to relocate the vector table + 100:Core/Src/system_stm32f3xx.c **** anywhere in Flash or Sram, else the vector table is kept at the automatic + 101:Core/Src/system_stm32f3xx.c **** remap of boot address selected */ + 102:Core/Src/system_stm32f3xx.c **** /* #define USER_VECT_TAB_ADDRESS */ + 103:Core/Src/system_stm32f3xx.c **** + 104:Core/Src/system_stm32f3xx.c **** #if defined(USER_VECT_TAB_ADDRESS) + 105:Core/Src/system_stm32f3xx.c **** /*!< Uncomment the following line if you need to relocate your vector Table + 106:Core/Src/system_stm32f3xx.c **** in Sram else user remap will be done in Flash. */ + 107:Core/Src/system_stm32f3xx.c **** /* #define VECT_TAB_SRAM */ + 108:Core/Src/system_stm32f3xx.c **** #if defined(VECT_TAB_SRAM) + 109:Core/Src/system_stm32f3xx.c **** #define VECT_TAB_BASE_ADDRESS SRAM_BASE /*!< Vector Table base address field. + 110:Core/Src/system_stm32f3xx.c **** This value must be a multiple of 0x200. */ + 111:Core/Src/system_stm32f3xx.c **** #define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field. + 112:Core/Src/system_stm32f3xx.c **** This value must be a multiple of 0x200. */ + 113:Core/Src/system_stm32f3xx.c **** #else + 114:Core/Src/system_stm32f3xx.c **** #define VECT_TAB_BASE_ADDRESS FLASH_BASE /*!< Vector Table base address field. + 115:Core/Src/system_stm32f3xx.c **** This value must be a multiple of 0x200. */ + 116:Core/Src/system_stm32f3xx.c **** #define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field. + 117:Core/Src/system_stm32f3xx.c **** This value must be a multiple of 0x200. */ + 118:Core/Src/system_stm32f3xx.c **** #endif /* VECT_TAB_SRAM */ + 119:Core/Src/system_stm32f3xx.c **** #endif /* USER_VECT_TAB_ADDRESS */ + 120:Core/Src/system_stm32f3xx.c **** + 121:Core/Src/system_stm32f3xx.c **** /******************************************************************************/ + 122:Core/Src/system_stm32f3xx.c **** /** + 123:Core/Src/system_stm32f3xx.c **** * @} + 124:Core/Src/system_stm32f3xx.c **** */ + 125:Core/Src/system_stm32f3xx.c **** + 126:Core/Src/system_stm32f3xx.c **** /** @addtogroup STM32F3xx_System_Private_Macros + 127:Core/Src/system_stm32f3xx.c **** * @{ + 128:Core/Src/system_stm32f3xx.c **** */ + 129:Core/Src/system_stm32f3xx.c **** + 130:Core/Src/system_stm32f3xx.c **** /** + 131:Core/Src/system_stm32f3xx.c **** * @} + 132:Core/Src/system_stm32f3xx.c **** */ + 133:Core/Src/system_stm32f3xx.c **** + 134:Core/Src/system_stm32f3xx.c **** /** @addtogroup STM32F3xx_System_Private_Variables + 135:Core/Src/system_stm32f3xx.c **** * @{ + 136:Core/Src/system_stm32f3xx.c **** */ + 137:Core/Src/system_stm32f3xx.c **** /* This variable is updated in three ways: + 138:Core/Src/system_stm32f3xx.c **** 1) by calling CMSIS function SystemCoreClockUpdate() + 139:Core/Src/system_stm32f3xx.c **** 2) by calling HAL API function HAL_RCC_GetHCLKFreq() + 140:Core/Src/system_stm32f3xx.c **** 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency + 141:Core/Src/system_stm32f3xx.c **** Note: If you use this function to configure the system clock there is no need to + 142:Core/Src/system_stm32f3xx.c **** call the 2 first functions listed above, since SystemCoreClock variable is + 143:Core/Src/system_stm32f3xx.c **** updated automatically. + 144:Core/Src/system_stm32f3xx.c **** */ + ARM GAS /tmp/ccIBrQzE.s page 4 + + + 145:Core/Src/system_stm32f3xx.c **** uint32_t SystemCoreClock = 8000000; + 146:Core/Src/system_stm32f3xx.c **** + 147:Core/Src/system_stm32f3xx.c **** const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; + 148:Core/Src/system_stm32f3xx.c **** const uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; + 149:Core/Src/system_stm32f3xx.c **** + 150:Core/Src/system_stm32f3xx.c **** /** + 151:Core/Src/system_stm32f3xx.c **** * @} + 152:Core/Src/system_stm32f3xx.c **** */ + 153:Core/Src/system_stm32f3xx.c **** + 154:Core/Src/system_stm32f3xx.c **** /** @addtogroup STM32F3xx_System_Private_FunctionPrototypes + 155:Core/Src/system_stm32f3xx.c **** * @{ + 156:Core/Src/system_stm32f3xx.c **** */ + 157:Core/Src/system_stm32f3xx.c **** + 158:Core/Src/system_stm32f3xx.c **** /** + 159:Core/Src/system_stm32f3xx.c **** * @} + 160:Core/Src/system_stm32f3xx.c **** */ + 161:Core/Src/system_stm32f3xx.c **** + 162:Core/Src/system_stm32f3xx.c **** /** @addtogroup STM32F3xx_System_Private_Functions + 163:Core/Src/system_stm32f3xx.c **** * @{ + 164:Core/Src/system_stm32f3xx.c **** */ + 165:Core/Src/system_stm32f3xx.c **** + 166:Core/Src/system_stm32f3xx.c **** /** + 167:Core/Src/system_stm32f3xx.c **** * @brief Setup the microcontroller system + 168:Core/Src/system_stm32f3xx.c **** * @param None + 169:Core/Src/system_stm32f3xx.c **** * @retval None + 170:Core/Src/system_stm32f3xx.c **** */ + 171:Core/Src/system_stm32f3xx.c **** void SystemInit(void) + 172:Core/Src/system_stm32f3xx.c **** { + 29 .loc 1 172 1 view -0 + 30 .cfi_startproc + 31 @ args = 0, pretend = 0, frame = 0 + 32 @ frame_needed = 0, uses_anonymous_args = 0 + 33 @ link register save eliminated. + 173:Core/Src/system_stm32f3xx.c **** /* FPU settings --------------------------------------------------------------*/ + 174:Core/Src/system_stm32f3xx.c **** #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + 175:Core/Src/system_stm32f3xx.c **** SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ + 34 .loc 1 175 3 view .LVU1 + 35 .loc 1 175 6 is_stmt 0 view .LVU2 + 36 0000 034A ldr r2, .L2 + 37 0002 D2F88830 ldr r3, [r2, #136] + 38 .loc 1 175 14 view .LVU3 + 39 0006 43F47003 orr r3, r3, #15728640 + 40 000a C2F88830 str r3, [r2, #136] + 176:Core/Src/system_stm32f3xx.c **** #endif + 177:Core/Src/system_stm32f3xx.c **** + 178:Core/Src/system_stm32f3xx.c **** /* Configure the Vector Table location -------------------------------------*/ + 179:Core/Src/system_stm32f3xx.c **** #if defined(USER_VECT_TAB_ADDRESS) + 180:Core/Src/system_stm32f3xx.c **** SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM + 181:Core/Src/system_stm32f3xx.c **** #endif /* USER_VECT_TAB_ADDRESS */ + 182:Core/Src/system_stm32f3xx.c **** } + 41 .loc 1 182 1 view .LVU4 + 42 000e 7047 bx lr + 43 .L3: + 44 .align 2 + 45 .L2: + 46 0010 00ED00E0 .word -536810240 + 47 .cfi_endproc + ARM GAS /tmp/ccIBrQzE.s page 5 + + + 48 .LFE130: + 50 .section .text.SystemCoreClockUpdate,"ax",%progbits + 51 .align 1 + 52 .global SystemCoreClockUpdate + 53 .syntax unified + 54 .thumb + 55 .thumb_func + 57 SystemCoreClockUpdate: + 58 .LFB131: + 183:Core/Src/system_stm32f3xx.c **** + 184:Core/Src/system_stm32f3xx.c **** /** + 185:Core/Src/system_stm32f3xx.c **** * @brief Update SystemCoreClock variable according to Clock Register Values. + 186:Core/Src/system_stm32f3xx.c **** * The SystemCoreClock variable contains the core clock (HCLK), it can + 187:Core/Src/system_stm32f3xx.c **** * be used by the user application to setup the SysTick timer or configure + 188:Core/Src/system_stm32f3xx.c **** * other parameters. + 189:Core/Src/system_stm32f3xx.c **** * + 190:Core/Src/system_stm32f3xx.c **** * @note Each time the core clock (HCLK) changes, this function must be called + 191:Core/Src/system_stm32f3xx.c **** * to update SystemCoreClock variable value. Otherwise, any configuration + 192:Core/Src/system_stm32f3xx.c **** * based on this variable will be incorrect. + 193:Core/Src/system_stm32f3xx.c **** * + 194:Core/Src/system_stm32f3xx.c **** * @note - The system frequency computed by this function is not the real + 195:Core/Src/system_stm32f3xx.c **** * frequency in the chip. It is calculated based on the predefined + 196:Core/Src/system_stm32f3xx.c **** * constant and the selected clock source: + 197:Core/Src/system_stm32f3xx.c **** * + 198:Core/Src/system_stm32f3xx.c **** * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) + 199:Core/Src/system_stm32f3xx.c **** * + 200:Core/Src/system_stm32f3xx.c **** * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) + 201:Core/Src/system_stm32f3xx.c **** * + 202:Core/Src/system_stm32f3xx.c **** * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) + 203:Core/Src/system_stm32f3xx.c **** * or HSI_VALUE(*) multiplied/divided by the PLL factors. + 204:Core/Src/system_stm32f3xx.c **** * + 205:Core/Src/system_stm32f3xx.c **** * (*) HSI_VALUE is a constant defined in stm32f3xx_hal.h file (default value + 206:Core/Src/system_stm32f3xx.c **** * 8 MHz) but the real value may vary depending on the variations + 207:Core/Src/system_stm32f3xx.c **** * in voltage and temperature. + 208:Core/Src/system_stm32f3xx.c **** * + 209:Core/Src/system_stm32f3xx.c **** * (**) HSE_VALUE is a constant defined in stm32f3xx_hal.h file (default value + 210:Core/Src/system_stm32f3xx.c **** * 8 MHz), user has to ensure that HSE_VALUE is same as the real + 211:Core/Src/system_stm32f3xx.c **** * frequency of the crystal used. Otherwise, this function may + 212:Core/Src/system_stm32f3xx.c **** * have wrong result. + 213:Core/Src/system_stm32f3xx.c **** * + 214:Core/Src/system_stm32f3xx.c **** * - The result of this function could be not correct when using fractional + 215:Core/Src/system_stm32f3xx.c **** * value for HSE crystal. + 216:Core/Src/system_stm32f3xx.c **** * + 217:Core/Src/system_stm32f3xx.c **** * @param None + 218:Core/Src/system_stm32f3xx.c **** * @retval None + 219:Core/Src/system_stm32f3xx.c **** */ + 220:Core/Src/system_stm32f3xx.c **** void SystemCoreClockUpdate (void) + 221:Core/Src/system_stm32f3xx.c **** { + 59 .loc 1 221 1 is_stmt 1 view -0 + 60 .cfi_startproc + 61 @ args = 0, pretend = 0, frame = 0 + 62 @ frame_needed = 0, uses_anonymous_args = 0 + 63 @ link register save eliminated. + 222:Core/Src/system_stm32f3xx.c **** uint32_t tmp = 0, pllmull = 0, pllsource = 0, predivfactor = 0; + 64 .loc 1 222 3 view .LVU6 + 65 .LVL0: + 223:Core/Src/system_stm32f3xx.c **** + ARM GAS /tmp/ccIBrQzE.s page 6 + + + 224:Core/Src/system_stm32f3xx.c **** /* Get SYSCLK source -------------------------------------------------------*/ + 225:Core/Src/system_stm32f3xx.c **** tmp = RCC->CFGR & RCC_CFGR_SWS; + 66 .loc 1 225 3 view .LVU7 + 67 .loc 1 225 12 is_stmt 0 view .LVU8 + 68 0000 1D4B ldr r3, .L11 + 69 0002 5B68 ldr r3, [r3, #4] + 70 .loc 1 225 7 view .LVU9 + 71 0004 03F00C03 and r3, r3, #12 + 72 .LVL1: + 226:Core/Src/system_stm32f3xx.c **** + 227:Core/Src/system_stm32f3xx.c **** switch (tmp) + 73 .loc 1 227 3 is_stmt 1 view .LVU10 + 74 0008 042B cmp r3, #4 + 75 000a 14D0 beq .L5 + 76 000c 082B cmp r3, #8 + 77 000e 16D0 beq .L6 + 78 0010 1BB1 cbz r3, .L10 + 228:Core/Src/system_stm32f3xx.c **** { + 229:Core/Src/system_stm32f3xx.c **** case RCC_CFGR_SWS_HSI: /* HSI used as system clock */ + 230:Core/Src/system_stm32f3xx.c **** SystemCoreClock = HSI_VALUE; + 231:Core/Src/system_stm32f3xx.c **** break; + 232:Core/Src/system_stm32f3xx.c **** case RCC_CFGR_SWS_HSE: /* HSE used as system clock */ + 233:Core/Src/system_stm32f3xx.c **** SystemCoreClock = HSE_VALUE; + 234:Core/Src/system_stm32f3xx.c **** break; + 235:Core/Src/system_stm32f3xx.c **** case RCC_CFGR_SWS_PLL: /* PLL used as system clock */ + 236:Core/Src/system_stm32f3xx.c **** /* Get PLL clock source and multiplication factor ----------------------*/ + 237:Core/Src/system_stm32f3xx.c **** pllmull = RCC->CFGR & RCC_CFGR_PLLMUL; + 238:Core/Src/system_stm32f3xx.c **** pllsource = RCC->CFGR & RCC_CFGR_PLLSRC; + 239:Core/Src/system_stm32f3xx.c **** pllmull = ( pllmull >> 18) + 2; + 240:Core/Src/system_stm32f3xx.c **** + 241:Core/Src/system_stm32f3xx.c **** #if defined (STM32F302xE) || defined (STM32F303xE) || defined (STM32F398xx) + 242:Core/Src/system_stm32f3xx.c **** predivfactor = (RCC->CFGR2 & RCC_CFGR2_PREDIV) + 1; + 243:Core/Src/system_stm32f3xx.c **** if (pllsource == RCC_CFGR_PLLSRC_HSE_PREDIV) + 244:Core/Src/system_stm32f3xx.c **** { + 245:Core/Src/system_stm32f3xx.c **** /* HSE oscillator clock selected as PREDIV1 clock entry */ + 246:Core/Src/system_stm32f3xx.c **** SystemCoreClock = (HSE_VALUE / predivfactor) * pllmull; + 247:Core/Src/system_stm32f3xx.c **** } + 248:Core/Src/system_stm32f3xx.c **** else + 249:Core/Src/system_stm32f3xx.c **** { + 250:Core/Src/system_stm32f3xx.c **** /* HSI oscillator clock selected as PREDIV1 clock entry */ + 251:Core/Src/system_stm32f3xx.c **** SystemCoreClock = (HSI_VALUE / predivfactor) * pllmull; + 252:Core/Src/system_stm32f3xx.c **** } + 253:Core/Src/system_stm32f3xx.c **** #else + 254:Core/Src/system_stm32f3xx.c **** if (pllsource == RCC_CFGR_PLLSRC_HSI_DIV2) + 255:Core/Src/system_stm32f3xx.c **** { + 256:Core/Src/system_stm32f3xx.c **** /* HSI oscillator clock divided by 2 selected as PLL clock entry */ + 257:Core/Src/system_stm32f3xx.c **** SystemCoreClock = (HSI_VALUE >> 1) * pllmull; + 258:Core/Src/system_stm32f3xx.c **** } + 259:Core/Src/system_stm32f3xx.c **** else + 260:Core/Src/system_stm32f3xx.c **** { + 261:Core/Src/system_stm32f3xx.c **** predivfactor = (RCC->CFGR2 & RCC_CFGR2_PREDIV) + 1; + 262:Core/Src/system_stm32f3xx.c **** /* HSE oscillator clock selected as PREDIV1 clock entry */ + 263:Core/Src/system_stm32f3xx.c **** SystemCoreClock = (HSE_VALUE / predivfactor) * pllmull; + 264:Core/Src/system_stm32f3xx.c **** } + 265:Core/Src/system_stm32f3xx.c **** #endif /* STM32F302xE || STM32F303xE || STM32F398xx */ + 266:Core/Src/system_stm32f3xx.c **** break; + 267:Core/Src/system_stm32f3xx.c **** default: /* HSI used as system clock */ + ARM GAS /tmp/ccIBrQzE.s page 7 + + + 268:Core/Src/system_stm32f3xx.c **** SystemCoreClock = HSI_VALUE; + 79 .loc 1 268 7 view .LVU11 + 80 .loc 1 268 23 is_stmt 0 view .LVU12 + 81 0012 1A4B ldr r3, .L11+4 + 82 .LVL2: + 83 .loc 1 268 23 view .LVU13 + 84 0014 1A4A ldr r2, .L11+8 + 85 0016 1A60 str r2, [r3] + 269:Core/Src/system_stm32f3xx.c **** break; + 86 .loc 1 269 7 is_stmt 1 view .LVU14 + 87 0018 02E0 b .L8 + 88 .LVL3: + 89 .L10: + 230:Core/Src/system_stm32f3xx.c **** break; + 90 .loc 1 230 7 view .LVU15 + 230:Core/Src/system_stm32f3xx.c **** break; + 91 .loc 1 230 23 is_stmt 0 view .LVU16 + 92 001a 184B ldr r3, .L11+4 + 93 .LVL4: + 230:Core/Src/system_stm32f3xx.c **** break; + 94 .loc 1 230 23 view .LVU17 + 95 001c 184A ldr r2, .L11+8 + 96 001e 1A60 str r2, [r3] + 231:Core/Src/system_stm32f3xx.c **** case RCC_CFGR_SWS_HSE: /* HSE used as system clock */ + 97 .loc 1 231 7 is_stmt 1 view .LVU18 + 98 .LVL5: + 99 .L8: + 270:Core/Src/system_stm32f3xx.c **** } + 271:Core/Src/system_stm32f3xx.c **** /* Compute HCLK clock frequency ----------------*/ + 272:Core/Src/system_stm32f3xx.c **** /* Get HCLK prescaler */ + 273:Core/Src/system_stm32f3xx.c **** tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; + 100 .loc 1 273 3 view .LVU19 + 101 .loc 1 273 28 is_stmt 0 view .LVU20 + 102 0020 154B ldr r3, .L11 + 103 0022 5B68 ldr r3, [r3, #4] + 104 .loc 1 273 52 view .LVU21 + 105 0024 C3F30313 ubfx r3, r3, #4, #4 + 106 .loc 1 273 22 view .LVU22 + 107 0028 164A ldr r2, .L11+12 + 108 002a D15C ldrb r1, [r2, r3] @ zero_extendqisi2 + 109 .LVL6: + 274:Core/Src/system_stm32f3xx.c **** /* HCLK clock frequency */ + 275:Core/Src/system_stm32f3xx.c **** SystemCoreClock >>= tmp; + 110 .loc 1 275 3 is_stmt 1 view .LVU23 + 111 .loc 1 275 19 is_stmt 0 view .LVU24 + 112 002c 134A ldr r2, .L11+4 + 113 002e 1368 ldr r3, [r2] + 114 0030 CB40 lsrs r3, r3, r1 + 115 0032 1360 str r3, [r2] + 276:Core/Src/system_stm32f3xx.c **** } + 116 .loc 1 276 1 view .LVU25 + 117 0034 7047 bx lr + 118 .LVL7: + 119 .L5: + 233:Core/Src/system_stm32f3xx.c **** break; + 120 .loc 1 233 7 is_stmt 1 view .LVU26 + 233:Core/Src/system_stm32f3xx.c **** break; + ARM GAS /tmp/ccIBrQzE.s page 8 + + + 121 .loc 1 233 23 is_stmt 0 view .LVU27 + 122 0036 114B ldr r3, .L11+4 + 123 .LVL8: + 233:Core/Src/system_stm32f3xx.c **** break; + 124 .loc 1 233 23 view .LVU28 + 125 0038 134A ldr r2, .L11+16 + 126 003a 1A60 str r2, [r3] + 234:Core/Src/system_stm32f3xx.c **** case RCC_CFGR_SWS_PLL: /* PLL used as system clock */ + 127 .loc 1 234 7 is_stmt 1 view .LVU29 + 128 003c F0E7 b .L8 + 129 .LVL9: + 130 .L6: + 237:Core/Src/system_stm32f3xx.c **** pllsource = RCC->CFGR & RCC_CFGR_PLLSRC; + 131 .loc 1 237 7 view .LVU30 + 237:Core/Src/system_stm32f3xx.c **** pllsource = RCC->CFGR & RCC_CFGR_PLLSRC; + 132 .loc 1 237 20 is_stmt 0 view .LVU31 + 133 003e 0E4A ldr r2, .L11 + 134 0040 5368 ldr r3, [r2, #4] + 135 .LVL10: + 238:Core/Src/system_stm32f3xx.c **** pllmull = ( pllmull >> 18) + 2; + 136 .loc 1 238 7 is_stmt 1 view .LVU32 + 238:Core/Src/system_stm32f3xx.c **** pllmull = ( pllmull >> 18) + 2; + 137 .loc 1 238 22 is_stmt 0 view .LVU33 + 138 0042 5268 ldr r2, [r2, #4] + 139 .LVL11: + 239:Core/Src/system_stm32f3xx.c **** + 140 .loc 1 239 7 is_stmt 1 view .LVU34 + 239:Core/Src/system_stm32f3xx.c **** + 141 .loc 1 239 27 is_stmt 0 view .LVU35 + 142 0044 C3F38343 ubfx r3, r3, #18, #4 + 143 .LVL12: + 239:Core/Src/system_stm32f3xx.c **** + 144 .loc 1 239 15 view .LVU36 + 145 0048 0233 adds r3, r3, #2 + 146 .LVL13: + 254:Core/Src/system_stm32f3xx.c **** { + 147 .loc 1 254 7 is_stmt 1 view .LVU37 + 254:Core/Src/system_stm32f3xx.c **** { + 148 .loc 1 254 10 is_stmt 0 view .LVU38 + 149 004a 12F4803F tst r2, #65536 + 150 004e 05D1 bne .L9 + 257:Core/Src/system_stm32f3xx.c **** } + 151 .loc 1 257 9 is_stmt 1 view .LVU39 + 257:Core/Src/system_stm32f3xx.c **** } + 152 .loc 1 257 44 is_stmt 0 view .LVU40 + 153 0050 0E4A ldr r2, .L11+20 + 154 .LVL14: + 257:Core/Src/system_stm32f3xx.c **** } + 155 .loc 1 257 44 view .LVU41 + 156 0052 02FB03F3 mul r3, r2, r3 + 157 .LVL15: + 257:Core/Src/system_stm32f3xx.c **** } + 158 .loc 1 257 25 view .LVU42 + 159 0056 094A ldr r2, .L11+4 + 160 0058 1360 str r3, [r2] + 161 005a E1E7 b .L8 + 162 .LVL16: + ARM GAS /tmp/ccIBrQzE.s page 9 + + + 163 .L9: + 261:Core/Src/system_stm32f3xx.c **** /* HSE oscillator clock selected as PREDIV1 clock entry */ + 164 .loc 1 261 9 is_stmt 1 view .LVU43 + 261:Core/Src/system_stm32f3xx.c **** /* HSE oscillator clock selected as PREDIV1 clock entry */ + 165 .loc 1 261 28 is_stmt 0 view .LVU44 + 166 005c 064A ldr r2, .L11 + 167 .LVL17: + 261:Core/Src/system_stm32f3xx.c **** /* HSE oscillator clock selected as PREDIV1 clock entry */ + 168 .loc 1 261 28 view .LVU45 + 169 005e D16A ldr r1, [r2, #44] + 261:Core/Src/system_stm32f3xx.c **** /* HSE oscillator clock selected as PREDIV1 clock entry */ + 170 .loc 1 261 36 view .LVU46 + 171 0060 01F00F01 and r1, r1, #15 + 261:Core/Src/system_stm32f3xx.c **** /* HSE oscillator clock selected as PREDIV1 clock entry */ + 172 .loc 1 261 22 view .LVU47 + 173 0064 0131 adds r1, r1, #1 + 174 .LVL18: + 263:Core/Src/system_stm32f3xx.c **** } + 175 .loc 1 263 9 is_stmt 1 view .LVU48 + 263:Core/Src/system_stm32f3xx.c **** } + 176 .loc 1 263 38 is_stmt 0 view .LVU49 + 177 0066 084A ldr r2, .L11+16 + 178 0068 B2FBF1F2 udiv r2, r2, r1 + 263:Core/Src/system_stm32f3xx.c **** } + 179 .loc 1 263 54 view .LVU50 + 180 006c 02FB03F3 mul r3, r2, r3 + 181 .LVL19: + 263:Core/Src/system_stm32f3xx.c **** } + 182 .loc 1 263 25 view .LVU51 + 183 0070 024A ldr r2, .L11+4 + 184 0072 1360 str r3, [r2] + 185 0074 D4E7 b .L8 + 186 .L12: + 187 0076 00BF .align 2 + 188 .L11: + 189 0078 00100240 .word 1073876992 + 190 007c 00000000 .word SystemCoreClock + 191 0080 00127A00 .word 8000000 + 192 0084 00000000 .word AHBPrescTable + 193 0088 0024F400 .word 16000000 + 194 008c 00093D00 .word 4000000 + 195 .cfi_endproc + 196 .LFE131: + 198 .global APBPrescTable + 199 .section .rodata.APBPrescTable,"a" + 200 .align 2 + 203 APBPrescTable: + 204 0000 00000000 .ascii "\000\000\000\000\001\002\003\004" + 204 01020304 + 205 .global AHBPrescTable + 206 .section .rodata.AHBPrescTable,"a" + 207 .align 2 + 210 AHBPrescTable: + 211 0000 00000000 .ascii "\000\000\000\000\000\000\000\000\001\002\003\004\006" + 211 00000000 + 211 01020304 + 211 06 + ARM GAS /tmp/ccIBrQzE.s page 10 + + + 212 000d 070809 .ascii "\007\010\011" + 213 .global SystemCoreClock + 214 .section .data.SystemCoreClock,"aw" + 215 .align 2 + 218 SystemCoreClock: + 219 0000 00127A00 .word 8000000 + 220 .text + 221 .Letext0: + 222 .file 2 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 223 .file 3 "/home/david/.config/Code/User/globalStorage/bmd.stm32-for-vscode/@xpack-dev-tools/arm-non + 224 .file 4 "Drivers/CMSIS/Include/core_cm4.h" + 225 .file 5 "Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h" + 226 .file 6 "Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h" + ARM GAS /tmp/ccIBrQzE.s page 11 + + +DEFINED SYMBOLS + *ABS*:0000000000000000 system_stm32f3xx.c + /tmp/ccIBrQzE.s:21 .text.SystemInit:0000000000000000 $t + /tmp/ccIBrQzE.s:27 .text.SystemInit:0000000000000000 SystemInit + /tmp/ccIBrQzE.s:46 .text.SystemInit:0000000000000010 $d + /tmp/ccIBrQzE.s:51 .text.SystemCoreClockUpdate:0000000000000000 $t + /tmp/ccIBrQzE.s:57 .text.SystemCoreClockUpdate:0000000000000000 SystemCoreClockUpdate + /tmp/ccIBrQzE.s:189 .text.SystemCoreClockUpdate:0000000000000078 $d + /tmp/ccIBrQzE.s:218 .data.SystemCoreClock:0000000000000000 SystemCoreClock + /tmp/ccIBrQzE.s:210 .rodata.AHBPrescTable:0000000000000000 AHBPrescTable + /tmp/ccIBrQzE.s:203 .rodata.APBPrescTable:0000000000000000 APBPrescTable + /tmp/ccIBrQzE.s:200 .rodata.APBPrescTable:0000000000000000 $d + /tmp/ccIBrQzE.s:207 .rodata.AHBPrescTable:0000000000000000 $d + /tmp/ccIBrQzE.s:215 .data.SystemCoreClock:0000000000000000 $d + +NO UNDEFINED SYMBOLS diff --git a/BMS_Testbench/BMS_Software_V1/build/system_stm32f3xx.o b/BMS_Testbench/BMS_Software_V1/build/system_stm32f3xx.o new file mode 100644 index 0000000000000000000000000000000000000000..46bb5359bfacbeab756e26a9d53e8a863589eed9 GIT binary patch literal 6200 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 literal 0 HcmV?d00001 diff --git a/BMS_Testbench/BMS_Software_V1/openocd.cfg b/BMS_Testbench/BMS_Software_V1/openocd.cfg new file mode 100644 index 0000000..d510dfa --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/openocd.cfg @@ -0,0 +1,10 @@ +#OpenOCD configuration file, generated by STM32 for VSCode + +# Programmer, can be changed to several interfaces +# Standard will be the stlink interface as this is the standard for STM32 dev boards +source [find interface/stlink.cfg] + +# The target MCU. This should match your board +source [find target/stm32f3x.cfg] + +hla_serial 00160013544B500520343637 diff --git a/BMS_Testbench/BMS_Software_V1/startup_stm32f302xc.s b/BMS_Testbench/BMS_Software_V1/startup_stm32f302xc.s new file mode 100644 index 0000000..d946fff --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/startup_stm32f302xc.s @@ -0,0 +1,441 @@ +/** + ****************************************************************************** + * @file startup_stm32f302xc.s + * @author MCD Application Team + * @brief STM32F302xB/STM32F302xC devices vector table for GCC toolchain. + * This module performs: + * - Set the initial SP + * - Set the initial PC == Reset_Handler, + * - Set the vector table entries with the exceptions ISR address, + * - Configure the clock system + * - Branches to main in the C library (which eventually + * calls main()). + * After Reset the Cortex-M4 processor is in Thread mode, + * priority is Privileged, and the Stack is set to Main. + ****************************************************************************** + * @attention + * + *

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

    + * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + + .syntax unified + .cpu cortex-m4 + .fpu softvfp + .thumb + +.global g_pfnVectors +.global Default_Handler + +/* start address for the initialization values of the .data section. +defined in linker script */ +.word _sidata +/* start address for the .data section. defined in linker script */ +.word _sdata +/* end address for the .data section. defined in linker script */ +.word _edata +/* start address for the .bss section. defined in linker script */ +.word _sbss +/* end address for the .bss section. defined in linker script */ +.word _ebss + +.equ BootRAM, 0xF1E0F85F +/** + * @brief This is the code that gets called when the processor first + * starts execution following a reset event. Only the absolutely + * necessary set is performed, after which the application + * supplied main() routine is called. + * @param None + * @retval : None +*/ + + .section .text.Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + ldr sp, =_estack /* Atollic update: set stack pointer */ + +/* Copy the data segment initializers from flash to SRAM */ + ldr r0, =_sdata + ldr r1, =_edata + ldr r2, =_sidata + movs r3, #0 + b LoopCopyDataInit + +CopyDataInit: + ldr r4, [r2, r3] + str r4, [r0, r3] + adds r3, r3, #4 + +LoopCopyDataInit: + adds r4, r0, r3 + cmp r4, r1 + bcc CopyDataInit + +/* Zero fill the bss segment. */ + ldr r2, =_sbss + ldr r4, =_ebss + movs r3, #0 + b LoopFillZerobss + +FillZerobss: + str r3, [r2] + adds r2, r2, #4 + +LoopFillZerobss: + cmp r2, r4 + bcc FillZerobss + +/* Call the clock system intitialization function.*/ + bl SystemInit +/* Call static constructors */ + bl __libc_init_array +/* Call the application's entry point.*/ + bl main + +LoopForever: + b LoopForever + +.size Reset_Handler, .-Reset_Handler + +/** + * @brief This is the code that gets called when the processor receives an + * unexpected interrupt. This simply enters an infinite loop, preserving + * the system state for examination by a debugger. + * + * @param None + * @retval : None +*/ + .section .text.Default_Handler,"ax",%progbits +Default_Handler: +Infinite_Loop: + b Infinite_Loop + .size Default_Handler, .-Default_Handler +/****************************************************************************** +* +* The minimal vector table for a Cortex-M4. Note that the proper constructs +* must be placed on this to ensure that it ends up at physical address +* 0x0000.0000. +* +******************************************************************************/ + .section .isr_vector,"a",%progbits + .type g_pfnVectors, %object + .size g_pfnVectors, .-g_pfnVectors + + +g_pfnVectors: + .word _estack + .word Reset_Handler + .word NMI_Handler + .word HardFault_Handler + .word MemManage_Handler + .word BusFault_Handler + .word UsageFault_Handler + .word 0 + .word 0 + .word 0 + .word 0 + .word SVC_Handler + .word DebugMon_Handler + .word 0 + .word PendSV_Handler + .word SysTick_Handler + .word WWDG_IRQHandler + .word PVD_IRQHandler + .word TAMP_STAMP_IRQHandler + .word RTC_WKUP_IRQHandler + .word FLASH_IRQHandler + .word RCC_IRQHandler + .word EXTI0_IRQHandler + .word EXTI1_IRQHandler + .word EXTI2_TSC_IRQHandler + .word EXTI3_IRQHandler + .word EXTI4_IRQHandler + .word DMA1_Channel1_IRQHandler + .word DMA1_Channel2_IRQHandler + .word DMA1_Channel3_IRQHandler + .word DMA1_Channel4_IRQHandler + .word DMA1_Channel5_IRQHandler + .word DMA1_Channel6_IRQHandler + .word DMA1_Channel7_IRQHandler + .word ADC1_2_IRQHandler + .word USB_HP_CAN_TX_IRQHandler + .word USB_LP_CAN_RX0_IRQHandler + .word CAN_RX1_IRQHandler + .word CAN_SCE_IRQHandler + .word EXTI9_5_IRQHandler + .word TIM1_BRK_TIM15_IRQHandler + .word TIM1_UP_TIM16_IRQHandler + .word TIM1_TRG_COM_TIM17_IRQHandler + .word TIM1_CC_IRQHandler + .word TIM2_IRQHandler + .word TIM3_IRQHandler + .word TIM4_IRQHandler + .word I2C1_EV_IRQHandler + .word I2C1_ER_IRQHandler + .word I2C2_EV_IRQHandler + .word I2C2_ER_IRQHandler + .word SPI1_IRQHandler + .word SPI2_IRQHandler + .word USART1_IRQHandler + .word USART2_IRQHandler + .word USART3_IRQHandler + .word EXTI15_10_IRQHandler + .word RTC_Alarm_IRQHandler + .word USBWakeUp_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word SPI3_IRQHandler + .word UART4_IRQHandler + .word UART5_IRQHandler + .word TIM6_DAC_IRQHandler + .word 0 + .word DMA2_Channel1_IRQHandler + .word DMA2_Channel2_IRQHandler + .word DMA2_Channel3_IRQHandler + .word DMA2_Channel4_IRQHandler + .word DMA2_Channel5_IRQHandler + .word 0 + .word 0 + .word 0 + .word COMP1_2_IRQHandler + .word COMP4_6_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word USB_HP_IRQHandler + .word USB_LP_IRQHandler + .word USBWakeUp_RMP_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word FPU_IRQHandler + +/******************************************************************************* +* +* Provide weak aliases for each Exception handler to the Default_Handler. +* As they are weak aliases, any function with the same name will override +* this definition. +* +*******************************************************************************/ + + .weak NMI_Handler + .thumb_set NMI_Handler,Default_Handler + + .weak HardFault_Handler + .thumb_set HardFault_Handler,Default_Handler + + .weak MemManage_Handler + .thumb_set MemManage_Handler,Default_Handler + + .weak BusFault_Handler + .thumb_set BusFault_Handler,Default_Handler + + .weak UsageFault_Handler + .thumb_set UsageFault_Handler,Default_Handler + + .weak SVC_Handler + .thumb_set SVC_Handler,Default_Handler + + .weak DebugMon_Handler + .thumb_set DebugMon_Handler,Default_Handler + + .weak PendSV_Handler + .thumb_set PendSV_Handler,Default_Handler + + .weak SysTick_Handler + .thumb_set SysTick_Handler,Default_Handler + + .weak WWDG_IRQHandler + .thumb_set WWDG_IRQHandler,Default_Handler + + .weak PVD_IRQHandler + .thumb_set PVD_IRQHandler,Default_Handler + + .weak TAMP_STAMP_IRQHandler + .thumb_set TAMP_STAMP_IRQHandler,Default_Handler + + .weak RTC_WKUP_IRQHandler + .thumb_set RTC_WKUP_IRQHandler,Default_Handler + + .weak FLASH_IRQHandler + .thumb_set FLASH_IRQHandler,Default_Handler + + .weak RCC_IRQHandler + .thumb_set RCC_IRQHandler,Default_Handler + + .weak EXTI0_IRQHandler + .thumb_set EXTI0_IRQHandler,Default_Handler + + .weak EXTI1_IRQHandler + .thumb_set EXTI1_IRQHandler,Default_Handler + + .weak EXTI2_TSC_IRQHandler + .thumb_set EXTI2_TSC_IRQHandler,Default_Handler + + .weak EXTI3_IRQHandler + .thumb_set EXTI3_IRQHandler,Default_Handler + + .weak EXTI4_IRQHandler + .thumb_set EXTI4_IRQHandler,Default_Handler + + .weak DMA1_Channel1_IRQHandler + .thumb_set DMA1_Channel1_IRQHandler,Default_Handler + + .weak DMA1_Channel2_IRQHandler + .thumb_set DMA1_Channel2_IRQHandler,Default_Handler + + .weak DMA1_Channel3_IRQHandler + .thumb_set DMA1_Channel3_IRQHandler,Default_Handler + + .weak DMA1_Channel4_IRQHandler + .thumb_set DMA1_Channel4_IRQHandler,Default_Handler + + .weak DMA1_Channel5_IRQHandler + .thumb_set DMA1_Channel5_IRQHandler,Default_Handler + + .weak DMA1_Channel6_IRQHandler + .thumb_set DMA1_Channel6_IRQHandler,Default_Handler + + .weak DMA1_Channel7_IRQHandler + .thumb_set DMA1_Channel7_IRQHandler,Default_Handler + + .weak ADC1_2_IRQHandler + .thumb_set ADC1_2_IRQHandler,Default_Handler + + .weak USB_HP_CAN_TX_IRQHandler + .thumb_set USB_HP_CAN_TX_IRQHandler,Default_Handler + + .weak USB_LP_CAN_RX0_IRQHandler + .thumb_set USB_LP_CAN_RX0_IRQHandler,Default_Handler + + .weak CAN_RX1_IRQHandler + .thumb_set CAN_RX1_IRQHandler,Default_Handler + + .weak CAN_SCE_IRQHandler + .thumb_set CAN_SCE_IRQHandler,Default_Handler + + .weak EXTI9_5_IRQHandler + .thumb_set EXTI9_5_IRQHandler,Default_Handler + + .weak TIM1_BRK_TIM15_IRQHandler + .thumb_set TIM1_BRK_TIM15_IRQHandler,Default_Handler + + .weak TIM1_UP_TIM16_IRQHandler + .thumb_set TIM1_UP_TIM16_IRQHandler,Default_Handler + + .weak TIM1_TRG_COM_TIM17_IRQHandler + .thumb_set TIM1_TRG_COM_TIM17_IRQHandler,Default_Handler + + .weak TIM1_CC_IRQHandler + .thumb_set TIM1_CC_IRQHandler,Default_Handler + + .weak TIM2_IRQHandler + .thumb_set TIM2_IRQHandler,Default_Handler + + .weak TIM3_IRQHandler + .thumb_set TIM3_IRQHandler,Default_Handler + + .weak TIM4_IRQHandler + .thumb_set TIM4_IRQHandler,Default_Handler + + .weak I2C1_EV_IRQHandler + .thumb_set I2C1_EV_IRQHandler,Default_Handler + + .weak I2C1_ER_IRQHandler + .thumb_set I2C1_ER_IRQHandler,Default_Handler + + .weak I2C2_EV_IRQHandler + .thumb_set I2C2_EV_IRQHandler,Default_Handler + + .weak I2C2_ER_IRQHandler + .thumb_set I2C2_ER_IRQHandler,Default_Handler + + .weak SPI1_IRQHandler + .thumb_set SPI1_IRQHandler,Default_Handler + + .weak SPI2_IRQHandler + .thumb_set SPI2_IRQHandler,Default_Handler + + .weak USART1_IRQHandler + .thumb_set USART1_IRQHandler,Default_Handler + + .weak USART2_IRQHandler + .thumb_set USART2_IRQHandler,Default_Handler + + .weak USART3_IRQHandler + .thumb_set USART3_IRQHandler,Default_Handler + + .weak EXTI15_10_IRQHandler + .thumb_set EXTI15_10_IRQHandler,Default_Handler + + .weak RTC_Alarm_IRQHandler + .thumb_set RTC_Alarm_IRQHandler,Default_Handler + + .weak USBWakeUp_IRQHandler + .thumb_set USBWakeUp_IRQHandler,Default_Handler + + .weak SPI3_IRQHandler + .thumb_set SPI3_IRQHandler,Default_Handler + + .weak UART4_IRQHandler + .thumb_set UART4_IRQHandler,Default_Handler + + .weak UART5_IRQHandler + .thumb_set UART5_IRQHandler,Default_Handler + + .weak TIM6_DAC_IRQHandler + .thumb_set TIM6_DAC_IRQHandler,Default_Handler + + .weak DMA2_Channel1_IRQHandler + .thumb_set DMA2_Channel1_IRQHandler,Default_Handler + + .weak DMA2_Channel2_IRQHandler + .thumb_set DMA2_Channel2_IRQHandler,Default_Handler + + .weak DMA2_Channel3_IRQHandler + .thumb_set DMA2_Channel3_IRQHandler,Default_Handler + + .weak DMA2_Channel4_IRQHandler + .thumb_set DMA2_Channel4_IRQHandler,Default_Handler + + .weak DMA2_Channel5_IRQHandler + .thumb_set DMA2_Channel5_IRQHandler,Default_Handler + + .weak COMP1_2_IRQHandler + .thumb_set COMP1_2_IRQHandler,Default_Handler + + .weak COMP4_6_IRQHandler + .thumb_set COMP4_6_IRQHandler,Default_Handler + + .weak USB_HP_IRQHandler + .thumb_set USB_HP_IRQHandler,Default_Handler + + .weak USB_LP_IRQHandler + .thumb_set USB_LP_IRQHandler,Default_Handler + + .weak USBWakeUp_RMP_IRQHandler + .thumb_set USBWakeUp_RMP_IRQHandler,Default_Handler + + .weak FPU_IRQHandler + .thumb_set FPU_IRQHandler,Default_Handler +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

    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 literal 0 HcmV?d00001 diff --git a/BMS_Testbench/BMS_Software_V1/Debug/Core/Src/ADBMS_Abstraction.su b/BMS_Testbench/BMS_Software_V1/Debug/Core/Src/ADBMS_Abstraction.su new file mode 100644 index 0000000..1448b51 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Debug/Core/Src/ADBMS_Abstraction.su @@ -0,0 +1,26 @@ +../Core/Src/ADBMS_Abstraction.c:15:7:initAMS 16 static +../Core/Src/ADBMS_Abstraction.c:31:7:amsWakeUp 16 static +../Core/Src/ADBMS_Abstraction.c:38:7:amsCellMeasurement 24 static +../Core/Src/ADBMS_Abstraction.c:47:7:amsConfigCellMeasurement 16 static +../Core/Src/ADBMS_Abstraction.c:53:7:amsAuxMeasurement 24 static +../Core/Src/ADBMS_Abstraction.c:86:7:amsInternalStatusMeasurement 24 static +../Core/Src/ADBMS_Abstraction.c:105:7:amsConfigAuxMeasurement 24 static +../Core/Src/ADBMS_Abstraction.c:119:7:amsConfigGPIO 16 static +../Core/Src/ADBMS_Abstraction.c:124:7:amsSetGPIO 16 static +../Core/Src/ADBMS_Abstraction.c:129:7:readGPIO 16 static +../Core/Src/ADBMS_Abstraction.c:134:7:amsConfigBalancing 24 static +../Core/Src/ADBMS_Abstraction.c:155:7:amsStartBalancing 16 static +../Core/Src/ADBMS_Abstraction.c:161:7:amsStopBalancing 8 static +../Core/Src/ADBMS_Abstraction.c:167:7:amsSelfTest 4 static +../Core/Src/ADBMS_Abstraction.c:174:7:amsConfigUnderVoltage 24 static +../Core/Src/ADBMS_Abstraction.c:189:7:amsCheckUnderOverVoltage 40 static +../Core/Src/ADBMS_Abstraction.c:223:7:amsConfigOverVoltage 24 static +../Core/Src/ADBMS_Abstraction.c:300:7:amsClearStatus 16 static +../Core/Src/ADBMS_Abstraction.c:306:7:amsClearAux 16 static +../Core/Src/ADBMS_Abstraction.c:312:7:amsClearCells 16 static +../Core/Src/ADBMS_Abstraction.c:319:7:amsSendWarning 4 static +../Core/Src/ADBMS_Abstraction.c:325:7:amsSendError 4 static +../Core/Src/ADBMS_Abstraction.c:331:7:amsClearWarning 4 static +../Core/Src/ADBMS_Abstraction.c:337:7:amsClearError 4 static +../Core/Src/ADBMS_Abstraction.c:343:7:amscheckOpenCellWire 64 static +../Core/Src/ADBMS_Abstraction.c:388:7:amsReadCellVoltages 24 static diff --git a/BMS_Testbench/BMS_Software_V1/Debug/Core/Src/ADBMS_LL_Driver.d b/BMS_Testbench/BMS_Software_V1/Debug/Core/Src/ADBMS_LL_Driver.d new file mode 100644 index 0000000..fd59ba4 --- /dev/null +++ b/BMS_Testbench/BMS_Software_V1/Debug/Core/Src/ADBMS_LL_Driver.d @@ -0,0 +1,62 @@ +Core/Src/ADBMS_LL_Driver.o: ../Core/Src/ADBMS_LL_Driver.c \ + ../Core/Inc/ADBMS_LL_Driver.h ../Core/Inc/main.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h \ + ../Core/Inc/stm32f3xx_hal_conf.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h \ + ../Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h \ + ../Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h \ + ../Drivers/CMSIS/Include/core_cm4.h \ + ../Drivers/CMSIS/Include/cmsis_version.h \ + ../Drivers/CMSIS/Include/cmsis_compiler.h \ + ../Drivers/CMSIS/Include/cmsis_gcc.h \ + ../Drivers/CMSIS/Include/mpu_armv7.h \ + ../Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h \ + ../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h +../Core/Inc/ADBMS_LL_Driver.h: +../Core/Inc/main.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal.h: +../Core/Inc/stm32f3xx_hal_conf.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_def.h: +../Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f3xx.h: +../Drivers/CMSIS/Device/ST/STM32F3xx/Include/stm32f302xc.h: +../Drivers/CMSIS/Include/core_cm4.h: +../Drivers/CMSIS/Include/cmsis_version.h: +../Drivers/CMSIS/Include/cmsis_compiler.h: +../Drivers/CMSIS/Include/cmsis_gcc.h: +../Drivers/CMSIS/Include/mpu_armv7.h: +../Drivers/CMSIS/Device/ST/STM32F3xx/Include/system_stm32f3xx.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_rcc_ex.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_gpio_ex.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_exti.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_dma_ex.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_cortex.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_can.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_flash_ex.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_i2c_ex.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_pwr_ex.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi.h: +../Drivers/STM32F3xx_HAL_Driver/Inc/stm32f3xx_hal_spi_ex.h: diff --git a/BMS_Testbench/BMS_Software_V1/Debug/Core/Src/ADBMS_LL_Driver.o b/BMS_Testbench/BMS_Software_V1/Debug/Core/Src/ADBMS_LL_Driver.o new file mode 100644 index 0000000000000000000000000000000000000000..739bc624acc37d8ffc403709c76eed324b2a7062 GIT binary patch literal 901280 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≶_NUm{es4Y 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≧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Ξ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%0Av+VcljwDZ=IXvZ_?G^uo#<;o+U5 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